Если вы используете gentoo и отслеживаете уведомления о грядущих изменениях, то еще в июле вы могли видеть, что с нового года gentoo перестает поддерживать eudev. Если вы попытаетесь обновить систему сейчас, вы увидите


!!! The following installed packages are masked:
- sys-fs/eudev-3.2.10-r1::gentoo (masked by: package.mask)
/var/db/repos/gentoo/profiles/package.mask:
# Mike Gilbert <floppym@gentoo.org> (2021-11-27)
# eudev will be removed on 2022-01-01.
# Please see the news item published on 2021-08-24 for more information.

К сожалению переезд с eudev на альтернативы имеет свои особенности, которые мне хочется осветить в этом посте пока память свежа. Мне давно было интересно попробовать mdev, так что новость о конце поддержки eudev я расценил как намек на то, что пора исполнять задуманное. Важное замечание: у меня gentoo работает на headless серверах. Если вам нужно обновить десктопную машину все может быть несколько сложнее, читайте документацию.


Первая проблема состояла в том, что система хотела поставить sys-fs/static-dev, но не могла этого сделать с вот такой ошибкой:


>>> Running pre-merge checks for sys-fs/static-dev-0.1-r2
 * We have detected that you currently use udev or devfs or devtmpfs
 * and this ebuild cannot install to the same mount-point.
 * ERROR: sys-fs/static-dev-0.1-r2::gentoo failed (pretend phase):
 *   Cannot install on udev/devfs tmpfs.

В https://bugs.gentoo.org/107875#c25 дается решение для выхода из этой ситуации:


$ sudo mkdir /tmp/newroot
$ sudo mount -o bind / /tmp/newroot
$ sudo ROOT=/tmp/newroot/ emerge -av sys-fs/static-dev
$ sudo umount /tmp/newroot/

Теперь пакет поставлен и можно заниматься переходом на mdev. Начнем с того, что убедимся, что у нас ничего не завязано на udev, в противном случае перейти на mdev не получится.


Проверим, что нет неожиданных зависимостей от udev. У меня это выглядело так:


$ equery d udev
 * These packages depend on udev:
sys-apps/hwids-20210613-r1 (virtual/udev)
sys-fs/udev-init-scripts-34 (>=virtual/udev-217)
virtual/dev-manager-0-r2 (virtual/udev)
virtual/libudev-232-r5 (!systemd ? >=sys-fs/udev-232:0/0[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?])
virtual/udev-217-r3 (>=sys-fs/udev-217)
$

Убираем udev из use:


$ sudo euse -D udev

При этом сохранится старая версия /etc/portage/make.conf, так что вы легко проверите, что изменение именно то, которое нужно, и при необходимости вернетесь на старый конфиг.


Теперь можно сделать холостой прогон пересборки мира:


$ sudo emerge -uDNvp @world

Если в выводе нет ошибок и неожиданных пакетов, то можно продолжать.


Для начала нам надо замаскировать sys-fs/udev


$ echo "sys-fs/udev"|sudo tee /etc/portage/package.mask/mdev

Теперь можно добавить поддержку static и mdev для построения busybox


$ echo "sys-apps/busybox static mdev"|sudo tee /etc/portage/package.use/mdev

Строим busybox


$ sudo emerge --ask --oneshot busybox

Видим:


The following USE changes are necessary to proceed:
 (see "package.use" in the portage(5) man page for more details)
# required by sys-apps/busybox-1.34.1::gentoo[static]
# required by @selected
# required by @world (argument)
>=virtual/libcrypt-2 static-libs
# required by virtual/libcrypt-2::gentoo
# required by sys-apps/busybox-1.34.1::gentoo[static]
# required by @selected
# required by @world (argument)
>=sys-libs/libxcrypt-4.4.25-r1 static-libs

Оказывается надо чуть обновить установки построения некоторых библиотек. Делаем это, запускаем emerge еще раз, в моем случае все собралось без проблем.


После этого надо добавить скрипт для монтирования devpts, которая не монтируется автоматически при загрузке или через mount -a. В этом же скрипте надо поправить права доступа к /dev/shm, так как по умолчанию доступ есть только у рута.


$ echo -e '#!/bin/bash\nmount devpts\nchmod 1777 /dev/shm'|sudo tee /etc/local.d/000.start
#!/bin/bash
mount devpts
chmod 1777 /dev/shm
$ sudo chmod +x /etc/local.d/000.start

Теперь можно включить запуск mdev при инициализации системы и выключить udev и udev-trigger (про последний официальная документация ничего не пишет).


$ sudo rc-update add mdev sysinit
 * service mdev added to runlevel sysinit
$ sudo rc-update del udev sysinit
 * service udev removed from runlevel sysinit
$ sudo rc-update del udev-trigger sysinit
 * service udev-trigger removed from runlevel sysinit
$

Важный момент: у меня на одной из машин использовались predictable interface names и интерфейс назывался enp1s0. После перехода на mdev этот интерфейс стал eth0. Я не переименовал файл в /etc/init.d и не поправил /etc/conf.d/net, так что после перезагрузки пришлось воспользоваться сериальной консолью для логина и исправления. Если у вас используются predictable interface names не повторите моей ошибки.


Теперь можно перезагрузиться.


sudo reboot

Если все прошло хорошо, то можно пересобрать систему


$ sudo emerge -uDNva @world

И убрать пакеты, которые больше не нужны.


$ sudo emerge --ask --depclean --verbose sys-fs/udev sys-fs/eudev

Комментарии (4)


  1. pollution
    03.12.2021 10:32
    +3

    Ого, вернули мой 2007.


  1. JuriM
    03.12.2021 11:30
    +1

    "Если все прошло хорошо, то можно пересобрать систему"

    на хеадлесс серверах самое увлекательное занятие :)


  1. polar_yogi
    03.12.2021 15:03

    А какой профиль стоит (eselect profile)? Про цель даже не пытаюсь спрашивать.


    1. kt97679 Автор
      03.12.2021 19:24

      в оракловом облаке использую default/linux/amd64/17.1/no-multilib, на nvidia tegra, что висит в кладовке — default/linux/arm/17.0/armv7a