Linuxでファイルのデータブロックを一覧表示するにはどうすればよいですか?


13

私が理解しているように、Unixライクなオペレーティングシステム上の各ファイルにはiノード番号(「ls -i」で表示できます)があり、各iノードはファイルの実際のデータを含むディスクブロックのリストです。

引数としてファイル名を取り、そのファイルのiノードが指すディスクブロックのリストを出力するLinuxコマンドはありますか?

PS問題のファイルシステムはext3です。

回答:


17

「debugfs」ツールを使用して、コマンドラインまたは対話形式でファイル情報を表示できます。どちらかを使用:

# 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の引数にiノード表記を使用することをお勧めします。ls -iファイルのiノード番号を取得するために使用し、/ path / to / fileの代わりに '<>'でその番号を使用してdebugfsを呼び出します。例:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarRそのコメントを説明できますか?なぜpath/to/fileすべての場合に機能しないのですか?私を混乱させてdebugfs ..... /dev/fs_blockdevいるのは、私の理解では、これまでに考慮されたファイルシステムは1つだけであり、このシステム内のすべてのファイルは、パスまたはtino iノードのいずれかでアクセスできるということです、あなたは何を表現したいですか?
humanityANDpeace

@humanityANDpeace、ファイルがルートファイルシステム外のパーティション(ファイルシステム)にある場合、つまりルートパーティションの下のマウントポイントにマウントされている場合、ext2_lookup操作は指定されたデバイスの下で指定されたパスを見つけることに失敗するようです(パーティション)。これにより、私が言及したエラーが発生します。たとえば、/ homeフォルダーが/ dev / sda5からルートファイルシステム(別のパーティション、たとえば/ dev / sda3上)にマウントさdebugfs -R "stat /home/myuser/foo.txt" /dev/sda5れている場合、エラーが発生します。しかし、呼び出しはdebugfs -R "stat /path/on/rootfs" /dev/sda3機能します。
-ElazarR

私はあなたが必要だと思うsudo、さもないといくつかの役に立たないメッセージが表示されます。
ケダルMhaswade

そして、逆の質問:どのファイルが特定のブロックを使用しているかをどのようにして見つけることができますか?
ルイスA.フローリット

4

「debugfs」の構文、特に「stat」コマンドを見てください。これにより、ファイルで使用されるデータブロックのリストが表示されます。「-f」引数を使用してパラメータを「debugfs」に渡し、スクリプトから呼び出すことができます。


4

ブロックのリストを取得する簡単な方法(debugfs答えのようにパーティションから読み取る必要なし)は、FIBMAPioctl を使用することです。そうするためのコマンドは知りませんが、それを書くのはとても簡単です。Googleで簡単に検索するとFIBMAPの使用例がわかりまし。1つの利点は、bmapext3だけでなく、操作をサポートする任意のファイルシステムで動作することです。

新しい(より効率的な)代替手段はFIEMAPioctlで、エクステントに関する詳細情報を返すこともできます(ext4に有用)。


3
hdparm --fibmap /path/to/filename

私はzfsでは動作しませんが、ext4、btrfs、(v)fatなどでは動作します

man 8 hdparm

--fibmap使用する場合、これは指定された唯一のフラグでなければなりません。パラメーターとしてファイルパスを必要とし、ディスク上のそのファイルが占有するデバイスエクステント(セクター範囲)のリストを出力します。セクター番号は、パーティションまたはファイルシステムではなく、物理デバイスのセクター0から参照される絶対LBA番号として指定されます。この情報は、大きなファイルの断片化の程度を調べたり、障害注入テスト手順中に意図的に破損する適切なセクターを決定するなど、さまざまな目的に使用できます。


1

少なくとも一部のLinuxマシンでは...「ls -s」が探しているものを提供するかもしれません。

編集:私の悪い、あなたはブロックの数ではなく、ブロック自体のリストを探していることがわかります。


-sはファイルのサイズをブロック単位で表示します-ブロック番号の実際のリストが必要です。
マイク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.