Linux のスワップファイルは fallocate で速く作る - dd との違いと「has holes」の罠

Linux のスワップファイルは fallocate で速く作る - dd との違いと「has holes」の罠

作成日:
読了:7
更新日:
この記事を読む人におすすめPR / Amazonアソシエイト

当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。

スワップファイルを作るとき、長年 dd/dev/zero を丸ごと書き込む方法を使っていませんか。実は fallocate なら一瞬で確保でき、I/O 負荷も小さいので稼働中のサーバーでも扱いやすいです。ただしファイルシステムによっては落とし穴があります。この記事では、fallocatedd の違い・使い分け・手順を、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推奨
ext4fallocate でOK
XFSLinux 4.18 以降で fallocate(それ未満は dd)
btrfsfallocate 不可(未書き込みエクステントになる)→ dd、または CoW を無効化した専用ファイル
不明 / 最大互換ddman swapon 推奨の最も移植性が高い方法)

NOTE

ファイルシステムは df -T /(または findmnt -no FSTYPE /)で確認できます。ext4 や新しめの XFS なら fallocatebtrfs や古い環境なら dd、迷ったら dd、と覚えておけば安全です。

手順(fallocate 版・ext4 など)

fallocate でスワップ作成
# 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 -h

swapon --show/swapfile が出れば成功です。もし swapon: /swapfile: skipping - it appears to have holes. と出たら、そのFSでは fallocate が使えないサインなので、次の dd 版に切り替えます。

手順(dd 版・btrfs / 最大互換)

dd でスワップ作成(堅実)
# 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 /swapfile

NOTE

btrfs では CoW がスワップと相性が悪いので、dd でも事前にCoW無効のファイルを用意する必要があります(例: 空ファイルに chattr +C を付けてから書き込む、または btrfs のスワップファイル手順に従う)。確実なのは公式手順の確認です。

再起動後も有効にする(/etc/fstab)

swapon は再起動で消えるので、/etc/fstab に登録して永続化します。

fstab へ追記
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

必要ならスワップの使われやすさも調整します(サーバーは控えめにすることが多い)。

swappiness(任意)
# 一時変更
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 600mkswapswapon/etc/fstab
  • 失敗時は skipping - it appears to have holes がサイン。dd 版に切り替える

「速い fallocate、堅実な dd」をFSで使い分けるのがコツです。ext4 のVPSなら fallocate で十分速く・軽く作れます。サーバー運用の小ネタとして、シェルの安全策はbash の set -euo pipefailも合わせてどうぞ。

参考リンク

Linuxコンテナの仕組み入門 - namespaceとcgroupsから理解するDocker

Linuxコンテナの仕組み入門 - namespaceとcgroupsから理解するDocker

47

コンテナは軽量な仮想マシンではありません。Linuxカーネルのnamespace・cgroups・capabilities・seccomp・overlayfsという既存機能を組み合わせた「普通のプロセス」です。man7.orgのmanページ、kernel.orgのcgroup-v2ドキュメント、OCI仕様、Docker公式ドキュメントを一次ソースに、8種類のnamespaceの役割、cgroup v1とv2の違い、unshareやlsnsで手を動かす確認手順、runcとcontainerdの関係、そしてコンテナがセキュリティ境界として弱い理由までを積み上げて整理します。

SSH の仕組み - 鍵交換・ホスト鍵検証・公開鍵認証を一次ソースで理解する

SSH の仕組み - 鍵交換・ホスト鍵検証・公開鍵認証を一次ソースで理解する

18

リモートサーバー運用の土台である SSH プロトコルを、一次ソースの RFC 4251/4252/4253/4254(SSH-2 の Architecture / Authentication / Transport / Connection)を軸に整理します。TCP 接続からバージョン交換、KEXINIT による鍵交換と Diffie-Hellman、ホスト鍵の検証(known_hosts と TOFU の弱点)、公開鍵認証(authorized_keys と署名)、チャネルの多重化とポートフォワーディング(ssh -L / -R / -D)まで、その仕組みと OpenSSH での確認方法をインフラ担当者・開発者向けにまとめます。

ロードバランシングのアルゴリズム入門 - ラウンドロビンから最少コネクション・P2Cまで

ロードバランシングのアルゴリズム入門 - ラウンドロビンから最少コネクション・P2Cまで

14

負荷分散(ロードバランシング)の基礎を実務目線で整理します。L4とL7の違い、ラウンドロビン・加重ラウンドロビン・最少コネクション・最短応答時間・IPハッシュ・Power of Two Choices・Maglevといった主要アルゴリズムの挙動と向き不向き、nginx/HAProxy/Envoyの既定、ヘルスチェックやスティッキーセッションまで、公式ドキュメントを出典にまとめます。