Диск с файловой системой сам по себе администратору бесполезен - чтобы прочитать или записать данные, его содержимое надо подключить в дерево каталогов. Этот процесс называется монтированием. В уроке разберём, как примонтировать и отключить раздел вручную, как настроить постоянное монтирование через /etc/fstab по стабильным идентификаторам, чем опасны опции noexec и nosuid, и как то же самое делает systemd через .mount и .automount юниты. Заодно научимся смотреть, что и куда смонтировано, через lsblk, findmnt и /proc/mounts.

Как это работает
В Linux нет букв дисков. Есть одно общее дерево от корня /, и любое блочное устройство (раздел, LVM-том, образ) подключается в какую-то точку этого дерева - точку монтирования. Точка монтирования - это обычный существующий каталог; после монтирования его прежнее содержимое скрывается, и вы видите корень файловой системы устройства.
Ядро не работает с разделами напрямую как с папками. Оно через слой VFS (виртуальная файловая система) подключает драйвер нужного типа ФС (ext4, xfs, btrfs, vfat) и связывает его с каталогом. Таблица того, что куда смонтировано, живёт в ядре и видна через /proc/mounts (а точнее /proc/self/mountinfo с расширенными полями). Файл /etc/mtab в современных системах - это просто символическая ссылка на /proc/self/mounts, отдельной записи никто не ведёт.
Опции монтирования меняют поведение примонтированной ФС. ro делает её только для чтения. noexec запрещает запускать с неё бинарники, nosuid игнорирует биты SUID/SGID, nodev отключает обработку файлов устройств. Эти три опции - база защиты для разделов вроде /tmp и /home, куда пользователь может что-то записать. defaults - это сокращение для набора rw,suid,dev,exec,auto,nouser,async.
Главная проблема постоянного монтирования - имена устройств вроде /dev/sda2 не стабильны. Подключили второй диск, поменяли порядок инициализации контроллеров - и sda стал sdb, система не загрузилась. Поэтому в fstab монтируют не по имени, а по UUID (уникальный идентификатор, зашитый в саму ФС) или по метке LABEL. Эти идентификаторы привязаны к файловой системе, а не к порту, и не меняются при перестановке дисков.
systemd добавляет свой слой. Каждая строка в /etc/fstab при загрузке автоматически превращается в .mount юнит (генератором systemd-fstab-generator). Можно писать .mount юниты и руками, но удобнее остаётся fstab. Отдельная фишка - .automount: точка монтируется не сразу, а лениво, при первом обращении к каталогу. Это ускоряет загрузку и удобно для редко используемых сетевых или съёмных ресурсов.
Команды и примеры
Ручное монтирование и просмотр. Команды util-linux одинаковы в Debian/Ubuntu и RHEL/Fedora:
Код: Выделить всё
lsblk -f # дерево устройств с UUID, типом ФС, точками монтирования
mount /dev/sdb1 /mnt # смонтировать с опциями по умолчанию
mount -o ro,noexec /dev/sdb1 /mnt
umount /mnt # отмонтировать (или umount /dev/sdb1)
findmnt /mnt # показать одну точку из ядра
findmnt --real # только реальные ФС, без псевдо (proc, sysfs)
cat /proc/mounts # сырой список монтирований из ядра
Код: Выделить всё
lsblk -o NAME,FSTYPE,UUID,LABEL,MOUNTPOINT
blkid /dev/sdb1 # UUID="..." TYPE="ext4" ...
Код: Выделить всё
UUID=2f8b1c4a-... /data ext4 defaults,nosuid,nodev 0 2
LABEL=backup /backup xfs defaults,noexec 0 2
Код: Выделить всё
systemctl daemon-reload # перечитать fstab, сгенерить .mount юниты
mount -a # смонтировать всё с auto, что ещё не смонтировано
findmnt --verify # синтаксическая проверка fstab без монтирования
Код: Выделить всё
umount -l /mnt # lazy: отвязать от дерева сейчас, освободить позже
lsof +D /mnt # кто держит каталог открытым
fuser -vm /mnt # процессы, использующие ФС
Код: Выделить всё
[Unit]
Description=Data volume
[Mount]
What=/dev/disk/by-uuid/2f8b1c4a-...
Where=/data
Type=ext4
Options=nosuid,nodev
[Install]
WantedBy=multi-user.target
Код: Выделить всё
systemctl enable --now data.automount
systemd-mount --automount=yes /dev/sdb1 /mnt # разовое ленивое монтирование
- Точка монтирования была непустой - старые файлы в каталоге никуда не делись, они просто скрыты под смонтированной ФС и снова появятся после umount. Перед монтированием убедитесь, что каталог пуст.
- В fstab указали /dev/sda2, добавили диск, имя сдвинулось - система не грузится. Всегда UUID или LABEL.
- Опечатка в fstab valит загрузку в emergency mode. Перед reboot обязательно findmnt --verify и mount -a.
- Поставили noexec на /tmp и сломали установщики (многие распаковывают и запускают скрипты из /tmp), или DNF/APT-хуки. Проверяйте, что именно запускается из раздела.
- umount -l кажется волшебством, но ФС не размонтируется по-настоящему, пока процессы держат файлы. На блочном устройстве это мешает безопасно его извлечь - сначала закройте процессы.
- Правили fstab, а .mount юнит не обновился - забыли systemctl daemon-reload.
- nofail забыли для съёмного или сетевого диска - его отсутствие при загрузке роняет систему в аварийный режим.
- Создайте файл-образ: dd if=/dev/zero of=/root/disk.img bs=1M count=200, затем mkfs.ext4 -L LAB /root/disk.img.
- Узнайте его UUID через blkid (для loop-файла используйте losetup или сразу монтируйте файл).
- Создайте каталог /mnt/lab и смонтируйте образ с опциями ro,noexec, проверьте через findmnt и попробуйте записать файл - получите отказ.
- Перемонтируйте в rw: mount -o remount,rw,noexec /mnt/lab. Скопируйте туда скрипт, сделайте chmod +x, попробуйте запустить - убедитесь, что noexec блокирует.
- Добавьте строку в /etc/fstab по LABEL=LAB с опцией nofail, выполните systemctl daemon-reload и findmnt --verify.
- Отмонтируйте, затем mount -a и проверьте, что строка из fstab сработала.
- Откройте файл на ФС (less), в другом терминале сделайте umount - получите busy, затем umount -l и посмотрите поведение.
- Чем UUID в fstab надёжнее имени /dev/sdb1 и где взять этот UUID?
- Что произойдёт со старым содержимым каталога, если смонтировать в него файловую систему?
- Какие три опции монтирования усиливают безопасность раздела с пользовательскими данными и что делает каждая?
- Назовите шесть полей строки /etc/fstab по порядку и смысл последнего поля.
- Чем отличается обычный umount от umount -l и когда ленивое размонтирование опасно?
- Как .automount юнит systemd экономит время загрузки и чем он отличается от .mount?