Vdi Disk Editing

In questa pagina viene spiegato come montare ed eventualmente modificare il contenuto di un disco virtuale di VirtualBox ma anche di altre macchine virtuali. Fondamentalmente esiste una guida sul forum di VirtualBox su come montare questi dischi ma essa non è di immediata applicazione.

Preparazione del sistema ospite

Prima di proseguire occorre installare sulla macchina ospite FUSE e VirtualBox considerando di avere una Ubuntu si esegua:

sudo apt-get install gvfs-fuse
sudo apt-get install virtualbox-ose

wget http://lugge.wikidot.com/local--files/vdi-disk-editing/vdfuse.gz -O /tmp/vdfuse.gz
gunzip /tmp/vdfuse.gz
sudo cp -f /tmp/vdfuse /usr/local/bin
sudo chmod a+x f /tmp/vdfuse /usr/local/bin

sudo http://lugge.wikidot.com/local--files/vdi-disk-editing/diskmount.sh -O /usr/local/bin/diskmount.sh
sudo chmod a+x /usr/local/bin/diskmount.sh

Questi due pacchetti e le loro dipendenze sono necessari per il funzionamento del binario vdfuse infatti:

roberto@nerone:~/Desktop/tc2/vdfuse$ ldd bin/vdfuse
    /lib/ld-linux.so.2 (0xb7f2c000)
    linux-gate.so.1 =>  (0xb7f2b000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b80000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7ef1000)
    libfuse.so.2 => /lib/libfuse.so.2 (0xb7eff000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7859000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7818000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ce3000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7ef6000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7868000)
    libz.so.1 => /lib/libz.so.1 (0xb783e000)
    VBoxDD2.so => /usr/lib/virtualbox/VBoxDD2.so (0xb7957000)
    VBoxDD.so => /usr/lib/virtualbox/VBoxDD.so (0xb7cfc000)
    VBoxDDU.so => /usr/lib/virtualbox/VBoxDDU.so (0xb7b55000)
    VBoxREM.so => /usr/lib/virtualbox/VBoxREM.so (0xb7854000)
    VBoxRT.so => /usr/lib/virtualbox/VBoxRT.so (0xb7985000)
    VBoxVMM.so => /usr/lib/virtualbox/VBoxVMM.so (0xb7a0b000)

L'applicativo vdfuse è stato compilato a partire dai sorgenti versione 50 su Ubuntu 9.04 utilizzando headers di VirtualBox svn trunk revision 20055 del 2009-05-26 e il suo funzionamento è stato verificato con la versione 2.2.2 r46594 proprietaria di VirtualBox.

Montare il disco virtuale e le sue partizioni

Fondamentalmente il processo si divide in due parti:

  1. vdfuse monta il disco .vdi dentro una directory e il contenuto di quella directory è un file denominato EntireDisk il quale per esempio potrebbe essere dato in pasto a qemu in questo modo qemu -hda path/EntireDisk ma il cui contenuto potrebbe anche essere ulteriormente montato
  2. Le partizioni di EntireDisk possono essere montate ulteriormente in altre directory e per fare questo si utilizza il comando mount -o loop,offset=$OFFSET in particolare si può utilizzare lo script allegato diskmount.sh il quale invece senza opportuni accorgimenti richiede di operare come superutente root

Esempio

roberto@nerone:~/Desktop/tc2/vdfuse$ bin/vdfuse -h
DESCRIPTION: This Fuse module uses the VirtualBox access library to open a 
VirtualBox supported VD image file and mount it as a Fuse file system.  The
mount point contains a flat directory containing the files EntireDisk,
Partition1 .. PartitionN.  These can then be loop mounted to access the
underlying file systems

USAGE: bin/vdfuse [options] -f image-file mountpoint
    -h    help
    -r    readonly
    -t    specify type (VDI, VMDK, VHD, or raw; default: auto)
    -f    VDimage file
    -a    allow all users to read disk
    -w    allow all users to read and write to disk
    -g    run in foreground
    -v    verbose
    -d    debug

roberto@nerone:~/Desktop/tc2/vdfuse$ mkdir /tmp/1; bin/vdfuse -wf ../vdisk.vmdk /tmp/1

roberto@nerone:~/Desktop/tc2/vdfuse$ ls -al /tmp/1
total 262149
dr-xr-xr--  1 roberto roberto         0 2009-06-01 12:28 .
drwxrwxrwt 16 root    root         4096 2009-06-04 10:02 ..
-rw-rw-rw-  1 roberto roberto 268435456 2009-06-01 12:28 EntireDisk

roberto@nerone:~/Desktop/tc2/vdfuse$ bin/diskmount.sh 

USAGE: diskmount.sh path/disk.vdi partition_number

roberto@nerone:~/Desktop/tc2/vdfuse$ sudo bin/diskmount.sh /tmp/1/EntireDisk 1
[sudo] password for roberto: 
Mounting with option offset=32256
/dev/loop0            248M   13M  223M   6% /mnt/EntireDisk1

roberto@nerone:~/Desktop/tc2/vdfuse$ ls -al /mnt/EntireDisk1
total 4506
drwxr-xr-x 4 root   root     1024 2009-05-27 22:15 .
drwxr-xr-x 8 root   root     4096 2009-05-27 19:48 ..
drwx------ 2 root   root    12288 2009-05-27 20:55 lost+found
-rw-r--r-- 1 root   root   309979 2009-05-28 15:23 mydata.tgz
-rw-r--r-- 1 root   root  4263356 2009-05-27 19:49 nxclient.tce
drwxr-xr-x 3 ospite staff    1024 2009-05-27 22:11 tce

Conversione VDI per QEMU o compressione dell'immagine

Completare questa guida con le istruzioni per le seguenti stringe di comandi:

VBoxManage convertdd image.bin image.vdi
VBoxManage modifyvdi image.vdi compact
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.