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:



LXC network in routed mode



Вот такая у меня сеть.

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

Network for LXC testing

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