EXT3: 블록 크기가 4K인 경우 ls -l이 그 아래의 파일 크기를 표시하는 이유는 무엇입니까?

EXT3: 블록 크기가 4K인 경우 ls -l이 그 아래의 파일 크기를 표시하는 이유는 무엇입니까?

한 글자가 포함된 파일에 대해 ls -l을 실행하면 파일 크기는 2B로 나타납니다. 파일 시스템이 4k 블록인 경우 파일을 블록 크기로 반올림한다고 가정합니까? ls -l이 실제로 inode에서 바이트 수를 읽기 때문입니까? 어떤 상황에서 Linux 2.6 커널 GNU 유틸리티에서 블록 답변을 실제 바이트 답변으로 반올림하시겠습니까?

답변1

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

$ 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

(실제로 du크기는 1kiB 단위로 표시되므로 여기서의 크기는 4×1024바이트 = 4096바이트 = 4kiB, 즉 이 파일 시스템의 블록 크기입니다.)

이를 표시 하려면 다음 대신/추가로 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

답변2

제가 생각하는 심오한 대답은 다음과 같습니다.

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

다른 답변에서 알 수 있듯이 원칙적으로 2바이트로 생성된 파일은 2바이트 길이(로 표시 ls -l)이고 4KiB( 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

좋습니다. test길이는 1이고 크기(디스크)는 4KiB입니다. 하지만:

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이지만 여전히 디스크에서 4KiB를 차지합니다("구멍"이 있음)(1).

일부 파일 시스템은 공유 블록을 통해 공간을 덜 차지하도록 짧은 파일을 압축할 수도 있습니다(예제 참조).꼬리 포장) 다른 사람btrfs와 마찬가지로 쓰기 중 복사, 따라서 파일, 논리적 길이 및 디스크에서 차지하는 공간 간의 관계는 복잡합니다.

각주:

(1)사실 이건 구멍이 아니예요, 끝에 있습니다...하지만 예제가 끝날 때까지 계속 작동합니다.

답변3

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로 표시되지만 stat블록 크기는 8로 표시되는 이유에 대한 질문이 발생합니다 . 이 동작의 이유는 답변에 명확하게 설명되어 있습니다.여기.

많은 디스크의 섹터 크기는 512바이트입니다. 이는 디스크에 대한 읽기 또는 쓰기 작업이 전체 512바이트 섹터를 한 번에 전송한다는 의미입니다. 파일 간에 섹터가 분할되지 않도록 파일 시스템을 설계하는 것은 당연합니다(이로 인해 설계가 복잡해지고 성능이 저하됨). 따라서 파일 시스템은 파일에 512바이트 블록을 사용하는 경향이 있습니다. 따라서 및 등의 기존 유틸리티는 크기를 512바이트 블록 ls으로 나타냅니다.du

관련 정보