在我的ext4
文件系统分区上,我可以运行以下代码:
fs="/mnt/ext4"
#create sparse 100M file on ${fs}
dd if=/dev/zero \
of=${fs}/sparse100M conv=sparse seek=$((100*2*1024-1)) count=1 2> /dev/null
#show its actual used size before
echo "Before:"
ls ${fs}/sparse100M -s
#setting the sparse file up as loopback and run md5sum on loopback
losetup /dev/loop0 ${fs}/sparse100M
md5sum /dev/loop0
#show its actual used size afterwards
echo "After:"
ls ${fs}/sparse100M -s
#release loopback and remove file
losetup -d /dev/loop0
rm ${fs}/sparse100M
产生
Before:
0 sparse100M
2f282b84e7e608d5852449ed940bfc51 /dev/loop0
After:
0 sparse100M
在tmpfs上执行与以下操作相同的操作:
fs="/tmp"
产量
Before:
0 /tmp/sparse100M
2f282b84e7e608d5852449ed940bfc51 /dev/loop0
After:
102400 /tmp/sparse100M
这基本上意味着我只希望读取数据会导致稀疏文件“像气球一样爆炸”?
我希望这是因为对文件tmpfs
系统中的稀疏文件的支持不够完善,尤其是由于缺少FIEMAP ioctl,但是我不确定是什么原因导致了这种现象?你能告诉我吗?
哼。有一个共享的(写时复制)零页,例如,当需要对稀疏页进行mmap()处理时,可以使用该共享零页。因此,我不确定为什么从稀疏的tmpfs文件中进行任何类型的读取都需要分配实际内存。lwn.net/Articles/517465。我想知道这是否是使用直接io进行循环转换的副作用,但是当您尝试在tmpfs上使用新型循环时,似乎应该没有任何区别。 spinics.net/lists/linux-fsdevel/msg60337.html
—
sourcejedi
/ tmp的输出具有不同的文件之前/之后。那是错字吗?之前:0 / tmp / sparse100(末尾不带M)之后:102400 / tmp / sparse100M(后缀M)。
—
YoMismo
@YoMismo,是的,只有一点错字
—
humanityANDpeace