虽然我了解 udev 的伟大之处并欣赏开发人员的努力,但我只是想知道是否有替代方案。
例如,我可能想象应该有一种方法来制作启动脚本来创建大多数设备节点,这些设备节点在我的系统(不更改硬件)上无论如何都是最相同的。
我想跳过的好处或原因udev
与跳过相同dbus
,即降低复杂性,并通过增加我的更改来更安全地设置系统。
答案1
现代 Linux 内核支持devtmpfs
文件系统(不要与古老的文件系统混淆devfs
),一旦内核发现所有设备节点,它就会动态创建它们。 (事实上,最新udev
版本要求这;你会发现 udev 不再创建任何设备节点,只创建符号链接。)
同样,固件加载也已移至内核中,因此唯一udev
执行的剩余任务是模块加载(根据模态别名)以及应用设备权限和其他 udev 规则。
所以从理论上讲,一个完全整体的内核应该启动没有 udev 就可以了。
然而,这里真正的问题是后来发生的事情。
相当多的用户空间程序依赖 udev 维护其设备数据库,可通过
libudev
.虽然枚举设备和监听添加/删除的事件可以直接使用内核接口(sysfs 和 netlink)完成,但您仍然没有各种 udev 规则附加的所有元数据。/dev/disk/by-*
udev 规则还维护、/dev/mapper
、/dev/input/by-path
、/dev/snd/by-path
等中的各种“持久”符号链接。例如,如果连接了两个磁盘,则不能保证第一个磁盘始终是sda
orsdb
,但 udev 确保 中的符号链接/dev/disk/by-uuid
将继续指向正确的磁盘。虽然设备节点现在由内核创建,因此不再是您关心的问题,但仍然需要注意的是,某些设备类型已开始使用动态分配的主/次编号,因此即使您今天有
/dev/fuse
10,228 和/dev/hpet
10,229,它们将要每次重新启动后都有不同的数字,因此devtmpfs
或者(在旧系统上)侦听 uevents 的程序是必需的。
mdev
当然,其中许多事情可以通过其他程序轻松完成,例如。我的观点是静态/etc/MAKEDEV
脚本不再起作用......
因此,基本上,当谈到启动复杂性时,udev 很可能是至少您的担忧。
答案2
有多种替代方案udev
。貌似Gentoo可以使用一个叫做mdev
。另一种选择是尝试使用udev
其前身devfsd
。最后,您始终可以使用mknod
.
请注意,对于后者,无需在启动时创建所有内容,因为节点可以在磁盘上创建,而不是像其他选项一样在临时文件系统中创建。当然,当插入新硬件(例如 USB 记忆棒)时,您将失去动态创建设备文件的灵活性。我相信这个时代的标准方法是已经创建了您合理需要的每个设备文件/dev
(即很多设备文件)。
当然,在现代发行版中使用这些方法的难度可能相当高。 Gentoo wiki 提到了mdev
使用桌面环境的困难(更不用说在 Gentoo 之外)。最后一个devfsd
版本是 2002 年,我不知道它是否能与现代内核一起工作。手动创建节点可能是最可行的方法,但即使禁用也udev
可能是一个挑战,特别是在使用 distos 时systemd
(udev
现在是 的一部分systemd
,这表明存在很强的依赖性)。
我的建议是坚持udev
;)
答案3
有几种选择:
- 只需在作为引导程序的一部分运行的脚本中包含一组适当的
chmod
、chown
、等命令即可。ln
- 使用
systemd-udev
属于 systemd 项目一部分的即插即用管理器。 - 使用根图的
eudev
,它是 systemd 的一个分支,systemd-udev
现在已经与它显着不同。 - 使用德万的
vdev
,这是由 Jude Nelson 开发的即插即用管理器,是 Devuan 的一部分。 - 使用
mdev
,与另一个答案相反,这不是 Gentoo 的事情。它是内置的即插即用管理器忙碌盒。 - 使用无吸
mdev
这是 Dimitris Papastamos 开发的即插即用管理器。 - 使用洛朗·贝尔科特
mdevd
,它的配置与 BusyBox 兼容mdev
,但有自己的套接字处理并且不理解 LISTEN 协议。
除了第一个之外,所有这些都需要一组规则来描述如何对有关设备的内核通知事件做出反应。明显地。
还有一些工具可以获取为 设计的程序/proc/sys/kernel/hotplug
,例如两个mdev
s,并通过侦听 netlink 套接字然后生成这些程序来调整和序列化它们:
答案4
这是旧的,但我想在这里为其他徒劳搜索的人捕获我的解决方案。
避免 udev 并不容易。将 DEVTMPFS 排除在配置之外并不会阻止内核在 /dev 上安装 RAM 磁盘并填充它。不幸的是,它没有创建必要的 /dev/shm 和 /dev/pts 挂载点。必要的是将 devtmpfs.mount=0 添加到引导参数中。