LINUX.ORG.RU
решено ФорумAdmin

Странное поведение сети в LXC контейнере (host/guest = Ubuntu 11.04)


0

1

Решил погонять в домашней сети LXC. Задумка в том, чтобы на 1-2 физических машинах было 10-20 контейнеров с разными сервисами. Они должны быть прозрачно видны в сети, поэтому для подключения использую бридж. IP адресами хочется управлять централизовано, через DHCP на домашнем роутере. Под все это дело использую Ubuntu 11.04 Server x86 в режиме minimal configuration (пока все на виртуалке, так что minimal virtual configuration) (+пакетами bridge-utils и lxc естесно). В итоге: контейнер стартует, интерфейс сети на месте, но IP не получает. "ifdown eth0 && ifup eth0" или рестарт networking сервиса в контейнере решает проблему: IP получается мгновенно, пинги до яндекса ходят, по ssh к контейнеру тоже подключается. И так до следующей перезагрузки.

Вкратце, я сделал следующее:

  • Смонтировал cgroups, добавив запись в /etc/fstab.
  • Сделал бридж в /etc/network/interfaces.
  • Включил форвардинг IPv4 траффика в /etc/sysctl.conf.
  • sudo lxc-create -n test1 -t natty
  • Добавил параметры сети контейнера в /var/lib/lxc/test1/config.
  • Сделал симлинк /var/lib/lxc/test1/config в /etc/lxc/test1.conf
  • Включил сервис lxc в /etc/defaults/lxc и там же настроил авто-старт контейнера «test1».

И получил это:
в контейнере:

root@test1:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:bd:cc:75
          inet6 addr: fe80::20c:29ff:febd:cc75/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:65 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:8768 (8.7 KB)  TX bytes:652 (652.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@test1:~# /etc/init.d/networking restart
 * Running /etc/init.d/networking restart is deprecated because it may not enable again some interfaces
 * Reconfiguring network interfaces...                                                                                                                                  ssh stop/waiting
ssh start/running, process 377
                                                                                                                                                                 [ OK ]
root@test1:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:bd:cc:75
          inet addr:192.168.1.166 Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:febd:cc75/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:92 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13209 (13.2 KB)  TX bytes:1884 (1.8 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/var/log/syslog (на host'е)

May 17 06:26:31 lxc-server1 kernel: [    6.177577] device veth1dZwKs entered promiscuous mode
May 17 06:26:31 lxc-server1 kernel: [    6.177607] ADDRCONF(NETDEV_UP): veth1dZwKs: link is not ready
May 17 06:26:31 lxc-server1 kernel: [    6.228534] ADDRCONF(NETDEV_CHANGE): veth1dZwKs: link becomes ready
May 17 06:26:31 lxc-server1 kernel: [    6.496101] br0: port 2(veth1dZwKs) entering forwarding state
May 17 06:26:31 lxc-server1 kernel: [    6.496144] br0: port 2(veth1dZwKs) entering forwarding state
May 17 06:26:31 lxc-server1 kernel: [    6.496186] br0: port 1(eth0) entering forwarding state
May 17 06:26:31 lxc-server1 kernel: [    6.496191] br0: port 1(eth0) entering forwarding state
May 17 06:26:31 lxc-server1 dhclient: can't create /var/lib/dhcp3/dhclient.br0.leases: No such file or directory
May 17 06:26:31 lxc-server1 dhclient: DHCPDISCOVER on br0 to 255.255.255.255 port 67 interval 3
May 17 06:26:31 lxc-server1 dhclient: DHCPOFFER of 192.168.1.165 from 192.168.1.1
May 17 06:26:31 lxc-server1 dhclient: DHCPREQUEST of 192.168.1.165 on br0 to 255.255.255.255 port 67
May 17 06:26:31 lxc-server1 dhclient: DHCPACK of 192.168.1.165 from 192.168.1.1
May 17 06:26:31 lxc-server1 dhclient: can't create /var/lib/dhcp3/dhclient.br0.leases: No such file or directory
May 17 06:26:31 lxc-server1 dhclient: bound to 192.168.1.165 -- renewal in 37494 seconds.
May 17 06:26:32 lxc-server1 init: ssh main process (354) terminated with status 255
May 17 06:26:32 lxc-server1 kernel: [    7.504064] vesafb: framebuffer at 0xd0000000, mapped to 0xe0980000, using 1216k, total 1216k
May 17 06:26:32 lxc-server1 kernel: [    7.504111] vesafb: mode is 640x480x32, linelength=2560, pages=0
May 17 06:26:32 lxc-server1 kernel: [    7.504158] vesafb: scrolling: redraw
May 17 06:26:32 lxc-server1 kernel: [    7.504205] vesafb: Truecolor: size=8:8:8:8, shift=24:16:8:0
May 17 06:26:32 lxc-server1 kernel: [    7.516129] Console: switching to colour frame buffer device 80x30
May 17 06:26:32 lxc-server1 kernel: [    7.520064] fb0: VESA VGA frame buffer device
May 17 06:26:32 lxc-server1 init: plymouth-splash main process (918) terminated with status 1
May 17 06:26:48 lxc-server1 ntpdate[735]: step time server 91.189.94.4 offset 7.935507 sec
May 17 06:26:49 lxc-server1 kernel: [   16.128195] eth0: no IPv6 routers present
May 17 06:26:50 lxc-server1 kernel: [   16.672083] veth1dZwKs: no IPv6 routers present
May 17 06:26:50 lxc-server1 kernel: [   17.016784] br0: no IPv6 routers present
May 17 06:26:50 lxc-server1 kernel: [   17.184776] eth0: no IPv6 routers present
May 17 06:28:05 lxc-server1 kernel: [   91.965394] br0: port 2(veth1dZwKs) entering forwarding state
May 17 06:28:05 lxc-server1 kernel: [   92.036127] br0: port 2(veth1dZwKs) entering forwarding state
May 17 06:28:05 lxc-server1 kernel: [   92.036135] br0: port 2(veth1dZwKs) entering forwarding state
May 17 06:28:15 lxc-server1 kernel: [  102.080655] eth0: no IPv6 routers present

Конфиги: /etc/network/interfaces (на host'е)

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_hello 0
        bridge_maxwait 0

/var/lib/lxc/test1/config (на host'е)

lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:0c:29:bd:cc:75
lxc.utsname = test1

lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/test1/rootfs
lxc.mount  = /var/lib/lxc/test1/fstab

lxc.cgroup.devices.deny = a
# /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
#lxc.cgroup.devices.allow = c 4:0 rwm
#lxc.cgroup.devices.allow = c 4:1 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

/etc/network/interfaces (в контейнере)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

На всякий случай уточню, что на время обкатки сервер стоит на виртуалке. WinXP SP3, VMware Workstation 7.5, виртуальная сеть в режиме бриджа.

Буду очень признателен за любую помощь :)


смотри логи загрузки внутри контейнера. проверь runlevel внутри контейнера сразу после старта. на убунте были баги, что ранлевел неправильный и из-за этого некоторые сервисы (в том числе и сеть) не стартовали.

gorilych ★★
()
Ответ на: комментарий от gorilych

Поправьте меня, если что не правильно напишу.

  • Логи загрузки пишутся в syslog? Если да, то syslog'а в контейнере по-умолчанию нет - там пакетов еще меньше чем в режиме minimum configuration. Насколько я понял по разрозненной инфе в сети - весь лог идет к host'у (его я привел выше). Нужно ли действительно настраивать syslog на контейнере? Если да, то достаточно ли будет только поставить пакет rsyslog или надо что-то еще настроить?
  • Правильно ли я понимаю: если бы runlevel был неверен и networking сервис не стартовал бы вообще то вывод ifconfig'а был бы такой же, как если я щас остановлю сервис вручную? Если да, то теория не подтверждается, т.к. ifconfig показывает eth0 интерфейс, а при останове сервиса - только loopback. Ниже вывод runlevel'а сразу после старта системы из контейнера и на всякий с хоста.

на host'е при старте:

user@lxc-server:~# runlevel
N 2

в контейнере при старте:

root@test2:~# runlevel
N 2

У меня была мысль, что дело в том, что в LSB части скрипта сервиса lxc неправильно прописаны зависимости (там не была прописана необходимость стартовать сеть перед запуском). Сделал следующее:

  • дописал «$network» в соответствующую строчку скрипта сервиса
  • update-rc.d -f lxc remove
  • update-rc.d lxc defaults

Не помогло - разницы не заметил вообще. Пробывал заменить порядок запуска сервисов внутри контейнера:

  • update-rc.d -f lxc remove
  • update-rc.d lxc defaults 90 10

Также - без результатно. Кроме того проблема сохраняется, если запускать контейнер вручную и даже не через сервис (командой: sudo lxc-start -d -n test1). Также заметил, что иногда (очень редко, наверно 1 раз в 50 запусков) всеже сеть работает сразу после запуска контейнера, но, ничего не меняя, после еще одного рестарта - опять двадцать пять. Никакой закономерности заметить не удалось.

Очень хочется по-подробнее разобраться во всем, по-этому пишу развернуто ход мыслей в надежде на критику :)

aXe1
() автор топика
Ответ на: комментарий от gorilych

Поставил rsyslog, при дефолтных параметрах:

/var/log/syslog (в контейнере):

May 17 19:55:58 localhost kernel: imklog 4.6.4, log source = /proc/kmsg started.
May 17 19:55:58 localhost rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="410" x-info="http://www.rsyslog.com"] (re)start
May 17 19:55:58 localhost rsyslogd: rsyslogd's groupid changed to 104
May 17 19:55:58 localhost rsyslogd: rsyslogd's userid changed to 102
May 17 19:55:58 localhost rsyslogd-2039: Could no open output pipe '/dev/xconsole' [try http://www.rsyslog.com/e/2039 ]
May 17 19:59:29 localhost kernel: imklog 4.6.4, log source = /proc/kmsg started.
May 17 19:59:29 localhost rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="34" x-info="http://www.rsyslog.com"] (re)start
May 17 19:59:29 localhost rsyslogd: rsyslogd's groupid changed to 104
May 17 19:59:29 localhost rsyslogd: rsyslogd's userid changed to 102
May 17 19:59:29 localhost rsyslogd-2039: Could no open output pipe '/dev/xconsole' [try http://www.rsyslog.com/e/2039 ]
May 17 19:59:30 localhost init: plymouth main process (6) killed by ABRT signal
May 17 19:59:30 localhost init: plymouth-splash main process (116) terminated with status 2
May 17 19:59:31 localhost cron[208]: (CRON) INFO (pidfile fd = 3)
May 17 19:59:31 localhost cron[215]: (CRON) STARTUP (fork ok)
May 17 19:59:31 localhost cron[215]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
May 17 19:59:31 localhost init: plymouth-stop pre-start process (231) terminated with status 1

aXe1
() автор топика
Ответ на: комментарий от aXe1

Если я правильно понял, plymouth это просто сплеш при старте убунту, тобиш его краш не должен никак влиять на работу системы.. Может нужно сделать какието дополнительные настройки syslog'а?

aXe1
() автор топика
Ответ на: комментарий от aXe1

/etc/rsyslog.conf (в контейнере):

#  /etc/rsyslog.conf    Configuration file for rsyslog.
#
#                       For more information see
#                       /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
#  Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

/etc/rsyslog.d/50-default.conf (в контейнере):

#  Default rules for rsyslog.
#
#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
kern.*                          -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
mail.*                          -/var/log/mail.log
#user.*                         -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info                      -/var/log/mail.info
#mail.warn                      -/var/log/mail.warn
mail.err                        /var/log/mail.err

#
# Logging for INN news system.
#
news.crit                       /var/log/news/news.crit
news.err                        /var/log/news/news.err
news.notice                     -/var/log/news/news.notice

#
# Some "catch-all" log files.
#
#*.=debug;\
#       auth,authpriv.none;\
#       news.none;mail.none     -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#       auth,authpriv.none;\
#       cron,daemon.none;\
#       mail,news.none          -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                         *

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#       news.=crit;news.=err;news.=notice;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       /dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole

На host'е аналогичная настройка rsyslog'а.

aXe1
() автор топика
Ответ на: комментарий от anonymous

Спасибо за наводку, чуть позже вечером обязательно проверю. Чисто теоретически - хз чем это может помочь.. С другой стороны шаманство над свежим софтом довольно часто всплывает :)

aXe1
() автор топика
Ответ на: комментарий от anonymous

не помогло :( разницы нет совсем, что с ip, что без.

aXe1
() автор топика
29 августа 2011 г.

Найдено решение на ubuntuforums.org. Вкратце проблема в следующем: Ubuntu использует upstart, который не работает без udev'а. А в контейнере эта связка нормально не функционирует. Например, не запускаются многие сервисы. Костыль: Создаем в контейнере файл /etc/init/lxclo.conf со следующим содержанием:

# description "LXC vs. Upstart workarounds"
start on startup
task
console output

     script
      # As lxc 0.7's halt/reboot detection hack needs /var/run to NOT be a
      # tmpfs, we need to manually clean it -- esp. the ifstate file that
      # tells falsely tells ifupdown "lo is up".
      #
      # To debug, add -printf "Deleting stale file %p\n" before -delete.
      find /var/run/ -xdev -not -path /var/run/ -delete
      initctl emit -n stopped JOB=udevtrigger
      initctl emit -n started JOB=udev
      # This one is needed for broken ifupdown NMU 0.6.8ubuntu29.1
      initctl emit -n net-device-up IFACE=lo LOGICAL=lo ADDRFAM=inet 
METHOD=loopback
     end script
После перезагрузки проблем у меня больше не возникало =)

aXe1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.