Há poucos dias fui questionado quanto as ferramentas disponíveis, no Linux, para análise de imagens em formato RAW, comumente utilizadas em backups via dd ou dd_rescue. Resolvi escrever sobre o assunto porque considero interessante e envolve o processo de backup e restauração de dados (segurança da informação).
Podemos fazer backup de uma partição específica ou dispositivo completo. A dificuldade tende ser maior quando optamos pelo backup total. No caso de uma partição específica, a montagem costuma ser transparente – montando automaticamente como um dispositivo de loop.
Por exemplo:
root@ubuntu:~# dd if=/dev/sda1 of=/mnt/nfs/backup/copia-sda1.img root@ubuntu:~# dd if=/dev/sda of=/mnt/nfs/backup/copia-sda.img
A opção “if (input file)” identifica o arquivo de entrada (origem) e “of (output file)” o arquivo de saída (destino). Como estamos exemplificando o backup de um dispositivo de disco, o comum é que o destino esteja debaixo de um ponto de montagem remoto (cifs ou nfs, por exemplo).
No primeiro exemplo, onde clonamos uma partição específica, a montagem costuma ser transparente (caso a imagem não esteja corrompida). Nas versões mais atuais do Ubuntu, não é preciso informar o tipo de sistema de arquivos.
root@ubuntu:~# mkdir /mnt/backup root@ubuntu:~# mount copia-sda1.img /mnt/backup
Caso a imagem represente uma cópia do disco (particionado), será preciso analisar o particionamento para calcular o offset correto para acessar a área desejada. Podemos fazer isto com o comando fdisk – em alguns casos, o comando file retornará a posição inicial em startsector.
root@ubuntu:~# fdisk -l copia-sda.img Disk copia-sda: 931,5 GiB, 1000204886016 bytes, 1953525168 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: 0xdd0a21b5 Dispositivo Inicializar Start Fim Setores Size Id Tipo copia-sda1 * 2048 7999487 7997440 3,8G 83 Linux copia-sda2 8001534 1953523711 1945522178 927,7G 5 Estendida copia-sda5 8001536 691593215 683591680 326G 83 Linux copia-sda6 691595264 1945499647 1253904384 597,9G 83 Linux copia-sda7 1945501696 1953523711 8022016 3,8G 82 Linux swap / Solaris
Portanto, se desejarmos acessar o conteúdo de “copia-sda1“, faremos a montagem de um dispositivo de loop sob offset de 1048576 (2048 * 512):
root@ubuntu:~# mount -o loop,offset=1048576 copia-sda.img /mnt/backup
O processo pode ser mais trabalhoso caso a imagem esteja corrompida. Se for o caso, antes da montagem, é possível associá-la a um dispositivo de loop diretamente e, em seguida, executar a ferramenta de análise e correção fsck.
root@ubuntu:~# losetup --offset 1048576 /dev/loop2 copia-sda.img root@ubuntu:~# fsck /dev/loop2
Ao final do processo, devemos desassociar a interface:
root@ubuntu:~# losetup -d /dev/loop2
– Utilizei como referência o seguinte artigo:
https://major.io/2010/12/14/mounting-a-raw-partition-file-made-with-dd-or-dd_rescue-in-linux/
Outra alternativa, ainda mais fácil, é a utilização da ferramenta kpartx. Como não é uma ferramenta que costuma ser instalada por padrão, será necessário instalá-la antes. No Ubuntu está disponível via apt.
root@ubuntu:~# apt-get install kpartxroot@ubuntu:~# kpartx -av copia-sda.img add map loop0p1 (252:0): 0 7997440 linear 7:0 2048 add map loop0p2 (252:1): 0 1953523711 linear 7:0 8001534 ...
Feito isto, de acordo com o nome exibido acima, dispositivos loop serão criados em /dev/mapper.
root@ubuntu:~# mkdir /mnt/{backup1,backupN} root@ubuntu:~# mount /dev/mapper/loop0p1 /mnt/backup1 root@ubuntu:~# mount /dev/mapper/loop0pN/mnt/backupN
Concluída a operação (restaurar backup, por exemplo), podemos desmontar a imagem e remover o mapeamento feito sob /dev/loop0.
root@ubuntu:~# umount /mnt/backup1 root@ubuntu:~# umount /mnt/backupNroot@ubuntu:~# kpartx -d copia-sda.img loop deleted : /dev/loop0
Ótimo publicação.