viエディタでWrite error in Swap Fileと表示された場合の対処法|ディスク容量・inode枯渇・read-onlyの切り分け

HOMEリナックスマスター.JP 公式ブログLinuxエラー対処法 > viエディタでWrite error in Swap Fileと表示された場合の対処法|ディスク容量・inode枯渇・read-onlyの切り分け
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「viエディタでファイルを開いた瞬間にWrite error in Swap Fileと表示され、編集を続けたいのに保存できない」
ファイルを閉じる時にClose error on swapと出るパターンもあります。Linuxサーバーの運用中に突然遭遇すると焦りますが、原因はほぼ1つに絞れます。

この記事では、viエディタでWrite error in Swap Fileと表示された場合の対処法を、エラーが出る仕組み・原因の切り分け手順・ディスク容量の確保方法・viのスワップファイルの仕組みまで含めて解説します。

この記事のポイント

・原因の多くはディスク容量不足(df -h で確認)
・du -m / | sort -nr | head で大容量ディレクトリを特定
・inode枯渇でも同じエラーが出るので df -i も確認
・スワップファイル(.swp)の保存先は :set directory で変更できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Write error in Swap Fileが表示される仕組み

viエディタ(およびvim)は、ファイルを開いた瞬間に「スワップファイル」と呼ばれる作業用ファイルを生成します。編集中の変更内容を一時保存し、クラッシュ時の復旧に使う仕組みです。

スワップファイルは、編集対象ファイルと同じディレクトリに「.ファイル名.swp」という名前で作成されます。たとえば /etc/hosts を編集すれば /etc/.hosts.swp が生成されます。

このスワップファイルへの書き込みが失敗すると「Write error in Swap File」というエラーが表示されます。ファイルを閉じる時に出る「Close error on swap」も同じ系統のエラーで、スワップファイルへの最終フラッシュに失敗したことを意味します。

書き込み失敗の原因は次のいずれかに該当します。

ディスク容量不足:もっとも多い。dfで100%に近い
inode枯渇:ファイル数が上限到達。df -iで100%
パーティションがread-only:ファイルシステムエラー後の自動remount
権限不足:スワップファイル保存先に書き込み権限がない

ディスク容量を確認する(df -h)

最も多い原因はディスク容量不足です。まずは df -h で全マウントポイントの使用率を確認します。

# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 20G 0 100% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda2 100G 78G 22G 78% /var

上記の例では / パーティションが100%に達しており、これがWrite errorの原因です。Use%が95%以上の行があれば、まずそこを疑います。

使用量の多いディレクトリを特定する(du -m)

df で容量逼迫を確認したら、次に du でどのディレクトリが容量を食っているかを特定します。元記事と同じく、/ ルートからスキャンして上位10件を表示するコマンドが定番です。

# du -m / | sort -nr | head -10 ※使用量の多い上位10ディレクトリを表示します。

抽出されたディレクトリから、不要ファイルを見つけ出し削除します。

ただし du / は他のファイルシステム(/proc、/sys、ネットワークマウント等)まで走査するため時間がかかります。同じファイルシステム内に限定するには -x オプションを付けると速くなります。

# du -mx / | sort -nr | head -20 # または GB単位で見たい場合 # du -hx / | sort -h | tail -20

容量を食う代表的なディレクトリと削除候補

Linuxサーバーで容量逼迫を起こしやすいディレクトリと、安全に削除できるファイルの候補を整理します。

/var/log:ログファイル肥大化(journal・nginx・mysql等)
/var/cache/yumまたは/var/cache/dnf:パッケージキャッシュ
/tmp:再起動で消えるが大容量ファイル放置がある場合は確認
/var/lib/docker:未使用コンテナ・イメージ・ボリューム
/root/.cacheまたは/home/*/.cache:ユーザーキャッシュ

代表的な掃除コマンドを以下に示します。

# 古いログ削除(systemd journal) # journalctl --vacuum-size=200M # パッケージキャッシュ削除 # dnf clean all # または # yum clean all # Dockerの不要リソース削除 # docker system prune -a # 30日以上前の/tmp配下ファイル削除 # find /tmp -type f -mtime +30 -delete

※削除前に必ず ls / du で対象ファイルを目視確認してください。本番環境で「とりあえず rm -rf」は禁物です。

inode枯渇でも同じエラーが出る

ディスク容量に余裕があるのに Write error in Swap File が出る場合、inode(i番号)の枯渇が疑われます。ファイル数の上限に達した状態です。

inodeの使用状況は df -i で確認できます。

# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 1310720 1310720 0 100% /

IUse%が100%なら、小さなファイルが大量に生成されている可能性が高いです。/var/spool/mqueue、/var/spool/clientmqueue、セッションキャッシュ、PHPのセッションファイルなどが定番の原因です。

# ディレクトリ単位でファイル数を集計 # find / -xdev -type f | cut -d/ -f2-4 | sort | uniq -c | sort -rn | head -20

大容量ファイルだけを狙い撃ちで探す

ディレクトリ単位の集計ではなく「単体で大容量のファイル」を直接探したい場合は、findコマンドが便利です。容量上位を一気に並べられます。

# 100MB以上のファイルを一覧 # find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null # 同じことをサイズ降順で並べる # find / -xdev -type f -size +100M -printf "%s %p\n" 2>/dev/null | sort -rn | head -20

ログファイルが想定外に肥大化しているケース(数GBのapacheアクセスログ、未ローテーションのMySQLバイナリログなど)はこの方法で一発で見つかります。
削除済みなのにディスクが解放されない状態(プロセスがファイルを開いたままrmされた)もLinuxサーバーでは頻発します。次のコマンドで該当プロセスを特定できます。

# 削除済みなのにオープン中のファイルを検出 # lsof +L1 | head -20

該当プロセスをリスタートすればディスクが解放されます(例:systemctl restart httpd)。

その他の原因と対処(read-only・権限・スワップ無効化)

パーティションがread-onlyになっている

ファイルシステムエラー後にカーネルが自動でread-only remountすることがあります。dmesg で確認します。

# mount | grep " / " /dev/sda1 on / type ext4 (ro,...) # dmesg | tail -50 EXT4-fs error: ... remounting filesystem read-only

roで再マウントされている場合は、シングルユーザモードでe2fsckを実行してファイルシステムを修復する必要があります。

スワップファイルの保存先を変更する

編集対象ファイルのディレクトリが書き込み禁止の場合、:set directory で別の場所にスワップファイルを置けます。viコマンド実行中、コマンドモードで次のように入力します。

:set directory=/tmp

恒久設定にしたい場合は ~/.vimrc に追記します。

echo 'set directory=/tmp' >> ~/.vimrc

スワップファイルを無効化する(緊急時のみ)

どうしてもスワップファイルを生成させたくない場合は、起動時に -n オプションを付けます。ただしクラッシュ時の復旧ができなくなるため、緊急避難用です。

# vi -n /etc/hosts

復旧後に残る .swp ファイルの取り扱い

ディスク容量を確保してvi編集を再開しようとすると、今度は「E325: ATTENTION Found a swap file by the name ".hosts.swp"」という警告が表示されることがあります。前回の編集セッションでスワップファイルが残ったままになっているケースです。

中断時に未保存の変更があれば :recover で復元できます。一方、前回の編集を破棄して問題ない場合は、残った .swp ファイルを削除してから再度viを起動してください。

# 残っている.swpファイルを確認 # ls -la /etc/.hosts.swp # 不要なら削除 # rm /etc/.hosts.swp # 復元したい場合 # vi -r /etc/hosts

本番サーバーで作業中に SSH 接続が切れた、PCがクラッシュしたなど、突然セッションが切れた直後はかなりの確率で .swp が残ります。慌てずに :recover を試してみると、消えたと思った変更が戻ってくることがあります。

本記事のまとめ

Write error in Swap Fileのトラブルシュート手順を一覧にまとめます。
確認・対処内容コマンド
ディスク容量の確認df -h
容量を食うディレクトリを特定du -m / | sort -nr | head -10
同一FS内に限定して高速集計du -mx / | sort -nr | head -20
inode使用状況の確認df -i
パッケージキャッシュ削除dnf clean all
systemdログ削減journalctl --vacuum-size=200M
Docker不要リソース削除docker system prune -a
read-onlyかを確認mount | grep " / "
スワップ保存先を変更:set directory=/tmp
スワップ無効でvi起動vi -n ファイル名

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。


Linux無料マニュアル(図解60P) 名前とメールで30秒登録