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

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

Файл подкачки находится на 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. Это утверждение все еще в силе? И если да, то какова причина этого выбора и есть ли обходной путь, чтобы это работало?

4 ответа

Решение

Цитировать справочную страницу...

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

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

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

Я знаю, что это немного старый поток, но я только что столкнулся с этой проблемой и обнаружил, что можно использовать раздел подкачки 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/

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

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, вы могли бы сделать это. Все еще не рекомендуется, но это один из способов достичь этого в теории.

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

Удачи!

Я делюсь оперативной памятью другой машины через своп через 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
Другие вопросы по тегам