Лекция 2. Файловая система и права доступа

1. Иерархия файловой системы (FHS)

В Linux нет привычных по Windows букв дисков (C:, D:) — вся файловая система представляет собой единое дерево, начинающееся с корня /. Даже разные физические диски и разделы просто монтируются (подключаются) в определённые точки этого дерева.

Расположение системных файлов стандартизировано документом FHS (Filesystem Hierarchy Standard) — это позволяет администратору или скрипту предсказуемо находить нужные файлы независимо от дистрибутива.

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

Особые каталоги:

  • (/) Корневой каталог — это единственный каталог который не входит ни в один другой каталог.
  • (~) Домашний каталог пользователя — у каждого пользователя свой домашний каталог (у суперпользователя — /root, у остальных пользователей — как правило это подкаталог в /home).
  • (.) Текущий рабочий каталог — у каждого процесса свой.
  • (..) Родительский каталог — у каждого каталога свой.

Путь к файлу:

  • Абсолютный путь — не зависит от контекста, начинается с символа / (cd /)
  • Относительный путь — зависит от контекста
    • относительно домашнего каталога, начинается с символа ~ (cd ~/../../etc)
    • относительно текущего каталога, начинается с символа . (cd ./etc)
    • относительно родительского каталога, начинается с символа .. (cd ../../etc)
    • неявный относительный путь — имя в текущем рабочем каталоге (cd etc)

Для перемещения по файловой системе используйте команды:

  • pwd — показать текущий каталог (сокращение от path to working directory)
  • cd — сменить текущий каталог (сокращение от change directory)
  • ls — перечень файлов в каталоге (сокращение от list files)

Ключевые директории верхнего уровня:

  • /bin, /sbin — Основные исполняемые файлы (в современных дистрибутивах часто симлинки на /usr/bin, /usr/sbin)
  • /etc­- Конфигурационные файлы системы и служб (текстовые, читаемые человеком)
  • /home — Домашние директории пользователей
  • /root — Домашняя директория суперпользователя root (отдельно от /home по историческим и практическим причинам)
  • /var — Изменяемые данные: логи (/var/log), очереди, кэши, данные баз данных
  • /usr — Основная часть пользовательского ПО и библиотек (несмотря на название, не имеет отношения к «users»)
  • /opt — ПО сторонних производителей, устанавливаемое отдельно от системного пакетного менеджера
  • /mnt, /media — Точки монтирования внешних и временных носителей
  • /dev — Файлы устройств (следствие философии «всё есть файл»)
  • /proc, /sys — Виртуальные файловые системы: информация о процессах и ядре в реальном времени, физически не хранятся на диске
    • /proc/cpuinfo — информация о процессоре
    • /proc/meminfo — информация об ОЗУ
  • /tmp — Временные файлы, обычно очищается при перезагрузке
  • /run — Временные файлы текущего сеанса работы

Монтирование (Mounting) — это процесс подключения изолированной файловой системы устройства (жесткого диска, флешки, сетевого диска) к единому дереву каталогов операционной системы Linux.

Точка монтирования (Mount point) — обычный, заранее созданный пустой каталог в существующем дереве файлов, через который открывается доступ к подключенному устройству.

Монтируемое устройство — логический раздел накопителя или образ, содержащий файловую систему (например, /dev/sdb1 — первый раздел на втором жестком диске).

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

  • тип устройства, номер устройства, номер раздела (/dev/sdb1)
  • по уникальному идентификатору файловой системы (UUID)
  • по уникальному идентификатору раздела (partition UUID)
  • по метке файловой системы (label)

Монтирование файловой системы:

sudo mount [опции] <что_монтируем> <куда_монтируем>

Размонтирование файловой системы:

umount <точка монтирования / монтируемое устройство>

Часто используемые опции:

  • -o ro — смонтировать в режиме «только для чтения» (read-only).
  • -o noexec — запретить запуск исполняемых файлов с этого носителя.
  • -o noatime — отключить фиксацию времени чтения файлов (ускоряет работу, уменьшает износ SSD).
  • -o loop — монтирование файлов-образов (в современных дистрибутивах можно не указывать).

/etc/fstab — конфигурационный файл для подключаемых при загрузке файловых систем.

Типы файловых систем:

  • ext, ext2, ext3, ext4 — родная файловая система Linux.
  • vfat, exfat, ntfs — файловые системы Windows.
  • squashfs, f2fs, erofs — файловые системы Android.
  • btrfs, zfs — файловые системы типа “Copy-on-Write”.

2. Inode, типы файлов, ссылки

Что такое inode

Каждый файл в файловой системе Linux — это не «имя + содержимое», а связка двух отдельных сущностей:

  • inode — служебная структура, хранящая метаданные файла
  • Имя файла — это просто запись в директории, которая ссылается на конкретный inode. Директория — это, по сути, таблица соответствий «имя → номер inode».

Посмотреть номер inode: ls -i. Посмотреть подробные метаданные: stat <файл>.

Inode хранит:

  • числовой идентификатор
  • имена файла (может быть несколько)
  • владелец файла
  • группа файла
  • права доступа
  • указатель на блоки данных на диске
  • размер файла
  • Access time (atime) — время последнего чтения.
  • Modify time (mtime) — изменение содержимого файла (можно изменить с помощью touch).
  • Change time (ctime) — изменение содержимого или метаданных файла.
  • Birth time (btime) — время создания файла.

Типы файлов

Помимо привычных обычных файлов и директорий, в Linux есть ещё несколько типов, которые видны, например, в первом символе вывода ls -l:

  • - — Обычный файл
  • d — Директория
  • l — Символическая ссылка
  • b — Блочное устройство (диски)
  • c — Символьное устройство (терминалы, /dev/null)
  • s — Сокет
  • p — Именованный канал (named pipe, FIFO)

Жёсткие и символические ссылки

Жёсткая ссылка (hard link) — ещё одна запись в директории, указывающая на тот же самый inode, что и исходный файл. Следствия:

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

Символическая ссылка (symlink) — отдельный файл, который содержит путь к другому файлу (похоже на «ярлык» в Windows). Особенности:

  • Имеет собственный inode, отдельный от целевого файла.
  • Может указывать на файл на другом разделе, на директорию, и даже на несуществующий путь («битая» ссылка).
  • Если удалить оригинал, символическая ссылка остаётся, но становится нерабочей.
ln файл.txt hardlink.txt        # жёсткая ссылка
ln -s файл.txt symlink.txt      # символическая ссылка

unlink — отключение ссылки (в современных дистрибутивах можно использовать rm).

3. Права доступа: rwx, восьмеричная нотация, chmod/chown/chgrp

Модель прав

У каждого файла есть три категории субъектов и три вида прав:

Категории: владелец (user, u), группа-владелец (group, g), остальные (others, o).

Права:

  • r (read) — чтение содержимого файла / листинг директории;
  • w (write) — изменение содержимого файла / создание-удаление файлов внутри директории;
  • x (execute) — запуск файла как программы / вход в директорию (cd).

Вывод ls -l показывает права строкой из 10 символов, например:

-rwxr-xr--

Первый символ — тип файла (см. таблицу выше), далее по три символа на владельца, группу и остальных.

Символьная и восьмеричная нотация

Права можно задавать двумя способами:

Символьный: chmod u+x file, chmod g-w file, chmod o=r file

Восьмеричный (числовой): каждое право — это бит, сумма даёт число от 0 до 7:

  • r, 4 — право на чтение файла
  • w, 2 — право на изменение файла
  • x, 1 — право на запуск файла или вход в каталог

Например, rwxr-xr-- = владелец 4+2+1=7, группа 4+0+1=5, остальные 4+0+0=4 → chmod 754 file.

Частые комбинации: 644 (обычный файл: владелец читает/пишет, остальные только читают), 755 (исполняемый скрипт или директория), 600 (приватный файл, например SSH-ключ), 777 (все права всем — почти всегда признак неправильной настройки, а не решения проблемы).

chown и chgrp

  • chown user file — сменить владельца файла.
  • chown user:group file — сменить владельца и группу одновременно.
  • chgrp group file — сменить только группу.
  • Флаг -R — рекурсивно применить к директории и всему содержимому.

Важно: сменить владельца файла может только root (обычный пользователь не может «подарить» свой файл другому, чтобы не обходить дисковые квоты).

4. Специальные биты: SUID, SGID, sticky bit

Помимо базовых rwx, существует три специальных бита, решающих конкретные практические задачи.

SUID (Set User ID) — на исполняемых файлах

Когда установлен, программа при запуске выполняется с правами владельца файла, а не запустившего её пользователя. Классический пример — /usr/bin/passwd: обычный пользователь должен иметь возможность сменить свой пароль, что требует записи в /etc/shadow (доступной только root), поэтому passwd временно выполняется с правами root.

Обозначение: s вместо x в позиции владельца (rwsr-xr-x), восьмеричный вид — дополнительная цифра спереди: 4755.

Риск: SUID-бит на неаккуратно написанной программе — классический вектор эскалации привилегий, поэтому такие файлы стоит держать под особым контролем (find / -perm -4000 для поиска всех SUID-файлов в системе).

SGID (Set Group ID)

На исполняемом файле работает аналогично SUID, но для группы. На директории — более практичный кейс: все новые файлы, создаваемые внутри такой директории, автоматически наследуют группу-владельца директории, а не основную группу создавшего их пользователя. Полезно для общих рабочих папок нескольких пользователей.

Обозначение: s в позиции группы, восьмеричная цифра — 2.

Sticky bit

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

Обозначение: t в позиции «остальные» (rwxrwxrwt), восьмеричная цифра — 1.

chmod 4755 файл        # SUID
chmod 2775 директория  # SGID
chmod 1777 директория  # sticky bit

5. Основы ACL

Классическая модель прав (владелец/группа/остальные) не позволяет выдать разные права нескольким разным пользователям или группам на один файл — только один владелец и одна группа. ACL (Access Control List) снимает это ограничение, позволяя добавить произвольное число дополнительных правил для конкретных пользователей и групп.

getfacl файл                    # посмотреть текущие ACL
setfacl -m u:ivan:rw файл       # дать пользователю ivan права rw дополнительно
setfacl -m g:devops:rx файл     # дать группе devops права rx
setfacl -x u:ivan файл          # убрать конкретное правило

При наличии ACL в выводе ls -l после прав появляется знак + (rwxr-xr--+) — сигнал, что стандартных прав недостаточно для полной картины и нужно смотреть getfacl.

ACL — мощный, но более редко используемый инструмент; для большинства задач хватает классических прав и грамотного использования групп. Более тонкая настройка политик доступа (в том числе через ACL и PAM) — тема дополнительного курса по администрированию.

6. Введение в обработку текста

Философия Unix (Unix way) — это базовые принципов создания программного обеспечения, сформировавшийся в ходе разработки операционной системы Unix. Ее суть сводится к созданию простых, специализированных и модульных инструментов, которые можно легко комбинировать между собой.

Главный постулат Unix way сформулировал один из создателей системы, Питер Салус: «Пишите программы, которые делают что-то одно, но делают это хорошо. Пишите программы, которые работают вместе».

Принцип KISS (Keep It Simple, Stupid). Простота имеет приоритет над сложностью. Если задачу можно решить простым способом — её нужно решать просто, даже если это выглядит менее «технологично». Простые программы содержат меньше багов, их легче поддерживать и развивать.

Конвейеры и перенаправление

Конвейер (pipe, |) передаёт вывод одной команды на вход другой — так строятся цепочки обработки данных:

cat access.log | grep "404" | wc -l    # сколько строк с кодом 404
ps aux | grep nginx                     # найти процессы nginx

Перенаправление работает с файловыми дескрипторами:

Оператор Значение
> Перенаправить stdout в файл (перезаписать)
>> Перенаправить stdout в файл (дописать в конец)
< Подать файл на stdin команды
2> Перенаправить stderr (поток ошибок) отдельно от обычного вывода
&> Перенаправить и stdout, и stderr вместе
ls нет_такой_директории > out.txt 2> err.txt   # обычный вывод и ошибки — в разные файлы
command > /dev/null 2>&1                         # полностью подавить весь вывод команды

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

grep — поиск по содержимому.

grep "error" file.log            # найти строки со словом error
grep -i "error" file.log         # без учёта регистра
grep -r "TODO" ./src             # рекурсивно по директории
grep -v "debug" file.log         # инвертировать — показать строки БЕЗ слова
grep -c "error" file.log         # посчитать количество совпадений

cut — вырезать подстроку.

cat /etc/passwd | cut -d: -f1

sort — сортировать строки.

uniq — убрать повторяющие строки.

head — показать заголовок файла.

tail — показать конец файла.

sed — потоковый редактор

Чаще всего используется для замены текста «на лету»:

sed 's/old/new/' file.txt        # заменить первое вхождение в каждой строке
sed 's/old/new/g' file.txt       # заменить все вхождения (global)
sed -i 's/old/new/g' file.txt    # изменить файл на месте (-i)

awk — обработка структурированного текста по колонкам

awk воспринимает каждую строку как набор полей (по умолчанию разделённых пробелом) и позволяет обращаться к ним по номеру ($1, $2, …, $0 — вся строка):

awk '{print $1}' file.txt         # вывести первую колонку
awk -F: '{print $1}' /etc/passwd  # с явным разделителем — имена пользователей
awk '{print $NF}' file.txt        # последнее поле в строке (NF — число полей)

Именно связка «конвейеры + grep/sed/awk» — то, что превращает Linux-терминал в мощный инструмент анализа логов и данных без написания отдельной программы.

Команды для работы с файлами

Операции с файлами:

  • touch — обновление времени модификации файла / создание пустого файла
  • rm — удаление (-r, -f)
  • cp — копирование (-r)
  • mv — перемещение / переименование (-r)
  • dd — низкоуровневое копирование данные файлов (для файлов устройств)
  • file — определяет тип файла
  • stat — метаданные файла

Операции с каталогами:

  • pushd, popd — переход в другой каталог и возврат обратно
  • mkdir — создание каталогов
  • rmdir — удаление пустых каталогов
  • tree — визуализация структуры, если установлен
  • du -sh — размер директории

Просмотр файлов:

  • head — первые n строк файла (n=10)
  • tail — последние n строк файла (n=10)
  • less — программа просмотра текстовых файлов (more — старая программа просмотра файлов)

Поиск файлов:

  • find — поиск файлов по критериями
  • which — поиск программы в PATH
  • whereis — поиск программы и относящихся к ней файлов
  • whatis — информация что делает программа
  • man — текстовая документация по программе
  • info — текстовая документация по программе

Жесткие и символические ссылки:

  • ln — создание жестких ссылок
  • ln -s — создание символических ссылок
  • unlink — удаление символических ссылок (также можно через rm)

Монтирование файловых систем:

  • mount — подключение файловой системы к дереву каталогов
  • umount — отключение файловой системы
  • chroot — временная смена корневого каталога

Полезные утилиты

  • mc — файловый менеджер (напоминает Norton Commander)
  • ranger — файловый менеджер (напоминает Finder)
  • vifm — файловый менеджер с комбинациями клавиш из vi
  • nnn — файловый менеджер
  • tree — просмотр дерева каталогов
  • locate — поиск файлов по имени в заранее созданной БД (updatedb — обновление БД с именами файлов)

Литература

  • Уильям Шоттс. Командная строка Linux
  • Эви Немет и др. UNIX и Linux: руководство системного администратора
  • Man-страницы: man hier, man chmod, man acl, man grep, man sed, man awk