Если вы используете 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