lxc的安装及初级应用


2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 1/44 17173系统部 17173系统部团队技术博客 标签归档:LXC lxc的安装及初级应用 lxc的安装及初级应用 Create date: 2013/07/12 14:40 Last Update: 2013/11/14 11:22 1. 参考文档 1.1. LXC相关 1.2. 工具相关 2. LXC是什么? 3. 帮助手册 3.1. LXC介绍 3.2. 配置文件 3.3. 操作指令集 4. LXC支持的网络类型介绍 4.1. 物理(phys)网络 4.2. 配置桥接(veth)网络 4.3. 配置macvlan网络 4.3.1. Macvlan分为三种类型: 4.3.2. 宿主机MAC Bridge配置 4.3.3. 配置vlan网络 5. LXC实践(简易安装从这里开始即可) 5.1. 操作系统及lxc版本(本文档测试中碰到的问题) 5.2. LXC关键的三个要素 5.3. 宿主服务器初始化 5.3.1. 宿主服务器 – libcgroup 5.3.2. 宿主服务器 – 开启网桥模式 5.3.3. 宿主服务器 – cgroup设置 5.3.4. 宿主服务器 – 挂载cgroup实现资源控制 5.4. lxc – 软件的安装 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 2/44 5.4.1. lxc资源下载 5.4.2. 安装lxc及依赖的软件包 5.4.3. 安装lxc 5.4.3.1. 方法1:生成rpm 5.4.3.2. 方法2:编译安装 5.5. lxc – 制作rootfs文件系统模板 5.5.1. rpm制作模板 5.5.2. 解压rpm 5.5.3. 修改rootfs文件系统模板的yum源 5.5.4. 安装rootfs必要的软件及基础模块 5.6. lxc – rootfs初始化 5.6.1. lxc rootfs基础配置 5.6.2. mknod系统设备小知识 5.6.3. 为lxc创建必要的设备节点 5.6.4. 创建一些基本的目录 5.6.5. 用户环境配置文件 5.6.6. 创建网络文件 5.6.7. 增加容器启动初始化脚本 5.7. lxc – config配置文件 5.7.1. 创建config文件 5.7.2. config文件的参数调整 5.8. lxc – fstab 5.9. lxc – 操作指令 5.9.1. lxc指令集 5.9.2. 启动lxc实例 5.9.3. 关闭lxc实例 5.9.4. 宿主服务器查看lxc实例进程 5.9.5. 宿主服务器动态限制lxc资源 5.9.6. lxc实例控制台 5.9.7. 内核是否支持lxc运行 5.9.8. 实例里的网络连接状态 5.9.9. 实例里的进程状态 5.9.10. 实例状态监控 6. FAQ 6.1. 容器启动报错 6.1.1. Too many open files – failed to inotify_init 6.2. resin/httpd等服务非正常关闭, 导致容器出错 6.3. 容器名被占用的解决办法 6.3.1. 更换容器名(不建议) 6.3.2. 强制删除 6.4. LXC宿主机上做LVS时,真实服务器不能是同一台宿主机下面的LXC容器 6.5. 网卡名长度限制 6.6. 执行dmidecode报错”/dev/mem: No such file or directory” 6.7. 加载fuse报错 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 3/44 6.8. 宿主机问题导致的容器使用异常 6.8.1. TTY问题 6.9. 添加tty, 允许更多的终端登录 6.10. 服务检查 6.11. UTF中文字符处理 6.12. 使用RHEL发行版的yum资源 6.13. 操作系统时区与硬件时钟 6.14. 预读取/预处理脚本删除 6.15. 使用ssh/scp等出现问题 6.16. 桥接网卡MAC绑定 tag: cloud, virtual, lxc 1. 参考文档 1.1. LXC相关 https://www.berrange.com/posts/2009/12/03/using-cgroups-with-libvirt-and-lxckvm-guests-in- fedora-12/ http://wiki.centos.org/HowTos/LXC-on-CentOS6 http://uncommonsense-uk.com/2012/virtual-machine-stacking-using-lxc-on-top-of-esx/ http://wenku.baidu.com/view/eabc5647a8956bec0975e34e.html http://lxc.teegra.net/ http://kaivanov.blogspot.com/2012/07/configuring-lxc-linux-containers.html http://whistl.com/index.php/blog/2011/08/28/linux-containers-under-centos-6 1.2. 工具相关 http://os.51cto.com/art/201207/347414.htm (socat) 2. LXC是什么? LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。 LXC可以在操作系统层次上为进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器,同时可以 为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小 (包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、 uts)。 LXC主要包含三个方面:cgroup、network和rootfs。 Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组 (process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。LXC主要通过 cgroup实现对于资源的管理和控制。 Network是为容器提供的网络环境设置。 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 4/44 rootfs用于指定容器的虚拟根目录,设定此项以后,容器内所有进程将会把此目录根目录,不能 访问此目录之外的路径,相当于chroot的效果。 生命周期和状态 CONTAINER LIFE CYCLE When the container is created, it contains the configuration informati on. When a process is launched, the container will be starting and running. W hen the last process running inside the container exits, the container is stopped. In case of failure when the container is initialized, it will pass thr ough the aborting state. --------- | STOPPED |<--------------- --------- | | | start | | | V | ---------- | | STARTING |--error- | ---------- | | | | | V V | --------- ---------- | | RUNNING | | ABORTING | | --------- ---------- | | | | no process | | | | | V | | ---------- | | | STOPPING |<------- | ---------- | | | --------------------- 注意:从lxc-wait帮助里可以看到有7种状态:STOPPED, STARTING, RUNNING, STOPPING, AB ORTING, FREEZING, FROZEN。后2种尚不了解 3. 帮助手册 3.1. LXC介绍 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 5/44 man lxc 3.2. 配置文件 man lxc.conf 3.3. 操作指令集 man lxc命令 lxc命令 -h 4. LXC支持的网络类型介绍 4.1. 物理(phys)网络 指定一个物理接口作为容器网络使用: lxc.network.type = phys lxc.network.flags = up lxc.network.link = eth0 lxc.network.hwaddr = 4a:49:43:49:79:ff lxc.network.ipv4 = 10.10.95.87/24 lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3297 优点:配置简单 缺点:网卡资源有限 4.2. 配置桥接(veth)网络 veth (virtual ethernet)宿主需要开启桥接模式,配置如下:添加桥接网卡 # vim ifcfg-br0 DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="static" IPADDR="192.168.108.176" 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 6/44 NETMASK="255.255.252.0" GATEWAY="192.168.111.254" 修改eth0网卡 # vim ifcfg-eth0 DEVICE="eth0" BRIDGE="br0" ONBOOT="yes" BOOTPROTO="none" NM_CONTROLLED="no" TYPE="Ethernet" HWADDR="00:16:3E:47:3E:D4" Lxc的配置文件格式如下: lxc.network.type = veth lxc.network.flags = up lxc.network.link=br0 lxc.network.veth.pair= vethxxx lxc.network.hwaddr= 00:16:3e:77:52:20 lxc.network.ipv4 = 10.11.6.225/24 lxc.network.name = eth0 启动后宿主会增加一个vethxxx的网卡,容器通过这个网卡连接到宿主的网桥上通信。 支持别名网卡config配置文件里无需做变更,只需容器里类似ifconfig eth0:0来添加别名网卡 添加别名网卡后,交换机不会立刻更改IP对应的MAC地址,会等到老化后才会识别新MAC,默认老化 时间20分钟。若需要立刻识别,需要主动发出arp请求以更新交换机,如arping 10.59.94.254 -s 10.59.94.45 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 7/44 4.3. 配置macvlan网络 macvlan (mac-address based virtual lan tagging) VEPA (Virtual Ethernet Port Aggregator) 4.3.1. Macvlan分为三种类型: VEPA模式是默认模式,这种模式只能一端到另一端连接,所以容器只能和宿主连接,容器彼此不能相 互访问。 Bridge模式,所有容器通过mac地址标记,彼此可以直接通信,由于kernel知道每个mac地址的分配, 所以实际上容器之间是通过内核通信。Mac地址可以随便定义,但是ip地址必须符合规则,必须在同一 网段的。 Private模式,这种模式下的容器不能与任何其他机器通讯。 4.3.2. 宿主机MAC Bridge配置 宿主配置虚拟网桥: ip link add link eth0 name macv0 address 00:aa:bb:cc:dd:10 type macvlan mode bridge ip link set macv0 up ip address add 172.16.100.10/24 broadcast 172.16.100.255 dev macv0 容器一: lxc.network.type = macvlan lxc.network.flags = up lxc.network.link = macv0 lxc.network.macvlan.mode = bridge lxc.network.hwaddr= 00:aa:bb:cc:dd:11 lxc.network.ipv4 = 172.16.100.11/24 容器二: 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 8/44 lxc.network.type = macvlan lxc.network.flags = up lxc.network.link = macv0 lxc.network.macvlan.mode = bridge lxc.network.hwaddr= 00:aa:bb:cc:dd:12 lxc.network.ipv4 = 172.16.100.12/24 查看网桥日志 # ip -s link show macv0 66: macv0@eth0: mtu 1500 qdisc noqueue stat e UNKNOWN link/ether 00:aa:bb:cc:dd:10 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 19608 264 0 0 0 261 TX: bytes packets errors dropped carrier collsns 790 11 0 0 0 0 删除虚拟网桥。 # ip link delete macv0 macvlan采用bridge模式, 每个容器link到同一块网卡macv0上(可以是物理网卡, 也可以是容器网 卡), 容器指定自己独立的MAC和IP地址, IP地址可以根据vlan分配, 实际上两个容器通过IP映射到 MAC地址上, 然后相互访问。 Macvlan内的容器要想访问外网其他段的地址,需要把容器的网关配置为网桥的地址。宿主用iptables 做nat伪装。 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 9/44 外面的服务器容器的ip地址,实际上是访问宿主的eth0网卡,然后通过判断将请求转到不同的容器上。 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destinat ion 11.11.11.11:80 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to-destinat ion 11.11.11.12:80 也可以使用socat方式转发, socat(Socket Cat)是NC(Net Cat)的增强版 socat -d -d -lf /var/log/socat.log TCP4-LISTEN:80,reuseaddr,fork,su=nobody TC P4:11.11.11.11:80 & 4.3.3. 配置vlan网络 每个vlan.id就是一个网段,每个网卡上的vlan.id不能重复。这样就相当于容器是一个网关服务 器,隔离各个局域网。 配置举例: lxc.network.type = vlan lxc.network.vlan.id = 100 lxc.network.flags = up lxc.network.link = eth0 lxc.network.ipv4 = 202.202.0.25/24 5. LXC实践(简易安装从这里开始即可) 5.1. 操作系统及lxc版本(本文档测试中碰到的问题) OS: RHEL 6.4 LXC: lxc-0.7.5 lxc-0.7.5以上版本在RHEL 6.3-6.4运行碰到问题。 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 10/44 5.2. LXC关键的三个要素 一个完整的LXC容器必须包含以下2个文件和1个目录 -rw-r--r-- 1 root root 1280 Aug 9 17:20 config -rw-r--r-- 1 root root 115 Aug 9 14:47 fstab dr-xr-xr-x 21 root root 4096 Aug 9 18:09 rootfs 5.3. 宿主服务器初始化 5.3.1. 宿主服务器 – libcgroup cgroup使用liblxc实现的cgroup,而不用libcgroup,但是libcgroup集成的删除cgroup命名空间的操作 指令(cgdelete)是liblxc不具备的(作用,强制删除无用的/cgroup/name命名空间),因此要装,但 不使用除cgdelete以外的功能。 # yum install libcgroup 默认/etc/init.d/cgconfig和/etc/init.d/cgred都是stop的状态,并且chkconfig也是off, 不过为了保险起见,建议将这2个服务手动再次关闭并确保chkconfig为off状态 libvirt依赖libcgroup,而libcgroup不依赖libvrit,安装libcgroup。建议yum remove libvirt,然后再 yum install libcgroup 注意:cfconfig stop将会执行cgclear(卸载/cgroup,但仅从/proc/mounts里去除,并未 从/etc/mtab,即mount命令输出中去除),执行这条命令需要小心,如果状态已经是stopped的,就 没必要再次执行 注意:卸载libcgroup包将会删除/cgroup目录,因此没有特殊需求时不要这么做 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 11/44 5.3.2. 宿主服务器 – 开启网桥模式 添加桥接网卡 # vim ifcfg-br0 DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="static" IPADDR="10.59.95.71" NETMASK="255.255.255.0" GATEWAY="10.59.95.254" 修改em2网卡 # vim ifcfg-em2 DEVICE="em2" BRIDGE="br0" ONBOOT="yes" BOOTPROTO="none" NM_CONTROLLED="no" TYPE="Ethernet" 重启网络 # /etc/rc.d/init.d/network restart Shutting down interface em2: bridge br0 does not exist! [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface em2: [ OK ] Bringing up interface br0: [ OK ] 5.3.3. 宿主服务器 – cgroup设置 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 12/44 关闭libcgroup集成的cfconfig和cgred服务 # checkconfig --level 35 cgconfig off # checkconfig --level 35 cgred off # /etc/rc.d/init.d/cfconfig stop # 注意:cfconfig stop将会执行cgclear(卸载/cgro up,但仅从/proc/mounts里去除,并未从/etc/mtab,即mount命令输出中去除),执行这条命令 需要小心,如果状态已经是stopped的,就没必要再次执行 # /etc/rc.d/init.d/cgred stop 5.3.4. 宿主服务器 – 挂载cgroup实现资源控制 创建/cgroup, 编辑/etc/fstab # mkdir /cgroup # vim /etc/fstab cgroup /cgroup cgroup defaults 0 0 5.4. lxc – 软件的安装 5.4.1. lxc资源下载 http://lxc.sourceforge.net/download/lxc/ 这次测试了0.7.5 – 0.9.0 6个版本, 目前成功的是0.7.5 # wget http://lxc.sourceforge.net/download/lxc/lxc-0.7.5.tar.gz 5.4.2. 安装lxc及依赖的软件包 这里直接使用yum进行安装, 可以使用其他方法 # yum install libcap-devel # yum install docbook2X 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 13/44 5.4.3. 安装lxc 5.4.3.1. 方法1:生成rpm 生成rpm # tar -zxvf lxc-0.7.5.tar.gz # cd lxc-0.7.5 # ./configure # make rpm ..... Wrote: /root/rpmbuild/SRPMS/lxc-0.7.5-1.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/lxc-0.7.5-1.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/lxc-devel-0.7.5-1.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/lxc-debuginfo-0.7.5-1.x86_64.rpm ..... 安装rpm # cd /root/rpmbuild/RPMS/x86_64/ # rpm -ivh * 5.4.3.2. 方法2:编译安装 编译安装 # tar -zxvf lxc-0.7.5.tar.gz # cd lxc-0.7.5 # ./configure make && make install 关于–prefix注意点 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 14/44 1. 若使用./configure不带--prefix,则lxc-start、lxc-console连接的socket为@/var/li b/lxc/v-fz-qa-30/command 2. 若使用./configure --prefix=/opt/17173/lxc-0.7.5,则lxc-start、lxc-console连 接的socket为@/opt/17173/lxc-0.7.5/var/lib/lxc/v-fz-qa-43/command 若不通过lxc-create命令创建容器,而是手动创建,则必须保证/var/lib/lxc/目录存在且为空;指定了– prefix也一样,必须保证/opt/17173/lxc-0.7.5/var/lib/lxc/目录存在且为空。因为lxc-ls里以 $prefix/var/lib/lxc存在为执行前提,然后会ls $prefix/var/lib/lxc/ 文档下述的安装环境均为“方法1:生成rpm”,因此socket连接路径均为/var/lib/lxc。 5.5. lxc – 制作rootfs文件系统模板 5.5.1. rpm制作模板 这里采用简单的rpm安装方法, 和kickstart、cdrom安装操作系统的流程几乎一致, 缺少了内核和驱动加 载的初始化过程而已 # mkdir -p /opt/rhel6.4fs # cd /opt/rhel6.4fs # wget http://10.59.96.4/pub/os/RedHat/enterprise/x86_64/6ASU4/disk/Packages/ redhat-release-server-6Server-6.4.0.4.el6.x86_64.rpm 5.5.2. 解压rpm 解压下载的rpm # rpm2cpio redhat-release-server-6Server-6.3.0.3.el6.x86_64.rpm | cpio -idm 5.5.3. 修改rootfs文件系统模板的yum源 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 15/44 这里直接使用了17173内部的centos的yum源, 装起来怪怪的, 不过可以用 # cp /etc/yum.repos.d/17173-rhel6.repo /opt/lxc/rhel6.4fs/etc/yum.repos.d/ # cd /opt/lxc/rhel6.4fs/etc/yum.repos.d/ # vim 17173-rhel6.repo %s/\$releasever/6/g 5.5.4. 安装rootfs必要的软件及基础模块 安装到定义的rootfs模板路径 # yum --installroot=/opt/rhel6.4fs install lrzsz dhclient openssh-server pass wd rsyslog vim-minimal vixie-cron wget which yum # yum --installroot=/opt/rhel6.4fs groupinstall base 5.6. lxc – rootfs初始化 5.6.1. lxc rootfs基础配置 chroot到rootfs里 # chroot /opt/rhel6.4fs 设置rootfs root密码 # passwd 5.6.2. mknod系统设备小知识 /dev/下块设备和字符设备的含义 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 16/44 mknod DEVNAME {b | c} MAJOR MINOR b和c 分别表示块设备和字符设备: b: 表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘; c: 表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、 终端都是以字符的形式传送数据; MAJOR和MINOR分别表示主设备号和次设备号: 为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。 主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。 linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备 号. 所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1 5.6.3. 为lxc创建必要的设备节点 这里指定义了一个tty, 试图增加过报错了, 这次先忽略 # rm -f /dev/null # mknod -m 666 /dev/null c 1 3 # mknod -m 666 /dev/zero c 1 5 # mknod -m 666 /dev/urandom c 1 9 # ln -s /dev/urandom /dev/random # mknod -m 600 /dev/console c 5 1 # mknod -m 660 /dev/tty c 5 0 # mknod -m 660 /dev/tty1 c 4 1 # mknod -m 660 /dev/tty2 c 4 2 # mknod -m 660 /dev/tty3 c 4 3 # mknod -m 660 /dev/tty4 c 4 4 # mknod -m 640 /dev/mem c 1 1 # chown root:tty /dev/tty # chown root:tty /dev/tty1 # chown root:tty /dev/tty2 # chown root:tty /dev/tty3 # chown root:tty /dev/tty4 # chown root:kmem /dev/mem 5.6.4. 创建一些基本的目录 系统挂载需要使用的基础目录 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 17/44 # mkdir -p /dev/shm # chmod 1777 /dev/shm # mkdir -p /dev/pts # chmod 755 /dev/pts 5.6.5. 用户环境配置文件 root用户的基础登录环境 # cp -a /etc/skel/. /root/ 5.6.6. 创建网络文件 必要的dns、网络、fstab等 # cat > /etc/resolv.conf << END # fuzhou tele DNS nameserver 218.85.157.99 nameserver 218.85.152.99 END # cat /etc/hosts << END 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain 4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain 6 127.0.0.1 lxc.local.17173.com END # cat /etc/sysconfig/network << END NETWORKING=yes HOSTNAME=lxc.local.17173.com END # cat > /etc/fstab << end /dev/root / rootfs defaults 0 0 none /dev/shm tmpfs nosuid,nodev 0 0 end # cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 18/44 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet IPADDR=10.5.17.189 NETMASK=255.255.255.0 # cat /etc/sysconfig/network-scripts/route-eth0 10.59.64.0/18 via 10.5.17.254 10.5.0.0/17 via 10.5.17.254 5.6.7. 增加容器启动初始化脚本 由于容器的特殊性,需要添加以下配置文件至容器中 cat > /etc/init/lxc-sysinit.conf << END start on startup env container pre-start script if [ "x\$container" != "xlxc" -a "x\$container" != "xlibvirt" ]; then stop; fi initctl start tty TTY=console rm -f /var/lock/subsys/* rm -f /var/run/*.pid rm -f /etc/mtab telinit 3 if [ ! -e /etc/mtab ]; then echo '/dev/root / rootfs defaults 0 0' > /etc/mtab echo 'none /dev/shm tmpfs rw,nosuid,nodev 0 0' >> /etc/mtab else grep -q 'rootfs' /etc/mtab [ $? -eq 1 ] && echo '/dev/root / rootfs defaults 0 0' >> /etc/mt ab grep -q 'tmpfs' /etc/mtab [ $? -eq 1 ] && echo 'none /dev/shm tmpfs rw,nosuid,nodev 0 0' >> /etc/mtab grep -q 'devpts' /etc/mtab [ $? -eq 0 ] && sed -i '/devpts/d' /etc/mtab fi exit 0; end script EOF 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 19/44 5.7. lxc – config配置文件 5.7.1. 创建config文件 创建lxc的基础配置文件, 命名可以随意 # cat config lxc.utsname = lxc-test1 lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.name = eth0 #lxc.network.hwaddr = 00:16:3e:77:52:20 lxc.network.veth.pair = v-lxc-test1 lxc.network.ipv4 = 10.5.17.189/24 lxc.tty = 4 lxc.pts = 1024 lxc.rootfs = /opt/lxc/lxc-test lxc.mount = /opt/lxc/lxc-test/fstab #lxc.arch = i686 lxc.arch = x86_64 lxc.cap.drop = sys_module mac_admin lxc.cgroup.devices.deny = a # Allow any mknod (but not using the node) lxc.cgroup.devices.allow = c *:* m lxc.cgroup.devices.allow = b *:* m ## /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm ## consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm ## /dev/{,u}random lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm ## rtc lxc.cgroup.devices.allow = c 254:0 rwm ##fuse lxc.cgroup.devices.allow = c 10:229 rwm ##tun lxc.cgroup.devices.allow = c 10:200 rwm ##full 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 20/44 lxc.cgroup.devices.allow = c 1:7 rwm ##hpet lxc.cgroup.devices.allow = c 10:228 rwm ##kvm lxc.cgroup.devices.allow = c 10:232 rwm ## /dev/mem lxc.cgroup.devices.allow = c 1:1 rwm 5.7.2. config文件的参数调整 目前有使用的参数做个记录, 理解不能保证100%正确, 希望后人填补 # 定义本lxc实例的名称 lxc.utsname = lxc-test1 # 定义宿主服务器的网络设备进行桥接 lxc.network.link=br0 # 定义lxc实例的网卡名称, 一定要注意: 这个网卡必须是宿主机有的物理设备名称, 否则将会报错 lxc.network.name = eth0 # 定义lxc实例的网卡硬件地址 lxc.network.hwaddr= 00:16:3e:77:52:20 # 定义宿主服务器可见的网络设备名称, ifconfig可见 lxc.network.veth.pair = v-lxc-test1 # 定义lxc实例的IP地址 lxc.network.ipv4 = 10.59.95.79/24 # 定义lxc rootfs在宿主服务器的路径 lxc.rootfs = /opt/lxc/lxc-test # 定义lxc fstab在宿主服务器的路径 lxc.mount = /opt/lxc/lxc-test/fstab # 定义lxc实例可使用的CPU时间(最大1024) lxc.cgroup.cpu.shares = 1024 # 定义lxc实例可使用的宿主服务器CPU lxc.cgroup.cpuset.cpus = 2-5 # 定义lxc实例可用内存限制 lxc.cgroup.memory.limit_in_bytes = 2000M 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 21/44 # 定义lxc实例可用swap限制 lxc.cgroup.memory.memsw.limit_in_bytes = 2000M 5.8. lxc – fstab 这里的fstab主要控制rootfs的目录, 在lxc中如何挂载 #cat fstab proc /opt/lxc/lxc-test/rootfs/proc proc nodev,noexec,nosuid 0 0 sysfs /opt/lxc/lxc-test/rootfs/sys sysfs defaults 0 0 5.9. lxc – 操作指令 5.9.1. lxc指令集 lxc操作指令集 lxc-attach lxc-checkpoint lxc-create lxc-freeze lxc-ls lxc-ps lxc-setuid lxc-unfreeze lxc-wait lxc-cgroup lxc-clone lxc-destroy lxc-info lxc-monit or lxc-restart lxc-start lxc-unshare lxc-checkconfig lxc-console lxc-execute lxc-kill lxc-netst at lxc-setcap lxc-stop lxc-version lxc-attach(binary) 1. 作用:待补充 2. 用法示例:待补充 3. 注意:待补充 lxc-cgroup(binary) 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 22/44 1. 作用:资源额度配置 2. 用法示例: 查看:lxc-cgroup -n foo cpuset.cpus 配置:lxc-cgroup -n foo cpuset.cpus "0,3" 3. 注意:只能修改已启动实例的配置,若需要长久生效,需要相应更改配置文件config lxc-checkconfig(bash) 1. 作用:检测内核是否支持 2. 原理:默认读取/proc/config.gz,若不存在,则读取/boot/`uname -r`,进行查找,如是否 支持Namespace、Cgroup等 3. 用法示例: 自动查找:lxc-checkconfig 手动指定:CONFIG=/boot/config-2.6.32-358.18.1.el6.x86_64 lxc-checkconfig 4. 注意:待补充 lxc-checkpoint(binary) 1. 作用:待补充 2. 用法示例:待补充 3. 注意:not implemented yet lxc-clone(bash) 1. 作用:克隆实例,需要使用lvm 2. 原理:拷贝config、fstab、rootfs,并修改一些信息,如hostname等。支持通过lvm实现快 照 3. 用法示例:待补充 4. 注意:待补充 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 23/44 lxc-console(binary) 1. 作用:连接实例终端(tty) 2. 用法示例:lxc-console -n foo 3. 注意:lxc-console执行时会创建并连接/var/lib/lxc/command(socket,不过该socket不 是存在于文件系统上,而是内存里),可通过netstat -xa查看 lxc-create(bash) 1. 作用:创建实例 2. 原理:从模板或指定位置拷贝config,通过template脚本进行一些初始化操作(如ssh模板用于 修改/etc/ssh/sshd_config,做些比较常见的系统初始化操作,mkdir系统根下的一些目录以及写 入config默认配置) 3. 用法示例:待补充 4. 注意:待补充 lxc-destroy(bash) 1. 作用:删除实例 2. 原理:rm -rf /var/lib/lxc/foo 3. 用法示例:待补充 4. 注意:待补充 lxc-execute(binary) 1. 作用:仅启动容器,可用于进程资源限制,与lxc-start不同,具体作用尚不了解 2. 用法示例:lxc-execute -n foo -- /bin/bash 3. 注意:待补充 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 24/44 lxc-freeze(binary) 1. 作用:冻结实例,等于给容器里所有进程发送SIGSTOP 2. 用法示例:lxc-freeze -n foo 3. 注意:待补充 lxc-info(binary) 1. 作用:查看实例状态及其init进程pid 2. 用法示例: 查看状态和pid:lxc-info -n foo 只查看状态:lxc-info -n foo -s 只查看pid:lxc-info -n foo -p 3. 注意:待补充 lxc-kill(binary) 1. 作用:给容器进程(或者init进程,不太了解)发送信号,若不指定信号,则容器会被关闭,相 当于lxc-stop 2. 用法示例: 指定信号:lxc-kill -n foo SIGNUM 不指定信号:lxc-kill -n foo 经实验发现作用和lxc-stop -n foo一样 3. 注意:待补充 lxc-ls(bash) 1. 作用:列出所有实例,包括运行和未运行 2. 原理:ls /var/lib/lxc以及netstat -xa | grep '/var/lib/lxc',lxc-start、lxc-c 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 25/44 onsole均会创建到/var/lib/lxc/foo/command套接字的连接,且无法改变位置, 因此无论lxc实例放在哪,只要启动了,lxc-ls都能显示。 3. 用法示例: 简单输出:lxc-ls 详细输出:lxc-ls -l 4. 注意: 1) lxc-ls命令能使用的前提是存在/var/lib/lxc目录 2) 若当前有lxc-console连接着终端,那么lxc-ls也会显示,且不做uniq过滤,因此可能出现多 个相同名字的实例。这点很不靠谱 3) 建议将lxc实例放在/opt/lxc/目录下,且保持/var/lib/lxc目录存在且为空! lxc-monitor(binary) 1. 作用:实例状态监控(仅支持屏幕输出) 2. 用法示例:lxc-monitor -n 正则(支持监控多个实例) lxc-monitor -n foo lxc-monitor -n ’foo|bar’ lxc-monitor -n ’[f|b].*’ lxc-monitor -n ’.*’ 3. 注意: 1) 容器状态实时输出到屏幕上,有输出到日志的选项,但没有效果,依旧只输出到屏幕上,使用>导 入文件也不行,猜测不是实时写入,而是先缓存到内存里,导致无法从文件调取,这点很不靠谱 2) 会与lxc-wait冲突,只能使用其一 lxc-netstat(bash) 1. 作用:查看实例当前网络连接 2. 原理:mount --bind /proc/实例init的pid/net /proc/$$/net && exec netstat "$@ " 3. 用法示例:lxc-netstat -n foo lntpu 4. 注意:待补充 lxc-ps(perl) 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 26/44 1. 作用:查看实例当前进程报告 2. 原理:通过/cgroup/foo/tasks获取实例的所有进程pid,然后直接从宿主机进程报告里筛选出 来,因为实例本身就是宿主机的进程 3. 用法示例: 查看单个实例:lxc-ps -n foo -- aux 相当于登录进实例执行了ps aux 查看所有实例:lxc-ps --lxc -- -ef 相当于登录进所有lxc实例的终端,执行了ps -ef 4. 注意:虽然lxc-ps --lxc选项也是通过netstat -xa实现,但可能后期经过类似uniq处理,因 此lxc-ps的输出是正确的,不会像lxc-ls那样输出相同的 lxc-restart(binary) 1. 作用:待补充 2. 用法示例:待补充 3. 注意:not implemented yet lxc-setcap(bash) 1. 作用:使用libcap对lxc操作指令集进行cap设置(什么是cap:http://www.cnblogs.com/i amfy/archive/2012/09/20/2694977.html) 2. 用法示例:待补充 3. 注意:待补充 lxc-setuid(bash) 1. 作用:添加或删除lxc操作指令集的setuid位 2. 用法示例: 添加s位:lxc-setuid 删除s位:lxc-setuid -d 3. 注意:lxc-setuid会创建/var/lib/lxc目录并赋777权限,执行lxc-setuid -d会赋/var/l ib/lxc目录755权限 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 27/44 lxc-start(binary) 1. 作用:启动实例 2. 用法示例: 调试使用:lxc-start -n foo -f /opt/lxc/foo/config -o /opt/lxc/foo/foo.log -l d ebug daemon模式:lxc-start -n foo -f /opt/lxc/foo/config -o /opt/lxc/foo/foo.log - l debug -d 3. 注意:一定不能用kill -9来杀lxc-start进程,因为这样/cgroup里的name目录就去不掉了, 只能重启宿主机 lxc-stop(binary) 1. 作用:关闭实例 2. 用法示例:lxc-stop -n foo 3. 注意:待补充 lxc-unfreeze(binary) 1. 作用:解冻实例 2. 用法示例:待补充 3. 注意:待补充 lxc-unshare(binary) 1. 作用:待补充 2. 用法示例:待补充 3. 注意:待补充 lxc-version(bash) 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 28/44 1. 作用:查看lxc版本 2. 原理:脚本就一行echo "lxc version: 0.7.5" 3. 用法示例:还用说吗 4. 注意:待补充 lxc-wait(binary) 1. 作用:等待状态。可用于简单状态监测,如执行lxc-stop前先lxc-wait STOPPED,当lxc-wai t执行完毕退出即表示lxc-stop执行成功。 2. 用法示例: lxc-wait -n foo -s RUNNING 当foo的状态遇到RUNNING时结束退出 lxc-wait -n foo -s ’RUNNING|STOPPED’ 当foo的状态遇到RUNNING或STOPPED时结束退出 3. 注意: 1) 该命令与lxc-monitor冲突,只能用一个命令,无法两者一起使用。 2) 在实例里执行reboot,也会触发状态。 5.9.2. 启动lxc实例 启动调试功能的lxc实例, 主要进行调试, 看看有什么报错 lxc-start -n lxc-test1 -f /opt/lxc/test1/config -o /opt/lxc/test1/test1.log - l debug 用daemon方式启动 lxc-start -n lxc-test1 -f /opt/lxc/test1/config -o /opt/lxc/test1/test1.log - d 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 29/44 注意:若实例已启动则不能再次执行命令(虽然不会报错),因为这样lxc-monitor监听到的实例状态会 变为STOPPED,而实际上依然是RUNNING,这应该是个BUG 'lxc-test1' changed state to [STARTING] 'lxc-test1' changed state to [STOPPING] 'lxc-test1' changed state to [STOPPED] 5.9.3. 关闭lxc实例 仅仅是poweroff这个实例 lxc-stop -n lxc-test1 5.9.4. 宿主服务器查看lxc实例进程 lxc在宿主服务器的状态 # lxc-info -n test1 state: RUNNING pid: 11695 5.9.5. 宿主服务器动态限制lxc资源 lxc-cgourp限制, 查看现在的lxc实例使用的CPU # lxc-cgroup -n test1 cpuset.cpus 2-5 动态修改实例CPU使用 # lxc-cgroup -n test1 cpuset.cpus "0-3" 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 30/44 # lxc-cgroup -n test1 cpuset.cpus 0-3 也可以在cgroup直接修改 # echo "0-1" > /cgroup/test1/cpuset.cpus # lxc-cgroup -n test1 cpuset.cpus 0-1 5.9.6. lxc实例控制台 进入tty控制lxc实例 # lxc-console -n test1 Red Hat Enterprise Linux Server release 6.4 (Santiago) Kernel 2.6.32-358.el6.x86_64 on an x86_64 test1 login: 退出tty控制台, 和退出screen相似 Crtl a + q 远程tty ssh -t remote_host lxc-console -n test 若不加-t参数会报错: lxc-console: '0' is not a tty 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 31/44 lxc-console: failed to setup tios 5.9.7. 内核是否支持lxc运行 lxc-checkconfig # lxc-checkconfig Kernel config /proc/config.gz not found, looking in other places... Found kernel config file /boot/config-2.6.32-358.18.1.el6.x86_64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups --- Cgroup: enabled Cgroup namespace: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig 5.9.8. 实例里的网络连接状态 lxc-netstat 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 32/44 # lxc-netstat -n foo -lntpu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address S tate PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* L ISTEN 2831/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* L ISTEN 2797/sshd 5.9.9. 实例里的进程状态 lxc-ps # lxc-ps -n foo -- aux CONTAINER USER PID %CPU %MEM VSZ RSS TTY STAT START TIME C OMMAND foo root 2409 0.0 0.1 116220 1712 ? Ss 18:16 0:00 /sbin/in it foo root 2433 0.0 0.0 4060 540 pts/5 Ss+ 18:16 0:00 /sbin/mi ngetty console foo root 2669 0.0 0.1 189880 1532 ? Sl 18:16 0:00 /sbin/rs yslogd -i /var/run/syslogd.pid -c 5 foo dbus 2707 0.0 0.0 21400 908 ? Ss 18:16 0:00 dbus-dae mon --system foo 68 2741 0.0 0.2 24928 2360 ? Ss 18:16 0:00 hald foo root 2742 0.0 0.1 18104 1120 ? S 18:16 0:00 hald-run ner foo root 2797 0.0 0.1 66252 1208 ? Ss 18:16 0:00 /usr/sbi n/sshd foo root 2819 0.0 0.0 110176 924 ? Ss 18:16 0:00 /usr/sbi n/abrtd foo root 2831 0.0 0.1 70984 1232 ? Ss 18:16 0:00 nginx: m aster process /opt/17173/nginx/sbin/nginx -c /opt/17173/nginx/conf/nginx.conf foo nobody 2834 0.0 0.1 71444 1796 ? S 18:16 0:00 nginx: w orker process foo root 2840 0.0 0.1 117248 1268 ? Ss 18:16 0:00 crond foo root 2851 0.0 0.0 21492 476 ? Ss 18:16 0:00 /usr/sbi n/atd foo root 2864 0.0 0.0 4060 540 pts/1 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty1 foo root 2866 0.0 0.0 4060 536 pts/2 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty2 foo root 2868 0.0 0.0 4060 536 pts/3 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty3 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 33/44 foo root 2870 0.0 0.0 4060 536 pts/4 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty4 # lxc-ps --lxc -- aux (如果启动着多个实例,就会把所有实例都打印出来) CONTAINER USER PID %CPU %MEM VSZ RSS TTY STAT START TIME C OMMAND foo root 2409 0.0 0.1 116220 1712 ? Ss 18:16 0:00 /sbin/in it foo root 2433 0.0 0.0 4060 540 pts/5 Ss+ 18:16 0:00 /sbin/mi ngetty console foo root 2669 0.0 0.1 189880 1532 ? Sl 18:16 0:00 /sbin/rs yslogd -i /var/run/syslogd.pid -c 5 foo dbus 2707 0.0 0.0 21400 908 ? Ss 18:16 0:00 dbus-dae mon --system foo 68 2741 0.0 0.2 24928 2360 ? Ss 18:16 0:00 hald foo root 2742 0.0 0.1 18104 1120 ? S 18:16 0:00 hald-run ner foo root 2797 0.0 0.1 66252 1208 ? Ss 18:16 0:00 /usr/sbi n/sshd foo root 2819 0.0 0.0 110176 924 ? Ss 18:16 0:00 /usr/sbi n/abrtd foo root 2831 0.0 0.1 70984 1232 ? Ss 18:16 0:00 nginx: m aster process /opt/17173/nginx/sbin/nginx -c /opt/17173/nginx/conf/nginx.conf foo nobody 2834 0.0 0.1 71444 1796 ? S 18:16 0:00 nginx: w orker process foo root 2840 0.0 0.1 117248 1268 ? Ss 18:16 0:00 crond foo root 2851 0.0 0.0 21492 476 ? Ss 18:16 0:00 /usr/sbi n/atd foo root 2864 0.0 0.0 4060 540 pts/1 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty1 foo root 2866 0.0 0.0 4060 536 pts/2 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty2 foo root 2868 0.0 0.0 4060 536 pts/3 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty3 foo root 2870 0.0 0.0 4060 536 pts/4 Ss+ 18:16 0:00 /sbin/mi ngetty /dev/tty4 5.9.10. 实例状态监控 lxc-wait 只支持单一实例,可用于判断 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 34/44 # lxc-wait -n foo -s STOPPED 当状态变为STOPPED时程序退出 lxc-monitor 高级模式,支持正则 # lxc-monitor -n foo 'foo' changed state to [STOPPING] 'foo' changed state to [STOPPED] 'foo' changed state to [STARTING] 'foo' changed state to [RUNNING] 6. FAQ 6.1. 容器启动报错 6.1.1. Too many open files – failed to inotify_init 宿主修改/etc/sysctl.conf, 增加: fs.inotify.max_user_instances = 2048 6.2. resin/httpd等服务非正常关闭, 导致容器出错 错误现象: # 在容器中reboot, 发现如下报错: lxc-start: failed to create vnet-bj-test-12-vethaxnYbe : File exists lxc-start: failed to create netdev lxc-start: failed to create the network lxc-start: failed to spawn 'bj-test-12' lxc-start: No such file or directory - failed to remove cgroup '/cgroup/bj-te st-12' # 发现容器已经关闭, 但虚拟网卡仍然存在: # ifconfig vnet-bj-test-12 Link encap:Ethernet HWaddr 76:B3:A7:30:D0:47 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 35/44 inet6 addr: fe80::74b3:a7ff:fe30:d047/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:1701239 errors:0 dropped:0 overruns:0 frame:0 TX packets:379753 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:93329189 (89.0 MiB) TX bytes:4487435319 (4.1 GiB) # 强行关闭改网卡后, 容器恢复正常: # ip link delete vnet-bj-test-12 导致这种状态的原因: 在容器中发现启动了resin/httpd等内存、监听器回收较慢的服务, 猜测lxc关闭过程太快, 这些程序使用 的宿主网卡资源未释放, 导致这个问题产生, 删除resin自启动服务后现象消失。解决办法:先将容器的 应用进程都杀掉,等到netstat -antup查看没有连接的进程时,再重启或关闭容器 6.3. 容器名被占用的解决办法 当直接将lxc-start后台进程kill -9或者容器资源消耗太大导致使用reboot/poweroff或宿主上使用lxc-stop仅关 闭了lxc-start进程,但/cgroup下的命名空间(即容器名)并未消失,则无法使用相同的容器名启动容器,解 决办法有两种: 6.3.1. 更换容器名(不建议) 不使用原有的容器名,而更换个容器名来启动容器,不过这样存在一个问题,就是容器里的部分进程可 能还存在,导致资源未全部释放 6.3.2. 强制删除 第一步:安装libcgroup yum install libcgroup 安装完会在/etc/init.d/下生成2个服务:cgconfig,cgred。这2个服务默认是关着的,且开机不 启动的。 此时应该有了cgdelete指令 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 36/44 第二步:杀进程 cd /cgroup/name/ #name表示命名空间,对lxc来说就是容器名 for i in `cat cgroup.procs`; do kill -9 $i done cat cgroup.procs #查看下是否还有进程残留,若有,继续杀 注意这里kill的进程是来自cgroup.procs而不是tasks的。cgroup.procs与tasks的区别:cgroup.procs是 进程ID,而tasks是线程ID 第三步:使用cgdelete工具删掉命名空间 cgdelete 任一子系统:/name 如cgdelete cpu:/v-bj-test-11或cgdelete blkio:/v-bj-test-11均可 6.4. LXC宿主机上做LVS时,真实服务器不能是同一台宿主机下面的LXC容 器 6.5. 网卡名长度限制 实验发现lxc.network.veth.pair参数有长度限制 最多为15个字符,不能超过15个字符,测试支持的字符有数字、字母,还有3个符号-_. 其他符号没尝试过 lxc.utsname和name测试到50个字符依然没有出现问题(name指容器标识符,如lxc-start -n name) 6.6. 执行dmidecode报错”/dev/mem: No such file or directory” 在容器里需要执行以下命令,并在config里加入lxc.cgroup.devices.allow = c 1:1 rwm 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 37/44 mknod -m 640 /dev/mem c 1 1 chown root:kmem /dev/mem 虽然执行dmidecode不会报错了,但输出的内容实际是宿主机的 6.7. 加载fuse报错 使用MFS等需要加载fuse才可使用的文件系统时,需要创建字符设备文件及cgroup授权才可使用: 在容器里执行:mknod -m 660 /dev/fuse c 10 229 在宿主上进行cgroup device授权: 1. 永久生效:在config里添加lxc.cgroup.devices.allow = c 10:229 rwm 2. 即时生效:echo c 10:229 rwm > /cgroup/name/devices.allow 取消:echo c 10:229 rwm > /cgroup/name/devices.deny 查看已生效的:cat /cgroup/name/devices.list 若提示需要modprobe fuse,需要在宿主机上执行该命令(当drop CAP_SYS_MODULE时,即配置了 lxc.cap.drop = sys_module,则在容器里无法加载和卸载模块,如果允许的话会影响宿主机,因 为LXC是共享内核空间,并非独立的内核空间) 支持的设备类型:a 应用所有设备,可以是字符设备,也可以是块设备;b 指定块设备;c 指定字符设 备 关于rwm的解释:r 允许任务从指定设备中读取;w 允许任务写入指定设备;m 允许任务生成还不存 在的设备文件 6.8. 宿主机问题导致的容器使用异常 6.8.1. TTY问题 ssh宿主失败 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 38/44 root@...'s password: PTY allocation request failed on channel 0 启动容器报错 # lxc-start -n foo lxc-start: Permission denied - failed to create pty #0 lxc-start: failed to create the ttys lxc-start: failed to initialize the container 上述”ssh宿主失败”和”启动容器报错”现象均是因为在宿主上无法创建/dev/tty或/dev/pts/X(X 表示数字)所致 导致问题的原因 当容器中不存在/etc/mtab或/etc/mtab中包含了devpts的挂载信息,在用reboot、poweroff、s hutdown、halt等命令关机时会将宿主的devpts重新挂载为ro 解决方法 1. 确保/dev/ptmx存在,若不存在,则ln -s /dev/pts/ptmx /dev/ptmx 2. 确保devpts挂载为rw(可读可写),可从/proc/mounts里看到,若为ro,则mount -o remou nt,rw devpts(建议写入cron:* * * * * mount -o remount,rw devpts) 6.9. 添加tty, 允许更多的终端登录 原容器配置文件(config)中, lxc.tty = 1 容器配置文件修改: # cat config | grep tty lxc.tty = 4 容器操作系统中需要创建: mknod -m 660 /dev/tty1 c 4 1 mknod -m 660 /dev/tty2 c 4 2 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 39/44 mknod -m 660 /dev/tty3 c 4 3 mknod -m 660 /dev/tty4 c 4 4 chown root:tty /dev/tty1 chown root:tty /dev/tty2 chown root:tty /dev/tty3 chown root:tty /dev/tty4 6.10. 服务检查 关闭无用服务 # cat service_check.sh chkconfig --level 35 abrt-ccpp off chkconfig --level 35 abrtd off # 电源的开关等检测管理, 常用在Laptop上, 关闭 chkconfig --level 35 acpid off # 使用crond, 关闭 chkconfig --level 35 atd off # LVM block managerment tool chkconfig --level 35 blk-availability off # 调节cpu速度用来省电, 常用在Laptop上, 关闭 chkconfig --level 35 cpuspeed off chkconfig --level 35 libvirt-guests off chkconfig --level 35 rhsmcertd off # 硬盘自动检测守护进程, 关闭 chkconfig --level 35 smartd off chkconfig --level 35 iptables off chkconfig --level 35 ip6tables off # lvm监控, 关闭 chkconfig --level 35 lvm2-monitor off chkconfig --level 35 sendmail off # 自动加载nfs等网络文件系统, 关闭 chkconfig --level 35 netfs off # 软raid监控, 关闭 chkconfig --level 35 mdmonitor off chkconfig --level 35 auditd off 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 40/44 chkconfig --level 35 autofs off chkconfig --level 35 certmonger off chkconfig --level 35 nfslock off chkconfig --level 35 portreserve off chkconfig --level 35 postfix off chkconfig --level 35 rhnsd off chkconfig --level 35 rpcbind off chkconfig --level 35 rpcgssd off chkconfig --level 35 rpcidmapd off chkconfig --level 35 cups off chkconfig --level 35 haldaemon off chkconfig --level 35 messagebus off 6.11. UTF中文字符处理 /etc/sysconfig/i18n设置 # cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" 6.12. 使用RHEL发行版的yum资源 实际上就是kickstart中使用的安装源 # cat /etc/yum.repos.d/rhel-source.repo [base] name=17173 rhel 6ASU4 source baseurl=http://10.5.17.36/pub/os/RedHat/enterprise/x86_64/6ASU4/disk/Server/ enable=1 gpcheck=1 gpgkey=http://10.5.17.36/pub/os/RedHat/enterprise/x86_64/6ASU4/disk/RPM-GPG-K EY-redhat-release 6.13. 操作系统时区与硬件时钟 设置上海时间 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 41/44 # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看硬件时钟 # hwclock --show 可读不可写 config里的lxc.cap.drop添加sys_time,这样容器里可以date查看时间、hwclock --show查看 硬件时钟,但是无法通过date -s或hwclock --set --date来修改系统时间和硬件时钟 否则容器里更改系统时间或硬件时钟会导致宿主机的系统时间或硬件时钟同时发生改变,将会影响宿 主机自身和宿主机上其他的容器 6.14. 预读取/预处理脚本删除 lxc中各种预读脚本不能使用 # cd /etc/init/ # rm readahead* 6.15. 使用ssh/scp等出现问题 ssh root@10.5.17.188 发生错误 “Host key verification failed.”, 解决方法 # mknod -m 660 /dev/tty c 5 0 # chown root:tty /dev/tty 6.16. 桥接网卡MAC绑定 容器启动时,容器mac地址随机生成,若此mac地址小于宿主机br1的mac地址,则宿主机br1的mac地 址会变更为容器mac地址,当此容器关闭后,宿主机mac地址变更为其他小于宿主机的容器mac地址或 宿主机em1的mac地址, 解决方法: 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 42/44 在/etc/sysconfig/network-scripts/ifup-eth脚本里的70行左右(if [ "${TYPE}" = "Bri dge" ]; then ……; fi 段落的fi之前)添加: # add by 17173-sys 陈承 # 用途: 默认情况下桥接网卡MAC地址会动态设置为当前机器网卡的最小MAC # 因此需要手动绑定MAC地址以防止变更造成的物理主机网络短时中断 ip link set br1 address $(get_hwaddr em1) 也可手动执行命令ip link set br1 address MAC地址, 但桥接网卡重启或宿主机重启后绑定失效 本条目发布于2013年11月14日 [http://17173ops.com/2013/11/14/linux-lxc-install-guide.shtml] 。属于系统 运维分类,被贴了 Linux、LXC 标签。 Cgroup lxc在17173 iaas应用池中应用 Cgroup lxc在17173 iaas应用池中应用 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 43/44 « ‹ › » 本条目发布于2013年11月14日 [http://17173ops.com/2013/11/14/cgroup-lxc-as-17173-iaas.shtml] 。属于系 统运维分类,被贴了 cgroup、Linux、LXC 标签。 运行MESOS调度器和运算节点触发OOM导致LXC 死机问题的解决 某部门使用的LXC经常OOM的问题: 由于使用mesos调度程序是自动检测服务器硬件信息,启动用于启动时决定自己向系统申请的资源量 LXC上检测到的应该配置都是宿主的配置,导致mesos会一直申请内存直到触发lxc的OOM 在mesos-slave(运算节点)的启动脚本mesos-start-slaves.sh中 2014年7月16日 LXC | 17173系统部 http://17173ops.com/tag/lxc#toc23 44/44 加入resoures参数,如: --resources=mem:2048\;cpus:1\;disk:20480 本条目发布于2013年10月31日 [http://17173ops.com/2013/10/31/about-mesos-oom-under-lxc.shtml] 。属 于系统运维分类,被贴了 LXC、MESOS、OOM 标签。
还剩43页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 6 人已下载

下载pdf

pdf贡献者

975058336

贡献于2015-04-30

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf