Одной из определяющих особенностей Linux и UNIX-подобных операционных систем является понятие «Everything is a File», что в переводе означает «Всё является файлом». А если что-то и не является таковым, то оно должно выполняться в системе как процесс. Конечно, данное обобщение довольно грубо упрощает реальную суть происходящего, но его понимание поможет вам лучше разобраться с тем, как работает Linux.
Everything is a File
Linux не делает различий между файлами и каталогами, но каталоги выполняют одну очень важную работу — хранят другие файлы, создавая определенную иерархию для их удобного расположения. Многие вещи, которые находятся в файловой системе Linux, на самом деле не являются «обычными» файлами. Есть т.н. «специальные» файлы, которые представляют аппаратные компоненты (через которые Linux взаимодействует с «железом» компьютера), системную информацию и другие вещи, вплоть до генератора случайных чисел.
Эти «специальные» файлы могут быть расположены в отдельных каталогах, таких как /dev (содержит специальные файлы, представляющие устройства) или /proc (содержит специальные файлы, представляющие информацию о системе и её процессах). Все эти «файлы», в более широком смысле данного слова, имеют стандартные атрибуты Linux-файлов, такие как владелец, права доступа, и к ним могут быть применены классические утилиты Linux.
Например, воспользуемся командой cat, чтобы посмотреть содержимое /etc:
$ cat /etc
Как видите, команда cat
сообщает, что /etc является каталогом. Теперь давайте попробуем считать какой-нибудь файл, который отображается в списке, например, /usr/lib/systemd/systemd-ac-power:
Воспользуемся той же командой cat
:
$ sudo cat /usr/lib/systemd/systemd-ac-power
Мы получили полную абракадабру. А всё потому, что systemd-ac-power является бинарным файлом. Он отображается в файловой системе, как другие файлы, но открыть и посмотреть его содержимое (как обычного текстового файла) мы не можем.
Каталог /proc
Предположим, мы хотим найти информацию о процессоре. Каталог /proc имеет специальный файл — /proc/cpuinfo, который содержит данную информацию. Мы можем прочитать содержимое этого файла следующей командой:
$ cat /proc/cpuinfo
Или же мы можем открыть файл /proc/cpuinfo в текстовом редакторе и просмотреть его содержимое:
Однако, как уже говорилось выше, файл /proc/cpuinfo на самом деле не является обычным текстовым файлом. Ядро Linux и каталог /proc лишь предоставляют нам эту информацию в виде файла. Данный подход позволяет нам (пользователям) использовать стандартные команды для просмотра и работы с информацией.
Также в каталоге /proc содержатся и другие подобные файлы, например:
/proc/uptime — информация о времени безотказной работы (uptime) ядра Linux. Другими словами, как долго наша система работала без выключения.
/proc/version — информация о версии ядра Linux.
/proc/meminfo — информация о свободной и используемой памяти (как физической, так и виртуальной).
Каталог /dev
В каталоге /dev вы найдете файлы, которые представляют различные аппаратные устройства и специальные объекты. Например, /dev/cdrom — это привод для чтения компакт-дисков, /dev/sda — первый жесткий диск, а /dev/sda1 — первый раздел на первом жестком диске.
Хотите смонтировать свой CD-ROM? Тогда выполните команду mount
и укажите (файл) /dev/cdrom в качестве устройства, которое необходимо смонтировать.
Хотите разделить свой первый жесткий диск на разделы? Запустите утилиту управления дисками и укажите (файл) /dev/sda в качестве жесткого диска, который вы хотите отредактировать.
Хотите отформатировать первый раздел на своем первом жестком диске? Запустите команду форматирования и укажите ей отформатировать (файл) /dev/sda1.
Общим здесь является представление аппаратных устройств (привод для чтения компакт-дисков, жесткий диск) в виде отдельных файлов, которые присутствуют в каталоге /dev. Подобная реализация имеет свои преимущества, например, файловая система обеспечивает согласованное «пространство имен», которое все приложения, команды и утилиты могут использовать для обращения к данным устройствам.
Также каталог /dev содержит не только файлы, представляющие физические устройства. Вот три наиболее примечательных специальных (псевдо-)устройства:
/dev/null — физически этого устройства не существует, но отправляемые в него данные просто исчезают, и вернуть их обратно невозможно.
/dev/random — генератор случайных чисел, к которому вы можете подключиться.
/dev/zero — специальный файл, являющийся источником постоянного потока нулей. При чтении данного файла его конец никогда не достигается.
Так что же «всё является файлом» или нет?
На поверхностном уровне, для нас, как для пользователей Linux, всё представлено в виде файлов (хотя их может и не быть в системе фактически, но они могут отображаться через терминал), а «под капотом» эти файлы разделяются на отдельные категории, например, драйверы устройств (/dev/mouse, /dev/cdrom и пр.), исполняемые файлы (аналоги .exe-файлов в Windows), обычные текстовые файлы и т.д.
Представление данных одно и то же — файл, но сами данные могут быть потоком, устройством, памятью на жестком диске и пр.