我在 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