Erro Initramfs após a restauração da imagem usando o dd

2

Eu preciso criar backups de um sistema Ubuntu de uma forma que eu possa restaurar facilmente os dados e o sistema, já que ele está exatamente pronto. Então, decidi usar o dd para criar imagens inteiras de HHD.

Eu criei a imagem da seguinte forma:

dd if=/dev/current_drive of=/dev/backup_drive/backup.img conv=sync status=progress

A imagem foi feita sem erros. Depois disso, decidi restaurar a imagem para uma nova unidade de teste:

dd if=/backup_drive/backup.img of=/dev/new_drive conv=sync status=progress

Até agora, tudo bem. A restauração da imagem foi sem erros. Mas quando tentei inicializar a partir do novo disco que restaurou a imagem, encontrei initramfs de erros:

Portanto, após o manual fsck , os erros foram limpos e eu consegui inicializar a partir do novo HDD. Mas eu tentei algumas vezes o procedimento de restaurar a imagem para a unidade e cada vez que tive problemas com a inicialização. Minha unidade de sistema original e a nova são absolutamente idênticas, de acordo com

sudo fdisk -l :

/dev/sda/ é o novo disco rígido.

/dev/sdb/ é o original do qual a imagem foi criada.

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf11c2eb5

Device     Boot     Start       End   Sectors  Size Id Type
/dev/sda1  *         2048 455024639 455022592  217G 83 Linux
/dev/sda2       455026686 488396799  33370114 15.9G  5 Extended
/dev/sda5       455026688 488396799  33370112 15.9G 82 Linux swap / Solaris


Disk /dev/sdb: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf11c2eb5

Device     Boot     Start       End   Sectors  Size Id Type
/dev/sdb1  *         2048 455024639 455022592  217G 83 Linux
/dev/sdb2       455026686 488396799  33370114 15.9G  5 Extended
/dev/sdb5       455026688 488396799  33370112 15.9G 82 Linux swap / Solaris

Então, alguma idéia do que estou fazendo errado e por que recebo erros de inicialização após a restauração da imagem? Não quero em uma situação real ter que consertar o eventual novo disco rígido em caso de falha do original.

Btw, a unidade original é SSD, enquanto a nova é HDD, se isso for importante.

    
por CuriousGuy 08.02.2018 / 21:09

1 resposta

2

Quando você dd

  • dispositivo de origem / sistema de arquivos não deve ser alterado / montado / gravado em
  • não use conv com noerror e sync , corrompe dados
  • adicione bs=1M (ou bs=64K ) para motivos de desempenho
Basicamente, uma cópia de disco direta consistente e bem sucedida só pode ser obtida através de um sistema independente como um Live CD, e mesmo assim você tem que ter cuidado sobre sistemas de arquivos sendo montados automaticamente sem que você sequer saiba. / p>

Além disso, se você espera que ocorram erros de leitura (portanto sync , noerror e outras opções conv ), é muito mais confiável usar ddrescue . Ele lida com erros de leitura corretamente e até mesmo tem a capacidade de repetir e retomar.

Ao todo, as cópias em nível de bloco tendem a não ser confiáveis porque é fácil cometer erros. A única razão pela qual eles são feitos é que é o único método para produzir uma cópia com consistência perfeita (somente se for feito corretamente).

Todas as outras abordagens são meramente boas o suficiente na prática, nunca perfeitas. Não há como fazer uma cópia perfeita com processos em execução que mantêm metade dos dados na memória e a outra metade no disco. Você tem que desligá-lo para obter a imagem completa. (Ou virtualize tudo e congele-o.)

Existem alternativas:

  • backups baseados em arquivos usando programas de backup dedicados, como cp, rsync, ou borg
  • ferramentas específicas do sistema de arquivos (xfsdump, btrfs send / snapshot, ...)
  • LVM instantâneos (mas não com btrfs )
  • Bancos de dados precisam de tratamento especial e fornecem suas próprias ferramentas de backup

Se deve ser uma cópia em nível de bloco, você também pode abusar do sistema mdadm para colocar uma camada RAID 1 na unidade de origem e usá-la para produzir uma cópia consistente de um sistema em execução adicionando uma unidade de destino. O RAID mantém ambos os lados em perfeita sincronia, evitando assim, principalmente, o problema de inconsistência (desde que você permita que a sincronização termine antes de remover a unidade de destino).

# RAID creation (before installing Linux)
mdadm --create /dev/md0 --level=1 --raid-devices=1 --force /dev/source

# /proc/mdstat
md0 : active raid1 sda2[3]
      134306472 blocks super 1.2 [1/1] [U]

# Add the target drive.
mdadm --grow /dev/md0 --raid-devices=2 --force
mdadm --manage /dev/md0 --add --write-mostly /dev/target

# Wait for RAID resilvering.
mdadm --wait /dev/md0
sync

# Remove the target drive.
mdadm /dev/md0 --fail /dev/target
mdadm /dev/md0 --remove /dev/target
mdadm --grow /dev/md0 --raid-devices=1 --force

Mas isso é um hack e a cópia ainda aparecerá como um sistema de arquivos que não foi montado corretamente. Isso é um pouco menos pior do que uma perda de energia, já que você não consegue fazer um sync quando perde energia inesperadamente. Mas ordens de magnitude melhor do que dd , onde o estado da primeira metade da imagem é de horas após a última metade.

Eu uso esse método para espelhar minha unidade SSD única no HDD toda semana, sem impedir que o HDD fique em standby. Caso o SSD falhe, o HDD pode ser inicializado diretamente com pouco esforço.

É claro que o mesmo pode ser alcançado com uma cópia baseada em arquivo.

Já que você menciona UUIDs, clonar unidades em um nível de bloco irá clonar UUIDs, o que pode ser a causa do desaster. (No caso do hack RAID acima, eles estão convenientemente escondidos atrás da camada RAID).

A cópia baseada em arquivo para um novo sistema de arquivos terá novos UUIDs, mas é razoavelmente fácil de resolver:

  • chroot , edite /etc/fstab , atualize initramfs, reinstale o gerenciador de inicialização (você encontra o método chroot basicamente em todos os linux wiki)
  • Caso contrário, restaure antigos UUIDs alterando-os com tune2fs -U <UUID> , existem ferramentas semelhantes para outros sistemas de arquivos (requer documentação, caso contrário, você não saberá quais UUIDs você precisa). Novamente, cuidado para não duplicá-los, faça isso apenas se o dispositivo antigo desaparecer completamente.
por 08.02.2018 / 22:25