'dd' pode ser usado para clonar em um HDD menor, sabendo que as partições precisarão de edição?

14

Eu costumava ddclonar discos como este:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync

E sempre funcionou bem. Todo e qualquer documento em 'dd' se esforça para lembrar que o disco de destino deve ter o mesmo tamanho ou maior que a origem. Isso absolutamente tem que ser verdade?

Agora, entendo perfeitamente que, se clonar em um disco menor, não posso esperar que nenhuma partição que esteja parcialmente fora dos limites do destino esteja intacta.

No entanto, sabendo muito bem que eu precisaria editar minhas partições no destino mais tarde, excluindo as 'fora dos limites', eu ainda poderia usar 'dd' para fazer uma cópia de força bruta da fonte até os limites do tamanho físico do alvo? Ou 'dd' reduziria o alvo a uma pilha de destroços quando atingisse o limite de seu tamanho ;-)

BTW, pesquisando isso, eu já vi valores recomendados para bs=tudo, bs=1024até o bs=32Mque realmente é melhor?

Ray Andrews
fonte
Nota, se utilizar dd o cálculo do tamanho do bloco óptimo é útil
Wilf

Respostas:

7

A unidade física não deve começar a fumar, pelo menos, mas as chances são muito boas de que seu sistema de arquivos não funcione mais (quero dizer, o sistema de arquivos de destino; se você apenas copiou e não tocou em nada na fonte, a própria fonte deve estar bem) ) Os dados dentro de uma partição não são necessariamente alocados em ordem crescente. Algumas delas podem estar no final da partição, mesmo que a partição não esteja cheia (na verdade, acho que isso acontece de maneira determinística com algum sistema de arquivos, mas não sei o suficiente para entrar em detalhes). Os dados podem ser essenciais para a integridade do sistema de arquivos. Portanto, recomendo fortemente que você não confie nessa cópia.

Se você deseja fazer esta cópia, primeiro é necessário reduzir a partição com alguma ferramenta que esteja ciente de sua estrutura interna e capaz de remapear tudo em boa ordem em uma partição menor. Então você pode fazer a cópia. gpartedé uma boa interface gráfica para fazer esse tipo de coisa.

Para o bsvalor, geralmente a melhor ideia é fazer alguns testes antes de iniciar a cópia real. Existem algumas ferramentas que ajudam a automatizar essa verificação, mas não me lembro do nome. Na minha experiência, o melhor intervalo é geralmente entre 4M e 16M. Maior do que isso, você não ganha mais. Mas isso depende de muitas coisas, incluindo os próprios discos. Por exemplo, raramente trabalhei com discos high-end reais, o que pode ser adequado para valores mais altos devido à maior velocidade e tamanho do cache.

EDIT Se uma partição é totalmente copiada, você pode usá-la sem problemas. No entanto, como outros sublinharam, você também deve ter certeza de que a tabela de partição está intacta (pelo menos, as entradas relevantes). Com as quatro partições principais do MBR, não há problemas, pois elas são descritas nos primeiros 512 bytes do disco. Partições lógicas são descritas em toda a partição estendida, portanto, as entradas podem ser perdidas (mas descreveriam partições que seriam perdidas de qualquer maneira). Com o GPT, há uma cópia da tabela de partição no início e no final do disco. Você perde o segundo, mas pode reconstruí-lo a partir do primeiro. Obviamente, é aconselhável fazer isso o mais rápido possível; outras respostas foram mais precisas com relação a isso.

Giovanni Mascellani
fonte
Por favor, veja a questão editado :)
Ray Andrews
1
@rayandrews Não tenho certeza de qual atualização você está esperando, mas basicamente ddcopia bytes. Ele começará no byte 0 e continuará copiando até que algo (no seu caso, fim da mídia no destino) o interrompa. Isso deixará você com uma tabela de partições que especifica uma unidade maior que a realidade e partições fora da unidade ... mas se você corrigir isso, tudo ficará bem. Embora provavelmente fosse mais fácil usar o dd por partição para copiar os dados. [Ele também vai deixá-lo com todos os problemas normais de dd, como UUIDs duplicados]
derobert
O que eu gosto é que ele cria e rotula as partições e os sistemas de arquivos à medida que avança - economizando muito tempo. Direito sobre os UUIDs tho.
Ray Andrews
1
como você restaura a segunda tabela gpt?
user230910
2

Embora a princípio o "desafio" proposto possa parecer difícil, inviável ou pareça ingênuo, como alguns comentaram, não é. A principal idéia por trás do uso do dd para migrar de um disco maior para um disco menor é perfeita e traz benefícios para a migração dos dados. Obviamente, ter espaço livre suficiente para que os dados ocupados se ajustem ao disco de destino é um requisito necessário.

A idéia é pensar em dd'ing cada partição individualmente e não o disco inteiro de uma só vez, como proposto inicialmente. Ainda mais pode ser realizado: As partições que seriam truncadas também podem ser migradas com segurança com uma pequena ajuda das ferramentas de redimensionamento do sistema de arquivos. De fato, esse tipo de migração é interessante para preservar dados matadados do sistema de arquivos e atributos de arquivo estendidos que não podem ser facilmente copiados com ferramentas como cp, rsync, pax, ... que operam na camada do sistema de arquivos e não bloqueiam a camada do dispositivo. O uso do dd elimina a necessidade de reinstalar o SO ou a necessidade de rotular novamente o FS para evitar problemas com o SELinux.

Abaixo está o que eu costumo fazer para realizar tarefas semelhantes:

1) Primeiro, você reduziu o (s) sistema (s) de arquivos nas partições afetadas que seriam truncadas. Para isso, use a ferramenta resize2fs (assumindo que estamos falando de um ext2 / ext3 / ext4 fs - outros FSs modernos também têm ferramentas de redimensionamento para a mesma finalidade). Observe que, embora - por razões óbvias - um sistema de arquivos não possa ser maior que a partição em que reside, ele pode ser menor com segurança. O truque de segurança aqui é reduzir "mais do que o necessário". Por exemplo: imagine que você tenha um sistema de arquivos de 1 TB que deseja migrar para uma unidade de 500 Gig. Nesse caso, sugiro reduzir o fs para, digamos, 450 Gig (você precisa ter espaço livre suficiente para isso, é claro, ou seja, o espaço atualmente ocupado neste sistema de arquivos não pode exceder 450 Gig). O aparente desperdício de 50 Gig de espaço será corrigido após a migração dos dados.

2) Particione o disco de destino com a geometria apropriada, considerando suas restrições de espaço;

3) localize os dados usando o (s) dispositivo (s) de partição e não o dispositivo de disco (ou seja, use dd if=/dev/sda# of=/dev/sdb#para cada partição em vez de usar if=/dev/sda of=/dev/sdb). NOTA: sda e sdb aqui são apenas exemplos; NOTA IMPORTANTE: Ao copiar de um dispositivo de partição maior para um menor, o dd se queixará de uma tentativa de gravar uma postagem no final do dispositivo de bloco, tudo bem, pois os dados do sistema de arquivos teriam sido totalmente copiados antes de chegar a esse ponto. Para evitar essa mensagem de erro, você pode especificar o tamanho da cópia usando bs=e count=parâmetros para corresponder ao tamanho reduzido do sistema de arquivos, mas isso exigirá algum cálculo (simples), mas se feito de maneira errada, poderá arriscar seus dados.

4) Após copiar os dados, redimensione o (s) sistema (s) de arquivos respectivo (s) nas partições de destino novamente usando resize2fs. Desta vez, não especifique o novo tamanho do sistema de arquivos. Quando executado sem uma especificação de tamanho, o resize2fs aumenta o sistema de arquivos para que ele ocupe o tamanho máximo permitido; portanto, nesse caso, o sistema de arquivos 450 Gig crescerá novamente para ocupar toda a partição de 500 Gig e nenhum byte será desperdiçado. (A abordagem "reduzir mais do que o necessário" evita que você acidentalmente especifique tamanhos incorretamente e arrisque seus dados. Observe que as unidades GB vs GiB podem ser complicadas).

Nota para operações mais complexas: Se você possui um gerenciador de inicialização que deseja copiar, o que provavelmente ocorrerá, é possível criar os primeiros KBs do disco usando o dispositivo de disco em vez dos dispositivos de partição (como dd if=/dev/sda of=/dev/sdb bs=4096 count=5) e reconfigure a geometria em / dev / sdb (que conterá temporariamente uma geometria inválida para a nova unidade, mas um gerenciador de inicialização intacto e válido). Por fim, continue usando os dispositivos de partição conforme descrito acima para localizar uma partição por vez. Eu fiz operações assim muitas vezes. Recentemente, realizei com êxito uma migração complexa ao atualizar de um HDD contendo uma mistura de instalações MacOSX e Linux para um SDD menor no meu MacMini6,2. Nesse caso, tive que inicializar o Linux a partir de uma unidade externa, executar o gerenciador de inicialização, executar o gdisk para corrigir a GPT no novo disco e finalmente executar o processo de cada partição que continha apenas os arquivos de arquivo encolhidos. (Observe que o esquema de partição GPT mantém duas cópias da tabela de partições, uma no início e outra no final do disco. O gdisk reclama muito porque não consegue encontrar a segunda cópia do PT e porque as partições excedem o tamanho do disco, mas corrige corretamente o problema de cópia do PT depois de redefinir a geometria do disco). Este foi um caso muito mais complexo, mas vale a pena mencionar, porque ilustra que esse tipo de operação também é perfeitamente viável.

Boa sorte! ... e, mais importante, lembre-se de fazer backup de todos os dados importantes antes desse tipo de operação. Um erro e você certamente pode danificar seus dados de maneira irrecuperável.

E caso eu não tenha enfatizado o suficiente: faça backup dos seus dados antes da migração! :)

Marcelo
fonte
Muito boa explicação, obrigado!
Nirvana-msu
1

Se você deseja instalar um carro em uma passagem 20 cm mais estreita que o carro e cortar os 20 cm à esquerda do carro, o carro ainda funcionará? Provavelmente não.

Se você copiar o início de um disco para outro disco e diminuir a cópia porque o disco de destino é menor, o resultado não funcionará. Mesmo que haja espaço suficiente para caber todos os arquivos no disco de destino, o corte após N bytes desde o início do disco não fornecerá um sistema de arquivos em funcionamento.

Se o disco estiver dividido em partições no estilo PC (GPT ou MBR), todas as partições que se encaixam totalmente no destino funcionarão. Há uma exceção: com partições MBR, se as partições lógicas não estiverem numeradas em ordem de disco, assim que a cadeia deixar a área de destino, as partições não serão mais listadas. (Se você não entende isso, é mais um motivo para não fazer uma cópia parcial do disco.) Seria muito mais conveniente copiar as partições que você deseja manter, em vez de copiar desde o início e terminar com o que se encaixa . A partição parcialmente copiada no final não será utilizável.

Se o disco ou uma partição parcial for um volume físico LVM e você fizer uma cópia parcial desse volume físico, também não poderá ter certeza de obter dados úteis do resultado.

Se você deseja copiar apenas alguns dados de um disco grande para um disco menor, crie partições no disco menor. Se você deseja copiar uma partição para uma partição do mesmo tamanho, pode fazê-lo cat. Se você deseja copiar uma partição para uma partição menor, crie um sistema de arquivos na partição de destino e faça uma cópia no nível do arquivo com algo como cp -aou pax -rw -pe -t.

Você pode usar em ddvez de catse for masoquista. ddtem uma sintaxe estranha e normalmentecat é mais lenta que a menos que você encontre o tamanho certo do buffer. Não existe um valor ideal para o tamanho do buffer, ele depende das características do seu hardware. Se o tamanho for muito pequeno, ddperderá tempo fazendo muitas transferências minúsculas. Se o tamanho for muito grande, você ddperderá tempo lendo completamente um buffer antes de começar a escrever o próximo. O tamanho ideal para uma transferência de disco para disco é geralmente de alguns megabytes (1024 bytes é ridiculamente pequeno). catescolherá um tamanho decente sem nenhum esforço de sua parte.

Gilles 'SO- parar de ser mau'
fonte
Sim, estou bem em perder as últimas partições. Em todos os meus discos, todas as coisas importantes sempre se encaixam no tamanho do menor dos meus discos. Partições além disso são sempre não essenciais. A coisa com 'gato' é que ele não irá criar partições ou um MBR (a menos que eu esteja errado)
Ray Andrews
@rayandrews Se você rodar catem todo o disco, ele criará as mesmas partições (com uma ressalva para partições MBR, veja minha edição). O mesmo vale para dd, usando ddé apenas uma maneira complicada de fazer cat. Se você executar catem uma partição, é claro que ela não criará partições; use fdisk / gdisk / parted /… para isso.
Gilles 'SO- stop be evil'
Muito interessante. OK, mostre-me um exemplo de comando, depois testarei e, se estiver bom, é a melhor solução.
Ray Andrews
@rayandrews Um exemplo de comando para fazer o que?
Gilles 'SO- stop be evil'
Apenas um exemplo de comando usando 'cat' para clonar um disco. Faça uma nova resposta para que eu possa aceitá-la.
Ray Andrews
0

Gostaria de compartilhar minha experiência com este tópico, caso isso seja útil para outro leitor. Recentemente, usei o DDRESCUE para recuperar o primeiro 1/3 de uma partição NTFS de um disco rígido com defeito e reconstruí com êxito o segmento recuperado da partição em um disco rígido menor - resgatando os arquivos capturados (e perdendo o resto). A seguir estão os passos que eu segui (definitivamente uma abordagem HACKSAW !!) ...

O disco rígido de origem consistia em 750 GB formatados em NTFS com uma tabela de arquivos MBR. Eu o havia usado apenas algumas vezes para fazer backup de arquivos; portanto, a maioria dos arquivos estava no início da unidade, com cerca de 160 GB. Um membro da família derrubou o disco rígido (montado externamente) no chão - ele nunca funcionou corretamente depois disso! Usando o ddrescue (meticulosamente), consegui recuperar uma grande parte do início da unidade. Devido ao dano físico, ele é desligado com muita frequência durante todo o processo ...

Eu tinha um pequeno disco rígido de laptop disponível de 150 GB (montado externamente), para o qual extraí os dados do ddrescue diretamente. Como alternativa, eu poderia ter extraído os dados em um arquivo de imagem e posteriormente montado o arquivo, no entanto, pensei que gravar os dados diretamente no disco rígido fosse mais direto.

O principal truque para o resgate foi editar manualmente os dados do setor de inicialização do MBR e do NTFS no disco rígido de resgate. Sem isso, o disco rígido não é reconhecido por nenhum sistema operacional. Não consegui encontrar um programa adequado no linux para fazer isso, então virei para o windows. Há um pacote útil chamado Ferramentas de Suporte do Windows, que não é mais mantido, embora ainda seja útil (veja o link abaixo)! A ferramenta que eu usei para editar a partição é o Disk Probe. Certifique-se de conhecer o valor do setor final do seu disco rígido (usei fdisk -l no Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Usando uma boa calculadora e um pouco de criatividade, carreguei e montei o disco rígido no Disk Probe no Windows e editei os valores do setor final. No MBR, dois conjuntos de valores tiveram que ser alterados, a saber: a) o setor final do disco rígido eb) o setor final da partição NTFS. No setor de inicialização do NTFS, o valor do total de setores da partição precisou ser alterado. Em cada caso, o valor numérico foi diminuído para corresponder à "dimensão" diminuída do disco rígido menor (os setores finais mudaram de 750 GB para 150 GB). Clique na guia Exibir para editar esses valores.

Aqui está uma imagem do Disk Probe em ação editando os dados do setor de inicialização NTFS Ferramentas de Suporte do Windows - Análise de disco

Ao editar os campos mencionados acima, o Windows reconheceu a partição como uma partição válida, embora danificada. Entrei no prompt de comando e executei o programa Windows Chkdsk no disco rígido danificado (chdsk D :). Foi emocionante ver a partição voltar à vida, arquivo por arquivo! O programa reconstruiu a tabela de partição e remapeou com êxito todos os arquivos que foram copiados do disco rígido danificado. Os arquivos que estavam fora do intervalo (não copiados) não foram encontrados e, portanto, foram eliminados.

Na próxima parte, não entendi o motivo, pois o Windows reconstruiu com êxito o disco rígido de 150 GB com os arquivos incluídos. No entanto, o Windows não conseguiu abrir a partição do disco rígido para visualização de arquivos (houve algum erro). No entanto Ubuntu para o resgate! Reiniciei o Ubuntu, montei o disco rígido externo e, sem problemas, todos os arquivos recuperados apareceram!

Felizmente, esse método de recuperação de arquivos de um disco rígido grande para um disco rígido menor será útil para outra pessoa pobre além de mim. Felicidades!

Dan Gardner
fonte
1
Você claramente pensa muito nessa resposta. Infelizmente, isso realmente não responde à pergunta. " ddrescuenão é derivado de dd, nem está relacionado de ddforma alguma, exceto pelo fato de que ambos podem ser usados ​​para copiar dados de um dispositivo para outro. A diferença é que o ddrescue usa um algoritmo sofisticado para copiar dados de unidades com falha, causando pouco dano possível. " - Wikipedia. Além disso, sua resposta parece estar focado principalmente em um ambiente operacional Windows, que não é uma configuração típica aqui
Fox
1
Como questionador original, ainda acho a experiência de Dan a mais útil, é bom saber o que pode ser feito em uma situação desesperadora, é claro que é periférico a esse segmento exato, mas não sejamos rigorosos.
Ray Andrews
0

Você precisa reduzir primeiro as partições na fonte (ou excluir essas fora dos limites).
Que dde depois que você provavelmente terá que reparar a tabela de partição usando gdisk /dev/sd<target>
e a sequência de teclas para reparar a tabela é v r d w
eu sugiro que você shring as partições um pouco menores do que o necessário e depois expandi-los de volta para o tamanho total do disco de destino.
(Esta resposta é baseada na minha experiência pessoal ao clonar meu HDD em um SSD menor)

Zhigalin - Restabelecer CMs
fonte
+1. Este método também funciona para mim: a clonagem funciona quando todas as partições cabem na unidade de destino :-) Apenas um comentário: Você precisa reparar a tabela de partição de backup de uma tabela de partição GUID (GPT), mas se houver um MSDOS de estilo antigo tabela de partição, não há tabela de partição de backup para reparar.
sudodus 26/12/19