[make-initrd] Добавить udev правило в initrd через initrd.mk
Антон Мидюков
antohami at basealt.ru
Wed Sep 29 07:18:15 MSK 2021
28.09.2021 01:54, Leonid Krivoshein пишет:
>
> 27.09.2021 18:59, Alexey Gladkov пишет:
>> On Mon, Sep 27, 2021 at 10:38:40PM +0700, Антон Мидюков wrote:
>>> 23.09.2021 21:36, Alexey Gladkov пишет:
>>>> On Thu, Sep 23, 2021 at 09:20:44PM +0700, Антон Мидюков wrote:
>>>>>>> Обнаружил, что сетевой интерфейс включенный в initrd остаётся с именем eth0 при сетевой
>>>>>>> установке. Что приводит к тому, что в инсталяторе настраиваем eth0, а в установленной системе
>>>>>>> имеем его с именем enp0s8 подобным без конфигурации. Так что к установленной системе по сети после установки уже
>>>>>>> можно и не подключиться (сетевой интерфейс подключен один).
>>>>>> Переименовывает systemd или что-то около его. Насколько я помню на это
>>>>>> влияет присутствие dmidecode.
>>>>>>
>>>>>> Это не моё дело, но инсталлер неправ, когда использует имена без
>>>>>> последующей привязки имени к mac или businfo>> Соответственно, появилась мысль, что нужно отработать в initrd udev-правило переименования интерфейса.
>>>>>>
>>>>>> initrd как раз ничего не переименовывает. Имя eth* каноническое.
>>>>>>
>>>>> Это я знаю. Но проблема в том, что уже поднятый интерфейс не переименовывается в stage2.
>>>>> Отсюда мысль, что нужно переименовать его ещё в initrd до его поднятия.
>>>> Я предлагал наоборот в stage2 добавить аналог цикла:
>>>>
>>>> https://github.com/osboot/make-initrd/blob/master/features/network/data/lib/initrd/cmdline.d/network#L165-L175
>>>>
>>> Возможно, это хорошая идея.
>>> Но почему-то я не увидел /etc/udev/rules.d/60-persistent-net.rules в initrd.
>>> Загружался с ip=dhcp stop=bootchain
>>> Фича network уже должна была отработать. Сетевые интерфейсы настроены.
>> Правила /etc/udev/rules.d/60-persistent-net.rules создаются/дополняются
>> только в случае если пользователь указал ifname=.
>>
>> Я подумал, что ненужно лезть без спросу куда не просили. Но ничего не
>> мешает фиксировать интерфейсы в правилах всегда.
>>
>> Можно даже передавать эту информацию в том или ином виде через
>> /dev/initramfs/ следующему шагу.
>>
>>>> или в системе их кто-то всё равно пытается переименовать ?
>>>>
>>> Настроенные в initrd интерфейсы никто не переименовывает в stage2. Отсюда и проблема.
>>> Мне кажется, нужно передавать правило udev в stage2, чтобы при установке скопировать в устанавливаемую
>>> систему. Тогда проблема бы решилась.
>> Можно передавать правило. Можно передавать более общую информацию, на
>> основе которой можно сгенерировать не только правило. Например, если был
>> передан ip=dhcp то initrd может передать на каком интерфейсе отозвался
>> dhcpd и какой версии.
>
> Насколько я понял, проблема затрагивает только stage2 с универсальной загрузкой, даже точнее инсталлятор, который настраивает eth0, если мы грузимся изначально по сети, а в установленной системе после перезагрузки там оказывается какой-нибудь enp0s3 с настройкой etcnet для eth0.
>
> Тут вопрос в том, что конкретно в systemd/udevd отвечает за данное переименование, почему оно не срабатывает в том случае, если мы уже подняли сеть в stage1 и как сделать, чтобы если сеть поднималась в stage1, интерфейсу давалось аналогичное имя? Или наоборот: чтобы если мы его уже настроили как eth0, то чтобы оно не переименовывалось? Кстати, ведь тут можно генерировать тот же 60-persistent-net.rule для целевой системы.
>
Наконец-то разобрался. Нужно в /etc/initrd.mk дописать:
PUT_UDEV_RULES += *-net-setup-link.rules *-net-description.rules
PUT_FILES += /lib/systemd/network/99-default.link
Только нужен исправленный make-initrd-2.24.0-alt2.
На этом варианте и остановлюсь.
--
С уважением, Антон Мидюков <antohami at basealt.ru>
More information about the Make-initrd
mailing list