EXT3 : 블록 크기가 4K 인 경우 ls -l이 왜 파일 크기보다 작습니까?


16

하나의 문자가 포함 된 파일에서 ls -l을 실행하면 크기가 2B로 표시됩니다. 파일 시스템이 4k 블록이면 파일을 블록 크기로 반올림했다고 생각합니까? ls -l이 실제로 inode에서 바이트 수를 읽기 때문입니까? 어떤 상황에서 리눅스 2.6 커널 GNU 유틸리티의 응답과 실제 바이트 수 응답을 차단하기 위해 반올림됩니까?


2
ext4는 "작은 파일 패킹"이라는 개념을 도입합니다. 작은 파일은 inode가 차지하는 동일한 디스크 블록을 차지하므로 디스크 블록 낭비를 피합니다. lwn.net/Articles/469805
oakad

답변:


20

echo a > file또는 파일을 사용하여 파일에 하나의 문자를 넣은 vim file것 같습니다. 즉, 해당 문자와 ​​추가 줄 바꿈이 있어야합니다 (2 문자, 따라서 2 바이트). ls -l블록이 아닌 파일 크기를 바이트 단위로 표시합니다 (보다 구체적으로 : 파일 길이 ).

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

( cat -A개행은 $문자로 표시됨)

하는 반면 ls -l, du실제 크기를 표시합니다 디스크에 점령 :

$ du testfile
4

(실제로 du1KB 단위로 크기를 표시하므로 크기는 4 × 1024 바이트 = 4096 바이트 = 4KB이며,이 파일 시스템의 블록 크기입니다)

이를 ls표시 하려면 다음 -s대신 / 옵션 을 사용해야합니다 -l.

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

첫 번째 열은 할당 된 크기이며 다시 1kiB 단위입니다. 마지막은 지정하여 변경할 수 있습니다 --block-size, 예를 들어,

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
또한 두 가지 정보를 갖는 것이 좋습니다. 파일 시스템은 "꼬리 압축"(sp?) (짧은 파일간에 공유 된 하나의 블록 사용), "쓰기시 복사"및 "구멍 펀칭"을 수행 할 수 있습니다. 파일 크기 <-> 디스크 공간 관계를 복잡한 것으로 만듭니다.
Rmano

9

깊은 대답은 다음과 같습니다.

논리 파일 길이와 디스크 공간은 실제로 다릅니다.

다른 답변에서 볼 수 있듯이 원칙적으로 2 바이트로 작성된 파일은 길이가 2 바이트 (show by ls -l)이고 4 KiB를 차지합니다 (show by du또는 ls -ls).

보다:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

Ok, test길이 1과 크기 (디스크) 4 KiB가 있습니다. 그러나:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(첫 번째 명령에 8191 0 바이트 추가 test), 이제 테스트의 길이는 8192이지만 디스크에서 4 KiB를 차지합니다 ( "구멍"이 있음) (1).

일부 파일 시스템은 짧은 파일을 압축하여 블록을 공유하여 공간을 덜 차지하고 (예 : 테일 패킹 참조 ) btrfs같은 다른 파일은 쓰기시 복사를 수행 하므로 파일, 논리 길이 및 차지하는 공간의 관계 디스크는 복잡한 디스크입니다.

각주 :

(1) 그것은 실제로 구멍이 아니며 끝입니다 ...하지만 여전히 예제의 끝까지 작동합니다.


5

ls -l그냥 긴 형식입니다. ls -ls블록 크기를 표시하는 데 사용됩니다.

테스팅

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

보시다시피 파일 크기는 2B로 표시됩니다. 그러나 블록 크기를 확인해야하는 경우 아래 명령을 실행해야합니다.

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

위의 4는 사용 된 블록 크기를 표시합니다. stat명령을 사용하여 동일한 내용을 확인할 수도 있습니다 .

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

이제 ls -ls블록 크기를 4로 나열하고 블록 크기를 8로 stat표시하는 이유에 대한 의문이 생깁니다. 이 동작의 이유는 여기 의 답변에 명확하게 설명되어 있습니다 .

많은 디스크의 섹터 크기는 512 바이트입니다. 즉, 디스크에서 읽거나 쓰면 전체 512 바이트 섹터가 한 번에 전송됩니다. 섹터가 파일로 분할되지 않은 파일 시스템을 디자인하는 것은 당연합니다 (디자인을 복잡하게하고 성능을 저하시킬 수 있습니다). 따라서 파일 시스템은 파일에 512 바이트 청크를 사용하는 경향이 있습니다. 같은 따라서 기존의 유틸리티 ls와는 du512 바이트 청크 단위로 크기를 표시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.