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

5882
Avio

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

2
Я вижу, что это делает вашу систему крайне, крайне нестабильной. Малейшее сообщение в сети может привести к сбою критически важных для системы процессов, если их части будут выгружены. Не говоря уже о том, что любой, кто может взломать ваш Wi-Fi, потенциально может прочитать любую память, которая оказывается выгруженной. Darth Android 11 лет назад 1
Я не использую WiFi, но короткий сетевой кабель, который соединяет две карты Ethernet Gbps. Куча OSI имеет несколько полей контрольных сумм, наложенных друг на друга, которых должно быть достаточно для предотвращения большинства сбоев и повреждений. На данный момент я хотел бы просто знать _if и как это возможно_. Я буду думать о стабильности и последствиях безопасности позже. Avio 11 лет назад 2
Попробуйте это: http://www.raspberrypi.org/forums/viewtopic.php?f=29&t=7720 CMCDragonkai 9 лет назад 1

3 ответа на вопрос

6
user3767547

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

Как это в сети? Там нет упоминания о какой-либо сети. Ken Sharp 7 лет назад 0
3
Michael Hampton

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

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

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

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

Спасибо за объяснение. Говоря таким образом, это имеет смысл, даже если я продолжу видеть в этом ограничение. Я не знаю, стоит ли это того или нет. Но если я не смогу даже попробовать, я никогда не узнаю. Avio 11 лет назад 0
1
Matt H

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

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

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

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

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

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

Удачи!

Возможно, я забыл упомянуть об этом, но этот эксперимент направлен на более рациональное использование существующего оборудования. Насколько я могу понять об iSCSI, это просто слишком дорого для того, что я пытаюсь сделать. И я не буду использовать жесткий диск другой машины, потому что файл подкачки создается внутри точки монтирования `tmpfs`, поэтому он в основном находится внутри ramdrive. Avio 11 лет назад 1
@ Avio В этом нет ничего "рационального" :) Darth Android 11 лет назад 1
Linux дает вам свободу использовать все виды медиа для любых целей: вам решать, стоит ли игра свеч. Теперь скажите мне, почему я могу использовать дискету в качестве пространства подкачки, но я не могу использовать сетевой диск. :П Avio 11 лет назад 1
iscsi не дорогой, есть целевое программное обеспечение, которое так же открыто, как и сам linux. Matt H 11 лет назад 0
Таким образом, теоретически, по крайней мере, да, вы можете достичь этого с AoE или iSCSI. Вы можете экспортировать tmpfs или ramfs. Matt H 11 лет назад 0
@avio: Черт возьми, я использовал дискету для обмена. Darn RedHat 5 требовалось устройство подкачки, или оно отказывалось устанавливать. Его установщик казался полностью совместимым с Windows Clippy. (У меня был выделенный диск для подкачки, который все еще находился вне сервера и загружался с резервными копиями во время установки. Так что это действительно имело смысл). Hennes 11 лет назад 0
Ну, это интересная идея. Стоит попробовать. Я с нетерпением жду того дня, когда стандарт RDMA станет стандартным, и мы сможем надежно использовать другие машины без использования оперативной памяти. По идее ... почему нет? Matt H 11 лет назад 1

Похожие вопросы