Como depurar um loop em systemd-shutdown/initrd? (Arco Linux)

Como depurar um loop em systemd-shutdown/initrd? (Arco Linux)

Instalei recentemente o Arch Linux em um disco virtual, sob uma configuração personalizada para root no ZFS. Isso foi feito usando alguns scripts que criei para gerenciar uma configuração de inicialização múltipla, com inicialização e pools de raiz separados, cada um para ser usado tanto para Arch quanto para FreeBSD. Atualmente, a configuração do pool ZFS foi criada com FreeBSD em uma VM. A instalação do Arch Linux foi então criada a partir de outra VM, onde o Arch foi instalado em uma partição Ext4. Com o Arch instalado na configuração de inicialização/raiz do ZFS e após alguma configuração do Grub, a instalação do Arch no ZFS agora inicializa com sucesso.

Atualmente, o disco virtual com os pools ZFS está sendo executado em uma máquina virtual separada. Arch Linux é o único sistema operacional instalado no disco virtual dessa máquina, no momento. Ele inicializa com sucesso agora, com uma configuração Grub2 correspondente. No entanto, estou percebendo um loop durante o desligamento.

[ 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...

Só encontrei isso com a instalação do Arch Linux no ZFS. Usando as mesmas versões systemd, mkinitcpio, linux e zfs-linux em outra instalação de VM, com Arch em uma partição Ext4, não existe tal loop ocorrendo durante o desligamento naquela máquina. Pode ser devido à raiz na configuração do ZFS?

Não consigo descobrir como depurar ainda mais esse loop.

Na minha opinião, isso pode estar relacionado a alguns scripts para desligamento do systemd no mkinticpio, que foi introduzido em 2013 (Bächler2013).

O que parece ser o código principal do mkinitcpio-generate-shutdown-ramfsserviço, introduzido nessa época - um trecho de/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

Além disso, o conteúdo do arquivo/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:

Não tenho certeza se isso está realmente acontecendo no processo de desligamento, na VM - o sistema pode não atender aos pré-requisitos declarados para tanto.

Eu tentei mascarar o mkinitcpio-generate-shutdown-ramfsserviço no systemd, depois executá-lo mkinitcpio -Pnovamente, reinicializar ... e ele ainda entra nesse loop durante o desligamento do sistema.

O sistema ainda pode ser usado na instalação da VM - pelo menos até o ponto desse evento no desligamento, quando a máquina começa a entrar em loop indefinidamente. Idealmente, eu gostaria de poder resolver esse nó da configuração, antes de instalar qualquer coisa além do Arch ou colocá-lo no disco rígido interno de uma máquina.

Não tenho certeza do que pode estar resultando na mensagem Failed to unmount /oldroot: Device or resource busy. Pode ser algo relacionado ao root na instalação do ZFS? Mas isso é apenas um palpite, na verdade.

Na minha perspectiva, o processo de desligamento do systemd - ele está sendo executado no initrd, pelo que diz a saída do console? Acredito que não pareça trivial depurar neste momento.

Tenho certeza de que poderia continuar usando o Arch para manter a configuração do Grub atualizada, após instalar o FreeBSD ao lado do Arch, na configuração do pool ZFS no disco virtual da VM. Se for possível corrigir esse problema com o loop de desligamento no Arch, no entanto, eu gostaria de poder manter a instalação do Arch como um sistema de desktop funcional - na instalação da VM ou, finalmente, no disco rígido do PC.

Embora eu não consiga descobrir como depurar ainda mais esse loop, para esse loop durante o desligamento, talvez haja um patch que eu ainda não encontrei?

Atualizar

encontreiCódigo fontepara systemd-shutdown, na versão em uso no Arch Linux. Acho que parece um código bastante simples. Pode não haver muita coisa sobre o ponto de montagem 'oldroot' ou como ele pode se tornar inmontável durante o desligamento do systemd.

Não parece ser devido ao registro. Eu configurei Storage=volatilee /etc/systemd/journald.confcriei um serviço systemd oneshot que é executado /usr/bin/journalctl --flushapós a inicialização. O /var/sistema de arquivos foi desmontado com sucesso agora e não acredito que esteja perdendo todos os dados de log nas reinicializações.

O loop ainda está ocorrendo durante o desligamento, entretanto, junto com a mensagem Failed to unmount /oldroot...do systemd-shutdown. Há algo pendurado por efeito colateral?

informação relacionada