Прежде чем начать о монтировании файловых систем, мы должны поговорить о файлах-устройствах. Этим мы и займемся.
— Глава 1. Файлы-устройства —
В разделе про учетные записи и файлы мы уже упоминали об одном из типов файлов - устройствах. Познакомимся с ними поближе.
- Что такое файл устройства?
Очень необычная особенность UNIX-систем - все устройства в ней представлены файлами. Делается это для того, чтобы программы могли работать с устройством также, как с обычным файлом, используя те же системные вызовы. Разумеется, само устройство не хранится в файловой системе, поэтому команды передаются не ей. Вместо этого команды чтения / записи / перемещения текущей позиции передаются драйверу этого устройства, он выполняет соответствующие действия и возвращает их результат. В результате чтение / запись производятся не с файлом-устройством, а с самим устройством, которому соответствует этот файл.
- Тип устройства
В UNIX все устройства делятся на 2 класса - Символьные и Блочные. То есть нет такого типа файла - “устройство”, а есть только “символьное устройство” и “блочное устройство”. Эти 2 класса - это разные типы файлов:
- Символьным (char-device)
Обмен данными с таким устройством осуществляется по одному байту. К таким устройствам можно отнести устройства ввода / вывода. В них драйвер сразу читает или пишет данные, как только они поступили. Поэтому буфер для хранения данных не требуется.
- Блочным (block-device)
Такие устройства возвращают / записывают данные только блоками определенного размера. Например, драйвер не может записать 2-3 байта на жесткий диск - для этого он должен прочитать целый блок данных, размером в 512 байт (сектор), изменить в нем эти 2-3 байта и записать сектор на диск.
Выходит что для чтения / записи небольшой порции данных нужно прочитать / записать БОЛЬШУЮ порцию данных (целый блок). Поэтому драйвер блочного устройства проводит буферизированные операции чтения / записи, сохраняя в памяти (или в кеше устройства) содержимое блоков, к которым чаще всего происходит обращение и периодически записывая их обратно на устройство (синхронизация).
P.S. Во FreeBSD есть оба типа устройств, но все они называются просто устройствами. Это выражается в том, что какой бы тип устройства не был (символьный или блочной), система все равно вернет значение “символьный”.
- Открываем устройство
Некоторые устройства возможно открыть только для чтения или только для записи. Например, клавиатура - устройство ввода информации. Поэтому файл-клавиатуру вы можете открыть только для чтения (при открытии для записи функция возвратит ошибку). Дисплей - устройство вывода информации. Поэтому его вы можете только писать в него данные.
На устройства хранения информации можно как писать данные, так и читать с них. Поэтому такие файлы можно открыть как для чтения, так и для записи.
В большинстве случаев открывать файл-устройство может только учетная запись root (т.к. все устройства принадлежат ему).
— Глава 2. Аттрибуты устройств —
- Аттрибуты устройства
Аттрибуты файлов-устройств интерпритируются системой совсем по-другому:
* Имя драйвера, который работает с устройством.
Записано вместо СОДЕРЖИМОГО ФАЙЛА.
* Старший номер (от 0 до 255)
По старшему номеру можно определить тип устройства. Например, вот номера для Символьных устройств в одной из Linux-систем:
1 - Оперативная память
4 - Виртуальные терминалы
5 - Консоли (мониторы)
6 - Принтер с параллельным разъемом (то есть тот, который и предназначен для принтера)
13 - Устройство ввода
14 - Звуковое устройство (системный динамик, колонки, савбуфер)
180 - USB-концентратор
189 - USB-разъем (usb-device)
А вот - для Блочных устройств:
1 - RAM-диск (файловая система в оперативной памяти)
2 - Дисковод гибких дисков
3 - Первый IDE-контроллер для жестких дисков
8 - SCSI-контроллер (единственный)
22 - Второй IDE-контроллер для жестких дисков
254 - Карта всех устройств
Разумеется, все эти номера специфичны для платформы IBM PC, так как на моделях другой архитектуры устройства могут быть совсем другие. Список старших номеров блочных и символьных устройств, известных ядру, записан в файле /proc/devices. Также номера могут отличаться в разных клонах UNIX (но не очень сильно).
* Младший номер (от 0 до 255)
Поскольку устройств одного типа может быть несколько, то младший номер определяет номер этого устойства среди всех устройств данного типа.
Команда file при встрече с файлом устройства выводит на экран словесное описание класса устройства (символьное или блочное), а затем старший номер устройства, и через палочку - младший номер устройства.
Старший и младший номер записаны вместо РАЗМЕРА ФАЙЛА. Это вы можете увидеть, используя команду ‘ls -l’ с файлом-устройством:
brw-rw---- 1 root disk 3, 1 2009-03-02 16:38 /dev/hda1
Вместо размера файла записаны 2 числа: первое - старший номер, второе - младший номер. Причем система возвращает размер файла как обычно, просто программа ls, встретив файл-устройство, разбивает Размер Файла на 2 числа.
— Глава 3. Имена файлов устройств —
Здесь я перечислю наиболее употребительные имена файлов-устройств в Linux и FreeBSD, а также о правилах их образования. Здесь не будут указаны устройства, являющиеся носителями информации (для этого предназначен другой раздел). Все устройства находятся в /dev, поэтому я пишу только имя файла. Буква ‘N’ обозначает число (может состоять из неск. цифр).
- Устройства ввода
kbd - Клавиатура
sysmouse, mouse - Мышь
- Устройства вывода
console - Главный монитор (подключенный локально к компьютеру)
ttyN, pttyN - Терминал
null, zero - Черная дыра (все, что сюда пишется, бесследно пропадает)
- Память
kmem - оперативная память (такая, какая она есть)
mem - память после виртуальной трансляции виртуа
- Прочее
audio - системный динамик (спикер)
— Глава 4. Создание устройства —
По старшему и младшему номеру файла операционная система определяет - какому из установленных устройств оно соответствует. Если вы установили новое устройство или вручную создаете систему, вам нужно уметь создавать файлы-устройства.
Операционная система по этим номерам идентифицирует устройство. Среди устройств одного типа есть правила их нумерации. Н-р, у виртуальных терминалов (/dev/ttyXX), и физических разделов на жестком диске (/dev/hdaXX) младшему номеру устройства соответствует число в конце имени - XX). Тем самым, старший и младший номер однозначно идентифицируют устройство.
- mknod
Используется для создания файлов устройств, а также для создания именованных каналов (но об этом не будем).
Для создания устройств используется след. синтаксис:
mknod [<Опции>] <Имя> <Тип> <Старший> <Младший>
Создается файл-устройство с указанным <именем>, <старшим> и <младшим> номером. В качестве <Типа> устройства может быть указано:
c или u - символьное
b - блочное уст-во
Например, эта команда создает файл, соответствующий 2-ей файловой системе на первом из подключенных IDE-устройств:
mknod /dev/hda2 b 3 2
3 - это старший номер, соответвующий IDE-устройствам.
Опции:
-m <Режим>
Установить права доступа для созданного файла (как в chmod).
–help
–version
Вывести встроенную справку и номер версии программы.
- MAKEDEV
В папке /dev очень часто находится скрипт MAKEDEV. Как видно из названия - он предназначен для создания файлов-устройств. Это большой скрипт, он использует программы chmod, chgrp и вышеупомянутую mknod. Он анализирует имя создаваемого файла и сам устанавливает нужные старший и младший номер. Этот скрипт я не буду описывать - разберитесь с ним сами через мануалы.