Abrindo a partição UBI não processada para gravação no Linux, se estiver montada e usada pelo init

0

Eu preciso atualizar uma partição UBI bruta com uma nova imagem UBIFS do userspace do Linux com direitos de superusuário, mas estou recebendo o erro EBUSY (Dispositivo ou recurso ocupado) sempre que eu tento abrir meu /dev/ubiX_Y correspondente para gravação, mesmo se o atual sistema de arquivos presente nele estiver montado como somente leitura. Eu suspeito que uma partição de bloco usual com por ex. um sistema de arquivos ext4 pode ser aberto para gravação quando é montado como somente leitura, visto que utilitários como zerofree e ext4magic funcionam dessa maneira. Esse não parece ser o caso das partições UBI.

Teoricamente, eu poderia terminar os processos usando a partição ou anexá-los e fechar todos os arquivos antes de desmontar a partição completamente, mas parece que não posso fazer nada com o busybox init do processo, que mantém constantemente sua /etc/inittab abrir. E sim, a partição em questão é uma partição root / montada.

Eu também poderia implementar um módulo do kernel que faria o trabalho sujo, mas eu gostaria de reter o máximo de compatibilidade com binário para o meu utilitário de atualização e basicamente mantê-lo tanta agnóstico quanto a versão do kernel Eu posso, assim, resolvê-lo de tal maneira é altamente indesejável. Existe alguma outra maneira que eu possa fazer isso?

    
por Protagores 05.03.2018 / 09:46

1 resposta

1

Se houver uma linha em /etc/inittab como:

::restart:/tmp/updater_stage2

Então, se você enviar SIGQUIT para init , ele será substituído por / tmp / updater_stage2. Para recarregar /etc/inittab depois de ter alterado, envie SIGHUP. Você pode substituir /etc/inittab por uma montagem de ligação:

mount --bind /tmp/inittab /etc/inittab
kill -HUP 1
sleep 1
kill -QUIT 1

Se não houver /etc/inittab ou suporte para inittab em não compilado em init será executado init , então você terá que substituir /sbin/init como:

mkdir /tmp/old_sbin
mount --bind /sbin /tmp/old_sbin
cp -as /tmp/old_sbin /tmp/new_sbin
ln -sf /tmp/updater_stage2 /tmp/new_sbin/init
mount --bind /tmp/new_sbin /sbin
kill -QUIT 1

Você pode usar pivot_root e chroot para substituir o sistema de arquivos raiz, o qual poderá desmontar (depois de mover /tmp , /proc etc).

    
por 05.03.2018 / 21:03