NetBSD Advent Calendar 2020 25日目、最終日の記事です。
今日はNetBSDのインストールやアップグレードを行う時のツール、sysinst(8)の日本語化を試してみたという話を使用と思います。
sysinstの日本語化
基本的にBSD系OSのインストーラは英語でメッセージが多い印象を受けます(FreeBSDについては2.xくらいの頃は日本語インストーラが存在していたような...)。
慣れれば英語メッセージでのインストーラでも何とか利用できる、と言ってしまうと身も蓋もありませんが、やはりNetBSDを試してみよう・新たに使い始めてみようという人向けには日本語インストーラが存在していると親切かと思います。
sysinstのビルド
まずは手元で修正・確認が行えるよう、sysinst(8)をビルドしておきます。
which sysinst
でコマンドが置かれているパスを見ると /usr/sbin/sysinst
となっています。NetBSDのカーネルソースではコマンドのパスに合わせる形で /usr/src/usr.sbin/sysinst
以下にsysinst(8)のコードが置かれています。
以前の記事で紹介した、NetBSDのカーネルビルド環境(ツールチェイン一式)を構築済みであれば、単に /usr/src/usr.sbin/sysinst
ディレクトリで make
コマンド実行するだけでsysinst(8)がビルドできます。
$ 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)の画面が表示されます。最初の画面ではインストーラのメッセージを選択することができ、デフォルトは英語ですが、Deutsch(ドイツ語)やcastellano(カスティーリャ語)などが選択可能になっており、どうやら多言語でのメッセージ表示を行うような機能は搭載されているようです。
さっそくsysinst(8)のソースコードを調べてみましょう。
インストーラの英語メッセージにある、"Installation messages in English"でソースコードを検索してみます。どうやら ./msg.mi.en
と ./arch/amd64/msg.def
というファイルにこの文言が含まれているようです。
$ 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を実行してみると無事に日本語メッセージが表示されました!
比較用に英語メッセージの場合も示しておきます。
ただ、これはユーザランド上で直接 ./sysinst
として実行したものであり、インストール済のNetBSD環境で実行する分には問題ありませんが、最終的に実現したいことはCD-ROM等から起動したインストーラが日本語化されている、という状態にもって行きたいものです。
インストーラの/bin/shからビルドしたsysinstを実行してみる
NetBSDのインストーラでは、ユーティリティメニューから /bin/sh
が実行できるため、そこでビルドしたsysinstを取得して実行する、という方法で試してみます。
インストーラメニューから e: Utility menu
→ a: Run /bin/sh
を選択し、以下の手順でIPアドレス付与、sysinstバイナリのダウンロードを行います。
(この例ではqemu上でNetBSDインストーラを動作させ、ホスト側OSではftpサーバを起動している状態になっています)
# dhcpcd -n wm0
# cd /tmp
# ftp nbsd@10.0.2.2
ftp> get sysinst
ftp> quit
$
$ chmod +x sysinst
$ ./sysinst
日本語メッセージを含めたsysinstを実行すると...派手に文字化けしています...。とはいえコンソールでは日本語が表示できないため、これは予想通りの結果と言えます。
qemuを"-nographic -curses"で起動した場合はどうか?
qemuのオプションには -nographic
-curses
という、端末内でコンソールを表示するものがあります。この方法であれば、単に端末内の文字表示になるため日本語が表示できるかもしれません(じつは試すまではできると思っていました...)。
...が、こちらも文字化けする、という意外な(?)結果になってしまいました...。
このあたりはちょっとよく分かっていませんが、wscons(4)を挟んでsysinstを起動する等で対応できたりするのかもしれません。
まとめ
sysinst(8)のメッセージを日本語化できるかどうか試してみました。ソースコードレベルでは多言語表示が可能となるようにメッセージ定義が分離されていました。ただ、コンソール側で日本語表示をどう実現するかがネックになっているようです。
さいごに
今年も何とかNetBSD Advent Calendar 2020を完走することができました。
これもひとえに皆様のおかげです。私の投稿がだいぶ滞ってしまい、参加者の皆様にはご迷惑をおかけしてしまいました。
ONODERA Ryo様、makoto-fujiwara様、Ebihara Jun様、Carol_815様(投稿日順です)ありがとうございました。
特にONODERA Ryoには今年も数多くご投稿をいだたき、本当に助かりました。ありがとうございます。
今年のAdvent CalendarではNetBSDのリリースアナウンスに記載されている変更点から投稿ネタを探すようにしていましたが、思いのほかいろいろな変更が入っており、個人的には来年はこまめにその辺りをウォッチしてQiitaに投稿できれば良いなと考えております。
今年は様々な事柄が押し寄せる一年でしたが、来年は明るい年であることを望みます。
それでは皆様、今年もありがとうございました。来年もどうかよろしくお願いいたします。