파일 홀을 다른 파일에 할당할 수 있나요?

파일 홀을 다른 파일에 할당할 수 있나요?

Unix 환경의 고급 프로그래밍을 참조하면 파일 끝을 찾아 거기에 무언가를 쓰려고 할 때 파일 취약점이 생성됩니다. 예를 들어,

    int x = lseek(fd,1639,SEEK_END);
    int y = write(fd,buff,100);

위의 예를 고려하고 파일에 이전 내용이 있다고 가정하면 현재 파일 오프셋은 파일 시작 부분 전 어딘가에 있습니다. 이제 이 함수를 사용하여 파일의 끝을 찾고 lseek(위의 예에서와 같이) 버퍼에 씁니다.연노랑파일 크기는 100입니다. 아시다시피 파일에 구멍이 생깁니다.

그렇다면 Unix는 이 취약점을 다른 파일에 할당할 수 있습니까? 아니면, 즉, 홀을 할당할 수 있습니까?

답변1

먼저, 파일의 취약점이란 무엇입니까? 명시적으로 쓰지 않고 데이터를 0으로 설정합니다. seek파일 끝을 넘어 1639바이트를 이동하고 100바이트를 쓰면 파일은 실제로 1639+100바이트만큼 커집니다 . 따라서 구멍을 만들지만 구멍은 실제로 0으로 채워집니다.

취약점이 충분히 큰 경우 일부 파일 시스템(예 ext: )에서는 디스크에 해당 블록을 할당하지 않음으로써 해당 공간을 절약할 수 있습니다. 즉, seek하나 이상의 제로 블록을 작성하는 경우 해당 블록은 디스크에 할당되지 않으며, 이로 인해 파일 데이터가 포함된 블록 목록에 실제 구멍이 생깁니다. 그게 우리가 부르는 거야스파스 파일.

블록의 크기는 FS의 형식에 따라 달라집니다. 이제 ext일반적으로 4096바이트입니다. 즉, 1639바이트 탐색을 사용하면 스파스 파일이 생성되지 않고 1639개의 0만 디스크에 기록됩니다. OTOH, 4096바이트 블록의 경우 최소 8191(2 * 4096 - 1)바이트를 찾고 있다면 적어도 하나를 생성할 수 있습니다.

블록은 실제로 할당되지 않고 0으로 채워지지 않으므로 파일이 디스크 공간을 덜 사용하고 쓰기 작업이 더 빨라집니다. 물론 귀하의 질문에 답하기 위해 여유 디스크 공간을 다른 파일에 사용할 수 있습니다.

실제로 최고의 데모에는 C 프로그램이 필요하지 않습니다.

$ df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4        38G   28G  7.5G  80% /

$ time dd of=/tmp/foo bs=1M seek=$((1024*1024*10)) count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 4.741e-05 s, 0.0 kB/s

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ ls -lh /tmp/foo
-rw-r--r-- 1 xhienne xhienne 10T Aug 25 20:08 /tmp/foo

$ df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4        38G   28G  7.5G  80% /

여기서는 7GB 이상의 여유 공간(여전히 사용 가능)이 있는 파티션에 밀리초 만에 10TB 파일(모두 0)을 생성했습니다.

관련 정보