Как создать заменяемое блочное устройство в памяти в 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-диска в пользовательском пространстве упрощает настройку и настройку. Вы даже можете реализовать дедупликацию, если это принесет пользу вашей рабочей нагрузке. (Текущая реализация не выполняет дедупликацию).