Короткий ответ
После reboot systemd монтирует то, что в /etc/fstab (и .mount unit). Путь /dev/sdb1 плавает; нужен UUID/LABEL. Если устройство не появилось за DefaultTimeoutStartSec, local-fs.target падает и вы в emergency — типично для USB/iSCSI без _netdev/nofail. Исправление: blkid ↔ fstab, nofail для необязательных, x-systemd.device-timeout, для NFS/CIFS — _netdev и After=network-online. Не меняйте UUID тома tune2fs «чтобы совпало» без понимания, кто ещё ссылается на старый.
Хост host.example (10.0.20.10), пользователь admin.
Симптомы и как отличить
- boot висит
A start job is running for /dev/disk/by-uuid/...; - система встала,
/dataпустой (смонтировали пустой каталог поверх или не смонтировали); systemctl --failedсодержитdata.mount;- диск виден в
lsblk, но не вfindmnt.
| Картина | Не fstab | Куда |
|---|---|---|
| Нет диска в lsblk | гипервизор | загрузка |
| I/O error при mount | ФС/диск | ext4, ro |
| mount есть, приложение denied | права | Permission denied |
Возможные причины
- В fstab
/dev/vdb1, после добавления диска буквы сдвинулись. - Том пересоздали, UUID новый.
- Нет
nofailна опциональном диске. - LVM VG не активировался (
vgchange). - NFS в fstab без сети.
- Опечатка опций (
uuit=). - Секрет LUKS не в initramfs для data (для корня — другая история).
Диагностика
После входа (rescue или нормальный):
systemctl list-units --failed --no-pager
systemctl status data.mount --no-pager -l
findmnt --verify --verbose
cat /etc/fstab
blkid
lsblk -o NAME,UUID,LABEL,FSTYPE,SIZE,MOUNTPOINT
ls -l /dev/disk/by-uuid/findmnt --verify сверяет fstab с реальностью — главный инструмент Ubuntu.
systemd генерация:
systemctl cat data.mount
systemctl show data.mount -p Where,What,Options,TimeoutUSec,Requires,AfterДля сети:
systemctl status NetworkManager systemd-networkd systemd-networkd-wait-online --no-pager
# что реально используется:
systemctl is-active systemd-networkd NetworkManagerНа Ubuntu Server чаще netplan → systemd-networkd или NetworkManager (24.04 desktop-ish; server — networkd).
LVM:
sudo vgdisplay
sudo lvdisplay
sudo vgchange -ayРешение
Сценарий A. Неверный идентификатор
sudo cp -a /etc/fstab /etc/fstab.bak.$(date +%F)Строка data:
UUID=11111111-2222-3333-4444-555555555555 /data ext4 defaults,nofail,x-systemd.device-timeout=10 0 2Подставьте UUID из blkid этого тома. 0 2 — fsck порядок; для необязательного часто 0 0.
sudo findmnt --verify
sudo mount /data
findmnt /dataСценарий B. Обязательный диск, который должен стопорить boot
Не ставьте nofail. Чините появление устройства (iSCSI initiator, fstab LUKS /etc/crypttab + UUID=). Timeout увеличьте осознанно:
UUID=... /data ext4 defaults,x-systemd.device-timeout=75 0 2Сценарий C. NFS/CIFS
files.example:/export /mnt/nfs nfs _netdev,nofail,soft,timeo=50 0 0Или systemd .mount + .automount. Не держите hard NFS без intr как единственный /home без плана hang — см. зависание.
Сценарий D. Сервис стартует раньше /data
sudo systemctl edit app.service[Unit]
Requires=data.mount
After=data.mountИначе приложение пишет в пустой каталог на корне и «диск пустой» после позднего mount (данные спрятаны).
Сценарий E. crypttab
/etc/crypttab + UUID LUKS, ключ в /root/keyfile с mode 600. Без unlock нет /dev/mapper/data.
Скрытые файлы под точкой монтирования и systemd generator
Когда data.mount failed, процессы пишут в /data на корневом LV. После того как том наконец смонтировался, эти файлы не видны, но место на корне занято. Проверка:
sudo mkdir /mnt/rootonly
sudo mount --bind / /mnt/rootonly
ls -la /mnt/rootonly/data
sudo umount /mnt/rootonlyПеренесите файлы, если они нужны, затем разберитесь, почему app.service стартовал без Requires=data.mount.
systemd генерирует *.mount из fstab при daemon-reload. Ручной /etc/systemd/system/data.mount с тем же Where= конфликтует. systemctl cat data.mount покажет два FragmentPath — оставьте один.
Для iSCSI на 22.04/24.04 open-iscsi должен быть After=network-online. Без _netdev локальный fsck ждёт LUN на local-fs.target и уходит в emergency. Это выглядит как «сервер не грузится», хотя корень жив — см. загрузку.
nofail + пустой каталог в приложении = тихий деград. Мониторьте systemctl is-active data.mount, не только ping хоста.
После клонирования VM blkid может показать тот же UUID на двух живых машинах, если диск копировали байт-в-байт. Тогда udev и сетевые тома путаются. На клоне:
sudo umount /data
sudo tune2fs -U random /dev/vdb1
sudo blkid /dev/vdb1Для LUKS UUID тома ФС ≠ UUID LUKS. В fstab должен быть mapper (/dev/mapper/data) или UUID уже открытого ext4, в crypttab — UUID LUKS из cryptsetup luksDump.
x-systemd.requires=network-online.target в опциях fstab полезен для NFS. Для локального virtio диск не должен ждать сеть: иначе boot тянется wait-online и кажется, что «диск не монтируется».
Проверка без reboot после правки fstab обязательна: sudo mount -a монтирует всё с auto. Ошибка сразу видна, emergency не нужен. Если mount -a ок, а после reboot нет — виноват порядок (cryptsetup, iscsi, LVM) или generator не перечитал fstab (systemctl daemon-reload после правки).
findmnt --verify ругается на swap строки иначе, чем на ext4: не лечите swap UUID сменой data-диска. swapon --show и /etc/fstab тип swap сверяйте отдельно.
Для bind-mount (/var/lib/docker → /data/docker) в fstab сначала должен существовать target на уже смонтированном /data. Иначе bind тихо привяжет пустой каталог корня. Порядок строк в fstab имеет значение: родитель раньше bind.
Как проверить, что проблема устранена
sudo reboot
ssh admin@10.0.20.10 'findmnt /data; systemctl is-active data.mount; ls /data | head'systemctl list-jobs пустой. findmnt --verify без ошибок. Приложение видит свои файлы, не пустой каталог.
Если не помогло
- UUID верный, device timeout: udev, multipath (
multipath -ll). - Сеть: DNS не мешает локальному ext4.
- Автомонтирование cloud-init переписывает fstab — смотрите
/etc/cloud/cloud.cfg.
Профилактика
- Только UUID/LABEL в fstab.
nofailна всё, без чего узел должен грузиться.- После добавления диска в гипервизоре — проверка
blkidдо reboot. - Документировать Requires между app.service и mount.
FAQ
nofail скрывает поломку диска?
Да, boot пройдёт. Нужен мониторинг data.mount active и df. Для критичных данных nofail не ставят.
LABEL вместо UUID?
Можно, если метки уникальны. UUID надёжнее.
Почему /dev/disk/by-id?
Стабилен для SCSI serial. UUID ФС меняется при mkfs — и должен.
systemd .mount vs fstab?
fstab генерирует unit. Дублировать оба — конфликт. Выберите одно.
auto vs noauto
noauto не монтирует на boot. Для ручных архивных дисков. Не забудьте, что app.service тогда не должен Require этот mount без ручного mount.