From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Wed, 22 Sep 2021 15:08:39 +0200 From: Alexey Gladkov To: make-initrd@lists.altlinux.org Message-ID: <20210922130839.b4iwv2arqyggczb3@example.org> References: <20210917220845.s4dgl2hqla7yt4pe@example.org> <5815442b-e5a1-7469-b705-24090749e245@gmail.com> <20210922100901.e5dsw554g6elb3lx@example.org> <52f4526d-7fa7-e0ed-6d2d-12e06f20408c@gmail.com> <20210922114132.yaobsgcz7vrkjgbq@example.org> <8d262440-d8fc-c174-3293-1964e3440617@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <8d262440-d8fc-c174-3293-1964e3440617@gmail.com> Subject: Re: [make-initrd] =?utf-8?b?dWRoY3BjIHNjcmlwdCDQsiDRhNC40YfQtSBuZXR3?= =?utf-8?q?ork?= X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Sep 2021 13:08:42 -0000 Archived-At: List-Archive: 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