vi/vim readonlyエラーの解除と強制保存|sudoを忘れた編集を保存する方法

HOMEリナックスマスター.JP 公式ブログLinuxエラー対処法 > vi/vim readonlyエラーの解除と強制保存|sudoを忘れた編集を保存する方法
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ「readonly」エラーが出るのか?(原因)

このエラーは、主に以下の3つのパターンで発生します。

1. root権限が必要なファイルを一般ユーザーで開いた
/etc/ 以下の設定ファイルなどを、sudo を付け忘れて vi で開いてしまったパターンが圧倒的に多いです。

2. 自分に「書き込み権限(w)」がない
ファイルの所有者が自分であっても、パーミッションが読み取り専用(例:400や444)になっていると上書きできません。

3. 読み取り専用コマンド(viewなど)で開いた
誤って中身を変更しないように view コマンドでファイルを開いたにも関わらず、編集して保存しようとしたパターンです。

まずファイルの権限と所有者を確認する

対処法を選ぶ前に、なぜreadonlyになっているのかを確認するのが現場の基本です。ls -l コマンドで権限と所有者を確認しましょう。

$ ls -l /etc/xxxxx.conf -rw-r--r-- 1 root root 512 Jan 15 10:00 /etc/xxxxx.conf


確認ポイント:
先頭の権限文字列(-rw-r--r--): 左から「所有者」「グループ」「その他」の権限。「r」が読み取り、「w」が書き込み、「x」が実行を意味します
所有者(root): 「root」のファイルを一般ユーザーが書き込むには sudo が必要です

上記の例では「所有者はroot、その他のユーザーは読み取り専用(r--)」なので、sudo なしで編集しても保存できません。

対処法1:編集内容を破棄して、やり直す(基本)

「ちょっと数行書き換えただけだから、やり直してもいい」という場合は、一度強制終了して、正しい権限で開き直すのが最も確実です。

1. 強制終了して閉じる

キーボードで以下のコマンドを入力して、Enterキーを押します。

:q!

:q(終了)に !(強制)を付けることで、保存していない変更をすべて破棄して終了できます。

2. sudo を付けて開き直す

再度、sudo を付けてファイルを開き直し、編集を行います。

$ sudo vi /etc/xxxxx.conf


対処法2:自分のファイルなら強制保存する(:wq!)

エラーが出たファイルが「自分の所有物(オーナーが自分)」である場合のみ、この方法が使えます。他人のファイルやrootのファイルには通用しません。

以下のコマンドを入力してEnterキーを押します。

:wq!

:w(保存)と :q(終了)に !(強制)を組み合わせることで、vimの内部的なreadonly設定を無視して上書き保存します。ただし、OSのファイルパーミッション自体が読み取り専用の場合は後述の「対処法3」が必要です。

対処法3:パーミッションを変更してから保存する(chmod)

「自分が所有者のファイルだが、パーミッションが読み取り専用(400や444)になっている」という場合は、:wq! でも保存できないことがあります。

その場合は一度 :q! でviを終了し、chmod コマンドでファイルに書き込み権限を付与してから開き直します。

# 現在のパーミッションを確認 $ ls -l myfile.conf -r--r--r-- 1 user user 512 Jan 15 10:00 myfile.conf # 書き込み権限を追加する $ chmod u+w myfile.conf # 権限が変わったことを確認 $ ls -l myfile.conf -rw-r--r-- 1 user user 512 Jan 15 10:00 myfile.conf # 改めてviで開く $ vi myfile.conf

chmod u+w は「所有者(u)に書き込み権限(w)を追加(+)する」という意味です。作業後はセキュリティのために元のパーミッションに戻すことをおすすめします。

対処法4:【裏技】sudoを忘れたが、今の編集内容をどうしても残したい時

「sudoを付け忘れて開いたけど、すでに数十行も編集してしまった。もう一度最初から書き直すのは絶対に嫌だ!」
・・・現場のエンジニアが最も頻繁に直面する、絶体絶命のピンチを救う魔法のコマンドがあります。

viを開いたまま、以下のコマンドを入力してEnterキーを押してください。

:w !sudo tee %


※パスワードの入力が求められるので、自分のパスワード(sudoを実行する時のパスワード)を入力します。

すると、画面に「W12: 警告: ファイルは変更されました」や英語のメッセージが表示されますが、これでファイルの上書きは成功しています。

最後に、そのままEnter(または O などのキー)を押し、以下のコマンドでviを強制終了させます。

:q!

これで、10分かけて書いた設定内容は消えずに、無事にサーバーへ保存されています。

【補足】スワップファイル(.swp)が残っている時の対処

:q! による強制終了や、セッションの異常切断を繰り返していると、vimが作業中のバックアップとして作成するスワップファイル(.swp)が残ることがあります。

次回同じファイルを開いた際に、以下のような警告が表示された場合がスワップファイルが残っているサインです。

E325: ATTENTION Found a swap file by the name "/etc/.xxxxx.conf.swp"


このまま作業を続けると二重編集のリスクがあります。以下の手順でスワップファイルを削除してから開き直しましょう。

# スワップファイルを確認する(ファイルと同じディレクトリに隠しファイルとして存在) $ ls -la /etc/ | grep '\.swp' または $ ls -la /etc/ | grep -F '.swp' # スワップファイルを削除する $ sudo rm /etc/.xxxxx.conf.swp # 改めてファイルを開く $ sudo vi /etc/xxxxx.conf


本記事のまとめ

状況 対処コマンド
まず権限と所有者を確認する ls -l ファイル名
諦めてやり直す(保存せずに強制終了) :q!
自分のファイルに強制上書きする :wq!
パーミッションが読み取り専用になっている chmod u+w ファイル名 後に開き直す
sudoを忘れたが、今の編集を強制保存したい :w !sudo tee % の後 :q!
スワップファイルの警告が出る rm .ファイル名.swp で削除後に開き直す

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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


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