web-dev-qa-db-ja.com

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

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

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

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

13
mike

「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
17
katriel

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

4
Evan Anderson

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

より新しい(そしてより効率的な)代替手段は、FIEMAP ioctlです。これは、エクステントに関する詳細情報も返すことができます(ext4に役立ちます)。

4
CesarB
hdparm --fibmap /path/to/filename

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

man 8 hdparm

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

3
ChewbaccaKL

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

編集:私の悪いことに、ブロックの数ではなく、ブロック自体のリストを探しているようです。

1
user10357