Linux カーネルの最大ループ デバイス数はいくつですか?

Linux カーネルの最大ループ デバイス数はいくつですか?

ループ ファイルをサポートするために、ループ モジュールを含めることができます。ループ モジュールは max_loop オプションをサポートしています。オプション loop max_loop 256 の例を見つけました。質問ですが、サポートされる最大ループ デバイスは何ですか? 信じられません。256 はハード リミットであり、256 を超えるループ デバイスを作成することは不可能です。

アップデート:

ファイルには何も面白いものは見つかりませんでしたhttps://elixir.bootlin.com/linux/v4.0/source/drivers/block/loop.c

しかし、いくつか実験をして、modprobe max_loops=512 を実行すると、udev としてマウントされた /dev/ ディレクトリに 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 個のデバイス (またはオプションの最小数) で開始し、実際に必要な場合にのみデバイスを作成します。

から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.

では、現実的にループデバイスはいくつ使用できるでしょうか? 制限は、1つのメジャーデバイス(loopブロック7が1つだけあるため)に対するマイナーデバイスの最大数であり、次の数によって制限されます。MINORBITS(つまり 2 20、ちょうど 100 万を超えます)。

次のように大きな数字を強制してみました。

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 の制限に一致します。

関連情報