Linux EXT 4:如何列出占用块组的文件?我相信一个文件可以跨越多个块组。给定一个块组,我如何枚举其中包含的所有文件的路径?
答案1
好容易。这e2fsprogs软件包具有您需要的基础知识,特别debugfs
是可用于遍历文件系统并查看块组和文件分配的基础知识。以下是 debugfs 的 stats 和extent 命令的一些摘录:
debugfs: stats
Group 0: block bitmap at 64, inode bitmap at 80, inode table at 96
28663 free blocks, 5777 free inodes, 3 used directories, 5777 unused inodes
[Checksum 0xe713]
Group 1: block bitmap at 65, inode bitmap at 81, inode table at 596
0 free blocks, 8000 free inodes, 0 used directories, 8000 unused inodes
[Inode not init, Checksum 0x9416]
Group 2: block bitmap at 66, inode bitmap at 82, inode table at 1096
0 free blocks, 8000 free inodes, 0 used directories, 8000 unused inodes
…
debugfs: extents bigfile
Level Entries Logical Physical Length Flags
0/ 1 1/ 1 0 - 62499 120569 62500
1/ 1 1/ 6 0 - 12287 133120 - 145407 12288
1/ 1 2/ 6 12288 - 12499 131524 - 131735 212
1/ 1 3/ 6 12500 - 24575 145408 - 157483 12076
1/ 1 4/ 6 24576 - 24999 131736 - 132159 424
1/ 1 5/ 6 25000 - 30719 157484 - 163203 5720
1/ 1 6/ 6 30720 - 62499 165888 - 197667 31780
这样您就可以拼凑出您想要的信息,尽管ext4磁盘布局路线图会派上用场的。
我不禁想知道,如果不需要的话,为什么你可能想以这种方式卑躬屈膝地浏览文件系统,但也许我真的不想知道。
添加以回复评论:
块组的一个重要设计动机是最小化您试图测量的搜索惩罚。也就是说,文件系统将空闲列表、索引节点表和数据块的元数据分布到驱动器上的块组中,这样磁头就不必像只有一个磁头那样从一个边缘跳到另一个边缘。与 FAT 文件系统一样的块组。我不知道 NTFS 是否采用旧的 FAT 风格,或者像 BSD-FFS 及其 ext 后代那样更智能。
进行您寻求的比较的更可靠的方法是通过驱动器分区。例如,如果您将驱动器分区为外部、中间和内部分区,则可以通过从外部分区复制到内部分区来强制搜索。如果您尝试使用块组来强制执行此操作,文件系统将“对抗”您的努力,因为它旨在将驱动器访问保持在本地。
即使在多个分区的情况下,您也可以期望系统范围的块缓存与设备驱动程序协同使用以下技巧来延迟对较远位置的写入:电梯算法。简而言之,您正试图打破整个系统中的大量优化,所有这些优化都是为了最小化您试图测量的确切现象而设计的。您可能还会发现驱动控制器电子设备参与了寻道减少游戏,其中大部分对您来说是完全隐藏的。
您可以打开一个原始设备,并通过正确的 ioctl 强制驱动器执行您尝试执行的那种未优化的写入操作,但该实验与实际性能关系不大,几乎毫无用处。如果您遇到这个麻烦,您不妨从硬件规格中阅读制造商的最大磁头寻道时间,而忘记测试。或者你也可以只运行 DOS。
对评论的第二次回复:
您的 fseek 测试可能没有显示任何头部搜索效果,因为块缓存通常会读取比您要求的更多的内容,预计您很快就会要求以下位。
重申一下:系统的各个部分都是为了对抗你对你施加搜索惩罚的努力而设计的。此时,我会问您的兴趣是理论还是实践。如果是理论上的,我想你已经有了答案。如果可行的话,您将不得不设计一个测试,根据定义,该测试不能代表实际负载。
您真正寻求什么问题的答案?请提出一个新问题;这已经太久了。