Понимание / dev и его подкаталогов и файлов

53
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Мне было интересно, если все файлы в /devи его подкаталогах все файловые дескрипторы устройств?
  2. Почему так много ссылок друг от друга? Например, /dev/fd/0, /dev/stdin, /proc/self/fd/0все ссылки на /dev/pts/2.
  3. Если lв lrwx------средней ссылке, что значит cв crw--w---- ?
Тим
источник
3
И чтобы ответить на вопрос № 3, c обозначает символьное устройство или символ спец . б обозначает блок спец .
felixphew

Ответы:

79

Почти все файлы /devявляются файлами устройств . В то время как при чтении и записи в обычный файл хранятся данные на диске или в другой файловой системе, доступ к файлу устройства связывается с драйвером в ядре, которое обычно, в свою очередь, связывается с частью аппаратного обеспечения (аппаратное устройство, отсюда и название).

Существует два типа файлов устройств: блочные устройства (обозначенные bкак первый символ на выходе ls -l) и символьные устройства (обозначенные c). Различие между блочными и символьными устройствами не является полностью универсальным. Блочные устройства - это, например, диски, которые ведут себя как большие файлы фиксированного размера: если вы записываете байт с определенным смещением, а затем читаете с устройства с этим смещением, вы получаете этот байт обратно. Символьные устройства - это почти все остальное, где запись байта имеет некоторый непосредственный эффект (например, он передается по последовательной линии), а чтение байта также имеет некоторый непосредственный эффект (например, чтение из последовательного порта).

Значение файла устройства определяется его номером, а не его именем (имя имеет значение для приложений, но не для ядра). На самом деле это два числа: основной номер указывает, какой драйвер отвечает за данное устройство, а младший номер позволяет драйверу управлять несколькими устройствами¹. Эти цифры появляются в ls -lсписке, где вы обычно найдете размер файла. Например, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sdaэто устройство старшее 8, младшее 0.

Некоторые файлы устройств /devне соответствуют аппаратным устройствам. Тот, который существует в каждой системе Unix, является /dev/null; запись в него не имеет никакого эффекта, и чтение из него никогда не возвращает никаких данных. Это часто удобно в сценариях оболочки, когда вы хотите игнорировать вывод команды ( >/dev/null) или запустить команду без ввода ( </dev/null). Другими распространенными примерами являются /dev/zero(который возвращает нулевые байты до бесконечности ) /dev/urandom(который возвращает случайные байты до бесконечности ).

Некоторые файлы устройств имеют значение, которое зависит от процесса, который обращается к нему. Например, /dev/stdinобозначает стандартный ввод текущего процесса; Открытие из примерно имеет тот же эффект, что и открытие исходного файла, который был открыт как стандартный ввод процесса. Несколько аналогично, /dev/ttyобозначает терминал, к которому подключен процесс. В настоящее время в Linux /dev/stdinи друзья реализованы не как символьные устройства, а как символические ссылки на более общий механизм, позволяющий ссылаться на каждый дескриптор файла (в отличие от 0, 1 и 2 в традиционном методе); Например /dev/stdin, это символическая ссылка на /proc/self/fd/0. Смотрите Как / dev / fd относится к / proc / self / fd /? ,

Вы найдете несколько символических ссылок под /dev. Это может происходить по историческим причинам: файл устройства был перемещен из одного имени в другое, но некоторые приложения все еще используют старое имя. Например, /dev/scd0это символическая ссылка на /dev/sr0Linux; оба обозначают первое устройство CD. Еще одна причина для символических ссылок является организация: под Linux, вы найдете ваши жесткие диски и разделы в нескольких местах: /dev/sdaи /dev/sda1и друзей (каждый диск обозначен буквой произвольной, и разделы в соответствии с расположением разделов), /dev/disk/by-id/*(диски обозначаются а уникальный серийный номер), /dev/disk/by-label/*(разделы с файловой системой, обозначенные меткой, выбранной человеком); и более. Символьные ссылки также используются, когда родовое имя устройства может быть одним из нескольких; например/dev/dvdэто может быть символическая ссылка /dev/sr0или ссылка на /dev/sr1вас, если у вас два устройства чтения компакт-дисков, а второе - устройство чтения DVD-дисков по умолчанию.

Наконец, есть несколько других файлов, которые вы можете найти /devпо традиционным причинам. Вы не найдете то же самое в каждой системе. В большинстве устройств /dev/logэто сокет, который программы используют для передачи сообщений журнала. /dev/MAKEDEVскрипт, который создает записи в /dev. В современных системах Linux записи в /dev/создаются автоматически с помощью udev , устаревшего MAKEDEV.

Actually На самом деле это не так в Linux, но эта деталь имеет значение только для разработчиков драйверов устройств.

Жиль "ТАК - перестань быть злым"
источник
Спасибо! Под "значением файла устройства определяется его номер", вы имеете в виду его дескриптор файла?
Тим
@Tim: Нет, в ls -lсписке указаны цифры, в которых вы обычно найдете размер файла до даты, например, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ это устройство старшее 8, младшее 0. Номера устройств на практике встречаются не часто, я просто упомянул их, чтобы сказать что делает устройство устройством (главное, это не имя файла). Номер дескриптора файла имеет значение только в конкретном процессе.
Жиль "ТАК - перестань быть злым"
Нет, открытие /dev/stdin(=> /proc/self/fd/0) в Linux не имеет такого же эффекта, как дублирование стандартного ввода. Чтобы увидеть разницу, su - non_root_userзатем exec 5</dev/stdinпроизойдет сбой с «Отказано в доступе», но exec 5<&0все получится. И это не только то , что новый FD будет открыт с разными флагами, все о файле объекта ( «открытого файла Описан Тион » в POSIX жаргоне) будет отличаться (указатель файла смещения, не / режим блокировки, и т.д.).
Мосви
14
  1. Да - напрямую или в виде символических ссылок - вот /dev/для чего.
  2. Для различных целей: иногда для совместимости схем именования, иногда это необходимо для рабочей среды - как в примере /dev/stdin. Это не указывает статически на /dev/pts/2или любой другой - просто переключиться на другой терминал , и вы увидите. /dev/stdinстандартный ввод вашей текущей терминальной сессии. Это также пример того, почему это должна быть символическая ссылка.
  3. Смотрите man mknodи info coreutils 'mknod invocation'. В общем, cобозначает тип устройства характер.
rozcietrzewiacz
источник
3
«Стандартный ввод вашего текущего терминального сеанса» немного неоднозначен. /dev/stdinотносится к стандартному вводу процесса, который его откроет. Все в нем /proc/$pidзависит от процесса и /proc/selfпредставляет собой магическую символическую ссылку, указывающую на собственные данные процесса.
Стефан Гименес
11

На первый вопрос, они не дескрипторы файлов, а файлы устройств. (он же "узлы разработки")

Эти файлы связаны с драйвером, который обрабатывает устройство с использованием старших и младших номеров. (Например, «136, 2» в ваших lsвыходных данных относится к драйверу устройства, связанному с основным номером 136, и указывает устройство № 2, обрабатываемое этим драйвером.)

Первая буква вывода ls -l- тип устройства в случае файлов устройства. Если это «c», то это символьное устройство или «b», это блочное устройство.

По второму вопросу обратитесь к приведенному выше ответу от rozcietrzewiacz.

rulingminds
источник
1
Ссылка «Введение в драйверы устройств» не работает.
Ленивец