8.75. Systemd-255 中的 Udev

Udev 软件包包含动态创建设备节点的程序。

估计构建时间: 0.2 SBU
需要硬盘空间: 144 MB

8.75.1. 安装 Udev

Udev 是 systemd-255 软件包的一部分。请使用 systemd-255.tar.xz 作为源代码包。

从默认的 udev 规则中删除不必要的组 rendersgx

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

删除一条需要完整安装 Systemd 的 udev 规则:

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。本书编辑团队认为这比较危险。该选项覆盖这一默认值。

-Dlink-udev-shared=false

该选项防止 udev 链接到 systemd 内部共享库,libsystemd-shared。这个库被设计为被许多 Systemd 组件共同使用,在只安装 udev 时它功能明显过剩。

-Dlogind=false -Dvconsole=false

该选项防止生成一些属于其他的,我们不会安装的 Systemd 组件的 udev 规则文件。

获取软件包提供的 udev 辅助程序列表并将其保存到环境变量中 (实际上并不需要导出该变量,但这使得以非特权用户身份进行构建或使用包管理器更容易):

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.75.2. 配置 Udev

硬件设备的相关信息被维护在 /etc/udev/hwdb.d/usr/lib/udev/hwdb.d 目录中。Udev 需要将这些信息编译到二进制数据库 /etc/udev/hwdb.bin 中。初始化该数据库:

udev-hwdb update

每次硬件信息有更新时,都要运行该命令。

8.75.3. Udev 的内容

安装的程序: udevadm, udevd (到 udevadm 的符号链接), 以及 udev-hwdb
安装的库: libudev.so
安装的目录: /etc/udev 和 /usr/lib/udev

简要描述

udevadm

通用 udev 管理工具:控制 udevd 守护进程,从 udev 数据库中提供信息,监视 uevent,等待 uevent 完成,测试 udev 配置,并为指定设备触发 uevent。

udevd

一个守护进程,它在 netlink 套接字上监听 uevent,并创建设备节点、运行配置好的外部程序,以响应这些 uevent。

udev-hwdb

更新或查询硬件数据库

libudev

一个提供 udev 设备信息接口的库

/etc/udev

包含 udev 配置文件、设备权限设置和设备命名规则