
Ich habe eine SSD mit BTRFS und habe versucht, eine Auslagerungsdatei wie folgt zu erstellen:
dd if=/dev/zero of=swapfile01 bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01
In dmesg sehe ich
[238434.731654] swapon: swapfile has holes
Ich verstehe, dass es wahrscheinlich einige Löcher gibt, die durch die Festplattenfragmentierung verursacht werden, aber dies ist eine SSD-Festplatte, also sollte das wahrscheinlich keine Rolle spielen? Gibt es eine Möglichkeit, die Löcher zu ignorieren? Oder wie kann ich das beheben?
Abseits des Themas – warum ich dies möchte (um irrelevante Fragen in Kommentaren zu vermeiden): Ich habe eine verschlüsselte Festplatte, deren Größe zu ändern ein echter Krampf ist, also habe ich einfach beschlossen, eine Auslagerungsdatei zu erstellen, anstatt die Größe der Auslagerungspartition zu ändern (ich habe 14 GB RAM hinzugefügt, von 4 GB auf 16 GB, und kann jetzt nicht in den Ruhezustand wechseln).
Antwort1
Stand 2019
Die Entwicklung von Btrfs und Linux-Kernel machte meine ursprüngliche AntwortveraltetBitte beachten Siediese andere Antwort.
Ursprüngliche Antwort von 2016
AusHäufig gestellte Fragen zu btrfs:
Unterstützt btrfs Auslagerungsdateien? Derzeit nein. Einfach eine NOCOW-Datei zu erstellen, hilft nicht, die Unterstützung von Auslagerungsdateien basiert auf einer Funktion, die btrfs aufgrund möglicher Beschädigungen absichtlich nicht implementiert. (...) Eine Problemumgehung, allerdings mit schlechter Leistung, besteht darin, eine Auslagerungsdatei über ein Loop-Gerät zu mounten.
Es gibt also noch keine gute Möglichkeit, eine Auslagerungsdatei auf der BTRFS-Partition zu erstellen.
Antwort2
Wie oben erwähnt,seit Linux 5.0Es ist jetzt möglich, Auslagerungsdateien auf BTRFS zu erstellen. Sie sollten jedoch nicht komprimiert und NoCOW sein. So erstellen Sie eine solche Datei:
- Erstellen Sie eine leere Datei:
touch /swap
- Verwenden Sie , um ihm Attribute
chattr
zuzuweisen :NoCOW
chattr +C /swap
- Überprüfen Sie, ob das
C
Attribut angezeigt wird:lsattr /swap
- Füllen Sie es aus:
dd if=/dev/zero of=/swap bs=1M count=1024
# für 1 Gigabyte mkswap /swap && chmod 600 /swap && swapon /swap
Alternativ können Sie ein Verzeichnis erstellen, chattr +C
dieses Verzeichnis festlegen und dann darunter eine Auslagerungsdatei erstellen.
chattr +C
Beachten Sie, dass Sie dies nicht mit bereits vorhandenen, nicht leeren Dateien machen können . Es ist dokumentiert, dass es sich um undefiniertes Verhalten handelt (tatsächlich werden die Attribute einfach nicht geändert). Sie sollten also entweder eine leere Datei erstellen und dann chattr
oder ein Verzeichnis mit erstellen chattr
und dann eine Datei darin erstellen (in diesem Fall chattr
haben alle Dateien, die nach dem Hinzufügen des Verzeichnisses erstellt werden, das Attribut nocow).
Vorbehalt:wie erwähnt, ist hierfür Kernelversion 5.0 oder höher erforderlich. Raspberry Pi verwendet beispielsweise 4.19.*-Kernel, daher können Sie diese Technik darauf nicht verwenden.
Antwort3
Die Unterstützung für Auslagerungsdateien wurde der Kernelversion 5.0 hinzugefügt, wie aus dem Commit ersichtlich ist.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 Um die Auslagerungsdatei auf BTRFS zu aktivieren, muss die Datei vollständig als NOCOW ohne Komprimierung auf einem Gerät zugewiesen werden.
Antwort4
Nützlicher Hinweis zum Swap auf BTRFS: Wenn Sie Sicherungs-Snapshots/Subvolumes erstellen, sollten Sie ein dediziertes Subvolume erstellen, von dem Sie keinen Snapshot erstellen.
Auf dem Snapshot-Subvolume wird Ihre Auslagerungsdatei wieder zu COW und Sie können dies swapon
nach dem Neustart nicht mehr tun:https://www.spinics.net/lists/linux-btrfs/msg96790.html
Ich habe mein letztes Untervolume beschreibbar gemacht, sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false
gelöscht swap
und konnte es swapon
auf dem Hauptvolume wieder tun – aber als Nächstes werde ich ein dediziertes Untervolume erstellen.