💻

mosh を使おうとしたら locale が足りてなかった話

2023/07/15に公開

Proxmox 上でぽんぽん適当に立てては捨てられる LXC Container 環境に出先から SSH で接続するとコンソールのエコーバック (入力した文字が実際にプロンプトの画面上で反映されること) が遅くてちょっと気になってしまい……。
前から気になっていた mosh を入れて使おうとしたらちょっとハマったのでメモ。

mosh をインストールする

LXC Container で動かしているのは Ubuntu Server なので、特に考えることなく apt コマンドでインストール。

$ sudo apt install -y mosh

mosh-server の実行でこける

手元の MacBook Air には Terminus が入ってるので mosh を使うだけなら接続先のホスト設定で mosh をオンにするだけ。

デフォルトで入っている mosh の呼び出しコマンド (特に変える必要はない)

mosh-server new -s -l LANG=en_US.UTF-8

ところが実際に接続してみるとエラーになる。

mosh-server の実行コマンドを手で叩いてみるとこんな感じのエラーメッセージが。

imksoo@ansible:~$ mosh-server new -s -l LANG=en_US.UTF-8
The locale requested by LANG=en_US.UTF-8 isn't available here.
Running `locale-gen en_US.UTF-8' may be necessary.

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment (LANG=C) specifies
the character set "US-ASCII",

The client-supplied environment (LANG=en_US.UTF-8) specifies
the character set "US-ASCII".

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

locale が足りない

エラーメッセージにあるとおり、mosh-server needs a UTF-8 native locale to run. なので、en_US.UTF-8 なロカールを追加することにする。
LXC Container 等の軽量な(シンプルに使えるだけ)のインストールをするとロカールは最小限の C しか入っていないことが多いのでこういうことがおきる。

/etc/locale.gen を編集する

$ localectl list-locales 
C.UTF-8

$ sudo /etc/locale.gen
en_US.UTF-8 UTF-8
をコメントアウト

$ sudo locale-gen
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.

$ localectl list-locales 
C.UTF-8
en_US.UTF-8

ここまでやると、mosh-serverの起動に成功するようになる。

$ mosh-server new -s -l LANG=en_US.UTF-8


MOSH CONNECT 60001 FE5KEUm0A+a0HLy/gUTF0A

mosh-server (mosh 1.3.2) [build mosh 1.3.2]
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[mosh-server detached, pid = 42615]

改めて ssh + mosh で接続する

Terminus で再度接続するとエラーにならずに接続できるようになった。

念のため pstree コマンドで見てみる。

$ pstree
systemd─┬─2*[agetty]
        ├─cron
        ├─dbus-daemon
        ├─login───bash
        ├─master─┬─pickup
        │        └─qmgr
        ├─mosh-server───bash───pstree
        ├─networkd-dispat
        ├─promtail───11*[{promtail}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-network
        └─systemd-resolve

pstree の上に mosh-server 経由の bash がいるので成功している。

(ノ´∀`)ノわーい

Discussion