Почему использование файла подкачки через смонтированную файловую систему SMB/NFS невозможно в Linux?

Почему использование файла подкачки через смонтированную файловую систему SMB/NFS невозможно в Linux?

Я хотел бы использовать неиспользуемую оперативную память другой машины в качестве пространства подкачки для моей основной установки Linux. Мне просто было интересно узнать о производительности сетевых RAM-дисков по сравнению с локальными (медленными) механическими жесткими дисками.

Файл подкачки находится в tmpfsточке монтирования и доступен через samba. Однако каждый раз, когда я пытаюсь выполнить:

swapon /mnt/ramswap/swapfile

Я получил:

swapon: /mnt/ramswap/swapfile: swapon failed: Invalid argument

и в dmesgя прочитал:

[ 9569.806483] swapon: swapfile has holes

Я пробовал выделить файл подкачки с помощью dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)и с помощью truncate -s 2G(оба сопровождались mkswap swapfile), но результат всегда один и тот же.

Вэта почта(датируется 2002 годом) кто-то говорит, что использование файла подкачки через NFS/SMB невозможно в Linux. Это утверждение все еще актуально? И если да, то в чем причина такого выбора и есть ли обходной путь, чтобы это работало?

решение1

Я знаю, что это уже немного старая тема, но я только что столкнулся с этой проблемой и обнаружил, что можно использовать раздел подкачки NFS, используя устройство обратной связи ядра:

Создайте пустой файл (заполните нулями из /dev/zero):

root@machine:/# dd if=/dev/zero of=/swap bs=1024 count=1048576

Сделайте петлевое устройство:

root@machine:/# losetup /dev/loop0 /swap

Сделайте его пригодным для обмена:

root@machine:/# mkswap /dev/loop0
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=931d6e04-78ec-41fd-ab2c-22522ac2711d

Теперь используйте это:

root@machine:/# swapon /dev/loop0

Сделать изменение постоянным

Напишите скрипт, чтобы сделать этот обмен постоянным. /etc/init.d/swap может выглядеть так:

#!/bin/sh

set -e

case "$1" in
start)
losetup /dev/loop0 /swap
swapon /dev/loop0
;;
stop)
swapoff /dev/loop0
losetup -d /dev/loop0
;;
restart)
swapoff /dev/loop0
swapon /dev/loop0
;;
*)
echo "Usage: swap { start | stop | restart }" >&2
exit 1
;;
esac

exit 0

Сделайте файл исполняемым:

root@machine:/# chmod +x /etc/init.d/swap

Включить:

root@machine:/# update-rc.d swap defaults

Источник:http://www.emanuelis.eu/2010/06/21/how-to-swap-to-nfs-mount/

решение2

Процитирую страницу руководства...

Это связано с реализацией файла подкачки в ядре, предполагающей возможность записи в файл напрямую, без помощи файловой системы.

Невозможно напрямую записать данные в смонтированный NFS-файл, минуя файловую систему, поэтому вы получаете это немного запутанное сообщение об ошибке.

Как заметил @MattH, для этого можно использовать iSCSI, но вопрос в том, стоит ли оно того вообще. В конце концов, оперативная память довольно дешева.

решение3

Если бы вы могли сделать это так, как вы описываете, я должен отметить, что вы не используете неиспользуемую оперативную память другой машины. Файлы подкачки — это файловая поддержка для локальной более быстрой оперативной памяти. Вы бы использовали дисковое пространство другой машины.

Вы не можете этого сделать, потому что в Linux есть специальный тип раздела для подкачки, он должен быть на локальном диске, а не на сетевом ресурсе. Windows не делает этого таким образом, он просто использует файл в существующей файловой системе. Если я правильно помню, этот файл также должен быть на локальном диске. Так что он не может быть на NFS или SMB.

Однако я думаю, что вы можете сделать это с помощью iSCSI. Если вы смонтируете iSCSI-цель локально и предоставите в ней раздел подкачки, это может сработать. Хорошая ли это идея? Нет. Я думаю, что это ужасная идея по соображениям производительности и надежности. Скорее всего, Linux зависнет, если сеть выйдет из строя и ему понадобится доступ к разделу подкачки. Вы должны получить лучшую производительность с помощью AoE. Но опять же, одна проблема с сетью или другой машиной, и вас ждет ухабистая дорога.

Просто купите больше оперативной памяти или, если больше не помещается, приобретите SSD и создайте на нем раздел подкачки.

EDIT: Хорошо, вы можете это сделать. Все еще не рекомендуется, но это один из способов добиться этого в теории.

  1. Создайте tmpfs или ramfs на удаленном хосте.
  2. Отформатируйте tmpfs или ramfs как ext4.
  3. Создайте на нем файл образа диска raw (dd или truncate подойдут).
  4. Экспортируйте образ диска с помощью iscsi или AoE.
  5. На локальном компьютере Linux подключите цель. Затем создайте своп на цели с помощью mkswap.
  6. Тогда поменяй местами.

Удачи!

решение4

Я делюсь оперативной памятью другой машины через своп через NBD

хост/сервер

Настройте ramfs (если необходимо, если нет, просто перейдите к nbd)

sudo mkdir /mnt/ram
sudo mount -t tmpfs -o size=16G tmpfs /mnt/ram

Файл конфигурации /etc/nbd-server/config:

[generic]
  user = nbd
  group = nbd
[swap]
  exportname = /mnt/ram/swap
  copyonwrite = false
  prerun = truncate -s 16G /mnt/ram/swap && mkswap /mnt/ram/swap

Начать НБД

sudo systemctl start nbd

клиент

sudo nbd-client 192.168.1.3 -name swap /dev/nbd0
sudo swapon /dev/nbd0

Связанный контент