素人がWSL Ubuntu18.04LTSを日本語化しようとしてミスしたらハメ技を食らった
Ubuntuわからない
そうだ日本語化しよう
英語が苦手なので日本語化します
1.とりあえず最新に保つ儀式
sudo apt update
-パッケージ一覧を更新
sudo apt upgrade
-実際にパッケージを更新
なにかを追加する前にとりあえず唱えておく。
更新しなくていい場合はなにもしなくていいとUbuntu君は判断してくれるので、唱え得。
2.日本語化パッケージの取得
sudo apt install language-pack-ja
-日本語化パッケージをインストール
そのままだ。つまりUbuntuではsudo apt install xxxのxxxにほしいパッケージ名を書けばインストールされるということ(そのままだ)
sudo apt -y install xxx
と-yを入れると途中のyes/no選択肢を全部yesにして自動でインストールできる。
どのようなパッケージが用意されているのかは公式サイトを見れば良さそう packages.ubuntu.com
Ubuntu18.04LTSはbionicというお名前があり、そこを見ると18.04がインストールできるものがたくさん並んでいる。
3.日本語に切り替える
sudo update-locale LANG=ja_JP.UTF8
日本語(ja_JP.UTF8)にする
当然だがインストールした時点ではインストールしただけであるので、日本語にセットする必要がある。
Ctrl+Dで一度終了し、再度起動すれば日本語になっている、はず。
locale
で表示されるものが大体ja_JP.UTF8ならば成功。
成功!
しかし、この成功をつかみ取る道中でタイトルの通りのハメ技を食らった。
/etc/default/localeに不正な値が入って詰みかけた
$ cat /etc/default/locale LANG=ja_JP.UTF8 =ja_UTF8 // おそらくミスタイプが原因で挿入された不正値
日本語設定の方法を調べながら色々試していたら、/etc/default/localeの中に不正値が入って大変なことになった。
上記は状況を再現したもの。
この状態ではsudoコマンドが使えなくなる
具体的にはこのようなエラーが出る。
$ sudo xx// root権限が必要な操作を入力
sudo: pam_open_session: Bad item passed to pam_*_item()
sudo: policy plugin failed session initialization
$
この不具合報告は日本語情報がほとんどなく、同様の報告があるのはこのページしか見つからなかった。
sudoはパスワードを用いた認証でroot権限を与えるみたいな仕組みをしており、pamなんとかがパスワード認証を司っている。
そしてpamは処理の過程で/etc/default/localeを通るので、/etc/default/localeに不正値が入っていると変なことになり、sudoが使えなくなる。
……という認識で多分あっているはず(ubuntu素人なので実際の挙動がわからない、有識者の意見をお待ちしています)
この不具合を直すには、/etc/default/localeを書き換えて不正値を削除すれば良い。
ただし/etc/default/localeを書き換えるにはroot権限が必要
当然ながら/etc/default/localeは読み取り専用ファイルであるので、$vim /etc/default/locale
ではどうやっても書き換えられない。$sudo vim /etc/default/locale
と宣言するとpamが不正値を読み込んでsudoが使えない。$su
や$sudo su
,$sudo -i
もパスワード認証が必要。パスワード認証が必要な処理なので当然動かない。
とんだハメ技じゃないか……
WSLのみ可能な解決方法
WSLはWindowsのサブシステムとしてリナックスを起動するやつである。つまりWindowsのほうが格上なのである(システムの権限的な話です)
Windows側のコマンドプロンプト、もしくはPowelShellを開き以下を記述する
> wsl -u root
これでrootユーザーとしてログインできる。よくわからんができた。そのまま
$ vim /etc/default/locale
して不正値を消し、:wqで保存終了できる。rootユーザーからログアウトした後はsudoは問題なく扱える。
結論
Ubuntuむずかしい