7.10. デバイスへのシンボリックリンクの生成

7.10.1. CD-ROM のシンボリックリンク

後にインストールしていくソフトウェア (例えばメディアプレーヤーなど) では、/dev/cdrom/dev/dvd といったシンボリックリンクを必要とするものがあります。 これらはそれぞれ CD-ROM、DVD-ROM を指し示しています。 こういったシンボリックリンクは /etc/fstab ファイルに設定しておくのが便利です。 Udev が提供するスクリプトファイルで、ルールファイル (rules files) を生成するものがあります。 そのルールファイルは、各デバイスの性能に応じてシンボリックファイルを構成します。 もっともこのスクリプトファイルを利用する際には、二つ存在する動作モードのいずれを用いるかを決めなければなりません。

一つは 「パス (by-path)」 モードです。 これは USB デバイスやファームウェアデバイスに対してデフォルトで利用されます。 これによって作り出されるルールは CD や DVD デバイスに対して物理パスが用いられます。 二つめは 「ID (by-id)」 モードです。 デフォルトで IDE や SCSI デバイスに利用されます。 このモードで作り出されるルールは CD や DVD デバイス自身が持つ識別文字列が用いられます。 パスは Udev の path_id スクリプトによって決定します。 一方、識別文字列は ata_id プログラムまたは scsi_id プログラムによってハードウェアから読み出されます。 ata_idscsi_id のいずれであるかは、そのデバイスによって決まります。

二つの方法にはそれぞれに利点があります。 どちらの方法が適切であるかは、デバイスがどのように変更されるかによります。 デバイスに対する物理パス (そのデバイスが接続しているポートやスロット) を変更したい場合、例えば IDE ポートや USB コネクタを切り替えたいような場合、 「ID (by-id)」 モードを使うべきです。 一方、デバイスの識別文字列を変えたい場合、つまりデバイスが故障したために、同等の性能の新しいデバイスを同一コネクタに接続しようとする場合は、 「パス (by-path)」 モードを使うべきです。

いずれの変更の可能性もあるならば、より変更の可能性の高いケースに従ってモードを選ぶべきです。

[重要項目]

重要項目

外部接続のデバイス (例えば USB 接続の CD ドライブなど) はパス (by-path) モードを用いるべきではありません。 そのようなデバイスは接続するたびに外部ポートが新しくなり、物理パスが変わってしまうためです。 こういった外部接続のデバイスを物理パスで認識させ Udev ルールを構成した場合は、あらゆるデバイスがこの問題を抱えることになります。 これは CD や DVD ドライブだけに限った話ではありません。

Udev スクリプトが利用しているキーの値を確認したい場合は /sys ディレクトリ配下を確認します。 例えば CD-ROM デバイスについては /sys/block/hdd を確認します。 そして以下のようなコマンドを実行します。

udevadm test /sys/block/hdd

出力結果には *_id というプログラム名を示した行がたくさん表示されます。 「ID (by-id)」 モードは ID_SERIAL 値が存在して空でなければこれを利用します。 そうでない時は ID_MODEL と ID_REVISION を利用します。 「パス (by-path)」 モードは ID_PATH の値を利用します。

デフォルトモードが利用状況に合わない場合は、 /lib/udev/rules.d/75-cd-aliases-generator.rules ファイルに対して以下のように修正を行います。 mode の部分は 「by-id」 か 「by-path」 に置き換えます。

sed -i -e 's/write_cd_rules/& mode/' \
    /lib/udev/rules.d/75-cd-aliases-generator.rules

ここでルールファイルやシンボリックリンクを作成する必要はありません。 この時点ではホストの /dev ディレクトリに対して LFS システムに向けてのバインドマウント (bind-mounted) を行っており、ホスト上にシンボリックリンクが存在していると仮定しているからです。 ルールファイルとシンボリックリンクは LFS システムを初めてブートした時に生成されます。

もっとも CD-ROM デバイスが複数あると、ブート時に生成されるシンボリックリンクが、ホスト利用時に指し示されていたものとは異なる場合が発生します。 デバイスの検出順は予測できないものだからです。 LFS システムを初めて起動した時の割り当ては、たぶん固定的に行われるはずです。 つまりこのことは、ホストシステムと LFS システムの双方で、シンボリックリンクが同じデバイスを指し示すことが必要である場合にのみ問題となります。 これが必要であるなら、生成されている /etc/udev/rules.d/70-persistent-cd.rules ファイルを起動後に調査して (おそらくは編集して) 割り当てられたシンボリックリンクが望むものになっているかどうかを確認してください。

7.10.2. 重複するデバイスの取り扱い方

7.9. 「LFS システムにおけるデバイスとモジュールの扱い」 で説明したように、 /dev 内に同一機能を有するデバイスがあったとすると、その検出順は本質的にランダムです。 例えば USB 接続のウェブカメラと TV チューナーがあったとして、 /dev/video0 がウェブカメラを、また /dev/video1 がチューナーをそれぞれ参照していたとしても、システム起動後はその順が逆になることがあります。 サウンドカードやネットワークカードを除いた他のハードウェアであれば、 Udev ルールを適切に記述することで、固定的なシンボリックリンクを作り出すことができます。 ネットワークカードについては、別途 7.13. 「ネットワークスクリプトの設定」 にて説明しています。 またサウンドカードの設定方法は BLFS にて説明しています。

利用しているデバイスに上の問題の可能性がある場合 (お使いの Linux ディストリビューションではそのような問題がなかったとしても) /sys/class ディレクトリや /sys/block ディレクトリ配下にある対応ディレクトリを探してください。 ビデオデバイスであれば /sys/class/video4linux/videoX といったディレクトリです。 そしてそのデバイスを一意に特定する識別情報を確認してください。 (通常はベンダー名、プロダクトID、シリアル番号などです。)

udevadm info -a -p /sys/class/video4linux/video0

シンボリックリンクを生成するルールを作ります。

cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"

# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \
    SYMLINK+="tvtuner"

EOF

こうしたとしても /dev/video0/dev/video1 はチューナーとウェブカメラのいずれかをランダムに指し示すことに変わりありません。 (したがって直接このデバイス名を使ってはなりません。) しかしシンボリックリンク /dev/tvtuner/dev/webcam は常に正しいデバイスを指し示すようになります。