- Концепция Linux — всё есть файл
- Всё есть файл
- 1. Устройства Linux — это файлы
- 2. Информация о ядре — тоже файлы
- 3. И настройки ядра — файлы
- 4. Сокеты — странные, но файлы
- Выводы
- Строение Linux — часть 2. Принцип «всё есть файл», виды файлов.⚓︎
- Типы файлов⚓︎
- Значение команды⚓︎
- Информация о файлах⚓︎
- LSOF⚓︎
- Опции lsof⚓︎
Концепция 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.
Строение Linux — часть 2. Принцип «всё есть файл», виды файлов.⚓︎
В первой части статьи речь была об общем строении системы. Так сказать, галопом по европам. А в следующих частях строение Linux будет описано подробнее. Каждая статья описывает только одну тему.
Для начала стоит написать о концепции «всё есть файл». Концепция была перенята разработчиками Linux из Unix. Это было сделано для предоставления простого доступа ко всем возможностям ОС, не разрабатывая отдельных костылей. Т.е., преимущество такого принципа в том, что не надо реализовывать отдельный API для каждого устр-ва, в результате чего с ним (с файлом) могут работать все стандартные программы и API-интерфейсы. В Linux есть корневая ФС (корневая файловая система), куда монтируются раздел жёсткого диска, где установлена система, другие разделы, флешки, диски, псевдо-ФС и пр. Посмотрите на файл /etc/os-release :
Самое яркое представление этого принципа — устройства. Просмотрите содержимое каталога /dev:
В этот каталог подключаются все устройства: флеш-карты, мыши, клавиатуры, микрофоны, жёсткие диски и пр.
А теперь просмотрите информацию о каком-нибудь файле в /dev :
В этом файле находятся двоичные данные, поэтому открыть его в каком-то текстовом редакторе бесмыссленно.
Однако, самое главное достоинство Linux в том, что и в обычном файле можно создать файловую систему заместо содержимого файла. Например, тот же файл подкачки /swapfile . Это файл, но с ФС swap .
Все конфиги, находящиеся в директориях /etc , ~/.local , ~/.config — тоже файлы.
Типы файлов⚓︎
- Обыкновенные, которые используются для хранения информации;
- Специальные (для туннелей и устройств);
- Директории (их ещё называют папками или каталогами).
С обычными файлами пользователь работает чаще всего. Это документы, текстовые файлы, музыка, видео и пр.
Для того чтобы просмотреть эти файлы, выполните:
Значение команды⚓︎
- ls — просматривает каталог, а ключ -l добавляет отображение прав на файл. /etc замените на нужную директорию.
- grep «^-» — так как «обычные» файлы обозначаются чертой (в первой колонке вывода ls , где отображаются права на файл), то эта команда выведет только эти файлы по маске ^- .
По поводу специальных файлов. Они обеспечивают обмен информации с ядром, работу с устр-вами и пр. Собственно, делятся ещё на несколько видов:
- Символьные файлы — любые специальные системные, например /dev/null , или периферийные устр-ва (последовательные/параллельные порты). Такие файлы идентифицированы символом c .
- Блочные — периферийные устр-ва, но в отличие от предыдущего типа, содержание блочных файлов буферизируется. Эти файлы идентифицированы символом b .
- Символические ссылки (симлинки) — указывают на другие файлы по их имени, указывают и на другие файлы, в т.ч. каталоги. Обозначены символом l . В выводе команды ls -l /путь/до/директории |grep «^l» можно увидеть, на какой файл ссылаются симлинки — в последней колонке название имеет следующий вид: НАЗВАНИЕ ФАЙЛА -> НА ЧТО ССЫЛАЕТСЯ
- Туннели (каналы/именованные каналы) — очень похожи на туннели из Shell , но разница в том, что именованные каналы имеют название. Они очень редки. Обозначены символом p .
Информация о файлах⚓︎
LSOF⚓︎
Список всех открытых файлов можно просмотреть с помощью команды lsof — ListOpenFiles. Эта информация поможет узнать о многом происходящем в системе, об устройстве и работе Linux, а также решить проблемы, например, когда вы не можете размонтировать диск из-за того, что устройство используется, но вы не можете найти, какой именно программой.
Вывод lsof состоит из нескольких колонок с информацией:
- COMMAND — имя команды, которая открыла или использует файл;
- PID — PID процесса;
- TID — идентификационный номер задачи (потока). Пустой столбец означает, что это не задача, а процесс;
- TASKCMD — имя команды задачи. Обычно имеет то же самое название, что и процесс, названный в столбце COMMAND , но некоторые реализации задач (например, Linux) позволяют задаче изменить имя своей команды;
- USER — имя пользователя, которому соответствует процесс, либо тот пользователь, которому принадлежит директория /proc , откуда lsof берёт информацию о процессе;
- FD — показывает файловый дескриптор файла;
- TYPE — тип узла, связанного с файлом;
- DEVICE — содержит номера устройств, разделённые запятыми, для специальных символьных, специальных блочных, обычных файлов, каталогов или NFS. Также может отображаться базовый адрес или имя устройства с сокетом Linux AX.25;
- SIZE/OFF — размер файла/смещение файла в байтах;
- NODE — показывает номер узла локального файла или номер узла NFS-файла на хосте сервера или тип интернет-протокола. Может отображаться STR для потока, IRQ или номер инода устройства с сокетом Linux AX.25;
- NAME — имя точки монтирования и файловой системы, в которой находится файл;
Опции lsof⚓︎
- -u — список файлов, открытых конкретным пользователем. Например, список открытых фалов пользователем liveuser :
- -U — вывести все файлы сокетов домена Unix
- +d — выяснить, какие папки и файлы открыты в некоей директории (но не в её поддиректориях): lsof +d /usr/bin
- -d — задать список дескрипторов файлов, разделённых запятой, которые надо включить в вывод или исключить из него
Example
Список исключается из вывода, если все записи в наборе начинаются со знака ^ . Список будет включён в вывод, если ни одна запись не начинается с ^ . Смешивание записей разных видов не разрешается.
В списке может присутствовать диапазон номеров дескрипторов файлов при условии, что ни один из его членов не пуст, оба члена являются числами, и завершающий член больше начального — то есть: «0-7» или «3-10».
Диапазоны могут быть использованы для исключения записей из вывода, если перед ними стоит префикс ^ , то есть — ^0-7 исключает все дескрипторы с 0 по 7.
- -p — вывести все файлы, открытые процессом с указанным при вызове команды PID
- И другие ключи. Перечислять их всех я не вижу смысла. Зайдите сюда, чтобы узнать больше. И, конечно же, man lsof .