如何在目录中创建文件以将 inode 分配给具有非连续 inode 编号的文件?

如何在目录中创建文件以将 inode 分配给具有非连续 inode 编号的文件?

我在 Dir 目录上安装了一个 ext4 文件系统,并调整了一些目录读取代码,这需要目录 inode 中的文件具有非连续 inode 编号才能进行测试。当我使用 shell 脚本创建文件时,它将 inode 分配给具有连续 inode 编号的文件。因为对于同时创建的文件来说,inode是从inode freelist中顺序分配的,inode freelist一般都是顺序有inode编号的。我使用以下 shell 脚本在 Dir 中创建文件,

#! /bin/bash
for n in {1..1000}; do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
done

ls -i Dir 给出以下 o/p

567 file001.bin  
568 file002.bin
569 file002.bin  
570 file004.bin  
571 file005.bin  
572 file006.bin 
573 file007.bin  
574 file008.bin
575 file009.bin
576 file010.bin
..

如何使这些文件具有不连续的索引节点?

答案1

一种简单的方法是在每个文件之前创建一堆临时文件.bin

function randomFiles() {
    for (( i=1; i<=$[$RANDOM%$1+1]; i++ ))
    do
            mktemp -q --tmpdir=.
    done
}

for n in {1..1000}; do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
    randomFiles 10
done

rm -f tmp.*

这将在每个.bin文件后创建 1 到 10 个临时文件,并将下一个 inode 编号向前移动。

答案2

只需随机化您创建它们的顺序:

#! /bin/bash
for n in $(seq 1 1000 | sort -R); do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
done

答案3

一劳永逸地创建一个测试文件系统映像。如有必要,请使用文件系统调试器来获取所需的索引节点号。要执行测试,请复制映像并安装它。

您可以使用保险丝filesystem 来挂载文件系统映像而不需要 root 权限。 ext4 没有 FUSE 实现,但有一个外部2, 一个用于兹夫斯, ETC。

相关内容