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

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

作成日:
読了:7
更新日:

スワップファイルを作るとき、長年 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も合わせてどうぞ。

参考リンク

レート制限の仕組み - トークンバケット・スライディングウィンドウと 429 の正しい返し方

レート制限の仕組み - トークンバケット・スライディングウィンドウと 429 の正しい返し方

10

API のレート制限(rate limiting)を実務目線で整理します。固定ウィンドウ・スライディングウィンドウ(ログ/カウンタ)・トークンバケット・リーキーバケットの各アルゴリズムの仕組みと長所短所、トークンバケットの擬似コード、Redis での原子的な実装、HTTP 429 と Retry-After・RateLimit ヘッダの返し方、分散環境での注意、そして固定ウィンドウの境界バーストや X-Forwarded-For 偽装、指数バックオフ+ジッターといった落とし穴まで、MDN・IETF を一次ソースにまとめます。

set -euo pipefail とは何か - Bashスクリプト冒頭の「おまじない」を正しく理解する

set -euo pipefail とは何か - Bashスクリプト冒頭の「おまじない」を正しく理解する

11

Bashスクリプトの冒頭でよく見る set -euo pipefail を、-e(errexit)・-u(nounset)・-o pipefail の3つに分解して解説します。それぞれの意味、set -e が効かない落とし穴、IFS との組み合わせ、実践的なテンプレートまで、bash 5.3 での実挙動を確認しながら整理します。