🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 7.12\. 为设备创建惯用符号连接 ## 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 系统的设备和模块处理"](udev.html "7.4\. LFS 系统的设备和模块处理")提到过, `/dev` 下相同功能设备的顺序是随机的。例如,你有一个 USB 的网络摄像头和一个 TV 的调谐器,有时 `/dev/video0 指向网络摄像头,``/dev/video1 指向调谐器,但是在重启之后可能就会改变。除了网卡和声卡之外的其他设备,都可以通过创建 udev 的规则来定制固定的符号链接。`网卡的解决 方法请见 [节 7.13, "配置网络脚本"](network.html "7.13\. 配置网络脚本"), 声卡解决方法请见 [_BLFS_](http://www.linuxfromscratch.org/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`。