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

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

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

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

PS 所讨论的文件系统是 ext3。

答案1

您可以使用“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

答案2

hdparm --fibmap /path/to/filename

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

man 8 hdparm

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

答案3

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

一种较新的(且更有效的)替代方案是FIEMAPioctl,它还可以返回有关范围的详细信息(对 ext4 有用)。

答案4

至少在某些 Linux 机器上……“ls -s”可能会提供您正在寻找的内容。

编辑:我的错,我看到您正在寻找块本身的列表,而不是块的数量。

相关内容