7.10. 为设备创建惯用符号连接

7.10.1. CD-ROM 符号链接

以后,你可能安装一些软件 (比如,各种媒体播放器),需要存在 /dev/cdrom/dev/dvd 符号链接,并指向 CD-ROM 或 DVD-ROM 设备。 另外,把相关的符号链接放到 /etc/fstab 中更方便使用。 Udev 附带的一个脚本, 它根据每个设备的功能会生成规则文件, 来为你创建这些符号链接。 而你必须决定你想把这个脚本用于哪两种操作模式。

第一,这个脚本可以运行在 “by-path” 模式 (默认用于 USB 和 FireWire 设备),这时根据CD 或DVD设备的物理路径创建规则。第二,它可以运行在 “by-id” 模式 (默认用于 IDE 和 SCSI 设备), 这时根据存储在CD 或 DVD 设备自身的身份字符串创建规则。 path 由 Udev 的 path_id脚本确定,身份字符串根据你的设备类型,由ata_idscsi_id 程序从硬件读取。

每种模式都有优点, 你要根据设备类型的更改,使用恰当的模式。 如果你想要改变设备的物理路径(也就是设备插入的端口和/或接口) , 因为你想移动设备到不同的IDE端口或不同的USB插口,所以,你应该使用“by-id” 模式。 另一方面,如果你希望改变设备的身份证明号, 因为它可能坏了,你要使用具有相同功能的不同设备代替它,并插入了同一个插口,所以, 你应该使用“by-path” 模式。

如果你的设备发生任何类型的改变,就要根据你希望更经常发生的类型改变来选择一个模式。

[Important]

重要

外部设备 (例如,一个USB连接的CD驱动器) 不应该使用 by-path 模式,因为设备每次插入一个新的外部端口,它的物理路径都会改变。 如果你写的规则文件是通过物理路径来识别,所有的外部连接设备都会有这个问题, 这个问题并不仅限于 CD 和 DVD 驱动器。

如果你希望看到Udev脚本将使用的值,为适当的CD-ROM设备,找到 /sys 下合适的路径(例如,可能是 /sys/block/hdd),请运行一个类似下面的命令:

udevadm test /sys/block/hdd

查看包含各种*_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系统, 并且我们假定宿主系统上存在符号链接, 所以现在没必要建立规则文件或符号链接。 规则和符号链接会在你第一次启动到LFS系统时建立。

然而,如果你有多媒体CD-ROM设备, 因为应该找不到该设备, 所以那时生成的符号链接可能指向宿主系统一个不同的设备, 而不是指向它。 你第一次启动LFS系统时生成的任务很稳定, 因此如果你需要两个系统上的符号链接指向同一个设备, 这就是一个问题。 如果你需要那样的话, 启动后, 请检查(也可能编辑)生成的 /etc/udev/rules.d/70-persistent-cd.rules文件, 确保指定的符号链接匹配你的需求。

7.10.2. Dealing with duplicate devices

Section 7.9, “LFS 系统的设备和模块处理” 提到过, /dev下相同功能设备的顺序是随机的。 例如,你有一个 USB 的网络摄像头和一个 TV 的调谐器,有时 /dev/video0 指向网络摄像头, /dev/video1 指向调谐器,但是在重启之后可能就会改变。 除了网卡和声卡之外的其他设备,都可以通过创建 udev 的规则来定制固定的符号链接。 网卡的解决方法请见 Section 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 总是指向正确的设备。