Bug 40524 - lxc 4.0.9 fails to configure network inside containers
Summary: lxc 4.0.9 fails to configure network inside containers
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: lxc (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 major
Assignee: Alexey Shabalin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-07-17 18:57 MSK by Nikolay A. Fetisov
Modified: 2021-08-07 11:58 MSK (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Nikolay A. Fetisov 2021-07-17 18:57:52 MSK
lxc-4.0.9 (lxc, lxc-core, lxc-net, lxc-runtime, lxc-templates, liblxc1) игнорирует/не может применить параметры конфигурации сети lxc.net.N.* при
запуске контейнера.

Контейнер lxd/lxc, без настроек сети внутри контейнера, конфигурации сетевого интерфейса средствами
LXD/LXC - задание статического адреса при запуске контейнера:
# grep lxc.net /var/log/lxd/ve-000253/lxc.conf
lxc.net.0.ipv4.address = 192.168.0.253/24
lxc.net.0.ipv4.gateway = 192.168.0.254
lxc.net.0.name = eth0
lxc.net.0.type = phys
lxc.net.0.flags = up
lxc.net.0.link = mace3df4ca2

Для lxc 4.0.6, после запуска контейнера, ip addr show:
32: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP qlen 10000
    link/ether 00:16:3e:ff:d0:68 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.253/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:feff:d068/64 scope link 
       valid_lft forever preferred_lft forever

Для lcx 4.0.9, после запуска контейнера, ip addr show:
33: mac3c95ac39@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:16:3e:ff:d0:68 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::216:3eff:feff:d068/64 scope link 
       valid_lft forever preferred_lft forever

Заданные в конфигурации LXC/LXD IP и шлюз по-умолчанию не применились, имя сетевого интерфейса на 
eth0 не изменилось. Как итог, сети в контейнере нет.

Настройки контейнера между запусками не менялись. Параметры lxc в выводе 
lxc --debug=true start ve-000253
идентичные. Для других контейнеров ситуация аналогичная.


Откат до lxc 4.0.6, без перезапуска системы или сервиса lxd, с перезапуском контейнера,
проблему решает. Установка (обновление) lxc до 4.0.9, без перезапуска системы или сервиса lxd,
при перезапуске контейнера оставляет контейнер с ненастроенным сетевым интерфесом.
Comment 1 Vladimir D. Seleznev 2021-07-22 18:27:38 MSK
Вы пытаетесь физический интерфейс настроить в контейнере? Контейнер привилегированный? Сложно отлаживать. Можете проверить, не исправляется ли проблема с lxc, собранным в задании 279963?
Comment 2 Nikolay A. Fetisov 2021-07-22 21:10:48 MSK
(Ответ для Vladimir D. Seleznev на комментарий #1)
> Вы пытаетесь физический интерфейс настроить в контейнере?

Нет, речь идёт о настройке сети контейнера самим LXC, 
через параметры контейнера lxc.net.[i].*,  lxc.container.conf(5) .


После запуска контейнера из самого него, через ip, всё настраивается
нормально - речь идёт о внешней конфигурации сетевого интерфейса
контейнера, средствами самого lxc.

> Контейнер привилегированный? Сложно отлаживать. 

В терминологии LXD - непривилегированный. 
Попробую получить сейчас на контейнере именно прсто LXC, и на чистой системе.

> Можете проверить, не исправляется ли
> проблема с lxc, собранным в задании 279963?

Увы, нет.
Comment 3 Nikolay A. Fetisov 2021-07-23 15:14:43 MSK
Итого, есть тестовый пример.


Чистая система, установлен lxc. Настройки - из коробки.

Создаём минимальный контейнер:

# DOWNLOAD_KEYSERVER=keyserver.ubuntu.com \
   lxc-create --template=download --name=test -- --dist alt --release Sisyphus --arch amd64

(Для 4.0.10 можно без задания DOWNLOAD_KEYSERVER, там умерший sks-keyservers.net уже заменён.)

Создаём пару виртуальных интерфейсов:

# ip link add veth00 type veth peer name veth01

Конфигурация контейнера, за вычетом комментариев:

# egrep -v '^ *(#|$)' config 
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
lxc.rootfs.path = dir:/var/lib/lxc/test/rootfs
lxc.uts.name = test
lxc.net.0.type = phys
lxc.net.0.link = veth00
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 172.16.0.1/24
lxc.net.0.ipv4.gateway = 172.16.0.254
lxc.net.0.flags = up

Т.е., передать в контейнер интерфейс veth00, переименовать его в eth0, задать IP и шлюз по-умолчанию.

Запускаем контейнер, смотрим результат (опуская часть для lo), останавливаем контейнер:


# lxc-start test;  lxc-attach test -- ip addr show;  lxc-stop test 
...
13: eth0@if12: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 3a:95:af:98:b7:b2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.1/24 brd 172.16.0.255 scope global eth0
       valid_lft forever preferred_lft forever

Всё в полном порядке - интерфейс переименован, сеть настроена (NO-CARRIER - т.к. veth01 висит в воздухе).


Меняем конфигурацию контейнера. Теперь пусть будет

# egrep -v '^ *(#|$)' config 
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
lxc.rootfs.path = dir:/var/lib/lxc/test/rootfs
lxc.uts.name = test
lxc.net.0.name = eth0
lxc.net.0.type = phys
lxc.net.0.link = veth00
lxc.net.0.ipv4.address = 172.16.0.1/24
lxc.net.0.ipv4.gateway = 172.16.0.254
lxc.net.0.flags = up


Запускаем контейнер, смотрим результат (опуская часть для lo), останавливаем контейнер:

# lxc-start test;  lxc-attach test -- ip addr show;  lxc-stop test 
....
13: veth00@if12: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 3a:95:af:98:b7:b2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.1/24 brd 172.16.0.255 scope global veth00
       valid_lft forever preferred_lft forever


Интерфейс не переименован, но сеть настроена. Различие конфигурации - в порядке строк lxc.net.0.type и lxc.net.0.name.


Ещё изменение:

# egrep -v '^ *(#|$)' config 
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
lxc.rootfs.path = dir:/var/lib/lxc/test/rootfs
lxc.uts.name = test
lxc.net.0.ipv4.address = 172.16.0.1/24
lxc.net.0.ipv4.gateway = 172.16.0.254
lxc.net.0.name = eth0
lxc.net.0.type = phys
lxc.net.0.link = veth00


Запускаем контейнер, смотрим результат (опуская часть для lo), останавливаем контейнер:

# lxc-start test;  lxc-attach test -- ip addr show;  lxc-stop test 
....
13: veth00@if12: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 3a:95:af:98:b7:b2 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Теперь интерфейс и не переименован, и не настроен.


Итого: для 4.0.6 порядок строк в конфигурации был не важен. Для 4.0.9 / 4.0.10 всё, размещённое до
lxc.net.0.type , игнорируется.



Проблема в том, что есть LXD. И LXD запускает контейнеры средствами LXC, и конфигурацию контейнера LXC
он генерирует сам при запуске контейнера. И эта конфигурацию собирается из разных кусков - у меня, как минимум,
сетевые настройки (lxc.net.N.ipv[46].*) задаются в конфигурации контейнера, имена интерфейсов - в профилях
контейнеров, а собственно интерфейсы создаются самим LXD и их имена он пишет в конфигурацию контейнера LXC сам.
И на порядок этих отдельных кусков повлиять, насколько я понимаю, нельзя.
Comment 4 Vladimir D. Seleznev 2021-07-29 06:10:08 MSK
Это регрессия. Можете завеси issue в https://github.com/lxc/lxc/issues, и поместить там ссылку на этот багрепорт?
Comment 5 Vladimir D. Seleznev 2021-08-04 15:30:32 MSK
glebfm@ и ovirvalger@ независимо наткнулись на такую же ошибку, и провели своё расследование. В итоге выяснилось, что виноват этот коммит [1], и судя по нему это не бага, а фича, и что в обновлении LXD это учтено.

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

[1] https://github.com/lxc/lxc/commit/942b2d318642cc6b596b8d9778daa506a5578a56
Comment 6 Nikolay A. Fetisov 2021-08-06 11:10:07 MSK
То, что для LXC это не регрессия, а фича - по-видимому, да. И оно уже отражено
там в документации, lxc.container.conf(5),
" lxc.net.[i].type
  ....
  Must be specified before any other option(s) on the net device.",
https://github.com/lxc/lxc/commit/320061b34fea7d7f280b0a421dddeac7dac7f1bf


По остальному - к сожалению, нет. На lxd-4.16 (и lxc-4.0.10) те же проблемы.

Т.е., внутри LXD порядок генерящихся записей lxc.net.[N].{type,name} исправили -
имя интерфейс теперь получает. Но строки из ключа raw.lxc вставляются
в lxc.conf до конфигурации устройст - и всё, что там есть из lxc.net.[N].*
далее убирается при появлении lxc.net.0.type из конфигурации устройства.
Впрочем, это уже относится к LXD - не к LXC.
Comment 7 Nikolay A. Fetisov 2021-08-06 16:47:23 MSK
На сегодняшнем LXD 4.17 то же самое.

Итого:
- Для LXC текущее поведение - это документированная особенность.
- Для LXD - это ошибка, т.к. согласно документации LXD, https://github.com/lxc/lxd/blob/master/doc/instances.md, ключ raw.lxc - "Raw LXC configuration to be appended to the generated one". Сейчас она не _добавляется_ к сгенерированному файлу lxc.conf, а вставляется во-внутрь. До LXC 4.0.7 порядок записей был неважен, с 4.0.7 - увы, конфигурации сети через raw.lxc стала невозможна. Оформлено как LXD issue #9093 .
Comment 8 Nikolay A. Fetisov 2021-08-07 11:58:54 MSK
В upstream LXD проблема с порядком записей закрыта, 
https://github.com/lxc/lxd/commit/61bb78a494ca675fe512847efcfd728a2db195a6

Для lxd в составе Sisyphus создана #40674 .