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


13

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

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

PS该文件系统是ext3。

Answers:


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。因此,最好将inode表示法用作stat的参数。使用ls -i获取文件的inode编号,然后调用debugfs与“<>”,而不是/路径/到/文件数量。例如:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR你能解释一下这个评论吗?为什么path/to/file在所有情况下都不能正常工作?让我感到困惑的是,通过debugfs ..... /dev/fs_blockdev我的理解,我只考虑过一个文件系统,而该系统内的所有这些文件都可以通过其路径或通过Thair inode访问,您想表达什么?
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,否则将显示一些无用的消息。
Kedar Mhaswade

相反的问题:我们如何找出使用给定块的文件?
路易斯·弗洛里特

4

查看“ debugfs”的语法,尤其是“ stat”命令。这将显示文件使用的数据块的列表。您可以使用“ -f”参数将参数传递给“ debugfs”,以从脚本中调用它。


4

一种获取块列表的简单方法(无需像debugfs答案中那样从分区中读取)是使用FIBMAPioctl。我不知道有什么命令可以这样做,但是写一个命令很简单。快速的Google搜索为我提供了FIBMAP用法的示例,它可以满足您的需求。一个优点是它可以在支持该bmap操作的任何文件系统上运行,而不仅仅是ext3。

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


3
hdparm --fibmap /path/to/filename

我不会使用zfs,但会使用ext4,btrfs,(v)fat等

man 8 hdparm

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


1

至少在某些linux机器上...“ ls -s”可能会提供您想要的东西。

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


-s以块为单位显示文件的大小-我需要块号的实际列表。
麦克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.