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