Linux 生コンソールで日本語を表示する

こんにちは、masm11 です。

暇に任せて Linux の生コンソール (window system が動いていない黒背景の画面を私は勝手にこう呼んでいます。window system が動いていようが、コンソールはコンソールなので…) に日本語を表示する設定をしたので、今回はそれをご紹介します。

KMSCON をインストール、起動する

https://wiki.archlinux.jp/index.php/KMSCON

archlinux を使っているので↑このページを参考にしました。

fbdev とか drm2d とか drm3d とか書いてあって、「…?」となりましたが、 自分の PC で何が動いているのかの確認方法も書かれていないので、 とりあえず無視して進めました。

まず kmscon をインストールします。

sudo pacman -S kmscon

「tty1 で」と書いてありますが、OS が起動して最初の tty は tty1 です。 何かあると詰んでしまう可能性があります。tty2 で動かしてみることにします。

sudo systemctl disable getty@tty2.service
sudo systemctl enable kmsconvt@tty2.service

tty2 に切り替えると、いつもと様子の違う画面が表示されました。 無事動いているようです。 fbdev 云々の条件もクリアしていたのでしょう。

ちょっと確認してみる

…気になりません? 私は気になりました。tty を確認してみます。

% tty
/dev/pts/0

なんと、疑似端末 (pseudo-tty, pty) を使用しているのですね。

上記ページの最初に書いてある、

カーネルの VT 実装をユーザスペースのコンソールで置き換えようという試みです。

これは、こういう意味なのでしょう。

イメージとしては、端末エミュレータを全画面で使用しているようなものでしょうか。 window system のサーバはいませんけど。

設定を続ける

ちょっと操作しづらいので、設定をしてみました。

/etc/systemd/system/kmsconvt@tty2.service.d/cmd.conf に以下のように書きました。

[Service]
ExecStart=
ExecStart=/usr/bin/kmscon "--vt=%I" --seats=seat0 --no-switchvt --xkb-repeat-rate=20 --xkb-options=ctrl:swapcaps --sb-size=100000 --font-size=16

下側の ExecStart=... は、--no-switchvt までは元のコマンドそのままで、 その後ろを追加しました。 ただ、それだけだと ExecStart= の追加になってしまうので、 その上の行に ExecStart= のみを書くことで、一旦クリアしています。

追加した各オプションの意味は以下のとおりです。

  • --xkb-repeat-rate=20

    キーリピートが遅かったので 2.5倍にしました。

  • --xkb-options=ctrl:swapcaps

    ctrl と capslock を入れ替えました。私はいつもこれです。

  • --sb-size=100000

    バックスクロールができるんですね。ただデフォルトの1000行では少ないので、100倍しておきました。

  • --font-size=16

    文字を大きくしました。もう歳でして…

さて、これを反映させるには、以下を実行します。

sudo systemctl restart kmsconvt@tty2.service

フォントを設定

なんかフォントが意図したものと違うな、と思ったら、 いつものフォントは ~/.config/fontconfig/fonts.conf に設定してあるので、ユーザ用の設定でした。 kmscon はシステムの一部として動いているので、システム用に設定する必要があります。

~/.config/fontconfig/fonts.conf を /etc/fonts/local.conf にコピーして、 それを反映させるために以下のコマンドを実行しました。

fc-cache -fv

フォントが綺麗になりました。

結果

これはもう、スクリーンショットでなく写真でお見せします。

f:id:masm11:20211120224208j:plain

いつもの端末と同じ表示です!

問題点

しかし問題もあります。

kmscon からは X は起動しません。/dev/pts/0 はコンソールでないと見なされ、startx がそもそも拒否します。 Wayfire も DRM を確保できなくて起動に失敗しました。

今回の設定では tty1 はいじっていませんので、tty1 からならどちらも起動できます。

環境変数を日本語に設定して window system を起動して、 日本語で出力されるエラーを確認したい場合もありますので、 ここは少し残念です。

tty2 以外にも反映させる

では動作が確認できたので、tty2 以外にも反映させてみます。

sudo ln -s /usr/lib/systemd/system/kmsconvt@.service /etc/systemd/system/autovt@.service

ここで注意です。先程 enable した設定はそのままにしておきます。 これを元に戻すと、autovt 設定が効きませんでした。 また autovt は enable する必要もないようです。 ちょっとよく解らないので、機会があれば仕組みを調べてみたいと思います。

先程設定したものを /etc/kmscon/kmscon.conf に移動させます。

font-name=NasuM
font-size=16
xkb-repeat-rate=20
xkb-options=ctrl:swapcaps
sb-size=100000

フォントはこちらに設定しましたので、/etc/fonts/local.conf は削除しました。 また、systemd 用の追加設定も削除しました。

で reboot します。

なんと、tty1 は今までどおりで、tty2 以降が kmscon になっていました。 これはこれでいいかもしれませんね。window system は tty1 から起動できます。

まとめ

kmscon を導入して生コンソールで日本語を表示できるようにしました。

tty1 は今までどおりで tty2 以降で日本語が表示できるようになりました。 ただ、曖昧幅を全角にする方法は今のところ用意されていないようです。

また、バックスクロールもできるようになりました。 最近の Linux kernel ではバックスクロールが廃止されてて、残念な思いをしていましたが、 これでようやく復活です。

しかし、いいことばかりではなく、kmscon からは X を起動できませんでした。 これについては、tty1 は元のままなので、tty1 から起動すれば良いことにします。

今回、日本語入力については扱っていません。

インゲージではこんな遊べるエンジニアも募集しています。 詳細は以下へ!

https://ingage.co.jp/recruit/