systemd: executando um script no desligamento após os sistemas de arquivos serem montados como somente leitura

systemd: executando um script no desligamento após os sistemas de arquivos serem montados como somente leitura

Existe uma maneira de executar um script no desligamento, depois que o sistema de arquivos for remontado como somente leitura?

Tenho um Raspberry Pi conectado a uma tomada sem fio, que posso controlar por meio de um remetente e um script. Quero desligar esse soquete (desligando o framboesa) no desligamento, depois que o sistema de arquivos for montado como somente leitura.

Eu tentei isso:

[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/test
KillMode=none

[Install]
WantedBy=halt.target

O script /test gera as montagens atuais. Quando é executado no desligamento, ele indica leitura/gravação para o sistema de arquivos raiz e não somente leitura conforme o esperado.

Editar:

Conteúdo de /teste:

#!/bin/bash

echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1

Saída da tela no desligamento:

insira a descrição da imagem aqui

Responder1

Encontrei uma solução confiável: basta colocar o script em /usr/lib/systemd/system-shutdown/.

Veja também:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

Imediatamente antes de executar o sistema real, halt/poweroff/reboot/kexec systemd-shutdown executará todos os executáveis ​​em /usr/lib/systemd/system-shutdown/ e passará um argumento para eles: "halt", "poweroff", "reboot " ou "kexec", dependendo da ação escolhida. Todos os executáveis ​​neste diretório são executados em paralelo e a execução da ação não continua antes que todos os executáveis ​​sejam concluídos.

Responder2

Em relação ao seu script original, ele geralmente é executado antes de halt.target (observe que você não o solicitou antes de halt.target) - e os sistemas de arquivos nunca são remontados nesse ponto. systemd-shutdown (para o qual os executivos do systemd no final - depois de atingir halt.target), mata coisas (possivelmente junto com seu script não ordenado =) ), executa umount/swapoff/losetup final, remonta o que não poderia ser desmontado, em seguida, executa em paralelo o diretório de desligamento do sistema e tenta pivot_root() em /run/initrams se o desligamento existir lá (e se não existir ou o pivô falhar, prossegue com a parada).

informação relacionada