[make-initrd] udhcpc script в фиче network
Alexey Gladkov
gladkov.alexey at gmail.com
Wed Sep 22 16:08:39 MSK 2021
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.
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 &
А вот тут почему-то всё сделано в обратном порядке. Ты сначала триггеришь
эвент по интерфейсу, а потом генерируешь конфигурацию для интерфейса. Да
ещё и фоне это происходит.
/lib/initrd/cmdline.d/network должен выполняться лишь один раз до всего
это этого subshell. Он генерирует конфигурацию для всех интерфейсов.
Перед этим стоит остановить udev поскольку cmdline.d/network дописывает
/etc/udev/rules.d/60-persistent-net.rules и я вообще сомневаюсь, что там
всё правильно. Скорее всего нужно переделывать работу с
60-persistent-net.rules, чтобы можно было запускать cmdline.d/network
несколько раз.
Также перед запуском cmdline.d/network нужно удалить старую конфигурацию!
После его выполнения можно выполнить /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, я это
> воспроизводил многократно. Т.е. мой код, хоть и работает, не совсем
> правильно, ошибка точно связана с этим фрагментом.
--
Rgrds, legion
More information about the Make-initrd
mailing list