Розуміння / dev та його підкаталоги та файли


52
$ 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 означає пристрій символів або спеціальний символ . b позначає блок спеціальний .
felixphew

Відповіді:


78

Майже всі файли, що /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(який повертає нульові байти ad infinitum ) /dev/urandom(який повертає випадкові байти ad infinitum ).

Кілька файлів пристрою мають значення, яке залежить від процесу, який здійснює доступ до нього. Наприклад, /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.

Under Це фактично більше не відповідає Linux, але ця деталь стосується лише драйверів драйверів пристроїв.


Дякую! "Значення файлу пристрою визначається його кількістю", ви маєте на увазі його дескриптор файлу?
Тім

@Tim: Ні, номери відображаються в ls -lсписку, де ви зазвичай знаходите розмір файлу до дати, наприклад brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ цей пристрій має велике значення 8, незначний 0. Номери пристроїв на практиці не часто зустрічаються, я лише згадав їх, щоб сказати що робить пристрій пристроєм (головне, це не назва файлу). Номер дескриптора файлу має значення лише в певному процесі.
Жил 'SO- перестань бути злим'

Ні, відкриття /dev/stdin(=> /proc/self/fd/0) в Linux не має такого ж ефекту, як дублювання стандартного вводу. Щоб побачити різницю, su - non_root_userтоді exec 5</dev/stdinне вдасться "Відмовлено у дозволі", але exec 5<&0це вдасться. І це не тільки те , що новий FD буде відкритий з різними прапорами, все про фото об'єкта ( «відкритого файлу Описано ції » в POSIX жаргоні) буде відрізнятися (покажчик файлу зміщення, що не / режим блокування, і т.д.).
mosvy

14
  1. Так - або безпосередньо, або як символьні посилання - саме тому і /dev/є.
  2. Для різних цілей: іноді для сумісності між схемами іменування, іноді це необхідно для робочого середовища - як у прикладі /dev/stdin. Це не вказує статично на /dev/pts/2будь-який інший - просто перейдіть на інший термінал і побачите. /dev/stdinє стандартним входом вашого поточного сеансу терміналу. Це також приклад, чому це повинно бути симпосиланням.
  3. Дивіться man mknodі info coreutils 'mknod invocation'. Загалом, cрозшифровується як тип пристрою характерного характеру.

3
"стандартне введення поточного сеансу терміналу" є дещо неоднозначним. /dev/stdinвідноситься до стандартного вводу процесу, який його відкриє. Все /proc/$pid, що залежить від процесу, /proc/self- це свого роду магічне посилання, що вказує на власні дані процесу.
Стефан Гіменез

11

Для вашого першого запитання вони не є дескрипторами файлів, це файли пристроїв. (aka "dev nodes")

Ці файли пов'язані з драйвером, який керує пристроєм, використовуючи основні та незначні номери. (Наприклад, "136, 2" у вашому lsвиході посилається на драйвер пристрою, прив'язаний до основного номера 136, і вказує на пристрій №2, яким обробляється цей драйвер.)

Перша літера виводу типу ls -l- це тип пристрою у випадку файлів пристрою. Якщо це "c", це символьний пристрій, або якщо "b", це блоковий пристрій.

Для вашого другого запитання зверніться до вищезгаданої відповіді від rozcietrzewiacz.


1
Здається, посилання "Вступ до драйверів пристроїв" порушено.
Slothworks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.