![каково максимальное количество циклических устройств для ядра Linux?](https://rvso.com/image/164715/%D0%BA%D0%B0%D0%BA%D0%BE%D0%B2%D0%BE%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85%20%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%8F%D0%B4%D1%80%D0%B0%20Linux%3F.png)
я могу включить модуль loop для поддержки файлов loop. Модуль loop поддерживает опцию max_loop. Я нашел примеры с опциями loop max_loop 256. Мой вопрос, каково максимальное количество поддерживаемых устройств loop? Я не могу поверить, 256 — это жесткий предел, и создание более 256 устройств loop невозможно.
Обновлять:
Я не нашел ничего интересного в файле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
, и устройства цикла выделяются динамически по мере необходимости, а не фиксированное количество. Таким образом, вместо того, чтобы иметь сотню устройств цикла, которые вам никогда не понадобятся (на всякий случай), он начинается с 0 устройств (или необязательного минимального количества) и создает их только тогда, когда это действительно необходимо.
Отman 4 loop
:
/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 можно использовать в реальности? Предел — это максимальное количество второстепенных устройств для одного главного устройства (поскольку 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 .