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

Создать виртуальный диск в Linux можно с помощьюmodprobe brd rd_nr=1 rd_size=$SizeInKB(создает несжатый/dev/ram0) или поmodprobe zram && echo $SizeInBytes >| /sys/block/zram0/disksize(создает сжатый/dev/zram0).
Эти типы виртуальных дисков не могут быть выгружены на устройство подкачки и, таким образом, ограничены частью физической памяти.

Чтобы создать заменяемое блочное устройство в памяти, размер которого может превышать физическую память, можно использовать
mkdir -p /run/ramfs && mount -t tmpfs -o size=0 ramfs /run/ramfs && \
truncate --size $SizeInBytes /run/ramfs/ramfs && losetup -f && losetup -f /run/ramfs/ramfs.
Это несжатый файл, но его можно комбинировать сzswapчтобы сжать его (по крайней мере, некоторую его часть в памяти).
Но это связано с накладными расходамиtmpfsфайловая система и устройство обратной связи.

Есть ли лучший способ создать блочное устройство в памяти с возможностью выгрузки/замены (возможно, сжатое), которое позволяет избежать накладных расходов файловой системы ниже уровня блока?

1 ответ

Способ сделать это (не уверен, что он лучше описанного вами метода) — использовать этот написанный мной RAM-диск на базе NBD . Вы бы использовали это так:

      $ nbdkit -U /tmp/sock memory 10G
# nbd-client -unix /tmp/sock /dev/nbd0

Этот RAM-диск хранится в виде разреженного массива, поэтому его размер может быть любым — до 8 эксабайт. Если вы добавите allocator=zstd в командную строку, он будет сжат.

В этом определенно есть плюсы и минусы. Накладных расходов будет немного больше, хотя производительность довольно хороша для обычных рабочих нагрузок. Наличие реализации RAM-диска в пользовательском пространстве упрощает настройку и настройку. Вы даже можете реализовать дедупликацию, если это принесет пользу вашей рабочей нагрузке. (Текущая реализация не выполняет дедупликацию).

Другие вопросы по тегам