Структура файловой системы Linux

Андрей Михайлович Васильев

2020

Стандартизация системных вызовов ОС

При написании приложения под операционную систему на низком уровне разработчик ориентируется на системные вызовы — какие запросы ядру ОС могут быть сделаны и какие ответы могут быть получены

Одним из известных стандартов, описывающих системные вызовы для UNIX-подобных ОС, является POSIX. Если приложение нацелено на POSIX, тогда оно будет работать под всеми ОС, реализующих его

Данный стандарт реализуется в большинстве UNIX-подобных ОС

Для того, чтобы иметь гордое название UNIX, необходимо соответствовать стандарту Single UNIX Specification

Стандартизация структуры файловой системы

Помимо стандарта на системные вызовы разработчикам ПО необходимо определиться с тем как делить общее пространство — файловую систему, ФС

Для решения этой задачи в современном Linux используется Filesystem Hierarchy Standard, в котором описывается структура ФС и местонахождение ряда ключевых файлов для ОС

Нельзя сказать, что этому стандарту на 100% соответствует ФС каждого дистрибутива Linux, однако большая его часть соблюдается во всех. Это позволяет пользователям за разумное время переходить с одного дистрибутива на другой

Знакомая структура позволяет

  • Разработчикам разместить файлы своего приложения
  • Пользователям находить приложения, документацию, конфигурационные файлы

Корневой каталог ФС

/ — корневой каталог, содержащий всю файловую иерархию

  • /bin содержит приложения, необходимые системы для запуска и функционирования
  • /boot содержит ядро ОС и настройки загрузчика
  • /dev содержит файлы, соответствующие физическим и логическим устройствам компьютера, которые воспринимает ядро ОС
  • /etc содержит конфигурационные файлы для всех приложений, почти все файлы тут являются текстовыми
  • /home содержит домашние каталоги для обычных пользователей ОС. В них пользователи хранят свои данные
  • /lib содержит файлы разделяемых библиотек, которые используются ключевыми приложениями ОС. В дистрибутивах Linux по возможности устанавливается одна версия библиотеки, которая используется множеством приложений
  • /media в современных дистрибутивах используется для автоматического подключения съёмных дисков: флеш-носителей, DVD-дисков
  • /mnt в старых дистрибутивах использовалась для ручного подключения носителей, в том числе съёмных

Корневой каталог ФС, продолжение

  • /opt используется для установки «опционального», дополнительного, ПО. Обычно используется для установки коммерческого ПО
  • /proc предоставляет доступ к виртуальной ФС, предоставляемой самим ядром ОС. Файлы в этой директории позволяют считать или изменить состояние ядра Linux
  • /root домашний каталог суперпользователя root
  • /run каталог с временными файлами, необходимыми для системных приложений для поддержания своей работы или корректного завершения. Очищается при выключении компьютера
  • /sbin содержит исполняемые файлы, необходимые для настройки системы, системные приложения
  • /srv содержит данные, специфичные для данного сервера, например файлы FTP-сервера
  • /sys содержит информацию об устройствах, драйверах и некоторых функциях ядра
  • /tmp содержит временные файлы, создаваемые различными приложениями во время своей работы. Зачастую очищается при перезагрузке

Каталог /usr

/usr является наверное самым большим каталогом в обычной установке Linux, так как содержит приложения и файлы, необходимые для их работы

  • /usr/bin содержит исполняемые файлы, которые устанавливаются средствами самого дистрибутива ОС. Зачастую содержит тысячи файлов
  • /usr/include содержит стандартные заголовочные файлы для языка Си
  • /usr/lib содержит разделяемые библиотеки для исполняемых файлов в /usr/bin и /usr/sbin
  • /usr/local предназначен для установки приложений не через стандартные средства установки приложений дистрибутива. По структуре аналогично дереву каталогов /usr
  • /usr/sbin содержит исполняемые файлы для настройки самого дистрибутива
  • /usr/share содержит данные, которые используются приложениями из /usr/bin. Включает в себя иконки, звуковые файлы, настройки по умолчанию
  • /usr/share/doc содержит документацию по установленным приложениям. В ряде дистрибутивов по умолчанию достаточно пуста и требует установки специальных пакетов с документацией

Каталог /var

/var в отличие от большинства предыдущих каталогов предназначен для хранения изменяемых данных. Примерами таких данных являются: содержимое баз данных, журналы работы приложений и так далее

  • /var/cache содержит кэш для работы различных приложений
  • /var/lib содержит собственно данные, обрабатываемые различными приложениями: базами данных, пакетными менеджерами и т.д.
  • /var/lock содержит lock-файлы, которые нужны для отображения занятых ресурсов
  • /var/mail содержит данные почтового сервера
  • /var/opt дополнительные данные, управляемые приложениями из каталога /opt
  • /var/spool содержит задачи для дальнейшей обработки, например задачи для печати документов
  • /var/tmp содержит временные файлы, которые должны сохраниться после перезагрузки

Сложности статической структуры ФС

В UNIX-подобных ОС структура ФС представляет собой единое дерево. Чтобы добраться до файла или каталога необходимо построить путь

Постоянное использование абсолютных или относительных путей в некоторых ситуациях может быть не удобным:

  • Надо работать с несколькими удалёнными друг от друга директориями одновременно
  • Хочется иметь возможность быстро замещать один файл другим:
    • Обновление версий библиотек
    • Указание другого исполняемого файла, реализующего одинаковую функцию (например текстовый редактор или пейджер)
  • Хочется иметь возможность динамически формировать конфигурацию сервиса без редактирования файлов

Символические ссылки

Для решения поставленных выше задач используются символические ссылки — специальные файлы, которые содержат путь к целевому файлу или каталогу

Когда пользователь взаимодействует с символической ссылкой, то ОС автоматически перенаправляет его на целевой файл

  • Если изменить рабочий каталог по ссылке, то переход будет в каталог, на который ссылается ссылка
  • Если открыть текстовый файл по ссылке, то будет открыт этот файл, а не содержимое ссылки
  • Если запустить ссылку, то будет произведена попытка запустить файл, на который она ссылается

Ссылки де-факто позволяют сделать переходы между каталогами вне системы единого дерева, формируя некоторый граф

Просмотр состояния ссылки

Для отображения содержимого ссылки используется ls -l /usr/bin/discord

$ ls -l /usr/bin/discord
lrwxrwxrwx 1 root root 24 сен 10 20:52 /usr/bin/discord ->
    ../share/discord/Discord
  • lrwxrwxrwx
    • l — тип файла, символическая ссылка
    • остальное описывает права доступа
  • 1 — количество физических ссылок на данный каталог
  • root root — информация о владельце файла
  • 24 сен 10 20:52 — дата модификации файла
  • /usr/bin/discord — путь к файлу
  • -> ../share... — содержимое ссылки, относительный путь

Состояние ссылок

  • Ссылки могут содержать в себе как относительные, так и абсолютные пути
  • Ссылки могут содержать некорректные пути, в этом случае они считаются сломанными
  • Для починки ссылок можно либо исправить содержимое ссылки, либо структуру ФС

В стандартной цветовой схеме Bash рабочие ссылки отображаются светло-синим, а сломанные — красным

Жёсткие ссылки

Жёсткие ссылки появились исторически раньше символических

Основные отличия:

  • Жёсткие ссылки работают только с файлами, не с директориями
  • Жёсткие ссылки содержат ссылки на индексный узел, элемент учёта файлов с точки зрения реализации файловой системы
  • Трудно найти 2 жёстких ссылки на один и тот же узел с точки зрения пользователя
  • Жёсткие ссылки ограничены только одним разделом на жёстком диске

Потенциальное преимущество жёстких ссылок по сравнению с символическими — это скорость доступа, но в текущих реалиях оно минимально

Следует использовать символические ссылки

Управление ссылками

Создание ссылок

Для создания ссылок используется приложение ln с флагом -s — символические

Быстрый доступ к cdrom из домашней директории

$ ln -s /mnt/cdrom ~/cdrom

Удаление ссылок

Для удаления ссылки достаточно её удалить как и любой другой файл

Важно если у вас есть ссылка на директорию, то не стоит выполнять это действие рекурсивно