fallocate vs dd für Swapfile?

18

Ich frage mich, was der Unterschied zwischen dem Erstellen einer Swap-Datei ist

fallocate -l 1G /swapfile

und

dd if=/dev/zero of=/swapfile bs=1024 count=1024

beide scheinen gut zu funktionieren, aber hat einer einen Vorteil gegenüber dem anderen?

Das einzige, was ich online finden konnte, war, dass fallocatees nicht auf allen Dateisystemen funktioniert.

NerdOfLinux
quelle
1
fallocateist normalerweise schneller (da die erstellte Datei nicht mit Nullen gefüllt wird) - ansonsten gibt es keine Unterschiede, das Endergebnis ist dasselbe. Siehe: antipaucity.com/2017/08/31/…
Reinstate Monica
1
@ JonasCz: Ja ... aber nein! Siehe Murus Antwort.
David Foerster

Antworten:

21

Von der mkswapManpage :

Note  that  a  swap  file  must  not contain any holes.  Using cp(1) to
create the file is not acceptable.  Neither is use of  fallocate(1)  on
file  systems  that support preallocated files, such as XFS or ext4, or
on copy-on-write filesystems like btrfs.   It  is  recommended  to  use
dd(1)  and  /dev/zero in these cases.  Please read notes from swapon(8)
before adding a swap file to copy-on-write filesystems.

Und von der swaponManpage :

You should not use swapon on a file with holes.  This can  be  seen  in
the system log as

      swapon: swapfile has holes.

The  swap file implementation in the kernel expects to be able to write
to the file directly, without the assistance of the  filesystem.   This
is  a problem on preallocated files (e.g.  fallocate(1)) on filesystems
like XFS or ext4, and on copy-on-write filesystems like btrfs.

Daraus folgt, dass die Erstellung von Auslagerungsdateien fallocatezwar schneller als möglich ist dd, sie jedoch nicht für die Erstellung von Auslagerungsdateien geeignet ist und von Tools, die sich auf Auslagerungen beziehen, nicht unterstützt wird.

muru
quelle
1
Die Manpage von mkswap sagt außerdem: Um eine Auslagerungsdatei einzurichten, muss diese Datei erstellt werden, bevor sie mit mkswap initialisiert wird, z. B. mit einem Befehl, wie fallocate --length 8GiB swapfileich ihn verwirrt habe.
Stumblebee
4
@stumblebee und das funktioniert gut auf Dateisystemen, die vorab zugewiesene Dateien nicht unterstützen, bei denen fallocate im Wesentlichen wie dd funktioniert, aber nicht auf ext4, dem Standard- und mit Abstand am häufigsten verwendeten Linux-Dateisystem.
muru
2
Ich bin ein bisschen verwirrt, warum fallocatedas ein Problem sein könnte. Es scheint, gut, den Raum zuzuteilen. (Wie heißt es auf dem Etikett.) Und dabei fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestauf ext4beschwert sich nicht über alles. truncate -l 1gwäre anders, da es nur die Dateigröße festlegt, aber keine Blöcke zuweist.
Ilkkachu
1
Wenn dies nicht der Fall ist, muss jemand einen Fehler melden :)
Will Crawford
1
@ilkkachu Jemand hat das Problem zumindest auf xfs reproduziert: bugzilla.redhat.com/show_bug.cgi?id=1129205
muru
1

Fallocate ist schneller. Aus der Fallocate-Manpage:

fallocate wird verwendet, um den zugewiesenen Speicherplatz für eine Datei zu bearbeiten, entweder um die Zuordnung aufzuheben oder um sie vorab zuzuweisen. Bei Dateisystemen, die den Systemaufruf fallocate unterstützen, erfolgt die Vorbelegung schnell, indem Blöcke zugewiesen und als nicht initialisiert markiert werden, ohne dass eine E / A für die Datenblöcke erforderlich ist. Dies ist viel schneller als das Erstellen einer Datei durch Füllen mit Nullen.

fallocate(1)

stolpern
quelle