8.76. Udev из Systemd-255

Пакет Udev содержит программы для динамического создания узлов устройств.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 144 MB

8.76.1. Установка пакета Udev

Udev является частью пакета systemd-255. Используйте файл systemd-255.tar.xz в качестве исходного архива.

Удалите две ненужные группы render и sgx, из правил udev по умолчанию:

sed -i -e 's/GROUP="render"/GROUP="video"/' \
       -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in

Удалите одно правило udev, требующее полной установки Systemd:

sed '/systemd-sysctl/s/^/#/' -i rules.d/99-systemd.rules.in

Измените жестко заданные пути к файлам конфигурации сети для автономной установки udev:

sed '/NETWORK_DIRS/s/systemd/udev/' -i src/basic/path-lookup.h

Подготовьте Udev к компиляции:

mkdir -p build
cd       build

meson setup \
      --prefix=/usr                 \
      --buildtype=release           \
      -Dmode=release                \
      -Ddev-kvm-mode=0660           \
      -Dlink-udev-shared=false      \
      -Dlogind=false                \
      -Dvconsole=false              \
      ..

Значение параметров meson:

--buildtype=release

Этот параметр переопределяет тип сборки по умолчанию («debug»), который создает неоптимизированные двоичные файлы.

-Dmode=release

Отключает некоторые функции, которые разработчики считают экспериментальными.

-Ddev-kvm-mode=0660

По умолчанию правило udev разрешает всем пользователям доступ к /dev/kvm. Редакторы LFS считают это опасным. Данная опция переопределяет разрешение по умолчанию.

-Dlink-udev-shared=false

Эта опция запрещает udev связываться с внутренней общей библиотекой systemd libsystemd-shared. Эта библиотека предназначена для совместного использования многими компонентами Systemd, и ее использование избыточно, когда установлен только udev.

-Dlogind=false -Dvconsole=false

Эти параметры предотвращают создание нескольких файлов правил udev, принадлежащих другим компонентам Systemd, которые мы не будем устанавливать.

Получите список предоставляемых udev helpers и сохраните его в переменной (экспортировать его не обязательно, но это упрощает сборку от имени обычного пользователя или при использовании менеджера пакетов):

export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \
                      awk '{print $3}' | tr -d ",'" | grep -v 'udevadm')

Соберите только компоненты, необходимые для udev:

ninja udevadm systemd-hwdb \
      $(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \
      $(realpath libudev.so --relative-to .)                         \
      $udev_helpers

Установите пакет:

install -vm755 -d {/usr/lib,/etc}/udev/{hwdb.d,rules.d,network}
install -vm755 -d /usr/{lib,share}/pkgconfig
install -vm755 udevadm                     /usr/bin/
install -vm755 systemd-hwdb                /usr/bin/udev-hwdb
ln      -svfn  ../bin/udevadm              /usr/sbin/udevd
cp      -av    libudev.so{,*[0-9]}         /usr/lib/
install -vm644 ../src/libudev/libudev.h    /usr/include/
install -vm644 src/libudev/*.pc            /usr/lib/pkgconfig/
install -vm644 src/udev/*.pc               /usr/share/pkgconfig/
install -vm644 ../src/udev/udev.conf       /etc/udev/
install -vm644 rules.d/* ../rules.d/README         /usr/lib/udev/rules.d/
install -vm644 $(find ../rules.d/*.rules \
                      -not -name '*power-switch*') /usr/lib/udev/rules.d/
install -vm644 hwdb.d/*  ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/
install -vm755 $udev_helpers                       /usr/lib/udev
install -vm644 ../network/99-default.link          /usr/lib/udev/network

Установите некоторые пользовательские правила и вспомогательные файлы, полезные в среде LFS:

tar -xvf ../../udev-lfs-20230818.tar.xz
make -f udev-lfs-20230818/Makefile.lfs install

Установите справочные страницы:

tar -xf ../../systemd-man-pages-255.tar.xz                            \
    --no-same-owner --strip-components=1                              \
    -C /usr/share/man --wildcards '*/udev*' '*/libudev*'              \
                                  '*/systemd.link.5'                  \
                                  '*/systemd-'{hwdb,udevd.service}.8

sed 's|systemd/network|udev/network|'                                 \
    /usr/share/man/man5/systemd.link.5                                \
  > /usr/share/man/man5/udev.link.5

sed 's/systemd\(\\\?-\)/udev\1/' /usr/share/man/man8/systemd-hwdb.8   \
                               > /usr/share/man/man8/udev-hwdb.8

sed 's|lib.*udevd|sbin/udevd|'                                        \
    /usr/share/man/man8/systemd-udevd.service.8                       \
  > /usr/share/man/man8/udevd.8

rm /usr/share/man/man*/systemd*

Наконец, сбросьте значение переменной udev_helpers:

unset udev_helpers

8.76.2. Установка Udev - 32-битная версия

Выполните очистку после предыдущей сборки (находясь в каталоге сборки):

rm -rf *

Подготовьте Udev к компиляции:

PKG_CONFIG_PATH="/usr/lib32/pkgconfig" \
CC="gcc -m32 -march=i686"              \
CXX="g++ -m32 -march=i686"             \
LANG=en_US.UTF-8                       \
meson setup \
      --prefix=/usr                 \
      --buildtype=release           \
      -Dmode=release                \
      -Ddev-kvm-mode=0660           \
      -Dlink-udev-shared=false      \
      ..

Скомпилируйте пакет:

ninja \
      $(grep -o -E "^build (src/libudev|src/udev)[^:]*" \
        build.ninja | awk '{ print $2 }')                              \
      $(realpath libudev.so --relative-to .)

Установите пакет:

mkdir -pv /usr/lib32/pkgconfig &&
cp -av libudev.so{,*[0-9]} /usr/lib32/ &&
sed -e "s;/usr/lib;&32;g" src/libudev/libudev.pc > /usr/lib32/pkgconfig/libudev.pc

8.76.3. Настройка Udev

Информация об аппаратных устройствах хранится в каталогах /etc/udev/hwdb.d и /usr/lib/udev/hwdb.d. Udev необходимо, чтобы эта информация была скомпилирована в двоичную базу данных /etc/udev/hwdb.bin. Создайте исходную базу данных:

udev-hwdb update

Эту команду необходимо запускать каждый раз при обновлении информации об оборудовании.

8.76.4. Содержимое пакета Udev

Установленные программы: udevadm, udevd (символическая ссылка на udevadm) и udev-hwdb
Установленные библиотеки: libudev.so
Созданные каталоги: /etc/udev и /usr/lib/udev

Short Descriptions

udevadm

Универсальный инструмент администрирования udev: управляет демоном udevd, предоставляет информацию из базы данных Udev, отслеживает uevents, ожидает завершения uevents, проверяет конфигурацию Udev и запускает uevents для данного устройства

udevd

Демон, который прослушивает uevents в сокете netlink, создает устройства и запускает настроенные внешние программы в ответ на эти uevents

udev-hwdb

Обновляет или запрашивает базу данных оборудования

libudev

Библиотека для получения информации об устройствах udev

/etc/udev

Содержит файлы конфигурации Udev, разрешения для устройств и правила именования устройств