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 |
Description
Nikolay A. Fetisov
2021-07-17 18:57:52 MSK
Вы пытаетесь физический интерфейс настроить в контейнере? Контейнер привилегированный? Сложно отлаживать. Можете проверить, не исправляется ли проблема с 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 . |