Como você muda completamente o sistema de arquivos raiz no Linux?

2

Estou executando meus rootfs em um dispositivo flash (dispositivo MTD com UBIFS) - Nota: é um sistema bitbake, portanto, não é um ubuntu completo ou qualquer coisa.

Eu quero ser capaz de formatar esse dispositivo e escrever um novo rootfs nele, e por isso preciso ubidetach deste dispositivo, o que eu posso fazer, mas para fazer isso eu tenho que matar todos os processos / shell / app, etc ... que já existiu - ou seja, uma lista semelhante a se você faz:

fuser -vm /dev .

Então minha tentativa até agora (que funciona até certo ponto) está usando pivot_root onde eu faço o seguinte:

  1. Copie o bin, sbin, lib etc ... para minha nova pasta / tmp_root /
  2. Monte / bind / proc, / sys, dev, execute em / tmp_root /
  3. Ligue para pivot_root
  4. Desmontar tudo do oldroot
  5. Matança de todos os processos relacionados ao oldroot / dev
  6. desmontar o oldroot

Isso funciona ok - e neste momento eu posso pegar o UBIFS um flash no dispositivo MTD. No entanto, eu tive que matar todos os aplicativos que são runnings - o que não é muito útil!

Então, o que eu quero fazer é (pelo menos como teste) em vez de pivot_root fazer um switch_root , ou algo assim, e então eu posso executar todos os meus aplicativos E (esperançosamente) atualizar o dispositivo MTD . Normalmente isso é initramtfs (ou assim eu li), mas no meu caso eu só quero fazer alguns testes e trocar o sistema de arquivos em um rootfs já em execução.

Com a mesma pasta /tmp_root que criei, tentei:

  • exec switch_root /tmp_root /sbin/init
  • exec -c /dev/console switch_root /tmp_root /sbin/init

Mas sempre recebo o mesmo tipo de resultado:

old root filesystem is not an initramfs: invalid argument

Eu estou um pouco preso, é possível mudar completamente os rootfs quando o sistema estiver funcionando?

nota: executando o linux kernel 4.1.x

    
por code_fodder 04.10.2018 / 12:24

1 resposta

0

INFO:

switch_root

switch_root moves already mounted /proc, /dev, /sys and /run to newroot and makes newroot the new root filesystem and starts init process.

init

The program init is the process with process ID 1. It is responsible for initializing the system in the required way. init is started directly by the kernel and resists signal 9, which normally kills processes. All other programs are either started directly by init or by one of its child processes.

Quaisquer programas, daemons, módulos (?) iniciados antes de switch_root ser iniciado pelo processo init 1. switch_root irá matar esse init, portanto todos iniciados após o init ter sido eliminado.

Seus novos rootfs devem ter os módulos (?), programas, daemons para o novo init iniciar. É o novo processo 1 que irá recarregar módulos (?), Reiniciar daemons e gerar programas de usuário.

"Eu quero poder formatar esse dispositivo e escrever um novo rootfs nele"

Suponha que você tenha os novos rootfs já construídos e prontos para "instalar".

Depois de formatar, como você irá inicializar isso? É por isso que você quer fazer o switch_root porque ele já foi inicializado?

Se sim switch_root pode não ser a ferramenta que você precisa.

Outras ferramentas que podem permitir que você formate e copie seus novos rootfs.

  • Seu gerenciador de inicialização.
  • Uma distribuição Linux ao vivo instalada em um USB inicializável.
  • Um sistema de arquivos bitbaked personalizado com apenas o mínimo necessário para inicializar o sistema e as ferramentas (programas) precisam particionar, formatar e copiar. Este éter estará em outro 'drive' uma partição diferente no MTD ou até mesmo em um USB ou uma memória apenas initramfs que faz parte do bzImage.
  • Seus novos rootfs que estão temporariamente em outra partição, como um USB. Deve ajustar seu gerenciador de inicialização para inicializar a partir dele no lugar do kernel atual e rootfs.
  • Network boot ether PXE ou até mesmo um NFS.

Isso ajuda em tudo?

    
por 04.10.2018 / 17:34