Aumentare le dimensioni di un’immagine di Qemu
Come aumentare la dimensione di un’immagine qcow, qcow2, raw che usa NTFS
Questo articolo spiega il modo di aumentare un’immagine disco in formato qcow, qcow2 o raw che contiene una partizione avviabile NTFS o FAT32. Fare una copia di backup, prima di eseguire la procedura.
La prima cosa da fare è convertire l’immagine dal formato qcow o qcow2 al formato raw.
$ qemu-img convert -f qcow imma.img -O raw hda.img
Per eseguire il prossimo passaggio bisogna essere root, questo serve per aumentare la dimensione del file hda.img. Un settore ha dimensione 512 byte, per cui 512 va diviso con il numero di byte della dimensione desiderata. Es: 10 GB = 10737418240 byte quindi 10737418240/512 = 20971520; il numero uscito va assegnato a seek.
$ dd if=/dev/zero of=hda.img bs=512 count=0 seek=20971520
$ ls -l hda.img
-rw-r–r– 1 root root 10737418240 2007-06-18 12:10 hda.img
Ora digitare
# losetup /dev/loop1 hda.img
Il comando appena impartito fa caricare l’immagine raw all’interno della periferica loopback.
Ora per controllare il Master Boot Record dell’immagine si può usare fdisk.
$ fdisk -ul /dev/loop1
Disk /dev/loop1: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 13105 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/loop1p1 * 63 8176895 4088416+ 7 HPFS/NTFS
L’output del programma mostra che il disco ha dimensione di 10 GB. Loop1p1 è la partizione presente nell’immagine disco.
Per esaminare il settore d’avvio della partizione, è necessario scaricare l’immagine dalla periferica loopback.
$ losetup -d /dev/loop1
Caricare il disco “logico” contenuto nella partizione 1, all’interno della periferica.
Per ottenere il secondo parametro da indicare a losetup bisogna moltiplicare il numero posto sotto Start indicato da fdisk con la dimensione Units. Es: 63 x 512 = 32256.
$ losetup -o32256 /dev/loop1 hda.img
Per controllare che il caricamento sulla periferica sia corretto si può usare il comando ntfsresize.
$ ntfsresize -i /dev/loop1
ntfsresize v1.13.1 (libntfs 9:0:0)
Device name: /dev/loop1
NTFS volume version: 3.1
Cluster size: 4096 bytes
Current volume size: 4186538496 bytes (4187 MB)
Current device size: 10737385984 bytes (10738 MB)
Checking filesystem consistency …
100.00 percent completed
Accounting clusters …
Space in use: 3265 MB (78.0%)
Collecting resizing constraints …
You might resize at 3264757760 bytes or 3265 MB (freeing 922 MB).
Please make a test run using both the -n and -s options before real resizing!
Per vedere i byte contenuti nel settore di boot:
$ hexdump hda.img
Andare al settore 63, che ha offset 0x7E00 (premere INVIO 7E00 INVIO), appariranno le seguenti scritte:
00007E00 EB 52 90 4E 54 46 53 20 20 20 20 00 02 08 00 00 .R.NTFS …..
00007E10 00 00 00 00 00 F8 00 00 3F 00 80 00 3F 00 00 00 ……..?…?…
Spostare il cursore all’offset 0x1A, che in questo caso è 0x7E00 + 0x1A = 0x7E1A.
Modificare il numero esadecimale 80 con FF (corrisponde in decimale al numero 255) che è il numero di heads uscito dall’esecuzione di fdisk sul hda.img; questo è quanto dovrà apparire:
00007E10 00 00 00 00 00 F8 00 00 3F 00 FF 00 3F 00 00 00 ……..?…?…
Salvare le modifiche premendo Ctrl + X e quindi ‘y’ per confermare la scrittura.
Scaricare l’immagine hda.img dal driver loopback.
$ losetup -d /dev/loop1
E’ necessario avviare l’immagine una volta con QEmu per controllare che le cose fatte fino ad ora siano corrette e per far “accettare” il disco virtuale al sistema operativo.
$ qemu hda.img
Si spegna, poi, la macchina virtuale e si ricarichi l’immagine nel loopback.
$ losetup -o32256 /dev/loop1 hda.img
Lanciare ntfsresize sul device senza il parametro “-i” e confermare con ‘y’.
$ ntfsresize /dev/loop1
ntfsresize v1.13.1 (libntfs 9:0:0)
Device name : /dev/loop1
NTFS volume version: 3.1
Cluster size : 4096 bytes
Current volume size: 4186538496 bytes (4187 MB)
Current device size: 10737385984 bytes (10738 MB)
New volume size : 10737381888 bytes (10738 MB)
Checking filesystem consistency …
100.00 percent completed
Accounting clusters …
Space in use : 3263 MB (77.9%)
Collecting resizing constraints …
WARNING: Every sanity check passed and only the dangerous operations left.
Make sure that important data has been backed up! Power outage or computer
crash may result major data loss!
Are you sure you want to proceed (y/[n])? y
Schedule chkdsk for NTFS consistency check at Windows boot time …
Resetting $LogFile … (this might take a while)
Updating $BadClust file …
Updating $Bitmap file …
Updating Boot record …
Syncing device …
Successfully resized NTFS on device ‘/dev/loop1’.
Se dovessero apparire errori, scaricare il loopback, avviare di nuovo l’immagine hda.img con QEmu e spegnere correttamente la virtual machine (Start, Spegni computer…)
$ losetup -d /dev/loop1
$ qemu hda.img
Se la cosa ha avuto successo, basta solo scaricare il loopback con l’istruzione losetup -d sul device loop1, che ho precedentemente esposto.
Ora è possibile convertire l’immagine dal formato raw al formato qcow o qcow2 digitando:
$ qemu-img convert -f raw hda.img -O qcow2 imma.img
Si può anche eliminare l’immagine raw dato che occupa molto spazio.
Se il file imma.img risultasse di proprietà dell’utente root, cambiare il proprietario.
Testo in inglese di IntuitiveNipple, traduzione di valent.
Originale: http://qemu-forum.ipi.fi/viewtopic.php?t=3756