Какое максимальное количество устройств loop для ядра Linux?

Вопрос или проблема

Я могу включить модуль 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
и тогда я увидел точно такое же количество loop-блоков в директории /dev/, смонтированных как udev, пронумерованных от loop0 до loop511

Я делал это на ядре Linux 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64

До ядра 3.1 вам нужно было устанавливать фиксированное количество loop-устройств. Начиная с 3.1, появился /dev/loop-control, и loop-устройства выделяются динамически по мере необходимости, а не в фиксированном количестве. Таким образом, вместо того, чтобы иметь сотню loop-устройств, которые вам никогда не нужны (на всякий случай), начинается с 0 устройств (или с минимального количества по желанию) и создается только при фактической необходимости.

Из man 4 loop:

/dev/loop-control
    Начиная с Linux 3.1, ядро предоставляет устройство /dev/loop-control,
    которое позволяет приложению динамически находить свободное устройство и
    добавлять и удалять loop-устройства из системы.

Очень хороший исходный код (drivers/block/loop.c) описывает это:

    /*
     * Если max_loop задан, создайте столько устройств заранее.
     * Это также становится жестким пределом. Если max_loop не задан,
     * создайте CONFIG_BLK_DEV_LOOP_MIN_COUNT loop-устройств во время
     * инициализации модуля. Loop-устройства могут запрашиваться по мере необходимости через
     * интерфейс /dev/loop-control или создаваться путем доступа
     * к 'мертвой' узловой точке устройства.
     */

Кроме того, рекомендуется вообще не устанавливать этот параметр:

     * Примечание: Глобальные параметры для всех устройств, которые устанавливаются только при инициализации, параметры модуля только для чтения
     * такие как 'max_loop' и 'max_part' делают вещи ненужным образом
     * сложными, слишком статичными, не гибкими и могут удивить
     * инструменты пользовательского пространства. Параметров такого типа в общем следует избегать.

Сколько loop-устройств можно использовать на практике? Предел — это максимальное количество младших устройств для одного старшего устройства (поскольку loop имеет один старший, блок 7), который ограничен MINORBITS (то есть 220, чуть больше миллиона).

Я пытался заставить работать большие числа, вот так:

truncate -s 1M foobar
i=1
while losetup --show /dev/loop$(($i-1)) foobar
do
    i=$(($i*2))
done

…но в итоге это вызвало панику ядра. 😉

sysfs: не удается создать дублирующее имя файла '/devices/virtual/bdi/7:1048575'
kobject_add_internal не удался для 7:1048575 с -EEXIST, не пытайтесь регистрировать вещи с одним и тем же именем в одной директории.

Это соответствует пределу 220.

Ответ или решение

Максимальное количество устройств loop для ядра Linux зависит от версии ядра и настройки модуля loop. Давайте рассмотрим это более подробно.

Исторический контекст

До версии ядра 3.1 количество устройств loop было фиксированным, и при загрузке модуля loop вы устанавливали максимальное количество устройств с помощью параметра max_loop. Например, вы могли указать options loop max_loop=256, и система создаст 256 устройств loop. Однако это было статическое ограничение, которое не позволяло динамически выделять устройства по мере необходимости.

Динамическое выделение устройств

С версии ядра 3.1 в ядре Linux появилась возможность динамического выделения устройств loop через интерфейс /dev/loop-control. Это изменило подход к управлению устройствами loop. Теперь устройства создаются по мере их необходимости, что позволяет избежать избыточного потребления ресурсов.

Согласно документации man 4 loop, интерфейс /dev/loop-control позволяет приложению находить свободные устройства и добавлять или удалять устройства loop из системы.

Ограничения на устройства loop

При запуске модуля loop, если не задан параметр max_loop, создается минимальное количество устройств, определенное настройкой CONFIG_BLK_DEV_LOOP_MIN_COUNT в момент инициализации модуля. Однако, если вы установите max_loop, это станет жестким ограничением для создания устройств loop.

Код ядра, отвечающий за создание устройств loop, также говорит о том, что если задан max_loop, это значение становится жестким лимитом. В противном случае устройства могут динамически запрашиваться по мере необходимости.

Реальные ограничения

Максимальное количество устройств loop фактически определяется максимальным количеством минорных устройств для одного мажорного устройства. Для loop устройств, использующих мажорное устройство 7, это ограничение определяется значением MINORBITS, что составляет 2^20 (чуть больше миллиона).

Эксперименты с устройствами loop

Недавние эксперименты показали, что при попытке создать большее количество устройств loop, т.е. при превышении лимита в 2^20, могут возникнуть ошибки и даже сбои ядра. Таким образом, практическое использование устройств loop может значительно варьироваться, но теоретический предел составляет более миллиона устройств.

Заключение

Итак, если вы используете более новые версии ядра (3.1 и выше), вы можете динамически создать множество устройств loop без необходимости задавать жесткий предел. Однако, учитывая ограничения на количество минорных устройств, максимальное количество устройств loop, которое вы можете создать, теоретически превышает миллион, но в практике рекомендуется избегать создания слишком большого количества устройств, чтобы избежать проблем с производительностью и стабильностью системы.

Оцените материал
Добавить комментарий

Капча загружается...