Назад | Перейти на главную страницу

В CentOS 6 и LXC «ifconfig» не может видеть сетевой интерфейс (но busybox «ifconfig» работает нормально)

Я только начал работать с LXC под CentOS 6 (через адаптер libvirt). Если я создаю контейнер LXC, я не могу видеть какие-либо сетевые интерфейсы при использовании собственных системных инструментов:

# ifconfig -a
#

Очень странное поведение; указание интерфейса по именам не приводит ни к ожидаемому результату, ни к сообщению об ошибке. Это верно даже для явно недействительных имен интерфейсов, например:

# ifconfig foo
#

В ip команда демонстрирует такое же поведение.

С другой стороны, если я использую ifconfig, предоставленный Busybox, все работает как положено:

# busybox ifconfig -a

eth0      Link encap:Ethernet  HWaddr 52:54:00:E0:12:C8  
          inet6 addr: fe80::5054:ff:fee0:12c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:268 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17814 (17.3 KiB)  TX bytes:552 (552.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)

Итак ... что busybox знает, чего не знают собственные инструменты? Конфигурация libvirt для этой среды довольно стандартна; определение сети выглядит так:

<interface type='network'>
  <mac address='52:54:00:e0:12:c8'/>
  <source network='default'/>
  <target dev='veth0'/>
</interface>

Полная конфигурация Вот если вы думаете, что это может помочь.

Я бегу:

РЕДАКТИРОВАТЬ

Страннее и страннее ... это проблема дисплея, а не функциональности. Я вижу результат ifconfig если я вставлю его во что-нибудь, например:

# ifconfig eth0 | cat
eth0      Link encap:Ethernet  HWaddr 52:54:00:E0:12:C8  
          inet addr:192.168.10.10  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fee0:12c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:573 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:37914 (37.0 KiB)  TX bytes:552 (552.0 b)

И на самом деле, даже когда выход не подключен, strace показывает, что ifconfig фактически записывает вывод в файловый дескриптор 1 (также известный как stdout), поэтому непонятно, почему на самом деле нет вывода. Это может быть LXC или virsh вопрос, я думаю.

Обычно случаются такие вещи, которые явно неработающая программа пытается умнее, запрашивая у драйвера терминала его размер, когда он установлен неправильно или просто 0 (посмотрите на stty -a), или используя terminfo, но с неправильными переменными $ TERM или $ LC_ * (попробуйте запустить env), или в некоторых странных случаях, когда используется некоторый буфер, который поглощает данные, которые не заполняют буфер. Может быть интересно запустить strace в ifconfig по сравнению с версией busybox. Обычный ifconfig Linux действительно избавлен от подобных вещей - все, что он делает, - это доступ к информации о локали.