使用fallocate创建的文件中存在哪些漏洞?

使用fallocate创建的文件中存在哪些漏洞?

如果我们使用 Fallocate 创建交换文件,我们会被告知该文件包含漏洞,因此操作将停止。

这些洞是什么?

  • 是否是未分配的磁盘空间,导致整个文件分配本身成为一个漏洞?像这样:
  • 块 1 -> 空
  • 块2 -> 空
  • 块 3 -> 空

或者

  • 预分配的块之间是否包含空洞,因此它们不连续?像这样:
  • 区块1
  • 区块2
  • block3 中的洞[被磁盘中的其他文件占用]
  • 区块4

测试

fallocate -l 100MB /swap
chmod 600 /swap
mkswap /swap
swapon /swap

输出

swapon: swapfile has holes
swapon: /swap: swapon failed: Invalid argument

答案1

文件中的孔根本没有任何与其关联的块。使用创建的文件fallocate最终可能没有与之关联的块,只有一个大小。从未分配的块读取总是返回全零;写入未分配的块会导致文件系统在写入之前分配一个块(至少部分填充该漏洞)。

有漏洞的文件不能用于交换,因为内核希望能够在没有文件系统帮助的情况下访问文件的块(一旦确定了块列表)。任何未完全分配的文件(包含漏洞或写时复制)都不能用于交换,因为某些写入将涉及文件系统。

您可以使用以下命令查看文件实际使用了多少块stat

$ truncate -s 16K holes
$ stat holes
  File: holes
  Size: 16384           Blocks: 0          IO Block: 4096   regular file
Device: fd13h/64787d    Inode: 36708573    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   steve)   Gid: ( 1000/   steve)
Access: 2019-05-12 20:04:22.498258356 +0200
Modify: 2019-05-12 20:04:22.498258356 +0200
Change: 2019-05-12 20:04:22.498258356 +0200
 Birth: -

filefrag会告诉你分配了什么:

$ /usr/sbin/filefrag holes
holes: 0 extents found

强制部分分配文件将减少漏洞:

$ fallocate -z -l 8K holes
$ stat holes
  File: holes
  Size: 16384           Blocks: 16         IO Block: 4096   regular file
Device: fd13h/64787d    Inode: 36708573    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   steve)   Gid: ( 1000/   steve)
Access: 2019-05-12 20:04:22.498258356 +0200
Modify: 2019-05-12 20:10:12.520380272 +0200
Change: 2019-05-12 20:10:12.520380272 +0200
 Birth: -
$ /usr/sbin/filefrag -e holes
Filesystem type is: ef53
File size of holes is 16384 (4 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       1:  116741448.. 116741449:      2:             last,unwritten
holes: 1 extent found

相关内容