如何仅克隆 Ext4 分区的未使用空间

如何仅克隆 Ext4 分区的未使用空间

如何制作 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 块存储设备)上,那里不会有任何数据 – discardext4 的操作(以及当今大多数其他文件系统)支持可以告诉底层存储设备实际上可以随意丢弃这些块中的数据——这实际上会导致您在尝试访问这些块时将块清零。


发现在极少数情况下,您可以有一个“空闲块:”条目,其中包含单个条目,后跟一个逗号,然后是一个范围。您必须为此添加解析...

相关内容