ls -sh
나는 1997년부터 파일 크기를 확인해 왔지만 오늘 이상한 일이 일어났습니다.
ninja@vm:foo$ ls -sh
total 98M
1,0M app
64M app_fake_signed.sbp
800K loader
804K loader_fake_signed.sbp
1,0M web
32M web_fake_signed.sbp
app
파일이 web
서명된 파일보다 훨씬 작아서는 안 되므로 서명 프로그램을 디버깅하는 데 몇 시간을 보냈습니다. 아무 것도 찾지 못한 후 우연히 Samba 공유에 있는 파일을 살펴보았는데 크기가 매우 비슷하다는 것을 알았습니다. 다시 확인했습니다.
ninja@vm:foo$ ls -lh
total 98M
-rw-rw-r-- 1 ninja ninja 63M lut 4 14:13 app
-rw-rw-r-- 1 ninja ninja 64M lut 4 14:13 app_fake_signed.sbp
-rw-rw-r-- 1 ninja ninja 800K lut 4 14:13 loader
-rw-rw-r-- 1 ninja ninja 801K lut 4 14:13 loader_fake_signed.sbp
-rw-rw-r-- 1 ninja ninja 31M lut 4 14:13 web
-rw-rw-r-- 1 ninja ninja 32M lut 4 14:14 web_fake_signed.sbp
나 말문이 막힌다? 실제로는 각각 63MB와 32MB인데 크기가 1MB 와 1MB로 ls -s
표시되는 이유는 무엇 입니까?app
web
이는 Windows의 VirtualBox에서 실행되는 Xubuntu 14.04입니다.
편집하다:app
, web
및 파일은 모두 루프에서 실행되는 bash 스크립트(내 디자인이 아님) loader
에 의해 생성됩니다 . dd if=/dev/urandom of=app bs=$BLOCK count=1 seek=...
C로 작성된 서명 프로그램은 이러한 파일을 가져와서 서명된 버전을 디스크에 기록하고 각 파일 앞과 뒤에 바이너리 서명을 추가합니다.
답변1
사용하고 있는 -s
옵션 입니다 ls
.
파일 크기와 파일이 차지하는 디스크 공간의 양은 다양할 수 있습니다. 예를 들어, 새 파일을 열고 그 안에서 1G를 찾아 "무언가"라고 쓰면 운영 체제는 디스크에 1G("무언가"를 위한 공간 포함)를 할당하지 않고 단지 "무언가"라고 씁니다. " 공간을 할당합니다. 이를 호출합니다.스파스 파일.
나는 다음과 같은 파일을 생성하기 위해 작은 C 프로그램을 작성했습니다.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = open("/tmp/foo.dat", O_CREAT | O_WRONLY, 0600);
if (fd > 0) {
const off_t GIG = 1024 * 1024 * 1024;
// Seek 1G into the file
lseek(fd, GIG, SEEK_SET);
// Write something
write(fd, "hello", sizeof "hello");
close(fd);
}
return 0;
}
내가 얻는 프로그램을 실행하면 다음과 같습니다.
$ ls -lh /tmp/foo.dat
-rw------- 1 user group 1.1G Feb 4 15:25 /tmp/foo.dat
하지만 을 사용하면 -s
다음과 같은 결과를 얻을 수 있습니다.
$ ls -sh /tmp/foo.dat
4.0K /tmp/foo.dat
따라서 "hello"를 저장하기 위해 디스크에 4K 블록이 할당됩니다(4K는 내 파일 시스템의 최소 할당 단위입니다).
귀하의 경우에는 매우 희박한 파일 app
처럼 보입니다 .web
답변2
ls -s
파일 내용이 사용하는 저장 공간의 양을 나열합니다(메타데이터에 사용되는 공간 제외). 이는 두 가지 측면에서 파일 크기와 다를 수 있습니다.
- 대부분의 경우 파일 크기는 정수 블록으로 반올림됩니다. 블록 크기는 일반적으로 512B~4kB이지만 이는 파일 시스템에 따라 다릅니다(일부 파일 시스템에는 이 개념이 없습니다).
- 파일이 압축 등의 방식으로 인코딩된 경우 파일 크기가 더 작거나 클 수 있습니다.
Unix 파일 시스템은 다음과 같은 조잡한 형태의 압축을 지원합니다.스파스 파일: 파일의 블록이 모두 널 바이트로 구성되어 있으면 전혀 저장할 필요가 없습니다. 파일 시스템은 파일 내용이 저장되는 블록 목록에 블록 번호 대신 특수 표시를 배치합니다. 이 압축 방법은 체계적이지 않습니다. 프로그램이 여러 개의 널 바이트를 쓰면 저장됩니다. 그러나 Unix에서는 프로그램이 파일 끝을 넘어서도 쓸 수 있도록 허용합니다. 이 경우 파일은 널 바이트로 확장되지만 이러한 바이트가 전체 블록 이상을 구성하는 경우 해당 전체 널 블록은 저장되지 않습니다.
dd seek=…
를 쓰면 dd
프로그램은 쓰기를 시작하기 전에 주어진 위치를 찾습니다. 귀하의 경우 app
위치는 파일 끝에서 약 62MB 정도 떨어진 것으로 보이므로 존재하지 않는 블록에 약 62MB의 널 바이트가 암시적으로 저장되어 있습니다. 이 저장소 세부 정보는 응용 프로그램에 노출되지 않으므로(비이식성 인터페이스를 사용하여 검색하는 경우는 거의 발생하지 않음) 서명 프로그램이 입력을 읽을 때 약 63MB의 데이터만 알고 있으므로 63MB가 출력 파일에 기록되며 그 중 약 62MB는 널 바이트입니다.
디스크 공간이 정말로 필요한 경우 다음을 수행할 수 있습니다.나중에 파일을 드물게 만들기. 대부분의 파일에는 큰 0 블록이 없기 때문에 이런 일이 거의 발생하지 않으므로 도구를 실행하여 이를 찾는 데 많은 시간이 낭비됩니다.