linux container(LXC)就是一种操做系统级的虚拟化技术。是基于Linux操做系统的虚拟化技术,翻译为linux 容器。它能够提供轻量级的虚拟化,以便隔离进程和资源,并且不须要提供指令解释机制以及全虚拟化的其余复杂性。 linux
容器有效地将由单个操做系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不须要指令级模拟,也不须要即时编译。容器能够在核心 CPU 本地运行指令,而不须要任何专门的解释机制。此外,也避免了半虚拟化和系统调用替换中的复杂性。经过提供一种建立和进入容器的方式,操做系统让应用程序就像在独立的机器上运行同样,但又能共享不少底层的资源。例如,能够有效地共享公共文件(好比 glibc)的页缓存,由于全部容器都使用相同的内核,并且全部容器还经常共享相同的 libc 库(取决于容器配置)。这种共享经常能够扩展到目录中其余不须要写入内容的文件。 shell
容器在提供隔离的同时,还经过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行,Linux Container有点像chroot,提供了一个拥有本身进程和网络空间的虚拟环境。LXC 经过利用内核的CGroup来提供用户空间的对象,用来保证资源的隔离和对于应用或者系统的资源控制,经过namespaces提供资源隔离。 centos
LXC是一种不一样于KVM的另类的虚拟化实现方案,容器有效地将由单个OS管理的资源(计算,存储,网络)划分到孤立的组中,与传统的虚拟化相比,这样不须要指令级模拟。避免了虚拟化中系统调用替换中的复杂性。容器是下列两个技术的结合,在chroot的基础上,使用namespace加强chroot环境的隔离性,使之成为有效的容器: 缓存
1)chroot,在linux系统中,根目录就是”/”,但使用chroot能够用任意指定的目录做根目录 bash
2)namespace, 至关于单独的TCP/IP进程,用于网络资源的隔离 网络
经过提供一种建立(建立容器就是将一个名称与一个配置文件关联,lxc-create-n name -f configfile)和进入容器的方式(ssh,VNC (GUI), VT: tty (text),VT:X(GUI),操做系统让应用就像在独立的机器上运行同样,但又能共享不少底层的资源。LXC配置文件的例子以下: 架构
lxc.utsname = my_ssh_container lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.ipv4 = 10.0.2.16/24 lxc.network.name = eth0 lxc.mount = ./fstab lxc.rootfs = ./rootfs
不管配置文件如何,用LXC工具启动的容器有本身的系统进程视图,以及本身的挂载树和可用的进程间通讯(IPC)资源视图。除了这些之外,当一个容器启动时,配置中未提到的任何类型的资源都被认为是与主机共享。 ssh
LXC随Kernel-2.6.27发布,在Kernel-2.6.29提供完整功能。我所试验的系统是CentOS-6.0。在CentOS上试验LXC是很麻烦的,若是不是必须的话,仍是建议在Ubuntu上试验和应用,都很方便。 分布式
1. 构建虚拟的根文件系统。虚拟的根文件系统是虚拟操做系统独立的根文件系统,与其余虚拟的根文件系统相隔离。咱们采用拷贝宿主主机的文件系统来实现。 工具
1)首先肯定容器的根文件系统在宿主操做系统的文件系统中的位置。这里选择的是/lxc/${container_name},执行mkdir –p /lxc/${container_name},也能够放在其余目录好比/var/lxc/${container_name},都同样的。容器名称我这里选择的是cpt, container_name=cpt 所以,实际路径是/lxc/cpt。
2)直接拷贝宿主操做系统的根文件系统。先关闭selinux,不然拷贝/selinux目录时会报错。编辑/etc/selinux/config,将SELINUX=enforcing改成SELINUX=disabled. 而后重启。以centos6为例,centos minimal包安装后有以下目录:bin, cgroup, etc, lib, lost+found, mnt, proc ,sbin, srv, tmp, var, boot, dev ,home ,lib64 ,media, opt, root, selinux, sys, usr. 不拷贝sys,proc,dev目录,仅建立sys,proc, dev目录,由于这三个目录不存放在某个磁盘上,而是由核心在内存中产生。其他目录都拷贝过去,不拷贝容器根文件系统所在的目录/lxc.
2. 设置宿主操做系统
1)安装lxc用户态工具。包括gcc ,lxc-0.7.5以及依赖的软件包,建立目录:mkdir -p /usr/local/var/lib/lxc/ 用于存放lxc-create执行后,lxc生成的配置文件。
2)配置网桥。宿主主机和容器间经过bridge来通讯,修改/etc/sysconfig/network-scripts/目录下的网卡配置文件。建立/etc/sysconfig/network-scripts/ifcfg-br0,设置相应的DEVICE,IPADDR等选项,修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,去掉IPADDR等内容,设置BRIDGE=br0。而后重启网络/etc/init.d/network restart。具体脚本以下:
etc/sysconfig/network-scripts/ifcfg-br0: DEVICE=br0 TYPE=Bridge BOOTPROTO=static BROADCAST=10.1.255.255 IPADDR=10.1.29.4 NETMASK=255.255.0.0 NETWORK=10.1.0.0 GATEWAY=10.1.0.254 ONBOOT=yes /etc/sysconfig/network-scripts/ifcfg-eth1: # Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller DEVICE=eth1 #BOOTPROTO=static HWADDR=E0:CB:4E:B9:EB:77 #TYPE=Ethernet #IPADDR=10.1.29.4 #NETMASK=255.255.0.0 #NETWORK=10.1.0.0 #GATEWAY=10.1.0.254 #USERCTL=no #IPV6INIT=no #PEERDNS=yes ONBOOT=yes BRIDGE=br0
3)检查宿主操做系统的/etc/fstab文件 确保宿主文件系统中已经挂载/cgroup,不然用lxc-start容器时,会报spawn错误。要在宿主系统的/etc/fstab中添加none /cgroup cgroup defaults 0 0这一行。
4)撰写容器配置文件。须要设置容器名称,容器的网络类型,容器的ip地址,容器的虚拟根文件系统的路径等。
5)撰写容器挂载文件系统的配置文件。须要挂载/lxc/cpt/proc,/lxc/cpt/sys等目录,不能挂载{$rootfs}/var/lock/subsys,{$rootfs}/var/run,不然容器启动时,这两个目录会被隐藏,使容器启动时报错,可是这类错误不是重要错误,不会影响容器的主要功能使用。若是容器启动了nfs相关服务,须要挂载/lxc/cpt/var/lib/nfs/rpc_pipefs,挂载语句以下:sunrpc /lxc/cpt/var/lib/nfs/rpc_pipefs rpc_pipefs defaults 0 0。
6)建立容器的虚拟设备。由于容器非运行在实际的硬件上,因此须要建立虚拟设备,经过mknod命令在/lxc/cpt/dev/下建立console, pts, shm, tty等设备。例如:mknod -m 666 /lxc/cpt/dev/null c 1 3
7)其余系统设置(不是必须的)好比修改主机名,修改/etc/hosts等。
3. LXC的系统配置
1)首先切换到容器的虚拟根文件系统中。用chroot切换到容器的虚拟根文件系统中进行: chroot /lxc/cpt /bin/bash.
2)清空容器的/etc/fstab文件。由于容器启动时,lxc-start会根据配置文件/lxc/fstab.cpt挂载。执行:rm -f /etc/fstab; touch /etc/fstab。
3)删除容器虚拟文件系统网卡配置文件。lxc-start会根据配置文件/lxc/cpt.conf启动虚拟网卡。执行:rm -f /etc/sysconfig/network-scripts/ifcfg-eth0。
4)修改容器系统启动配置文件和启动脚本。容器启动和实际操做系统启动仍是有很多差异。不少语句不须要执行,对于centos,修改/etc/rc.d/rc.sysinit。通常是清除原文件,从新写,须要删除/var/run下后缀是pid的文件,以及/var/lock/subsys/*下的文件,清空/etc/mtab文件,语句以下:rm -f $(find /var/run -name '*pid'); rm -f /var/lock/subsys/*; rm -f /etc/mtab; touch /etc/mtab。
5)检查/etc/inittab。确保从level 3启动,语句以下: id:3:initdefault:。
6)设置容器启动时须要同时启动的服务用chkconfig命令开启和关闭相关服务。
7)修改主机名和root密码等信息。编辑/etc/sysconfig/network,修改HOSTNAME后的值为本身设定的容器的主机名。执行password命令,修改root密码。修改/etc/hosts文件,配置主机名和ip的对应关系。
8)配置容器完毕,exit退出。
4. 启动容器
1)建立。lxc-create -n cpt -f /lxc/cpt.conf。lxc-create必定要用-f参数指定配置文件,不然建立的容器的配置文件是空的(/usr/local/var/lxc/cpt/config为空)
2)启动。前台启动:lxc-start -n cpt。后台启动:lxc-start -n -d cpt。
3)中止。lxc-stop –n cpt。
一般的分布式平台都是由一个或者多个管理节点,一个或者多个计算节点构成,以三个节点为例,每一个节点须要运行在独立的操做系统上。所以选择二个容器,再加上一个宿主节点,构成有三个节点的集群。建立普通用户,将分布式平台所须要的配置文件模板,库文件,可执行文件拷贝到相应的目录,修改配置,设置好权限,编写启动脚本,便可完成分布式平台的部署。
1. 基本配置步骤以下:
1)先以root身份登陆,并建立一个ndsa组和ndsa用户
# groupadd ndsa # useradd -m ndsa -g ndsa2)切换到ndsa用户,将压缩包复制到根目录后解压缩,此压缩包包含分布式平台相关的配置文件,库文件,可执行文件。
# su - ndsa ndsa@:~ > tar xvfz dist2010.tgz
3)修改平台相关配置,编写启动中止脚本。
2. 经过在容器的宿主主机的/etc/rc.local文件中设置相关的启动命令,能够实现启动虚拟机时,启动整个分布式平台,以及相关的管理程序。启动容器和启动分布式平台之间须要间隔几秒,由于容器的启动须要花费时间。
附一些命令:
建立容器:lxc-create -n name -f configfile 列出容器: lxc-info -n name 显示容器中的进程:lxc-ps 启动系统容器,系统容器相似于虚拟机,但比虚拟机的隔离级别要低:lxc-start -n name init 启动应用容器,应用容器只是建立一个隔离一个应用程序的单独的名称容间:lxc-execute -n name cmd 发信号到某个容器的全部进程 :lxc-kill -n name -s SIGNAL 暂停,至关于级容器的全部进程发SIGSTOP信号:lxc-freeze -n name 恢复: lxc-unfreeze -n name 中止容器,将杀死容器内的全部进程:lxc-stop -n name