디스크의 파일 크기와 크기 차이가 4KiB보다 큰 이유는 무엇입니까?

디스크의 파일 크기와 크기 차이가 4KiB보다 큰 이유는 무엇입니까?

ext4 파일 시스템은 일반적으로 4KiB 블록을 사용합니다. 이렇게 하면 작은 파일을 작성할 때 크기가 4KiB 미만인 경우 모든 파일 관리자에서 차이를 확인할 수 있습니다. 일반적으로 파일 크기와 디스크 크기라는 두 가지 값이 있습니다. 첫 번째 값은 정확하고 다른 값은 4KiB의 곱입니다.

더 큰 파일의 경우 크기 차이가 4KiB(완전히 기록되지 않은 마지막 블록)를 초과할 수 없다고 항상 생각했습니다. 하지만 내 디스크에 있는 일부 파일의 경우 4KiB를 초과하는 차이(예: 9425바이트)를 볼 수 있습니다. 따라서 질문은 간단합니다. 크기가 4KiB 이상 다른 이유는 무엇입니까? 조각화 때문인가요, 아니면 다른 이유인가요? 파일 중간에 일부 블록이 완전히 쓰여지지 않은 것이 이상하지 않나요?

답변1

파일을 구성하는 블록 목록은 어딘가에 저장되어야 합니다. 일반적으로 inode의 공간은 매우 작지만 inode에 블록이 너무 많으면 파일 시스템이 할당을 수행합니다.간접 차단파일 데이터를 포함하는 블록 외에도 블록의 주소도 저장됩니다. 적어도 Linux의 ext2/ext3/ext4의 경우, 그리고 대부분의 Unix 계열 운영 체제에 있는 대부분의 Unix 계열 파일 시스템의 경우 파일의 디스크 사용량은 간접 블록을 고려합니다.

Ext4 사용범위 트리차단 목록을 저장합니다. 파일이 연속된 블록 목록을 순서대로 사용하는 경우 이는 트리에서 단일 항목을 차지합니다. 따라서 조각화가 적은 파일에는 간접 블록이 필요하지 않고 첫 번째 블록과 블록 수를 지정하는 트리의 단일 항목만 필요합니다. 최대로 조각화된 파일에는 블록당 하나의 트리 항목을 저장하기 위해 많은 수의 간접 블록이 필요합니다. 파일이 조각화되지 않거나 최소한으로 조각화된 경우 간접 블록은 필요하지 않으며 파일의 디스크 사용량은 파일 시스템 블록의 정수로 반올림된 파일 크기입니다. 조각난 파일에는 간접 블록이 필요합니다.

Ext2와 ext3에는 더 간단한 솔루션이 있습니다.차단 목록이 압축되지 않았습니다.따라서 항목 수는 파일 크기에 선형적으로 비례하는 것보다 약간 더 커지며, 파일이 12개 이상의 블록(즉, inode에 직접 기록할 수 있는 블록 수)을 사용하는 경우 간접 블록이 필요합니다.

다음 명령을 사용하여 ext2/ext3/ext4 파일 시스템을 탐색할 수 있습니다 debugfs. debugfs에서 blocks /path/to/file파일이 사용하는 블록을 나열하면 파일이 얼마나 조각화되어 있는지 알 수 있습니다. 이 명령은 filefrag /path/to/file조각 수를 제공합니다. ext4의 경우 이는 간접 블록 수 및 파일 크기와 파일 디스크 사용량 간의 차이와 관련이 있습니다.

답변2

내 생각엔 이런 일이 일어날 수도 있을 것 같아이 경우:

FALLOC_FL_KEEP_SIZE 플래그가 모드에 지정되면 호출은 유사하게 동작하지만 offset+len이 파일 크기보다 크더라도 파일 크기는 변경되지 않습니다. 이러한 방식으로 파일 끝을 넘어 0이 된 블록을 사전 할당하는 것은 추가 작업 부하를 최적화하는 데 유용합니다.

관련 정보