Disques virtuels - Format brut - Création - Restauration - Partitionnement

Mise à jour : Debian Buster 11.1

Sommaire

1 - Principe

2 - Création d'un disque vierge

2.1 - Création avec qemu-img

$ qemu-img create vdisk1.img 1G
Formatting 'vdisk1.img', fmt=raw size=8589934592
$ ls -lnh vdisk1.img
-rw-r--r-- 1 1000 1000 1,0G 30 nov. 23:24 vdisk1.img
$ du -h vdisk1.img 
4,0K vdisk1.img
$ qemu-img info vdisk1.img 
image: vdisk3.img
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 4 KiB
$ dd if=vdisk1.img  bs=1MiB |hexdump -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
1024+0enregistrements lus
1024+0 enregistrements écrits
1073741824 octets (1,1 GB, 1,0 GiB) copiés, 1,6309 s, 658 MB/s
40000000
$ sudo parted vdisk1.img -s mktable msdos mkpart primary fat32 2MiB 500MiB mkpart primary ext2 500MiB 100% unit MiB print
Model: (file)
Disk /home/philippe/soft/qemu/test/vdisk1.img: 1024MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 2,00MiB 500MiB 498MiB primary fat32 lba
2 500MiB 1024MiB 524MiB primary ext2 lba
$ sudo partx vdisk1.img 
NR START END SECTORS SIZE NAME UUID
1 4096 1023999 1019904 498M 562efcec-01
2 1024000 2097151 1073152 524M 562efcec-02
$ qemu-img info vdisk1.img 
image: vdisk1.img
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 24 KiB

2.2 - Création avec fallocate

$ fallocate -l 1G vdisk2.img
$ ls -lnh vdisk2.img
-rw-r--r-- 1 1000 1000 1,0G 4 déc. 21:03 vdisk2.img
$ du -k --apparent-size vdisk2.img
1048576 vdisk2.img

$ du -k vdisk2.img
1048580 vdisk2.img
$ qemu-img info vdisk2.img
image: vdisk2.img
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 1 GiB
$ dd if=vdisk1.img  bs=1MiB |hexdump -C
....
$ sudo parted vdisk1.img -s mktable msdos mkpart primary fat32 2MiB 500MiB mkpart primary ext2 500MiB 100% unit MiB print
....
$ sudo partx vdisk2.img 
...
$ du -k vdisk2.img
1048580 vdisk2.img
$ fallocate -d vdisk2.img

$ ls -lnh vdisk2.img
-rw-r--r-- 1 1000 1000 1,0G 4 déc. 21:48 vdisk2.img

$ du -k vdisk2.img
8 vdisk2.img

2.3 - Création avec dd

$ dd if=/dev/zero of=vdisk3.img bs=1M count=1024
1024+0 enregistrements lus
1024+0 enregistrements écrits
1073741824 octets (1,1 GB, 1,0 GiB) copiés, 0,578335 s, 1,9 GB/s
$ ls -lnh vdisk2.img
-rw-r--r-- 1 1000 1000 1,0G 4 déc. 21:38 vdisk3.img
$ du -k --apparent-size vdisk2.img
1048576 vdisk3.img

$ du -k vdisk3.img
1048580 vdisk3.img
$ fallocate -d vdisk3.img

$ ls -lnh vdisk3.img
-rw-r--r-- 1 1000 1000 1,0G 4 déc. 21:41 vdisk3.img

$ du -k vdisk3.img
0 vdisk3.img
$ dd if=vdisk1.img  bs=1MiB |hexdump -C
....
$ sudo parted vdisk1.img -s mktable msdos mkpart primary fat32 2MiB 500MiB mkpart primary ext2 500MiB 100% unit MiB print
....
$ sudo partx vdisk2.img 
...
$ du -k vdisk3.img
24 vdisk3.img

2.4 - Bilan

$ qemu-img create vdisk1.img

$ fallocate -l 1G vdisk2.img

$ dd if=/dev/zero of=vdisk3.img bs=1M count=1024
$ fallocate -d vdisk.img

3 - Création par recopie d'un disque réel

Il est possible de créer un disque virtuel au format brut par recopie "bit à bit" d'un disque réel. Le disque virtuel ainsi créé possède le même partitionnement, le même contenu que le disque réel

3.1 - Recopie standard

$ sudo dd if=/dev/sdb bs=4MiB of=disk.img conv=fsync iflag=fullblock status=progress
2000683008octets (2,0 GB, 1,9 GiB) copiés, 203 s, 9,8 MB/s
477+1 enregistrements lus
477+1 enregistrements écrits
2003828736 octets (2,0 GB, 1,9 GiB) copiés, 203,963 s, 9,8 MB/s
$ sudo fdisk -l sdb.img |grep Disque
Disque sdb.img : 1,87 GiB, 2003828736 octets, 3913728 secteurs

$ du -b --apparent-size sdb.img
2003828736 sdb.img

$ ls -ln sdb.img
-rw-r--r-- 1 0 0 2003828736 4 déc. 22:55 sdb.img
$ sudo parted /dev/sdb unit b print free
Model: General USB Flash Disk (scsi)
Disk /dev/sdb: 2003828736B
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
17408B 2097151B 2079744B Free Space
1 2097152B 524287999B 522190848B gpt1 msftdata
2 524288000B 2002780159B 1478492160B gpt2
2002780160B 2003811839B 1031680B Free Space

$ sudo parted disk.img unit b print free
Model: (file)
Disk /home/philippe/soft/qemu/test/disk.img: 2003828736B
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
17408B 2097151B 2079744B Free Space
1 2097152B 524287999B 522190848B gpt1 msftdata
2 524288000B 2002780159B 1478492160B gpt2
2002780160B 2003811839B 1031680B Free Space

3.2 - Recopie avec réduction de l'espace libre en fin de disque

$ sudo parted /dev/sdb unit s print free
Model: General USB Flash Disk (scsi)
Disk /dev/sdb: 3913728s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
34s 4095s 4062s Free Space
1 4096s 976895s 972800s gpt1 msftdata
2 976896s 1953791s 976896s gpt2
1953792s 3913694s 1959903s Free Space
$ calc 1953792+33
1953825
$ calc 1953825/2/1024/4
238.5040283203125

Le nombre de blocs minimum sera donc 239

$ sudo dd if=/dev/sdb bs=4MiB count=239 of=disk.img conv=fsync iflag=fullblock status=progress
998244352octets (998 MB, 952 MiB) copiés, 99 s, 10,1 MB/s
239+0 enregistrements lus
239+0 enregistrements écrits
1002438656 octets (1,0 GB, 956 MiB) copiés, 99,91 s, 10,0 MB/s
$ sudo gdisk shortdisk.img 
....
Warning! Disk size is smaller than the main header indicates! Loading
secondary header from the last sector of the disk! You should use 'v' to
verify disk integrity, and perhaps options on the experts' menu to repair
the disk.
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! Error 25 reading partition table for CRC check!
Warning! One or more CRCs don't match. You should repair the disk!

Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: damaged

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
(gdisk) > r (recovery/transformation)
(gdisk) > e (rebuild secondary GPT)
(gdisk) > w (write)
$ sudo partx -a disk.img
$ sudo parted disk.img unit s print free
Model: (file)
Disk /home/philippe/soft/qemu/test/disk.img: 1957888s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
34s 4095s 4062s Free Space
1 4096s 976895s 972800s gpt1 msftdata
2 976896s 1953791s 976896s gpt2
1953792s 1957854s 4063s Free Space

4 - Restauration

4.1 - Vérification de la taille des disques

$ sudo fdisk -l /dev/sdb |grep Disque
Disque /dev/sdb: 223,57 GiB, 240057409536 octets, 468862128 secteurs
$ sudo fdisk -l disk.img |grep Disque
Disque disk.img: 956 MiB, 1002438656 octets, 1957888 secteurs

4.2 - Restauration

$ dd if=debiangpt.img iflag=fullblock |pv -s 10G |sudo dd of=/dev/sdb conv=fsync oflag=direct
$ sudo parted /dev/sdb print
Warning: Not all of the space available to /dev/sdb appears to be used, you can fix
the GPT to use all of the space (an extra 466904240 blocks) or continue with the
current setting?
Fix/Ignore? Fix
$ sudo head -c $((34*512)) /dev/sdb|tail -c $((33*512)) |hexdump -C
00000000 45 46 49 20 50 41 52 54 00 00 01 00 5c 00 00 00 |EFI PART....\...|
00000010 b0 3f 28 a1 00 00 00 00 01 00 00 00 00 00 00 00 |.?(.............|
00000020 af 44 f2 1b 00 00 00 00 22 00 00 00 00 00 00 00 |.D......".......|
00000030 8e 44 f2 1b 00 00 00 00 7a a7 6d 23 17 a5 55 46 |.D......z.m#..UF|
00000040 9c 6f 92 bf 76 d3 41 f9 02 00 00 00 00 00 00 00 |.o..v.A.........|
00000050 80 00 00 00 80 00 00 00 a2 9d 2c 46 00 00 00 00 |..........,F....|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200 a2 a0 d0 eb e5 b9 33 44 87 c0 68 b6 b7 26 99 c7 |......3D..h..&..|
00000210 ad eb 97 1f e4 6e ab 4b 8d 8b 4f 50 18 10 c2 8f |.....n.K..OP....|
00000220 00 10 00 00 00 00 00 00 ff e7 0e 00 00 00 00 00 |................|
00000230 00 00 00 00 00 00 00 00 67 00 70 00 74 00 31 00 |........g.p.t.1.|
00000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000280 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000290 c3 fa 38 be 5c 5a 4f 42 8a 28 75 52 9b 67 7f 6e |..8.\ZOB.(uR.g.n|
000002a0 00 e8 0e 00 00 00 00 00 ff cf 1d 00 00 00 00 00 |................|
000002b0 00 00 00 00 00 00 00 00 67 00 70 00 74 00 32 00 |........g.p.t.2.|
000002c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00004200
$ sudo tail -c $((33*512)) disk.img |hexdump -C
00000000 a2 a0 d0 eb e5 b9 33 44 87 c0 68 b6 b7 26 99 c7 |......3D..h..&..|
00000010 ad eb 97 1f e4 6e ab 4b 8d 8b 4f 50 18 10 c2 8f |.....n.K..OP....|
00000020 00 10 00 00 00 00 00 00 ff e7 0e 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 67 00 70 00 74 00 31 00 |........g.p.t.1.|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000080 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000090 c3 fa 38 be 5c 5a 4f 42 8a 28 75 52 9b 67 7f 6e |..8.\ZOB.(uR.g.n|
000000a0 00 e8 0e 00 00 00 00 00 ff cf 1d 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 67 00 70 00 74 00 32 00 |........g.p.t.2.|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00004000 45 46 49 20 50 41 52 54 00 00 01 00 5c 00 00 00 |EFI PART....\...|
00004010 ee 03 60 fa 00 00 00 00 ff df 1d 00 00 00 00 00 |..`.............|
00004020 01 00 00 00 00 00 00 00 22 00 00 00 00 00 00 00 |........".......|
00004030 de df 1d 00 00 00 00 00 7a a7 6d 23 17 a5 55 46 |........z.m#..UF|
00004040 9c 6f 92 bf 76 d3 41 f9 df df 1d 00 00 00 00 00 |.o..v.A.........|
00004050 80 00 00 00 80 00 00 00 a2 9d 2c 46 00 00 00 00 |..........,F....|
00004060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00004200