В программировании для упрощения разработки программ принято использовать различные шаблоны, паттерны и абстракции. Разработчики Linux не делали исключений и одна из таких абстракций, это основная концепция Linux — всё есть файл. Эта концепция была перенята от Unix. Она была выбрана для того чтобы предоставить простой доступ ко всем возможностям операционной системы не разрабатывая специальных интерфейсов.

К почти любой возможности можно обратиться как к файлу, попытаться открыть его с помощью текстового редактора, записать туда данные или сделать что-либо подобное. В этой статье мы подробно рассмотрим что на деле означает эта концепция и немного поэкспериментируем с ней.

Всё есть файл

Давайте сначала разберемся как вообще это может работать. В Linux есть такое понятие как корневая файловая система. В качестве неё монтируется раздел жесткого диска, на котором установлен Linux. В различные подпапки подключаются другие реальные разделы жесткого диска, например, домашний раздел подключается в папку /home, а загрузочный в папку /boot. Но существуют не только реальные файловые системы, но и виртуальные файловые системы, созданные ядром, например в папку /proc монтируется файловая система procfs, которая позволяет получить доступ к параметрам ядра, а в папку /dev монтируется devfs содержащая устройства, подключённые к компьютеру и тоже в виде файлов.

Конечно, в этих файловых системах размещены не совсем обычные файлы. В статье

Это текстовый файл в реальной файловой системе и вы можете открыть его с помощью текстового редактора, посмотреть содержимое или записать туда данные.

1. Устройства Linux — это файлы

Давайте начнём с устройств. В каталог /dev монтируется файловая система devfs и тут находятся все подключённые к Linux устройства, а также некоторые интерфейсы для доступа к возможностям ядра:

ls -l /dev

Если попытаться посмотреть информацию, например, о файле /dev/sda1, то утилита сообщит нам что это блочный файл:

file /dev/sda

 

Это значит, что такой файл можно открыть с помощью какого-либо редактора разделов диска и настроить этот диск. Конечно, его можно попытаться посмотреть содержимое файла с помощью cat, но из этого ничего хорошего не выйдет потому что там хранятся двоичные данные:

cat /dev/sda

Работает это и в обратную сторону. Вы можете открыть любой обычный файл в редакторе разделов диска и создать в нём файловую систему вместо его содержимого:

Например, здесь я открыл изображение. Важно отметить что всё содержимое файла будет стёрто.

Ещё в каталоге /dev существуют символьные файлы, например, /dev/random, /dev/null и /dev/zero. Открывая первый вы всегда будете получать случайную последовательность данных, во второй можно записывать любые данные и они никуда не будут сохранены, а третий всегда пустой, если копировать из него данные на какой-нибудь раздел, там всегда будут нули.

2. Информация о ядре — тоже файлы

Информация об операционной системе, ядре и выполняемых в системе процессах находится в директории /proc. Все эти файлы можно посмотреть с помощью утилиты ls:

ls -l /proc

Например, информация об использовании оперативной памяти размещена в файле /proc/meminfo. Вы можете попытаться посмотреть информацию об этом файле:

file /proc/meminfo

Это файл, но утилита сообщает, что он пустой. Однако, если вы попытаетесь прочитать из него данные, то получите вполне интересную информацию о состоянии памяти. Например, откроем его в текстовом редакторе:

vi /proc/meminfo

Но записать туда ничего не получится, эта файловая система доступна только для чтения. Таких файлов здесь много. Самые интересные из них описаны

 

Он тоже вроде как пустой. Но в нём содержаться данные:

cat /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. Сокеты — странные, но файлы

Для сетевого взаимодействия и взаимодействия между программами используются сокеты. И это тоже файлы, хотя они чуть отличаются от привычных нам файлов. Сокеты используются для того чтобы программно писать и читать их них данные, таким образом программы могут взаимодействовать между собой. Давайте создадим свой сокет. Для этого выполните:

nc -lU socket.sock

Утилита file сообщит, что это сокет:

Но открыть сокет в текстовом редакторе или с помощью утилиты cat не получится, придется подключится к нему с помощью той же утилиты nc:

nc -U socket.sock

После этого любые данные, которые вы будете набирать в одной консоли, будут отображаться в другой. Но это всё ещё файл, потому что вы можете вывести список сокетов из определённой папки с помощью ls.

Выводы

Вот так и работает концепция всё есть файл в Linux. Все возможные функции операционной системы представлены в виде файлов и это удобно, потому что для доступа к любой из функций не надо писать отдельный инструмент, а можно использовать уже существующие и проверенные программы. Такие утилиты для работы с файлами как cat, ls и echo справляются в большинстве случаев.

Источник: losst.ru

Похожие записи