Linux: история номенклатуры накопителей

Linux: история номенклатуры накопителей

Номенклатура дисковых устройств в Linux на протяжении жизни этой ОС менялась неоднократно. Остановлюсь вкратце на этой истории, потому что старые имена файлов устройств до сих пор можно встретить в толстых книгах и даже в относительно актуальных журнальных и сетевых материалах.

Испокон веков, во времена статического заполнения каталога /dev, файлы дисковых устройств в именовались так: hd? -- для дисков с интерфейсом IDE (который ныне мы обычно называем PATA) и sd? -- для SCSI-дисков. Далее они маркировались литерой в зависимости от положения на IDE-канале или SCSI-шине. В первом случае, при подключении к основному контроллеру материнской платы, это выглядело так:

Имя файла Устройство
/dev/hda 1-й диск на 1-м IDE-канале
/dev/hdb 2-й диск на 1-м IDE-канале
/dev/hdc 1-й диск на 2-м IDE-канале
/dev/hdd 2-й диск на 2-м IDE-канале

Имена устройств, подсоединённых к дополнительным контроллерам IDE, маркировались следующими литерами: /dev/hde и /dev/hdf. Именование устройств было статическим, то есть 2-й диск на 2-м IDE-канале всегда получал имя /dev/hdd, даже если он был единственным в данной машине.

Эта номенклатура распространялась не только на собственно винчестеры, но на любые накопители с IDE-интерфейсом, например, ATAPI CD-ROM и Zip-приводы.

Имена SCSI-устройств выглядели так: /dev/sda -- первый SCSI-диск, /dev/sdb -- второй, и так далее.

В качестве SCSI-дисков воспринимались системой и любые накопители с интерфейсом, отличным от IDE, например, Zip-приводы на параллельном порту, встроенные и сменные носители цифровых камер, а затем и флэшки и внешние винчестеры с USB-интерфейсом.

А вот флоппи-дисководы в общем виде именовались /dev/fd, а конкретные устройствап маркировались цифрами -- /dev/fd0 и, во времена, когда в машинах бывало ещё по два привода для дискет (5" и 3,3"), /dev/fd1. Собственное имя имел обычно и CD-привод -- /dev/cdrom, но это была символическая ссылка на файл реального устройства -- например, /dev/hdc.

Разделы на дисках маркировались цифрами. За первичными разделами резервировались цифры от 1 до 4. В случае объявления одного из разделов расшиненным он получал номер соответствующего расширенного раздела, а логические разделы в нём маркировались цифрами, начиная с 5. В общем виде это выглядело так (на примере 1-го диска на 1-м IDE-канале):

Имя файла Раздел
/dev/hda1 Первичный раздел
/dev/hda2 Расширенный раздел
/dev/hda5 Первый логический раздел
/dev/hda6 Второй логический раздел
... ...
/dev/hda# Последний логический раздел
/dev/hda3 Первичный раздел
/dev/hda4 Первичный раздел

Разделы на SCSI-дисках именовались аналогично -- /dev/sda1, /dev/sda2 и так далее. А со сменными носителями дело обстояло по разному: на них либо фабричным образом размечался один первичный раздел -- например, при остуствии настоящих SCSI-винчестеров, /dev/sda1 или, иногда, почему-то /dev/sda4, либо они воспринимались как raw-устройства. то есть файловая система могла создаваться непосредственно на устройстве -- например, на /dev/sda, а не на его разделе.

Отступление: надо отметить, что первые флэшки вообще размечались иногда самым причудливым образом. Например, мне попадалась флэшка, размеченная на один расширенный раздел -- /dev/sda4, в котором было создано два логических -- совсем маленький /dev/sda5 с какой-то служебной информацией для шифрования, и большой /dev/sda6 собственно для данных.

Именно при работе с устройствами "горячего" подключения, типа флэшек и носителей цифровых камер, наиболее отчётливо проявлялись недостатки статически созданных файлов устройств. А поскольку они получали всё большее распространение, для борьбы с этими недостатками была придумана специальная виртуальная файловая система устройств -- devfs. Точнее, она была придумана, насколько я знаю, для ОС Solaris, но поддержка её скоро появилась в ядре Linux версии 2.4. Ныне в этой ОС она представляет только исторический интерес, поэтому лишь вкратце остановлюсь на изменениях, которые она внесла в номенклатуру накопителей -- именование устройств по её правилам может встретиться в литературе.

В соответствие с правилами devfs, для файлов любых ATA-накопителей был предназначен каталог /dev/ide (в некоторых дистрибутивах файловая система устройств монтировалась в каталог /devices, а каталог /dev сохранялся для совместимости). Файлы накопителей на встроенном основном IDE-контроллере локализовались в подкаталоге /dev/ide/host0 (если использовался ещё и дополнительный IDE-контроллер, встроенный или внешний, можно было увидеть и каталог /dev/ide/host1). А внутри него было два подкаталога, соответствующие IDE-каналам — /dev/ide/host{/bus0,/bus1}), каждый из которых опять же мог делиться надвое — на каталоги target0 и target1, по количеству подключённых устройств. Внутри каталога target0(1) имелся минимум ещё один подкаталог lun0. А уж в нём размещались непосредственно файлы устройств — disc для всего накопителя, part1, … part4 для физических разделов и part5, … part# — для логических.Таким образом, полное обозначение дискового раздела для первого первичного раздела на первом диске первого канала основного IDE-контроллера выглядело так:

/dev/ide/host0/bus0/target0/lun0/part1

Предусмотрен был и более краткий способ обращения к файлам устройств — через жёсткие ссылки (то есть иные имена для тех же наборов данных). Для файлов дисковых накопителей (независимо от интерфейса — IDE или SCSI) они были собраны в каталоге /dev/discs (с подкаталогами disc0, … , disc#), для файлов CD-приводов -- в каталоге /dev/cdrom) . И потому к приведённому в качестве примера разделу можно было обратиться и так:

/dev/discs/disc0/part1

Наконец, для совместимости со старыми временами (и старыми привычками) в большинстве дистрибутивов поддерживалась и "старая" номенклатура. То есть все тот же дисковый раздел из примера можно было обозвать просто — /dev/hda1. В отличие от первого случая, это будет уже другой файл — символическая ссылка на истинный файл устройства,
/dev/ide/host0/bus0/target0/lun0/part1.
Однако "ссылочное" именование устройств проходило не всегда, в некоторых ситуациях приходилось прибегать к полной нотации по правилам devfs.

Помимо неудобоваримых имён файлов устройств, devfs имела и другие недостатки. В частности, она таки и не избавила окончательно от проблем при работе с устройствами "горячего" подключения. И потому просуществовала она в Linux'е недолго, не успев даже вытеснить полностью статическую систему создания файлов устройств.

На смену devfs пришёл механизм udev. В детали его вдаваться здесь не будем (на сей предмет будут специальные страницы). Врамках же нынешней темы важно, что файлам устройств, в том числе и накопителей, при использовании udev можно давать абсолютно произвольные имена -- достаточно составить соответствующие правила для разных их классов.

Этим немедленно воспользовались разработчики, избавившись от неуклюжей нотации по правилам devfs и вернувшись к традиционным именам файлов дисковых устройств -- типа /dev/hd? для IDE и /dev/sd? для SCSI и внешних носителей. Практически одновременно в обиход вошли диски с интерфейсом SATA -- именно тогда прежние IDE-накопители стали обычно называть PATA-дисками. Будучи не совсем настоящими IDE (или, скорее, совсем не настоящими), SATA-диски также воспринимались системой как SCSI и файлы их устройств именовались аналогично -- /dev/sda, /dev/sdb и так далее. Однако здесь история номенклатуры накопителей заканчивается -- пора переходить к современному её состоянию.


Теги: ,