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! :)
dd
o cálculo do tamanho do bloco óptimo é útil