CUI Debianの実機操作時の日本語表示(fbterm)
筆者はDebianを使い始めて10年ぐらいたつのですが、CUIのOSをインストールした実機を直接操作する際のメッセージが日本語にできないことを諦めていました。
たいていはsshを使うので直接操作する機会も少ないですし、使う場合も LANG=C を入力して英字のメッセージにすれば特に問題なかったのが、その理由です。
かつて挑戦したこともありましたが、うまくいかず諦めていました。
筆者が以前挑戦した時は jfbterm という専用のコンソールが標準レポジトリに存在しなくて困った記憶があります。jfbtermはUTF-8に対応していなかったので、レポジトリから外れたようです。メンテナンスはされていないようですが、今でもgithubには存在しているみたいです。
というかGUIでも日本語がでず、いまは開発が終了した日本語OSであるVine Linux使った記憶もあります。
思い出話はさておき、最近になってその事をChatGPTに聞いてみたら普通にできるとの事でしたので、忘れないようにここに記しておきます。
設定方法
先に方法を紹介しますと、fbtermとfonts-noto-cjk をインストールして、rootでfbtermを実行し、そこからlocaleを変更すれば直接操作時も日本語表示が可能になります。
fbtermとGoogle Noto Fontをインストールします。
# apt install fbterm fonts-noto-cjk # fbterm (fbterm)# export LANG=ja_JP.UTF-8 (fbterm)# export LC_ALL=ja_JP.UTF-8 ...
インストーラーから日本語を選択してインストールしていれば不要だと思いますが、localeをja_JP.UTF-8に設定をしていない場合は、fbtermでの処理の前に次の処理を実行しておきます。
# apt install locales # dpkg-reconfigure locales ...続く画面で ja_JP.UTF-8 を追加
sshでは表示される理由
以下では、直接操作時のコンソールを「標準コンソール」と表します。
設定はできましたが、なぜ今まで標準コンソールでは日本語表示が出ないのにWindowsからのsshでは出ていたのか、という筆者長年の謎をChatGPTに続けて聞いてみました。
理由は、標準コンソールだからそうです。元も子もない回答ですが。
言い換えれば、標準コンソールは依存を少なくし安定させる必要があるため余分な機能を持たせないということです。
標準コンソールでもsshでもアプリは指定された文字コードでレスポンスを返します。
標準コンソールは、レスポンスのバイトストリームをそのまま文字番号ストリームとしてカーネルに渡し、カーネルは対応するビットマップフォントを描画します。(1バイト単位の0~255の数値にしてそのまま渡すイメージです)
sshは、レスポンスはそのまま上位のOSへ渡され、OSが解釈と文字の描画をします。これらの処理はカーネル空間では行われません。クラッシュしても被害は限定的なので、TTFの描画といったの複雑な処理を扱うことができます。
参考:コードポイントと文字コードについて
コードポイントとは、主にUnicode体系で使われるすべての文字に一意に割り当てられた整数値のIDです。
文字コードは、コードポイントをどうやって(0と1の2進数で)表すかということです。これがエンコーディングの語源になっています。
上記の標準コンソールにおける説明で「文字番号」としたのは、カーネル内にマップされている文字のIDで「コードポイント」とは意味が違うからです。
fbtermのしくみ
ここまで「標準コンソール」と言ってきたものは、仮想コンソール(仮想端末)ともよばれカーネル機能の一部です。
仮想コンソール(仮想端末)と似た言葉に、疑似端末というものもあります。
仮想と疑似の区別が混乱しがちですが、先に説明したとおり実機に接続しているキーボードから操作するものを仮想コンソール(仮想端末=TTY)と言います。
本来ひとつだけだった端末(キーボード)を、tty1~tty6まで使えるようにしたところから仮想という名前で呼ばれます。
一方の疑似端末はSSH接続などで割り当てられる、実際には存在しない端末を指します。
fbtermは 仮想端末(TTY)上で動く端末エミュレータで、起働させると疑似端末(PTS)を生成するのと同時に、/dev/fb0(フレームバッファ)に文字を描画します。この機能によりユーザー空間でTTFであるnoto fontでの描画をします。こうすることであたかも標準コンソールで日本語が表示されているように見えます。
つまり、やりたいことはできていますが、厳密にいえば標準コンソールで日本語は表示できていないことになります。
仕組みがわかると、標準コンソール上からsshやtmuxを使って疑似端末を生成しても日本語の表示ができるんじゃないか、という疑問が沸き調べてみましたが、残念ながらこれはできないようです。sshやtmuxが描画は起動元に任せる仕様だからです。もちろんfbtermを経由してsshやtmuxを使えば日本語は表示可能です。
オプション
fbterm起動時に -s (--font-size)オプションでサイズを指定する事によりターミナル上でのフォントサイズを変えられます。
他、ANSI 16 色の色番号で文字色と背景色も指定できます。 -f(--color-foreground) -b(--color-background)
CTL+ALT+C でfbtermの新しいウインドウを生成でき、CTL+ALT+Dで破棄、CTL+ALT+1~9でウインドウを指定して移動、CTL+ALT+Eで終了等のショートカットもあります。詳しくはman ページを確認してください。
