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árioschroot
truques após copiar toda a infraestrutura do servidor SSH para o novo sistema de arquivos raiz, mas será ginástica. - Use
exec
para invocarswitch_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).