[make-initrd] udhcpc script в фиче network

Leonid Krivoshein klark.devel at gmail.com
Wed Sep 22 16:50:57 MSK 2021


22.09.2021 16:08, Alexey Gladkov пишет:
> On Wed, Sep 22, 2021 at 03:06:37PM +0300, Leonid Krivoshein wrote:
>>> Без параметра в /proc/cmdline мне кажется всё-таки не обойтись до тех пор
>>> пока не открыли телепатию.
>>>
>>> Можно добавить параметр network=ask и при его присутствии можно спрашивать
>>> о конфигурации у пользователя.
>>>
>>> Код для конфигурации интерфейса есть тут:
>>>
>>> features/network/data/lib/initrd/cmdline.d/network
>> У меня вчера всё же получилось добиться желаемого, вот фрагмент:
> Этот код вызывает у меня массу вопросов ))
>
>> # No network settings
>> if [ "${IP:-0}" = 0 ] &&
>>          [ "${ROUTE:-0}" = 0 ] &&
>>          [ "${IFNAME:-0}" = 0 ] &&
>>          [ "${NAMESERVER:-0}" = 0 ]
>> then
>>          msg="network settings not defined in /proc/cmdline"
>>
>>          if [ -n "${RDSHELL-}" ]; then
>>                  [ -z "$NOASKUSER" ] ||
>>                          fatal "$msg, dialogs are disabled"
>>                  message "$msg"
>>                  msg="N${msg:1}. Try with the option 'ip=dhcp4' after
>> reboot."
>>                  IM_errmsg "$msg $BC_RBMSG"
>>                  bc_reboot
>>          fi
>>
>>          message "$msg"
>>
>>          ( echo 'export IP="1"'
>>            echo 'export ROUTE="0"'
>>            echo 'export IFNAME="0"'
>>            echo 'export NAMESERVER="0"'
>>            echo 'export IP0="dhcp4"'
>>          ) >> /.initrd/initenv
> Это довольно смелое предположение что когда тебя не просят конфигурировать
> сеть, то на самом деле пользователь хотел dhcp ... да ещё и ipv4.

Прилагаю скриншот, по которому станет понятно происходящее. Тут 
пользователь явно намерен загрузить конкретный образ по FTP и указывает 
ip=dhcp4 в /proc/cmdline. Но он мог забыть указать ip=..., а мог вообще 
не лезть в /proc/cmdline или выбрать метод в меню "на лету". Главная 
подоплёка в том, что если сетевых настроек нет, хорошо бы их спрашивать. 
Ну, потому что без сети с выбранным методом иначе не загрузиться. Сейчас 
код более простой. Возможно, тут стоит выводить диалоги. Но вопрос в 
последующем применении новых настроек.

Для altboot пока что не имеет значения, что make-initrd умеет работать с 
IPv6. В нём просто нет пока его поддержки, как и в пропагаторе. Если 
указывать ip=dhcp, сеть поднимается дольше. Поддержку IPv6 можно будет 
добавить позже...


> subshell тут совершенно не нужен. Он только замедляет код.

Просто хотелось бы перенаправлять вывод в этом месте.


>>          ( # shellcheck disable=SC2012
>>            for netdev in $(ls /sys/class/net/) lo; do
>>                  [ "$netdev" != lo ] ||
>>                          continue
>>                  [ -r "/sys/class/net/$netdev/flags" ] ||
>>                          continue
>>                  ACTION="add" INTERFACE="$netdev" /lib/uevent/filters/network
>>            done
>>
>>            /lib/initrd/cmdline.d/network
>>          ) >/dev/null 2>&1 &
> А вот тут почему-то всё сделано в обратном порядке. Ты сначала триггеришь
> эвент по интерфейсу, а потом генерируешь конфигурацию для интерфейса. Да
> ещё и фоне это происходит.

Понятно. Уберу subshell, поменяю порядок, не буду запускать в фоне.


> /lib/initrd/cmdline.d/network должен выполняться лишь один раз до всего
> это этого subshell. Он генерирует конфигурацию для всех интерфейсов.

Но он уже один раз выполнился до входа в bootchain-waitnet, при этом был 
сконфигурирован только "lo".


> Перед этим стоит остановить udev поскольку cmdline.d/network дописывает
> /etc/udev/rules.d/60-persistent-net.rules и я вообще сомневаюсь, что там
> всё правильно. Скорее всего нужно переделывать работу с
> 60-persistent-net.rules, чтобы можно было запускать cmdline.d/network
> несколько раз.

Про это и близкое по теме, надеюсь, Антон скоро ещё напишет. Со своей 
стороны добавлю, что:

1) IFNAME -- ужасно полезная фича, особенно для сетевых стендов с iPXE, 
т.к. при зоопарке интерфейсов позволяет средствами самого загрузчика 
указать, с какого интерфейса мы загрузились.
2) IFNAME -- должен отрабатывать один раз, конечно, поэтому мне жалко 
удалять всю конфигурацию. :-)


> Также перед запуском cmdline.d/network нужно удалить старую конфигурацию!

А как это правильно сделать? rm -rf -- "$net_autoconfdir" "$net_statedir" ?


> После его выполнения можно выполнить /lib/uevent/filters/network, но не
> таким образом как сделано тут.
>
> echo add > /sys/class/net/$netdev/uevent

Ага, понятно.


>> fi
>>
>> Это упрощённый вариант без диалогов. Если не указать ничего в /proc/cmdline,
>> пытаемся найти интерфейсы и сконфигурировать их по DHCPv4. Код работает
>> нормально, но есть один сторонний эффект. Не могу объяснить причину. При
>> загрузке больших ISO-шников с mirror.yandex.ru по http всё ОК. При загрузке
>> их же по ftp, первое обращение с получением размера файла проходит успешно,
>> а на втором обращении (непосредственно скачивание образа) curl возвращает 7.
>> Если тут же запустить скачивание повторно (нажать в форме ENTER, не меняя
>> адресов), скачивание со второй попытки проходит успешно. Этого стороннего
>> эффекта не возникает, если в /proc/cmdline добавить ip=dhcp4, я это
>> воспроизводил многократно. Т.е. мой код, хоть и работает, не совсем
>> правильно, ошибка точно связана с этим фрагментом.

Есть и другой вопрос и даже аналогия. При создании форка 
pipeline/waitdev было понятно, что альтернативой ожидания устройств по 
uevent при ручном выборе с диалогами может быть только методика 
сканирования уже найденных устройств. Шаг localdev может схватить то, 
что ранее было найдено шагом слева waitdev. Но если там нет устройства, 
он выполняет сканирование, он использует таймауты, итд. С сетью в этом 
месте, мне кажется, всё должно быть так же, но я не рискнул писать 
развесистую логику, а решил использовать готовую фичу. При этом 
возникает риск гонок: самое начало загрузки, модуль сетевой карты мог 
ещё не подгрузиться, сеть заранее никто не сконфигурировал, а тут я 
пытаюсь что-то перезапускать...

Если удастся найти рабочий вариант с диалогами настройки сети 
"вдогонку", у нас снимется много вопросов о том, как интегрировать 
bootchain/interactive с уже имеющимися фичами make-initrd. Будет хороший 
пример, как это можно сделать.


-- 
Best regards,
Leonid Krivoshein.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 2021-09-20_23-18-35.jpg
Type: image/jpeg
Size: 31563 bytes
Desc: not available
URL: <http://lists.altlinux.org/pipermail/make-initrd/attachments/20210922/6183c2d2/attachment-0001.jpg>


More information about the Make-initrd mailing list