fallocate vs dd untuk swapfile?

18

Saya bertanya-tanya apa bedanya antara membuat swapfile dengan

fallocate -l 1G /swapfile

dan

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

keduanya tampaknya bekerja dengan baik, tetapi apakah satu memiliki keunggulan dibandingkan yang lain?

Satu-satunya hal yang bisa saya temukan online adalah itu fallocatetidak berfungsi pada semua sistem file.

NerdOfLinux
sumber
1
fallocatebiasanya lebih cepat (karena tidak mengisi file yang dibuat dengan nol) - jika tidak ada perbedaan, hasil akhirnya sama. Lihat: antipaucity.com/2017/08/31/…
Reinstate Monica
1
@JonasCz: Ya ... tapi tidak! Lihat jawaban muru.
David Foerster

Jawaban:

21

Dari halaman 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.

Dan dari halaman 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.

Oleh karena itu, walaupun fallocatemungkin lebih cepat daripada dd, itu tidak cocok untuk membuat file swap dan tidak didukung oleh alat terkait swap.

muru
sumber
1
Manual mkswap juga mengatakan: Untuk mengatur file swap, perlu membuat file sebelum menginisialisasi dengan mkswap, misalnya menggunakan perintah seperti fallocate --length 8GiB swapfilesaya bingung.
stumblebee
4
@stumblebee dan itu akan berfungsi dengan baik pada filesystem yang tidak mendukung file yang dialokasikan sebelumnya di mana fallocate pada dasarnya akan bekerja seperti dd, tetapi tidak pada ext4, yang merupakan default dan sejauh ini filesystem Linux yang paling umum digunakan.
muru
2
Saya agak bingung mengapa fallocateakan menjadi masalah. Tampaknya, well, mengalokasikan ruang. (Seperti yang tertulis di label.) Dan melakukan fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestpada ext4tidak mengeluh tentang apa pun. truncate -l 1gakan berbeda, karena hanya menetapkan ukuran file tetapi tidak mengalokasikan blok apa pun.
ilkkachu
1
Jadi jika tidak melakukan itu, seseorang perlu mengajukan bug :)
Will Crawford
1
@ilkkachu seseorang telah mereproduksi masalah pada xfs, setidaknya: bugzilla.redhat.com/show_bug.cgi?id=1129205
muru
1

Fallocate lebih cepat, Dari manual fallocate:

fallocate digunakan untuk memanipulasi ruang disk yang dialokasikan untuk suatu file, baik untuk membatalkan alokasi atau melakukan pra-alokasi. Untuk sistem file yang mendukung panggilan sistem fallocate, pra- alokasi dilakukan dengan cepat dengan mengalokasikan blok dan menandainya sebagai tidak diinisialisasi, tidak memerlukan IO ke blok data. Ini jauh lebih cepat daripada membuat file dengan mengisinya dengan nol.

fallocate(1)

stumblebee
sumber