如果我们使用 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