还有两件事:Linux进入企业级和其他大型服务器的过程暴露了静态/dev
漏洞。在消费者和企业中,先进的技术都将静态/ dev当作笑话。[这个答案填补了更多的背景知识,特别是为什么devfs被udev取代的原因]。
主要和次要数字空间的耗尽
/dev
文件在内核中通过主次编号来标识。内核从未真正关心过这个名称(例如,您可以,mv /dev/sda /dev/disk-1
而且它会继续工作,尽管程序当然不知道在哪里可以找到它)。
使用static时/dev
,您需要为可能存在的每个潜在设备分配一个主要/次要编号。这些数字在全球范围内必须是唯一的,因为它们是发行版的一部分,而不是按需提供的。问题在于它们都是8位数字,范围是0-255。
例如,最初,Linux的开始是8,0是sda,8,1是sda1,8,16是sdb,等等。但是人们一直在向计算机添加越来越多的磁盘,尤其是在考虑诸如光纤通道之类的东西时。因此,在某些时候,主要数字65-71被添加以用于更多磁盘。后来,主要数字为128–135。但是人们一直想要更多的磁盘...
诸如GPT之类的分区表格式应运而生,每个磁盘支持更多分区。当然,其他设备正在吞噬数字空间:各种RAID控制器,逻辑卷管理等。
最终结果可以在LANANA Linux设备列表中看到。如果查看2.6列表(仍然是唯一的列表),则会使用很多块主数字,直到200(最大:255)。显然,这些数字已经用完了。
更改为更大的数字并不容易。它更改了内核ABI。根据文件系统,它会更改磁盘布局。但是,当然,其中大多数设备都不存在于任何一个系统上,即使是(例如)用完SCSI磁盘的设备也可能有很多空闲的东西–它可能不需要IBM XT硬盘,例如。
使用dynamic /dev
,发行版不必附带设备编号。它们不再必须是全球唯一的。它们甚至不必在靴子上唯一。
设备名称不可预测
以前,给所有内容分配一个数字非常容易。一块板上有两个IDE通道。每个IDE通道都支持一个主机和一个从机。您可以按通道顺序分配,也可以先按主从分配。因此hda
成为第一频道,大师;hdb
第一频道,奴隶;hdc
第二频道,主人;等。这些是可预测的和稳定的。如果添加新驱动器或卸下一个驱动器,它们可能会更改,但是如果没有硬件更改,它们是静态的。
你可以把/dev/hda1
你/etc/fstab
并相信它会留下来工作,至少不存在硬件更改。
IDE就是这样工作的。没事做。
SATA看起来很简单:一个端口,一个磁盘。但事实并非如此;它允许端口倍增器。而且它允许热插拔。尽管如此,在没有硬件更改的情况下,您实际上仍可以保持映射正常运行。
USB要糟糕得多。它不仅允许热插拔,而且很典型。人们一直在插入USB闪存驱动器。此外,设备可能需要花费一些时间进行探测,并且实际上可以随时随地更改(例如,在手机上打开或关闭USB存储模式时)。火线是相似的。两者都不能真正提供稳定的映射。
网络连接的磁盘没有任何固有的端口顺序。内核使用的唯一顺序是它们出现的顺序。与逻辑卷相同。
对启动速度的追求也使情况变得更糟。最初,内核会很乐意坐下来,等待相当长的时间,例如,所有USB设备都要初始化。为了全面探测所有SCSI总线等。引导将不再等待它们。探针完成后,将添加设备。
因此内核或多或少地具有“它们以什么顺序出现”的信息。这意味着许多类型的设备可以而且确实在每次引导时都会更改顺序-一个引导上的内容是/dev/sdb
另一个引导上的内容/dev/sdc
。这使静态的想法成为/dev
一个笑话。
摘要
当您/dev
由于无法预测的设备探测顺序而将静态的组合变得越来越无意义,并继续分配静态的主要/次要数字而导致大量工作没有用完时,很明显,Linux的开发人员为何选择切换到动态/dev
。
/dev
无法(轻松或方便地)解决诸如插入USB网络适配器的人员或在系统运行时添加或删除虚拟网络适配器之类的问题。但是,没有什么可以阻止您卸载udev
并返回普通的旧静态/dev
目录路由。