Ubuntu日和

メモリ消費800MB以下。脱GUIで省メモリな日本語環境の可能性を探る

 昨今、メモリを始めとしたPCパーツの値上がりが目ざましい。こんな状態なのでPCやパーツは買い控え、しばらくは古いマシンを復活させて凌ごうという方も多いだろう。だが古いマシンで最新のOSやアプリを動かそうとすると、どうしてもスペック不足の問題が浮上してくる。そこでこの機会に、より軽量な環境を追求してみるというのも悪くない。

 さて、クライアントPCで最もリソースを消費するのは、デスクトップ環境とGUIアプリだ。

GUIゆえに人はメモリを足さねばならぬ! GUIゆえに人はグラボを買わねばならぬ! こんなに苦しいのなら……GUIなどいらぬ!

 と昔の人が言ったかどうかは諸説あるが、今回は思い切ってGUIを捨て、CLIだけで快適な日本語環境を作れないか試してみよう。

Ubuntu Serverのインストール

 まずはGUIのないUbuntuということで、サーバー版をインストールしよう。第26回を参考に、適当なPCにサーバー版をインストールしてもらえればいい。今回はテーマに沿って少し古めのミニPC、BeelinkのEQ12を使ってみた。筆者宅でもサーバーからは既に退役し、こうしたネタの検証機として押入で絶賛待機中のマシンだ。

起動したサーバーコンソール。これからこいつを日本語化していく

KMSCONと日本語フォントのインストール

 ご存知の通り、通常のLinuxサーバーの物理コンソールは、ロードできるフォント数などの制限により日本語を表示できない。なので日本語環境構築の第一歩は、こいつを日本語表示可能にするところから始まる。従来、コンソールで日本語を表示するには、フレームバッファデバイスを利用したfbtermなどを使うケースが多かった。だが現在ではカーネルモード設定(KMS)を利用した、コンソールのユーザー空間実装である「KMSCON」を使うのがよいだろう。まずは以下のコマンドでkmsconパッケージと、日本語フォントをインストールしよう。

$ sudo apt install -U -y kmscon fonts-noto-cjk

 次にKMSCONの設定ファイルを作成する。ここではフォントをNoto Sans Monoに、サイズを16に設定している。このあたりはお好みで変更してほしい。

$ sudo mkdir /etc/kmscon
$ cat <<EOF | sudo tee /etc/kmscon/kmscon.conf
font-name=Noto Sans Mono CJK JP
font-size=16
EOF

 日本語ロケールの作成と設定を行なう。

$ sudo locale-gen ja_JP.UTF-8
$ sudo update-locale LANG=ja_JP.UTF-8

 そして最初から動いているgettyを止める。

$ sudo systemctl disable getty@tty1.service

 ここまでできたら、Ubuntuを再起動しよう。すると以下のようにログインプロンプトが表示されるが、よく見るとフォントが変化していることに気づくだろう。

実際にログインしてみると、日本語が綺麗に表示されるのが分かる

 このように正しく日本語が表示されていればインストールは完了だ。

CapsLockをCtrlとして使う

 Linuxのシェルでは、Ctrlキーを非常に頻繁に押すことになる。だが一般的なキーボードはAの左隣はCapsLockのため、使いにくいと感じる人も多いだろう。筆者もその一人だ。以下のコマンドを実行して、kmscon.confにxkb-optionの設定を追加しよう。KMSCONを再起動すると、CapsLockキーがCtrlキーになっているはずだ。

$ echo "xkb-options=ctrl:nocaps" | sudo tee -a /etc/kmscon/kmscon.conf

Vimの表示が崩れる問題を解決する

 UbuntuのKMSCONは、環境変数TERMにxterm-256colorをセットして起動する。だがこのままでは、一部のアプリで表示が崩れることがある。具体的な例がVimだ。この設定はsystemdのユニットファイルで行われているため、オーバーライドを作成して修正するといいだろう。以下のコマンドを実行する。

$ sudo systemctl edit kmsconvt@tty1.service

 するとテキストエディタが開くので、「### Anything between here and the comment below will become the contents of the drop-in file」と「### Edits below this comment will be discarded」の間に、以下のような3行を追加しよう。

### Editing /etc/systemd/system/kmsconvt@tty1.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

# ↓の3行をここに追記する
[Service]
ExecStart=
ExecStart=/usr/bin/kmscon "--vt=%I" --seats=seat0 --no-switchvt --login -- /sbin/agetty -o '-p -- \\u' - screen-256color

### Edits below this comment will be discarded

 保存してエディタを終了したら、以下のコマンドを実行してKMSCONを再起動しよう。Vimも正しく表示されるようになるはずだ。

$ sudo systemctl daemon-reload
$ sudo systemctl restart kmsconvt@tty1.service

Byobuのセットアップ

 最近のKMSを利用したコンソールは、ディスプレイに合わせた適切な解像度で表示される。そのため4Kディスプレイなどを使っていると、左上にぽつんとプロンプトが表示され、非常にスペースがもったいない。そこで画面を分割して、あたかもタイル型のウィンドウマネージャーのように運用できるようにしよう。

 それには第12回でも紹介したByobuを使うのが簡単だ。この記事を参考に、Byobuのセットアップをしておこう。筆者のおすすめは、Ctrl+AをEmacsモードにした上で、PrefixキーをCtrl+Zにする設定だ。あとはよく使うショートカットとして、以下に挙げたものを覚えておくと便利だ。

Byobuのショートカット意味
Prefix + Ctrl+Cウィンドウの作成
Prefix + Ctrl+N次のウィンドウに移動
Prefix + Ctrl+P前のウィンドウに移動
Prefix + Ctrl+Kウィンドウの削除
Prefix + Ctrl+%ウィンドウを左右に分割
Prefix + Ctrl+\|ウィンドウを上下に分割
Prefix + O次の分割領域に移動
Prefix + カーソルキー指定した分割領域に移動
Byobuを使えば4Kディスプレイの広大なコンソールに、これだけシェルを並べることもできる

コンソールで使えるファイルマネージャー

 PCで日常的に行なう作業の代表例が、ファイル操作だ。CLIでは、当然だがファイル操作もコマンドで行なう。だが面倒なので、便利なファイルマネージャーを導入しよう。筆者お勧めのファイルマネージャーは、Midnight Commander(mc)だ。おそらくLinux界隈でもっとも有名な、コンソール向けファイルマネージャーだろう。王道の2ペイン式インターフェイスを持っており、内蔵ツールも多く非常に多機能だ。mcパッケージでインストールでき、同名のコマンドで起動する。詳しい使い方はこちらだ。

$ sudo apt install -U -y mc
$ mc
迷ったら、とりあえずmcから始めておけば間違いない。そのくらいの鉄板だ

 実はLinuxのコンソール向けファイルマネージャーの実装は非常に多い。mc以外ではfdcloneや、非常に軽量でカスタマイズ性の高いnnnなどが有名だ。ぜひ自分に合ったものを探してみてほしい。

日本語入力

 日本語の表示だけでなく、入力もできないと困るだろう。だがコンソールで、デスクトップと同じような日本語IMEを動かすのはいろいろと難しい。そこで登場するのがEmacsだ。

 Emacsは非常に長い歴史を持ち、Unixのプログラマーを中心に人気のあるテキストエディタの1つだ。テキストエディタと言いつつ、Emacsの実態はEmacs LispというLisp言語の実行環境である。EmacsはEmacs Lispで書かれたあらゆるコードを実行できるため、通常のテキストエディタとは思えないほど、幅広い拡張機能が作られているのだ。ファイルマネージャーや電子メールクライアントといった「エディタっぽい定番」はもちろん、チャットクライアント、バージョン管理システム、シェル、Webブラウザ、動画プレーヤー、ゲーム、AIクライアントなど、その変態ぶりには枚挙に暇がない。そして当然のごとく「Emacs上で動く日本語入力システム」が存在する。

 以下のコマンドを実行して、Emacsのコンソール専用版とDDSKKをインストールしよう。DDSKKは、SKKという日本語入力のEmacs向け実装だ。

 Emacsはemacsコマンドで起動できる。

$ sudo apt install -U -y emacs-nox ddskk
$ emacs

 Emacsが起動したら、C-x C-f(これはCtrl+xキーを押した後に、Ctrl+fキーを押すという、Emacs独特のキーコンビネーションを表す)を押そう。ファイル名を入力するミニバッファが開くので、適当な新規ファイル名を入力してEnterを押す。これで空のバッファ(入力領域)が開かれる。空の編集用バッファが開いたら、今度はC-x C-jを押す。するとモードライン(最下部にある、いろいろな情報が表示されている行だ)の左側の表示が「かな」となる。これでDDSKKが起動し、日本語入力の準備は完了だ。

 SKKは非常に特殊な入力方式を持っており、通常はひらがなやカタカナが確定された状態で入力される。一般的なIMEであれば、ここからスペースキーで漢字変換を行なうのだが、そういうことはできない。では漢字を入力したい時はどうするかと言えば、漢字や送りがなの開始時点でShiftキーを押しながらキーを入力するのだ。これでひらがな確定入力モードから、漢字変換モードに遷移する。たとえば「ここでは着物を脱いでください」と入力したい場合は、「kokodeha Kimono wo NuI dekudasai」と入力するわけだ。

コンソールでも日本語入力ができる。そう、Emacsならね

 Emacs上でAlt+xキーを押すと、コマンドを実行するためのミニバッファが開く。ここに「skk-tutorial」と入力してEnterを押すと、SKKのチュートリアルを行えることも覚えておこう。

 特殊すぎて面倒くさい入力方式だと思うかもしれない。だがSKKには、形態素解析ミスによる誤変換が絶対に起こらないというメリットがある。また「Emacsさえ動けばとりあえず日本語が打てる」というのは、日本語IMEが存在しない環境の、最後の砦になることもあるのだ。

Webサイトを見る

 現在、もっとも重要なアプリといえば、間違いなくWebブラウザだろう。そしてコンソール向けに、テキストベースのWebブラウザというものも存在する。コンソールで動くWebブラウザの定番と言えばw3mだが、w3mはCSSに対応しておらず、JavaScriptも動かないため、さすがに今となっては少しつらい。そこで今回はCSSを解釈でき、JavaScriptも動かせるChawanというブラウザを試してみよう。

 ChawanはDebパッケージが公開されており、以下のコマンドでダウンロードとインストールができる。

$ wget https://git.sr.ht/~bptato/chawan/refs/download/v0.3.3/chawan-0-3-3-amd64.deb
$ sudo apt install ./chawan-0-3-3-amd64.deb

 chaコマンドに続いて、表示したいWebページのURLを指定して実行しよう。コンソール内にテキストでWebページが表示される。

$ cha https://pc.watch.impress.co.jp
Chawanで表示したPC Watch

 残念ながら、コンソールの文字表示領域中に画像を直接表示することはできない。だがCSSを解釈してくれるため、それなりに見られる。w3mを知っている人からすると、かなり「アリ」なのではないだろうか。

画像を表示する

 先ほど述べた通り、コンソール内に画像を直接埋め込んで表示はできない。だがどんな画像かの確認くらいはできた方が便利だ。というわけで、コンソールにおける画像の確認方法を紹介する。まず以下のコマンドでchafaパッケージをインストールしよう。

$ sudo apt install -U -y chafa

 chafaは画像を、コンソールでの表示に適した形式に変換してくれるコマンドだ。使い方は簡単で、chafaコマンドの引数に、表示したい画像ファイルを指定するだけだ。例として、このページの左上にあるPC Watchのロゴを表示させてみた。

……まあ、雰囲気は伝わるのではなかろうか?

 実用的かと言われれば全然そんなことはないのだが、鑑賞用ではなく確認用だと考えれば、それほど悪くないのではないだろうか。

動画を再生する

 信じられないかもしれないが、コンソールでも動画/音声が再生できる。それも前述の画像のように残念な感じではなく、かなりイイ感じにだ。以下のコマンドでmpvとalsa-utilsパッケージをインストールしよう。

$ sudo apt install -U -y mpv alsa-utils

 mpvコマンドの引数に再生したい動画ファイルを指定すればいい。この際動画の出力先を指定する「--vo=drm」オプションと、音声の出力先を指定する「--ao=alsa」を指定しておこう。

$ mpv --vo=drm --ao=alsa video.mp4

 なおデフォルトでは音量の設定や出力デバイスの選定が悪く、音声が再生されない場合がある。文字数の都合で詳しい手順は省かせてもらうが、その場合はまず「alsamixer」コマンドでボリュームがミュートになっていないか確認してみよう。また「aplay -l」コマンドで音声を出力したいデバイスの番号を調べた上で、mpvコマンドに「--audio-device=alsa/plughw:0,3」といったオーディオデバイスを指定するオプションを追加してみよう。


 いかがだろうか。ちなみにこれだけ色々と動かしてみた状態の、メモリ使用量をモニターしたのが以下のグラフだ。OS本体とここで紹介したコマンド群にくわえて、Dockerでリソース監視システムも動作させているが、メモリ使用量は800MB以下だった。

GUIを使わなければ1GB未満のメモリでも、これだけ充実した(?)日本語環境が構築できるのだ

 いや、みなまで言わなくても分かっている。さすがに筆者も、この環境を一般的なデスクトップの代わりに常用できるとは思っていない(筆者的にはアリよりではあるが……)。だがサーバーのコンソールであっても、大画面にきれいな日本語表示ができ、動画や音楽の再生も可能だということは、知っておいても損はないだろう。今回紹介したByobuやさまざまなCLIツールの使い方は、デスクトップ上でターミナルエミュレーターを使う際にも応用が効く。実際「GUIのWebブラウザは使うが、それ以外の作業のほとんどはターミナル内で行なう」タイプのエンジニアも珍しくない。

 もし普段からターミナルを使っているのであれば、こうしたCLIの可能性を追求してみるのも面白いのではないだろうか。