Ubuntu日和

【第19回】Ubuntuが起動しなくなった時の対策あれこれ

誰だって何かを忘れることはある。例えそれが重要なパスワードであっても

 第18回の「Ubuntuが起動しなくなった時にストレージ全体を退避する方法」では、「Ubuntuがうまく動かなくなった」時にデータを緊急退避する方法を紹介した。今回は、実際によくあるトラブルを元に、なんとかして回復する手段を模索してみよう。

 今回は主に次のような問題について言及する。

  • Ubuntuのパスワードを忘れたら
  • Ubuntuにログインできなくなったら
  • ソフトウェアが起動しなくなったら

Ubuntuのパスワードを忘れたら

 おおよそ一般的なPCのOSには「アカウント機能」が備わっており、PCを使うためにはまず「ログインする」必要がある。Ubuntuの場合は「自動ログイン」の機能もあるため、パスワードなしでログインすることも可能ではあるものの、例えばパッケージのインストールやsudoコマンドの実行など、「管理者権限が必要な作業」を実施する際は、やはりパスワードの入力が必要になる。

 普段Windowsを使っているユーザーだと、たまにUbuntuを起動してみると、この大事なパスワードを忘れていることもあるだろう。だが、心配しなくても大丈夫。Ubuntuにはパスワードを覚えていなくても再設定できるモードが用意されているのだ。ただしWindowsと比べると、その手順はあまり初心者向きではないので、少し詳しく解説しよう。

 まずはあらかじめPCの電源を切っておく。ログイン画面であれば、右上の電源マークのアイコンからシャットダウンできる。

ログインできなくても電源オフなら可能だ

 次に電源を入れる時がポイントだ。PCの電源を入れると、まずUEFI BIOSが起動し、次にブートローダと呼ばれる「GRUB」が起動し、最後にUbuntuが起動する流れになる。UEFI BIOSが起動したあと、Ubuntuが起動するまでの間にESCキーを入力して、GRUBのメニューを表示する必要があるのだ。

通常はGRUBのメニュー画面が表示されない設定になっているため、ESCキーで表示する必要がある

 Ubuntuの初期設定だとGRUBはメニューを表示せずにすぐにUbuntuを起動する設定になっている。そのためこのメニューを出すのは結構シビアだ。最近のPCだとおそらく起動したらベンダーのロゴが表示されるだろう。ロゴが表示されたら、ひたすらESCキーを連打しよう。押しっぱなしよりも連打のほうが確実だ。上図の画面が出れば成功となる。もし次の図のようにGRUBのプロンプトが出てしまったら、「normal」と入力し、エンターキーを押して、すぐに1回だけESCキーを押すとメニューが復帰する。

GRUBのプロンプトが表示されたら、「normal」と押してエンターキーの直後にESCキーを一度だけ押そう

 どうしてもGRUBメニューが表示されないなら、Ubuntuの起動途中に電源を切るという荒業もある。起動の途中でUbuntuのロゴが表示されたら、その場でPCの電源ボタンを長押しするかリセットボタンを押そう。次の起動時は「起動の途中で失敗した」と判断して、GRUBメニューを30秒間表示するモードになる。

 メニューが表示されたらカーソルキーで「Advanced options for Ubuntu」を選び、次に「recovery mode」と書かれている上から2番目のメニューを選択しよう。おそらく「recovery mode」は2番目と4番目に表示されるはずだが、どちらを選んでもかまわない。

recovery menuはどちらを選んでもかまわない

 しばらく待つと、次のようなメニューが表示されるので「root Drop to root shell prompt」を選択する。

リカバリモードに入ったので、「root Drop to root shell prompt」を選択する

 あとは画面の指示に従ってエンターキーを押せば、管理者権限でCLIを操作できるようになる。次の手順でアカウントのパスワードを再設定しよう。

アカウント「foo」のパスワードを再設定する
# passwd foo
New password: (新しいパスワードを入力)
Retype new password: (上記と同じパスワードを再度入力)
passwd: password updated successfully

 パスワードを再設定できたら「reboot」コマンドでシステムを再起動する。ログイン画面が表示されたら、先ほど設定したパスワードを入力しよう。無事にログインできるようになったはずだ。

 このようにUbuntuのパスワードは、「知識のある人がマシンの前にいると、無理やり再設定できてしまう」ものである。Ubuntuに限った話ではないが、あまりシステムのパスワードだけを信頼しすぎてはいけない。セキュリティを考えるなら、他人にPCを物理的に触らせない、大事なデータは暗号化ストレージに配置する、セキュリティキーを活用するなど、ほかの対策も必要であることは念頭に置いておこう。

Ubuntuにログインできなくなったら

 パスワードを覚えていても、Ubuntuのログイン画面からログインしようとすると、画面が固まったり、もう一度ログイン画面に戻ってしまうことがある。これはログインしたあとに自動的に起動するプログラムのいずれかに問題が発生していると考えられる。

 まずは、純粋にログインできるかどうかを確認してみよう。キーボードから「Ctrl-Alt-F3」を押すと、黒い画面に「login:」と表示されるはずだ。ここから通常のユーザー名とパスワードでログインしてみよう。

仮想コンソールを表示した様子

 これは「仮想コンソール」と呼ばれるもので、Ubuntuだと初期設定で最大6個のコンソールが用意されている。つまり「Ctrl-Alt-F1」から「Ctrl-Alt-F6」までを順番に切り替えられてそれぞれ独立して使えるというわけだ。このうち一部はログイン画面とデスクトップ環境で使っている。よってとりあえず「F3(tty3)」以降を使っておくのが無難だ。

 ちなみにこの環境では「日本語は文字化けして表示される」点に注意しよう。fbtermなどを使って回避することも可能だが、一時的に使うだけなら気にしないという手もある。

 いずれにせよこれでログインできるなら認証部分には問題ないことがはっきりする。そうすると、ログインしたあとのどこかで問題が発生していると考えられる。ここからはケースバイケースになってしまうのだが、一般的にはまずはログイン時のログを確認するのが定石だ。

ユーザーセッションのログを確認する方法
$ journalctl --user -r

 赤字で何かエラーが頻発しているようなら、そこからたどると原因がわかることも多い。ただし、Ubuntuのバージョンによっては「gnome-session-binary」のエラーなど、通常時でも起きているものもあるので注意が必要だ。ほかにも「/var/log/apt/history.log」を確認して、直近にインストールされたパッケージを削除するのも1つの手だろう。

 どうしても原因がわからない場合は、「もう1つアカウントを作ってみる」のも手だ。具体的には仮想コンソールから次のようにコマンドを実行する。

CLIからアカウントを追加し、管理者権限を付与する方法。「LANG=C」を付けておくとCロケールになるため、文字化けせずに済む。
$ LANG=C sudo adduser アカウント名
[sudo] password for shibata: (sudoコマンドを実行しようとしているユーザーのパスワードを入力)
Adding user `アカウント名' ...
Adding new group `アカウント名' (1001) ...
Adding new user `アカウント名' (1001) with group `アカウント名' ...
Creating home directory `/home/アカウント名' ...
Copying files from `/etc/skel' ...
New password: (追加するユーザーのパスワードを入力)
Retype new password: (上記と同じパスワードを入力)
passwd: password updated successfully
Changing the user information for debug
Enter the new value, or press ENTER for the default
        Full Name []: (空でも良いが、ユーザーのフルネーム等のわかりやすい名前を入れておくと良い)
        Room Number []: (以降は空のままEnterでも問題ない)
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
$ LANG=C sudo gpasswd -a アカウント名 sudo
Adding user debug to group sudo

 2行目は作成したアカウントを「sudoグループ」に所属させている。このグループに所属しているアカウントのみが、sudoコマンドを使って管理者権限を取得できる。新規アカウントが管理者権限を必要としていないのであれば不要だが、トラブルシューティング用であれば付与しておいたほうが良いだろう。

 アカウントができたら「Ctrl-Alt-F1」でログイン画面に戻り、新しいアカウントでログインを試してみる。これでログインできるようなら既存アカウントの設定に何か問題があると考えられる。その場合は、次の「ソフトウェアが起動しなくなったら」の手順を参考にしてほしい。

 ちなみにこの仮想コンソールからログインする方法はデスクトップが固まってしまったときにも使える可能性がある。デスクトップが固まるのは「カーネルやドライバが固まる」ケースと「GUI関連のコンポーネントが固まる」ケースにわけられるが、後者であればキーボード入力は効くはずなので、別途ログインできるというわけだ。うまくログインできれば、怪しいプロセスを終了させるか、次のコマンドでデスクトップを再起動するという手が使える。

$ sudo pkill -HUP gnome-shell

 ただし未保存のデータは失われる点については注意が必要だ。

 アカウント作成については、緊急対策用にあらかじめ作っておいてもいいかもしれない。別案としては「openssh-server」パッケージをインストールして、SSHでログインできるようにしておくという手もある。特にWindowsマシンと併用している場合、CLI操作に慣れているならSSHは便利なツールになるからだ。

ソフトウェアが起動しなくなったら

 あるソフトウェアを起動すると、ウィンドウが表示されない、表示されてもすぐに消えるようなケースに遭遇するかもしれない。もしそのソフトウェアが少し前までは問題なく動いていたとしたら、考えられるのは「バージョンアップで何か不具合が発生した」か「設定ファイル等が破損して、起動時にエラーになってしまっているか」のいずれかの可能性が高い。

 Ubuntuの場合、パッケージをダウングレードする方法は用意されているものの、「初心者が安全にできる」ほどにはなっていない。どうしてもCLI操作依存になってしまうことと、ほかのパッケージとの依存関係を適切に保ったままとなるとそれなりに知識が必要になるため、あまりおすすめはしない。

 一番手っ取り早いのは「Ubuntuにログインできなくなったら」で紹介したように、アカウントを新規に作ってそれで試してみる方法だ。もし別アカウントだと起動できるようなら、設定ファイルに何か問題が起きている可能性が高い。ログインできているなら「設定」アプリケーションの「ユーザー」から「ロック解除」ボタンを押すと、「ユーザーを追加」ボタンが有効化されるので、そこから設定しよう。

設定アプリケーションの「ユーザー」からユーザーの設定管理が行える

 Ubuntuの場合、GUIアプリケーションの設定はおおよそ「/.config」、「/.local」、「/.cache」のいずれかに集約されている。ここで「/」は、ユーザーのホームディレクトリを示す。また、アプリケーションによっては「~/.XXX」といった感じの任意の名前のファイルやディレクトリを使っている場合もある。これらを総称して 「ドットファイル」 と呼ぶ。

 端的に言うと、このドットファイルを別のディレクトリに退避した上で、アプリケーションを起動し直すと、問題なく起動できる可能性が高い。ただし、ドットファイルにはWebブラウザの設定など、安易には消すべきではないファイルも含まれているので注意が必要だ。よって、適当なディレクトリにコピーした上で試すことを強くおすすめする。

 デスクトップ環境でファイルやディレクトリを操作できる「ファイル」アプリケーションは、「Ctrl-H」を押すことでドットファイル表示のオンオフができる。

Ctrl-Hでドットファイルを表示した状態

 これらのドットファイルの中身で、関連しそうなディレクトリをまるごと退避してアプリケーションを起動してみると良いだろう。もしそれで復活するようなら設定ファイルの問題ということで確定だ。その先は、古い設定ファイルをリカバリするかどうかはアプリケーションに依存する。最悪手動で設定なんとかするしかないことは覚悟しておこう。

 Ubuntuに限らずLinuxは、「ソフトウェアのソースコードが公開されているから、トラブルが発生しても自分でなんとかできる」という点がメリットとしてあげられることが多い。これは実際に真実であるし、Ubuntuの場合、任意のソフトウェアのソースコードを、コマンド1つでインストールできるし、エラーメッセージとソースコードをにらめっこしたら、本質的な問題が判明し自力で解消する、もしくは状況を報告することで解消されることも多い。しかしそれはあくまでソースコードを読める立場の意見でしかない。

 一般的な多数のユーザーは、そもそもソースコードを読めないし、能力のある人でも読もうとは思うかどうかは別だ。簡単に回避できる方法があれば、そちらを使いたいことも多いだろう。残念ながらUbuntuについては、これらのトラブルが起きた時の定形作業は、「初心者でも簡単に解決できる」状態にまでは至っていない。それでも今回紹介したテクニックを覚えておくと、いざというときに役に立つこともあるはずだ。

 もちろん、こんなテクニックにお世話にならないのが一番なのだが。