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

Leonid Krivoshein klark.devel at gmail.com
Wed Sep 22 19:12:06 MSK 2021


22.09.2021 17:46, Alexey Gladkov пишет:
> On Wed, Sep 22, 2021 at 04:50:57PM +0300, Leonid Krivoshein wrote:
>> 22.09.2021 16:08, Alexey Gladkov пишет:
>>> [...]
>>> Это довольно смелое предположение что когда тебя не просят конфигурировать
>>> сеть, то на самом деле пользователь хотел dhcp ... да ещё и ipv4.
>> [...] Главная подоплёка в том,
>> что если сетевых настроек нет, хорошо бы их спрашивать. Ну, потому что без
>> сети с выбранным методом иначе не загрузиться. Сейчас код более простой.
>> Возможно, тут стоит выводить диалоги. Но вопрос в последующем применении
>> новых настроек.
> Весь вот этот автоугадав и домысливание должно происходить после сервиса
> cmdline. Или же даже проще - до сервиса udev. В этом случае вся
> конфигурация будет готова и не будет никаких гонок.
>
> Вообще почти все диалоги с уточнением конфигурации должны быть тут т.е. до
> udevd и pipelined.

Сначала ужаснулся от мысли о необходимости разделения bootchain на две 
части -- диалоговую для выяснения конфигурации и ту, что работает сейчас 
после udev. Конечно, нет ничего невозможного, так работают многие 
инсталляторы, сначала задавая вопросы, а потом выполняют действия по уже 
подготовленным ответам. Но... не получится! Так как есть диалоги, 
которые предлагают выбор определённого оборудования, а для его 
определения нужен udev. И ещё мы можем всегда вернутся в самое начало. 
Плюс те диалоги, когда в процессе выполнения что-то пошло не так, тут 
тоже могут быть варианты. Немыслимо организовать связку между этими 
двумя частями, когда посредине будет запуск udev. Поэтому я бы предпочёл 
не менять нынешнюю конструкцию, конфигурировать в диалогах после запуска 
udev то, что не было сконфигурировано в командой строке, на худой конец, 
прибегать к технике повторного сканирования, реализованной в 
пропагаторе. И пусть параллельно с этим отрабатывают эвенты udev.


>> Для altboot пока что не имеет значения, что make-initrd умеет работать с
>> IPv6. В нём просто нет пока его поддержки, как и в пропагаторе. Если
>> указывать ip=dhcp, сеть поднимается дольше. Поддержку IPv6 можно будет
>> добавить позже...
> Я считаю, что в 2021 уже не нужно говорить о поддержке IPv6 в новом коде.
> Нужно просто считать, что он есть.
>
> Для того чтобы в пустую не ждать есть функции ipv4_enabled/ipv6_enabled.
> Кстати, IPv4 в современном мире может быть выключен и это стоит учитывать.

Это очень правильное замечание, я даже и не сомневался, что это так. 
Мало того, я уверен, что добавить поддержку IPv6 в altboot до безобразия 
просто. Но лично я мало что понимаю в IPv6, так что если кто-то поможет 
заменить вызовы resolve на resolve6 и ss в паре мест, буду признателен. 
Так, конечно, основная поддержка сети IPv6 уже есть в самом make-initrd 
и грех её не использовать. И основное тут даже не код, а тестирование -- 
я это не смогу проверить как следует.


> [...]
>>> /lib/initrd/cmdline.d/network должен выполняться лишь один раз до всего
>>> это этого subshell. Он генерирует конфигурацию для всех интерфейсов.
>> Но он уже один раз выполнился до входа в bootchain-waitnet, при этом был
>> сконфигурирован только "lo".
> lo всегда есть. Он даже не конфигурируется:
>
> features/network/data/etc/network/ifaces/lo/ipv4address
>
> Зоркий глаз может заметить, что формат конфигов очень похож на etcnet ;)

Да, я заметил, как и разницу. Мне показалось странным, зачем при 
авто-конфигурировании сохранять не полученные значения, а некие строки 
типа "nameserver <value1> <value2>" или "defult via <value>", ведь их же 
потом неудобно будет парсить. Но видимо так задумано, чтобы читать потом 
всю конфигурацию в едином формате.

Если сравнивать фичу network с etcnet из stage2, то у меня возникает два 
недоумения... ))

1. Зачем такой навороченный network в stage1? Ведь для сетевой загрузки 
нужен только один интерфейс.
2. С другой стороны, etcnet умеет vlan'ы, bond'ы и много чего, а network 
сейчас непригоден для загрузки через такое, а значит придётся менять 
конфигурацию на свичах или использовать отдельную сеть только для 
сетевой загрузки.


>>> Перед этим стоит остановить udev

А как это правильнее сделать? И не лучше ли тогда, не останавливая udev, 
заставить его перечитать правила?


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

Насчёт этого я думаю, что можно вообще не беспокоиться, т.к. если IFNAME 
был синтаксически правильно определён в /proc/cmdline и udev-правило уже 
отработало один раз, то интерфейс с нужным именем уже появился и 
повторная обработка IFNAME не требуется, диалогов для этого не 
предполагается.


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

...а значит и удаление всей конфигурации не должно отрицательно 
сказаться на повторном конфигурировании, которое не предусматривает 
диалогового аналога IFNAME=..., либо я чего-то не учитываю?


>>> Также перед запуском cmdline.d/network нужно удалить старую конфигурацию!
>> А как это правильно сделать? rm -rf -- "$net_autoconfdir" "$net_statedir" ?
> cmdline.d/network кладёт всё сюда:
>
> "$net_confdir/ifaces/$interface"
> "$net_confdir/default"
>
> net_autoconfdir -- это место, куда кладут конфигурацию dhcp. Они отделены
> от системной конфигурации, чтобы они не смешивались. В некоторых случаях
> это нужно.
>
> Для каждого интерфейса параметры могут приехать из:
>
> net_autoconfdir/ifaces/$NET_IF/*
> net_confdir/ifaces/$NET_IF/*
> net_confdir/default/*
>
> net_statedir -- это результат объединения всех. Это стейт.
>
> Наверно, стоит написать отдельную функцию, чтобы "забыть" конфигурацию
> интерфейса.

Тогда уж лучше научить cmdline.d/network повторно конфигурировать все 
интерфейсы, чтобы он сам удалял то, что было раньше. :-)


> [...]
>> но я не рискнул писать развесистую логику, а решил использовать
>> готовую фичу. При этом возникает риск гонок: самое начало загрузки, модуль
>> сетевой карты мог ещё не подгрузиться, сеть заранее никто не
>> сконфигурировал, а тут я пытаюсь что-то перезапускать...
> Гонки с загрузкой модулей неприятные, да. Тут может быть такая эвристика:
> мы догадались, что нужна сеть, ни одного интерфейса нет (кроме lo)? значит
> ждём появления сетевого интерфейса.
>
> Будет другая проблема если интерфейсы будут появляться сильно не сразу, но
> это уже следующая проблема.

Потому я и пытаюсь пристроиться к имеющейся фиче network очень 
аккуратно. Следом за приведённым фрагментом идёт код, который просто 
ждёт появления хоть какого-то реального интерфейса.

В финальном же варианте идеал мне видится таким: конфигурирование сети 
через диалоги, если определённая конфигурация не даёт полного 
представления о единственном сетевом интерфейсе. В ранних исталляторах 
(не альтовых) я видел, что до диалогов настройки сети предпринимаются 
попытки сконфигурировать сеть по DHCP. Не уверен, что это плохая идея, 
потому что лишние диалоги на этапе загрузки -- зло, а когда ещё не 
работает мышь/клавиатура -- даже вредительство. :-)


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

Нет, наоборот, диалоги же как раз по моей части:
https://lists.altlinux.org/pipermail/devel/2018-April/204192.html :-)


-- 
Best regards,
Leonid Krivoshein.



More information about the Make-initrd mailing list