NetBSDのsysinstインストーラに日本語メッセージを追加してみる

[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd) 25日目、最終日の記事です。
今日はNetBSDのインストールやアップグレードを行う時のツール、[sysinst(8)](http://man.netbsd.org/sysinst.8)の日本語化を試してみたという話を使用と思います。

![nbsd1224_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/f98c561c-906e-5953-9b49-e22382748036.png)
## sysinstの日本語化

基本的にBSD系OSのインストーラは英語でメッセージが多い印象を受けます(FreeBSDについては2.xくらいの頃は日本語インストーラが存在していたような...)。

慣れれば英語メッセージでのインストーラでも何とか利用できる、と言ってしまうと身も蓋もありませんが、やはりNetBSDを試してみよう・新たに使い始めてみようという人向けには日本語インストーラが存在していると親切かと思います。

### sysinstのビルド

まずは手元で修正・確認が行えるよう、[sysinst(8)](http://man.netbsd.org/sysinst.8)をビルドしておきます。

`which sysinst` でコマンドが置かれているパスを見ると `/usr/sbin/sysinst` となっています。NetBSDのカーネルソースではコマンドのパスに合わせる形で `/usr/src/usr.sbin/sysinst` 以下に[sysinst(8)](http://man.netbsd.org/sysinst.8)のコードが置かれています。

以前の記事で紹介した、NetBSDのカーネルビルド環境(ツールチェイン一式)を構築済みであれば、単に `/usr/src/usr.sbin/sysinst` ディレクトリで `make` コマンド実行するだけで[sysinst(8)](http://man.netbsd.org/sysinst.8)がビルドできます。

 * [シェルのワンライナーでNetBSDのカーネルビルド環境を作る方法](https://qiita.com/furandon_pig/items/6445e1cb2a589379069a)

```sh
$ make
...
#    create  amd64/msg_defs.c
[ ! -f msg_defs.h ] || mv -f msg_defs.h msg_defs.oh
MSGDEF=/usr/src/tooldir.NetBSD-9.1-amd64/share/misc /usr/src/tooldir.NetBSD-9.1-amd64/bin/nbmsgc msg.def
```

ビルド時に `msg.def` といったファイルが生成されているようです。
このビルド内容とソースコードをもとに調べてみます。

### sysinstのソースコードを調べてみる

CD-ROMからNetBSDインストーラを起動すると、以下のような[sysinst(8)](http://man.netbsd.org/sysinst.8)の画面が表示されます。最初の画面ではインストーラのメッセージを選択することができ、デフォルトは英語ですが、Deutsch(ドイツ語)やcastellano(カスティーリャ語)などが選択可能になっており、どうやら多言語でのメッセージ表示を行うような機能は搭載されているようです。

![nbsd1224_8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/207c8f90-0d0e-1080-9f27-f9dedf455ec0.png)

さっそく[sysinst(8)](http://man.netbsd.org/sysinst.8)のソースコードを調べてみましょう。 

インストーラの英語メッセージにある、"Installation messages in English"でソースコードを検索してみます。どうやら `./msg.mi.en` と `./arch/amd64/msg.def` というファイルにこの文言が含まれているようです。

```sh
$ find . -type f | xargs grep 'Installation messages in English'
./msg.mi.en:{Installation messages in English}
./arch/amd64/msg.def:{Installation messages in English}
```

`./msg.mi` の「MI」は"Machine Indipendent"の略語となっています。おそらく全アーキテクチャで共通のメッセージをこのファイルで定義しておき、アーキテクチャ毎にメッセージを変えたいような場合は `./arch/amd64/msg.def` でメッセージ定義を上書きする、という構成のようです。

今回はNetBSD-9.1-amd64向けのインストーラで試す予定であるため、 `./arch/amd64/msg.def` を編集してみます。

### msg.defの中身

`./arch/amd64/msg.def` の中身を見てみます。どうやら `message <キー> {<メッセージ>}` という構成でメッセージを定義しているようです。

キー `sysinst_message_locale` のメッセージは `en_US.ISO8859-1` となっています。これはキー名の通りロケールを指定するようなので、日本語メッセージにする場合は `ja_JP.UTF-8` に変更しておきます。

```
  37 message sysinst_message_language
  38 {Installation messages in English}
  39
  40 message sysinst_message_locale
  41 {en_US.ISO8859-1}
```

さらに見てゆくと、 `Yes` 、 `No` というキーや、見慣れた(？)インストーラ起動時のメッセージが出てきます。こちらは `hello` というキーで定義されているようです。

```
  44 message Yes {Yes}
  45 message No {No}
  46 message All {All}
...
  66 message hello
  67 {NetBSD/amd64 9.1
  68
  69 This menu-driven tool is designed to help you install NetBSD to a hard
  70 disk, or upgrade an existing NetBSD system, with a minimum of work.
  71 In the following menus type the reference letter (a, b, c, ...) to
  72 select an item, or type CTRL+N/CTRL+P to select the next/previous item.
  73 The arrow keys and Page-up/Page-down may also work.
  74 Activate the current selection from the menu by typing the enter key.
  75 }
  76
  77 message thanks
  78 {Thank you for using NetBSD!
  79 }
```

### メッセージを日本語化してみる

`./arch/amd64/msg.def` の構造が大まかに把握できたので、試しに `hello` キーに対応するメッセージを日本語化してみます。

単純に英語メッセージ部分を日本語に置き換える感じで良さそうです。また、 `\r` と改行でメッセージに改行を含めることができます。
( `\r` がないと改行を入れても無視され `\n` だと改行が2個入ってしまいます)

```
  40 message sysinst_message_locale
  41 {ja_JP.UTF-8}
...
  66 message hello
  67 {NetBSD/amd64 9.1
  68
  69 このツールはメニュー形式によるNetBSDのインストール、アップグレード作業を補助するように設計されています。\r
  70 各メニュー項目はa,b,cといった文字入力で選択可能です。また、CERL+NやCTRL+Pで上下の項目に移動できます(矢印キーやPage-     up、Page-downキーでも同様の操作が可能です)。\r
  71 選択しているメニュー項目はEnterキーの入力で起動します。
  72 }
  73
  74 message thanks
  75 {NetBSDをご利用いただきありがとうございます！(^_^)/
  76 }
```

上記の修正を入れたのち、再度 `make` を実行してsysinstを生成します。

### 日本語表示を確認する

生成されたsysinstを実行してみると無事に日本語メッセージが表示されました！

![nbsd1224_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/f98c561c-906e-5953-9b49-e22382748036.png)

比較用に英語メッセージの場合も示しておきます。

![nbsd1224_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/862f9641-51fd-5182-8d53-a59a9f84ab13.png)

ただ、これはユーザランド上で直接 `./sysinst` として実行したものであり、インストール済のNetBSD環境で実行する分には問題ありませんが、最終的に実現したいことはCD-ROM等から起動したインストーラが日本語化されている、という状態にもって行きたいものです。

### インストーラの/bin/shからビルドしたsysinstを実行してみる

NetBSDのインストーラでは、ユーティリティメニューから `/bin/sh` が実行できるため、そこでビルドしたsysinstを取得して実行する、という方法で試してみます。

インストーラメニューから `e: Utility menu` → `a: Run /bin/sh` を選択し、以下の手順でIPアドレス付与、sysinstバイナリのダウンロードを行います。
(この例ではqemu上でNetBSDインストーラを動作させ、ホスト側OSではftpサーバを起動している状態になっています)

```sh
# dhcpcd -n wm0
# cd /tmp
# ftp nbsd@10.0.2.2
ftp> get sysinst
ftp> quit
$
$ chmod +x sysinst
$ ./sysinst
```

![nbsd1224_5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/7e89fd0f-3526-6e83-3e22-3b0946d8d791.png)

日本語メッセージを含めたsysinstを実行すると...派手に文字化けしています...。とはいえコンソールでは日本語が表示できないため、これは予想通りの結果と言えます。

### qemuを"-nographic -curses"で起動した場合はどうか？

qemuのオプションには `-nographic` `-curses` という、端末内でコンソールを表示するものがあります。この方法であれば、単に端末内の文字表示になるため日本語が表示できるかもしれません(じつは試すまではできると思っていました...)。

![nbsd1224_7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/6f9af4b6-6841-e7b3-433d-0407bc3bd926.png)

...が、こちらも文字化けする、という意外な(？)結果になってしまいました...。
このあたりはちょっとよく分かっていませんが、[wscons(4)](https://man.netbsd.org/wscons.4)を挟んでsysinstを起動する等で対応できたりするのかもしれません。

## まとめ

[sysinst(8)](http://man.netbsd.org/sysinst.8)のメッセージを日本語化できるかどうか試してみました。ソースコードレベルでは多言語表示が可能となるようにメッセージ定義が分離されていました。ただ、コンソール側で日本語表示をどう実現するかがネックになっているようです。

## さいごに

今年も何とか[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd)を完走することができました。
これもひとえに皆様のおかげです。私の投稿がだいぶ滞ってしまい、参加者の皆様にはご迷惑をおかけしてしまいました。

[ONODERA Ryo](https://qiita.com/ryoon)様、[makoto-fujiwara](https://qiita.com/makoto-fujiwara)様、[Ebihara Jun](https://twitter.com/ebijun)様、[Carol_815](https://twitter.com/Carol_815)様(投稿日順です)ありがとうございました。

特に[ONODERA Ryo](https://qiita.com/ryoon)には今年も数多くご投稿をいだたき、本当に助かりました。ありがとうございます。

今年のAdvent CalendarではNetBSDのリリースアナウンスに記載されている変更点から投稿ネタを探すようにしていましたが、思いのほかいろいろな変更が入っており、個人的には来年はこまめにその辺りをウォッチしてQiitaに投稿できれば良いなと考えております。

今年は様々な事柄が押し寄せる一年でしたが、来年は明るい年であることを望みます。
それでは皆様、今年もありがとうございました。来年もどうかよろしくお願いいたします。