はじめまして、ponです。
今回はタイトルの通り、起動不可状態となったMX Linuxのレスキュー体験についてご紹介いたします🚒🚑
この記事をご覧になっている方と全く同様のケースではないかも知れませんが、皆さんの参考になれば幸いです。
今回のケース
・MX Linux(MX-21.3_x64)をインストールしたPC(Dell Latitude E4310)を使用
・HDMI端子なし、VGA端子のみPCのため、USB-HDMI変換ケーブルを購入
・試行錯誤するがモニタ認識できず
・某英語質問サイトの大海原で迷子になっていたら「GRUB設定に"nomodeset"を追加したらケーブルが使えるようになったぜ!」という記事を見つける
・わらをも掴む気持ちでGRUB設定を更新し再起動
・OS起動不可😇
↑本日のメイン🍽
ということで詳細な手順は後述しますが、先に結論を書いておきます。
結論
・LiveUSBからOS起動してGRUB設定を更新すれば解決できる!
今回発生した事象の再現手順
GRUB設定の更新
それではまず以下ファイルからGRUB設定を見ていきましょう。
/etc/default/grub
※「そもそもGRUBって何?」という方は以下参照
今回は以下2つのパラメータが変更されています。
GRUB_TIMEOUT
それぞれのパラメータの意味、デフォルト値、変更(してしまった)値は以下の通り。
GRUB_TIMEOUT
・意味:既定の起動項目を自動的に起動するまでの間、起動メニューを表示して待機する 時間を秒単位で設定
・デフォルト値:5
・変更値:0
- パラメータが「0」の場合、Linuxのデフォルトメニューで自動起動します。
・意味:起動時/終了時のスプラッシュ画面の設定
・デフォルト値:"quiet splash"
・変更値:"quiet splash nomodeset"
- quiet:ブート時のカーネルイメージ展開メッセージを抑制
- splash:スプラッシュイメージを表示しつつ簡易テキストを表示
- nomodeset:Intelグラフィックス機能を無効にする ←今回の根本原因
上記GRUB_TIMEOUTがデフォルト値のままであれば、まだ以下画面のように起動メニューを選択できる余地があり起動不可を回避する術があったようなのですが、今回は"0"に設定されておりスキップされてしまうため残念ながらN/A。
ファイル編集後、以下コマンドでGRUB設定を更新
sudo update-grub
設定ファイル生成のメッセージが流れてGRUB更新完了。
編集&更新した /etc/default/grub の設定は、 /boot/grub/grub.cfg に反映されます。
あらかじめコピーしておいたファイル /boot/grub/grub.cfg_org と
オリジナルファイル /boot/grub/grub.cfg を比較
"nomodeset" が追記されていることが分かります。
マシンを再起動します(今回はrebootコマンドを使用)
OS起動不可
再起動後、OS起動できるか試してみますがエラーのためOS起動不可となっていることを確認しました。冷静に記述していますが、私はここで何を試してもOS起動できなくなり、某英語質問サイトの大海原で何日も漂流することになりました。絶望の日々の幕開けです。
このまま待っていても永久にOS起動できないので、一旦電源長押し等でマシンを強制終了します。
今回発生した事象の解決手順
LiveUSBの準備
次に、OS起動できない事象をどのように解決したかを解説していきますが、
手順を進める前にLiveUSBを用意します。
※LiveUSBって何?という方は以下をご参照ください。
LiveUSBには、大きく分けて二つの目的があります。
①PCへのインストールを行わずにLinux等のOSを体験できる
②PCへLinux等のOSのインストールを行う
今回はOSを起動状態にするため、上記①の目的でLiveUSBを使用します。
LiveUSBはUSBフラッシュメモリ等でも可能ですが、今回はポータブルHDDにMXLinux(MX-21.3_x64)を入れています(下記MXLinux公式ダウンロードリンク参照)
インストールイメージをダウンロード後、WindowsであればRufus、MacであればbalenaEtcherを使用することでわりと簡単にLiveUSBが作成できます。
詳しい方法はGoogle先生に聞いてください。
LiveUSBを作成した後、本体USB差込口に用意したデバイスを挿入し電源を入れます。
メーカーロゴが表示されている状態で(今回の場合は画面右上に「F12 Boot Option」と表示されている間に)F12ボタンを連打すると、今度はBootオプションメニューに遷移します。
ここではUSB Strage Deviceを選択してLiveUSBから起動します。
最上部のMXLinux起動メニューを選択しましょう。
まだ直ったわけではありませんが、絶望の谷に希望の光が射し込んできた感があります。
Welcomeのポップアップ下部に記載されている
「demoアカウントのパスワードはdemo、rootのパスワードはroot」
という部分は後ほど使用するため覚えておきましょう。
GUIで既存OSの設定ファイルを編集する
LiveUSBでOS起動した状態ですが、実はすでにMXLinuxをインストールしている既存の(起動できなくなってしまった)ディスクにアクセスすることができます。
コマンドラインでもファイル編集が出来ないことはないですが、GUIの方が視覚的に理解しやすいため、今回は*Thunar(ソナー)を操作します。
※Windowsでのエクスプローラ、MacのFinderのようにファイルシステムにアクセスできるGUI
Welcomeのポップアップが写った上記スクリーンショットで言うと、左端のサイドバー3つ目のThunarアイコンをクリックすることで起動できます。
(Windowsキーボードの場合は窓キー押下後「Thunar」と検索、あるいはCtrl+E押下でも起動可能)
Macキーボードでの操作は別途Google先生に聞いてください。
Thunarのサイドバーから(起動できない)MX Linuxがインストールされたディスクを選択すると、demoアカウントのパスワードを確認するポップアップが表示されるので、テキストボックスに「demo」と入力し、Authenticateボタンを押下します。
認証を通過すると、起動不可となっていたMXLinuxのファイルシステムにアクセスできるようになります。/media/demo/rootMX**/とディレクトリパスが表示されている箇所をクリックしフォーカスを当て、末尾に 「etc/default/」と追記しEnterを押下します。
/etc/default のディレクトリへ遷移するので、grubというファイルを見つけて中身を確認しましょう。
GRUB設定変更時に編集したパラメータを見つけたら、一旦以下のデフォルト値に戻しましょう。
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
ファイル編集後に保存しようとすると、再度demoアカウントのパスワードを求められるので、先ほどと同様にdemoと入力しAuthenticateを押下します。
ファイルのパラメータを編集しただけでは実際の設定には反映されません。
念のため、/boot/grub/ にあるgrub.cfgを開いて確認してみます。
(grub.cfgは、/media/demo/rootMX**/boot/grubに配置されています)
ファイル内検索をかけると「nomodeset」の記述が残っていることが分かります。
編集したGRUB設定ファイルの内容を反映するためにupdate-grubコマンドを実施する必要がありますが、そのままターミナルからコマンドを叩いてもLiveUSB上でGRUB更新が行われるだけで、起動できなくなったMXLinuxのディスク上では何も起こりません(ここ大事)
しかし、起動できなくなってしまった既存OSで使っているディレクトリをマウントした後にGRUB更新を行うことで、その問題を解決することができます。
そのためにはまず、起動できなくなったMXLinuxのディスクがどこにあるかを突き止めましょう。
ll /dev/sda* コマンド等で /dev配下を調べてみると、
/sda
/sda1
/sda2
のどれかが怪しいことが分かりますが、なんとか目当てのディスクを判別する方法はないものでしょうか?
実はこれ、簡単に判別することができます。そう…Thunarならね!
もう一度Thunarを起動し、先ほどアクセスした「rootMX**」の上にカーソルをマウスオーバーしてみると、目当てのディスク情報がポップアップします。この場合は(/dev/sda1)に起動できなくなったMXLinuxがインストールされていることが分かります。
起動できなくなった既存OSのディスクをマウントする
「ターミナルでコマンド叩いてもLiveUSB上でしか実行されない…」
という部分は、起動できなくなったディスクをマウントすることで解決できるという説明をしましたが、詳細な手順を見ていきましょう。
※マウントって何?という方はこちらをご参照ください。
マウントの手順は以下Webページを参考にしています。
では、先ほど判別したディスクをマウントしましょう。
sudo mount /dev/sda1 /mnt
ここでもdemoアカウントの認証を求められるので、パスワードを入力しましょう。
ちなみに、sudoコマンドを初めて打つときに表示される3つの警告のうち最後の「大いなる力には、大いなる責任が伴う」というメッセージは、トビー・マグワイアが主人公を演じる映画スパイダーマンの劇中でベンおじさんも引用しています。これから悪と戦うことになるピーターがスパイダーマンとしてコマンドを実行すること、またベンおじさんというアカウントの代わりに叔母さんを守ってくれというメッセージが込められていたのかもしれません。
(そしておそらく彼はLinuxを心から愛していたのでしょう)
他のディレクトリもマウントする必要がある場合は以下コマンドでマウント可能です。
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev /mnt/sys
sudo mount --bind /dev /mnt/proc
ルートディレクトリを先ほどマウントしたディスクの /mnt ディレクトリに変更します。
sudo chroot /mnt
コマンドが成功するとルートディレクトリが変更され、rootユーザーに切り替わります。
念のため、起動できなくなったディスク上にあったファイルを参照してみます。
GRUBの更新
GRUB設定を変更する前にコピーを作成していたファイル(grub.cfg_org)が存在し、chrootコマンドが成功していることを確認できたので、update-grub コマンドでGRUB設定を更新します。
update-grub
最下行でエラーが発生していますが、GRUB設定ファイル自体は問題なく更新されています。
一応、/boot/grub/grub.cfg の中身を確認しましょう。
(LiveUSBから起動した場合、viewコマンドでファイル閲覧中に「:q」でコマンドモードを終了しようとすると、デフォルトのキーボードがUS配列になっており「ファッ!?コロンが打てないっ!?」と混乱するため、前もって日本語配列にしておくと幸せになれます。「俺はnano派!」というな方はスルーしてください)
(grepでも何でも確認できればOK)
デフォルトのコマンドモードで、「/nomodeset」と入力し文字列を検索します。
「nomodeset」という文字列が検出されなかったため、無事にGRUB設定が反映されていることが確認できました。
exit コマンドでログアウトします
マウントしたディレクトリをマウント解除します。
※ /mnt/ 以外のディレクトリをマウントしていた場合は、先にマウント解除します。
sudo umount /mnt/dev
sudo umount /mnt/sys
sudo umount /mnt/proc
最後に/mnt/ ディレクトリをマウント解除します。
sudo umount /mnt/
マウント解除後に再起動を実施します。
再起動中に不穏なエラーメッセージが流れますが、最下部にある指示の通りENTERキーを押下し再起動を進めます。
希望の光
画面が暗転した後、USB差込口からLiveUSBメディアを外しOSの起動を待ちます。
しばらくすると、MXLinuxの起動メニューが現れます。
(先述のGRUB_TIMEOUTのパラメータが「0」に設定されている場合、この画面がスキップされます)
最上部のメニュー「MX .*(インストールしているバージョン)」を選択し、起動を開始します。
しばらくするとログイン画面が立ち上がります。
(長い旅路でした)
ログイン後、データが壊れることもなく無事MXLinuxが復活していることを確認できました。
旅の終わりに
今回は起動できなくなったマシンをLiveUSBから起動し、GUIからファイルシステムを書き換えて運良くGRUB設定を更新することに成功しました。
今回はMXLinuxの場合の解決策をご紹介しましたが、調べてみたところUbuntuのLiveUSBからWindows7のファイルへアクセスしてみたり、
壊れてしまったMacOSのデータを修復した猛者もいるようです。
もちろん普段からこまめにバックアップを取ることが肝要であることは言うまでもありませんが、今回得た知見を活用して他のOSでのレスキューが可能な場面もあるかもしれません。
もちろんLinuxディストリビューションやOS毎に手順の異なる部分はあるかと思いますが、私のように手違いで重要な設定ファイルを弄ってしまった、あるいは原因不明だがOS起動しなくなってしまった…という方々にとって少しでも光明となることが出来れば幸いです。