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

优质
小牛编辑
127浏览
2023-12-01

7.12.1. CD-ROM symlinks

我们可能装一些软件用到 cdrom dvd 等,因此我们会需要把 /dev/cdrom /dev/dvd 的符号链接加在/etc/fstab中。对于每一个CD-ROM 设备,在 /sys 下找到相应的目录(例如, /sys/block/hdd) ,然后运行如下命令:

udevtest /block/hdd

观察一下包含很多 *_id 输出的程序的行。

有两种方法可以创建symlinks,可以用model名及序号,或是用设备在总线上的位置。 以第一种方法,可以创建如下文件:

cat >/etc/udev/rules.d/82-cdrom.rules << EOF # Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_MODEL}=="SAMSUNG_CD-ROM_SC-148F", \
    ENV{ID_REVISION}=="PS05", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_MODEL}=="PHILIPS_CDD5301", \
    ENV{ID_SERIAL}=="5VO1306DM00190", SYMLINK+="cdrom1 dvd" 
EOF

注意

这个例子能正常工作,但 udev 不能识别 \ 的继续上一行功能,所以若要用编辑器来编辑 udev 的规则时,一定要保证每行只有一个命令。

做完这些symlinks就会保持正常工作状态,即使把cdrom移到 IDE 总线的其他位置上也能正常工作。但是如果使用新的驱动器来替换原来的 SAMSUNG CD-ROM,/dev/cdrom 符号链接将不会被创建。

SUBSYSTEM=="block" 关键字是为了避免匹配一般的 SCSI 设备。 在没有这个关键字的情况下,若同时存在两个 SCSI CD-ROM, 这个符号链接有时会指向 /dev/srX 设备 ,但有时会错误的指向 /dev/sgX

第二种方法的步骤:

cat >/etc/udev/rules.d/82-cdrom.rules << EOF # Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
    ENV{ID_PATH}=="pci-0000:00:07.1-ide-0:1", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
    ENV{ID_PATH}=="pci-0000:00:07.1-ide-1:1", SYMLINK+="cdrom1 dvd" 
EOF

这样,即使你使用不同的 model 来替换原来的设备,符号链接仍然是正确的,它指向在 IDE 总线上旧的位置。 ENV{ID_TYPE}=="cd" 关键字是为了确保符号链接在总线上的那个位置放的不是 CD-ROM 时,能够消失。

当然把两种方法混合使用也是可以的。

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/video_X_。 找出标记设备唯一性的属性(通常是 设备提供商、产品 ID 以及序列号):

udevinfo -a -p /sys/class/video4linux/video0

接下来,写一个创建符号链接的规则,例如:

cat >/etc/udev/rules.d/83-duplicate_devs.rules << EOF # Persistent symlinks for webcam and tuner
KERNEL=="video*", SYSFS{idProduct}=="1910", SYSFS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", SYSFS{device}=="0x036f", SYSFS{vendor}=="0x109e", \
    SYMLINK+="tvtuner" 
EOF

结果 /dev/video0/dev/video1 设备仍然随机指向调谐器和网络摄像头(因此不应当直接使用),但是符号链接 /dev/tvtuner/dev/webcam 总是指向正确的设备。

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