fallocate vs dd pour fichier d'échange?

19

Je me demande quelle est la différence entre la création d'un fichier d'échange avec

fallocate -l 1G /swapfile

et

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

les deux semblent bien fonctionner, mais l'un a-t-il un avantage sur l'autre?

La seule chose que j'ai pu trouver en ligne est que fallocatecela ne fonctionne pas sur tous les systèmes de fichiers.

NerdOfLinux
la source
1
fallocateest généralement plus rapide (car il ne remplit pas le fichier créé avec des zéros) - sinon aucune différence cependant, le résultat final est le même. Voir: antipaucity.com/2017/08/31/…
Reinstate Monica
1
@JonasCz: Oui… mais non! Voir la réponse de muru.
David Foerster

Réponses:

22

Depuis la mkswappage de manuel :

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.

Et à partir de la swaponpage de manuel :

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.

Il s'ensuit que, bien que fallocateplus rapide que ddcela, il ne convient pas pour créer des fichiers d'échange et n'est pas pris en charge par les outils liés à l'échange.

muru
la source
1
La page de manuel mkswap dit également: Pour configurer un fichier d'échange, il est nécessaire de créer ce fichier avant de l'initialiser avec mkswap, par exemple en utilisant une commande comme fallocate --length 8GiB swapfileje suis confus.
stumblebee
4
@stumblebee et cela fonctionnera très bien sur les systèmes de fichiers qui ne prennent pas en charge les fichiers pré-alloués où fallocate fonctionnera essentiellement comme dd, mais pas sur ext4, qui est le système de fichiers Linux par défaut et de loin le plus utilisé.
muru
2
Je suis un peu confus quant à la raison pour laquelle ce fallocateserait un problème. Il semble, bien, allouer l'espace. (Comme il est dit sur l'étiquette.) Et faire fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestsur ext4ne se plaint de rien. truncate -l 1gserait différent, car il définit simplement la taille du fichier mais n'alloue aucun bloc.
ilkkachu
1
Donc, si ce n'est pas le cas, quelqu'un doit déposer un bug :)
Will Crawford
1
@ilkkachu quelqu'un a reproduit le problème sur xfs, au moins: bugzilla.redhat.com/show_bug.cgi?id=1129205
muru
1

Fallocate est plus rapide, à partir de la page de manuel fallocate:

fallocate est utilisé pour manipuler l'espace disque alloué pour un fichier, soit pour le désallouer, soit pour le préallouer. Pour les systèmes de fichiers qui prennent en charge l'appel système fallocate, la préallocation se fait rapidement en allouant des blocs et en les marquant comme non initialisés, ne nécessitant pas d'E / S sur les blocs de données. C'est beaucoup plus rapide que de créer un fichier en le remplissant de zéros.

fallocate(1)

stumblebee
la source