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 kpartx
root@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/backupN
root@ubuntu:~# kpartx -d copia-sda.img

loop deleted : /dev/loop0