open atlas
↑ К треку
Linux: операционная система LIN · 06 · 04

fstab и монтирование при загрузке

/etc/fstab задаёт, какие ФС монтировать при загрузке: устройство, точка монтирования, тип, опции, dump и pass. UUID надёжнее /dev-имён — те смещаются при добавлении дисков. Плохая строка fstab бросает в emergency mode; nofail предотвращает это для некритичных монтирований.

LIN Middle ◷ 22 min
Уровень
ОсновыJuniorMiddleSenior

Ты смонтировал /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.

1

/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

Шесть полей:

  1. устройство — что монтировать: UUID, LABEL или путь (/dev/sda3). UUID настоятельно предпочтителен.
  2. точка монтирования — где в дереве. Должен быть существующим каталогом в момент монтирования.
  3. тип ФСext4, xfs, btrfs, vfat, tmpfs, nfs и т.д.
  4. опции — через запятую. defaults = rw,suid,dev,exec,auto,nouser,async.
  5. dump0 или 1. Управляет устаревшим инструментом резервного копирования dump. Почти всегда 0 на современных системах.
  6. pass0 = пропустить fsck при загрузке; 1 = проверять первым (только root); 2 = проверять после root. Root должен быть 1, остальные локальные ФС 2, сетевые/tmpfs всегда 0.
# Тестировать все записи fstab без перезагрузки
sudo mount -a
# Монтирует всё из fstab, что ещё не смонтировано
# Если команда вернула ошибку — исправить fstab СЕЙЧАС, до перезагрузки

# Смонтировать одну запись fstab по точке монтирования
sudo mount /data
# mount ищет /data в fstab и применяет записанные опции
2

Используй 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 в fstab

UUID записывается в суперблок ФС при mkfs и не меняется, если не переформатировать. При замене вышедшего из строя диска и восстановлении из бэкапа новая ФС получит новый UUID — не забудь обновить fstab.

3

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 — они критичны и ты хочешь сразу знать об их отказе.

4

Плохая строка 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.

5

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/sdb1

systemd-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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.