Устройства: В Linux устройство является специальным «оборудованием» (или кодом, эмулирующим его), которое представляет методы для ввода или вывода информации (IO — Input/Output). Например, клавиатура — устройство для ввода. Жесткий диск — устройства для ввода (запись) и вывода (чтение). Большинство устройств в Linux'е представлено как файлы в особой файловой системе (за исключением сетевых карт). Эти файлы хранятся в каталоге /dev, куда к ним обращается система для выполнения задач, связанных с вводом/выводом.
Грубо говоря, устройства можно разделить на две категории: символьные и блочные. Символьные устройства вводят/выводят по символам. Наиболее показательным примером служит клавиатура, у которой нажатие каждой клавиши формирует символ, передаваемый компьютеру. Мышь работает немного по-другому. Каждое движение или нажатие на кнопку отправляет символ на /dev/mouse.
Блочные устройства считывают данные большими объемами. Примерами служат устройства для хранения данных, такие как IDE жесткие диски (/dev/hd), SCSI жесткие диски (/dev/sd) и CD-ROM'ы (например, /dev/cdrom0 — символическая ссылка на первый CD-ROM). Операции ввода/вывода блочные устройства проводят с определенными блоками данных, что позволяет работать с большими объемами информации более эффективно.
Названия устройств: Устройства часто называются путем сокращения имен представляемого ими оборудования. Устройства с именами /dev/fb представляют буферы фреймов (frame buffers) для графики. Устройства /dev/hd представляют IDE жесткие диски (hard disks). В некоторых случаях для пояснения того, чем является устройство, используются символические ссылки: например, /dev/mouse, устройство, представляющее мышь, может быть прилинковано к последовательному, USB или PS2 устройству, в зависимости от железа. Символическая ссылка помогает и человеку, и машине разобраться, какое из устройств — мышь.
Иногда бывает несколько устройств одного типа. Например, у машины два ATAPI CD-ROM'а. Каждому CD-приводу нужен файл в /dev. В таком случае, возможен вариант, что /dev/cdrom0 будет первым CD-ROM'ом, а /dev/cdrom1 — вторым.
С именами жестких дисков немного сложнее. Название устройства жесткого диска зависит от типа диска, его позиции и раздела (partition'а). Первый жесткий диск может быть назван /dev/hda, где часть «hd» означает, что это IDE жесткий диск, а «a» показывает, что это первый жесткий диск. Тогда /dev/hdb будет ссылаться на второй жесткий диск. Каждый жесткий диск разбит на разделы. Первый раздел первого жесткого диска получит название /dev/hda1, где единица в конце обозначает номер раздела. Обратите внимание на то, что, если индексы некоторых устройств (например, /dev/cdrom0) могут начинаться с нуля, то индекс устройств с разделами обычно начинается с единицы. Вот примерный список файлов в /dev для двух IDE жестких дисков:
/dev/hda; /dev/hda1; /dev/hda2; /dev/hda3; /dev/hda4; /dev/hdb; /dev/hdb1; /dev/hdb2; /dev/hdb3.
SCSI жесткие диски используют /dev/sd вместо /dev/hd, но все остальное выглядит также. /dev/sda1 ссылается на первый раздел первого SCSI жесткого диска.
Специальные устройства: Существует несколько специальных устройств, которые порой бывают очень полезны: /dev/null, /dev/zero, /dev/full и /dev/random.
Нулевое устройство, /dev/null представляет собой что-то типа «мусорной корзины». Часто некоторые программы выводят множество ненужной информации. Shell-скрипты обычно используют /dev/null для того, чтобы пользователь не видел ненужных ему сообщений от вызываемых утилит. Вот пример вызова модуля ядра с выводом всех сообщений в /dev/null.
$ modprobe cipher-twofish > /dev/null
/dev/zero близок к /dev/null. Как и /dev/null, устройство может быть использовано для блокирования вывода ненужной информации, но чтение /dev/zero возвращает \0 символы (чтение /dev/null возвращает символы end-of-file — конец файла). Поэтому /dev/zero обычно используется для создания пустых файлов.
$ dd if=/dev/zero of=/my-file bs=1k count=100
Такая команда (см. выше) создаст файл размером в 100 кб, наполненный null-символами.
/dev/full служит для имитации «полного» устройства. Запись в /dev/full сопровождается ошибкой. «Полное» устройство полезно для того, чтобы посмотреть, как тестируемое приложение будет себя вести при попытки доступа к заполненному устройству (т.е. например, к жесткому диску, на котором не осталось места).
$ cp test-file /dev/full cp: writing `/dev/full": No space left on device $ df -k /dev/full file system 1k-blocks Used Available Use% Mounted on /dev/full
0 0 0 - Устройства /dev/random и /dev/urandom создают «случайные» данные. Хотя вывод обоих может показаться абсолютно случайным, /dev/random более случаен чем /dev/urandom. /dev/random создает случайные символы, основываясь на «окружающем шуме». Так как количество этого случайного шума ограничено, /dev/random работает медленно и может временно останавливаться для дальнейшего сбора данных. /dev/urandom использует тот же шум, что и /dev/random, но если случайных данных больше нет, оно создает псевдо-случайные данные. Таким образом увеличивается его скорость, но уменьшается безопасность.
Старая файловая система /dev: Раньше файловая система /dev была частью обычной файловой системы. Она состояла из специальных файлов, созданных однажды (обычно при установке системы) и сохраненных на жестком диске.
В старых системах файловая система /dev должна содержать информацию обо всех устройствах, которые могут быть подключены к компьютеру. Из-за этого /dev была слишком большой — приходилось хранить сведения о множестве жестких дисков, дисководов и т.п. Ранее мы рассматривали список разделов жесткого диска hdb. В старой файловой системе /dev приходилось содержать файлы с /dev/hdb1 до /dev/hdb11. Чтобы выяснить, какие устройства действительно привязаны к разделам жесткого диска (если помните, у меня всего три раздела на hdb), нужно вызвать специальную утилиту. Команда "file -s hdb*" поможет в этом разобраться:
$ file -s /dev/hdb? /dev/hdb1: Linux/i386 ext2 file system /dev/hdb2: Linux/i386 ext2 file system /dev/hdb3: Linux/i386 ext2 file system /dev/hdb4: empty /dev/hdb5: empty /dev/hdb6: empty /dev/hdb7: empty /dev/hdb8: empty /dev/hdb9: empty
Если указанного файла устройства не было, приходилось его создавать с помощью mknod или другой программы (типа MAKEDEV). Хотя «старый способ» работал, он был сложен и неудобен.
DevFS: В ядрах 2.4.x была представлена альтернативная дисковая файловая система /dev. Эта альтернатива, DevFS, подключала код нового устройства в ядро. В DevFS файловая система /dev создается во время каждого запуска компьютера и сохраняется в оперативной памяти, а не на жестком диске. При использовании этой модели пропадает нужда в поддержке списка всех возможных устройств, а когда появляется новое устройство, ядро просто делает для него запись в /dev. Если же устройствам нужна особая настройка в DevFS, существует конфигурационный файл (обычно /etc/devfsd.conf).