Fallocate против дд для файла подкачки?

19

Мне интересно, какая разница между созданием файла подкачки с

fallocate -l 1G /swapfile

и

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

оба, кажется, работают нормально, но имеет ли одно преимущество перед другим?

Единственное, что я смог найти в Интернете, fallocateэто то, что он работает не на всех файловых системах.

NerdOfLinux
источник
1
fallocateобычно быстрее (так как он не заполняет созданный файл нулями) - иначе никаких различий, хотя, конечный результат тот же. См .: antipaucity.com/2017/08/31/…
JonasCz - Восстановить Монику
1
@JonasCz: Да ... но нет! Смотри ответ Муру.
Дэвид Фёрстер

Ответы:

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
На man-странице mkswap также написано: Чтобы настроить файл подкачки, необходимо создать этот файл перед его инициализацией с помощью mkswap, например, с помощью команды, fallocate --length 8GiB swapfileкоторую я запутал.
Stumblebee
4
@stumblebee, и это будет хорошо работать на файловых системах, которые не поддерживают предварительно выделенные файлы, где fallocate будет по существу работать как dd, но не на ext4, которая является стандартной и, безусловно, наиболее часто используемой файловой системой Linux.
Муру
2
Я немного сбит с толку относительно того, почему fallocateбудет проблема. Кажется, ну выделите место. (Как написано на этикетке.) И делать fallocate -l 1g /swaptest && mkswap /swaptest && swapon /swaptestдальше ext4не на что жаловаться. truncate -l 1gбудет отличаться, так как он просто устанавливает размер файла, но не выделяет никаких блоков.
ilkkachu
1
Так что, если он этого не делает, кто-то должен сообщить об ошибке :)
Уилл Кроуфорд
1
@ilkkachu кто-то воспроизвел проблему на xfs, по крайней мере: bugzilla.redhat.com/show_bug.cgi?id=1129205
muru
1

Fallocate быстрее, из справочной страницы Fallocate:

Fallocate используется для манипулирования выделенным дисковым пространством для файла, чтобы освободить или предварительно выделить его. Для файловых систем, которые поддерживают системный вызов fallocate, предварительное распределение выполняется быстро, выделяя блоки и помечая их как неинициализированные, не требуя ввода-вывода для блоков данных. Это гораздо быстрее, чем создавать файл, заполняя его нулями.

fallocate(1)

stumblebee
источник