尽管 BLFS 及更高版本中包所需的大多数设备都由 udev 使用
LFS 在 /etc/udev/rules.d
中安装的默认规则正确设置,但在某些情况下必须修改或扩充规则。
如果系统中有多个声卡,“默认”声卡会变为随机。建立声卡顺序的方法取决于驱动程序是否为模块。如果声卡驱动程序编译进内核,则通过
/boot/grub/grub.cfg
中的内核命令行参数进行控制。例如,如果系统同时拥有 FM801 卡和 SoundBlaster PCI
卡,则可以将以下内容附加到命令行:
snd-fm801.index=0 snd-ens1371.index=1
如果声卡驱动程序构建为模块,则可以在 /etc/modprobe.conf
文件中通过以下方式建立顺序:
options snd-fm801 index=0
options snd-ens1371 index=1
USB 设备通常有两种与之关联的设备节点。
第一种由内核中的设备特定驱动程序(例如 usb_storage/sd_mod 或 usblp)创建。例如,USB 大容量存储设备为 /dev/sdb,USB 打印机为 /dev/usb/lp0。这些设备节点仅在设备特定驱动程序加载时才存在。
第二种设备节点(/dev/bus/usb/BBB/DDD,其中 BBB 是总线编号,DDD 是设备编号)即使设备没有内核驱动程序也会被创建。通过使用这些“原始”USB 设备节点,应用程序可以与设备交换任意 USB 数据包,即绕过可能存在的内核驱动程序。
当用户空间程序充当设备驱动程序时,需要访问原始 USB 设备节点。但是,要使程序成功打开设备,必须正确设置权限。默认情况下,出于安全考虑,所有原始 USB 设备由用户 root 和组 root 拥有,权限为 0664(需要读取权限,例如,使 lsusb 工作以及程序访问 USB 集线器)。包含用户空间 USB 设备驱动程序的包(例如 SANE 和 libgphoto2)也会附带 udev 规则,更改受控原始 USB 设备的权限。也就是说,SANE 安装的规则会更改已知扫描仪的权限,但不会更改打印机的。如果包维护者忘记为您的设备编写规则,请向 BLFS(如果该包在其中)和上游报告错误,并且您将需要编写自己的规则。
在 Linux-2.6.15 之前,原始 USB 设备访问不是通过 /dev/bus/usb/BBB/DDD 设备节点进行的,而是通过 /proc/bus/usb/BBB/DDD 伪文件进行的。某些应用程序仍然仅使用这种已弃用的技术,并且无法使用新的设备节点。它们无法与 Linux 内核 3.5 或更高版本一起工作。如果您需要运行此类应用程序,请联系其开发人员以获取修复。
可以通过创建额外的 udev
规则来微调设备属性(例如组名和权限),匹配类似以下内容。供应商和产品可以通过搜索 /sys/devices 目录条目或在设备连接后使用 udevadm info 找到。有关详细信息,请参阅当前
udev 目录中 /usr/share/doc 的文档。
SUBSYSTEM=="usb_device", SYSFS{idVendor}=="05d8", SYSFS{idProduct}=="4002", \
GROUP:="scanner", MODE:="0660"
在某些情况下,完全禁用 udev 并创建静态设备是有意义的。服务器就是这种情况的一个例子。服务器需要处理动态设备的能力吗?只有系统管理员才能回答这个问题,但在许多情况下答案是否定的。
如果不需要动态设备,则必须在系统上创建静态设备。在默认配置中,/etc/rc.d/rcS.d/S10udev 启动脚本会在 /dev 目录上挂载 tmpfs
分区。可以通过临时挂载根分区来克服此问题:
如果不仔细遵循以下说明,您的系统可能会无法启动。
mount --bind / /mnt
cp -a /dev/* /mnt/dev
rm /etc/rc.d/rcS.d/{S10udev,S50udev_retry}
umount /mnt
此时,系统将在下次重新启动时使用静态设备。使用 mknod 创建任何所需的其他设备。
如果您想恢复动态设备,请重新创建 /etc/rc.d/rcS.d/{S10udev,S50udev_retry}
符号链接,并再次重新启动。静态设备不需要删除(console 和 null 始终是必需的),因为它们被 tmpfs 分区覆盖。设备的磁盘占用可以忽略不计(每个条目约 20–30 字节)。