ext2 파일 시스템으로 포맷된 드라이브를 허용하는 대학용 CLI 프로그램을 작성해야 합니다. 일부 파일을 복원해야 합니다. 읽고 나서이것글을 보다가 질문이 하나 더 있습니다. 슈퍼블록 이후의 블록 그룹 설명자 테이블을 읽을 때 언제 멈춰야 할지 모르겠습니다. FS를 올바르게 이해하면 블록 단위로 할당됩니다. 따라서 테이블이 한 블록에 맞지 않으면 두 번째 블록 전체가 테이블에 할당됩니다. 하지만 테이블에 할당된 블록 수를 어떻게 알 수 있나요?
슈퍼블록에는 이러한 필드가 포함되어 있지만 s_blocks_count
조각 s_blocks_per_group
화율이 0%인 경우에만 유용합니다. 예를 들어, 조각화로 인해 각각 하나의 데이터 블록만 있는 8개의 그룹이 있는 경우 그룹 수를 추측할 수 없습니다.
그러다가 s_first_data_block
이것이 나에게 필요한 정확한 정보라고 생각했습니다.
decriptor_table_range = end_of_superblock..(s_first_data_block - block_bitmap - inode_bitmap - inode_table)
inode 테이블의 크기는 및 에 의해 s_inodes_per_group
정의됩니다 s_inode_size
. 하지만 기사에서는 s_first_data_block
0 또는 1만 가능하다고 지적합니다.
첫 번째 데이터 블록을 식별하는 32비트 값, 즉 슈퍼블록 구조를 포함하는 블록의 ID입니다.
이 값은 블록 크기가 1KB보다 큰 파일 시스템의 경우 항상 0이고 블록 크기가 1KB인 파일 시스템의 경우 1입니다. 슈퍼블록은 항상 디스크의 바이트 1024(대개 정확히 세 번째 섹터의 첫 번째 바이트)에서 시작됩니다.
그래서 그것도 도움이 되지 않습니다. 내가 볼 수 있는 유일한 기회는 드라이브 크기를 확인하고 점점 늘어나는 그룹 설명자 테이블을 고려하여 드라이브에 들어갈 수 있는 그룹 수를 확인하는 것입니다. 하지만 .img 파일을 드라이브로 마운트하면 어떻게 될까요? 이 파일은 동적으로 커질 것 같아서 최대 크기가 얼마인지는 알 수 없습니다.
그렇다면 블록 설명자 테이블에서 사용되는 블록 수, 즉 블록 그룹이 몇 개인지 어떻게 알 수 있습니까?
편집하다:
죄송합니다. 제가 큰 실수를 했습니다. 글을 읽어보니 s_blocks_count
현재 사용하고 있는 블록의 개수도 포함된 줄 알았어요 . 그러나 여기에는 사용 가능한 블록을 포함한 총계가 포함됩니다. 그래서 s_blocks_count / s_blocks_per_group
실제로 작동합니다.
32비트 값은 사용된 블록, 사용 가능한 블록, 예약된 블록을 모두 포함하여 시스템의 총 블록 수를 나타냅니다. 값은 (s_blocks_per_group * 블록 그룹 수)보다 작거나 같아야 합니다. 볼륨 크기로 인해 마지막 블록 그룹의 블록 수가 s_blocks_per_group보다 적을 경우 이전 계산보다 낮아질 수 있습니다. 각 블록 그룹에 정의된 블록의 합과 같아야 합니다.