後にインストールしていくソフトウェア (例えばメディアプレーヤーなど) では、/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_id、 scsi_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.9. 「LFS
システムにおけるデバイスとモジュールの扱い」 で説明したように、 /dev
内に同一機能を有するデバイスがあったとすると、その検出順は本質的にランダムです。 例えば
USB 接続のウェブカメラと TV チューナーがあったとして、 /dev/video0
がウェブカメラを、また /dev/video1
がチューナーをそれぞれ参照していたとしても、システム起動後はその順が逆になることがあります。
サウンドカードやネットワークカードを除いた他のハードウェアであれば、 Udev
ルールを適切に記述することで、固定的なシンボリックリンクを作り出すことができます。 ネットワークカードについては、別途
7.13. 「ネットワークスクリプトの設定」 にて説明しています。
またサウンドカードの設定方法は
BLFS にて説明しています。
利用しているデバイスに上の問題の可能性がある場合 (お使いの Linux ディストリビューションではそのような問題がなかったとしても)
/sys/class
ディレクトリや /sys/block
ディレクトリ配下にある対応ディレクトリを探してください。
ビデオデバイスであれば /sys/class/video4linux/video
といったディレクトリです。
そしてそのデバイスを一意に特定する識別情報を確認してください。 (通常はベンダー名、プロダクトID、シリアル番号などです。)
X
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
は常に正しいデバイスを指し示すようになります。