LINUX.ORG.RU

Фейлится монтирование корня в systemd

 , , ,


0

2

Установил я через debootstrap Debian jessie. Только ядро и systemd взял из бэкпортов: 4.8.0-0.bpo2-amd64, systemd 230.

Всё замечательно, только система факапится на монтировании корня: Failed to mount /.

ОС у меня установлена на LVM.

В процессе дебага выяснил, что всё монтируется великолепно ещё в initramfs. Далее успешно происходит чек диска и ремаунт юнитом systemd-remount-fs.

Но юнит local-fs.target не запускается из-за фейла зависимости -.mount:

[    4.801773] systemd[1]: -.mount: Directory / to mount over is not empty, mounting anyway.
[    4.802659] systemd[1]: -.mount: About to execute: /bin/mount /dev/mapper/os-root / -t ext4 -o errors=remount-ro
[    4.803013] systemd[1]: -.mount: Forked /bin/mount as 767
[    4.803234] systemd[1]: -.mount: Changed dead -> mounting
[    4.804544] systemd[767]: -.mount: Executing: /bin/mount /dev/mapper/os-root / -t ext4 -o errors=remount-ro
[    4.809787] systemd[1]: Received SIGCHLD from PID 767 (mount).
[    4.809862] systemd[1]: Child 767 (mount) died (code=exited, status=32/n/a)
[    4.809972] systemd[1]: -.mount: Child 767 belongs to -.mount
[    4.809990] systemd[1]: -.mount: Mount process exited, code=exited status=32
[    4.810005] systemd[1]: -.mount: Changed mounting -> failed
[    4.810290] systemd[1]: -.mount: Job -.mount/start finished, result=failed
[    4.810315] systemd[1]: Failed to mount /.

Утешительный вывод: Systemd пытается на кой-то хрен смонтировать корень в тот момент, когда он уже отлично смонтирован и хорошо себя чувствует. Если я перехожу в debug shell, вижу в что всё смонтировано отлично. Но на буте команда mount ожидаемо отдаёт ненулевой код, чем ломает local-fs.target и все зависимости далее.

Если убрать рут из fstab, то всё запускается замечательно, но тогда systemd-remount-fs не сработает (по исходникам он читает /etc/fstab хардкодно).

Вот мой /etc/fstab:

/dev/mapper/os-root	/	ext4	errors=remount-ro	0	1
/dev/mapper/data-storage	/var/lib/storage/	ext4	noatime,relatime,nodev,nosuid,noexec	0	0
UUID=fa1c680a-13d2-48c2-808d-bec1966ed483	none	swap	sw	0	0
UUID=2CB2-3E54	/boot/efi/	vfat	defaults	0	1

Если ставить не на lvm, а на раздел, то ничего не меняется.

Параметры загрузки ядра:

root=/dev/mapper/os-root ro rootfstype=ext4 systemd.debug-shell=1 systemd.log_level=debug systemd.log_target=kmsg log_buf_len=100M printk.devkmsg=on quiet splash

Очень помог ман по дебагу, но что-то я уже бессилен. https://freedesktop.org/wiki/Software/systemd/Debugging/

Как мне в итоге сказать systemd игнорировать уже смонтированный раздел? Что вообще творится? Да, параметр nofail игнорируется для рутовых разделов, о чём радостно рапортует systemd-fstab-generator.

Заранее отвечу на кой хрен мне systemd из бэкпортов — нужен networkctl.



Последнее исправление: calelix (всего исправлений: 1)

Рассмотрим момент, когда монтирование сфейлилось и ты в отладочном терминале.

Что в этот момент написано в /proc/self/mounts, /proc/self/mountinfo, какие major:minor у /dev/mapper/os-root? Что говорит systemctl show -.mount?

Существует ли симлинк /etc/mtab, указывающий на ../proc/self/mounts?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

И да: если ничего не получится, то убери / из fstab и добавь нужные флаги в rootflags=. Это в качестве костыля-воркэраунда, если потребуется.

intelfx ★★★★★
()

А творится скорее всего следующее — systemd не понимает, что / уже смонтирован. По какой причине, сказать трудно. Либо оно не может прочитать mounts/mountinfo/mtab (не помню, что из этого оно использует), либо какие-то параметры точки монтирования не совпадают с тем, что написано в автоматически сгенерированном юните (опять же, я не помню, что, помимо «where», проверяется при матчинге существующих точек монтирования и юнитов).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Итак, по порядку.

Вот мой /proc/self/mounts:

sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,relatime,size=10240k,nr_inodes=989092,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,relatime,size=1588088k,mode=755 0 0
/dev/dm-0 / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
efivarfs /sys/firmware/efi/efivars efivarfs rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0

И вот /proc/self/mountinfo (254:0):

16 22 0:16 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw
17 22 0:4 / /proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw
18 22 0:6 / /dev rw,relatime shared:2 - devtmpfs udev rw,size=10240k,nr_inodes=989092,mode=755
19 18 0:17 / /dev/pts rw,nosuid,noexec,relatime shared:3 - devpts devpts rw,gid=5,mode=620,ptmxmode=000
20 22 0:18 / /run rw,nosuid,relatime shared:5 - tmpfs tmpfs rw,size=1588088k,mode=755
22 0 254:0 / / rw,relatime shared:1 - ext4 /dev/dm-0 rw,errors=remount-ro,data=ordered
23 16 0:15 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:8 - securityfs securityfs rw
24 18 0:20 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw
25 20 0:21 / /run/lock rw,nosuid,nodev,noexec,relatime shared:6 - tmpfs tmpfs rw,size=5120k
26 16 0:22 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:9 - tmpfs tmpfs ro,mode=755
27 26 0:23 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd
28 16 0:24 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:11 - pstore pstore rw
29 16 0:25 / /sys/firmware/efi/efivars rw,nosuid,nodev,noexec,relatime shared:12 - efivarfs efivarfs rw
30 26 0:26 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,cpu,cpuacct
31 26 0:27 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,pids
32 26 0:28 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,blkio
33 26 0:29 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,net_cls,net_prio
34 26 0:30 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,perf_event
35 26 0:31 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,memory
36 26 0:32 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:20 - cgroup cgroup rw,devices
37 26 0:33 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:21 - cgroup cgroup rw,freezer
38 26 0:34 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:22 - cgroup cgroup rw,cpuset

Симлинк существует.

Я, кажется, понял ход мыслей. Попробую опции в fstab поменять на rw,errors=remount-ro,data=ordered.

calelix
() автор топика
Ответ на: комментарий от calelix

Ещё меня немного смутило что в mtab у меня lvm это /dev/dm-0, а в fstab /dev/mapper/os-root. Да, это симлинк, но может оказаться что он сравнивает тупо по матчу строк.

calelix
() автор топика
Ответ на: комментарий от calelix

Магия не сработала. Юнит всё равно фейлится. И с опциями, идентичными mtab и с заменой /dev/mapper/os-root на /dev/dm-0

Статус юнита:

* -.mount - /
   Loaded: loaded (/etc/fstab; generated; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2017-02-28 12:30:52 +03; 5min ago
    Where: /
     What: /dev/dm-0
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
  Process: 1399 ExecMount=/bin/mount /dev/dm-0 / -t ext4 -o rw,relatime,errors=remount-ro,data=ordered (code=exited, status=32)

И вот текст юнита.

# Automatically generated by systemd-fstab-generator

[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
Before=local-fs.target

[Mount]
What=/dev/dm-0
Where=/
Type=ext4
Options=rw,relatime,errors=remount-ro,data=ordered

calelix
() автор топика

В общем, выглядит как баг в systemd. Выполнение daemon-reload помогает запустить юнит local-fs.target, хотя команда mount всё равно с ошибкой валится.

# systemctl start local-fs.target
systemd[1]: Failed to mount /.
#
# systemctl daemon-reload
# systemctl start local-fs.target
# systemctl status -- -.mount
* -.mount - /
   Loaded: loaded (/etc/fstab; generated; vendor preset: enabled)
   Active: active (mounted) (Result: exit-code) since Tue 2017-02-28 12:48:34 +03; 1min 10s ago
    Where: /
     What: /dev/dm-0
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
  Process: 1939 ExecMount=/bin/mount /dev/os/root / -t ext4 -o errors=remount-ro,data=ordered (code=exited, status=32)
   CGroup: /system.slice/-.mount
calelix
() автор топика
Ответ на: комментарий от calelix

Да, к сожалению, похоже на баг — не вижу каких-то очевидных причин такому поведению.

Нет возможности установить из бэкпортов ещё и udev?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Что интересно, я чисто по приколу поставил Debian 8 x64 в VirtualBox на LVM (всё по умолчанию, один раздел) и установил ядро и systemd из бэкпортов, и у меня всё грузится, кстати udev ставится из бэкпортов автоматически, он в зависимостях прописан.

По-видимому, этот баг проявляется не всегда.

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid

У меня в арче тоже ничего не воспроизводится — ни в systemd-based initramfs, ни в классическом (на скриптах). Либо это какой-то гейзенбаг, либо дебианоспецифичный баг, либо у ТСа как-то очень хитро сломана конфигурация.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

А ты не можешь попробовать воспроизвести на чём-то помимо дебиана?

Пока нет.

Да, заметил ещё один интересный момент. Баг воспроизводится только если грузить через UEFI. В легаси всё замечательно.

calelix
() автор топика
Ответ на: комментарий от calelix

О. Это существенно. Идентификаторы разделов в GPT какие?

intelfx ★★★★★
()
Ответ на: комментарий от calelix

И да, ты так и не показал systemctl show -.mount в момент фейла. (А ещё я подумал, что было бы неплохо вывести само содержимое этого юнита через systemctl cat -.mount, чтобы исключить несовпадение содержимого файла с загруженным состоянием.)

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.