fallocate vs dd для swapfile?


19

Мені цікаво, в чому різниця між створенням swapfile

fallocate -l 1G /swapfile

і

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

обидва, здається, працюють добре, але чи має одна перевага перед іншою?

Єдине, що я міг знайти в Інтернеті, це те, що він fallocateпрацює не у всіх файлових системах.


1
fallocateзазвичай швидше (оскільки він не заповнює створений файл нулями) - в іншому випадку різниці немає, кінцевий результат той самий. Дивіться: antipaucity.com/2017/08/31/…
Відновіть Моніку

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
На сторінці manxop також написано: Щоб налаштувати файл swap, необхідно створити цей файл, перш ніж ініціалізувати його mmwp, наприклад, використовуючи команду, як fallocate --length 8GiB swapfileя переплутана.
спотикання

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 використовується для маніпулювання виділеним дисковим простором для файлу, або для його розміщення, або для попереднього розміщення. Для файлових систем, які підтримують виклик фаллокативної системи, попереднє розміщення здійснюється швидко, виділяючи блоки та позначаючи їх як неініціалізовані, не вимагаючи IO для блоків даних. Це набагато швидше, ніж створити файл, заповнивши його нулями.

fallocate(1)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.