fallocate vs dd对于swapfile?


19

我想知道使用创建交换文件之间有什么区别

fallocate -l 1G /swapfile

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

两者似乎都可以正常工作,但是一个相对于另一个有优势吗?

我在网上唯一能找到的就是fallocate不能在所有文件系统上正常工作。


1
fallocate通常更快(因为它不会用零填充创建的文件)-否则没有区别,最终结果是相同的。请参阅:antipaucity.com/2017/08/31/...
JonasCz -恢复莫妮卡

1
@JonasCz:是的,但是没有!请参阅大师的答案。
David Foerster '18

Answers:


22

mkswap手册页

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.

而从swapon手册页

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.

因此,虽然它fallocate可能比快dd,但它不适合创建交换文件,并且不受交换相关工具的支持。


1
mkswap联机帮助页还说:要设置交换文件,必须先创建该文件,然后再使用mkswap对其进行初始化,例如,使用类似fallocate --length 8GiB swapfile我感到困惑的命令。
stumblebee

4
@stumblebee可以在不支持预分配文件的文件系统上很好地工作,在这些文件系统上,fallocate本质上可以像dd一样工作,但不能在ext4上使用,ext4是默认的,也是迄今为止最常用的Linux文件系统。
muru

2
我对为什么fallocate会有问题感到困惑。似乎可以分配空间。(因为它说的标签上。)而做fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestext4并不抱怨什么。truncate -l 1g会有所不同,因为它仅设置文件大小,但不分配任何块。
ilkkachu

1
因此,如果不这样做,则需要提交一个错误:)
威尔·克劳福德

1
@ilkkachu至少有人在xfs上重现了该问题:bugzilla.redhat.com/show_bug.cgi?
muru

1

Fallocate更快,来自fallocate联机帮助页:

fallocate用于操纵为文件分配的磁盘空间,以解除分配或预分配文件。 对于支持fallocate系统调用的文件系统,可通过分配块并将其标记为未初始化来快速完成预分配,而无需对数据块进行任何IO操作。这比通过用零填充文件来创建文件要快得多。

fallocate(1)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.