Еще две вещи: переход Linux на корпоративные и другие крупные серверы показал, что static /dev
не работает. Развивающиеся технологии, как для потребителей, так и для предприятий, выставляли static /dev как шутку. [Этот ответ заполняет большую часть предыстории, не особенно то, почему devfs был заменен на udev].
Исчерпание большого и малого номера пространства
Файлы /dev
идентифицируются внутри ядра по их старшим и младшим номерам. Ядро никогда не заботилось об имени (и вы могли бы, например, mv /dev/sda /dev/disk-1
и оно продолжало бы работать - хотя, конечно, программы не знали бы, где его найти).
При использовании статического /dev
вам нужно выделить старший / младший номер для каждого потенциального устройства, которое может существовать. Эти цифры должны быть уникальными во всем мире, так как они поставляются как часть дистрибутивов, а не создаются по требованию. Проблема в том, что каждое из них является 8-битным числом - диапазон от 0 до 255.
Первоначально, например, Linux начинался с 8,0 с sda, 8,1 с sda1, 8,16 с sdb и т.д. Но люди продолжали добавлять все больше дисков на машины, особенно когда вы рассматривали такие вещи, как оптоволоконный канал. Так что в какой-то момент, основные номера 65–71 были добавлены для большего количества дисков. Позже мажорные номера 128–135. И все же люди продолжали хотеть больше дисков ...
И появились форматы таблиц разделов, такие как GPT, поддерживающие большее количество разделов на диск. И, конечно, другие устройства перебирали пространство номеров: различные RAID-контроллеры, управление логическими томами и т.д.
Конечный результат можно увидеть в списке устройств Linux LANANA. Если вы посмотрите на список 2.6 (единственный, который все еще там), то используется большое количество старших номеров блоков до 200 (максимум: 255). Ясно, что цифры закончились бы.
Переход на большее число было нелегким. Это меняет ядро ABI. В зависимости от файловой системы, это меняет расположение на диске. Но, конечно, большинство из этих устройств не существовало ни в одной из систем, даже у того, на котором (например) заканчивались диски SCSI, вероятно, было много свободных вещей - вероятно, не требовался жесткий диск IBM XT, например.
С динамическим /dev
дистрибутиву не нужно отправлять номера устройств. Они больше не должны быть глобально уникальными. Они даже не должны быть уникальными среди сапог.
Названия устройств были непредсказуемыми
Раньше было действительно легко присвоить номер всему. На плате было два канала IDE; каждый канал IDE поддерживает одного главного и одного подчиненного. Вы можете назначить в порядке канала и в порядке «ведущий-потом-ведомый». Таким образом, hda
становится первым каналом, мастер; Первый канал hdb
, раб; hdc
второй канал, мастер; и т. д. Те были предсказуемы и стабильны. Они могут измениться, если вы добавите новый диск или удалите один, но при отсутствии смены оборудования, они были статическими.
Вы можете поместить /dev/hda1
в ваш /etc/fstab
и быть уверенным, что он будет работать, по крайней мере, при отсутствии аппаратных изменений.
IDE работал так. Ничего после этого не делает.
SATA выглядит просто: один порт, один диск. Но не так; это позволяет множители портов. И это позволяет горячую замену. Тем не менее, при отсутствии изменений в оборудовании, вы можете по-прежнему поддерживать отображение.
USB намного хуже. Это не только позволяет горячую замену, это типично. Люди постоянно подключают USB-накопители. Кроме того, устройствам может потребоваться некоторое время для проверки - и они могут фактически меняться всякий раз, когда им это нравится (например, при включении или выключении режима USB-накопителя на вашем телефоне). Firewire похож. Ни с одним из них вы не сможете придумать стабильное отображение.
Диски, подключенные к сети, не имеют собственного порядка портов. Единственный порядок, который использует ядро, это порядок, в котором они появились. То же самое с логическими томами.
Стремление к скорости загрузки также ухудшило ситуацию. Первоначально ядро с удовольствием сидело бы без дела и долго ждали, например, все USB-устройства для инициализации. Чтобы полностью исследовать все шины SCSI и т.д. Эти зонды были превращены в фоновые задачи; boot больше не будет ждать их Устройства добавляются после завершения проверки.
Таким образом, ядро осталось более или менее «в любом порядке, в котором они появляются». Это означало, что многие типы устройств могут изменять порядок загрузки при каждой загрузке - то, что было в одной загрузке /dev/sdb
было в другой загрузке /dev/sdc
. Это делает идею статического /dev
шуткой.
Резюме
Когда вы используете комбинацию static /dev
становится все более бессмысленной из-за непредсказуемых порядков проверки устройств и продолжает выделять статические старшие / младшие номера, ведущие к существенной работе, которая не заканчивается, становится понятно, почему разработчики Linux решили переключиться на динамический /dev