上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Linux起動用Linuxの見栄えを良くする

Linuxを起動できるカーネルとinitramfs、つまり、
Linux 起動用initスクリプトver.8とかのものを
Linux起動用initスクリプト
とこれまで題してきましたが、
これは要するにカーネルと組み合わせれば、ミニOSです。
個人的には
kiyoshi's help
と呼んでいます。
こいつの機能を含み、さらに多くの対応が可能になったものが、あります。
RIP linuxです。
でも、このRIP Linux、ブートローダとして使うには重すぎます。起動に時間がかかりすぎるのです。

kiyoshi's helpを作り始めたきっかけは、
私がUSBーHDDのパーティションにインストールしたUbuntuを複数のパソコンで常用しているのですが、
BIOSがUSBメディアからの起動をサポートしていない場合に、
grub legacyやgrub 2やgrub4dosでは起動が出来ず、
PLoPではUSBメディアのMBR(やPBR?)にはチェインロード出来る場合もあるものの、
そのUSBメディアのMBRに正しくgrubなどがインストールされていないとダメで、
しかもPLoPでは、起動したいLinuxの入っているUSBメディア以外にUSB接続機器がつながっているとダメだったりしたことでした。

そんな場合に、起動したいLinuxのカーネルとinitramfsをブートローダが認識できるメディア、たとえば、CDだったり、内蔵HDDのパーティションだったり、にコピーしておいて、それを呼び出しさえできれば、後は実際の/をroot=なんちゃらなんてカーネルオプションで指定してやれば良いのでした。
これは素晴らしい方法です。なんてったって、Ubuntuの最新カーネルですから、大抵のUSBメディアは認識できます。ブートローダーなんて比べ物になりません。(←間違っているかも。)
しかし、この方法の場合、カーネルが更新されると、新しいカーネルとinitramfsを再度、ブートローダが認識できるメディアにコピーしてやる必要があります。私は、カーネルが更新されると、空き領域を増やすために、すぐに新しいカーネルで起動してみて、正常に起動したら、古いカーネルをすぐに削除することが多いです。
こんな場合に、ブートローダが読めるメディアに新しいカーネルとinitramfsをコピーせずに再起動してしまうと・・・面倒なことになります。
え、「一度起動できたってことは、すでにブートローダが読めるパーティションに新しいカーネルとinitramfsをコピーしたってことだから、問題ないんじゃないの?」って?
違うんです。私は、USBーHDDのパーティションにインストールしたUbuntuを複数のパソコンで起動させているのです。一台だけでうまく起動したら、「大丈夫だろう」とすぐに古いカーネルを削除したりするわけです。

それで、カーネルを呼び出せるカーネルを探しました。
disklessfunさんがkexecを教えてくださり、さらに、それをUbuntuのinitramfsに組み込む方法までもご教示くださりました。

kexec-loaderってのも見つけたのですが、設定ファイルがkexecloaderというラベルのパーティションの中に必要だとか、カスタマイズがしにくかったので、ちょっとだけしか使いませんでした。

自分のために色々と改良を加えてきたので、ついに、以下のように多彩な起動を行うことができるようになりました。

BIOSがUSBメディアからの起動や、USBメディアの認識さえもできない場合にでも、USBメディア内を含め、メディアの通常のパーティション内のカーネル(およびinitramfs)を起動できます。

Grub legacy, Grub2, syslinuxの設定ファイルを探して読み込んで起動できます。また、それらの設定内容に問題があってそのままでは起動できない場合にも、簡単に編集して起動することができます。

/boot/vmlinuz-・・・と/boot/initrd.img-・・・があれば、それを表示します。それらを一覧から選択することで起動できます。

また、Wubiのインストールした/ubuntu/disks/root.diskを自動的に見つけ出して起動することも可能です。

さらに、kexec-toolsやfileコマンドを備えたbusybox環境に入って手動で起動させることも可能です。

まだまだ機能を追加できますが、大体望んでいたことはほとんどできるようになったので、そろそろ、使いやすさを目指すことにします。

まず、現在は、エラーが生じたときに原因を追求しやすいようにするために、ログをすべて表示するようにしています。これだと、initが走り始めてから、途中でUSBデバイスやSCSIデバイスが認識された場合、どこからが起動のための入力を促すメッセージで、どこからがデバイスの認識などのメッセージなのか、区別が付きにくいです。

起動のための入力を促すメッセージ以外を表示させないようにすればすっきりするのですが、ログは残しておきたいです。これを解決するには、仮想端末を二画面利用できるようにttyを稼働させれば良いのでしょうけど、それはまた、後で。

今の解決法としては、
busyboxが持っているprintfを使います。
色分けしてわかりやすくするつもりです。

printf "\033[1,5,7,31mここに太字、点滅、反転、赤、で表示させたいテキスト\n\033[0m"
とか。

2010/8/30追記

Ubuntuフォーラムでtputの組み込みについて質問したのですが、返事はありません。残念。

自力で表示位置もprintfで変更できました。
例えば、
printf "\x1b[10,20H"
で上から10行目、右に20文字目に移動できるようです。

tty1とtty2を使うことができるようにすれば、エラーメッセージなどはtty2に流し込み、tty1では操作関連の文字のみ表示させる・・・って方法でかなりのことができそうです。でも、tty1とtty2を使う方法が分かりません。
そこで、エラーメッセージなどは、ファイルに流し込んで、必要に応じて表示させるってのもありかも。

2010/8/31追記

特に最初のときには、udev?などのUSBデバイスの認識のメッセージなどが表示されて、折角の
"You can look upper by pushing SHIFT and PageUp keys at the same time"
が上に流れて読めなくなってしまいます。
それで、定期的に上記のメッセージを表示させることもできます。
例えば、
initramfs内に
displaymessage
なんていうテキストを作り、内容を


#!/bin/sh
while [ a = a ]
do
printf "\n\033[7;31mYou can look upper by pushing SHIFT and PageUp keys at the same time\033[0m\n"
sleep 10
done


にしておき、init内で、
sh ./displaymessage &
で起動すれば、およそ10秒毎に
You can look upper by pushing SHIFT and PageUp keys at the same time
が赤反転(枠付き)で表示されます。

かなり分かり易くなってきました。実際に改良したものは既にあるのですが、投稿は夜にでも。

後は、マニュアルの整備かなぁ。
プロフィール

kiyoshi

Author:kiyoshi
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
since 2011/9/25
現在の閲覧者数:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。