Линукс все есть файл

Концепция Linux — всё есть файл

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

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

Всё есть файл

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

Конечно, в этих файловых системах размещены не совсем обычные файлы. В статье типы файлов Linux мы рассматривали все существующие типы файлов. Если вы посмотрите на обычный файл, например, /etc/passwd с помощью утилиты file, то увидите информацию об этом файле:

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

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

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

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

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

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

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

Читайте также:  Kali linux persistence live

Ещё в каталоге /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 справляются в большинстве случаев.

Читайте также:  Git server gui linux

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Строение Linux — часть 2. Принцип «всё есть файл», виды файлов.⚓︎

В первой части статьи речь была об общем строении системы. Так сказать, галопом по европам. А в следующих частях строение Linux будет описано подробнее. Каждая статья описывает только одну тему.

Для начала стоит написать о концепции «всё есть файл». Концепция была перенята разработчиками Linux из Unix. Это было сделано для предоставления простого доступа ко всем возможностям ОС, не разрабатывая отдельных костылей. Т.е., преимущество такого принципа в том, что не надо реализовывать отдельный API для каждого устр-ва, в результате чего с ним (с файлом) могут работать все стандартные программы и API-интерфейсы. В Linux есть корневая ФС (корневая файловая система), куда монтируются раздел жёсткого диска, где установлена система, другие разделы, флешки, диски, псевдо-ФС и пр. Посмотрите на файл /etc/os-release :

os-release

Самое яркое представление этого принципа — устройства. Просмотрите содержимое каталога /dev:

В этот каталог подключаются все устройства: флеш-карты, мыши, клавиатуры, микрофоны, жёсткие диски и пр.

А теперь просмотрите информацию о каком-нибудь файле в /dev :

Информация о /dev/sda2

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

Однако, самое главное достоинство Linux в том, что и в обычном файле можно создать файловую систему заместо содержимого файла. Например, тот же файл подкачки /swapfile . Это файл, но с ФС swap .

Все конфиги, находящиеся в директориях /etc , ~/.local , ~/.config — тоже файлы.

Типы файлов⚓︎

  • Обыкновенные, которые используются для хранения информации;
  • Специальные (для туннелей и устройств);
  • Директории (их ещё называют папками или каталогами).

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

Для того чтобы просмотреть эти файлы, выполните:

Обычные файлы

Значение команды⚓︎

  • ls — просматривает каталог, а ключ -l добавляет отображение прав на файл. /etc замените на нужную директорию.
  • grep «^-» — так как «обычные» файлы обозначаются чертой (в первой колонке вывода ls , где отображаются права на файл), то эта команда выведет только эти файлы по маске ^- .

По поводу специальных файлов. Они обеспечивают обмен информации с ядром, работу с устр-вами и пр. Собственно, делятся ещё на несколько видов:

  • Символьные файлы — любые специальные системные, например /dev/null , или периферийные устр-ва (последовательные/параллельные порты). Такие файлы идентифицированы символом c .
  • Блочные — периферийные устр-ва, но в отличие от предыдущего типа, содержание блочных файлов буферизируется. Эти файлы идентифицированы символом b .

Блочные файлы

  • Символические ссылки (симлинки) — указывают на другие файлы по их имени, указывают и на другие файлы, в т.ч. каталоги. Обозначены символом l . В выводе команды ls -l /путь/до/директории |grep «^l» можно увидеть, на какой файл ссылаются симлинки — в последней колонке название имеет следующий вид: НАЗВАНИЕ ФАЙЛА -> НА ЧТО ССЫЛАЕТСЯ
  • Туннели (каналы/именованные каналы) — очень похожи на туннели из Shell , но разница в том, что именованные каналы имеют название. Они очень редки. Обозначены символом p .
Читайте также:  Dota 2 linux proton

Информация о файлах⚓︎

LSOF⚓︎

Список всех открытых файлов можно просмотреть с помощью команды lsof — ListOpenFiles. Эта информация поможет узнать о многом происходящем в системе, об устройстве и работе Linux, а также решить проблемы, например, когда вы не можете размонтировать диск из-за того, что устройство используется, но вы не можете найти, какой именно программой.

lsof

Вывод 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 :

liveuser

unix

  • -U — вывести все файлы сокетов домена Unix
  • +d — выяснить, какие папки и файлы открыты в некоей директории (но не в её поддиректориях): lsof +d /usr/bin
  • -d — задать список дескрипторов файлов, разделённых запятой, которые надо включить в вывод или исключить из него

Example

Список исключается из вывода, если все записи в наборе начинаются со знака ^ . Список будет включён в вывод, если ни одна запись не начинается с ^ . Смешивание записей разных видов не разрешается.

В списке может присутствовать диапазон номеров дескрипторов файлов при условии, что ни один из его членов не пуст, оба члена являются числами, и завершающий член больше начального — то есть: «0-7» или «3-10».

Диапазоны могут быть использованы для исключения записей из вывода, если перед ними стоит префикс ^ , то есть — ^0-7 исключает все дескрипторы с 0 по 7.

  • -p — вывести все файлы, открытые процессом с указанным при вызове команды PID
  • И другие ключи. Перечислять их всех я не вижу смысла. Зайдите сюда, чтобы узнать больше. И, конечно же, man lsof .

Источник

Оцените статью
Adblock
detector