我在做什么
我正在研究文件系统图像稀疏工具:零自由。
我认为创建该场景的步骤应该是这样的:
- 创建文件系统映像。
- 用某种方式来填充它。
- 清除它,但实际空间使用情况没有改变,这意味着未分配或者没用过此 fs 上存在空间。
- 运行zerofree后,其实际空间使用量减少。
但是在对 fs 运行 zerofree 之后,实际的空间使用量并没有缩小。
我有什么误解吗?我该如何正确操作?
任何建议都有帮助!
记录我的尝试
# root❯❯❯ dd if=/dev/zero of=fs.image bs=1M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes copied, 4.8167e-05 s, 0.0 kB/s
# root❯❯❯ du -h fs.image
0 fs.image
# root❯❯❯ mkdir /mnt/test
# root❯❯❯ mkfs.ext3 fs.image
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: d65a10e7-4620-433b-a135-386d65acf414
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
# root❯❯❯ du -h fs.image
33M fs.image
# root❯❯❯ mount fs.image /mnt/test/
# root❯❯❯ yes abcdefghijklmnopqrstuvwxyz0123456789 > /mnt/test/largefile
yes: standard output: No space left on device
# root❯❯❯ du -h fs.image
1005M fs.image
# root❯❯❯ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 976M 976M 0 100% /mnt/test
# root❯❯❯ rm /mnt/test/largefile
rm: remove regular file '/mnt/test/largefile'? y
# root@oe ~/../project-zerofree ❯❯❯ du -h fs.image
1007M fs.image
# root❯❯❯ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 976M 1.3M 924M 1% /mnt/test
# root❯❯❯ umount /mnt/test
# root❯❯❯ du -h fs.image
1007M fs.image
# root❯❯❯ zerofree -v fs.image
249255/249500/262144
# root❯❯❯ du -h fs.image
1007M fs.image
答案1
感谢mokubai 的回答帮助我找到测试 zerofree 的正确方法。
1.制作文件系统映像
# root❯❯❯ dd if=/dev/zero of=test.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.49236 s, 2.2 GB/s
# root❯❯❯ mkfs.ext4 test.img
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 4423921e-cb7c-4850-b29f-45625ce8e86f
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
# root❯❯❯ du -h test.img
33M test.img
2. 填写
# root❯❯❯ mount test.img /mnt/test/
# root❯❯❯ yes abcdefghijklmnopqrstuvwxyz0123456789 > /mnt/test/largefile
yes: standard output: No space left on device
# root❯❯❯ du -h test.img
990M test.img
3. 创建未使用的空间
# root❯❯ rm -f /mnt/test/largefile
# root❯❯❯ umount /mnt/test
# root❯❯❯ du -h test.img
990M test.img
4. 使用稀疏选项进行复制
# root❯❯❯ cp --sparse=always test.img sparsed.img
# root❯❯❯ du -h *
959M sparsed.img
990M test.img
有一点点效果。
5. 运行 zerofree
# root❯❯❯ zerofree -v test.img
245055/249189/262144
# root❯❯❯ cp --sparse=always test.img zerofreed_and_sparsed.img
# root❯❯❯ du -h *
959M sparsed.img
990M test.img
1.1M zerofreed_and_sparsed.img
效果明显!
答案2
Zerofree
除了将零写入图像的空闲区域外,不会做任何其他事情。就其本身而言,这不会对磁盘上图像的大小产生任何影响。
zerofree 在 ext2、ext3 或 ext4 文件系统中查找未分配的、具有非零值内容的块(例如 /dev/hda1),并用零(或您选择的另一个八位字节)填充它们。
和
根据磁盘映像的类型,运行 zerofree 后,辅助实用程序可能能够减小磁盘映像的大小。
zerofree
单独使用并不是将图像转换为稀疏的命令,它最多可以通过有效地擦除不包含实际数据的区域来促进此类图像的转换,但它无法单独做到这一点。