fstab и монтирование при загрузке
/etc/fstab задаёт, какие ФС монтировать при загрузке: устройство, точка монтирования, тип, опции, dump и pass. UUID надёжнее /dev-имён — те смещаются при добавлении дисков. Плохая строка fstab бросает в emergency mode; nofail предотвращает это для некритичных монтирований.
Ты смонтировал /dev/sdb1 в /data — всё работает. Перезагружаешь сервер — и /data исчез. Конечно: mount выживает только до следующей перезагрузки. /etc/fstab — файл, который делает монтирования постоянными.
Это также файл, который при одной неверной строке — опечатка в UUID, отсутствующий каталог точки монтирования, сетевая ФС недоступна при загрузке — переводит всю систему в emergency mode при следующей загрузке с запросом пароля root для исправления. На удалённом сервере без out-of-band доступа это жёсткая блокировка. Понимание fstab означает понимание как правильной настройки, так и восстановления при ошибках.
После этого урока ты сможешь написать корректную запись в /etc/fstab со всеми шестью полями, объяснить почему UUID надёжнее имён /dev/sda, использовать nofail для защиты некритичных монтирований, тестировать запись fstab без перезагрузки и восстанавливать систему, загрузившуюся в emergency mode из-за плохой строки fstab.
/etc/fstab имеет ровно шесть полей на строку, разделённых пробелами. Каждая строка — одно монтирование.
cat /etc/fstab
# <устройство> <точка монт.> <тип ФС> <опции> <dump> <pass>
UUID=e5f6a7b8-c9d0-1234-5678-abcdef012345 / ext4 errors=remount-ro 0 1
UUID=a1b2c3d4-5678-9abc-def0-123456789abc /boot ext4 defaults 0 2
UUID=C7A2-1234 /boot/efi vfat umask=0077 0 1
UUID=9f8e7d6c-ba98-7654-3210-fedcba987654 /data xfs defaults,noatime 0 2
tmpfs /tmp tmpfs defaults,size=2G 0 0Шесть полей:
- устройство — что монтировать: UUID, LABEL или путь (
/dev/sda3). UUID настоятельно предпочтителен. - точка монтирования — где в дереве. Должен быть существующим каталогом в момент монтирования.
- тип ФС —
ext4,xfs,btrfs,vfat,tmpfs,nfsи т.д. - опции — через запятую.
defaults=rw,suid,dev,exec,auto,nouser,async. - dump —
0или1. Управляет устаревшим инструментом резервного копированияdump. Почти всегда0на современных системах. - pass —
0= пропустить fsck при загрузке;1= проверять первым (только root);2= проверять после root. Root должен быть1, остальные локальные ФС2, сетевые/tmpfs всегда0.
# Тестировать все записи fstab без перезагрузки
sudo mount -a
# Монтирует всё из fstab, что ещё не смонтировано
# Если команда вернула ошибку — исправить fstab СЕЙЧАС, до перезагрузки
# Смонтировать одну запись fstab по точке монтирования
sudo mount /data
# mount ищет /data в fstab и применяет записанные опцииИспользуй UUID, а не имена /dev/sda — имена устройств нестабильны. Ядро назначает /dev/sda, /dev/sdb и т.д. по порядку обнаружения при загрузке. Добавь второй диск, смени SATA-порт или поменяй отсек — порядок может измениться. /dev/sda становится /dev/sdb. Запись fstab для корневой файловой системы теперь указывает не на то устройство.
# Получить UUID файловой системы
lsblk -f /dev/sdb1
# NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
# sdb1 ext4 1.0 9f8e7d6c-ba98-7654-3210-fedcba987654 890G 5% /data
# Альтернативный способ
sudo blkid /dev/sdb1
# /dev/sdb1: UUID="9f8e7d6c-ba98-7654-3210-fedcba987654" BLOCK_SIZE="4096" TYPE="ext4"
# LABEL — ещё один стабильный идентификатор (задаётся при mkfs или через tune2fs)
sudo tune2fs -L mydata /dev/sdb1
sudo blkid /dev/sdb1
# /dev/sdb1: LABEL="mydata" UUID="9f8e7d6c-..." TYPE="ext4"
# UUID vs LABEL:
# UUID: всегда уникален (присваивается при mkfs), не может конфликтовать
# LABEL: читаем человеком, но ДВЕ ФС могут иметь одинаковый label (неопределённое поведение)
# Рекомендация: всегда используй UUID в fstabUUID записывается в суперблок ФС при mkfs и не меняется, если не переформатировать. При замене вышедшего из строя диска и восстановлении из бэкапа новая ФС получит новый UUID — не забудь обновить fstab.
nofail предотвращает переход в emergency mode при недоступном или неудавшемся монтировании. Без него любая запись fstab, не смонтировавшаяся при загрузке, заставляет systemd прервать последовательность загрузки.
# БЕЗ nofail: если /dev/sdc1 отсутствует (например, USB не подключён),
# загрузка останавливается:
# [FAILED] Failed to mount /backup.
# [!!!!!!] Dependency failed for Local File Systems.
# You are in emergency mode.
# С nofail: отсутствующее устройство молча пропускается, загрузка продолжается
# Запись в /etc/fstab:
UUID=abc123... /backup ext4 defaults,nofail 0 2
# Для сетевых ФС: сочетать с _netdev (systemd ждёт сети) и nofail (пропустить если нет сети):
//nas.local/share /mnt/nas cifs credentials=/etc/samba/creds,_netdev,nofail 0 0
# Для внешних/съёмных дисков: всегда использовать nofail
UUID=def456... /mnt/external ext4 defaults,nofail,x-systemd.automount 0 2
# x-systemd.automount: монтировать при первом обращении, а не при загрузкеИспользуй nofail для: внешних дисков, USB-устройств, сетевых шар, дополнительных дисков с данными. НЕ используй nofail для корневой ФС или /boot — они критичны и ты хочешь сразу знать об их отказе.
Плохая строка fstab — классический способ лишить себя доступа к системе при загрузке. Сценарий: добавляешь запись для нового диска, допускаешь опечатку в UUID или забываешь создать каталог точки монтирования, сохраняешь fstab и перезагружаешься. systemd пытается смонтировать каждую запись; плохая не срабатывает; загрузка останавливается.
# Экран emergency mode выглядит так:
# You are in emergency mode. After logging in, type "journalctl -xb" to view
# system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
# try again to boot into default mode.
# Give root password for maintenance
# (or press Enter for automatic login):
# ШАГИ ВОССТАНОВЛЕНИЯ из аварийной оболочки:
# Шаг 1: перемонтировать root на запись (в emergency mode он только для чтения)
mount -o remount,rw /
# Шаг 2: определить плохую строку
cat /etc/fstab
# Найти только что добавленную строку — с опечаткой или неверным UUID
# Шаг 3: исправить или закомментировать плохую строку
nano /etc/fstab
# Закомментировать строку символом #:
# #UUID=WRONGUUID /data ext4 defaults 0 2
# Шаг 4: проверить исправление до перезагрузки
mount -a
# Если успех (или ошибка только на закомментированной строке) — можно перезагружаться
# Шаг 5: перезагрузиться
systemctl reboot
# ПРОФИЛАКТИКА: всегда тестировать 'mount -a' перед перезагрузкой после любого изменения fstab
sudo mount -aНа удалённом сервере, где emergency mode недоступен (нет консоли, нет IPMI), плохой fstab — это жёсткий сбой, требующий rescue mode от провайдера или доступа к серийной консоли. Поэтому mount -a перед перезагрузкой — не опциональная гигиена, а производственный safety gate.
systemd преобразует записи fstab в mount units при загрузке. Понимание этого объясняет некоторые поведения, кажущиеся загадочными.
# systemd генерирует mount units из fstab при загрузке через systemd-fstab-generator
# Просмотреть сгенерированные units:
systemctl list-units --type=mount
# UNIT LOAD ACTIVE SUB DESCRIPTION
# boot.mount loaded active mounted /boot
# boot-efi.mount loaded active mounted /boot/efi
# data.mount loaded active mounted /data
# Просмотреть сгенерированный mount unit
systemctl cat data.mount
# # Automatically generated by systemd-fstab-generator
# [Unit]
# SourcePath=/etc/fstab
# [Mount]
# Where=/data
# What=/dev/disk/by-uuid/9f8e7d6c-...
# Type=xfs
# Options=defaults,noatime
# Также можно писать mount units напрямую (без fstab) — удобно в контейнерах
# Файл: /etc/systemd/system/data.mount
# [Unit]
# Description=Data volume
# [Mount]
# What=/dev/disk/by-uuid/9f8e7d6c-...
# Where=/data
# Type=xfs
# Options=noatime
# [Install]
# WantedBy=local-fs.target
# Проверить статус монтирования через systemd
systemctl status data.mount
# ● data.mount - /data
# Loaded: loaded (/etc/fstab; generated)
# Active: active (mounted) since ...
# Where: /data
# What: /dev/sdb1systemd-fstab-generator запускается до обычной последовательности загрузки и преобразует строки fstab в транзитные mount units. Поэтому systemctl daemon-reload не нужен после редактирования fstab — генератор запускается заново при каждой загрузке. Для применения изменений fstab без перезагрузки используй mount -a (для новых монтирований) или systemctl daemon-reload с последующим systemctl restart <точка_монтирования>.mount.
Добавление второго диска с данными на постоянной основе — правильная безопасная процедура.
# Контекст: новый диск на 2 ТиБ /dev/sdb, уже разбит на разделы (/dev/sdb1) и отформатирован (xfs).
# Цель: монтировать в /data при каждой загрузке.
# Шаг 1: получить UUID (никогда не использовать /dev/sdb1 в fstab)
sudo blkid /dev/sdb1
# /dev/sdb1: UUID="9f8e7d6c-ba98-7654-3210-fedcba987654" TYPE="xfs"
# Шаг 2: создать точку монтирования
sudo mkdir -p /data
# Шаг 3: добавить запись в fstab (редактировать от root)
sudo nano /etc/fstab
# Добавить строку:
# UUID=9f8e7d6c-ba98-7654-3210-fedcba987654 /data xfs defaults,noatime,nofail 0 2
# Шаг 4: ТЕСТИРОВАТЬ до перезагрузки — это обязательно
sudo mount -a
# Если тишина — успех. Если ошибка — исправить fstab СЕЙЧАС.
# Шаг 5: проверить правильность монтирования
findmnt /data
# TARGET SOURCE FSTYPE OPTIONS
# /data /dev/sdb1 xfs rw,noatime,attr2,inode64,logbufs=8,logbsize=32k,nofail,noquota
df -h /data
# Filesystem Size Used Avail Use% Mounted on
# /dev/sdb1 2.0T 25G 2.0T 2% /data
# Шаг 6: теперь можно безопасно перезагружаться.
# Диск будет монтироваться автоматически при каждой последующей загрузке.
# Бонус: при замене диска и восстановлении из бэкапа обновить UUID в fstab:
# sudo blkid /dev/sdb1 <- новый UUID после mkfs
# sudo nano /etc/fstab <- обновить UUID
# sudo mount -a <- протестировать снова▸Частая ошибка
Самая опасная ошибка fstab на удалённом сервере: добавить монтирование NFS или CIFS с _netdev без nofail. Если сетевая шара недоступна при загрузке (NAS выключен, DNS не работает, сетевой интерфейс медленно поднимается), systemd ждёт долгий таймаут и затем переходит в emergency mode. Без доступа к консоли сервер недосягаем. Исправление до инцидента: всегда сочетать _netdev с nofail для любой сетевой ФС. Исправление после инцидента: использовать rescue mode у провайдера или out-of-band управление (IPMI/iDRAC) для загрузки в среду восстановления, отредактировать /etc/fstab и перезагрузиться.
▸Почему это работает
Почему /dev/sda меняется при добавлении диска? Ядро обнаруживает диски при загрузке через драйвер контроллера хранилища. Подсистема SCSI (обрабатывающая реальные SCSI, SATA и USB-хранилища) назначает имена устройств в порядке их обнаружения. Добавь диск в SATA-порт, который обнаруживается раньше в последовательности, — и все существующие диски сдвинутся на одну букву. NVMe использует другую схему именования (nvme0n1, nvme1n1), кодирующую контроллер и namespace, что стабильнее — но всё же не так стабильно, как UUID. UUID записывается в суперблок ФС при форматировании и привязан к данным, а не к аппаратному пути.
Ты добавляешь запись fstab для нового диска, используя путь /dev/sdb1 (не UUID), перезагружаешься и обнаруживаешь, что /data смонтирован не на тот диск. Что пошло не так и как должна была быть написана запись?
/etc/fstab делает монтирования постоянными между перезагрузками. Каждая строка имеет шесть полей: устройство, точка монтирования, тип ФС, опции, dump, pass. Всегда используй UUID (из blkid или lsblk -f) вместо /dev-имён — имена устройств смещаются при добавлении или перемещении дисков. nofail предотвращает переход в emergency mode при сбое монтирования; всегда используй для внешних дисков и сетевых ФС. Проверяй каждое изменение fstab командой sudo mount -a перед перезагрузкой — на удалённом сервере непроверенная плохая строка fstab означает жёсткую блокировку. При попадании в emergency mode: mount -o remount,rw /, исправь плохую строку в /etc/fstab, запусти mount -a для проверки, затем systemctl reboot. systemd преобразует строки fstab в mount units через systemd-fstab-generator; можно также писать .mount unit-файлы напрямую для большего контроля.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.