我可以包含循环模块来支持循环文件。 Loop 模块支持 max_loop 选项。我找到了带有选项循环 max_loop 256 的示例。我的问题是,最大支持的循环设备是多少?我不敢相信,256 个是硬限制,创建超过 256 个循环设备是不可能的。
更新:
我在文件中没有发现任何有趣的内容https://elixir.bootlin.com/linux/v4.0/source/drivers/block/loop.c
但我做了一些实验,并运行 modprobe max_loops=512 然后我在 /dev/ 目录中看到完全相同的计数循环块文件安装为 udev,编号从loop0到loop511
我用 linux 内核 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 做到了
答案1
在内核 3.1 之前,您必须设置固定数量的循环设备。从 3.1 开始,有/dev/loop-control
, 和 循环设备根据需要动态分配,而不是固定数量。因此,它不是从不需要的 100 个循环设备(以防万一)开始,而是从 0 个设备(或可选的最小计数)开始,并且仅在实际需要时创建它们。
/dev/loop-control
Since Linux 3.1, the kernel provides the /dev/loop-control device,
which permits an application to dynamically find a free device, and to
add and remove loop devices from the system.
非常好的源代码(drivers/block/loop.c
)描述它:
/*
* If max_loop is specified, create that many devices upfront.
* This also becomes a hard limit. If max_loop is not specified,
* create CONFIG_BLK_DEV_LOOP_MIN_COUNT loop devices at module
* init time. Loop devices can be requested on-demand with the
* /dev/loop-control interface, or be instantiated by accessing
* a 'dead' device node.
*/
它也是建议根本不要设置:
* Note: Global-for-all-devices, set-only-at-init, read-only module
* parameteters like 'max_loop' and 'max_part' make things needlessly
* complicated, are too static, inflexible and may surprise
* userspace tools. Parameters like this in general should be avoided.
那么实际可以使用多少个循环设备呢?该限制是单个主要设备的次要设备的最大数量(因为loop
有一个主要设备,块 7),其限制为MINORBITS
(所以 2 20,刚刚超过一百万)。
我试图强制一些像这样的大数字:
truncate -s 1M foobar
i=1
while losetup --show /dev/loop$(($i-1)) foobar
do
i=$(($i*2))
done
...但最终引发了内核恐慌。 ;-)
sysfs: cannot create duplicate filename '/devices/virtual/bdi/7:1048575'
kobject_add_internal failed for 7:1048575 with -EEXIST, don't try to register things with the same name in the same directory.
这符合 2 20限制。