Embora a princípio o "desafio" proposto possa parecer difícil, não viável ou soar ingênuo, como alguns comentaram, não é. A idéia principal por trás do uso do dd para migrar de um disco maior para um menor é perfeitamente adequada e traz benefícios para a migração dos dados. Obviamente, ter espaço livre suficiente para que os dados ocupados caibam no disco de destino é um requisito necessário.
A idéia é pensar em dding em cada partição individualmente e não no disco inteiro de uma vez como inicialmente proposto. Ainda mais pode ser realizado: as partições que seriam truncadas também podem ser migradas com segurança com uma pequena ajuda de ferramentas de redimensionamento do sistema de arquivos. De fato, esse tipo de migração é interessante para preservar matadados do sistema de arquivos e atributos de arquivos 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. Usar o dd elimina a necessidade de reinstalar o sistema operacional ou ter que reclassificar o FS para evitar problemas com o SELinux.
Abaixo está o que eu costumo fazer para realizar tarefas semelhantes:
1) Primeiro você reduz o (s) sistema (s) de arquivos dentro das 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 possuem ferramentas de redimensionamento para o mesmo propósito). Observe que, embora - por razões óbvias - um sistema de arquivos não possa ser maior do que a partição em que ele 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. Neste caso, sugiro reduzir o fs para, digamos, 450 Gig (você tem que 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 de dados.
2) Particione o disco de destino com a geometria apropriada considerando suas restrições de espaço;
3) dd 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 são apenas exemplos;
OBSERVAÇÃO IMPORTANTE: Ao fazer o dd'ing de um dispositivo de partição maior para um menor, o dd irá reclamar sobre a tentativa de escrever post no final do dispositivo de bloco, já que os dados do sistema de arquivos seriam copiados completamente antes de chegar a esse ponto. Para evitar essa mensagem de erro, você pode especificar o tamanho da cópia usando os parâmetros bs=
e count=
para coincidir com o tamanho do sistema de arquivos reduzido, mas isso exigirá alguns cálculos (simples), mas se feito incorretamente pode arriscar seus dados. p>
4) Depois de inserir os dados, redimensione o (s) respectivo (s) sistema (s) de arquivos dentro da (s) partição (õ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, resize2fs aumenta o sistema de arquivos para que ele ocupe o tamanho máximo permitido, portanto, nesse caso, o sistema de arquivos de 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ê especifique acidentalmente os tamanhos e arrisque seus dados. Observe que as unidades GB x GiB podem ser complicadas).
Nota para operações mais complexas: Se você tem um gerenciador de inicialização que pretende copiar, o que é muito provável que seja o caso, você pode inserir 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, em seguida, 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 inserir uma partição por vez. Eu fiz operações assim muitas vezes. Muito recentemente, realizei com sucesso uma migração complexa ao atualizar de um HDD contendo uma mistura de MacOSX & Instalações Linux para um SDD menor no meu MacMini6,2. Neste caso, eu tive que inicializar o Linux a partir de uma unidade externa, dd'ed o gerenciador de inicialização, executei o gdisk para consertar o GPT no novo disco e, finalmente, inseri cada partição contendo apenas os filesystes apenas reduzidos. (Observe que o esquema de partição GPT mantém duas cópias da tabela de partição, 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 de 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 irrecuperavelmente.
E caso eu não tenha enfatizado o suficiente: faça backup dos seus dados antes da migração! :)