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

Leonid Krivoshein klark.devel at gmail.com
Wed Sep 22 15:06:37 MSK 2021


22.09.2021 14:41, Alexey Gladkov пишет:
> On Wed, Sep 22, 2021 at 01:56:11PM +0300, Leonid Krivoshein wrote:
>> 22.09.2021 13:09, Alexey Gladkov пишет:
>>> On Mon, Sep 20, 2021 at 12:50:33AM +0300, Leonid Krivoshein wrote:
>>>> Вопрос в том, как заставить
>>>> снова запуститься network-up и как отлаживать это хозяйство в rdshell,
>>>> учитывая, что с ним сеть не конфигурируется.
>>> Зачем его перезапускать ?
>>>
>>> network-up в цикле проверяет все ли /sys/class/net/*, которые имеют
>>> конфигурацию, перешли в состояние online.
>>>
>>> Если в процессе ожидания появится новая конфигурация, то она также
>>> подхватится.
>> Тогда как сделать так, чтобы появилась новая конфигурация?
>>
>> Вот ничего из 4х переменных пользователь не передал через /proc/cmdline.
>> Допустим, я сделал диалог, в котором он настраивает сеть руками. Как новые
>> настройки должны попасть в фичу network, чтобы она их применила?
> Без параметра в /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

         ( # 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 &
fi

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


-- 
Best regards,
Leonid Krivoshein.



More information about the Make-initrd mailing list