cgroups简介LXC项目由一个Linux内核补丁和一些用户空间工具组成。这些工具提供了一组简化的工具,用于使用补丁添加的新内核功能来维护容器。2.6.29版本之后的Linux内核版本已经包含了这个补丁提供的大部分功能。所以强烈推荐使用最新的内核源码。LXC在资源管理上依赖于Linux内核的cgroups(ControlGroups)系统。cgroups系统是Linux内核提供的基于进程组的资源管理框架,可以限制特定进程组的可用资源。它最初由谷歌工程师提出,后来集成到Linux内核中。Cgroups也是LXC用来实现虚拟化的资源管理方式。可以说没有cgroups就没有LXC。cgroups文件系统结构如图1所示。图1.cgroups文件系统结构相关术语解释控制组(controlgroup):控制组是按照一定标准划分的一组进程。cgroups中的资源控制是以控制组为单位实现的。一个进程可以加入一个控制组,也可以迁移到另一个控制组。等级制度。对照种群可以以分层形式组织,即对照种群树。控制组树上的子节点控制组是父节点控制组的子节点,继承了父节点控制组的特定属性。子系统(subsytem)。子系统是资源控制器。例如,CPU子系统是一个控制CPU时间分配的控制器。子系统必须附加到一个级别才能运行。一个子系统附加到某一层次后,该层次上的所有控制组都受该子系统控制。主要包括以下9个子系统:blkio:该子系统设置块设备的输入/输出限制,例如物理设备(磁盘、SSD、USB等)。cpu:此子系统使用调度程序提供对CPU的cgroup任务访问。cpuacct:该子系统自动生成cgroup中任务使用的CPU的报告。cpuset:该子系统将单个CPU(在多核系统上)和内存节点分配给cgroups中的任务。devices:此子系统允许或拒绝cgroup中的任务访问设备。freezer:此子系统暂停或恢复cgroup中的任务。memory:此子系统对cgroup中任务使用的内存设置限制,并自动生成有关这些任务使用的内存资源的报告。net_cls:该子系统使用类标识符(classid)标记网络数据包,它允许Linux流量控制程序(tc)识别来自特定cgroup的数据包。ns:ns子系统提供了一种将进程分组到不同名称空间的方法。在一个具体的命名空间内,进程可以相互交互,但与在其他命名空间中运行的进程隔离。这些单独的命名空间在用于操作系统级虚拟化时有时称为容器。搭建第一台LXC虚拟机本文使用的Linux发行版为Ubuntu12.10,首先安装软件包:#apt-getinstallllxc安装完软件包后,查看Linux发行版内核对LXC的支持情况,可以使用如下commandlxc-checkconfig查看,见图2。图2.lxc-checkconfig命令lxc-checkconfig命令检查,如果所有项都显示“enabled”,则表示可以直接使用LXC。#p#搭建一个UbuntuServerLXC虚拟机系统使用如下命令搭建(执行过程见图)3:#lxc-create-tubuntu-ncjhlxc1表示这里使用的是ubuntu模板,模板文件为保存在/usr/lib/lxc/templates/目录下,该目录下还有其他模板,可以使用如下命令查看,命令输出如下:#tree/usr/lib/lxc/templates//usr/lib/lxc/templates/├──lxc-busybox├──lxc-debian├──lxc-fedora├──lxc-opensuse├──lxc-sshd├──lxc-ubuntu└──lxc-ubuntu-cloud图3.创建一个UbuntuServerLXC系统描述:??安装过程需要一段时间,安装过程必须保证有网络连接。上述命令完成后,会在/var/lib/lxc目录下生成一个虚拟机cjhlxc1,其目录结构如图4所示。图4.虚拟机cjhlxc1目录结构LXC虚拟机基本管理-了解LXC虚拟机的管理命令常用LXC命令说明见表1:表1LXC常用命令说明说明:更详细的lxc命令列表及使用方法请读者参考参考官方网站文档。图5LXC命令执行主要流程示意图图5LXC命令执行流程示意图#p#LXC常用命令说明示例启动LXC虚拟机#lxc-start-ncjhlxc1真实账号和密码为都ubuntu然后登录虚拟机见图6:图6登录虚拟机列出当前系统中所有的容器,查看当前启动了哪些容器(如果没有结果,则没有容器)currentlystarted):#lxc-lscjhlxc1foo使用控制台登录容器站的第三个控件:$lxc-console-ncjhlxc1–t3注意:如果不指定-tN选项,会自动选择一个未使用的控制台.要退出控制台,请使用快捷键Ctrl-aq。停止运行容器:#lxc-stop-ncjhlxc1获取容器状态:#lxc-info-nol6ctr1销毁容器:#lxc-destroy-ncjhlxc11复制容器:#lxc-clone-ocjhlxc1-nol6ctr2暂停或恢复容器container容器:#lxc-freeze-ncjhlxc1#lxc-unfreeze-ncjhlxc1LXC虚拟网络接口设置了解LXC内置网络架构无论是哪个虚拟系统,只要运行在Linux系统架构内,虚拟使用的网络是Linux系统图7是默认的虚拟网络架构示意图(即TAP/TUP,Bridge)。图7.LXC虚拟网络接口示意图图7这个结构中的两个容器使用了VethBridge,因为默认情况下,LXC的模板脚本基于VethBridge设置网络。在这种模式下,容器从dnsmasq服务器获取其IP地址。主机允许容器连接到网络的其余部分(使用iptablesNAT规则,但这些规则不允许传入连接到容器)。除了VethBridge,LXC虚拟机还支持MacvlanBridge和MacvlanVEPA。有时候我们可能需要一块物理网卡来绑定多个IP和多个MAC地址。虽然很容易绑定多个IP,但是这些IP会共享物理网卡的MAC地址,这可能不符合我们的设计要求,所以我们有MACVLAN设备的工作MACVLAN来判断数据包需要发往哪个虚拟网卡根据接收到的数据包的目的MAC地址进行传送。限于篇幅,这里先介绍MacvlanBridge和MacvlanVEPA。感兴趣的用户可以参考参考资料中的介绍。与KVM一样,LXC安装完成后,会默认生成一个网络接口(包括以下功能:交换机(SwitchHub)+DHCP服务器+NAT+缓存DNS服务器),网络接口名称为lxcbr0,可以通过以下命令验证:#brctlshowbridgenamebridgeidSTPenabledinterfaceslxcbr08000.3eef2e882ac9novetheCYpw4从上面的命令输出图中可以清楚的看到lxcbr0的相关信息,而这个网络接口除了作为交换机外,还提供了NAT和DHCP功能默认。总之,lxcbr0除了提供交换机的功能外,还提供DHCP服务和DNS缓存服务,然后通过iptables启动NAT功能,可以通过下面的命令来证明。命令输出如下:#iptables-tnat-L-nChainPREROUTING(policyACCEPT)targetprotoptsourcedestinationChainINPUT(policyACCEPT)targetprotoptsourcedestinationChainOUTPUT(policyACCEPT)targetprotoptsourcedestinationChainPOSTROUTING(policyACCEPT)targetprotoptsourcedestinationMASQUERADEall--10.0.3.0.04DNSservicefunctionsandcacheDHCP./24!可以通过以下命令验证:#psaux|greplxc命令输出见图8:图8:DHCP服务和DNS缓存服务通过“ifconfiglxcbr0”命令可以知道lxcbr0本身的IP地址,通过“psaux|grepdnsmasq”命令也可以清楚的看到DHCPServer分配的IP范围,所以可以知道默认LXC的虚拟网络预设。设置的IP段是10.0.3.0/24,那么这个信息可以修改吗?当然,以上网络信息是LXC默认默认的网络设置,所以大家可以通过修改配置文件来修改相关信息以满足实际应用情况。可以使用编辑器修改LXC的网络配置文件:#vi/etc/default/lxclist1./etc/default/lxc文件内容:LXC_BRIDGE="lxcbr0"LXC_ADDR="10.0.3.1"LXC_NETMASK="255.255.255.0"LXC_NETWORK="10.0.3.0/24"LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"LXC_DHCP_MAX="253"LXC_SHUTDOWN_TIMEOUT=120修改后重启网络服务,使用如下命令:#servicelxc-netrestartSetLXC使用物理网络接口与KVM相比,LXC可以直接使用物理网络接口(例如本文中的物理网卡是eth0和eth1,作者计划将eth0分配给LXC虚拟网络)。先用“ifconfig-a”命令查看,其中eth1是物理机对外连接使用的网络接口,eth0可以用来设置LXC虚拟机使用。然后修改LXC虚拟机的配置文件:/var/lib/lxc/cjhlxc1/config。#vi/var/lib/lxc/cjhlxc1/config列表2/var/lib/lxc/cjhlxc1/config文件内容:lxc.network.type=physlxc.network.link=eth0lxc.network.flags=uplxc.utsname=cjhlxc1#lxc.network.hwaddr=00:16:3e:f9:ad:be#这一行应该被注释掉#lxclxc.devttydir=lxclxc.tty=4lxc.pts=1024lxc.rootfs=/var/lib/lxc/myt2/rootfslxc.mount=/var/lib/lxc/myt2/fstablxc.arch=amd64lxc.cap.drop=sys_modulemac_adminlxc.pivotdir=lxc_putold修改完成后保存退出。简单解释一下上面的参数:lxc.network.type指定容器使用的网络类型,包括四种类型:empty:创建一个未使用的网络接口veth:容器将链接到lxc.network.link定义的网桥,进行通信与外界。桥接之前必须预先建立。macvlan:macvlan接口将链接到lxc.network.link。phys:lxc.network.link指定的物理接口分配给容器。lxc.network.flags用于指定网络状态,up表示网络可用。lxc.network.link用于指定用于与容器接口通信的真实接口,例如网桥br0。lxc.network.hwaddr用于指定容器网络接口的mac地址。修改主机网络配置文件如下:#vim/etc/network/interface注意此时配置文件为空,没有内容。通常可以设置为固定IP地址方式(见清单3)或通过DHCP服务器获取IP地址方式(见清单4)Mode:autoloifaceloinetloopbackautoeth0ifaceeth0inetstaticaddress10.0.0.3netmask255.255.255.0dns-nameservers10.0.0.4修改后保存退出.然后重启网络服务:#/etc/init.d/networkingrestart如下启动LXC虚拟机:#lxc-start-ncjhlxc1注意一旦LXC虚拟机启动成功,在宿主机上使用“ifconfig-a”查看主机网络接口,用户会发现网络接口eth0已经消失,只存在eth1。这是因为eth0已经被LXC虚拟机使用了。然后我们使用如下命令“lxc-console-ncjhlxc1”登录LXC虚拟机,发现LXC虚拟机的网络接口是eth0。然后我们就可以使用ping命令来测试LXC虚拟机是否可以上网了。综上所述,LXC的中文名称是Linux容器工具。容器可以提供轻量级虚拟化来隔离进程和资源。使用LXC的好处是不需要安装太多的软件包,使用过程也不会占用太多的资源。本文逐步介绍了如何创建和管理Linux容器以及如何设置虚拟网络接口。
