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も合わせてどうぞ。

参考リンク

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 での確認方法をインフラ担当者・開発者向けにまとめます。

lftp で SFTP サーバーに接続する - 鍵認証・ポート指定・mirror での同期まで

lftp で SFTP サーバーに接続する - 鍵認証・ポート指定・mirror での同期まで

12

コマンドラインの高機能ファイル転送クライアント lftp で SFTP サーバーに接続する方法を、基本の sftp:// URL、パスワード/公開鍵認証、ポート番号や踏み台の指定、ホスト鍵の確認、mirror での一括ダウンロード/アップロード、リトライやタイムアウトの設定、bash スクリプトでの自動化まで実例つきで解説します。lftp の SFTP は内部で ssh を呼ぶ(sftp:connect-program)ため、ssh の設定や鍵がそのまま効くのがポイントです。

OpenSSH 10.4 の新機能とセキュリティ修正 - sftp/scp の脆弱性対応と量子耐性への流れ

OpenSSH 10.4 の新機能とセキュリティ修正 - sftp/scp の脆弱性対応と量子耐性への流れ

11

2026年7月6日にリリースされた OpenSSH 10.4 を一次情報で整理します。悪意あるサーバによる sftp ダウンロード先のすり替え、scp のリモート間コピーでの親ディレクトリ書き込み、鍵再交換時のクライアント側 use-after-free など複数のセキュリティ修正の中身に加え、ML-DSA 44 と Ed25519 を組み合わせた実験的なポスト量子署名の追加、そして mlkem768x25519 デフォルト化・DSA 削除といった量子耐性への流れまで、実務での確認ポイントとともにまとめます。