¿Fallocate vs dd para swapfile?

19

Me pregunto cuál es la diferencia entre crear un archivo de intercambio con

fallocate -l 1G /swapfile

y

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

ambos parecen funcionar bien, pero ¿uno tiene una ventaja sobre el otro?

Lo único que pude encontrar en línea fue que fallocateno funciona en todos los sistemas de archivos.

NerdOfLinux
fuente
1
fallocategeneralmente es más rápido (ya que no llena el archivo creado con ceros); de lo contrario, sin diferencias, el resultado final es el mismo. Ver: antipaucity.com/2017/08/31/…
JonasCz - Restablecer Monica
1
@JonasCz: Sí ... ¡pero no! Ver la respuesta de muru.
David Foerster

Respuestas:

22

Desde la página del mkswapmanual :

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.

Y de la página del swaponmanual :

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.

De ello se deduce que, aunque fallocatepuede ser más rápido que dd, no es adecuado para crear archivos de intercambio y no es compatible con herramientas relacionadas con el intercambio.

muru
fuente
1
La página de manual de mkswap también dice: Para configurar un archivo de intercambio, es necesario crear ese archivo antes de inicializarlo con mkswap, por ejemplo, usando un comando como fallocate --length 8GiB swapfileestoy confundido.
stumblebee
44
@stumblebee y eso funcionará bien en sistemas de archivos que no admiten archivos preasignados en los que Falocate funcionará esencialmente como dd, pero no en ext4, que es el sistema de archivos Linux más utilizado por defecto y con diferencia.
Muru
2
Estoy un poco confundido sobre por qué fallocatesería un problema. Parece, bueno, asignar el espacio. (Como dice en la etiqueta.) Y seguir fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestadelante ext4no se queja de nada. truncate -l 1gsería diferente, ya que solo establece el tamaño del archivo pero no asigna ningún bloque.
ilkkachu
1
Entonces, si no está haciendo eso, alguien debe presentar un error :)
Will Crawford
1
@ilkkachu alguien ha reproducido el problema en xfs, al menos: bugzilla.redhat.com/show_bug.cgi?id=1129205
muru
1

Fallocate es más rápido, desde la página de manual de Falocate:

Fallocate se utiliza para manipular el espacio en disco asignado para un archivo, ya sea para desasignarlo o preasignarlo. Para los sistemas de archivos que admiten la llamada al sistema de Falcocate, la preasignación se realiza rápidamente asignando bloques y marcándolos como no inicializados, sin requerir IO a los bloques de datos. Esto es mucho más rápido que crear un archivo al llenarlo con ceros.

fallocate(1)

abejorro
fuente