J’utilise très fréquemment des machines virtuelles. Principalement avec VirtualBox pourtant j’utilise généralement le format de disque virtuel VMDK supporté par VmWare.

Aujourd’hui, j’ai besoin de récupérer un fichier sur l’une de mes machines. N’ayant pas envie de lancer la VM, je m’attaque donc directement au fichier VMDK. J’ai rapidement trouvé la solution offerte par VmWare “vmware-mount”, mais j’ai cherché un solution plus linuxienne..

Code

# Aujourd'hui on va devoir travailler en root.
su -

# Installation des outils nécessaire.
aptitude install afflib-tools sleuthkit kpartx

# Mon fichier VMDK à lire s'appel turnkey-tomcat-amd64.vmdk
# Pour plus d'info sur http://www.turnkeylinux.org/

# Je créer trois dossier "a", "b", "c" car je suis un peu fainéant
mkdir a b c

# Premièrement on "monte" le vmdk dans le premier dossier en format
# brut 'raw'
affuse -o allow_root turnkey-tomcat-amd64.vmdk a

# Puis on 'bind' l'image sur une interface loopback
losetup /dev/loop7 a/turnkey-tomcat-amd64.vmdk.raw

# On peut facilement voir le contenu de l'image,
# Dans notre cas on a deux partitions
fdisk -l /dev/loop7

## Unités = secteurs de 1 * 512 = 512 octets
## Périphérique Amorce  Début        Fin      Blocs     Id  Système
## /dev/loop7p1   *           1     1000000      500000   83  Linux
## /dev/loop7p2         1001472    39061503    19030016   8e  LVM Linux

# La première partition contient le /boot de notre système
mount -o loop,offset=$((255*1)) /dev/loop7 b
ls b
## config-2.6.32-5-amd64  grub  initrd.img-2.6.32-5-amd64  lost+found
## System.map-2.6.32-5-amd64  vmlinuz-2.6.32-5-amd64
umount b

# La seconde partition ne peut pas etre monté aussi facilement :
mount -o loop,offset=$((255*1001472)) /dev/loop7 c
##mount : type de système de fichiers « LVM2_member » inconnu

# Pour monter la partition LVM on va utiliser kpartx, pour mapper les
# partitions sur des fichiers indépendants
kpartx -a /dev/loop7
mount /dev/mapper/loop7p1 b
ls b
## config-2.6.32-5-amd64  grub  initrd.img-2.6.32-5-amd64  lost+found
##  System.map-2.6.32-5-amd64  vmlinuz-2.6.32-5-amd64

# Ensuite on monte le volume très classiquement
vgscan
##  Reading all physical volumes.  This may take a while...
##  Found volume group "turnkey" using metadata type lvm2
vgchange -ay "turnkey"
##  2 logical volume(s) in volume group "turnkey" now active

ls /dev/turnkey/
##root  swap_1

# Il y a deux partition dans notre lvm, pas besoin de monter le swap ;-)
mount /dev/turnkey/root c

# CQFD

# Avant de partir on débranche tout
umount c
umount b
kpartx -d /dev/loop7
# ou losetup -d /dev/mapper/loop7p1 && losetup -d /dev/mapper/loop7p2
losetup -d /dev/loop7
fusermount -u a

J’attends vos remarques !

Mes sources :