2009年10月29日木曜日

KNOPPIX5.3.1をちょっとだけ追加改造

前回のcloopのLZMA圧縮で空きができた分を使って、Squeak(約40MB)を入れてみました。
それと、改造版だとわかるようにブート時の背景画像を変えてます。

【ブート画面】
ブート画面

【Squeak起動画面】

Squeakを起動したところ
[Kメニュー]から起動できるように設定も変えて起動してみました。

と、ここまでやってもisoファイルサイズは694MB。
ちっちゃいパッケージなら、まだ入りそう。。。

2009年10月25日日曜日

cloopをLZMAアルゴリズムで圧縮してみる

今まで、ノンオプションでcloopファイルを生成していたわけですが、これだとGZIPの-9程度の圧縮アルゴリズムが適用されるらしく、インターネットで調べてたら、LZMAレベルでの圧縮が可能であることを発見した。
早速、KNOPPIX5.3.1日本語版に適用してみたら、11MB程度サイズが圧縮されました。
オリジナル:699MB→688MB
cloop最適化をしても誤動作無しで、高速化もちゃんとできてます。

create_compressed_fsコマンドに-L -1を追加指定するだけでできちゃいます。

圧縮するのに今までの倍程度時間が掛かるけど、空き容量が増えるのはそれなりに魅力かと。
KNOPPIX起動時の性能劣化もそれほどでもないので、結構イケるかも。

2009年10月16日金曜日

KNOPPIX6.01日本語版の性能評価結果

先日リマスタリングしたKNOPPIX6.01日本語版の性能評価をしてみました。

【性能評価の条件】
(1) 性能評価するタイミングは、ブートプロンプトから起動してからLXDEデスクトップが表示されるまでとする。
(2) VMWareを使用し、CPU×1でメモリ=256[MB]とする。
(3) ホストのCPUは、Core(TM)2 Duo E4500 @ 2.20Gz メモリ=1[GB]

【性能評価結果】
オリジナルKNOPPIX6.01日本語版: 39.5秒
リマスタリング後の最適化していないKNOPPIX6.01日本語版:48.6秒
リマスタリング後の最適化したKNOPPIX6.01日本語版:37.6秒

リマスタリングすることでオリジナルと比べて9.1秒遅くなるが、最適化するとオリジナル版の性能とほぼ同等になる。
この現象が不思議だったので、最適化したKNOPPIX日本語版をcloopreadahead無しで起動したところ、性能値は41.2秒であった。若干性能ダウンするようである。

これらを総合して考えると、ブート時にcloopreadaheadをしなくても、cloopファイルの最適化を行っていれば、そこそこの高速化が図れると考えられる。
逆に、リマスタリング後、cloopoptimizerを掛けないと、確実に性能ダウンする。

2009年10月14日水曜日

KNOPPIX6.01日本語版の改造

KNOPPIX6.01日本語版は「LCATによる高速化してない」とか「cloopの最適化ができない」とか、ブーブー言っててもしょうがないんで、ちょっくらminirt.gz内のinitスクリプトを改造してみました。

以下のdiffリストのように変更しました。

minirt.gz内のinitスクリプトのdiffリスト
476c476,480
< local k dev dir count=0 RC=0
---
> local k dev dir count=0 RC=0 THREAD="thread_mode=0" CHKBLK=0
> for i in $CMDLINE ; do
> case ${i} in chkblk=*|CHKBLK=*) eval ${i} ; [ -n ${chkblk} ]
&& CHKBLK=${chkblk} ;; esac
> case ${i} in *noclpthread*|*NOCLPTHREAD*) THREAD="" ;; esac
> done
478c482
< [ -d /sys/module/cloop ] || insmod /mnt-system/"$knoppix_dir"
/modules/cloop.ko preload=32 || return 2
---
> [ -d /sys/module/cloop ] || insmod /mnt-system/"$knoppix_dir"
/modules/cloop.ko chkblks=${CHKBLK} ${THREAD} preload=32 || return 2
513a518,526
> if test -x /accl/cloopreadahead ; then
> CLOOPREADAHEAD="yes"
> checkbootparam "nocbr" && CLOOPREADAHEAD=""
> if test -n "${CLOOPREADAHEAD}" -a -f /mnt-system/${knoppix_dir}
/KNOPPIX.boot.lst ; then
> echo ""
> echo "${GREEN}Reading cloop block... ${BLUE}(Backgrounding)${NORMAL}"
> /accl/cloopreadahead /mnt-system/${knoppix_dir}/KNOPPIX
/mnt-system/${knoppix_dir}/KNOPPIX.boot.lst > /.cloopreadahead.log 2>&1 &
> fi
> fi


それと、minirt.gz内に/acclってディレクトリを作って、その下にcloopreadaheadコマンドを格納するようにしました。


cloopファイルの最適化のやり方

KNOPPIX6.01日本語版で、ブート時に以下のように起動パラメータを指定する。
boot: knoppix nosmp chkblk=10000 nocbr


システムが立ち上がったら、コマンド端末から以下の操作をして、立ち上がるまでのリードブロック情報を取得する。
# cat /proc/cloop/read_blocks > /mnt/hdb1/KNOPPIX.boot
# echo 1 > /proc/cloop/reset_read_blocks


IceWeazelとかOpenOfficeとかを動かした後、コマンド端末から以下の操作をして、アプリケーション起動後のリードブロック情報を取得する
# cat /proc/cloop/read_blocks > /mnt/hdb1/KNOPPIX.app


Debian Linuxマシンに移って、KNOPPIXで取得したリードブロック情報ファイル(KNOPPI.bootとKNOPPIX.app)を使って、cloopファイルのブロックを再構成する。
# cloopoptimizer cdimage/KNOPPIX/KNOPPIX KNOPPIX.boot \
KNOPPIX.app > KNOPPIX.new


オリジナルのcloopファイルを削除して、再構成したcloopファイルで置き換える。
# rm /cdimage/KNOPPIX/KNOPPIX
# mv KNOPPIX.new /cdimage/KNOPPIX/KNOPPIX


KNOPPIX立ち上げ時、読み込むリードブロック情報のカタログ(?)を作成する。
# rblk2bl KNOPPIX.boot > /cdimage/KNOPPIX/KNOPPIX.boot.lst
# appblk2bl KNOPPIX.boot 262144 KNOPPIX.app \
> /cdimage/KNOPPIX/KNOPPIX.app.lst


このあとisoイメージを作成すれば、LCATによる高速化KNOPPIX6.01日本語版が完成です。


んで、どのくらい速くなったかって言うと、、、まだ正確に測定はしてないんだけど、「気持ち速くなったかなぁ~」って程度でした。負け惜しみでなく、確かに速くはなっています。
KDEとかGNOMEみたいに大量にcloopをアクセスするんなら効果は出るんだろうけど、lxdeはcloopをそれほどアクセスしてないから、ほんの気持ち程度の性能アップに留まったのかな?と推測しています。

2009年10月13日火曜日

Mingw on USBメモリ

先日買ったASUS EeePC 901でWindowsアプリ開発環境を作りたくなったので、Mingw(http://www.mingw.org/)を導入しようと思う。

でも、知っての通りEeePCのHDDは、4GB+8GBしかないので、ここに乗せるのはちょっとイヤ。

外部のUSBメモリ(8GB)に乗っけて、必要な時だけ使えるようにするのが今回の目的。


【必要なもの】
USBメモリ: 1GB以上あれば文句ないでしょう。SDカードでも可。(ただし、めっちゃレスポンスが下がると思う)


【手順】
本家(http://www.mingw.org/)に英語で詳しく書かれていますので、英語の得意な方はそちらを参照した方が微妙なニュアンスが伝わるかと。(その微妙なニュアンスがわからないので、自分流の邦訳を作った次第です。)

Mingwは、それだけだとコンパイラ関係だけしかインストールされないけど、MSYSを入れておくとUNIXのようなコマンドとオペレーション環境(シェルなど)を使えるようになりますゾ。


本来ならば、MSYS Ver 1.0.11のシステムをデーンと入れたいところだが、現状のMSYSはMSYS Ver 1.0.10のインストーラしかないようなので、いったんMSYS Ver 1.0.10をインストーラでインストールして、その後でMSYS Ver 1.0.11のパッケージ類を上書きする形でシステムを構成するっちゅうことらしい。(英語が苦手なんだわぁ。。。回りくどい表現は止めて欲しいね。)

1. MSYSをインストールする。
1.1 MSYS-1.0.10の基本システムをC:\msys\1.0\にインストールする。
(1) http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exeをダウンロードする。
(2) ダウンロードしたexeファイルを実行する。
(3) 案内を読んで、適当に答えて。
(4) 最後にポストインストール(DOSプロンプト窓)でMingwがインストールされたディレクトリパス名称を要求される。
このバッチ処理でやってることは、msysの/etc/fstabファイルに/Mingwのマウントポイントを設定しているだけらしいから、適当に入れても後で修正することができる。
通常は、"C:/mingw"みたいに答えるんだってさ。

1.2 MSYS-1.0.10の拡張パッケージをC:\msys\1.0\にインストールする。
(1) http://downloads.sourceforge.net/mingw/msysDTK-1.0.1.exeをダウンロードする
(2) ダウンロードしたexeファイルを実行する。
(3) 案内を読んで、適当に答えて、ちょいちょいちょいっと。

1.3 ここで、インストールしたC:\msys\の全てをUSBメモリにコピーする。
ドラッグ&ドロップでやっちゃって良いでしょう。

1.4 MSYS-1.0.11の基本システムを上書きする。
(1) http://downloads.sourceforge.net/mingw/msysCORE-1.0.11-2007.01.19-1.tar.bz2
(2) ダウンロードしたbz2ファイルをUSBメモリ上に展開する。
(3) 解凍するのに使うツールは、lhaplusでも7zipでも何でもいいんじゃない。

1.5 推奨する更新(Recommended updates for MSYS)だそうで、MSYS Base System1.0.11にアップデートをかける。
(1) bash(http://downloads.sourceforge.net/mingw/bash-3.1-MSYS-1.0.11-1.tar.bz2)をダウンロードする
(2) coreutils(http://downloads.sourceforge.net/mingw/coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2)をダウンロードする
(3) m4(http://downloads.sourceforge.net/mingw/m4-1.4.7-MSYS.tar.bz2)をダウンロードする
(4) こいつらを全部展開してUSBメモリ上に上書きする。

2. Mingwをインストールする。
まぁ、本家では色々書いてあるけど、ここは適当に自動インストーラで入れちゃう。

(1) MingW自動インストーラ(http://downloads.sourceforge.net/mingw/MinGW-5.1.4.exe)をダウンロードする。

私は、gcc使ってjavaとかadaで開発するつもりが無いので、入れませんでした。

あと、mingwをインストールするフォルダは、仮に"C:\Mingw"とします。


(2) んで、インストールしたmingwをUSBメモリにコピーします。

必要なのはUSBドライブ上のmsys & Mingwだけなんで、CドライブにインストールしたmsysとMingwはアンインストールしても良いです。

取り敢えず、これでUSBメモリ上のmsys & Mingwが動作するようになっています。
USBメモリ上のmsys/1.0の下のmsys.batを起動して見てください。
rxvtコンソール画面が出れば問題なしです。

1.1 MSYS DTK(拡張パッケージ)でインストールする自動化ツール群はDLL作成がうまくできないらしいので、GNUサイトからソースをもらってきてリコンパイルしちゃうのが良いのだとか。

(1) GNUのFTPサーバから下記のソースの最新バージョンをダウンロードしてくる。
autoconf(http://ftp.gnu.org/gnu/autoconf/)
automake(http://ftp.gnu.org/gnu/automake/)
libtool(http://ftp.gnu.org/gnu/libtool/)

(2) autoconf,automake,libtoolの各々に対して、リコンパイル&インストールする。
rxvtコンソール画面を呼び出して、以下のオペレーションを行う。
# ./configure --prefix=/mingw
# make
# make install


3. 設定を調整する。
個人的には、必須でも無さそうな気がするけど、「ダメじゃん!」って相手にされなかったらイヤなので、言われた通りに設定しておきました。

(1) /mingwに全てのライブラリをインストールするつもりならば、PKG_CONFIG_PATHを設定する必要があります。
また、任意でCVSリポジトリが欲しいのであれば、CVS_RSHも設定する必要があります。
/etc/profileに対して、以下のような修正を加える。
PKG_CONFIG_PATH="/mingw/lib/pkgconfig"
CVS_RSH=ssh

(2) さらに、MingwにおけるCFLAGSの指定は、以下のようにしておくと良いらしい。
CFLAGS="-pipe -O2 -mms-bitfields -march=i686"


(3) んで、環境変数に設定した内容を、ネスティングした子プロセスでも利用できるようにエクスポートする。
export HOME LOGNAME MSYSTEM HISTFILE CFLAGS PKG_CONFIG_PATH CVS_RSH


msysdvlpr(MSYSシステムビルダ)での衝突を避けるため、パッケージインストールは/usr/localではなく、/mingwとする方が良いらしい。
# msys-DVLPRは、独自のmsysを構築&パッケージ化(リリースビルド)するためのシステムだったと記憶しています。
# msysを利用するだけなら必要ないです。

3.1 USBメモリからmsysを起動するバッチファイルを作る。
/msys/1.0/msys.batで直接起動しても良いんだけど、USBメモリは挿した時以前と同じドライブ名になるか保障は無いので、変わっちゃったときのために、それを変更してくれる処理があると嬉しいと思いませんか。

(1) /msys/1.0/etc/fstab.modelを新規に作って、以下のような内容を書く。
X:/win32/MinGW /mingw
X:/ /mnt/disk


(2) /msyskick.batを作って、以下のような内容を書く。
@echo off

::Get the current batch file's short path
for %%x in (%0) do set BP=%%~dpsx
for %%x in (%BatchPath%) do set BP=%%~dpsx
set BatchPath=%BatchPath%msys\1.0\
::echo BatchPath = %BP%


::Change to the batch file's directory
cd %BatchPath%

::Test if "msys.bat" is there.
if not exist %BatchPath%msys.bat goto ERROR
echo #Automatically generated - modify fstab.model > etc\fstab
::replace fstab with current directory
for /F "eol=# tokens=1,2* delims=:" %%i in (etc\fstab.model) do \
@echo %~d0%%j >> etc\fstab

::launch msys.bat
rem call msys.bat -norxvt
call msys.bat

goto DONE

:ERROR
echo msys.bat not found
goto DONE

:DONE


これで、USBメモリ上のWindowsアプリ開発環境のでっきあがり~です。


【出典】
Mingw本家(英語): http://www.mingw.org/
Mingwプロジェクト(英語): http://sourceforge.net/projects/mingw/
MSYSインストール手順(英語): http://www.mingw.org/wiki/MSYS
msys on flash drive(英語): http://sourceforge.net/mailarchive/forum.php?thread_name=81bfc67a0810081156w4965c3a0lbbcd5e64f09de0c3%40mail.gmail.com&forum_name=mingw-msys

2009年10月12日月曜日

KNOPPIX 6.01日本語版をちまちま眺めてみたら。。。

KNOPPIX6.01日本語版の内部をチマチマと見ていたら、以下の3点に気付いてしまった!

第一に、SCSI関連のドライバを自動認識しない(かもしれない)。
私がminirt.gzのinitスクリプト(以前のlinuzrc)を読んだ限りでは、V5.3.1では入っていたはずのSCSI関連ドライバの自動認識処理が全然入ってないです。


第二に、LCAT対応のcloopカーネルモジュールは入っているが、minirt.gzのinitスクリプト(以前のlinuzrc)内でcloopreadaheadコマンドを起動していないため、リードブロック最適化による高速化ができていない。
産総研さんのサイトでは、6.01の特徴として「LCAT対応による高速化」を明言してますが、ウソですね。
「LCAT対応のカーネルモジュールは入ってますけど、高速化はできていません。」が正しいと思います。

第三に、cloop.koをinsmodする時にchkblkパラメータを渡していないし、chkblkチートコードを読み込みもしていないため、リードブロック最適化プロファイリングができない。(ブート時に指定したchkblkチートコードが無視される。)
昨日、KNOPPIX6.01日本語版のリマスタリングで高速化できない理由は、これだったのね。
initスクリプトは自分で作れってことなのね。

やっぱりKNOPPIX6.01日本語版は、使えねぇ。

2009年10月11日日曜日

今日はDebianでまったりと

昨夜からDebian linux 5.01でもって、KNOPPIX6.01日本語版のリマスタ版を作ってみました。

まずは、Debian LinuxでLCAT(高速化cloopカーネルモジュール)が使えるようにするため、SourceForgeからソースをもらってきて

# .configure
# make
# make install


でも、cloopカーネルモジュールが何故かインストールされないので、インターネットでやり方を検索すると、


「insmod cloop.koすれば良い」

みたいなことが書かれていたので、鵜呑みにして実行。。。
シンボル未定義でエラーを起こしてるみたい。

ネットで検索しても目ぼしい情報がないので、dmesgコマンドででエラーメッセージを確認したところ、
zlib_inflate関連のシンボルだけが未定義になっている模様。
なので、

# insmod zlib_inflate.ko
# insmod cloop.ko
# depmod -a


をしたら、うまくいった。

以後、cloopカーネルモジュールを使うときは、

# modprobe cloop


ってすれば、zlib_inflateカーネルモジュールも組み込んでくれるようになる。
ちなみに、cloopファイルをマウントするには、

# modprobe cloop
# sleep 3
# losetup /dev/cloop0 cloopファイル
# mount -t iso9660 -o loop /dev/cloop0 /mnt/cdrom


ってすれば、/mnt/cdrom下にcloopファイルの内容が見れるようになりますよ。
(extract_compressed_fsコマンドを使うのが一番シンプルなんだけど、LCAT対応版ではエラーになっちゃうので。)

次に、本命のシェルスクリプトの作成作業。
KNOPPIX6.01日本語版のisoファイルから、minirt.gzの展開,cloopファイル(/KNOPIX/KNOPPIX)の展開を自動でやるシェルスクリプトと、逆にそれらをまとめてisoファイルに復元するシェルスクリプトの2本を作っておいた。

さて、これでDebian Linux上のKNOPPIX6.01日本語版のリマスタ環境ができた。

次は、KNOPPIXのリマスタ版を作るぞ。
まずは、KNOPPIX 6.01日本語版は、Windows共有フォルダが参照できないのが気に入らない。
smbfsパッケージは入っているようなんだが、なぜかマウントができない。
IceWeazel(FireFox)からはSMBプロトコルが通るみたいだけど、これじゃあアップロードできない。
なので、早速リマスタ環境で、cloopファイルにsmbfsパッケージを追加しちゃおう!
さらに、「これが俺のKNOPIXだ!」って主張したいがために、ブート時の背景画像(logo.16)の変更もしよう。
(ちなみに、にゃんこの画像にしました。)

んで、ちゃちゃっとisoイメージファイルを作って、VMWareでシミュレーション起動。
にゃんこの背景のブート画面が出てきた。
端末画面から、次のようにすると、

# mkdir /mnt/win
# mount -t smbfs //192.168.0.1/shareddocs /mnt/win
Passwd : *****


windows共有フォルダをマウントできた。

KNOPPIX6.01からウィンドウマネージャがLXDEになったので、KNOPPIX5.3.1日本語版のKDEと違ってビジュアルにマウントできないのが玉にキズ。。。メンドイ。

おまけに、LCAT対応なのに、リードブロックのプロファイラが起動できないゾ!高速化できないじゃん!
(オリジナルは、どうやって作ったんだろう。。。)

リマスタ版はできたけど、これじゃあ使えないなぁ。
次のバージョンに期待すっか。

結局、俺って何やってたんだろ。。。