素人が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むずかしい