Crie um disco inicializável a partir da imagem da partição ext4

Crie um disco inicializável a partir da imagem da partição ext4

Meu objetivo é criar um backup inicializável do meu sistema sem reiniciar, usarei qemu-img para converter uma imagem dd bruta em vhdx e executá-la no Hyper-V.

Se eu inicializar em um liveCD e executar:

dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc

Posso convertê-lo em um vhdx e executá-lo diretamente no Hyper-V sem muito esforço.

saída fdisk -l:

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 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: gpt
Disk identifier: 7555D04B-D6DC-4ABB-8863-529E874BADAD

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2000895   1998848   976M EFI System
/dev/sda2  2000896 500117503 498116608 237.5G Linux filesystem

No entanto, você não pode usar esse comando enquanto o sistema estiver online, então estou usando o driver dattobd para copiar todo o meu sistema de arquivos ext4 assim:

dd if=/dev/datto0 of=/nfs/sda2.raw bs=1M

Isso copia efetivamente todos os dados /dev/sda2corretamente, verifiquei isso porque o hash é o mesmo se eu usar o liveCD e dd a /dev/sda2partição. Agora posso inicializar em um liveCD e copy /dev/sda1, essa é a partição EFI, então ela não muda com muita frequência, a menos que eu atualize o grub ou algo relacionado ao kernel do Linux, estou bem em reiniciar apenas para fazer backup dessa partição de vez em quando, mas se alguém sabe uma maneira de fazer isso online, por favor me diga.

Agora que tenho /dev/sda1e /dev/sda2em dois arquivos separados, minha pergunta é como posso montar esses dois em um único arquivo que forneceria essencialmente a mesma saída que a execução dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notruncem um liveCD? Você precisaria apenas alinhar os bytes perfeitamente? Eu procurei por isso em todos os lugares e sem sorte. Qualquer ajuda é muito apreciada!

Responder1

Você pode montar em loop a imagem de todo o disco com suporte de partição e, em seguida, colocar dda imagem atualizada dentro dela:sda2

losetup -P /dev/loop0 /nfs/sda.raw  #this will create /dev/loop0p1 and loop0p2
dd if=/nfs/sda2.raw of=/dev/loop0p2
losetup -d /dev/loop0

Alternativamente, sua tabela de partições indica que sua primeira partição começa no setor #2048, então seu disco tem 2048 * 512 bytes = 1 MiB de espaço antes da primeira partição ("cabeça") e 500118192 - 500117503 - 1 = 688 setores (344 kiB) de espaço no final ("cauda") fora de qualquer partição. ( -1 porque o primeiro setor é #0, não #1)

A primeira partição termina no setor #2000895 e a segunda começa em #2000896, portanto não há espaço não utilizado entre elas.

Você está usando a tabela de partição GPT, que inclui uma cópia de backup da tabela de partição no final do disco, portanto, a parte "final" também será necessária para capturar. Começa no setor #500117504 e continua até o final do disco.

Assim, você poderia capturar o conteúdo das partes "cabeça" e "cauda" separadamente e depois juntar tudo:

dd if=/dev/sda of=/nfs/head.raw bs=512 count=2048
dd if=/dev/sda of=/nfs/tail.raw bs=512 skip=500117504
cat /nfs/head.raw /nfs/sda1.raw /nfs/sda2.raw /nfs/tail.raw > /nfs/sda.raw

A menos que você modifique a tabela de partição, você precisará capturar as partes "inicial" e "final" apenas uma vez: elas não devem ser alteradas durante o uso normal do sistema.

informação relacionada