Wie kann ich die / swap-Datei auf Null setzen, ohne zu löschen, was sie zu einer Swap-Datei macht?

8

Ich habe ein Skript, das ich ausführe, um den Speicherplatz vor dem Sichern eines virtuellen Gasts zu optimieren (es spielt wirklich keine Rolle, welcher Hypervisor verwendet wird).

Moderne Ubuntu-Versionen (z. B. 18.04) scheinen standardmäßig /swapfileeher eine als eine Partition für diesen Zweck zu verwenden. Das ist auch gut so.

Ich möchte jedoch die Auslagerungsdatei zusammen mit der Stammpartition, die sie enthält, auf Null setzen.

Bei Swap- Partitionen war dies relativ schmerzlos, da es immer eine Möglichkeit gab, das vorhandene $UUIDaus der Swap-Partition zu extrahieren und - nach dem Nullen der Partition - auszuführen mkswap -U $UUID, um die Swap-Partition neu zu erstellen.

Allerdings /swapfilesehe ich mit dem nicht, wie das geht. Obwohl mir klar ist, dass Sie eine /swapfileUUID nicht einbinden können /etc/fstab, möchte ich die UUID trotzdem beibehalten.

Ich denke, ich brauche eine der folgenden Möglichkeiten, um fortzufahren:

  1. Ich benötige eine Methode, mit der die Auslagerungsdatei auf Null gesetzt werden kann, ohne auch die Strukturen zu löschen, die sie zu einer Auslagerungspartition machen (dh vermeiden, dass sie ausgeführt werden muss mkswap -U $UUID).
  2. Ich brauche eine Methode , um die bestehenden UUID aus einem Swap abzurufen Datei (im Gegensatz zu einer Partition Gegensatz , wo ich etwas von verwenden kann , blkidzu betrachten /dev/disk/by-uuid/$UUID...)
0xC0000022L
quelle

Antworten:

15
  1. Dadurch wird die Auslagerungsdatei nicht so gründlich gelöscht wie beim erneuten Erstellen. Wenn Sie sie jedoch nach dem Überspringen der ersten 4 KB (genau genommen der ersten Seite, die von Ihrer Architektur abhängt) löschen, berühren Sie keine der Strukturen die eine Auslagerungsdatei identifizieren.

  2. blkid funktioniert auch gut bei Swap-Dateien:

    $ mkswap swap
    Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
    no label, UUID=7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc
    
    $ blkid swap
    swap: UUID="7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc" TYPE="swap"
    

Das Header-Format wird im Kernel definiert : Das alte Format hat einen magischen Wert am Ende der ersten Seite, das neue Format kombiniert diesen mit einem freien Bereich von 1 KB, dann einer Reihe von Feldern (Version, Größe, fehlerhafte Seiten, UUID, Etikett), die alle bequem in die erste Seite passen.

Stephen Kitt
quelle
Wow, zweifellos die schnellste Antwort, die ich jemals auf einer StackExchange-Site erhalten habe. Vielen Dank. Ich habe ehrlich gesagt nie blkidmit einem Parameter verwendet. Ich denke, ich sollte das tun, anstatt zum Beispiel ddmit einem Offset zu arbeiten.
0xC0000022L
3
Richtig, das Lesen der UUID und das Neuerstellen der Auslagerungsdatei ist wahrscheinlich die einfachere Option.
Stephen Kitt
@ 0xC0000022L untersucht auch die Ausgabeformatoptionen von blkid. Abhängig von der Version können Sie möglicherweise blkid swap -o value -s uuidnur die UUID extrahieren.
Muru
@muru danke, habe es bereits getan und mich dafür entschieden, dass blkid -o export <file>ich sedes durchpfeife, local um jeder Zeile voran zu stellen und dann evalBash zu verwenden. Auf diese Weise habe ich die Werte sofort als lokale Umgebungsvariablen in meiner Funktion.
0xC0000022L