Udev 软件包包含动态创建设备节点的程序。
Udev 是 systemd-254 软件包的一部分。请使用 systemd-254.tar.xz 作为源代码包。
从默认的 udev 规则中删除不必要的组 render
和
sgx
:
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:
mkdir -p build cd build meson setup \ --prefix=/usr \ --buildtype=release \ -Dmode=release \ -Ddev-kvm-mode=0660 \ -Dlink-udev-shared=false \ ..
meson 选项的含义:
--buildtype=release
这个开关覆盖默认的构建模式 (“debug”),因为该模式会生成未优化的二进制代码。
-Dmode=release
禁用一些上游开发者认为尚处于实验阶段的功能。
-Ddev-kvm-mode=0660
默认的 udev 规则会允许所有用户访问 /dev/kvm
。本书编辑团队认为这比较危险。该选项覆盖这一默认值。
-Dlink-udev-shared=false
该选项防止 udev 链接到 systemd 内部共享库,libsystemd-shared
。这个库被设计为被许多 Systemd
组件共同使用,在只安装 udev 时它功能明显过剩。
只构建 udev 需要的组件:
ninja udevadm systemd-hwdb \ $(grep -o -E "^build (src/libudev|src/udev|rules.d|hwdb.d)[^:]*" \ build.ninja | awk '{ print $2 }') \ $(realpath libudev.so --relative-to .)
移除一个需要完整安装 Systemd 的 udev 规则文件:
rm rules.d/90-vconsole.rules
安装该软件包:
install -vm755 -d {/usr/lib,/etc}/udev/{hwdb,rules}.d 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/{*.rules,README} /usr/lib/udev/rules.d/ install -vm644 hwdb.d/* ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/ install -vm755 $(find src/udev -type f | grep -F -v ".") /usr/lib/udev
安装一些在 LFS 环境中很有用的自定义规则和支持文件:
tar -xvf ../../udev-lfs-20230818.tar.xz make -f udev-lfs-20230818/Makefile.lfs install
安装 man 页面:
tar -xf ../../systemd-man-pages-254.tar.xz \ --no-same-owner --strip-components=1 \ -C /usr/share/man --wildcards '*/udev*' '*/libudev*' \ '*/systemd-'{hwdb,udevd.service}.8 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/man8/systemd-*.8
硬件设备的相关信息被维护在 /etc/udev/hwdb.d
和
/usr/lib/udev/hwdb.d
目录中。Udev 需要将这些信息编译到二进制数据库 /etc/udev/hwdb.bin
中。初始化该数据库:
udev-hwdb update
每次硬件信息有更新时,都要运行该命令。