Warum ist die Verwendung einer Auslagerungsdatei über ein SMB/NFS-gemountetes Dateisystem unter Linux nicht möglich?

Warum ist die Verwendung einer Auslagerungsdatei über ein SMB/NFS-gemountetes Dateisystem unter Linux nicht möglich?

Ich möchte den ungenutzten RAM einer anderen Maschine als Swapspace für meine primäre Linux-Installation verwenden. Ich war nur neugierig auf die Leistung von Netzwerk-Ramdisks im Vergleich zu lokalen (langsamen) mechanischen Festplatten.

Die Auslagerungsdatei befindet sich auf einem tmpfsEinhängepunkt und wird über freigegeben samba. Allerdings wird bei jedem Versuch Folgendes ausgegeben:

swapon /mnt/ramswap/swapfile

Ich bekomme:

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

und darin dmesglas ich:

[ 9569.806483] swapon: swapfile has holes

dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)Ich habe versucht, die Auslagerungsdatei mit und mit truncate -s 2G(beide gefolgt von ) zuzuordnen, mkswap swapfileaber das Ergebnis ist immer dasselbe.

Indieser Beitrag(aus dem Jahr 2002) Jemand sagt, dass die Verwendung einer Auslagerungsdatei über NFS/SMB unter Linux nicht möglich ist. Ist diese Aussage noch gültig? Und wenn ja, was ist der Grund für diese Wahl und gibt es eine Problemumgehung, damit dies funktioniert?

Antwort1

Ich weiß, dass dieser Thread mittlerweile etwas älter ist, aber ich bin gerade auf dieses Problem gestoßen und habe Folgendes herausgefunden: Es ist möglich, eine NFS-Swap-Partition zu verwenden, indem man das Kernel-Loopback-Gerät nutzt:

Erstellen Sie eine leere Datei (füllen Sie sie mit Nullen aus /dev/zero auf):

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

Erstellen Sie ein Loop-Gerät:

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

Tauschfähig machen:

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

Jetzt nutzen:

root@machine:/# swapon /dev/loop0

Machen Sie die Änderung dauerhaft

Schreiben Sie ein Skript, um diesen Austausch dauerhaft zu machen. /etc/init.d/swap könnte beispielsweise so aussehen:

#!/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

Machen Sie die Datei ausführbar:

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

Aktivieren Sie es:

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

Quelle:http://www.emanuelis.eu/2010/06/21/how-to-swap-to-nfs-mount/

Antwort2

Um die Manpage zu zitieren ...

Dies liegt daran, dass die Implementierung der Auslagerungsdatei im Kernel davon ausgeht, dass direkt und ohne Unterstützung des Dateisystems in die Datei geschrieben werden kann.

Da es nicht möglich ist, direkt auf ein NFS-Mount zu schreiben, ohne den Umweg über das Dateisystem zu nehmen, erhalten Sie diese etwas verwirrende Fehlermeldung.

Wie @MattH bemerkte, können Sie hierfür möglicherweise iSCSI verwenden, aber die eigentliche Frage ist, ob sich das überhaupt lohnt. RAM ist schließlich ziemlich günstig.

Antwort3

Wenn Sie es so machen könnten, wie Sie es beschreiben, sollte ich darauf hinweisen, dass Sie nicht den ungenutzten RAM eines anderen Rechners verwenden. Auslagerungsdateien sind eine dateibasierte Sicherung für lokalen, schnelleren RAM. Sie würden den Festplattenspeicher des anderen Rechners belegen.

Das geht nicht, weil Linux einen speziellen Partitionstyp für Swap hat. Dieser muss sich auf einem lokalen Laufwerk befinden, nicht auf einer Netzwerkfreigabe. Windows macht das nicht so, es verwendet einfach eine Datei auf einem vorhandenen Dateisystem. Wenn ich mich richtig erinnere, muss sich diese Datei auch auf einem lokalen Laufwerk befinden. Sie kann sich also nicht auf NFS oder SMB befinden.

Ich denke jedoch, dass Sie es möglicherweise mit iSCSI schaffen. Wenn Sie ein iSCSI-Ziel lokal mounten und darin einen Swap bereitstellen, könnte es funktionieren. Ist das eine gute Idee? Nein. Ich halte es aus Leistungs- und Zuverlässigkeitsgründen für eine schreckliche Idee. Höchstwahrscheinlich friert Linux ein, wenn das Netzwerk ausfällt und es auf die Swap-Partition zugreifen muss. Mit AoE sollten Sie eine bessere Leistung erzielen. Aber noch einmal: Ein Problem mit dem Netzwerk oder der anderen Maschine und Sie werden eine holprige Fahrt haben.

Kaufen Sie einfach mehr RAM, oder, wenn nicht mehr hineinpasst, besorgen Sie sich eine SSD und erstellen Sie darauf eine Swap-Partition.

EDIT: Ok, das könntest du machen. Es wird zwar immer noch nicht empfohlen, aber theoretisch ist es eine Möglichkeit, es zu erreichen.

  1. Erstellen Sie ein tmpfs oder ramfs auf dem Remote-Host.
  2. Formatieren Sie das TMPFS oder RAMFS als ext4.
  3. Erstellen Sie darauf eine Raw-Disk-Image-Datei. (dd oder truncate reichen aus)
  4. Exportieren Sie das Disk-Image mit iscsi oder AoE.
  5. Verbinden Sie das Ziel auf Ihrem lokalen Linux-PC. Erstellen Sie dann den Swap auf dem Ziel mit mkswap.
  6. Dann tauschen Sie es aus.

Viel Glück!

Antwort4

Ich teile den RAM einer anderen Maschine über einen Swap über NBD

Host-Server

Richten Sie RAMFS ein (falls erforderlich, andernfalls fahren Sie einfach mit nbd fort)

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

Konfigurationsdatei /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

Starten Sie am nächsten Arbeitstag

sudo systemctl start nbd

Klient

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

verwandte Informationen