ls -ls 출력에 파일 크기보다 큰 블록 수가 표시됩니다.

ls -ls 출력에 파일 크기보다 큰 블록 수가 표시됩니다.

내가 아는 한, "-s" 옵션이 있는 ls 명령은 파일 크기를 블록 단위로 인쇄하고, ls는 블록 크기로 1024를 사용하지만 이상한 점을 발견했습니다.

더 나은 이해를 위해 ls -ls 명령의 다음 출력을 고려하십시오.

12-rw-r--r--. 1 루트 10240 7월 15일 19:22 z

파일 크기가 10240바이트이고 블록 크기가 1024이므로 이 파일의 블록 수는 10240/1024 = 10블록인데 왜 ls12블록으로 표시되는 걸까요?

인사

답변1

여기에 실제로 보고되는 것은 ls파일에 할당된 블록 크기입니다. 크기는 12KB입니다.

이 크기는 전통적으로 512B의 "블록"으로 보고되는데, 그 이유는 고대 Unix 시스템에서는 실제로 512바이트 블록이 많았기 때문입니다. 그러나 블록 크기는 파일 시스템에 따라 다르며 ls동일한 단위를 사용합니다. GNU 도구는 512B 대신 1kB를 단위로 사용합니다. 킬로바이트가 인간에게 0.5킬로바이트보다 더 의미가 있기 때문입니다.

Ext4 및 기타 여러 공통 파일 시스템의 기본값은 4kB 블록입니다. 따라서 10240바이트 파일은 크기가 12kB인 3개의 블록을 차지합니다.

당신은 또한 볼 수 있습니다파일 블록 크기 - stat와 ls의 차이그리고블록 크기와 클러스터 크기의 차이점.

답변2

이것은 좋은 질문입니다. 읽은 후자일스의 대답, 강제로 읽어야 했고 man ls,ls --help 닫다왜냐하면 나는 그의 대답이 틀렸다고 확신하기 때문입니다. 대신, 나는 그가 옳았다는 것을 증명하기 위해 이 대답을 제시합니다! :피

ls -ls1024바이트 파일의 결과는 다음과 같습니다.

12 -rw-r--r--. 1 root root 10240 Jul 15 19:22 z

우리가 이를 믿고 man ls문제의 파일이 10,240바이트라고 주장한다면 이 결과는 파일의 크기가 다음과 같다는 것을 알려줍니다.12 blocks, 그러나 이 결과는 이러한 블록의 크기를 알려주지 않습니다. 블록 크기를 이해하기 위해 관련 단락을 참조하면 man ls우리는 거의 빈손으로 나옵니다.

관련 단락은 man ls다음과 같습니다.

--block-size=SIZE
       with -l, scale sizes by SIZE when printing them; e.g., '--block size=M'; see SIZE format below

-k, --kibibytes
        default to 1024-byte blocks for disk usage; used only with -s and per directory totals  

-s, --size
       print the allocated size of each file, in blocks  

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
믿음에 의지하지 않음:

다음과 같이 10,240바이트 파일을 생성합니다.

fallocate -l 10240 lstest.txt

확인하다:

wc -c lstest.txt
10240 lstest.txt
ls -l
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt  
ls -ls
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt 
ls -lks 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt 
ls -ls --kibibytes 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt

말씀하신대로 이런거 같네요이상한문서에 따르면 12 * 1,024 = 12,288바이트이므로 10,240바이트보다 큽니다.

그러나 탈출구가 있습니다.

세 가지 사항을 고려하십시오.

  1. -s옵션은 보고서allocation파일 크기가 아님(참조 man ls)
  2. 블록 크기는추상적인파일 시스템에 정의되어 있습니다. 물리량은 아니지만,효율적인블록 크기를 다음과 같게 만듭니다.고급 형식 섹터 크기4,096바이트. 2011년 1월 이후 제조된 모든 HDD는 고급 포맷 표준을 준수합니다.
  3. 파일 시스템의 블록 크기를 결정할 수 있습니다.
stat -fc %s .     
# or, if you prefer:
stat -fc %s lstest.txt
# which is, in both cases (on my ext3 filesystem):
4096

마지막으로 몇 가지 답변

1. 위의 결론:ls파일 시스템에서 사용하는 블록 크기를 모릅니다.
ls2. 블록 크기를 알고 있다면 이를 다음과 공유해야 합니다 .
ls -ls --block-size=4K 
3 -rw-r--r-- 1 pi pi    3 Jan  4 02:09 lstest.txt

3 * 4,096 = 12,288바이트입니다. 또한 블록 크기(4,096바이트)는양자블록 장치의 저장 공간, 즉 저장 할당이 변경될 수 있는 최소 크기입니다. 이제 12,288바이트가 실제로 필요한 바이트 할당이라는 것이 분명해졌습니다. 그러나 블록에서 정답을 얻으려면 옵션을 통해 시스템의 블록 크기를 알려 man ls주어야 합니다 .ls--block-size=4K

3. 자일스의 대답이 맞았다
심사 숙고:

제 생각에는 man ls그다지 명확하지 않습니다. 어쩌면 파일 시스템 블록 크기를 모른다고 명시하도록 수정되어야 할까요?

더 나은 방법은 ls시스템에서 블록 크기를 가져오도록 수정하는 것입니다. 결국 stat그것은 그것의 일부입니다 GNU coreutils 8.30.

답변3

이것이 기본값이 되었기 때문에 기본 파일 시스템의 블록 크기는 4k일 가능성이 높습니다. 따라서 10.240바이트 파일에는 3개(ceil(10.240/4096)) 파일 시스템 블록이 필요합니다. 3개의 4k 블록, 각각 3 * 4 = 12개의 1k 블록으로 보고됨

관련 정보