如何制作 Ext4 分区的可用空间映像?
例如:一个 10GB 分区有 5GB 分配文件,我需要制作剩余 5GB 可用/未分配空间/数据的原始映像。
答案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 的操作(以及当今大多数其他文件系统)支持可以告诉底层存储设备实际上可以随意丢弃这些块中的数据——这实际上会导致您在尝试访问这些块时将块清零。
发现在极少数情况下,您可以有一个“空闲块:”条目,其中包含单个条目,后跟一个逗号,然后是一个范围。您必须为此添加解析...