Еще две вещи: переход Linux на корпоративные и другие крупные серверы подвергает статическую /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
шуткой.
Резюме
Когда вы принимаете комбинацию статического кода, /dev
становящегося все более бессмысленным из-за непредсказуемых порядков проверки устройств и продолжая выделять статические старшие / младшие числа, ведущие к существенной работе, которая не заканчивается, становится понятно, почему разработчики Linux решили перейти на динамическое /dev
.
/dev
не (легко или удобно) не относятся к таким вещам, как человек, подключающий сетевой адаптер USB, или виртуальные сетевые адаптеры, добавляемые или отключаемые во время работы системы. Тем не менее, ничто не мешает вам удалитьudev
и вернуться к простому старому статическому/dev
маршруту каталога.