Короткий ответ

После 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

Возможные причины

  1. В fstab /dev/vdb1, после добавления диска буквы сдвинулись.
  2. Том пересоздали, UUID новый.
  3. Нет nofail на опциональном диске.
  4. LVM VG не активировался (vgchange).
  5. NFS в fstab без сети.
  6. Опечатка опций (uuit=).
  7. Секрет 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.