vi(vim)で「readonly」エラーの対処法 sudoを忘れた編集を消さず保存する方法(強制保存の裏技も)

HOMEリナックスマスター.JP 公式ブログLinuxエラー対処法 > vi(vim)で「readonly」エラーの対処法 sudoを忘れた編集を消さず保存する方法(強制保存の裏技も)

図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
vi(vim)のエラーでよくあるものの一つに「readonly」があります。「設定ファイルを10分かけて書き直したのに、保存しようとしたらreadonlyエラー」Linuxを触っていると、誰もが一度は経験します。

この記事では、viエディタ(vim)で「E45: 'readonly' オプションが設定されています ( ! で強制書き込み)」というエラーが出た原因と、その状況から抜け出すための具体的な対処法を解説します。

せっかく書いた内容を消さずに強制保存する「現場の裏技」も紹介しますので、今まさに画面の前で焦っている方はぜひ試してみてください。

E45:'readonly'オプションが設定されています(!で追加上書き)の例

vim_readonly.jpg

なぜ「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 で削除後に開き直す

viの操作ミスや権限エラーで、無駄な時間を過ごしていませんか?

Linuxのファイル権限(パーミッション)やviエディタの操作は、現場で最もよく使うにも関わらず、独学だと「なんとなく」の操作になりがちです。一歩間違えるとシステム設定を破壊してしまうこともあります。
現場で通用する正しいLinuxの"型"を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

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

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

<<関連記事>>
・Ubuntu20.04+Apacheのインストールエラー対策
・rpmdbが壊れた場合の修復手順
・FortiGuardのスパムメールブロックを解除方法
・LinuxにUSB外付けHDDを接続する(NTFSフォーマットの場合要注意)
・yumコマンドがロックファイルエラーになった時の対処


図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る