inode 또는 주소 공간 맵에서 섹터 번호 가져오기

inode 또는 주소 공간 맵에서 섹터 번호 가져오기

ext4 파일 시스템의 inode에서 섹터 번호를 계산하는 방법을 이해하려고 합니다. 그래서 읽고 있어요ext4_mpage_read페이지기능.

기능 설명: 읽기 요청 시 해당 페이지가 페이지 캐시에 없으면 새로운 페이지가 할당되어 페이지 캐시에 추가됩니다. 그런 다음 위 함수를 호출하여 디스크에서 데이터를 가져와 페이지에 채웁니다.

나는 페이지의 크기가 4096바이트이고 블록이 512바이트라는 것을 알고 있습니다(따라서 페이지는 8개의 블록으로 구성됩니다). 내가 이해한 바로는 위 함수는 블록 번호를 페이지에 매핑합니다.블록 [페이지 블록]이 장소에서는:여기그리고여기. 블록을 매핑한 후 함수는 bio를 할당하고,섹터 할당디스크에서 데이터를 읽으려면 generic_make_request()를 읽고 호출하세요.

위 함수가 주어진 주소 공간에 매핑된 섹터를 계산하는 방법을 이해하는 것이 혼란스럽습니다. ext4 파일 시스템의 inode에서 섹터 번호를 얻는 다른 방법이 있습니까?

답변1

filefrag -v /path/to/file가장 쉬운 방법은 일반 사용자로 실행할 수 있는 명령을 실행하는 것입니다( debugfs보통 루트 사용자에게만 제공되는 블록 장치에 대한 읽기 액세스가 필요한 것과는 달리). 이것은 ext4 물리학을 제공합니다블록 번호(일반적으로 4096바이트) 파일 내의 해당 논리적 오프셋을 기준으로 하는 파티션의 시작입니다. filefrag -v -kKiB 단위나 filefrag -v -b11바이트 "청크"를 사용할 수도 있습니다 .

$ filefrag -vb1 google-chrome-stable_current_x86_64.rpm 
Filesystem type is: ef53
File size of google-chrome-stable_current_x86_64.rpm is 57333190
     (57335808 blocks of 1 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0.. 8388607: 5872025600..5880414207: 8388608: 
   1:  8388608..16777215: 5897191424..5905580031: 8388608: 5880414208:
   2: 16777216..25165823: 6241124352..6249512959: 8388608: 5905580032:
   3: 25165824..33554431: 8019509248..8027897855: 8388608: 6249512960:
   4: 33554432..41943039: 8128561152..8136949759: 8388608: 8027897856:
   5: 41943040..50331647: 8220835840..8229224447: 8388608: 8136949760:
   6: 50331648..57335807: 28538081280..28545085439: 7004160: 8229224448: last,eof

이는 가장 일반적인 파일 시스템 방법을 ioctl(fd, FS_IOC_FIEMAP, ...)사용하여 파일 설명자의 범위 매핑을 요청 하는 데 사용됩니다 . ->fiemap()이전 커널이 많이 사용되었지만 ioctl(fd, FS_IOC_FIBMAP, ...)한 번에 하나의 블록만 매핑할 수 있었고 오늘날에는 대용량 파일에 대해 수백만 번의 호출이 필요할 수 있습니다.

관련 정보