- Концепция Linux — всё есть файл
- Всё есть файл
- 1. Устройства Linux — это файлы
- 2. Информация о ядре — тоже файлы
- 3. И настройки ядра — файлы
- 4. Сокеты — странные, но файлы
- Выводы
- Device file (Русский)
- Блочные устройства
- Имена блочных устройств
- SCSI
- NVMe
- MMC
- Привод оптических дисков SCSI
- virtio-blk
- Разделы
- Инструменты
- lsblk
- wipefs
- Псевдоустройства
- Смотрите также
Концепция Linux — всё есть файл
В программировании для упрощения разработки программ принято использовать различные шаблоны, паттерны и абстракции. Разработчики Linux не делали исключений и одна из таких абстракций, это основная концепция Linux — всё есть файл. Эта концепция была перенята от Unix. Она была выбрана для того чтобы предоставить простой доступ ко всем возможностям операционной системы не разрабатывая специальных интерфейсов.
К почти любой возможности можно обратиться как к файлу, попытаться открыть его с помощью текстового редактора, записать туда данные или сделать что-либо подобное. В этой статье мы подробно рассмотрим что на деле означает эта концепция и немного поэкспериментируем с ней.
Всё есть файл
Давайте сначала разберемся как вообще это может работать. В Linux есть такое понятие как корневая файловая система. В качестве неё монтируется раздел жесткого диска, на котором установлен Linux. В различные подпапки подключаются другие реальные разделы жесткого диска, например, домашний раздел подключается в папку /home, а загрузочный в папку /boot. Но существуют не только реальные файловые системы, но и виртуальные файловые системы, созданные ядром, например в папку /proc монтируется файловая система procfs, которая позволяет получить доступ к параметрам ядра, а в папку /dev монтируется devfs содержащая устройства, подключённые к компьютеру и тоже в виде файлов.
Конечно, в этих файловых системах размещены не совсем обычные файлы. В статье типы файлов Linux мы рассматривали все существующие типы файлов. Если вы посмотрите на обычный файл, например, /etc/passwd с помощью утилиты file, то увидите информацию об этом файле:
Это текстовый файл в реальной файловой системе и вы можете открыть его с помощью текстового редактора, посмотреть содержимое или записать туда данные.
1. Устройства Linux — это файлы
Давайте начнём с устройств. В каталог /dev монтируется файловая система devfs и тут находятся все подключённые к Linux устройства, а также некоторые интерфейсы для доступа к возможностям ядра:
Если попытаться посмотреть информацию, например, о файле /dev/sda1, то утилита сообщит нам что это блочный файл:
Это значит, что такой файл можно открыть с помощью какого-либо редактора разделов диска и настроить этот диск. Конечно, его можно попытаться посмотреть содержимое файла с помощью cat, но из этого ничего хорошего не выйдет потому что там хранятся двоичные данные:
Работает это и в обратную сторону. Вы можете открыть любой обычный файл в редакторе разделов диска и создать в нём файловую систему вместо его содержимого:
Например, здесь я открыл изображение. Важно отметить что всё содержимое файла будет стёрто.
Ещё в каталоге /dev существуют символьные файлы, например, /dev/random, /dev/null и /dev/zero. Открывая первый вы всегда будете получать случайную последовательность данных, во второй можно записывать любые данные и они никуда не будут сохранены, а третий всегда пустой, если копировать из него данные на какой-нибудь раздел, там всегда будут нули.
2. Информация о ядре — тоже файлы
Информация об операционной системе, ядре и выполняемых в системе процессах находится в директории /proc. Все эти файлы можно посмотреть с помощью утилиты ls:
Например, информация об использовании оперативной памяти размещена в файле /proc/meminfo. Вы можете попытаться посмотреть информацию об этом файле:
Это файл, но утилита сообщает, что он пустой. Однако, если вы попытаетесь прочитать из него данные, то получите вполне интересную информацию о состоянии памяти. Например, откроем его в текстовом редакторе:
Но записать туда ничего не получится, эта файловая система доступна только для чтения. Таких файлов здесь много. Самые интересные из них описаны здесь.
3. И настройки ядра — файлы
Настройки ядра находятся в директории /sys и /proc/sys. Эти файлы можно выводить списком, читать их содержимое и даже записывать новые значения чтобы изменить нужные параметры. Один из самых часто изменяемых файлов — это /proc/sys/net/ipv4/ip_forward. Давайте посмотрим информацию о нём:
Он тоже вроде как пустой. Но в нём содержаться данные:
echo «0» | sudo tee /proc/sys/net/ipv4/ip_forward
Фактически, можно было просто сделать так:
echo «0» > /proc/sys/net/ipv4/ip_forward
Или даже попытаться редактировать файл в текстовом редакторе. Но такая команда не будет работать, если её не выполнить в оболочке суперпользователя. А текстовый редактор обычно пытается сначала создать резервную копию файла, который он будет менять, а ничего создать в этой папке у него не выйдет.
4. Сокеты — странные, но файлы
Для сетевого взаимодействия и взаимодействия между программами используются сокеты. И это тоже файлы, хотя они чуть отличаются от привычных нам файлов. Сокеты используются для того чтобы программно писать и читать их них данные, таким образом программы могут взаимодействовать между собой. Давайте создадим свой сокет. Для этого выполните:
Утилита file сообщит, что это сокет:
Но открыть сокет в текстовом редакторе или с помощью утилиты cat не получится, придется подключится к нему с помощью той же утилиты nc:
После этого любые данные, которые вы будете набирать в одной консоли, будут отображаться в другой. Но это всё ещё файл, потому что вы можете вывести список сокетов из определённой папки с помощью ls.
Выводы
Вот так и работает концепция всё есть файл в Linux. Все возможные функции операционной системы представлены в виде файлов и это удобно, потому что для доступа к любой из функций не надо писать отдельный инструмент, а можно использовать уже существующие и проверенные программы. Такие утилиты для работы с файлами как cat, ls и echo справляются в большинстве случаев.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Device file (Русский)
Состояние перевода: На этой странице представлен перевод статьи Device file. Дата последней синхронизации: 8 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Специальный файл устройства, или просто файл устройства (англ. special device file) — это один из типов файлов в UNIX-подобной операционной системе. Специальные файлы устройств содержат данные, необходимые операционной системе для взаимодействия с физическими устройствами, такими как диски и дисководы, принтеры и факсы и т. п. Фактически, специальные файлы устройств являются указателями на драйверы устройств, и когда процесс обращается к файлу устройств, он по сути работает с драйвером этого устройства.
В Linux они располагаются в каталоге /dev в соответствии с Filesystem Hierarchy Standard.
В Arch Linux файлами устройств управляет udev.
Блочные устройства
Блочное устройство — это специальный файл, обеспечивающий буферизованный доступ к устройству.
Имена блочных устройств
Начало имени устройства указывает на подсистему ядра, используемую для управления этим блочным устройством.
Важно: Дескрипторы имени ядра для блочных устройств не являются постоянными и могут меняться при каждой загрузке, стоит избегать их использования в файлах конфигурации.
SCSI
Устройства хранения, такие как жёсткие диски, SSD и флэш-накопители, которые поддерживают команду SCSI (SCSI, SAS, UASP), соединение ATA (PATA, SATA) или USB Mass Storage, обрабатываются драйвером SCSI. Все они имеют одну и ту же схему именования.
Имя этих устройств начинается с sd . Затем следует строчная буква, начиная с a для первого обнаруженного устройства ( sda ), b для второго ( sdb ) и так далее.
- /dev/sda — устройство a , первое обнаруженное устройство.
- /dev/sde — устройство e , пятое обнаруженное устройство.
NVMe
Имя устройств хранения, подключенных через NVM Express (NVMe), начинается с nvme . Затем следует порядковый номер контроллера устройства: nvme0 для первого обнаруженного контроллера NVMe, nvme1 для второго и так далее. Далее идет буква «n» и число, начинающееся с 1 , обозначающее устройство на контроллере: nvme0n1 для первого обнаруженного устройства на первом обнаруженном контроллере, nvme0n2 для второго обнаруженного устройства на первом обнаруженном контроллере и так далее.
- /dev/nvme0n1 — устройство 1 на контроллере 0 , первое обнаруженное устройство на первом обнаруженном контроллере.
- /dev/nvme2n5 — устройство 5 на контроллере 2 , пятое обнаруженное устройство на третьем обнаруженном контроллере.
MMC
SD-карты, карты MMC и устройства хранения данных eMMC обрабатываются драйвером mmc , и имена этих устройств начинаются с mmcblk . Затем следует порядковый номер устройства: mmcblk0 для первого обнаруженного устройства, mmcblk1 для второго и так далее.
- /dev/mmcblk0 — устройство 0 , первое обнаруженное устройство.
- /dev/mmcblk4 — устройство 4 , пятое обнаруженное устройство.
Привод оптических дисков SCSI
Имена приводов оптических дисков, которые подключаются с через интерфейс, поддерживаемый драйвером SCSI, начинаются с sr . Затем следует порядковый номер устройства: sr0 для первого обнаруженного устройства, sr1 для второго и так далее.
Udev также предоставляет /dev/cdrom , который является символической ссылкой на /dev/sr0 . Имя всегда будет cdrom независимо от поддерживаемых приводом типов дисков или вставленного носителя.
- /dev/sr0 — привод оптических дисков 0 , первый обнаруженный.
- /dev/sr4 — привод оптических дисков 4 , пятый обнаруженный.
- /dev/cdrom — символическая ссылка на /dev/sr0 .
virtio-blk
Имена дисков, подключенных к интерфейсу блочного устройства virtio (virtio-blk), начинаются с vd . Затем следует строчная буква, начиная с a для первого обнаруженного устройства ( vda ), b для второго ( vdb ) и так далее.
Примечание: Не путайте virtio-blk с virtio-scsi, который эмулирует контроллер SCSI и, таким образом, следует соглашению об именах SCSI.
- /dev/vda — устройство a , первое обнаруженное устройство.
- /dev/vde — устройство e , пятое обнаруженное устройство.
Разделы
Имена разделов представляют собой комбинацию имени устройства диска и номера раздела, присвоенного им в таблице разделов: /dev/устройствораздел . Для дисков, имя устройства которых заканчивается цифрой, имя диска и номер раздела разделяются буквой «p»: /dev/устройствоpраздел .
- /dev/sda1 — раздел 1 на устройстве /dev/sda .
- /dev/nvme2n5p3 — раздел 3 на устройстве /dev/nvme2n5 .
- /dev/mmcblk3p4 — раздел 4 на устройстве /dev/mmcblk3 .
- /dev/vda1 — раздел 1 на устройстве /dev/vda .
- /dev/loop0p2 — раздел 2 на устройстве /dev/loop0 .
Инструменты
lsblk
Пакет util-linux предоставляет утилиту lsblk(8) , которая выводит список блочных устройств, например:
NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 vfat C4DA-2C4D /boot ├─sda2 swap 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 [SWAP] └─sda3 ext4 56adc99b-a61e-46af-aab7-a6d07e504652 /
Этот пример показывает только одно доступное устройство ( sda ), которое имеет три раздела (от sda1 до sda3 ), каждый из которых имеет свою файловую систему.
wipefs
wipefs может отображать сигнатуры файловой системы, RAID или таблицы разделов (магические строки) с указанного устройства и стирать их, чтобы сделать невидимыми для libblkid(3) . Он не стирает ни сами файловые системы, ни какие-либо другие данные с устройства.
Смотрите wipefs(8) для получения дополнительной информации.
Например, чтобы стереть все сигнатуры с устройства /dev/sdb и создать резервную копию ~/wipefs-sdb-смещение.bak для каждой сигнатуры:
Псевдоустройства
Эти файлы устройств не соответствуют никакому физическому устройству.