| Summary: | lxc 4.0.9 fails to configure network inside containers | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Nikolay A. Fetisov <naf> |
| Component: | lxc | Assignee: | Alexey Shabalin <shaba> |
| Status: | CLOSED NOTABUG | QA Contact: | qa-sisyphus |
| Severity: | major | ||
| Priority: | P5 | CC: | dans, glebfm, obirvalger, shaba |
| Version: | unstable | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
Вы пытаетесь физический интерфейс настроить в контейнере? Контейнер привилегированный? Сложно отлаживать. Можете проверить, не исправляется ли проблема с lxc, собранным в задании 279963? (Ответ для Vladimir D. Seleznev на комментарий #1) > Вы пытаетесь физический интерфейс настроить в контейнере? Нет, речь идёт о настройке сети контейнера самим LXC, через параметры контейнера lxc.net.[i].*, lxc.container.conf(5) . После запуска контейнера из самого него, через ip, всё настраивается нормально - речь идёт о внешней конфигурации сетевого интерфейса контейнера, средствами самого lxc. > Контейнер привилегированный? Сложно отлаживать. В терминологии LXD - непривилегированный. Попробую получить сейчас на контейнере именно прсто LXC, и на чистой системе. > Можете проверить, не исправляется ли > проблема с lxc, собранным в задании 279963? Увы, нет. Итого, есть тестовый пример.
Чистая система, установлен 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 сам.
И на порядок этих отдельных кусков повлиять, насколько я понимаю, нельзя.
Это регрессия. Можете завеси issue в https://github.com/lxc/lxc/issues, и поместить там ссылку на этот багрепорт? glebfm@ и ovirvalger@ независимо наткнулись на такую же ошибку, и провели своё расследование. В итоге выяснилось, что виноват этот коммит [1], и судя по нему это не бага, а фича, и что в обновлении LXD это учтено. Проверьте, что ваша проблема исправляется с обновлением LXD. [1] https://github.com/lxc/lxc/commit/942b2d318642cc6b596b8d9778daa506a5578a56 То, что для 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. На сегодняшнем 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 . В upstream LXD проблема с порядком записей закрыта, https://github.com/lxc/lxd/commit/61bb78a494ca675fe512847efcfd728a2db195a6 Для lxd в составе Sisyphus создана #40674 . |
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, при перезапуске контейнера оставляет контейнер с ненастроенным сетевым интерфесом.