在服务器上,我有一个目录/opt/kafka/data/topics
。
$ du -hs /opt/kafka/data/topics
52M /opt/kafka/data/topics
当我像这样的目录tar
$ tar czfv /tmp/topics.tar.gz /opt/kafka/data/topics
我得到一个有意义的文件大小
$ ls -alh /tmp/topics.tar.gz
-rw-r--r-- 1 user user 11M Jan 12 15:15 kafka
但是,当我下载topics.tar.gz
到我的本地OS X计算机并提取它时,它占用10GB!
在/opt/kafka/data/topics
仔细检查服务器上的内容后,我注意到它根据ls
它包含许多10MB文件:
$ find /opt/kafka/data -type f -exec ls -alh {} \;
... [output]
-rw-r--r-- 1 user user 10M Jan 12 02:45 /opt/kafka/data/topics/user-entities-KTABLE-REDUCE-STATE-STORE-0000000178-changelog-1/00000000000000000000.index
-rw-r--r-- 1 user user 10M Jan 12 02:45 /opt/kafka/data/topics/user-entities-KSTREAM-KEY-SELECT-0000000123-repartition-2/00000000000000000012.index
... [and many more]
du
报告这些10MB文件中的每一个都是0字节:
$ du -h /opt/kafka/data/topics/user-entities-KTABLE-REDUCE-STATE-STORE-0000000178-changelog-1/00000000000000000000.index
0 /opt/kafka/data/topics/user-entities-KTABLE-REDUCE-STATE-STORE-0000000178-changelog-1/00000000000000000000.index
那么发生了什么?显然我在这里遗漏了一些东西:
du
报告总计52M。这是有道理的,因为/opt/kafka/data
安装的设备只有5GB,df
报告它只有2%已满,一切仍然有效。tar
将内容gzips到10M。这也是有道理的。ls
据报道,许多文件在磁盘上是10M,当我提取存档时,我得到10GB。du
报告每个相同的文件都是0字节。mount
报告说/dev/sdc on /opt/kafka/data type ext4 (rw,relatime,data=ordered)
什么都没有增加。是否有某种透明的磁盘压缩我不知道?
ls
)是稀疏的。它们被报告为0字节du
并且确实是空的
tar --sparse
创建存档时选项怎么样?有帮助吗?链接。
ls
报告10MB但du
报告0字节?
man tar
在OS X上确实包含了一个-S
提取选项:(x mode only) Extract files as sparse files. For every block on disk, check first if it contains only NULL bytes and seek over it otherwise. This works similiar to the conv=sparse option of dd.
这可能会有所帮助。