inode당 최대 바이트 비율이 67108864인 이유는 무엇입니까? 왜 최대값이 있나요?

inode당 최대 바이트 비율이 67108864인 이유는 무엇입니까? 왜 최대값이 있나요?

순수 대용량 비디오 파일로 디스크를 포맷할 때 사용 가능한 디스크 공간을 최대화하기 위해 inode 값당 적절한 바이트 수를 계산했습니다.

그러나 나를 반긴 것은 다음과 같았다.

mkfs.ext4: invalid inode ratio [RATIO] (min 1024/max 67108864)

나는 최소값이 이론적으로 사용될 수 있는 것에서 파생되었다고 가정합니다. 사용할 수 있는 것보다 더 많은 inode를 가질 필요는 없습니다.

그러나 최대값은 어디에서 오는가? mkfs생성된 파일 시스템에 어떤 파일 크기를 넣을지 잘 모르겠습니다. 따라서 그렇지 않은 경우 {disk size} - {1 inode size}최대 파일 크기가 67MB인 것은 물론이고 왜 최대 파일 크기가 있는지 전혀 이해하지 못합니다.

답변1

파일 시스템이 구축되는 방식 때문입니다. 약간 혼란스럽습니다. 기본적으로 비율을 1/64MB로 낮출 수도 없습니다.

~에서kernel.org의 Ext4 디스크 레이아웃 문서, 파일 시스템 내부 구조가 파일 시스템의 크기를 제어하는 ​​블록 크기(기본적으로 4kB)와 연관되어 있음을 알 수 있습니다.블록 그룹및 블록 그룹의 inode 수입니다.블록 그룹그룹에 있는 블록의 블록 크기와 하나 이상의 inode 블록이 포함된 비트맵.

비트맵으로 인해 최대 블록 그룹 크기는 8 blocks * block size in bytes이므로 4kB 블록이 있는 FS에서 블록 그룹 크기는 32768 블록 또는 128MB입니다. inode는 최소 1개의 블록을 차지하므로 4kB 블록의 경우 (4096 B/block) / (256 B/inode) = 16 inodes/block 128MB당 최소 16개의 inode 또는 8MB당 1개의 inode를 얻습니다.

256B/inode의 경우 이는 256B/8MB, 즉 32kB당 1바이트 또는 전체 크기의 약 0,003%입니다.

inode 수를 줄이는 것은 도움이 되지 않습니다. 부분적으로 채워진 inode 블록만 얻게 됩니다. 또한 할당이 블록 단위로 이루어지기 때문에 inode의 크기는 중요하지 않습니다. 블록 그룹 크기는 메타데이터의 실제 한계입니다.


블록 크기를 늘리면 도움이 됩니다. 이론적으로 최대 블록 그룹 크기는 블록 크기의 제곱에 따라 증가합니다(단, 64k 블록/그룹보다 약간 작은 것으로 제한되는 것으로 보입니다). 그러나 시스템 페이지 크기보다 큰 블록 크기를 사용할 수 없으므로 x86에서는 4kB 블록만 사용할 수 있습니다.


그러나bigalloc특징이것이 바로 당신이 원하는 것입니다:

대용량 파일로 구성된 대부분의 파일 시스템의 경우 조각화 및 메타데이터 오버헤드를 줄이기 위해 여러 블록 단위로 디스크 블록을 할당할 수 있는 것이 바람직합니다. bigalloc 함수는 바로 이 기능을 제공합니다.

관리자는 mkfs 시점에 블록 클러스터 크기(수퍼블록의 s_log_cluster_size 필드에 저장됨)를 설정할 수 있으며, 해당 시점부터 블록 비트맵은 개별 블록이 아닌 클러스터를 추적합니다. 즉, 블록 그룹 크기는 128MiB가 아닌 몇 GB일 수 있지만 디렉터리의 경우에도 최소 할당 단위는 블록이 아닌 클러스터가 됩니다.

를 사용하여 이 기능을 활성화 mkfs.ext4 -Obigalloc하고 을 사용하여 클러스터 크기를 설정할 수 -C<bytes>있지만 mkfs다음 사항에 유의하십시오.

Warning: the bigalloc feature is still under development
See https://ext4.wiki.kernel.org/index.php/Bigalloc for more information

할당 지연과 관련된 문제가 이 페이지에 언급되어 있습니다.ext4매뉴얼 페이지, 그리고 단어'리스크가 크다'Bigalloc 위키 페이지에도 나타납니다.


이는 이 옵션으로 설정된 64MB/inode 제한과 무관합니다 -i. 인터페이스 수준에서 설정된 임의의 제한인 것 같습니다. 이 옵션을 사용하여 inode 수를 -N직접 설정할 수도 있으며 사용할 때 확인되지 않습니다. 상한선이 있습니다기반으로이것최고실제로 선택한 구조 제한의 블록 크기가 아닌 파일 시스템의 블록 크기입니다.

64k 블록/그룹 제한으로 인해 64MB/inode 비율 없이는 bigalloc가능한 적은 수의 inode를 얻을 수 없지만 , 이를 사용하면 bigalloc그보다 훨씬 낮은 inode 수를 설정할 수 있습니다.

답변2

표시되는 숫자는 다음과 같은 이유로 하드코딩되어 있습니다.

소스 mke2fs코드는 다음과 같습니다

            com_err(program_name, 0,
                _("invalid inode ratio %s (min %d/max %d)"),
                optarg, EXT2_MIN_BLOCK_SIZE,
                EXT2_MAX_BLOCK_SIZE * 1024);

(릴리스 노트에는 사용자에게 더 친절하고 오류가 발생했을 때 가능한 최소 및 최대 값을 표시한다는 메시지도 있는데, 이는 이전보다 좋습니다.)

그리고:

#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)

마침내:

define EXT2_MIN_BLOCK_LOG_SIZE      10  /* 1024 */
define EXT2_MAX_BLOCK_LOG_SIZE      16  /* 65536 */

이것은 당신이 보고 있는 것을 설명합니다.

원래는 그럴 줄 알았는데https://unix.stackexchange.com/a/193140/211833, 비율은 최대 파티션 크기를 최대 inode 수로 나눈 값이지만, 그렇지 않습니다.

사양에 따르면 4k 블록의 경우 ext4최대 볼륨 크기는 1엑비바이트(2 60 바이트), 최대 inode 수는 2 32 , 최대 파일 크기는 16TiB(16 * 2 40 = 2 44)입니다.

따라서 inode 수로 나눈 최대 파티션 크기는 2 60-32 = 2 28 이며 이는 소스 파일에 하드코딩된 항목이 아닙니다(67108864는 2 26 입니다 ). 차이점은 모르겠지만 파일 시스템 개발자도 아닙니다.

관련 정보