Nächste: , Vorige: , Nach oben: Systemkonfiguration   [Inhalt][Index]


11.6 Swap-Speicher

Swap-Speicher, wie man ihn oft nennt, ist ein Bereich auf der Platte, wohin Speicherseiten verdrängt werden können. Als Seitenaustausch (englisch „Paging“) bezeichnet man das Verfahren, wie der für die Speicherverwaltung zuständige Prozess (d.h. der Linux-Kernel oder der „Default Pager“ in Hurd) entscheiden kann, manche Speicherseiten aus dem Arbeitsspeicher (RAM), die einem laufenden Prozess zugewiesen sind, ohne gerade benutzt zu werden, stattdessen auf der Platte zu speichern. Dadurch wird Arbeitsspeicher frei, wodurch mehr wertvoller schneller Speicher verfügbar wird; die Daten darin werden in den Swap-Speicher ausgelagert. Wenn das Programm auf eben diese Speicherseite zuzugreifen versucht, lädt der Speicherverwaltungsprozess die Daten zurück in den Speicher, damit das Programm sie benutzen kann.

Häufig begegnet man der falschen Vorstellung, Swap nütze nur dann etwas, wenn das System wenig Arbeitsspeicher zur Verfügung hat. Doch benutzen Kernels oft allen Arbeitsspeicher als Zwischenspeicher für Plattenzugriffe, um Ein- und Ausgaben zu beschleunigen. Deswegen steht durch den Austausch ungenutzter Teile des Arbeitsspeichers mehr RAM für diese Art von Caching zur Verfügung.

Wenn Sie genauer wissen wollen, wie Arbeitsspeicher aus Sicht eines monolithisch aufgebauten Kernels verwaltet wird, siehe Speicherkonzepte in Referenzhandbuch der GNU-C-Bibliothek.

Der Linux-Kernel unterstützt Swap-Partitionen und Swap-Dateien: Erstere reservieren eine ganze Plattenpartition für den Seitenaustausch, wohingegen Zweitere dafür eine Datei aus dem Dateisystem einsetzen (der Dateisystemtreiber muss sie unterstützen). Auf vergleichbaren Systemen haben beide die gleiche Leistung, also sollte man sich für das entscheiden, was es einem leichter macht. Partitionen sind „einfacher“ und brauchen keine Unterstützung durch das Dateisystem, aber man muss sie schon beim Formatieren der Platte zuweisen (außer man nutzt logische Datenträger). Dateien hingegen kann man jederzeit anlegen oder löschen.

Auch ist Swap-Speicher notwendig, damit das System in den Ruhezustand wechseln kann (man spricht auch von Suspend to Disk). Dabei wird der Systemzustand aus dem Arbeitsspeicher in den Swap-Speicher ausgelagert, bevor der Rechner herunterfährt, so dass er beim nächsten Start der Maschine wiederhergestellt werden kann. Der Ruhezustand benötigt höchstens so viel wie die halbe Größe des Arbeitsspeichers als konfigurierter Swap-Speicher. Es ist erforderlich, dass der Linux-Kernel die Information über zur Wiederherstellung zu nutzenden Swap-Speicher schon beim Booten mitgeteilt bekommt (über ein Kernel-Argument). Wenn eine Swap-Datei benutzt wird, muss deren Versatz gegenüber dem sie beinhaltenden Gerät ebenso von vornherein dem Kernel übergeben werden; dieser Wert muss erneuert werden, wenn die Datei als Swap-Speicher neu initialisiert wird, weil z.B. Sie ihre Größe geändert haben.

Vorsicht, Swap-Speicher wird beim Herunterfahren nicht genullt. Sensible Daten (wie Passwörter) können sich darin befinden, wenn deren Speicherseiten verdrängt wurden. Daher sollten Sie in Betracht ziehen, Ihren Swap-Speicher auf ein verschlüsseltes Gerät zu legen (siehe Zugeordnete Geräte).

Datentyp: swap-space

Objekte dieses Typs repräsentieren Swap-Speicher. Sie weisen folgende Komponenten auf:

target

Welches Gerät oder welche Datei verwendet werden soll, angegeben entweder über die UUID, über ein file-system-label-Objekt mit der Bezeichnung oder über eine Zeichenkette wie in der Definition eines file-system-Objekts für ein Dateisystem (siehe Dateisysteme).

dependencies (Vorgabe: '())

Eine Liste von file-system-Objekten oder mapped-device-Objekten, die vorausgesetzt werden, damit der Speicher verfügbar ist. Achtung: Genau wie bei file-system-Objekten gilt auch für die Abhängigkeiten im dependencies-Feld, dass zum Hochfahren des Systems notwendige Abhängigkeiten, die beim Start der Anwendungsebene („User Space“) eingebunden werden, nicht durch Shepherd verwaltet werden, sondern weggefiltert werden.

priority (Vorgabe: #f)

Wird nur beim Linux-Kernel unterstützt. Entweder #f, damit keine Priorität festgelegt wird, oder eine ganze Zahl zwischen 0 und 32767. Der Kernel wird erst den Swap-Speicher mit der höheren Priorität für den Seitenaustausch benutzen und bei gleicher Priorität im Rundlauf wechseln („Round-Robin-Verfahren“). Swap-Speicher ohne festgelegte Priorität wird später als priorisierter verwendet, in der angegebenen Reihenfolge ohne Round Robin.

discard? (Vorgabe: #f)

Wird nur beim Linux-Kernel unterstützt. Wenn es wahr ist, benachrichtigt der Kernel die Steuereinheit (Controller) der Platte, welche Seiten verworfen wurden, zum Beispiel mit der TRIM-Operation auf SSD-Speicher.

Hier sind einige Beispiele:

(swap-space (target (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))

Die Swap-Partition mit der angegebenen UUID verwenden. Sie können die UUID einer Linux-Swap-Partition erfahren, indem Sie swaplabel Gerät ausführen, wobei Gerät der Dateiname unter /dev für die Partition ist.

(swap-space
  (target (file-system-label "swap"))
  (dependencies mapped-devices))

Die Swap-Partition mit der Bezeichnung swap verwenden. Die Bezeichnung können Sie finden, nachdem all die zugeordneten Geräte aus mapped-devices geöffnet wurden. Auch hier können Sie mittels swaplabel-Befehls die Bezeichnung einer Linux-Swap-Partition einsehen und ändern.

Nun folgt ein anspruchsvolleres Beispiel. Sie sehen auch den entsprechenden Teil zu file-systems aus der Deklaration eines operating-system.

(file-systems
  (list (file-system
          (device (file-system-label "root"))
          (mount-point "/")
          (type "ext4"))
        (file-system
          (device (file-system-label "btrfs"))
          (mount-point "/btrfs")
          (type "btrfs"))))

(swap-devices
  (list
    (swap-space
      (target "/btrfs/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/btrfs")
                            file-systems)))))

Die Datei /btrfs/swapfile als Swap-Speicher benutzen, die abhängig ist von dem als /btrfs eingebundenen Dateisystem. Sie sehen, wie wir mit Guiles filter-Prozedur das Dateisystem auf elegante Weise auswählen!

(swap-devices
  (list
    (swap-space
      (target "/dev/mapper/my-swap")
      (dependencies mapped-devices))))

(kernel-arguments
  (cons* "resume=/dev/mapper/my-swap"
         %default-kernel-arguments))

Obiges Schnipsel im operating-system einer Betriebssystemdeklaration aktiviert das zugeordnete Gerät /dev/mapper/my-swap (was aus einem verschlüsselten Gerät kommen kann) als Swap-Speicher und teilt dem Kernel über das Kernel-Argument resume mit, dass es für den Ruhezustand benutzt werden soll (siehe operating-system-Referenz, kernel-arguments).

(swap-devices
  (list
    (swap-space
      (target "/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/")
                            file-systems)))))

(kernel-arguments
  (cons* "resume=/dev/sda3"        ;Gerät, das /swapfile enthält
         "resume_offset=92514304"  ;Versatz, den /swapfile darauf hat
         %default-kernel-arguments))

Das zweite Schnipsel eines operating-system zeigt, wie man die Swap-Datei /swapfile für den Ruhezustand benutzen kann, indem dem Kernel die Partition, auf der sie liegt, (im resume-Argument) und ihr Versatz auf dieser Partition (im resume_offset-Argument) mitgeteilt werden. Letzteren Wert können Sie der Ausgabe des Befehls filefrag -e entnehmen; er ist die erste Zahl, die gleich unter dem Spaltenkopf physical_offset steht (mit dem zweiten Befehl wird der Wert direkt ausgelesen):

$ sudo filefrag -e /swapfile
Filesystem type is: ef53
File size of /swapfile is 2463842304 (601524 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    2047:   92514304..  92516351:   2048:
…
$ sudo filefrag -e /swapfile | grep '^ *0:' | cut -d: -f3 | cut -d. -f1
   92514304

Nächste: Benutzerkonten, Vorige: Zugeordnete Geräte, Nach oben: Systemkonfiguration   [Inhalt][Index]