Файловая система Linux: стандарт FHS

Файловая система Linux: стандарт FHS

Файловая система Linux: стандарт FHS

При первом знакомстве с Linux файловая система может показаться непривычной. Здесь нет отдельных дисков C:, D: и E:, а системные файлы, программы, настройки и пользовательские данные распределены по каталогам с короткими названиями: /etc, /var, /usr, /dev, /proc.

Однако эта структура не случайна. Большинство Linux-дистрибутивов придерживается общего стандарта организации файловой системы — FHS.

Презентация

1. Стандарт FHS

FHS расшифровывается как Filesystem Hierarchy Standard — стандарт иерархии файловой системы.

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

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

  • BSD;
  • macOS;
  • Android;
  • других операционных системах семейства Unix.

FHS не является жёстким обязательным требованием. Разработчики дистрибутивов могут отклоняться от стандарта. Тем не менее общие принципы в большинстве систем сохраняются.

2. Категории данных в FHS

В стандарте FHS данные можно разделить по двум основным признакам.

Статичные и изменяемые данные

Статичные данные обычно не изменяются без прямого участия пользователя или администратора.

К ним относятся:

  • исполняемые файлы программ;
  • библиотеки;
  • конфигурационные файлы;
  • документация.

Изменяемые данные меняются в процессе работы системы.

Например:

  • системные журналы;
  • почтовые очереди;
  • очереди печати;
  • временные файлы;
  • рабочие данные служб.

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

Разделяемые и локальные данные

Разделяемые данные можно перенести на другую систему и продолжить использовать.

К ним могут относиться:

  • документация;
  • изображения;
  • звуковые файлы;
  • шаблоны;
  • общие ресурсы программ.

Локальные данные связаны с конкретной установленной системой.

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

3. Корневой каталог Linux

На вершине файловой иерархии Linux находится корневой каталог.

Он обозначается символом:

1
/

Корневой каталог необходимо отличать от домашнего каталога пользователя root, который называется:

1
/root

Символ / также используется как разделитель между каталогами.

Например:

1
/home/student/document.txt

Этот путь означает, что файл document.txt находится в каталоге student, который расположен внутри /home.

Если путь начинается с /, он называется абсолютным. Такой путь строится от корня файловой системы.

Посмотреть содержимое корневого каталога можно командой:

1
ls /

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

Этот процесс называется монтированием.

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

Создавать произвольные файлы непосредственно в / не рекомендуется. Корневой каталог предназначен прежде всего для системных каталогов.

4. Цвета в выводе команды ls

При выполнении команды ls разные объекты могут выделяться цветом.

В распространённых настройках терминала:

  • обычным цветом обозначаются простые файлы;
  • тёмно-синим — каталоги;
  • светло-синим — символические ссылки;
  • каталог, доступный для записи всем пользователям, может выделяться зелёным фоном.

Точная цветовая схема зависит от дистрибутива и настроек терминала.

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

По назначению она напоминает ярлык Windows, но является полноценным объектом файловой системы.

5. Основные системные каталоги Linux

Каталоги /bin и /sbin

Каталог /bin исторически предназначен для основных исполняемых программ, необходимых пользователям и самой системе.

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

Каталог /sbin содержит программы, связанные преимущественно с системным администрированием.

Некоторые команды из /sbin рассчитаны на запуск суперпользователем. Обычный пользователь может увидеть исполняемый файл, но не иметь достаточных прав для выполнения операции.

Во многих современных дистрибутивах применяется концепция merged /usr. При такой организации каталоги /bin и /sbin являются символическими ссылками:

1
2
/bin -> /usr/bin
/sbin -> /usr/sbin

Фактически программы хранятся внутри /usr, а старые пути сохраняются для совместимости.

Каталоги /lib и /lib64

Для работы программам нужны библиотеки — дополнительные компоненты с готовыми функциями.

Они размещаются в каталогах:

1
2
/lib
/lib64

Название lib происходит от английского слова library.

Каталог /lib64 обычно содержит библиотеки для 64-битной архитектуры x86-64.

Разделяемые библиотеки Linux часто имеют расширение .so, которое расшифровывается как shared object.

Примеры:

1
2
libexample.so
libexample.so.1

Число после .so обычно обозначает версию библиотеки. Благодаря разным именам в системе могут одновременно находиться несколько версий одной библиотеки.

6. Каталог /boot и загрузка Linux

Каталог /boot содержит файлы, необходимые для запуска операционной системы.

В нём могут находиться:

  • ядро Linux;
  • загрузчик;
  • начальная файловая система;
  • конфигурация загрузчика;
  • каталог EFI.

Одним из самых распространённых загрузчиков Linux является GRUB 2 — Grand Unified Bootloader.

Его конфигурация может находиться в каталогах:

1
/boot/grub

или:

1
/boot/grub2

В CentOS обычно используется:

1
/boot/grub2

Файл grub.cfg содержит сгенерированную конфигурацию загрузчика. Редактировать его вручную обычно не рекомендуется, поскольку он создаётся специальными командами и скриптами.

Каталог /boot/efi

Если система использует UEFI, внутри /boot может находиться каталог:

1
/boot/efi

В него монтируется EFI System Partition, или ESP.

Обычно этот раздел:

  • имеет объём около 512 МБ;
  • форматируется в FAT32;
  • содержит файлы, необходимые UEFI для запуска загрузчика.

Если компьютер загружается в режиме BIOS, каталог /boot/efi может отсутствовать или оставаться пустым.

Ядро Linux

Файл ядра обычно имеет имя следующего вида:

1
vmlinuz-версия

Буква z указывает на то, что образ ядра сжат.

В каталоге /boot может находиться несколько версий ядра. Старые версии не всегда удаляются сразу после обновления.

Это позволяет запустить предыдущее ядро, если новая версия работает нестабильно или не поддерживает какое-либо оборудование.

Initramfs и initrd

Рядом с ядром обычно находится файл начальной файловой системы:

1
initramfs

или:

1
initrd

Это архив, который во время загрузки распаковывается в оперативную память и временно используется системой.

Он может содержать:

  • драйверы;
  • дополнительные модули ядра;
  • программы, необходимые для продолжения загрузки.

Без подходящего initramfs или initrd система во многих случаях не сможет подключить основную файловую систему и завершить загрузку.

7. Общая последовательность загрузки Linux

Процесс запуска Linux можно представить в виде нескольких этапов.

Сначала запускается BIOS или UEFI. Они выполняют процедуру POST — Power-On Self-Test.

На этом этапе система:

  • проверяет основные компоненты;
  • инициализирует процессор;
  • проверяет оперативную память;
  • определяет контроллеры и подключённое оборудование.

После этого управление передаётся загрузчику.

При использовании BIOS загрузчик ищется в загрузочной области накопителя. При использовании UEFI запускается файл загрузчика, находящийся на EFI System Partition.

Далее GRUB показывает меню выбора операционной системы или версии ядра. Если пользователь ничего не выбирает, запускается пункт по умолчанию.

Загрузчик передаёт управление ядру Linux.

Ядро:

  1. распаковывает себя в оперативную память;
  2. инициализирует базовые устройства;
  3. подключает initramfs или initrd;
  4. загружает дополнительные модули;
  5. запускает первый пользовательский процесс.

Исторически первый процесс называется init. В большинстве современных дистрибутивов его роль выполняет система инициализации systemd.

8. Домашние каталоги пользователей

Каталог /home

Каталог /home предназначен для домашних каталогов обычных пользователей.

Например:

1
2
/home/student
/home/ivan

В своём домашнем каталоге пользователь обычно может:

  • создавать файлы;
  • создавать каталоги;
  • изменять данные;
  • удалять принадлежащие ему объекты;
  • хранить личные настройки программ.

Каталог /root

Каталог:

1
/root

является домашним каталогом суперпользователя root.

Важно различать три понятия:

  • / — корневой каталог файловой системы;
  • root — имя суперпользователя;
  • /root — домашний каталог суперпользователя.

У некоторых служебных пользователей домашние каталоги могут располагаться в других местах.

9. Каталоги для монтирования

Каталог /media

Каталог /media обычно используется для автоматического подключения съёмных носителей:

  • USB-накопителей;
  • компакт-дисков;
  • DVD;
  • других переносных устройств.

Графическая оболочка может самостоятельно создать внутри /media подкаталог и подключить туда найденный носитель.

Каталог /mnt

Название /mnt происходит от слова mount.

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

На практике внутри него часто создают постоянные точки монтирования:

1
2
/mnt/data
/mnt/backup

Туда могут подключаться:

  • дополнительные диски;
  • отдельные разделы;
  • сетевые файловые системы;
  • резервные хранилища.

10. Каталоги /opt и /srv

Каталог /opt

Название /opt происходит от слова optional.

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

Например:

1
/opt/application

Внутри такого каталога могут находиться все компоненты приложения:

  • исполняемые файлы;
  • библиотеки;
  • настройки;
  • дополнительные ресурсы.

Внутреннее программное обеспечение организации также часто размещают в отдельных подкаталогах внутри /opt.

Каталог /srv

Название /srv происходит от слова services.

Предполагалось, что в нём будут храниться данные, предоставляемые сетевыми службами.

Например:

1
2
/srv/ftp
/srv/www

Однако эта структура используется не во всех дистрибутивах. На практике данные служб часто размещаются внутри /var.

11. Временные и изменяемые данные

Каталог /tmp

Каталог /tmp предназначен для временных файлов.

Обычно любой пользователь может создавать в нём данные. Однако хранить там важные файлы нельзя.

Содержимое /tmp может быть удалено:

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

В некоторых дистрибутивах /tmp размещается в оперативной памяти с помощью tmpfs. В таком случае после выключения или перезагрузки его содержимое исчезает.

Каталог /var

Название /var происходит от слова variable — изменяемый.

В этом каталоге находятся данные, которые меняются во время работы системы.

Основные подкаталоги:

1
2
3
4
/var/log
/var/mail
/var/spool
/var/tmp

Их назначение:

  • /var/log — системные журналы;
  • /var/mail — почтовые ящики;
  • /var/spool — очереди заданий;
  • /var/tmp — временные данные более длительного хранения.

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

Журналы в /var/log часто являются обычными текстовыми файлами. Их можно читать стандартными командами Linux.

12. Псевдофайловые системы

Каталоги /dev, /proc, /sys и /run выглядят как обычные каталоги, однако значительная часть их содержимого не хранится на диске.

Это псевдофайловые системы.

Их содержимое создаётся ядром или системными службами и существует преимущественно в оперативной памяти.

Каталог /dev

Название /dev происходит от слова devices.

В нём находятся специальные файлы, через которые программы взаимодействуют с устройствами.

В виде файлов могут быть представлены:

  • жёсткие диски;
  • SSD;
  • разделы накопителей;
  • терминалы;
  • оптические приводы;
  • виртуальные устройства.

В современных системах содержимое /dev формируется механизмом управления устройствами, связанным с udev.

Каталог /proc

Название /proc происходит от слова processes.

В нём находится информация:

  • о работающей системе;
  • об оперативной памяти;
  • о процессоре;
  • о параметрах ядра;
  • о запущенных системных объектах.

Большинство файлов в /proc генерируется ядром в момент обращения.

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

Некоторые параметры внутри /proc можно изменять. В таком случае меняется поведение уже работающей системы.

Каталог /sys

Каталог /sys содержит структурированную информацию:

  • об устройствах;
  • драйверах;
  • системных шинах;
  • классах оборудования;
  • параметрах ядра.

Эти данные предназначены прежде всего для системных программ, но их также может читать человек.

Каталог /run

В /run находятся временные рабочие данные, относящиеся к текущему запуску системы.

Например:

  • файлы состояния;
  • сокеты;
  • идентификаторы системных служб;
  • временные данные системных компонентов.

После перезагрузки содержимое /run создаётся заново.

13. Каталог /etc

/etc — один из важнейших каталогов Linux.

Здесь хранятся конфигурационные файлы:

  • операционной системы;
  • установленных программ;
  • сетевых компонентов;
  • системных служб.

В большинстве случаев это обычные текстовые файлы. Их можно просматривать и редактировать в текстовом редакторе.

При резервном копировании системы каталог /etc имеет особое значение.

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

Обычно рекомендуется сохранять резервные копии:

1
2
3
/etc
/home
/root

а также важных данных из /var и каталогов установленных приложений.

При этом обычно нет смысла резервировать псевдофайловые системы:

1
2
3
4
/dev
/proc
/sys
/run

Не требуется сохранять и временные файлы из /tmp.

14. Каталог /usr

Название /usr исторически связано со словом user, но этот каталог не предназначен для пользовательских документов.

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

Основные подкаталоги:

1
2
3
4
5
/usr/bin
/usr/sbin
/usr/lib
/usr/share
/usr/local

Их назначение:

  • /usr/bin — пользовательские программы;
  • /usr/sbin — административные программы;
  • /usr/lib — библиотеки;
  • /usr/share — общие данные, не зависящие от архитектуры;
  • /usr/local — программы, установленные локальным администратором.

Каталог /usr/local

В /usr/local обычно размещаются программы, которые были установлены вручную и не входят в основную систему управления пакетами.

Например:

1
2
3
/usr/local/bin
/usr/local/sbin
/usr/local/lib

Во многих системах эти каталоги изначально почти пусты.

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

Каталог /usr/share

В /usr/share находятся данные, которые можно использовать на разных аппаратных архитектурах:

  • документация;
  • изображения;
  • значки;
  • шаблоны;
  • локализации;
  • звуковые файлы;
  • справочные страницы.

Концепция merged /usr

Раньше существовало более чёткое различие между базовыми программами из /bin и дополнительными программами из /usr/bin.

Со временем такая граница потеряла практический смысл.

Поэтому во многих дистрибутивах применяется объединённая структура:

1
2
3
/bin -> /usr/bin
/sbin -> /usr/sbin
/lib -> /usr/lib

Это уменьшает дублирование и упрощает устройство системы.

15. Принцип «всё является файлом»

Одна из основных идей Unix звучит так:

Всё является файлом.

Обычный файл является файлом, но каталог также представляет собой особый тип файла.

Через специальные файлы могут быть представлены:

  • терминалы;
  • жёсткие диски;
  • разделы;
  • устройства;
  • виртуальные системные объекты.

Благодаря этому для работы с разными объектами можно использовать одинаковые механизмы и системные вызовы.

Некоторым исключением являются сетевые интерфейсы. Они не представлены обычными файлами устройств и обслуживаются сетевой подсистемой ядра.

Символьные устройства

Символьные устройства, или character devices, работают с небольшими порциями данных — обычно с отдельными байтами или символами.

Примеры:

  • клавиатура;
  • терминал;
  • последовательный порт.

Доступ к ним обычно выполняется последовательно.

В выводе команды:

1
ls -l

символьное устройство обозначается буквой c в начале строки.

Блочные устройства

Блочные устройства, или block devices, работают с блоками данных.

Примеры:

  • жёсткие диски;
  • SSD;
  • CD-ROM;
  • DVD-ROM;
  • разделы накопителей.

В выводе ls -l блочное устройство обозначается буквой b.

16. Виртуальная файловая система VFS

Виртуальную файловую систему не следует путать с псевдофайловыми системами /proc, /sys или /dev.

VFS — Virtual File System — это уровень абстракции внутри ядра Linux.

Он позволяет программам одинаково работать с разными реальными файловыми системами:

  • ext4;
  • XFS;
  • FAT;
  • NTFS;
  • Btrfs;
  • сетевыми файловыми системами.

Например, FAT не поддерживает классическую модель владельцев и прав Linux. Однако после подключения FAT-раздела Linux всё равно может показать владельца и разрешения.

В этом случае необходимые свойства эмулируются.

NTFS использует собственную модель разрешений. При работе с NTFS виртуальная файловая система может преобразовывать её в привычное для Linux представление.

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

17. Просмотр дискового пространства командой df

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

1
df

Название можно понимать как disk free.

Команда выводит таблицу, в которой указываются:

  • имя файловой системы;
  • общий объём;
  • занятое место;
  • свободное место;
  • процент использования;
  • точка монтирования.

По умолчанию размеры могут отображаться в блоках, что не всегда удобно.

Для более понятного представления используется параметр -h:

1
df -h

Буква h означает human readable — удобный для человека формат.

Вместо большого количества блоков команда показывает размеры в мегабайтах и гигабайтах.

В выводе могут присутствовать временные файловые системы:

1
2
tmpfs
devtmpfs

Они располагаются преимущественно в оперативной памяти.

Реальные диски и разделы могут иметь имена, начинающиеся с:

1
2
3
/dev/sda
/dev/nvme
/dev/mapper

Основная файловая система обычно монтируется в:

1
/

Каталог /boot иногда подключается как отдельный раздел. Это может потребоваться, например, если основная система зашифрована или использует особую организацию дискового пространства.

Единицы измерения

В Linux часто используются двоичные единицы измерения:

  • кибибайты;
  • мебибайты;
  • гибибайты.

Они могут обозначаться как:

1
2
3
KiB
MiB
GiB

Некоторые программы поддерживают параметр -H, который использует десятичные единицы:

1
df -H

18. Определение размера каталога командой du

Команда df показывает использование пространства файловой системой в целом, но не позволяет определить размер конкретного каталога со всем его содержимым.

Для этого используется команда:

1
du

Название происходит от disk usage.

Например, чтобы узнать общий размер каталога /usr, можно выполнить:

1
du -sh /usr

Здесь:

  • -s означает summary — показать только итог;
  • -h означает human readable — использовать удобные единицы измерения.

Если не указывать -s, команда может вывести размер каждого вложенного каталога. Для большого дерева каталогов результат получится очень объёмным.

Символические ссылки обычно занимают совсем немного места, поскольку внутри ссылки хранится только путь к объекту.

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

Главное различие между командами:

1
df -h

показывает использование пространства подключёнными файловыми системами;

1
du -sh каталог

подсчитывает размер конкретного каталога и находящихся внутри него данных.

Заключение

Файловая система Linux представляет собой единое дерево, начинающееся с корневого каталога /.

Каждый системный каталог имеет своё назначение:

  • /etc хранит конфигурацию;
  • /home — данные обычных пользователей;
  • /root — данные суперпользователя;
  • /var — изменяемые рабочие данные и журналы;
  • /usr — программы, библиотеки и общие ресурсы;
  • /boot — файлы загрузки;
  • /dev — файлы устройств;
  • /proc и /sys — информацию ядра и системы;
  • /tmp — временные данные;
  • /mnt и /media — точки монтирования.

Необязательно сразу запоминать назначение каждого каталога. Важнее понимать общую логику FHS и уверенно ориентироваться в ключевых разделах файловой системы.

Для начала достаточно помнить несколько основных команд:

1
2
3
ls /
df -h
du -sh /путь/к/каталогу

Первая показывает содержимое корневого каталога, вторая — использование дискового пространства, а третья — размер выбранного каталога.

Авторский пост защищен лицензией CC BY 4.0.

© solizarevich. Некоторые права защищены.

Использует тему Chirpy для Hugo

Популярные теги