Copie toda a hierarquia do sistema de arquivos de uma unidade para outra


95

Eu gostaria de copiar toda a hierarquia do sistema de arquivos de uma unidade para outra ... o conteúdo de cada diretório, bem como os arquivos regulares na plataforma Linux. Seria grato saber a melhor maneira de fazer isso com possíveis funções embutidas no Linux. O sistema de arquivos é uma família ext.


1
Umm ... onde está o amor dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist +1 para dd. Eu sempre uso isso. Mas quais bandeiras usar? Eu uso conv=notrunc,noerror,sync.
BeniBela

-1 por dd2 razões: primeiro, é uma má idéia executar uma cópia em nível de bloco de um sistema de arquivos montado (o que é o caso /) e, em segundo lugar dd, não copiará dados de fontes montadas no sistema de arquivos como /boote /home.
Eric

Respostas:


33

Eu costumo usar

> cp -ax / /mnt

Presumindo / mnt é o novo disco montado em / mnt e não há outras montagens em /.

o -x mantém no sistema de arquivos único.

Obviamente, isso precisa ser feito como root ou usando o sudo.

Este link tem algumas alternativas, incluindo a acima

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


enquanto isso é velha resposta mortos ainda é importante notar que você normalmente não deseja copiar todo o material presente em /, excluindo ou seja /dev, /sys, /procetc. Portanto, antes da emissão que cpeu sugiro à procura de melhores abordagens (também usando rsync)
Marcin Orlowski

2
@MarcinOrlowski O uso da -xflag por WolfJM significa que os sistemas de arquivos sintéticos mencionados não serão copiados.
Jim L.

192

O que você quer é rsync .

Este comando pode ser usado para sincronizar uma pasta e também retomar a cópia quando ela for interrompida até a metade. O comando para copiar um disco é:

rsync -avxHAX --progress / /new-disk/

As opções são:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Para melhorar a velocidade da cópia, adicione -W( --whole-file), para evitar o cálculo de deltas / diffs dos arquivos. Esse é o padrão quando a origem e o destino são especificados como caminhos locais, pois o benefício real do algoritmo de transferência delta do rsync é reduzir o uso da rede.

Considere também adicionar --numeric-idspara evitar o mapeamento de valores uid / gid por nome de usuário / grupo.


1
Gênio, obrigado. Btw, acabei usando, rsync -avxHAWX --numeric-ids --progress / mnt/mas deveria ter feito rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Eu suspeito que derramar a saída no terminal atrasou o processo. : D
Chris K

28
--info=progress2em vez de --progressé útil para grandes transferências, pois fornece progresso geral, em vez de (milhões de linhas para) arquivos individuais.
Florian

3
Eu tive que substituir Xe Acom E, porque atributos estendidos e ACLs são abordados Eno meu mac. Testado:rsync version 2.6.9 protocol version 29
Jonathan Komar 4/16

1
Além > ~/rsync.out, 2> ~/rsync.errirá poupar nenhum erro em um arquivo separado.
Aneel

2
Se você estiver copiando de outra pasta que não seja /, observe que ter uma barra final (ou não) no diretório de origem faz a diferença: rsync source/ dest/copia tudo source/para dentro dest/, enquanto rsync source dest/copia a pasta sourcee tudo para dentro dest/.
semi-extrínseco

45

A resposta de Michael Aaron Safyan não explica arquivos esparsos. -Sopção corrige isso.

Além disso, essa variante não envia spam com o progresso de cada arquivo e não faz a sincronização delta, o que prejudica o desempenho em casos que não são da rede.

Perfeito para copiar sistema de arquivos de uma unidade local para outra unidade local.

rsync -axHAWXS --numeric-ids --info=progress2

1
Surpreendente. Isso está realmente fazendo um bom trabalho
Gildas

1
Esta deve ser a resposta aceita, funciona muito bem. Exemplo55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Drew

1
<3 isto é perfeito
Tim Strijdhorst 21/01

6

Para uma cópia local única de uma unidade para outra, acho que o cp é suficiente, conforme descrito por Wolfmann aqui acima.

Para trabalhos maiores, como backups locais ou remotos, por exemplo, o melhor é o rsync .

Obviamente, o rsync é significativamente mais complexo de usar.

Por que o rsync:

  • isso permite copiar (cópia sincronizada) toda ou parte de sua unidade A para a unidade B, com muitas opções, como excluir alguns diretórios da cópia (por exemplo, excluir / proc).

  • Outra grande vantagem é que essa ferramenta nativa monitora a transferência de arquivos: por exemplo, para transferências massivas, se a conexão for interrompida, ela continuará do ponto de interrupção.

  • E por último mas não menos importante, o rsync usa a conexão ssh, portanto, isso permite que você obtenha "cópias" seguras e sincronizadas remotas. Dê uma olhada na página de manual e aqui para alguns exemplos .


4

Como Michael Safyan sugere acima, eu usei rsyncpara esse fim. Sugiro usar algumas opções adicionais para excluir diretórios que você provavelmente não deseja copiar.

Esta versão é bastante específica para sistemas baseados no Gnome e Debian / Ubuntu, pois inclui subdiretórios de diretórios pessoais dos usuários que são específicos do Gnome, bem como o cache do pacote APT.

A última linha excluirá qualquer diretório chamado cache / Cache / .cache, que pode ser muito agressivo para alguns usos:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Adicionando dois bits úteis ao thread re rsync: alterando o código e usando --update:

De acordo com o post de Wolfman, cp -axé elegante e legal para coisas locais.

No entanto, rsyncé incrível também. Além da resposta de Michael -W, alterar o código também pode acelerar as coisas (leia as implicações de segurança).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

alguma discussão (e benchmarks) em torno do local sobre uma CPU lenta ser o gargalo real, mas parece me ajudar quando a máquina é carregada fazendo outras coisas simultâneas.

Um dos outros grandes motivos para usar o rsync em uma cópia grande e recursiva como essa é por causa da opção -u (ou --update ). Se houver um problema durante a cópia, você poderá corrigi-lo e o rsync continuará de onde parou (não acho que o scp tenha isso). Fazendo-o localmente, o cp também possui uma opção -u.

(Não sei ao certo quais são as implicações de --update e --whole-file juntas, mas elas sempre parecem funcionar sensatamente para mim nesse tipo de tarefa)

Sei que isso não é um tópico sobre os recursos do rsync, mas alguns dos mais comuns que uso para isso são:

  • - delete-after etc (como Michael mencionou no acompanhamento), se você deseja sincronizar o novo sistema com o local original ou algo assim. E,
  • --exclude - para pular diretórios / arquivos, para instâncias como copiar / criar um novo sistema para um novo local e pular diretórios pessoais do usuário etc. (você está montando residências de outro lugar ou criando novos usuários etc.).

Aliás, se eu tiver que usar o Windows, uso o rsync da cygwin para fazer grandes cópias recursivas, por causa da morte cerebral do explorador querer começar do início (embora eu ache o Finder o OS X ainda pior)


2

rsync

"Essa abordagem é considerada melhor que a clonagem de disco com dd, pois permite que um tamanho diferente seja usado, tabela de partições e sistema de arquivos, e melhor que copiar com cp -a, porque permite maior controle sobre permissões de arquivo e atributos. , Listas de controle de acesso (ACLs) e atributos estendidos ".

De:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

Página do Homem Aqui


2

Como mencionado nos comentários de juniorRubyist, a abordagem preferida aqui deve ser o uso dd. O principal motivo é o desempenho, é uma cópia bloco por bloco em vez de arquivo por arquivo.

Clonando uma partição

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Clonando um disco inteiro

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Referências

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddé uma péssima idéia por 2 motivos: primeiro, executar uma cópia em nível de bloco de um sistema de arquivos montado (o que é o caso /) resultará mais do que provável em erros de destino no sistema de arquivos e, em segundo lugar dd, não copiará dados de fontes montadas em o sistema de arquivos como /boote /home. Seu link é válido para clonagem de disco, não para "clonagem de hierarquia de arquivos"
Eric

1

'dd' é incrível, mas o ddrescue (apt install gddrescue) é ainda melhor. Se o dd for interrompido, não há como reiniciar (outro bom motivo para usar o rsync). Quando você usa o ddrescue com um arquivo de log, ele controla quais blocos foram copiados.

Ao fazer backup de um sistema Windows / Linux de inicialização dupla, uso o ntfsclone para as partições do Windows e o ddrescue para a partição do Linux e o dd para o MBR. (Não tentei fazer backup de um sistema de inicialização dupla usando GPT / UEFI.)

O que eu adoraria ver é uma ferramenta ddrescue que pode criar arquivos como o ntfsclone, onde o espaço não alocado é marcado com caracteres de controle. Isso torna a imagem não montável diretamente, mas permite que ela seja tão grande quanto os dados contidos.

Alguém por favor venha com o "formato de imagem especial" ntfsclone para ddrescue ...


0

rsync é a solução perfeita, conforme explicado acima.

Eu apenas adicionaria -Spara " manipular arquivos esparsos com eficiência ", caso haja um volume do dispositivo docker ou similar a ser copiado.


0

Eu tentei os comandos rsync propostos aqui, mas finalmente obtive resultados muito mais limpos e rápidos partclone. Desmonte as partições de origem e destino e execute o seguinte:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Isso executa as seguintes etapas:

  1. Clone (apenas as partes usadas) da partição
  2. verifique se o sistema de arquivos está correto (resize2fs aplica esta etapa)
  3. redimensionar a partição para o novo sistema de arquivos

O procedimento acima funciona caso a partição de destino seja do mesmo tamanho ou maior que a origem. Se o seu destino for menor que a origem (mas se encaixa em todos os dados), faça o seguinte:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M reduz o sistema de arquivos ao tamanho mínimo antes de clonar os dados.

Observe que partclonenão é instalado por padrão na maioria dos sistemas. Use uma distribuição ao vivo como o clonezilla ou instale o partclone a partir do seu gerenciador de pacotes distros ( apt-get install partcloneem sistemas baseados em debian).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.