Как отладить цикл в systemd-shutdown / initrd? (Arch Linux)

Как отладить цикл в systemd-shutdown / initrd? (Arch Linux)

Недавно я установил Arch Linux на виртуальный диск в пользовательской конфигурации для root на ZFS. Это было сделано с помощью некоторых скриптов, которые я собрал для управления конфигурацией мультизагрузки с отдельными пулами загрузки и корня, каждый из которых будет использоваться как для Arch, так и для FreeBSD. В настоящее время конфигурация пула ZFS была создана с FreeBSD под виртуальной машиной. Затем была создана установка Arch Linux из другой виртуальной машины, где Arch был установлен на раздел Ext4. После установки Arch в конфигурации boot/root ZFS и некоторой настройки для Grub установка Arch на ZFS теперь успешно загружается.

В настоящее время виртуальный диск с пулами ZFS на нем запущен на отдельной виртуальной машине. Arch Linux — единственная ОС, установленная на виртуальном диске этой машины в настоящее время. Теперь он успешно загружается с соответствующей конфигурацией Grub2. Однако я замечаю цикл во время выключения.

[ 1561.324253] systemd-shutdown[1]: Sending SIGKILL to remaining processes...
[ 1561.336930] systemd-shutdown[1]: Unmounting file systems.
[ 1561.341650] [563]: Remounting '/var' read-only in with options 'noxattr,noacl'.
[ 1561.783555] [564]: Unmounting '/var'.
[ 1561.790194] [565]: Remounting '/usr' read-only in with options 'noxattr,noacl'.
[ 1561.796853] [566]: Remounting '/' read-only in with options 'noxattr,noacl'.
[ 1561.803420] systemd-shutdown[1]: All filesystems unmounted.
[ 1561.809423] systemd-shutdown[1]: Deactivating swaps.
[ 1561.813672] systemd-shutdown[1]: All swaps deactivated.
[ 1561.818688] systemd-shutdown[1]: Detaching loop devices.
[ 1561.824354] systemd-shutdown[1]: All loop devices detached.
[ 1561.829085] systemd-shutdown[1]: Stopping MD devices.
[ 1561.833346] systemd-shutdown[1]: All MD devices stopped.
[ 1561.837982] systemd-shutdown[1]: Detaching DM devices.
[ 1561.842299] systemd-shutdown[1]: All DM devices detached.
[ 1561.847501] systemd-shutdown[1]: All filesystems, swaps, loop devices, MD devices and DM devices detached.
[ 1561.856852] systemd-shutdown[1]: Successfully changed into root pivot.
[ 1561.863478] systemd-shutdown[1]: Returning to initrd...
[ 1562.306958] shutdown[1]: Syncing filesystems and block devices.
[ 1562.311377] shutdown[1]: Sending SIGTERM to remaining processes...
[ 1562.316903] shutdown[1]: Sending SIGKILL to remaining processes...
[ 1562.329374] shutdown[1]: Unmounting file systems.
[ 1562.334319] sd-remou[569]: Remounting '/' read-only in with options 'noxattr,noacl'.
[ 1562.346902] sd-umoun[570]: Unmounting '/oldroot/sys/kernel/config'.
[ 1562.354595] sd-umoun[571]: Unmounting '/oldroot/sys/fs/fuse/connections'.
[ 1562.361525] sd-umoun[572]: Unmounting '/oldroot/sys/kernel/tracing'.
[ 1562.368232] sd-umoun[573]: Unmounting '/oldroot/sys/kernel/debug'.
[ 1562.373715] sd-umoun[574]: Unmounting '/oldroot/dev/mqueue'.
[ 1562.380105] sd-umoun[575]: Unmounting '/oldroot/dev/hugepages'.
[ 1562.386843] sd-umoun[576]: Unmounting '/oldroot/sys/fs/bpf'.
[ 1562.391984] sd-umoun[577]: Unmounting '/oldroot/sys/fs/pstore'.
[ 1562.397417] sd-umoun[578]: Unmounting '/oldroot/sys/fs/cgroup'.
[ 1562.404234] audit: type=1334 audit(1635363440.667:81): prog-id=8 op=UNLOAD
[ 1562.410100] sd-umoun[579]: Unmounting '/oldroot/dev/pts'.
[ 1562.414579] audit: type=1334 audit(1635363440.667:82): prog-id=6 op=UNLOAD
[ 1562.420101] sd-umoun[580]: Unmounting '/oldroot/dev/shm'.
[ 1562.426852] sd-umoun[581]: Unmounting '/oldroot/sys/kernel/security'.
[ 1562.432165] sd-umoun[582]: Unmounting '/oldroot/usr'.
[ 1562.443869] sd-remou[583]: Remounting '/oldroot/run' read-only in with options 'noxattr,noacl'.
[ 1562.456905] sd-umoun[584]: Unmounting '/oldroot/run'.
[ 1562.461323] sd-umoun[585]: Unmounting '/oldroot'.
[ 1562.466800] sd-umoun[585]: Failed to unmount /oldroot: Device or resource busy
[ 1562.473458] sd-umoun[586]: Unmounting '/oldroot/dev'.
[ 1562.478395] sd-umoun[587]: Unmounting '/oldroot/sys'.
[ 1562.483288] sd-umoun[588]: Unmounting '/oldroot/proc'.
[ 1562.488082] sd-umoun[589]: Unmounting '/oldroot'.
[ 1562.493279] shutdown[1]: All filesystems unmounted.
[ 1562.498851] shutdown[1]: Deactivating swaps.
[ 1562.502456] shutdown[1]: All swaps deactivated.
[ 1562.506839] shutdown[1]: Detaching loop devices.
[ 1562.511505] shutdown[1]: All loop devices detached.
[ 1562.515404] shutdown[1]: Stopping MD devices.
[ 1562.520083] shutdown[1]: All MD devices stopped.
[ 1562.523666] shutdown[1]: Detaching DM devices.
[ 1562.527617] shutdown[1]: All DM devices detached.
[ 1562.531822] shutdown[1]: All filesystems, swaps, loop devices, MD devices and DM devices detached.
[ 1562.540145] shutdown[1]: Successfully changed into root pivot.
[ 1562.544940] shutdown[1]: Returning to initrd...

Я столкнулся с этим только с установкой Arch Linux на ZFS. Используя те же версии systemd, mkinitcpio, linux и zfs-linux под другой установкой VM, с Arch на разделе Ext4, такого цикла при выключении на этой машине не возникает. Может ли это быть из-за конфигурации root на ZFS?

Я в растерянности, пытаясь понять, как дальше отлаживать этот цикл.

По моим предположениям, это может быть связано с некоторыми скриптами для systemd-shutdown на mkinticpio, которые были представлены в 2013 году (Бэхлер2013).

То, что, по-видимому, является основным кодом в mkinitcpio-generate-shutdown-ramfsслужбе, представленной примерно в то время - отрывок из/usr/lib/systemd/system/mkinitcpio-generate-shutdown-ramfs.service

[Service]
Type=oneshot
# /tmp could be umounted at this point
# use /run as temporary directory
Environment=TMPDIR=/run
ExecStart=/usr/bin/mkinitcpio -A sd-shutdown -k none -c /dev/null -d /run/initramfs

Кроме того, содержимое файла/usr/lib/initcpio/install/sd-shutdown

#!/bin/bash

build() {
    add_binary /usr/lib/systemd/systemd-shutdown /shutdown

    if type -P kexec >/dev/null; then
        add_binary kexec
    fi
}

help() {
    cat <<HELPEOF
This hook adds systemd-shutdown to the initramfs. This is only
if the image is extracted to /run/initramfs before shutdown.
HELPEOF
}

# vim: set ft=sh ts=4 sw=4 et:

Я не уверен, попадает ли это на самом деле в процесс завершения работы виртуальной машины — система может не соответствовать заявленным предварительным условиям для этого.

Я пробовал замаскировать mkinitcpio-generate-shutdown-ramfsслужбу под systemd, затем запустить ее mkinitcpio -Pснова, перезагрузить... и она все равно попадает в этот цикл при завершении работы системы.

Система все еще пригодна для использования в установке VM - по крайней мере, до момента этого события при выключении, когда машина начинает бесконечно зацикливаться. В идеале я хотел бы иметь возможность вытащить этот узел из конфигурации, прежде чем устанавливать что-либо помимо Arch или помещать это на внутренний жесткий диск машины.

Я не уверен, что может быть результатом сообщения, Failed to unmount /oldroot: Device or resource busy. Это может быть что-то связанное с корнем при установке ZFS? Но это всего лишь предположение, на самом деле.

С моей точки зрения, процесс systemd-shutdown - он запущен под initrd, судя по тому, что говорит вывод консоли? Я считаю, что на данном этапе отладка представляется нетривиальной.

Я уверен, что смогу продолжить использовать Arch для поддержания конфигурации Grub в актуальном состоянии после установки FreeBSD рядом с Arch в конфигурации пула ZFS под виртуальным диском VM. Однако, если возможно исправить эту проблему с циклом выключения в Arch, я бы хотел иметь возможность поддерживать установку Arch в качестве рабочей настольной системы — в установке VM или, наконец, на жестком диске ПК.

Пока я не могу понять, как еще отладить этот цикл, может быть, есть патч для этого цикла во время выключения, который я просто еще не нашел?

Обновлять

Я нашелисходный коддля systemd-shutdown, в версии, используемой в Arch Linux. Я думаю, это выглядит как довольно простой код. Там может быть не так много информации о точке монтирования 'oldroot' или о том, как она может стать немонтируемой под systemd-shutdown.

Похоже, это не из-за ведения журнала. Я установил Storage=volatileи /etc/systemd/journald.confсоздал одноразовую службу systemd, которая запускается /usr/bin/journalctl --flushпосле загрузки. /var/Файловая система теперь успешно размонтируется, и я не думаю, что я теряю все данные журнала при перезагрузках.

Однако цикл все еще происходит во время выключения, вместе с сообщением Failed to unmount /oldroot...от systemd-shutdown. Есть ли что-то, что его подвешивает как побочный эффект?

Связанный контент