7.12. 为设备创建惯用的符号链接

7.12.1. CD-ROM symlinks

您可能之后想装的软件(例如各种多媒体)要用到存在的符号链接 /dev/cdrom/dev/dvd ,并且它们指向了 CD-ROM 或 DVD-ROM 设备。当然也可以把选项添加到 /etc/fstab 中以求方便。 决定于各设备的能力,Udev 用一个能产生规则文件的脚本来为您创建符号链接。但您要决定这两种操作模式的哪个可以用这个脚本。

脚本可以在 “by-path” 模式(默认用于 USB 和 FireWire 设备)下作业。在这种模式下,它创建的规则决定于到 CD 和 DVD 的路径。脚本也可以在 “by-id” 模式(默认用于 IDE 和 SCSI 设备)作业。在这种模式下,它创建的规则决定于存储在 CD 和 DVD 设备里面的认证字符串。路径由 Udev 的 path_id 脚本决定。认证字符串被自身的 ata_idscsi_id 程序(取决于你用什么设备)从硬盘里读出来。

各种方法各有优势。方法的正确性取决于设备的变动。如果您希望变更到设备的物理路径(就是插到里面的端口或槽),例如,你打算把驱动器移到另一个 IDE 端口或另一个 USB 连接口上,那么你应该用 “by-id” 模式。再如,如果你希望改变设备的的认证(比如因为它报废了),您想用另外一个有相同功能的插到同一连接口来代替它,那么您应该用 “by-path” 模式。

如果两种变更方式都能用在您的驱动器上,就选择一个基于您更想要的改变方式的模式。

[重要]

重要

外部设备(例如,一个 USB 接口的 CD 驱动)不应该用 by-path ,因为每次设备被插在一个新的外部端,它的物理路径将会改变。如果你用它们的物理路径来写 Udev 规则并用来识别它们,那么所有的外部连接型的设备将有这个问题。在 CD 和 DVD 设备上没有问题。

如果你想查看 Udev 脚本要用的变量,对于合适的 CD-ROM 设备,就在 /sys 下(可能是 /sys/block/hdd )找相应的目录,然后运行类似下面的命令:

udevadm test /sys/block/hdd

观察一下包含很多 *_id 程序输出的行。如果 ID_SERIAL 变量存在且非空,那么“by-id” 模式将会用它。否则,它将用 ID_MODEL 和 ID_REVISION 的组合。“by-path” 模式会用 ID_PATH 变量。

如果默认模式不适合您,那么下面的修正应针对于 /etc/udev/rules.d/75-cd-aliases-generator.rules 文件,如下(这里的 mode 是 “by-id” 或 “by-path”):

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

注意在这个时候创建规则文件或符号连接不是必须的。因为您已经把宿主系统的 /dev 目录绑定挂载到 LFS 系统。并且我们假定符号连接在宿主系统中存在。规则和符号连接将在你第一次启动 LFS 系统是创建。

然而,如果你有多个 CD-ROM 设备,在那个时候创建的符号连接将会指向不同的设备,而不是你宿主系统上那个。因为多个设备按顺序是不可发现的。当你第一次启动 LFS 系统时创建的这个符号连接指向将是稳定的。所以,如果你想要在两个系统里符号连接都指向同一设备,就仅有这一个问题。如果你真的需要这样做,在启动后检验(并且可能要编辑)产生的 /etc/udev/rules.d/70-persistent-cd.rules 文件,保证分配的符号连接匹配上你需要的。

7.12.2. Dealing with duplicate devices

正如在 第 7.4 节 “LFS 系统的设备和模块处理” 中提到的, /dev 下相同功能设备的顺序是随机的。例如,如果你有一个 USB 网络摄像头和一个 TV 调谐器,有的时候 /dev/video0 指向网络摄像头,/dev/video1 指向调谐器,但在重启后两个的顺序就互换了。除了网卡和声卡之外的其他设备,除了网卡和声卡之外的其他设备,都可以通过创建 Udev 规则来定制固定的符号连接。网卡的解决方法请见 第 7.13 节 “配置网络脚本”,声卡的解决方法请见 BLFS

每一个设备都可能有这个问题(即使这个问题在你现在的发行版中不存在),在 /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 总是指向正确的设备。

有关书写 Udev 规则的更多信息,可以查看 /usr/share/doc/udev-130/index.html


Host by Alair