6.5秒で起動する日本語対応Vimマシンを作った

これは何?

Raspberry Pi は高性能で比較的安く、面白いボードですが、標準のRaspberry Pi OSだと起動時間が遅いのがネックです。

起動時間を早くする方法はいろいろあるのですが、ここではBuildrootを使ってシンプルなイメージを作る事で、高速起動を実現してみました。

シンプルなイメージということで、今回は「日本語入力ができるVim環境」の構築目指すことにしました。

※と言ってもBuildrootを普通に使っただけでそこまでの最適化は行っていないです。

(今値段を見てびっくり、半導体不足の影響ですね、、今は買わないほうがよさそうです・・)

Buildrootによるイメージの作成

f:id:inajob:20220331222650p:plain

先人の知恵を借りてBuildrootを使ってイメージを作成します。

以下の記事の内容が非常に簡潔でそのまま真似しました。

qiita.com

そのまま、と書きましたが実際にはWindows PCの上で動くDockerの中で実行しました。

コマンドを列挙するとこんな感じです。

# dockerでubuntuの環境を作成
$ docker run --rm -it ubuntu bash

# apt-get update
# apt-get install wget make build-essential gcc g++ bzip2 cpio unzip rsync bc libncurses-dev file
# wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz
# tar xJvf buildroot-2022.02.tar.xz
# cd buildroot-2022.02
# make raspberrypi0_defconfig

ここまでが準備です。

必要なパッケージをインストールして、buildroot本体を取得し展開します。

makeを使ってRaspberry Pi Zeroの設定を読み込みます。

他のRaspberry Pi向けのイメージを作る際はmake list-defconfigsを実行してボードを探してみてください。

次に細かい設定を行います。胃かを実行するとCUIで動くメニューが起動します。

# make menuconfig

キーボードを使っていくつか設定を変更します。

f:id:inajob:20220331221730p:plain

今回は最低限の日本語入力ができることを目的としているため以下の設定変更を行いました。

  • Toolchain
    • C libraryを muslに変更
  • Target packages
    • Show packages that are also provided by busybox のチェックを入れる
    • Text editors and viewers
      • vim にチェックを入れる
    • Graphic libraries and applications (graphic/text)
      • fbterm にチェックを入れる
    • Development tools
      • git にチェックを入れる(これはあってもなくても良い)

このあとmakeを実行するとビルドが始まります(数時間かかります)

# make

ビルドが完了すると output/images/sdcard.img が生成されます。

以下のようなコマンドでコンテナからイメージファイルをホストマシンに取り出します。

$ docker cp コンテナのID:/root/buildroot-2022.02/output/images/sdcard.img ./

後は適当なツールを使ってこのイメージをSDカードに焼きます。 (自分はRaspberry Pi Imagerを使いました)

この状態から日本語入力を実現するためのアイデア

普通に考えるとuimなどの日本語変換の仕組みをインストールするのですが、慣れないBuildrootで、これを実現するのはちょっと面倒そうです(やってみると簡単なのかもしれませんが)。

ということで、今回はvim上で動作するskk.vimというのを試してみることにしました。

日本語表示・入力のための下準備

ここからの操作はext3をマウントできる仕組みが必要です。自分は今回使うのとは別のRaspberry Piに外付けSDカードドライブを取り付けてこの作業を実施しました。 (以降~などのパスが出てきますが、これはSDカードを使ってブートした時のパスを表しています、ホストのRaspberry Piのパスではありません。)

日本語表示はfbterm、日本語入力はvim上で動作するSKKで実現します。

日本語表示に必要なttfファイルを~/.fontsに配置します。

自分は源真ゴシック (げんしんゴシック) | 自家製フォント工房 を使いました。ダウンロードしたのちに等幅フォントの「GenShinGothic-Normal.ttf」だけを取り出し上記パスに配置しました。

fbtermの設定(~/.fbtermrc)でGen Shin Gothic Normalを指定することで、このフォントが利用できます (利用できるフォント名は fbterm -v を実行すると確認できます。)

次にvim上で動作するSKKの設定です。

今回は以下を利用します。

github.com

以下のページを参考にセットアップを実施します。

qiita.com

~/.vim以下にgitリポジトリpluginディレクトリをそのままコピーするだけです。

SKKの辞書も上記記事のまま、wgetで取得しホームディレクトリ直下に解凍しておきます。

今回は上記記事を真似てSKK-JISYO.Lを使いました。

~/.vimrcにも上記記事そのままの設定を書きました

let skk_large_jisyo = '~/SKK-JISYO.L'
let skk_auto_save_jisyo = 1

ブート、日本語入力

さて、ここまで準備出来たら、SDカードをアンマウントしRaspberry Pi Zeroに挿入します。

HDMIケーブルでディスプレイに接続、USB-OTGアダプタを経由してキーボードを接続し、電源USBを接続します。

f:id:inajob:20220331222505p:plain

起動するとHDMIケーブルで接続したモニタにコンソールが表示されます。

私の環境では6.5秒程度でログイン待ちコンソールが表示されました。

f:id:inajob:20220331222526p:plain

ログインコンソールにrootと入力するとログインできます。

さらにfbtermと入力し日本語が表示できるようにします。

そして満を持してvimを実行し、挿入モードに入ってCtrl+Jを押してしばらく待つとskk.vimの日本語入力モードに入ります。

f:id:inajob:20220331222545p:plain

ということで、ここまでで 高速起動する日本語入力できる環境を作ることが出来ました。

まとめ

Buildrootを初めて使いましたが、特に工夫しなくても6.5秒で起動するイメージが作れる素晴らしいものでした。

Raspberry Pi 3/4など、もっと性能の良いボードを使えばさらに高速化できると思います。

まだまだ最適化の余地はありますし、SDカードの種類などでも起動の速度は異なると思います。

さらに、vimだけあれば動作するSKK実装を使うことで、簡単に日本語入力環境を作ることが出来ました。

自作のポメラ的なガジェットを作る際にはこの知見が役立ちそうです。

この記事をご覧になっている方で、似たような挑戦をしたことがある方は、ぜひ https://twitter.com/ina_ani に教えてください。