<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>40524</bug_id>
          
          <creation_ts>2021-07-17 18:57:52 +0300</creation_ts>
          <short_desc>lxc 4.0.9 fails to configure network inside containers</short_desc>
          <delta_ts>2021-08-07 11:58:54 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>lxc</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolay A. Fetisov">naf</reporter>
          <assigned_to name="Alexey Shabalin">shaba</assigned_to>
          <cc>dans</cc>
    
    <cc>glebfm</cc>
    
    <cc>obirvalger</cc>
    
    <cc>shaba</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>200638</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-07-17 18:57:52 +0300</bug_when>
    <thetext>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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN&gt; 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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN&gt; 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,
при перезапуске контейнера оставляет контейнер с ненастроенным сетевым интерфесом.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200837</commentid>
    <comment_count>1</comment_count>
    <who name="Vladimir D. Seleznev">vseleznv</who>
    <bug_when>2021-07-22 18:27:38 +0300</bug_when>
    <thetext>Вы пытаетесь физический интерфейс настроить в контейнере? Контейнер привилегированный? Сложно отлаживать. Можете проверить, не исправляется ли проблема с lxc, собранным в задании 279963?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200839</commentid>
    <comment_count>2</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-07-22 21:10:48 +0300</bug_when>
    <thetext>(Ответ для Vladimir D. Seleznev на комментарий #1)
&gt; Вы пытаетесь физический интерфейс настроить в контейнере?

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


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

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

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

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

Увы, нет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200855</commentid>
    <comment_count>3</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-07-23 15:14:43 +0300</bug_when>
    <thetext>Итого, есть тестовый пример.


Чистая система, установлен 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 &apos;^ *(#|$)&apos; 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: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; 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 &apos;^ *(#|$)&apos; 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: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; 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 &apos;^ *(#|$)&apos; 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: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; 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 сам.
И на порядок этих отдельных кусков повлиять, насколько я понимаю, нельзя.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201003</commentid>
    <comment_count>4</comment_count>
    <who name="Vladimir D. Seleznev">vseleznv</who>
    <bug_when>2021-07-29 06:10:08 +0300</bug_when>
    <thetext>Это регрессия. Можете завеси issue в https://github.com/lxc/lxc/issues, и поместить там ссылку на этот багрепорт?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201217</commentid>
    <comment_count>5</comment_count>
    <who name="Vladimir D. Seleznev">vseleznv</who>
    <bug_when>2021-08-04 15:30:32 +0300</bug_when>
    <thetext>glebfm@ и ovirvalger@ независимо наткнулись на такую же ошибку, и провели своё расследование. В итоге выяснилось, что виноват этот коммит [1], и судя по нему это не бага, а фича, и что в обновлении LXD это учтено.

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

[1] https://github.com/lxc/lxc/commit/942b2d318642cc6b596b8d9778daa506a5578a56</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201275</commentid>
    <comment_count>6</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-08-06 11:10:07 +0300</bug_when>
    <thetext>То, что для LXC это не регрессия, а фича - по-видимому, да. И оно уже отражено
там в документации, lxc.container.conf(5),
&quot; lxc.net.[i].type
  ....
  Must be specified before any other option(s) on the net device.&quot;,
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.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201295</commentid>
    <comment_count>7</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-08-06 16:47:23 +0300</bug_when>
    <thetext>На сегодняшнем LXD 4.17 то же самое.

Итого:
- Для LXC текущее поведение - это документированная особенность.
- Для LXD - это ошибка, т.к. согласно документации LXD, https://github.com/lxc/lxd/blob/master/doc/instances.md, ключ raw.lxc - &quot;Raw LXC configuration to be appended to the generated one&quot;. Сейчас она не _добавляется_ к сгенерированному файлу lxc.conf, а вставляется во-внутрь. До LXC 4.0.7 порядок записей был неважен, с 4.0.7 - увы, конфигурации сети через raw.lxc стала невозможна. Оформлено как LXD issue #9093 .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201324</commentid>
    <comment_count>8</comment_count>
    <who name="Nikolay A. Fetisov">naf</who>
    <bug_when>2021-08-07 11:58:54 +0300</bug_when>
    <thetext>В upstream LXD проблема с порядком записей закрыта, 
https://github.com/lxc/lxd/commit/61bb78a494ca675fe512847efcfd728a2db195a6

Для lxd в составе Sisyphus создана #40674 .</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>