はじめに †
本ソフトウェアはKernelの切り替えを動的に行うプログラムです。
最近、2.6カーネルが動き出したり、SH-Linuxのホームページにおいて、
SH版 Fedora Core 2 互換パッケージ等が公開されてたりして、
SH-Linux周辺に新たな動きがあります。
それらを見て、私もカーネルを変更したくなりまして。。。
しかし、LANDISKの箱を開けたくなかったのと、システムを壊してしまうのが嫌だったので、
本プログラムの作成を思い立った次第です。
なお、本ソフトウェアは、mipsマシンに実装されているakmemや
2.6カーネルで実装されるといわれるkexec等の思想をそっくりそのまま頂きました。
ソフトウェアの構成と動作概略 †
- 概略
本ソフトウェアは次の2つのパーツから構成されています。
kernelsw.pl ・・・ フロントエンドスクリプト
kernelsw.o ・・・ デバイスドライバモジュール
kernelsw.plは、kernelsw.oへ、Kernel起動パラメータとKernelイメージの転送を行うPerlスクリプトです。
kernelsw.oは上記スクリプトから送られてくるパラメータとイメージをLinux起動時の初期領域へ転送し、
再配置して、新Kernelの起動を行うプログラムです。
- kerneksw.o(ver1.2)の状態遷移図
使用方法 †
- 起動するカーネルイメージなどの設定
kernelsw.plはperlスクリプトです。
スクリプトの9〜12行目に必要なパラメータをセットします。
- $image: 圧縮されたカーネルイメージを指定します。
- $root: rootファイルシステムを指定します。
- $readonly: rootファイルシステムを書き込み不可でマウントする時は1を設定します。
- $append: カーネルに渡すパラメータを指定します。
- @stop_command: 新カーネルへスイッチする直前に実行させたいコマンド群を列挙します。(手抜き)
以下はLANDISKのオリジナルカーネルの設定です。
########################################
$image ="/boot/zImage";
$root ="/dev/hda1";
$readonly = 1;
$append ="mem=64M console=ttySC1,9600";
以下は、deamon類を停止するコマンド群です。
@stop_command=(
'/mnt/hda3/debian_stop >& /dev/null',
'/etc/rc.d/init.d/S99shutdown stop >& /dev/null',
'/etc/rc.d/init.d/S99reset_daemon stop >& /dev/null',
'/etc/rc.d/init.d/S98UPnPResponder stop >& /dev/null',
'/etc/rc.d/init.d/S95httpd stop >& /dev/null',
'/etc/rc.d/init.d/S92netatalk stop >& /dev/null',
'/etc/rc.d/init.d/S91samba stop >& /dev/null',
'/etc/rc.d/init.d/S60lpd stop >& /dev/null',
'/etc/rc.d/init.d/S40cron stop >& /dev/null',
'/bin/umount -r /dev/hda3 >& /dev/null',
#'/etc/rc.d/init.d/S20network stop >& /dev/null',
#'/etc/rc.d/init.d/S15inet stop >& /dev/null',
);
#########################################
参考文献 †
- LinuxSH
SH-IPL Sequence,LILO Sequence,LinuxSH Kernel Boot Sequence等、
SH-Linuxの起動のシーケンスが非常に参考になりました。
人柱になっても良いという方へ †
非常に危険なプログラムですが、使ってみたいという方はどうぞ!
次の場所へソースを含め、一式置いておきます。
http://eggplant.ddo.jp/www/download/SH-Linux_Kernel_Switcher/
今後の方針 †
「プログラム実行中に、電源が突然落ちたに等しい状態になります。」
の問題を解決したいと考えています。
シャットダウンの最終フェーズでは、必ず/sbin/rebootか/sbin/haltが呼ばれるらしいので、
該コマンドが実行される時、メモリ上に新カーネルが格納されているならばkernelswを発動させ、
そうでないなら従来のコマンドを実行するような仕組みをrebootやhaltに実装したいと考えています。
問題は、メモリ内に確保してあるカーネルイメージが、デバイスをクローズすることで、
スワップアウトされる可能性があるため、一筋縄ではいきそうにない点です。
この辺のメカニズムについて、詳しい方がいらっしゃいましたら、助言していだだければ幸いです。
- 追記:自己解決
デバイスをcloseするとき自分でメモリを開放していました。汗
Ver2.0で本問題を解決しました。
Counter: 822,
today: 1,
yesterday: 0