Como um sistema de arquivos pode ser copiado exatamente como é?

10

Eu tenho um sistema de arquivos para um dispositivo que estou programando do qual gostaria de fazer uma cópia exata. Idealmente, gostaria que essa cópia fosse idêntica à pasta da qual foi copiada. Eu tentei usar cp -r cp -ae rsync -azvPtentar conseguir isso. Cada um deles resulta em uma pasta com tamanho diferente (usando du -s) e, finalmente, mesmo que meu dispositivo fique sem a pasta original, ele não ficará com a pasta que copiei.

  • O que está ficando de fora de que os comandos que eu usei não são responsáveis?
  • É possível manter tudo idêntico ao copiar um sistema / pasta de arquivos? Se sim, como eu faria isso?

PS: Eu postei perguntas semelhantes no StackOverflow, mas rapidamente percebi que havia feito isso na troca errada


Editar: Isso pode não ser útil, mas não importa qual método eu usei o diretório copiado sempre causa a máquina em questão no Kernel Panic com a seguinte saída.

VFS: Não é possível montar o root fs via NFS, tentando o disquete. VFS: Não é possível abrir o dispositivo raiz "nfs" ou bloco desconhecido (2,0). Anexe uma opção correta de inicialização "root ="; Aqui estão as partições disponíveis: 1f00
64 mtdblock0 (driver?) 1f02 64 mtdblock2 (driver?) 1f04 2432 mtdblock4 (driver?) 1f05 128 mtdblock5 (driver?) 1f06 4352 mtdblock6 (driver?) 1f07 204928 mtdblock7 (driver?) 1f08 50304 mtdblock8 (driver?) 0800
8388608 driver sda: sd Pânico do kernel - não sincronizando: VFS: Não é possível montar o root fs no bloco desconhecido (2,0)

TopGunCoder
fonte
5
Uma diferença na dusaída não é um indicador de que o conteúdo não seja o mesmo.
Ignacio Vazquez-Abrams
Meu dispositivo não inicializa usando o diretório copiado. Estou tomando isso como um indicador e perguntando o que exatamente estou fazendo de errado que o sistema de arquivo copiado não é tratado da mesma
TopGunCoder
Você precisa especificar exatamente o que está tentando fazer. rsync -aou cp -afaça cópias exatas dos diretórios, mas você está tentando copiar um disco inicializável, há mais algumas coisas que você precisa fazer para concluir isso.
forcefsck
1
Que tipo de dispositivo? Que tipo de sistema de arquivos? Que tipo de mídia de armazenamento?
Michas
1
Para mim, parece que você deseja usar algo como dd if=/some/location of=/some/other/location bs=4Mler e gravar dados como está.

Respostas:

12

Eu geralmente uso uma das seguintes alternativas:

  • rsync -aHAX(adicione v para verbosidade) assegura que você preserva qualquer estrutura de link e x-attrs na pasta de destino durante a cópia. Não se esqueça, asignifica arquivar e preservar tempo, propriedade e permissões.
  • Simples tar cvf(não comprima para economizar tempo, basta tar-los) é o que eu uso se o primeiro não atender ao que eu preciso, por qualquer motivo, e não tiver tempo, mas eu sempre tento o primeiro.

Para verificar se tudo correu como deveria, você pode executar diff -r <folder1> <folder2>depois, se quiser.

bayindirh
fonte
1
Isso fez o truque! Eu também só precisava ter certeza de que o dispositivo que estava inicializando (por meio do NFS) estava desligado e não conseguia acessar o sistema de arquivos enquanto a cópia estava em andamento.
TopGunCoder
1
Ah, os clientes NFS com acesso de leitura e gravação às vezes podem apimentar as coisas!
bayindirh
3
Isso não copiará arquivos esparsos sem -S. Isso pode ser parte da du -sdiferença. Eu costumava rsync -axXSAHcopiar tudo. O -x copiará apenas dentro do sistema de arquivos, e não os arquivos montados em outro sistema de arquivos.
Victor Roetman
E quanto a --numeric-ids?
0x2207 31/01
@ 0x2207 Só é útil quando um usuário tem IDs numéricos diferentes em sistemas diferentes (por exemplo, o usuário hbayindir está nos dois sistemas e possui UID 1000 na origem e 1536 no destino). Eu nunca precisei usar essa opção, pois preciso preservar o proprietário real, não o UID e o GID. Se um usuário não estiver presente na origem ou no destino, o ID numérico será usado como substituto.
bayindirh
4

Ao ler sua resposta nos comentários, parece que você está tentando copiar a pasta raiz ("Meu dispositivo não inicializa usando o diretório copiado"). Nesse caso, há várias coisas que você deve fazer.

$ cd /
$ mkdir backups

$ tar -cvpf /backups/fullbackup.tar --directory=/ --exclude=proc --exclude=sys \
     --exclude=dev/pts --exclude=backups .

Depois de copiar a pasta raiz para o novo sistema, você precisará atualizar o grub antes de inicializar.

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub
Jeight
fonte
+1 Acho que a pista está na mensagem de inicialização com falha no OP e isso é resolvido.
msw
Como se vê, algo muito semelhante a isso funcionou. Eu estava lidando com um sistema de arquivos (FS) na minha máquina que precisava copiar. Bastou para mim tar c, então tar xele. O kicker, porém, era garantir que minha máquina estivesse desligada desde que eu a inicializei usando o FS local, mas remota ao dispositivo que eu estava inicializando (eu estava inicializando o dispositivo através do NFS)
TopGunCoder
grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich 28/02
2

Você pode tentar o FSArchiver . É o sucessor da imagem similar, que agora não é mantida. Eu usei o partimage e o FSArchiver no passado, e ambos funcionaram bem. Tanto quanto eu sei, os dois fazem cópias de um sistema de arquivos o mais próximo possível do original. Eu acho que o FSArchiver é um pouco mais poderoso que a partimage. Por exemplo, ele funciona com ext4, enquanto a partimage não. Consulte a tabela de comparação FSArchiver / partimage .

Faheem Mitha
fonte
2

Usar dupara comparar pastas é inerentemente problemático. Se você realmente deseja comparar 2 diretórios baseados apenas em seus tamanhos, use o duseguinte:

$ du -sh --apparent-size <dir>

Essa opção relatará o tamanho real dos diretórios versus a quantidade de espaço em disco que ele consome quando armazenado na mídia da unidade física. Os discos são organizados em blocos e os arquivos são gravados nesses blocos. Se um arquivo precisar apenas de BLOCO + 1 de espaço, ele consumirá 2 BLOCOS de espaço, e é o que dunormalmente é relatado. Lembre-se de que o nome da ferramenta é uso do disco!

Como você está lidando com o que soa como um sistema de arquivos inteiro, eu estaria inclinado a usar ddpara fazer uma cópia exata da partição em que o diretório está

$ dd if=/dev/sda1 of=/srv/boot.img

Você pode usar isso boot.imgpara restaurar a partição onde quiser.

$ dd if=/srv/boot.img of=/dev/sdb1
slm
fonte
O du também reportará o tamanho do disco (arquivos esparsos e links físicos ocupam menos espaço). Por exemplo, dá 21G, du -sh /varmas du -sh --apparent-size /vardá 209G no meu sistema.
Victor Roetman
0

Depende um pouco do que você quer dizer com "idêntico".

  • Apenas fazer rsyncseria bom na maioria das vezes. Às vezes, você deseja tarcompactar tudo em um arquivo e extraí-lo em outro local.
  • Se você deseja um clone do sistema de arquivos completo, pode usar ddpara copiar o próprio sistema de arquivos inteiro.

Se você tem algum meio de depurar seu dispositivo, tente descobrir qual é exatamente o problema por que ele não está atualmente funcionando.

michas
fonte