ash*_*hok 6 filesystems inode files
如果不创建文件,我可以使用任何免费的 inode 吗?我想编写一个脚本,该脚本将使用系统中所有空闲的 inode。是否可以?
ter*_*don 10
此脚本将创建与文件/
系统上可用的 inode 一样多的文件:
while [ $(df --output=iavail / | tail -n1) -gt 0 ]; do
touch $((i++));
done
Run Code Online (Sandbox Code Playgroud)
据我所知,不使用文件或目录就无法占用 inode,毕竟这就是它们的用途。脚本完成后,inode 将继续使用的节点。您必须删除创建的文件才能释放它们。
是的,您可以使用系统的所有 inode。它们是有限的资源,就像磁盘空间一样mkfs.ext4
,例如,当您执行.
您可以使用诸如tune2fs -l <device>
或 之类的工具df -i <path>
来查看已分配和使用的数量。
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355850 2920950 11% /
Run Code Online (Sandbox Code Playgroud)
所以这个文件系统有 2920950 个空闲的 inode。如果我开始在文件系统上创建文件、目录或链接,那么我需要做的就是全部使用它们。意识到我可以使用小文件或链接来使用所有这些 inode,并且仍然可以使用大致所有的磁盘空间。
我不确定你在这里得到了什么,但我知道你可以使用 inode 的唯一方法是创建文件、目录或链接。我不熟悉任何其他方式来消费它们。
在这里您可以看到,当我创建一个空目录时,我正在消耗 1 个 inode。
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355850 2920950 11% /
$ sudo mkdir /somedir
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355851 2920949 11% /
Run Code Online (Sandbox Code Playgroud)
使用 inode 的最简单方法可能是创建目录的目录树。
$ sudo mkdir /somedir/1
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355852 2920948 11% /
$ sudo mkdir /somedir/2
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355853 2920947 11% /
$ sudo mkdir /somedir/3
$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora-root 3276800 355854 2920946 11% /
Run Code Online (Sandbox Code Playgroud)
这是另一个示例,我通过使用ln
同一个文件创建多个链接来消耗 inode 。
$ ln -s afile ln1
$ df -i .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora_greeneggs-home 26722304 1153662 25568642 5% /home
$ ln -s afile ln2
$ df -i .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora_greeneggs-home 26722304 1153663 25568641 5% /home
$ ln -s afile ln3
$ df -i .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/fedora_greeneggs-home 26722304 1153664 25568640 5% /home
Run Code Online (Sandbox Code Playgroud)
文件是inode。
但是,您可以创建未链接到任何目录但仍使用 inode 的文件。例如:
zsh -c 'repeat 1000 ((repeat 1000 {exec {fd}> file; rm file}
exec sleep 1000 >&-) | cat)'
Run Code Online (Sandbox Code Playgroud)
将(最终)用完 1,000,000 个 inode。这些 inode 将是尚未回收的已删除文件,因为这些sleep
进程已打开它们。
您可以通过这种方式创建的文件数量受您可以生成的进程数量以及每个进程可以打开的最大文件数量的限制。