どらめも

なんでもないことをかきます

Ubuntuでログインループになった話

まえがき

最近再起動してないし一回しとくかポチーしたところログインループに陥ったので自分への備忘録、同じようなミスをした人のために記事にしとこうと思います。
環境↓

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

結論

ログインループにハマっている人は長い記事を呼んでいる暇はないと思うので結論を書いておきます。
PATHがバグってコマンドのシンボリックリンクが全て無効になることでguiが立ち上がらなくなっていた
Ubuntu(Linux全般かもしれません)にはhomeディレクトリに.xsession-errorsというgui関連のエラーファイルが存在します。そこを見てみると

/usr/sbin/lightdm-session: 行 33: cat: コマンドが見つかりません
/usr/sbin/lightdm-session: 行 34: truncate: コマンドが見つかりません
/usr/sbin/lightdm-session: 行 106: ls: コマンドが見つかりません
/usr/lib/gnome-session/run-systemd-session: 7: /usr/lib/gnome-session/run-systemd-session: systemctl: not found

と書いてありました。コマンドが機能していませんね。
わからない方のために補足しておくと、コマンドは一部のものを除いてシンボリックリンクと呼ばれる参照のようなものを用いて実装されています。
例えばよく使うコマンドだと

ls

は本来

/bin/ls  

なのです。

cat /bin/ls  

とかするとバイナリが中に入っているのがわかると思います。
長くなりましたが、これによりPATH関係が壊れていることが予想されるので、.bashrcで自分の追加したヤバそうなPATHを削除すると正常に起動するようになりました。詳しい原因などは後述します。
guiが上手くロードされない(cuiubuntuなら大丈夫でログインもできる)人はとりあえずエラーを読むといいと思います。(参考)cuiにはctrl+alt+fn(nはpcによって異なる)で入れるので参考までに。

ぐぐってみた

とりあえず知識が何もない状態だったのでひたすらググってみました。(pcが2台あると便利ですね)その中で原因として上がったのが

  • nvidiaのドライバ問題←8割これ
  • lightdmがバグっている

が多かったですね。 今回ubuntuを動かしていたpcはノートでgpuは積んでいなかったので、その時点でnvidiaの可能性は消えました(ひええ〜)
ところでlightdmとはなんでしょうか私は知りませんでした。ログインとかのguiを作ってくれるやつらしいです。(参考)何もわからずにlightdmのセットアップコマンドを打ちましたが、治りませんでした。(それはそう)ちなみにこの過程でいろんな設定データ(IMEとか)も吹き飛ばしちゃいました、あーあ。

再起動前何をしたのか?

復旧するために可能な限り再起動前に自分のやった原因となりそうなものをを整理してみました。

  • fishをつかってみた(.bashrcにexec fishを記入)
  • PATHを追加した
  • sudo apt update(流石に原因ではなさそう)

linuxでハマった経験が少ないので手探りで色々実験していくことにしました。

原因の特定と解決

上に上げた原因を一つずつ解決していくことにしました。

  • fishを解除する。
exec fish  

を.bashrcから削除しました。すると...?
f:id:doradorasuki:20200324171927j:plain
文字化けとコマンドバグりが起きました。文字化けしているので読みにくいですが多分シンボリックリンクが死んでいます。
とりあえず文字化けを直しましょう。(参考)注意ですが、vim等のコマンドも死んでいるので/usr/bin/vimとかで指定してやりましょう。
ここで一つ疑問が生まれました。fishだとコマンド生きてたのにbashに戻したら全部死んでる...?
原因として考えられるのはfishとbashでは見ているPATH用のファイルが違うからです。ここでまちがってもfishのせいで壊れたとか考えちゃだめですよ。(戒め)

  • PATH関連ファイル

.bashrcにこんなふうに書いてありました(完)

export PATH=$HOME/.nodebrew/current/bin

おかしいところがわかりますか...?この状態で

source .bashrc

をすると、PATH(echo $PATHを実行)が

PATH=$HOME/.nodebrew/current/bin

になりますそりゃ壊れますよね。PATHを追加するのではなく、PATHそのものを書き換えてしまっています。(幸いexportはしていなかったためfishの方ではPATHが壊れることはなかったようです。)exportの意味がわからない人は調べましょう。(参考)
ちゃんと

export PATH=$HOME/.nodebrew/current/bin:$PATH

してやりましょう。

まとめ

今回のループと対処が大変だった原因をまとめると、

  • PATHを誤って壊した
  • fishでそれを隠蔽してしまいわかりにくくなった
  • ubuntu関係の知識の欠落

という感じですね。エラーメッセージはちゃんと読みましょうね〜あと、安易にネットの知らないコマンドコピペして再インストールとかしないほうがいいです(IMEの再設定めんどくさかった...)
それではよきubuntuライフを〜