fallocate vs dd para swapfile?

18

Eu estou querendo saber qual é a diferença entre criar um swapfile com

fallocate -l 1G /swapfile

e

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

ambos parecem funcionar bem, mas um tem uma vantagem sobre o outro?

A única coisa que pude encontrar on-line foi que fallocatenão funciona em todos os sistemas de arquivos.

NerdOfLinux
fonte
11
fallocategeralmente é mais rápido (já que não preenche o arquivo criado com zeros) - caso contrário, não há diferenças, mas o resultado final é o mesmo. Veja: antipaucity.com/2017/08/31/…
JonasCz - Restabelece Monica
11
@JonasCz: Sim ... mas não! Veja a resposta de muru.
David Foerster

Respostas:

21

Na página de 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.

E na página de 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.

Daqui resulta que, embora fallocatepossa ser mais rápido dd, não é adequado para criar arquivos de troca e não é suportado por ferramentas relacionadas à troca.

muru
fonte
11
A página de manual do mkswap também diz: Para configurar um arquivo de troca, é necessário criar esse arquivo antes de inicializá-lo com o mkswap, por exemplo, usando um comando como fallocate --length 8GiB swapfileestou confuso.
stumblebee
4
@stumblebee e isso funcionará bem em sistemas de arquivos que não suportam arquivos pré-alocados, nos quais o fallocate funcionará essencialmente como dd, mas não no ext4, que é o padrão e de longe o sistema de arquivos Linux mais comumente usado.
19718 muru
2
Estou um pouco confuso sobre o porquê de fallocateser um problema. Parece, bem, alocar o espaço. (Como se diz no rótulo.) E fazendo fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestem ext4não reclamar de nada. truncate -l 1gseria diferente, pois apenas define o tamanho do arquivo, mas não aloca nenhum bloco.
ilkkachu
11
Então, se ele não está fazendo isso, alguém precisa registrar um bug :)
Will Crawford
11
@ilkkachu alguém tem reproduzido o problema em xfs, pelo menos: bugzilla.redhat.com/show_bug.cgi?id=1129205
Muru
1

O fallocate é mais rápido, na página de manual do fallocate:

fallocate é usado para manipular o espaço em disco alocado para um arquivo, para desalocá-lo ou pré-alocá-lo. Para sistemas de arquivos que suportam a chamada de sistema fallocate, preallocation é feito rapidamente através da atribuição de blocos e marcá-las como não inicializado, sem necessidade de IO para os blocos de dados. Isso é muito mais rápido do que criar um arquivo preenchendo-o com zeros.

fallocate(1)

tropeçar
fonte