Linux EXT 4:如何列出占用块组的文件?我相信一个文件可以跨越多个块组。给定块组,如何枚举其中包含的所有文件的路径?
发布于 2013-09-13 02:58:33
非常困难。e2fsprogs包有您需要的基本原理,特别是debugfs,它可以用于遍历文件系统,查看块组和文件分配。以下是调试器的stats和区段命令的一些摘录:
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 4磁盘布局路线图会派上用场。
我不禁想知道,如果没有必要的话,你为什么要以这种方式在文件系统中卑躬屈膝,但也许我真的不想知道。
评论时添加了
块组的一个主要设计动机是尽量减少您试图度量的搜索惩罚。也就是说,文件系统通过驱动器将空闲列表、inode表和数据块的元数据分配到块组中,这样,如果只有一个块组和胖文件系统,那么头就不必从边跳到边。我不知道NTFS是旧的胖风格,还是像BSD及其ext后代那样更聪明。
进行比较的一个更可靠的方法是通过驱动器分区。例如,如果您使用外部、中部和内部分区对驱动器进行分区,则可以通过将外部分区复制到内部分区来强制查找。如果您试图使用块组强制这样做,文件系统将“反抗”您的努力,因为它是为了保持本地的驱动器访问。
即使在多个分区的情况下,您也可以期望系统范围的块缓存与设备驱动程序合谋使用电梯算法之类的技巧来延迟对遥远位置的写入。简而言之,您试图打破整个系统的大量优化,所有这些优化都是为了最小化您要测量的确切现象。您可能还会发现,驱动器控制器电子参与到寻求减少游戏,其中大部分将被完全隐藏对你。
你可以打开一个原始设备,通过右边的ioctls强制驱动器完成你想要做的那种未经优化的写作,但是这个实验与真正的性能没有多大关系,所以基本上是无用的。如果你要遇到这样的麻烦,你不妨读读制造商的最大头,从硬件规范中寻找时间,然后忘记测试。或者你可以直接运行DOS。
您的搜索测试可能没有显示任何头部查找效果,因为块缓存通常会读取比您要求的更多,因为您将要求以下几个位。
重申:系统的各个部分都是为了对抗你对你施加寻求惩罚的努力。在这一点上,我会问你的兴趣是理论的还是实际的。如果是理论的话,我想你有你的答案。如果实际可行的话,你将不得不设计一个测试--根据定义--不能代表实际负载。
你到底想问什么问题?请回答一个新的问题,这个问题已经太长了。
https://unix.stackexchange.com/questions/90464
复制相似问题