
Linux のスワップファイルは fallocate で速く作る - dd との違いと「has holes」の罠
スワップファイルを作るとき、長年 dd で /dev/zero を丸ごと書き込む方法を使っていませんか。実は fallocate なら一瞬で確保でき、I/O 負荷も小さいので稼働中のサーバーでも扱いやすいです。ただしファイルシステムによっては落とし穴があります。この記事では、fallocate と dd の違い・使い分け・手順を、man swapon など一次情報をもとに整理します。
fallocate と dd の違い
dd(従来) | fallocate | |
|---|---|---|
| 中身 | /dev/zero を全バイト書き込み | メタデータで領域を即時確保 |
| 速度 | 容量に比例して遅い | ほぼ一瞬 |
| I/O 負荷 | 高い(GB単位の書き込み) | 低い |
| 互換性 | 最も堅実(どのFSでも可) | FS依存(後述) |
dd は2GBのスワップなら2GBを律儀に書き込むため、稼働中のサーバーでは I/O スパイクを招きます。fallocate は「この領域を確保した」とメタデータに記録するだけなので一瞬で終わり、負荷も小さい——これが「速くて負荷下でも使える」理由です。
落とし穴: 「has holes」で swapon が失敗する
ただし、これは万能ではありません。
WARNING
カーネルのスワップ実装はファイルへ直接書き込めることを前提とし、穴あき(hole)や CoW ファイルを許しません。fallocate は環境によって未書き込みエクステント(穴あき扱い)のファイルを作るため、swapon が 「swapfile has holes」のようなエラーで失敗することがあります。実際、man swapon / man mkswap は穴あきファイルでの利用を推奨していません。
つまり「fallocate が使えるか」はファイルシステム次第です。
ファイルシステム別の使い分け
| FS | 推奨 |
|---|---|
| ext4 | fallocate でOK |
| XFS | Linux 4.18 以降で fallocate 可(それ未満は dd) |
| btrfs | fallocate 不可(未書き込みエクステントになる)→ dd、または CoW を無効化した専用ファイル |
| 不明 / 最大互換 | dd(man swapon 推奨の最も移植性が高い方法) |
NOTE
ファイルシステムは df -T /(または findmnt -no FSTYPE /)で確認できます。ext4 や新しめの XFS なら fallocate、btrfs や古い環境なら dd、迷ったら dd、と覚えておけば安全です。
手順(fallocate 版・ext4 など)
# 1. 2GiB を一瞬で確保
sudo fallocate -l 2G /swapfile
# 2. 所有者だけ読み書き(必須。緩いと mkswap/swapon が警告/拒否)
sudo chmod 600 /swapfile
# 3. スワップ領域として初期化
sudo mkswap /swapfile
# 4. 有効化
sudo swapon /swapfile
# 5. 反映確認
swapon --show
free -hswapon --show に /swapfile が出れば成功です。もし swapon: /swapfile: skipping - it appears to have holes. と出たら、そのFSでは fallocate が使えないサインなので、次の dd 版に切り替えます。
手順(dd 版・btrfs / 最大互換)
# 2GiB を全書き込み(時間と I/O がかかる)
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileNOTE
btrfs では CoW がスワップと相性が悪いので、dd でも事前にCoW無効のファイルを用意する必要があります(例: 空ファイルに chattr +C を付けてから書き込む、または btrfs のスワップファイル手順に従う)。確実なのは公式手順の確認です。
再起動後も有効にする(/etc/fstab)
swapon は再起動で消えるので、/etc/fstab に登録して永続化します。
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab必要ならスワップの使われやすさも調整します(サーバーは控えめにすることが多い)。
# 一時変更
sudo sysctl vm.swappiness=10
# 永続化
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf後片付け(スワップの削除)
sudo swapoff /swapfile
sudo sed -i '\#/swapfile#d' /etc/fstab # fstab の行を削除
sudo rm /swapfileまとめ
fallocateは一瞬・低I/Oでスワップを確保でき、稼働中サーバーでも扱いやすい- ただし穴あきファイルを作るFSでは
swaponが「has holes」で失敗する(man swaponも非推奨) -
ext4/新しめのXFS(Linux 4.18+)は
fallocate、btrfs や古い環境・最大互換はdd - 手順は 確保 →
chmod 600→mkswap→swapon→/etc/fstab - 失敗時は
skipping - it appears to have holesがサイン。dd版に切り替える
「速い fallocate、堅実な dd」をFSで使い分けるのがコツです。ext4 のVPSなら fallocate で十分速く・軽く作れます。サーバー運用の小ネタとして、シェルの安全策はbash の set -euo pipefailも合わせてどうぞ。


