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

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

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

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

スワップファイルを作るとき、長年 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推奨
ext4fallocate でOK
XFSLinux 4.18 以降で fallocate 可(それ未満は dd)
btrfs専用手順(Linux 5.0 以降。CoW 無効の空ファイルを作ってから fallocate、または btrfs filesystem mkswapfile。後述)
不明 / 最大互換dd(man swapon 推奨の最も移植性が高い方法)

NOTE

ファイルシステムは df -T /(または findmnt -no FSTYPE /)で確認できます。ext4 や新しめの XFS なら fallocate、古い環境なら dd、btrfs は専用手順、迷ったら 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 版・最大互換)

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 では、スワップファイルは Linux 5.0 以降でサポートされ、穴がなく(事前確保済み)、NODATACOW(圧縮なし)であることが条件です。btrfs の公式ドキュメントは、btrfs filesystem mkswapfile --size 2G swapfile で作る方法と、truncate -s 0 で空ファイルを作り chattr +C で CoW を無効化してから fallocate -l 2G で確保する手動手順を案内しています(Swapfile - BTRFS documentation)。CoW 無効化を忘れると swapon に失敗します。

再起動後も有効にする(/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、古い環境・最大互換は dd。btrfs は CoW を無効化してから確保する専用手順
  • 手順は 確保 → chmod 600 → mkswap → swapon → /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

約48分

コンテナは軽量な仮想マシンではありません。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 での確認方法をインフラ担当者・開発者向けにまとめます。

BGP とインターネットのルーティング入門 - AS・経路選択から経路ハイジャックと RPKI まで

BGP とインターネットのルーティング入門 - AS・経路選択から経路ハイジャックと RPKI まで

約48分

ルーティングテーブルと最長一致、静的/動的ルーティング、IGP(OSPF など)と BGP の役割分担、AS と AS 番号(2バイト/4バイト、RFC 6793、プライベート AS 番号)、BGP-4(RFC 4271)の TCP 179 番セッション・4種類のメッセージ・eBGP/iBGP・パス属性とベストパス選択、トランジット/ピアリングと IX(JPIX)、2008年 YouTube ハイジャック・2017年の国内大規模障害・2019年 Verizon ルートリーク・2021年 Facebook 障害の実例、RPKI/ROV(RFC 6480・6811)と ASPA の標準化状況、traceroute・whois・RIPEstat での確認方法、AWS Direct Connect での BGP までを、一次ソースを軸に Web 開発者向けにまとめます。