如何在 Linux 上列出文件的数据块?

mik*_*ike 14 linux unix filesystems ext3

据我了解,类 Unix 操作系统上的每个文件都有一个 inode 编号(可以用“ls -i”查看),每个 inode 是一个包含文件实际数据的磁盘块列表。

是否有一个 Linux 命令将文件名作为其参数并打印出该文件的 inode 指向的磁盘块列表?

PS 有问题的文件系统是 ext3。

kat*_*iel 20

您可以使用“debugfs”工具在命令行或交互上查看文件信息。要么使用:

# debugfs /dev/<spartition>
# stat /path/to/file
Run Code Online (Sandbox Code Playgroud)

或者

# debugfs -R "stat /path/to/file" /dev/<partition>
Run Code Online (Sandbox Code Playgroud)

例如:

# 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
Run Code Online (Sandbox Code Playgroud)


Ces*_*arB 5

获取块列表的一种简单方法(不必像debugfs答案中那样从分区中读取)是使用FIBMAPioctl。我不知道有什么命令可以这样做,但是写一个很简单;一个快速的谷歌搜索给了我一个 FIBMAP 使用的例子,它完全符合你的要求。一个优点是它可以在支持该bmap操作的任何文件系统上工作,而不仅仅是 ext3。

一个更新(也更有效)的替代方法是FIEMAPioctl,它也可以返回有关范围的详细信息(对 ext4 很有用)。


小智 5

hdparm --fibmap /path/to/filename
Run Code Online (Sandbox Code Playgroud)

我不会在 zfs 上工作,但会在 ext4、btrfs、(v)fat 等上工作

man 8 hdparm

--fibmap使用时,这必须是唯一给出的标志。它需要一个文件路径作为参数,并将打印出该文件在磁盘上占用的设备范围(扇区范围)列表。扇区编号作为绝对 LBA 编号给出,从物理设备(不是分区或文件系统)的扇区 0 引用。然后,此信息可用于多种目的,例如检查较大文件的碎片程度,或确定在故障注入测试过程中故意损坏的适当扇区。