umount root em um script

0

Estou escrevendo um script para mudar meu rootfs para outro, em um cartão SD.

Os passos são aproximadamente:

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

Isso funciona como esperado em um modo interativo, mas não em um script, pois os interpretadores são executados no old-root , não posso desmontá-lo.

Então, eu tentei usar um script intermediário no qual eu mato o pai assim:

# parent
exec chroot sd_card_fs sh -c script.sh

# son
cat script.sh

...
kill -9 $PPID
umount /old-root
...

Isso não funciona quando o filho se suicida, matando seus pais e eu acho essa solução de alguma forma suja.

Então, minhas perguntas:

  • Existe uma maneira mais limpa do que invocar outro script para fazer o trabalho? Se não, como posso corrigir isso?

Eu realmente quero minimizar, tanto quanto possível, a interação humana, então, chamar um script, esperar que ele termine de lançar outro é um não, a menos que não haja outra solução.

    
por Zermingore 31.08.2016 / 17:31

1 resposta

1

Mas esse último comando no script "pai" substitui com o "filho". Isso é o que o exec faz. Você não deve ter nenhum processo pai que possa matar.

Tais scripts podem somente funcionar quando o script é PID 1, de modo que não há outros processos [*]. Você deve ter inicializado com init=/bin/bash . Lembre-se de invocar seu script usando exec , para que ele substitua o PID 1.

Não use desmontagem lenta, isso significa que você não verá mensagens de erro.

Tenho 99% de certeza de que sua desmembrada preguiça não terminou. Não sei como testar isso, exceto se você usar ext4 ou ext3, file -s /dev/$ROOT_DEV deve mostrar "precisa de recuperação de diário" (ou seja, não foi desmontado corretamente).

Espero que sua primeira tentativa funcione se você remover o kill e seguir as instruções em negrito acima. Eu poderia ter perdido alguma coisa embora.

[*] ou, você precisaria dizer ao init para se reexecutar, depois de organizar o caminho que o exec deve estar no sistema de arquivos de destino. Mas isso parece uma ideia terrível para mim. Apenas mantenha as coisas simples.

    
por 01.09.2016 / 10:46