Linux Containers (lxc) в Centos 6.5 x64
############################## ### Создание моста ### Инсталляция необходимых пакетов # yum install -y bridge-utils ### Настраиваем интерфейс, для работы с контейнером # cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BRIDGE=br0 NM_CONTROLLED=no EOF # cat > /etc/sysconfig/network-scripts/ifcfg-br0 << EOF DEVICE=br0 TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.11 NETWORK=192.168.1.0 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DELAY=0 NM_CONTROLLED=no EOF # service network restart # ifconfig br0 br0 Link encap:Ethernet HWaddr 08:00:27:D3:AE:5C inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fed3:ae5c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:17 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:958 (958.0 b) TX bytes:2254 (2.2 KiB) # brctl show bridge name bridge id STP enabled interfaces br0 8000.08002774f2c7 no eth0 ################################################## При выключенном selinux возникают ошибки. Если собирать libvirt из исходников, то также возникают ошибки.
Если найдете решение, как работать с LXC с выключенным selinux, поделитесь со мной и общественностью. Включаю selinux # sestatus SELinux status: disabled # sed -i.bkp -e "s/SELINUX=disabled/SELINUX=enforcing/g" /etc/selinux/config ======================================================= Установка и настройка # yum install -y \ libvirt \ libvirt-client \ python-virtinst # chkconfig --level 345 libvirtd on # service libvirtd restart # chkconfig --level 345 cgconfig on # service cgconfig restart # mkdir -p /containers/centos/6/x86_64/test/etc/yum.repos.d/ # cat /etc/yum.repos.d/CentOS-Base.repo |sed s/'$releasever'/6/g > /containers/centos/6/x86_64/test/etc/yum.repos.d/CentOS-Base.repo # yum groupinstall core -y --nogpgcheck --installroot=/containers/centos/6/x86_64/test/ # yum install -y --nogpgcheck plymouth libselinux-python --installroot=/containers/centos/6/x86_64/test/ # yum install -y \ --nogpgcheck \ --installroot=/containers/centos/6/x86_64/test/ \ openssh-clients \ vim\ wget \ bind-utils \ traceroute \ tcpdump \ screen \ telnet \ nc \ lsof \ git ======================================== # chroot /containers/centos/6/x86_64/test # PS1='test:\w# ' test:/# passwd root ======================================== ### Configuring basic networking test:/# cat > /etc/sysconfig/network << EOF NETWORKING=yes HOSTNAME=lxc-test.localdomain EOF test:/# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF DEVICE="eth0" BOOTPROTO="static" ONBOOT="yes" IPADDR=192.168.1.101 NETMASK=255.255.255.0 GATEWAY=192.168.1.11 EOF test:/# cat > /etc/resolv.conf << END # Google public DNS nameserver 8.8.8.8 nameserver 8.8.4.4 END test:/# chkconfig --level 345 sshd on test:/# chkconfig --level 345 netfs off test:/# chkconfig --level 345 postfix off test:/# chkconfig --level 345 iptables off test:/# chkconfig --level 345 ip6tables off ========================================================== ### Fix root login on console test:/# echo "pts/0" >>/etc/securetty test:/# sed -i s/"session required pam_selinux.so close"/"#session required pam_selinux.so close"/g /etc/pam.d/login test:/# sed -i s/"session required pam_selinux.so open"/"#session required pam_selinux.so open"/g /etc/pam.d/login test:/# sed -i s/"session required pam_loginuid.so"/"#session required pam_loginuid.so"/g /etc/pam.d/login ========================================================== ### Fixing root login for sshd test:/# sed -i s/"session required pam_selinux.so close"/"#session required pam_selinux.so close"/g /etc/pam.d/sshd test:/# sed -i s/"session required pam_loginuid.so"/"#session required pam_loginuid.so"/g /etc/pam.d/sshd test:/# sed -i s/"session required pam_selinux.so open env_params"/"#session required pam_selinux.so open env_params"/g /etc/pam.d/sshd ========================================================== test:/# exit # cat /proc/mounts | grep cgroup cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0 cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0 cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0 cgroup /cgroup/memory cgroup rw,relatime,memory 0 0 cgroup /cgroup/devices cgroup rw,relatime,devices 0 0 cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0 cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0 cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0 # reboot ========================================================== Перед тем как выполнить следующую команду, рекомендую создать еще одну ssh сессию к серверу, т.к. сразу после выполнении команды, открывается консоль контейнера и тут же происходит дисконнект. Дальнейшие попытки подключиться к серверу по ssh могут не увенчаться успехом. После создания виртуальной машины и перезагрузки. Все работает нормально. # virt-install \ --connect lxc:/// \ --name test \ --ram 1024 \ --noautoconsole \ --network bridge:br0 \ --autostart \ --accelerate \ --filesystem /containers/centos/6/x86_64/test/,/ -v, --hvm Request the use of full virtualization, if both para & full virtualization are available on the host. This parameter may not be available if connecting to a Xen hypervisor on a machine without hardware virtualization support. This parameter is implied if connecting to a QEMU based hypervisor. # reboot # virsh -c lxc:/// list --all Id Name State ---------------------------------------------------- 1428 test running -- При необходимости запустить # virsh --connect lxc:/// start test # virsh -c lxc:/// dominfo test Id: 1428 Name: test UUID: 343be2d0-d9d5-37a7-26ca-aea4c4c099f2 OS Type: exe State: running CPU(s): 1 CPU time: 2,4s Max memory: 1048576 KiB Used memory: 21232 KiB Persistent: yes Autostart: enable Managed save: unknown # brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.08002774f2c7 no eth0 veth0 # virsh -c qemu:///system iface-list Name State MAC Address -------------------------------------------- br0 active 08:00:27:74:f2:c7 lo active 00:00:00:00:00:00 ### Подключение к контейнеру # virsh --connect lxc:/// console test CentOS release 6.5 (Final) Kernel 2.6.32-431.3.1.el6.x86_64 on an x86_64 lxc-test login: ===================================================== ===================================================== ===================================================== ### Удаляю настройки сети по умолчанию: vnet0 - сетевой интерфейс виртуальной машины без него сеть внутри машины работать не будет virbr0 - создаётся при устаноке по умолчанию. Нужен если планируется использовать NAT. Просматриваем список виртуальных сетей. # virsh net-list Name State Autostart Persistent -------------------------------------------------- default active yes yes Отключаем сеть Default # virsh -c lxc:/// net-destroy default Network default destroyed Удаляем сеть Default # virsh -c lxc:/// net-undefine default Network default has been undefined ===================================================== ===================================================== =====================================================
Настраиваю маршрутизацию для работы LXC в конфигурации route-mode:

Вот такая у меня сеть.
Стенд собран для тестирования. Использовать для работы в такой конфигурации не планирую.

ROUTER На роутере добавил статический маршрут: Destination IP Address: 192.168.1.101 IP Subnet Mask: 255.255.255.0 Gateway IP Address: 192.168.1.11 HOST # echo 1 > /proc/sys/net/ipv4/ip_forward -- Опционально: можно улучшить быстродействие соединения bridge, поправив настройки в /etc/sysctl.conf # cat >> /etc/sysctl.conf << EOF net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 EOF LXC [root@lxc-test ~]# ping -c 2 ya.ru PING ya.ru (213.180.193.3) 56(84) bytes of data. 64 bytes from www.yandex.ru (213.180.193.3): icmp_seq=1 ttl=55 time=2.87 ms From 192.168.1.11: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.1) 64 bytes from www.yandex.ru (213.180.193.3): icmp_seq=2 ttl=55 time=1.56 ms --- ya.ru ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1057ms rtt min/avg/max/mdev = 1.563/2.218/2.874/0.657 ms =================== Пинг до компьютера в локальной сети не проходит. [root@lxc-test ~]# ping -c 3 192.168.1.6 PING 192.168.1.6 (192.168.1.6) 56(84) bytes of data. From 192.168.1.101 icmp_seq=1 Destination Host Unreachable From 192.168.1.101 icmp_seq=2 Destination Host Unreachable From 192.168.1.101 icmp_seq=3 Destination Host Unreachable --- 192.168.1.6 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3008ms pipe 3 =================== -- вот уж не подумал бы, что нужно прописывать такой маршрут. т.к. GW и так указан как 192.168.1.11 [root@lxc-test ~]# route add -net 192.168.1.0/24 gw 192.168.1.11 [root@lxc-test ~]# ping -c 3 192.168.1.6 PING 192.168.1.6 (192.168.1.6) 56(84) bytes of data. From 192.168.1.11: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.6) From 192.168.1.11: icmp_seq=3 Redirect Host(New nexthop: 192.168.1.6) --- 192.168.1.6 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 12002ms =================== CLIENT root@notebook:~# route add -host 192.168.1.101 gw 192.168.1.1 root@notebook:~# ping -c 3 192.168.1.101 PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data. 64 bytes from 192.168.1.101: icmp_req=1 ttl=63 time=1.30 ms From 192.168.1.11: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.101) 64 bytes from 192.168.1.101: icmp_req=2 ttl=63 time=3.91 ms From 192.168.1.11: icmp_seq=3 Redirect Host(New nexthop: 192.168.1.101) 64 bytes from 192.168.1.101: icmp_req=3 ttl=63 time=1.27 ms --- 192.168.1.101 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 1.272/2.163/3.917/1.240 ms =================== LXC [root@lxc-test ~]# ping -c 3 192.168.1.6 PING 192.168.1.6 (192.168.1.6) 56(84) bytes of data. 64 bytes from 95.31.31.8: icmp_seq=1 ttl=62 time=7.84 ms From 192.168.1.11: icmp_seq=2 Redirect Host(New nexthop: 192.168.1.6) 64 bytes from 192.168.1.6: icmp_seq=2 ttl=62 time=6.77 ms From 192.168.1.11: icmp_seq=3 Redirect Host(New nexthop: 192.168.1.6) 64 bytes from 95.31.31.8: icmp_seq=3 ttl=62 time=17.2 ms --- 192.168.1.6 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2026ms rtt min/avg/max/mdev = 6.772/10.618/17.241/4.703 ms =========================================== ###### Проверка ping, чтобы понять в чем проблема. Что с пакетами и т.д. ### GUEST # tcpdump -n -vvv -i eth0 ### HOST # tcpdump -n -vvv -i br0 src host 192.168.1.101 # tcpdump -n -vvv -i br0 src host 192.168.1.6 ### CLIENT # tcpdump -n -vvv -i eth0 src host 192.168.1.101 ######## # tcpdump -nlUevvp -i any arp or icmp =========================================== ### Я отключал iptables на HOST. Если не отлючать, то чтобы сеть работала, нужно добавить правило. -- Делаем настройки в iptables, чтобы трафик виртуалок «ходил» через соединение типа bridge # iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT # service iptables save # service iptables restart
### Логи # less /var/log/libvirt/libvirtd.log # less /var/log/libvirt/lxc/test.log ### Данные контейнера # virsh -c lxc:/// dumpxml test -- Если нужно внести изменения # virsh -c lxc:/// edit test ===================================================== ===================================================== ===================================================== Еще есть проект создания виртуального свича (openvswitch). Возможно, что в ближайшем будущем он будет использоваться как стандарт для создания виртуальных контейнеров и машин. Но пока я даже не смог его скомпилировать у себя. (Кривые руки + нужны библиотеки кторорые нужно также компилить, которые ссылаются на другие и сообщения об ошибках, которое лично мне ничего не говорят).
Почитать: http://wiki.centos.org/HowTos/LXC-on-CentOS6 http://wiki.1tux.org/wiki/Centos6/Installation/Minimal_installation_using_yum http://wiki.1tux.org/wiki/Lxc/Installation/Guest/Centos/6 Ключи создания контейнера http://www.techotopia.com/index.php/Installing_a_KVM_Guest_OS_from_the_Command-line_%28virt-install%29 Управление виртуальными машинами с помощью virsh http://docs.fedoraproject.org/ru-RU/Fedora/12/html/Virtualization_Guide/chap-Virtualization_Guide-Managing_guests_with_virsh.html http://www.cyberciti.biz/faq/kvm-virtualization-in-redhat-centos-scientific-linux-6/ Virtual Networking http://wiki.libvirt.org/page/VirtualNetworking http://blog.gadi.cc/routed-subnet-libvirt-kvm/ http://blog.gadi.cc/single-ip-routing-in-libvirt/ Настройка публичного ip адреса для виртуальных машин под управлением гипервизора KVM http://openadmins.ru/blog/kvm-network-iptables Траблшутинг: http://linuxforum.ru/viewtopic.php?id=33307 http://linuxforum.ru/viewtopic.php?id=34269