Fallocate を使用してスワップファイルを生成すると、ファイルに脆弱性があるという通知が表示されるため、操作は停止します。
この穴は何ですか?
- 完全なファイル割り当て自体を穴にするのは、割り当てられていないディスク容量ですか?このように:
- ブロック1 - >空
- ブロック2 - >空
- ブロック3 - >空
または
- 事前に割り当てられたブロックの間に穴があり、連続しませんか?このように:
- ブロック1
- ブロック2
- ブロック3の穴[ディスクの他のファイルが占めている]
- ブロック4
テスト
fallocate -l 100MB /swap
chmod 600 /swap
mkswap /swap
swapon /swap
出力
swapon: swapfile has holes
swapon: /swap: swapon failed: Invalid argument
ベストアンサー1
ファイルの穴には接続ブロックがありません。を使用して作成されたファイルfallocate
にはリンクブロックがなく、サイズのみがあります。割り当てられていないブロックから読み出すと、常にすべて0が返されます。割り当てられていないブロックに書き込むと、ファイルシステムは書き込み前にブロックを割り当てます(少なくとも部分的に脆弱性を満たす)。
カーネルは、ファイルシステムの助けを借りずに(ブロックリストが決定されると)ファイルブロックにアクセスできるようにしたいので、脆弱なファイルをスワップに使用することはできません。一部の書き込みにはファイルシステムが含まれているため、完全に割り当てられていないファイル(穴埋めまたは書き込み時のコピー)はスワップには使用できません。
次のコマンドを使用すると、ファイルが実際に使用しているブロックの数を確認できます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