내 디렉토리에 다음이 있는 경우:
empty_dir
: 디렉토리가 비어 있습니다.empty_file
: 파일이 비어 있습니다.one_char
: 하나의 문자로 구성된 파일입니다.several_blocks
: 여러 블록으로 구성된 파일입니다(그러나 "너무 크거나" 희박하지 않음).
그러면 ls
다음 †이 표시됩니다.
$ ls -Gghs
total 152K
8,0K drwxr-xr-x 2 4,0K dec 21 23:34 empty_dir
4,0K -rw-r--r-- 1 0 dec 21 23:21 empty_file
8,0K -rw-r--r-- 1 1 dec 21 23:22 one_char
132K -rw-r--r-- 1 127K dec 22 00:14 several_blocks
둘째, stat
다음을 표시합니다.
$ stat empty_dir/
File: empty_dir/
Size: 4096 Blocks: 16 IO Block: 4096 directory
...
$ stat empty_file
File: empty_file
Size: 0 Blocks: 8 IO Block: 4096 regular empty file
...
$ stat one_char
File: one_char
Size: 1 Blocks: 16 IO Block: 4096 regular file
...
$ stat several_blocks
File: several_blocks
Size: 129760 Blocks: 264 IO Block: 4096 regular file
...
셋째, du
다음이 표시됩니다.
$ du -h empty_dir/
8,0K empty_dir/
$ du -h empty_file
4,0K empty_file
$ du -h one_char
8,0K one_char
$ du -h several_blocks
132K several_blocks
마침내:
$ tune2fs /dev/nvme0n1p2 -l
...
Block size: 4096
...
Inode size: 256
...
보고된 블록 크기 stat
는 512B입니다. 이는 출력이 stat
, 및 ls
다음 사이에서 du
일관됨을 의미합니다.
empty_dir
:16 * 512 / 1024 = 4096 + 4096 = 8KiB.empty_file
: 8 * 512 / 1024 = 0 + 4096 = 4KiB.one_char
:16 * 512 / 1024 = 4096 + 4096 = 8KiB.several_blocks
: 264 * 512 / 1024 = 129760 + 5408 = 129760 + 1312 + 4096 = 131072 + 4096 = 32 * 4096 + 4096 = 132KiB.
질문
- 할당된 크기가 하나가 아닌
empty_dir
두one_char
블록(크기 4096B)인 이유는 무엇입니까? - 블록의 할당 크기가
empty_file
0이 아닌 이유는 무엇입니까? several_blocks
할당된 크기 (및 일반적으로 더 큰 파일)가 실제 크기보다 한 블록 이상 큰 이유는 무엇입니까 ?확실히크기((264 * 512) - 129760 = 5408 > 4096)?
나는 추가 블록이 inode
다음과 같이 포함된 블록이라고 생각합니다.질문자물었습니다(그러나 답변을 받지 못했습니다). 마찬가지로 이 질문자도 마찬가지입니다.관찰됨크기를 두 배로 늘렸으나 문제의 진술이 잘못되어 문제의 다른 부분에 대한 답변을 받습니다. 그러나 이답변또 다른 질문으로는 추가 블록이 없어야 한다는 제안이 있었습니다(이것은 내 직감입니다).
- 우리 시스템이 잘못 구성되어 있습니까?
- 포함된 블록이
inode
계산된다고 가정합니다. 여러 파일에 사용될 때 여러 번 계산된 블록을du
보상합니까? 여러 블록 이 동일한 블록에 있어야 합니까(블록은 16 (4096 / 256 = 16)을 포함할 수 있으므로)?inode
inodes
inodes
부록
@WumpusQ.Wumbley는 그럴 수도 있다고 추측합니다.확장된 속성사실이 밝혀졌습니다!
getfattr
반품 user.com.dropbox.attributes
. 테스트 디렉터리는 내 디렉터리에 심볼릭 링크된 디렉터리 깊은 곳에 있는 하위 디렉터리인 것으로 나타났습니다.드롭 박스폴더. 아래에서 허용되는 답변을 참조하세요.
†GNU/Linux에서는 GNU Core Utilities 8.30을 사용하고 NVME SSD의 ext4에서는 커널 4.19.1(Manjaro)을 사용합니다.
답변1
@WumpusQ.Wumbley는 댓글에서 이유를 지적했습니다.확장된 속성.
완전성을 위해 답변은 아래와 같습니다.
확장된 속성, 이 경우에는 적용됩니다드롭 박스( getfattr
return user.com.dropbox.attributes
), 저장을 위해 추가 블록을 사용합니다. 이것들 중 아무것도 아닌확장된 속성 ls
(및 기타 명령)은 다음을 반환합니다.
$ ls -Gghs
total 136K
4,0K drwxr-xr-x 2 4,0K dec 22 20:11 empty_dir
0 -rw-r--r-- 1 0 dec 22 20:11 empty_file
4,0K -rw-r--r-- 1 1 dec 22 20:12 one_char
128K -rw-r--r-- 1 127K dec 22 20:13 several_blocks
예상대로.
또한 stat
유일하게 흥미로운 several_blocks
반환 사례의 경우:
$ stat several_blocks
File: several_blocks
Size: 129760 Blocks: 256 IO Block: 4096 regular file
...
이는 256 * 512 - 129760 = 1312 < 4096이므로 예상한 대로입니다. 즉, 추가 블록이 사용되지 않습니다.
- 왜냐하면확장된 속성.
- 왜냐하면확장된 속성.
- 왜냐하면확장된 속성.
- 아니요, 하지만 조심하세요확장된 속성응용 프로그램에 의해 추가되었습니다.
- 잘못된 가정.
답변2
"추가 블록"은 구성의 일부 불일치로 인한 것이 아닙니다. (항상 다른 이유로 인해 틀릴 가능성이 있다고 가정합니다. 우주선이 커널 코드를 손상시키는 것과 같습니다 :-)).
이러한 명령에 대한 디스크 사용량 계산의 세부 사항을 수동으로 조정할 수 있는 옵션이 없기 때문에 이렇게 말하는 것입니다. 이러한 명령은 단순히 곱셈이나 나눗셈을 통해 디스크 사용량을 다른 단위로 변환합니다. stat() 시스템 호출을 호출하여 디스크 사용량을 가져옵니다. 커널은 항상 512바이트인 여러 개의 합성 "청크"를 반환합니다. stat()이 블록 수를 계산하는 방법에 영향을 미치는 커널 옵션도 없습니다.
inode를 포함하는 블록은 ext4 파일 시스템에서 계산되어서는 안 된다는 점을 말씀드릴 수 있습니다. 일반적으로 말하면,자일스는 말한다그가 알고 있는 어떤 파일 시스템에도 포함되지 않습니다. 어쩌면 부분적으로 당신이 만든 요점 때문일 수도 있습니다 :-). Inode는 보고된 512바이트 블록보다 작은 경향이 있습니다 stat
. ext4의 기본값은 256바이트 inode이고 ext3의 기본값은 128바이트입니다.
관련 질문(오른쪽 열)을 보면 추가 블록이 있을 수 있는 상황을 알 수 있습니다. 범위 트리(또는 범위가 비활성화된 경우 간접 차단)예ext4에 따라 다릅니다. (디스크의 파일 크기와 크기 차이가 4KiB보다 큰 이유는 무엇입니까?)
관련 질문에 대한 두 번째 대답은 또 다른 시나리오를 제안합니다. Fallocate()를 일부 사용하면 크기와 할당된 블록 수가 임의로 큰 차이가 있는 파일을 생성할 수 있습니다.
즉, 위의 내용이 설명하기에 충분하지 않은 것 같습니다.어느당신의 예.