Ext4パーティションの空き領域イメージを作成するには?
例: 10 GB パーティションには 5 GB 割り当てファイルがあり、残りの 5 GB 空き/割り当てられていないスペース/データの生イメージを作成する必要があります。
答え1
これを使用すると、簡単に解析できる形式でリストを取得できますdumpe2fs -x /dev/your_partition
。Free blocks
# preparation
truncate -s 100M ext4.img
mkfs.ext4 ext4.img
partition=ext4.img
# test
dumpe2fs -x "${partition}"
生産する
…
Free blocks: 0x00014001-0x00016000
Free inodes: 0x00004d31-0x000054e8
Group 11: (Blocks 0x00016001-0x00018000) csum 0xd1b4 [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Block bitmap at 0x0000010e (bg #0 + 269), csum 0x00000000
Inode bitmap at 0x0000011b (bg #0 + 282), csum 0x00000000
Inode table at 0x00000bba-0x00000cb0 (bg #0 + 3001)
8192 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
Free blocks: 0x00016001-0x00018000
Free inodes: 0x000054e9-0x00005ca0
Group 12: (Blocks 0x00018001-0x00018fff) csum 0xa94e [INODE_UNINIT, ITABLE_ZEROED]
…
このようにして私たちはできます
# preparation
truncate -s 100M ext4.img
mkfs.ext4 ext4.img
partition=ext4.img
targetdir=unused_blocks
# dump, filter
dump=$(dumpe2fs -x "${partition}")
blocksize=$(( $(echo "${dump}" | sed -n 's/Block size: *\(.*\)$/\1/p') ))
echo "Block Size ${blocksize}"
freeblocks=$(echo "${dump}" | sed -n 's/ \+Free blocks: \(.\+\)$/\1/p')
mkdir "${targetdir}"
totalsize=0
for blockrange in ${freeblocks}; do
beginning=$(( "${blockrange%-*}" ))
ending=$(( "${blockrange##*-}" ))
length=$(( ${ending} - ${beginning} + 1 ))
echo "Block found: ${blockrange} start ${beginning} (${blockrange%-*}) end ${ending} (${blockrange##*-}) length ${length}"
dd "if=${partition}" "of=${targetdir}/${blockrange}.img" "bs=${blocksize}" "skip=${beginning}" "count=${length}"
totalsize=$(( ${totalsize} + ${length} ))
done
echo "total size: ${totalsize}"
これらのフリーブロックの元の画像を含むブロック表示範囲でいっぱいのディレクトリを取得します。
多くのストレージデバイス(主にSSDですが、パーティションが実際にLVMシンボリュームかCephブロックストレージデバイスであるかは不明です)にはデータがまったくありません。discard
ext4が行っていること(そしてこれらのほとんどのデバイス)が最近他のファイルシステム)をサポートすることで、デフォルトのストレージデバイスにこれらのブロックのデータを実際に削除するように指示できます。つまり、ブロックにアクセスしようとするとブロックがゼロになるように効果的に作成できます。
まれに、単一の項目とカンマ、範囲を含む「Free Block:」項目がある可能性があることがわかりました。これを行うには、解析を追加する必要があります...