Linux에서 파일의 데이터 블록을 어떻게 나열합니까?


13

알다시피, 유닉스 계열 운영 체제의 각 파일에는 inode 번호 ( "ls -i"로 볼 수 있음)가 있으며 각 inode는 파일의 실제 데이터를 포함하는 디스크 블록 목록입니다.

파일 이름을 인수로 사용하여 해당 파일의 inode가 가리키는 디스크 블록 목록을 인쇄하는 Linux 명령이 있습니까?

PS 해당 파일 시스템은 ext3입니다.

답변:


17

"debugfs"도구를 사용하여 명령 행 또는 interactivley에서 파일 정보를 볼 수 있습니다. 어느 쪽이든 사용하십시오 :

# debugfs /dev/<spartition>
# stat /path/to/file

또는

# debugfs -R "stat /path/to/file" /dev/<partition>

예를 들면 다음과 같습니다.

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1

'stat'에 대한 인수가 항상 / path / to / file은 아닙니다. / path / to / file을 사용하면 루트 파일 시스템 (/에 마운트 됨)의 파일에는 작동하지만 다른 파일 시스템에 마운트 된 경로에는 작동하지 않습니다. 이 경우 오류 메시지가 나타날 수 있습니다 File not found by ext2_lookup. 따라서 stat의 인수에 inode 표기법을 사용하는 것이 좋습니다. 사용은 ls -i'<>'대신에 / 경로 /로 / 파일에서 해당 번호와 debugfs의있는 invoke 후, 파일의 inode 번호를 얻을 수 있습니다. 예를 들면 :# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR 그 의견을 설명해 주시겠습니까? path/to/file모든 경우에 왜 작동하지 않아야 합니까? 내가 혼동하는 것은 debugfs ..... /dev/fs_blockdev내 이해력 을 통해 고려할 파일 시스템이 하나 뿐이며이 시스템 내의 모든 파일은 경로 또는 타이어 아이 노드를 통해 액세스 할 수 있다는 것입니다. 무엇을 표현하고 싶습니까?
humanityANDpeace

@humanityANDpeace, 파일이 루트 파일 시스템 외부의 파티션 (파일 시스템)에있는 경우, 즉 루트 파티션 아래의 마운트 지점에 마운트 된 경우 ext2_lookup 작업은 주어진 장치에서 주어진 경로를 찾는 데 실패하는 것 같습니다 (분할). 이로 인해 내가 언급 한 오류가 발생합니다. 예를 들어, / home 폴더가 루트 파일 시스템 (예 : / dev / sda3)에있는 루트 파일 시스템을 통해 / dev / sda5에서 마운트 debugfs -R "stat /home/myuser/foo.txt" /dev/sda5된 경우 오류가 발생합니다. 그러나 debugfs -R "stat /path/on/rootfs" /dev/sda3작업을 호출 합니다.
ElazarR

당신이 필요하다고 생각합니다 sudo. 그렇지 않으면 도움이되지 않는 메시지가 표시됩니다.
Kedar Mhaswade

그리고 반대 질문 : 주어진 블록을 사용하는 파일을 어떻게 찾을 수 있습니까?
Luis A. Florit

4

"debugfs"의 구문, 특히 "stat"명령을보십시오. 파일에 사용 된 데이터 블록 목록이 표시됩니다. "-f"인수를 사용하여 매개 변수를 "debugfs"에 전달하여 스크립트에서 호출 할 수 있습니다.


4

debugfs답변 에서처럼 파티션에서 읽을 필요없이 블록 목록을 얻는 간단한 방법 은 FIBMAPioctl 을 사용하는 것 입니다. 나는 어떤 명령을해야할지 모르겠지만 작성하는 것은 매우 간단합니다. 빠른 Google 검색 으로 FIBMAP use의 예를 들었습니다 . 한 가지 장점은 bmapext3뿐만 아니라 작업 을 지원하는 모든 파일 시스템에서 작동한다는 것입니다 .

FIEMAPioctl 이 더 새롭고 더 효율적인 대안으로, 익스텐트에 대한 자세한 정보를 반환 할 수 있습니다 (ext4에 유용).


3
hdparm --fibmap /path/to/filename

zfs에서는 작동하지 않지만 ext4, btrfs, (v) fat 등에서는 작동합니다.

man 8 hdparm :

--fibmap사용될 때, 이것은 주어진 유일한 플래그 여야합니다. 매개 변수로 파일 경로가 필요하며 해당 파일이 차지하는 장치 범위 (섹터 범위) 목록을 디스크에서 인쇄합니다. 섹터 번호들은 물리적 장치 (섹터 0에서 참조 절대 LBA 참조로 주어진다 하지 파티션 또는 파일 시스템). 그런 다음이 정보는 더 큰 파일의 조각화 정도를 검사하거나 결함 주입 테스트 절차 중에 의도적으로 손상 될 적절한 섹터를 결정하는 등의 다양한 목적으로 사용될 수 있습니다.


1

적어도 일부 리눅스 머신에서 ... "ls -s"는 당신이 찾고있는 것을 제공 할 것입니다.

편집 : 내 나쁜, 나는 당신이 블록의 개수가 아닌 블록 자체의 목록을 찾고 있음을 알았습니다.


-s는 파일 크기를 블록 단위로 보여줍니다. 블록 번호의 실제 목록을 원합니다.
Mike

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.