Почему использование файла подкачки через смонтированную файловую систему 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 и создайте на нем раздел подкачки.
РЕДАКТИРОВАТЬ: Хорошо, вы могли бы сделать это. Все еще не рекомендуется, но это один из способов достичь этого в теории.
- Создайте tmpfs или ramfs на удаленном хосте.
- Отформатируйте tmpfs или ramfs как ext4.
- Создайте на нем сырой файл образа диска. (дд или усеченный сделает это)
- Экспортируйте образ диска с помощью iscsi или AoE.
- На вашем локальном ПК с Linux подключите цель. Затем создайте обмен на цели с помощью mkswap.
- Тогда поменяй местами.
Удачи!
Я делюсь оперативной памятью другой машины через своп через 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