Primeiramente, escrever uma imagem esparsa em um disco não resultará em nada além do tamanho total do arquivo de imagem - furos e tudo - cobrindo o disco. Isso ocorre porque manipulação de arquivos esparsos é uma qualidade do sistema de arquivos - e um dispositivo bruto (como aquele no qual você escreve a imagem) não tem essa coisa ainda . Um arquivo esparso pode ser armazenado com segurança em um meio controlado por um sistema de arquivos que entende arquivos esparsos (como um dispositivo ext4) mas como Assim que você escrever, ele irá envolver tudo o que você pretende. E o que você deve fazer é:
-
Basta armazená-lo em um fs que compreenda arquivos esparsos até estar preparado para escrevê-lo.
-
Faça duas camadas de profundidade ...
-
Ou seja, escreva sua imagem principal em um arquivo, crie outra imagem parent com um fs que entenda arquivos esparsos e copie sua imagem para o pai imagem e ...
-
Quando chegar a hora de escrever a imagem, primeiro escreva sua imagem principal e escreva sua imagem principal.
-
Veja como fazer 2:
-
Crie um arquivo esparso de 1 GB ...
dd bs=1kx1k seek=1k of=img </dev/null
-
Escreva duas partições
ext4
em sua tabela de partições: 1 200MB, 2 800MB ...printf '%b\n\n\n\n' n '+200M\nn\n' 'w\n\c' | fdisk img
-
Crie dois
ext4
sistemas de arquivos em um dispositivo de loop de-P
artitioned e coloque uma cópia do segundo no primeiro ...sudo sh -c ' for p in "$(losetup --show -Pf img)p"* ### the for loop will iterate do mkfs.ext4 "$p" ### over fdisks two partitions mkdir -p ./mnt/"${p##*/}" ### and mkfs, then mount each mount "$p" ./mnt/"${p##*/}" ### on dirs created for them done; sync; cd ./mnt/*/ ### next we cp a sparse image cp --sparse=always "$p" ./part2 ### of part2 onto part1 dd bs=1kx1k count=175 </dev/zero >./zero_fill ### fill out part1 w/ zeroes sync; cd ..; ls -Rhls . ### sync, and list contents umount */; losetup -d "${p%p*}" ### last umount, destroy rm -rf loop*p[12]/ ' ### loop devs and mount dirs
mke2fs 1.42.12 (29-Aug-2014) Discarding device blocks: done Creating filesystem with 204800 1k blocks and 51200 inodes Filesystem UUID: 2f8ae02f-4422-4456-9a8b-8056a40fab32 Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done mke2fs 1.42.12 (29-Aug-2014) Discarding device blocks: done Creating filesystem with 210688 4k blocks and 52752 inodes Filesystem UUID: fa14171c-f591-4067-a39a-e5d0dac1b806 Superblock backups stored on blocks: 32768, 98304, 163840 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done 175+0 records in 175+0 records out 183500800 bytes (184 MB) copied, 0.365576 s, 502 MB/s ./: total 1.0K 1.0K drwxr-xr-x 3 root root 1.0K Jul 16 20:49 loop0p1 0 drwxr-xr-x 2 root root 40 Jul 16 20:42 loop0p2 ./loop0p1: total 176M 12K drwx------ 2 root root 12K Jul 16 20:49 lost+found 79K -rw-r----- 1 root root 823M Jul 16 20:49 part2 176M -rw-r--r-- 1 root root 175M Jul 16 20:49 zero_fill ./loop0p1/lost+found: total 0 ./loop0p2: total 0
-
Agora, esse é um bom resultado - principalmente de
mkfs.ext4
-, mas observe especialmente osls
bits na parte inferior.ls -s
mostrará o real-s
ize de um arquivo no disco - e ele sempre é exibido na primeira coluna. -
Agora, basicamente, podemos reduzir nossa imagem apenas para a primeira partição ...
fdisk -l img
Disk img: 1 GiB, 1073741824 bytes, 2097152 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: 0xc455ed35 Device Boot Start End Sectors Size Id Type img1 2048 411647 409600 200M 83 Linux img2 411648 2097151 1685504 823M 83 Linux
-
Há
fdisk
nos informa que há 411647 +1 512 setores de bytes na primeira partição deimg
...dd seek=411648 of=img </dev/null
-
Isso trunca o arquivo
img
para apenas sua primeira partição. Vêem?ls -hls img
181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 21:37 img
-
... mas ainda podemos montar essa partição ...
sudo mount "$(sudo losetup -Pf --show img)p"*1 ./mnt
-
... e aqui está o seu conteúdo ...
ls -hls ./mnt
total 176M 12K drwx------ 2 root root 12K Jul 16 21:34 lost+found 79K -rw-r----- 1 root root 823M Jul 16 21:34 part2 176M -rw-r--r-- 1 root root 175M Jul 16 21:34 zero_fill
-
E podemos acrescentar a imagem armazenada da segunda partição à primeira ...
sudo sh -c ' dd seek=411648 if=./mnt/part2 of=img umount ./mnt; losetup -D mount "$(losetup -Pf --show img)p"*2 ./mnt ls ./mnt; umount ./mnt; losetup -D'
1685504+0 records in 1685504+0 records out 862978048 bytes (863 MB) copied, 1.96805 s, 438 MB/s lost+found
-
Agora que cresceu nosso arquivo
img
: não é mais esparso ...ls -hls img
1004M -rw-r--r-- 1 mikeserv mikeserv 1.0G Jul 16 21:58 img
-
... mas remover isso é tão simples na segunda vez como foi o primeiro, claro ...
dd seek=411648 of=img </dev/null ls -hls img
181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 22:01 img