据我了解,类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 等上工作
--fibmap
使用时,这必须是给出的唯一标志。它需要文件路径作为参数,并将打印出该文件在磁盘上占用的设备范围(扇区范围)列表。扇区号以绝对 LBA 号给出,从物理设备的扇区 0 开始引用(不是分区或文件系统)。这些信息可用于多种用途,例如检查较大文件的碎片程度,或确定在故障注入测试过程中故意破坏的适当扇区。
答案3
debugfs
获取块列表的一个简单方法是使用ioctl (无需像答案中那样从分区读取) FIBMAP
。我不知道有什么命令可以这样做,但编写一个命令非常简单;快速的谷歌搜索给了我FIBMAP 使用示例,它完全符合您的要求。一个优点是它可以在任何支持该bmap
操作的文件系统上运行,而不仅仅是 ext3。
一种较新的(且更有效的)替代方案是FIEMAP
ioctl,它还可以返回有关范围的详细信息(对 ext4 有用)。
答案4
至少在某些 Linux 机器上……“ls -s”可能会提供您正在寻找的内容。
编辑:我的错,我看到您正在寻找块本身的列表,而不是块的数量。