8.74. Systemd-254 から取り出した Udev

Udev パッケージはデバイスノードを動的に生成するプログラムを提供します。

概算ビルド時間: 0.2 SBU
必要ディスク容量: 138 MB

8.74.1. Udev のインストール

Udev は systemd-254 パッケージの一部です。 ソース tarball としては systemd-254.tar.xz ファイルを用います。

rendersgx という 2 つのグループが不要であるため、デフォルトの udev ルールから削除します。

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

本オプションは、内部提供されている systemd 共有ライブラリ libsystemd-shared を udev にリンクしないようにします。 このライブラリは 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

8.74.2. Udev の設定

ハードウェアデバイスに関する情報は /etc/udev/hwdb.d/usr/lib/udev/hwdb.d の両ディレクトリ内にて保守されています。 Udev にとってこれらの情報は、バイナリーデータベース /etc/udev/hwdb.bin にコンパイルするために必要となります。 初期データベースを以下のようにして生成します。

udev-hwdb update

このコマンドは、ハードウェア情報が更新されるたびに実行する必要があります。

8.74.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 設定ファイル、デバイスのパーミッション、デバイスの命名規則を定めます。