switch_root fornece argumento inválido

3

Meu objetivo é desmontar o disco raiz para que eu possa formatá-lo. Para fazer isso, eu quero mudar o root do disco rígido para outra raiz. Eu escolhi usar os arquivos do initramfs (que contém um sistema de arquivos raiz mínimo) para criar um rootfs para voltar.

Estou fazendo isso em uma instalação limpa do Ubuntu 16.04.

Os seguintes comandos criam um ramdisk e copiam o conteúdo do initramfs no ramdisk.

dd if=/dev/zero of=/dev/ram bs=1k count=209715
mke2fs -vm0 /dev/ram 209715
mount -t ext2 /dev/ram /ramroot/
cd /ramroot/
zcat /boot/initrd.img-4.4.0-47-generic | cpio -idmv
mkdir old-root

No entanto, quando eu faço o comando switch_root eu recebo "argumento inválido"

root@ubuntu-512mb-nyc3-01:/ramroot# switch_root /ramroot /ramroot/old-root
switch_root: failed to mount moving /run to /ramroot/run: Invalid argument
switch_root: forcing unmount of /run
switch_root: failed to mount moving /ramroot to /: Invalid argument
switch_root: failed. Sorry.

O que estou fazendo de errado?

    
por Duke Dougal 27.11.2016 / 09:32

1 resposta

2

Eu recomendo não usar switch_root para essa finalidade. Ele é realmente projetado apenas para uso pelo initramfs para alternar do initramfs para a raiz real e para nenhuma outra finalidade. Você pode ver evidências desse propósito especializado no seguinte aviso encontrado em sua página de manual:

WARNING:  switch_root  removes recursively all files and directories on
the current root filesystem.

Isso está lá para que a memória usada pelo initramfs (que é um tmpfs) possa ser recuperada depois que o initramfs mudar para a raiz real. (By the way, a razão que é construído em switch_root em vez de parte dos scripts shell initramfs é que é a única oportunidade para fazê-lo: depois que a raiz antiga não está mais em uso e enquanto o binário ainda está brevemente pendurado para um descritor de arquivo que se refere a ele.) Você realmente quer o switch_root to rm -rf do seu antigo sistema de arquivos raiz? Eu acho que talvez você não se importe, já que você planeja refazer o arquivo depois disso, mas não é o ideal.

Além disso, seu uso de switch_root está incorreto: o argumento após /ramroot deve ser um comando para executar (na nova raiz), não o nome de um diretório. Mas essa não é a fonte do seu problema.

Não está claro a partir do mount (2) manpage qual é a origem do seu erro EINVAL , mas não estou surpreso em vê-lo falhar: já que seu caso de uso não é o esperado para switch_root , Provavelmente não é bem testado & suportado. Eu acho que poderia haver algo sobre o sistema de arquivos antigo ainda em uso (tem referências abertas a ele) que impede que o MS_MOVE mount funcione.

Você pode tentar as seguintes coisas para ver se elas funcionarão, mas acho que há uma boa chance de que nenhuma delas funcione:

  • Certifique-se de que não há nada em execução no sistema que esteja mantendo referências ao antigo sistema de arquivos raiz (nem mesmo um sshd para sua conexão com a máquina). Provavelmente você pode organizar uma sessão SSH na máquina que não dependa do sistema de arquivos raiz antigo usando vários chroot truques após copiar toda a infraestrutura do servidor SSH para o novo sistema de arquivos raiz, mas será ginástica.
  • Use exec para invocar switch_root . Ele foi projetado para ser chamado dessa maneira.
  • Use um sistema de arquivos tmpfs em vez de um ext2. Para o que você está tentando fazer, não há razão para usar um sistema de arquivos ext2 em cima de um ramdisk. Você também pode usar tmpfs (como o initramfs faz).

A melhor maneira de fazer o que você está tentando fazer é usar o console da máquina e usar o initramfs real para fazer o seu trabalho. Isso, obviamente, requer que você tenha acesso ao console de trabalho à máquina. Inicialize com algo como break=bottom na linha de comando do kernel, e o initramfs lhe dará a chance de fazer o que você precisa enquanto corre sob os ramfs. Você vai querer copiar as ferramentas necessárias no initramfs antes de fazer isso.

No final, se você puder fazer isso, é muito mais fácil e seguro fazer essas coisas sob um sistema de resgate. Posso pensar em boas razões para usar o truque break acima mencionado para fazer o trabalho sob um initramfs (por exemplo, você tem acesso remoto ao console serial, mas nenhuma oportunidade de inserir uma chave USB com um sistema de recuperação e nenhum suporte para inicialização via rede sistema operacional), mas é perigoso se você cometer um erro (você perderá o acesso e precisará de uma ida ao datacenter de qualquer maneira).

    
por 27.11.2016 / 10:06