LILOの使い勝手の向上

2001/10/08
目次
  1. プロンプトとタイムアウト
  2. ラベル
  3. メニュー
  4. グラフィックメニュー
  5. キーボード変換

プロンプトとタイムアウト

 LILOは非常に優れたブートローダなので、マルチブート環境におけるメインのブートローダとして十分使っていける。しかし少なくともデフォルトのままではその使い勝手は決して良いとはお世辞にも言えなかった。メインのブートローダとして頻繁に使っていくにはこれを改善する必要がある。

 私がはじめてLinuxを触ったとき、LILOの寡黙さに驚いた記憶がある。当時現在のようなよくできたインストーラをもったディストリビューションもなく、デフォルトでインストールされるLILOは殆どオプションらしいオプションもないままインストールされた。
 

 LILO

 実際起動してみると、図のように「LILO」と表示されたまま、うんともすんとも言わない。インストール時に確かLinuxとWindows95をデュアルブートに設定して、ラベルをそれぞれ「lin」「win」にしたはずなのに、「lin」とタイプしても、キーが表示もされないし、起動もしなかった。そのうち時間が経つと、勝手にLinuxが起動した。そのときの/etc/lilo.confは以下のような内容だった。

[デフォルトの/etc/lilo.confの内容]
boot = /dev/hda
delay = 100

image = boot/vmlinuz
  label = lin
  root = /dev/hda2

other = /dev/hda1
  label = win
  table = /dev/hda

 LILOを少しでも知っている人には『なるほどこれでは確かにそうだろう。それはあなたが無知なだけだ』と、一蹴されてしまうだろう。LILOはデフォルトではCtrlShiftAltキーなどを押さないとプロンプトを表示せず、一切のキー入力を受け付けない。さっさとデフォルト起動されるための「Enter」キー入力さえ受け付けない。delay」オプションで指定した時間はCtrlキーなどプロンプトを呼び出すキーが押されるのを待っている時間に過ぎない。その間にCtrlキーなどを押せば、以下のようにプロンプトが表示され、キー入力を受け付けるようになる。

[プロンプトの表示]

 LILO BOOT: _

 プロンプトを呼び出さなくても自動的にプロンプトを表示させるにはprompt」オプションを付ける。

[プロンプトの表示のオプション]
boot = /dev/hda
prompt
timeout = 100


image = /boot/vmlinuz
  label = lin
  root = /dev/hda2

other = /dev/hda1
  label = win
  table = /dev/hda

 そのままだとずっとプロンプトを出したままなので、timeout」オプションも付ける。これはプロンプト呼びだしキー入力を待つ「delay」オプションと違い、通常のキー入力の待ち時間だ。最近のディストリビューションなら、せめてこれくらいのオプションはデフォルトでつけてくれるだろう。「prompt」オプションを付けた場合、「delay」オプションは意味がないので、削除したほうがいいだろう。別に記述をしておいても害はないが。因みに「timeout」オプションも「delay」オプションも単位は0.1秒である。

 使い勝手とはあまり関係ない話だが、timeout時間が経過した場合に、起動されるデフォルトイメージは基本はlilo.confで一番最初に記述されたイメージだ。上記の例では「/boot/vmlinuz」になるが、default」オプションを指定することで、任意のイメージをデフォルトにすることができる。

[デフォルトイメージの指定]
boot = /dev/hda
prompt
timeout = 100
default=hda1

image = /boot/vmlinuz
  label = lin
  root = /dev/hda2

other = /dev/hda1
  label = win
  table = /dev/hda

 上記例ではWindowsの方が記述の順序は下だが、デフォルトになる。

 


ラベル

 LILOでは様々な場面で起動カーネルやOSを指定する。lilo.confの中でも、起動時のOS選択時などなど。この時に起動カーネルやOSの指定に、皆さんはlabel」オプションに指定した値を使うだろう。しかし本来は起動OSを代表するのはイメージと呼ばれるものだ。そのイメージとは正式には「image」オプション「other」オプションの値のパスを取った部分を指す。上記例では「vmliuz」「hda1」がそれぞれのOSのイメージになる。

 label」オプションは本来このイメージに対する別名に過ぎない。しかし通常はイメージを指定する場合、このlabelの方を指定する方が多いだろう。これは本当のイメージ名が持つ以下のような欠点をラベル名は補うことができるからである。

  1. カーネル名やデバイス名である本当のイメージ名はパスを取ると他のものと名称が重複する可能性がある
  2. 名称が完全には重複しなくても、カーネル名やデバイス名なので、似たようなものになって識別しにくい
  3. カーネルの場合、バージョンなどがついて、非常に長くなる場合がある

 これに対し、「label」オプション15バイト以内の任意のものを付けられるので、直感的で識別しやすい短いものを指定できる。特に起動の時のOS選択時には識別の容易さと、キーボード入力しやすさは非常に重要になる。そこでイメージの指定は大抵「label」オプションの値を使うことになる。

 「default」オプションなども「イメージ」を指定することになっているが、その指定にあたりlabel名を指定するのが普通だ。上記例ではこの説明をするためあえて本当のイメージ名の方を指定したが、普通は下記のようにlabel名を指定するはずである。

[デフォルトイメージの指定にLabel名を使う]
boot = /dev/hda
prompt
timeout = 100
default=win

image = /boot/vmlinuz
  label = lin
  root = /dev/hda2

other = /dev/hda1
  label = win
  table = /dev/hda

 ところで「label」オプションは意外と知られていないが、大文字小文字を分けて書いたり、全体をダブルクォートで囲むことによって、スペースを含めることもできる。

[スペースを含むLabel名を使う]
boot = /dev/hda
prompt
timeout = 100
default=
"red hat 6.2j"

image = /boot/vmlinuz
  label = "Red Hat 6.2J"
  root = /dev/hda2

other = /dev/hda1
  label = "Windows 98"
  table = /dev/hda

 ただし大文字小文字の区別は表示上は区別されるが、指定時には区別されない。

 しかし、これではラベル名の持つ、本当のイメージ名に対するアドバンテージの一つである短いものを指定できるというメリットが無くなってしまうし、ラベル名を上記のようにみてくれを良くしても、実際ラベル名が表示されるのは後述する「tab」キーを押したときくらいなので、あえてこんなものを指定する意味があまりない。従って、通常はこんな指定はしないだろう。しかしこれが非常に有効な場面があるので、後ほど説明するから、このことはよく覚えておいてほしい。


 ところでLILOでは選択候補が表示されないので、候補にどんなイメージがあるか忘れてしまった場合困る。一応プロンプトが表示されている間にtab」キーを押すと、選択候補が表示されることになっている。

[tabキーによる選択候補の表示]

 LILO BOOT: _
 lin         win

 


メニュー

 しかしこれでも、まだいまいちである。やはり最初から候補が表示された方がいいよね。そんな我々の願いをかなえてくれる機能がついにLILO Version21-5から登場した。グラフィックメニューとまでは言えないが、カラフルで待望の矢印キーで選択するタイプのメニューが導入された。またLILOには珍しくデフォルトでメニューが有効になる。LILOが起動されると、以下のような新メニューがディスプレイの中央上部に鎮座まします。

[LILOのデフォルトメニュー]
LILOのデフォルトメニュー

 LILO Version 21-5を使った場合、特にlilo.confに明示的に指定をしなくても上記のようなメニューが導入される。操作は矢印キーで目的のOS(イメージ)を選択して、Enterで確定する最もオーソドックスな(それゆえ最も使いやすい)方法だ。タイムアウトの残り時間も表示され、使い勝手が格段に向上している。

 上記のメニューを表示したlilo.confは以下のようになる。

[新メニューのlilo.conf]
boot = /dev/hda
prompt
timeout = 300

image = boot/vmlinuz
  label = redhat
  root = /dev/hda5

image = /mnt/turbo/boot/vmlinuz
  label = turbo
  root = /dev/hda6

other = /dev/hda1
  label = windows98
  table = /dev/hda

 特にメニュー用のオプションなどの指定はない。ただし、「prompt」オプションは付けてほしい。これはこの新メニュー機能も従来のプロンプト機能の延長として導入されているので、プロンプトが表示されないとこのメニューも表示されない。(そういう意味ではたとえ「prompt」オプションが無くても、Ctrlキーなどのプロンプトを呼び出せば、表示されるが)

 それ故、従来のプロンプト(「LILO Boot:」という)も、このカラフルなメニューのに表示され、キー入力も可能である。というか基本はプロンプト入力で、その入力をメニューからの選択で、自動的に入力してくれるといった機能になっている。結局プロンプト機能の延長というよりは入力補助機能だね。LILOではパラメータ入力は結構頻繁に行うので従来の機能と両立したなかなかいい実装方法だと思う。

 また、この入力補助機能によって今まであまり行われることの無かったことができるようになった。それは「label」オプション長い名称を使うことだ。前述しているように「label」オプションのメリットは任意の文字列を指定できるため、識別しやすくキーボード入力しやすい短いものが指定できることだった。しかし本来識別を容易にするには名称は長い方がいい訳で、キーボード入力の容易さとは相反するものである。結局キーボード入力の容易さの方が、通常のLILOの使い方としては切実なので、そちらが優先された指定をしている方、つまり短いラベル名を使っている方が多かったと思う。

 しかし入力補助機能があるので、キーボード入力の必要が無くなったため、識別の容易さの方を優先して、「label」オプションに長い名称をつけることができると思う。特に「label」名はメニューに表示されるので、スペース入り大文字小文字の分けて書いて、見た目がカッコいいものにするといいだろう。元々ラベル名に指定可能だったことが、やっと実用化できることになったと言える。


 さて、メニュー機能にはいくつかのカスタマイズ機能があって、その一つにまずタイトルがある。メニュー上部中央にある文字列だ。グローバルオプションにmenu-title」オプションを用いて指定する。デフォルトでは「LILO Boot Menu」というタイトルになっているが、以下のように指定してカスタマイズ可能である。

 menu-title="Nobusan's Menu"

 ダブルコーテーションで囲むことによってスペースを含めることもできる。

 次になんと言っても、この機能の目玉はが指定できることだ。やはりグローバルオプションにmenu-scheme」オプションを指定して行いる。指定可能な色は黒、白、赤、青、緑、黄色、シアン(明るい水色)、マゼンダ(明るい紫)の8色で、それぞれ通常輝度高輝度がある。指定可能な箇所は通常文字選択文字ボーダーラインタイトル文字の4箇所である。指定フォーマットは以下だ。

 menu-scheme=<通常文字>:<選択文字>:<ボーダーライン>:<タイトル文字>

 コロンを区切り文字として、それぞれ2つの英字で色を指定する。第1文字がフォアグランド色、第2文字がバックグラウンド(背景)色になる。色と英字の対応は以下だ。

 黒=k、白=w、赤=r、青=b、緑=g、黄色=y、シアン=c、マゼンダ=m

 
それぞれ小文字が通常輝度で、大文字が高輝度になるが、バックグラウンド色には高輝度は使えない。LILOのデフォルト(前述のメニュー)は以下のような指定である。

 menu-scheme=wr:bw:wr:Yr

 つまり、通常文字は文字色(フォアグランド色)が白、その背景が赤、選択文字の文字色が青、その背景色が白。ボーダーラインの色が白で、その背景色が赤。タイトル文字の文字色は高輝度の黄色で、背景色は赤、ということである。

 「通常文字」以外は省略可能だ。その場合、「選択文字」は「通常文字」のフォアグランド色と背景色を反転したもの、「ボーダーライン」と「タイトル」は「通常文字」と同じ指定になる。

 ちょっと私好みのブルー系を基調にしたメニューをカスタマイズしてみた。ラベル名もかっこよくしている。

[私好みのメニューのlilo.conf]
boot = /dev/hda
prompt
timeout = 300
menu-title="Nobusan' s Menu"
menu-scheme=Cb:kw:Gb:Yb


image = boot/vmlinuz
  label = "Red Hat 6.2J"
  root = /dev/hda5

image = /mnt/turbo/boot/vmlinuz
  label = "TurboLinux 6.0"
  root = /dev/hda6

other = /dev/hda1
  label = "Windows 98"
  table = /dev/hda

other = /dev/hda2
  label = "Windows 95 OSR2"
  table = /dev/hda

[上記lilo.confの指定に基づくブルー系を基調にしたメニュー]
ブルー系を基調にしたメニュー


 ところでこの新メニューはデフォルトで有効になっており、特にオプションを指定しないでも機能すると説明した。では逆にこの機能を無効にすることはできないのだろうか? 実はこれも可能である。

 この機能は従来のブートファイル/boot/boot.bを改良したものであり、新たに/boot/boot-menu.bが導入され、/boot/boot.bはこのファイルへのシンボリックリンクに変わっている。で、従来の/boot/boot.bと同じ動作(つまり新メニューでない)をする/boot/boot-text.bというファイルも用意されており、デフォルト以外のブートファイルを使いたい時に指定する「install」オプションで明示的にこちらを指定するか、/boot/boot.bのシンボリックリンクをこのファイルに張り直せば、新メニュー機能は無効になる。まああまり無効にしたがる人はいないだろうが。

 メニュー機能の登場で、以前作ったプロンプトの改善のページは必要なくなったが、メニュー機能がきらいがという天邪鬼な方のために残してあるので、参照してほしい。「旧プロンプトの改善」である。

 


グラフィックメニュー

 メニューのサポートだけでも使い勝手的には十分だが、やはり遊心が欲しいところだ。これは好き嫌いが分かれるかもしれないが、以下のようなグラフィックメニューVersion 22から導入できるようになった。既にいくつかのディストリビューションで、独自にグラフィックメニューをLILOに組み込んでいるが、画像フォーマットや実現方法が統一されていないことを憂慮して、LILOの開発者John Coffmanが標準機能として組み込んだものである。

[LILOのグラフィックメニューイメージ]
LILOのグラフィックメニューイメージ

 自分の好きな画像をメニューにできる訳だ。今のところ、ハードウェア上の汎用性を高めるため、VGAに準拠した、サイズ640x480で、色数が16色ビットマップファイルだけをサポートしている。ビットマップファイルは現在は主にMicrosoftのOSで使用されているが、一応PC/AT互換機では汎用的な画像フォーマットとなっている。

 色数が少ないのが残念だが、あまりたくさんの色を使った画像を選択しなければ、それほど遜色ない綺麗なメニューになる。上例のタヒチの画像も16色だが、さほど汚くはないだろう。このような風景画よりも、マンガ画像の方が尚綺麗かもしれない。

 グラフィックメニュー導入には勿論LILOのバージョンを22以上に上げる他、次のように/etc/lilo.confにオプションを記述する必要がある。

[グラフィックメニューのlilo.confの記述例1]
boot = /dev/hda
install = /boot/boot-bmp.b
prompt
timeout = 300

bitmap = logo64a.bmp
bmp-colors = 6,9,0;15,9,0
bmp-table = 59,5,1,19,
bmp-timer = 66,29,6,8,0


image = boot/vmlinuz
  label = redhat
  root = /dev/hda5
・.

 まずはinstall」オプションにブートファイルとして/boot/boot-bmp.bを指定してほしい。前項のメニューでは/boot/boot-menu.bがデフォルトで/boot/boot.bにシンボリックリンクされていて、特に何もしないでも利用できましたが、グラフィックメニューの方はデフォルトでは使えない。例のように「install」オプションに/boot/boot-bmp.bを明示的に指定するか、これに対し/boot/boot.bをリンクする必要がある。まあリンクするよりはinstallオプションに直接指定した方がいいだろう。

 更に、bitmapbmp-colorsbmp-tablebmp-timer4つのオプションをグローバルセクションに記述する必要がある。

 bitmap」オプションは表示したい画像名を指定する。マップインストーラ実行時のカレントに画像があればフルパスで指定する必要はない。
 

 bmp-colors」オプションメニュー文字列のの指定となり、以下のようなシンタックスで指定する。

 bmp-colors=<文字色>,<背景色>,<影色>;<選択文字色>,<選択背景色>,<選択影色>

 前3つが非選択エントリの文字列色で、後ろの3つが選択エントリの文字列色である。「=」以降は全てスペースを空けてはいけない。3つの間は(カンマ)」で、3つグループの間が(セミコロン)」であるのを間違わないでほしい。

 背景色影色は選択文字、非選択文字それぞれ省略可能だ。背景色を省略すると「透明」になり、影色を省略すると影付ではなくなる。省略する場合は数値だけ省略してカンマやセミコロンはそのまま記述する。

 色指定は詳しくは後述するが、」から「15の間の数値で指定する。16色なので16個な訳である。


 bmp-table」オプションメニュー文字列の表示位置を指定する。次のシンタックスになる。

 bmp-table=<x軸>,<y軸>,<列数>,<行数>,<列間距離>

 x軸やy軸はそれぞれメニューの先頭文字列の位置だ。x軸」から「80の範囲で、数値を指定するか、0p」から「632pの範囲でピクセル値で指定する。pの付かない方はどういう単位か、よく分からないが、あまり細かい調整が必要でないなら、前者の方が指定や位置の調整が楽だろう。y軸」から「30か、0p」から「464pの範囲で指定する。

 列数や、行数、また列間距離はあまり説明はいらないだろう。ただし列間距離は列の右端同士の距離である。

 
 bmp-timer」オプションtimeoutを設定している場合の、経過時間を表示する文字列の位置を指定する。シンタックスは以下のようになる。

 bmp-timer=<x軸>,<y軸>,<文字色>,<背景色>,<影色>

 x軸やy軸の考え方は「bmp-table」オプションと同じだ。また色の指定方法も「bmp-color」オプションと同じである。ただし背景色を省略しても「透明」にはならず、色として「0」が指定されたことになる。またタイマーは選択することはないので、選択、非選択の区別はない。

 もう1例ほど記述例を示そう。値の省略や、ピクセル指定などを行っている。

[グラフィックメニューのlilo.confのの記述例2]
boot = /dev/hda
install = /boot/boot-bmp.b
prompt
timeout = 300

bitmap = ins64a.bmp
bmp-colors = 14,11,;15,9,0
bmp-table = 21,287p,2,4,175p
bmp-timer = 73,29,12,8,0

image = boot/vmlinuz
  label = redhat
  root = /dev/hda5
・.

 
 さて、問題の色指定なのだが、16色なので」から「15を指定すると説明した。皆さんは一体どの数値が「赤」なのか、「青」なのかということが知りたいかもしれない。しかしこの数値は特定の色に結びついたものではない。

 VGAではインデックスカラーと呼ばれる色管理方式を採用している。これは少ない情報で、できるだけカラフルな色を表現するための方法で、GIF画像などにも使われている。インデックスカラーとはパレットと呼ばれるものに色を割り当てて、色情報をこのパレットの番号(インデックス)で保持、表現するものである。

 皆さんは普段Windowsなどでも画面には最低High Color(16bit、65,536色)を使っているだろう。色に拘る人はTrue Color(24bit、16,777,216色)以上にしている人も多いのではないだろうか。従って、たった16色(4bit)ではとても綺麗な画像が表現できないと考えるかもしれない。

 しかし、たとえTrue Colorを使ったとしても、ある特定の画像を一つとった場合、当然全色が使われている訳ではない。実際に一つの画像の中で使われる色はそんなに多くはないのが普通だ。そこである画像の色の中で、代表的な16個を選びだし、全ての点(ピクセル)にこの16色うち最も近い色を割り当てて表示してみる。そうすると案外綺麗に表示されることが分かる。

 実際好きな画像を、16色に減色してみてほしい。Linuxでは「GIMP」、Windowsでは「ペイント」でも可能である。画像にもよるが、それほどひどい色、画像にはならないはずだ。

 これが16色のインデックスカラーの概念だ。画像の各点(ピクセル)は4bitの情報しか持っていないので、画像全体の情報量は非常に少なくて済む。しかしそれ以外に16個のパレットそれぞれの24bit分のRGB情報を持っている。24bitの情報が必要なのは16個のパレット分だけなので、情報量としては大した量にならない。

 尚、余談だがGIF画像に使われるインデックスカラーは256色、つまりパレットが256個あるので、更に綺麗で実画像に近い表現力を持ちつつ、サイズの小さい画像を実現している。(まあ画像サイズは更にLZWで圧縮しているから小さいのだが)

 
 さて、パレットの話は理解できただろうか? 何でこんな話をしたかというと、LILOのグラフィックメニューの色指定、つまり「0」から「15」の数値指定はその画像のパレットを指定する必要があるからなのだ。厳密にはパレット番号(インデックスを指定する。またパレットにどのような色が割り当てられているかはその画像に依存する。だから「2番」が黄色とか、「11番」が水色といった、パレット番号で特定の色を表現することはできない。

 従って、実際に数値を書いて、表示させながらどの数値がどのパレット、つまりどの色になるかを試行錯誤する他ない。しかし何度もliloを作成し、再起動し、色の感じをみて、気に入ったものにしてくのはかなり手間がかかる。そこでどのパレット番号が、どんな色なのかを確認する方法がある。

 Linuxには先ほどもちょっと出てきたGIMPという、UNIXのPhotoshopとも呼ばれる素晴らしいグラフィックツールがあり、多くのディストリビューションには標準でインストールされている。このツールの機能にパレットを表示、編集する機能がある。

 まず目的の画像を表示した上で、「ファイル」メニュー -> 「ダイアログ」 -> 「インデックスパレット」をクリックする。

[GIMPのインデックスパレットの表示]
GIMPのインデックスパレットの表示

 すると次のような「インデックスカラーパレット」ダイアログが表示される。

[インデックスカラーパレットダイアログ]
インデックスカラーパレットダイアログ

 ここに16個のパレットがあるのが見えるだろう。例で挙げたあのタヒチの画像はこの16個の色だけで構成されている。パレットをクリックするとそのパレットの色のRGB値とインデックス番号が表示される。例では「赤」のパレットを選択しているが、RGB情報は「FB0215」の、インデックス番号「5」であることが分かる。

 従って、メニュー文字を「赤」にしたかったら、「5」と記述すればいいのである。実際に画面に文字として表示される感じや位置などは依然実際に実行して表示してみる他ないが、色が確認できるだけでも格段に作業が楽になるはずだ。

 尚、古いバージョンのGIMPにはこのインデックスパレット表示の機能がないので、気を付けてほしい。少なくともRed Hat Linux 6.2に同梱されたバージョンにはこの機能がなかった。

 
 最後に、このグラフィックメニューは前項のメニューとは両立できない(何かのキーで切り替えるなど)。/boot/boot-bmp.bをブートファイル(installオプションで指定)として使うとグラフィックメニューになり、/boot/boot-menu.bを使うと前項のメニューになる。

 また前項のメニューの時はプロンプトは依然そのまま表示されたので、起動時にパラメータを入力することができたが、グラフィックメニューの場合はプロンプトが表示されない。「えーじゃぁ、パラメータ指定できないの?」と思ったかもしれない。ご安心あれ。TAB」キーを叩くと、グラフィックメニューが消えて、プロンプトが表示される。パラメータを指定して起動したい場合はこうやってほしい。尚、一旦「TAB」キーでグラフィックメニューを消した場合はその場でもう一度グラフィックメニューを表示させることはできない。

 


キーボード変換

 メニューを導入しても、従来のプロンプト自身は依然有効で、各種パラメータなどを起動に入力できることは説明した。Linuxを使いこなしている人は結構起動時にパラメータを設定することが多いと思う。

 しかしデフォルトではキーボードがUS配列になっている。まあ慣れてしまえばいいのだが、一方でLinux起動後は大抵の人は日本語106キーボード用にKeyマップを再設定しているだろうから、US配列に慣れるというのもまた困る。

 そこでLILOはちゃんとキーマップの変更をサポートしている。設定ファイル/etc/lilo.confに記述するオプションはkeytable」オプションだ。ここにこれから説明する日本語106キーボード用のキーボード変換テーブルを指定する。

[キーボード変換テーブルの指定]
boot = /dev/hda
prompt
timeout = 300
keytable = /boot/jp106.ktl

image = boot/vmlinuz
  label = "Red Hat 6.2J"
  root = /dev/hda5

image = /mnt/turbo/boot/vmlinuz
  label = "TurboLinux 6.0"
  root = /dev/hda6

other = /dev/hda1
  label = "Windows 98"
  table = /dev/hda

 さて設定ファイルでの指定は簡単だが、そのキーボード変換テーブルはどこにあるのかというと、これは自分で作らねばならない。予め用意するものとしてkeytab-lilo.plというPerlスクリプトと、キーマップファイルである。

 このPerlスクリプトはliloのソースアーカイブパッケージに同梱されているので、当該ftpサイトからこのパッケージを入手して、ローカルマシンの適当な場所で解凍する。解凍してできあがるトップディレクトリにこのスクリプトがある。

 キーマップファイルの方はデフォルトのUSキーボード用と、日本語106キーボード用の2つを用意するが、最近のディスクトリビューションでは「/usr/lib/kbd/keymaps/i386/qwerty/」以下に既にあると思う。ただここにあるのはアーカイブ化されたものなので、解凍する必要がある。us.kmap.gzjp106.kmap.gzというアーカイブからデータを取り出して用意する。

 そして、前出のPerlスクリプトkeytab-lilo.plに解凍したキーマップファイルを食わせれば、標準出力にキーボード変換テーブルを出力するので、リダイレクトしてファイルに書く。実際の手順は以下のようになると思う。

[テ−ボード変換テーブル作成手順]

 > cd /usr/lib/kbd/keymaps/i386/qwerty

 > gzip -dc jp106.kmap.gz >jp106.map        <---- キーマップファイル取り出し

 > gzip -dc us.kmap.gz >us.map        <---- キーマップファイル取り出し

 > cd ~Src/lilo-21.6               <---- liloパッケージ解凍ディレクトリへ

 > ./keytab-lilo.pl us jp106 >/boot/jp106.klt   <----- スクリプト実行

 上記手順にはliloのアーカイブパッケージの入手と解凍の部分は書いてないが各自実行してほしい。

 キーマップファイルのアーカイブからの取り出し方は自由だが、取り出したものは.mapというサフィックス(拡張子)を付けてほしい。上記の例ではgzipで標準出力に吐き出すようにして、リダイレクトでファイルに落としている。

 最後にスクリプトにデフォルトのUSキーマップファイルと、日本語106キーマップファイルを引数に(順序を間違えないように)サフィックスをとって(別に付けたままでもいいだが)指定して、ファイルに書き出す。後は書き出されたファイルを/etc/lilo.confの記述してマップインストーラを実行するだけである。

 しかし実際はこれだけではあまり日本語106キーボードらしくならない。BIOSに頼ってキーボード変換をしているLILOにとって、元々カーネル用に作られたキーマップファイルでは完全に変換できないようだ。「*」(アスタリスク)、「()」(カッコ)、「&」(アンパサンド)、「”」(ダブルクォート)、などなど、まだまだ夥しい数の重要なキーがUS配列のままである。

 それに厄介なことに、このままだと、「=」に割り当てられるキーが無くなって、「=」を入力できなくなってしまう。

 これらのうまく変換されないキーは個別に変換する必要がある。keytab-lilo.plには-pオプションというのがあって、個別にキーアサインを変更できる。以下にキーマップファイルの指定では変換しきれなかったものを個別に指定した方法を示す。

[個別変換の例]

 > ./keytab-lilo.pl -p 0x3a=0x2b -p 0x2b=0x5f -p 0x5f=0x3d -p 0x5e=0x26 -p 0x26=0x27 -p 0x40=0x22 -p 0x22=0x2a -p 0x2a=0x28 -p 0x28=0x29 -p 0x29=0x7e -p 0x7b=0x7c -p 0x7c=0x7d -p 0x7d=0x7b us jp106 > /boot/jp106.ktl

 -p 元のコード=変換後のコード

という指定の仕方になる。コードは文字コードで10進数でも16進数(頭に0xを付ける)、8進数(頭に0を付ける)でも構わない。例では16進数で指定している。そのコードがどの文字の変換なのかはASCII表などで確認してほしい。

 まあ、ここまで沢山個別に指定するなら、いっそ106用のキーマップファイルなど頼らずに全部個別指定でもいいかもしれないということで、トライしたのが以下である。

[全部個別変換した場合の例]

 > ./keytab-lilo.pl -p 0x2b=0x5f -p 0x5f=0x3d -p 0x3d=0x5e -p 0x5e=0x26 -p 0x26=0x27 -p 0x27=0x3a -p 0x3a=0x2b -p 0x5c=0x5d -p 0x5d=0x5b -p 0x5b=0x40 -p 0x40=0x22 -p 0x22=0x2a -p 0x2a=0x28 -p 0x28=0x29 -p 0x29=0x7e -p 0x7c=0x7d -p 0x7d=0x7b -p 0x7b=0x7c us > /boot/jp106.ktl

 これでも前者の例と全く同じ結果になる。

 しかし実際はここまでやっても完全に日本語106キーボードにならない。BIOSがscanコード(実際にキーボードが発行するコード)をある文字コードに変換するが、それをまた別の文字コードに変換するというのが、LILOのキーボード変換の仕組みだ。LinuxカーネルがやっているようにBIOSに頼らずscanコードから直接文字コードをアサインすることはできない。

 だからBIOSが文字コードに変換してくれないキーは扱えない。代表的なのは右シフトの左隣の106配列では\」(バックスラッシュ、日本語画面上では¥マークと一緒)_」(アンダースコア)に割り当てられているキーだ。このキーはscanコードが89なのだが、これをUS配列しか知らないBIOSが、文字コードに割り当てることすらしないのである。そんなscanコードがあるはずがないと思っているのだろう。

 あと上記に当てはまる重要なキーがbackspaceの左隣の\」キーだ。「\」はともかくこのキーをシフトと共に押したときの|は重要なので困る。また前出のアンダースコアもないと不便な場面があるだろう。

 そこで実は上記の2つの変換例は実際はちょっと配列を変えて工夫している。日本語106キーボードでは0が刻印されているキーのシフトと主に押すものは利用されていない。キートップには」(から)とかかれているので、~(通称ニョロ)はここだと思っている人が非常に多い場所(実際は「~」はが刻印されているキーだね)である。よってこの誤解通り、ここに「ニョロ」を割り当て、実際の「~」のキーにアンダースコアを割り当てる。(キートップの文字も実際_のように見えるので)

 更に`」(バッククォート)はあまり使わないと思ったので、その場所(が刻印されているキーをシフトと共に押すキー)に|を割り当てている。このあたりは趣味の違いもあるかもしれないので、自由に上記の指定をカスタマイズするのもいいだろう。

 


目次へ