e2comprでノートも幸せ


COMPAQノートにRedHat 5.2を新規に入れ直したのを機会に、前々から使ってみたいと思っていたe2comprを導入してみることにした。でもパッケージは作ってない、というかkernelにあてるパッチがキモなので、rpmにしようがない(笑)

とりあえずパッチをあてたい対象となるkernelは2.0.36なので、RedHatのftpサイトに行って、ゲロ重なのを何度かリトライしてkernel-2.0.36-1.src.rpmを落としてきた。

でもって、e2comprのページ(今んとこ、上記のリンク)からまず、Kernel 2.0.35 用の e2compr-0.3.9 パッチをもらってくる。これが uuencode してあるので、まずgzipする前にuudecodeが必要だ。

さらにancillary-981212-glibc.tar.gz も必要だ。Kernel 2.1.x系の人や、libc5 な人は、ちゃんとそれ用のものも公開されているので、e2comprのページから適切なものを持ってこよう。

とりあえず、RedHat の Updates から持ってきた Kernel-2.0.36-1 を入れてマシンに合わせて再構築し、キッチリとブートできることを確認しておく。

COMPAQノートにはiBCSは入れていないので、実際に使うのは

kernel-2.0.36-1.i386.rpm
kernel-pcmcia-cs-2.0.36-1.i386.rpm
kernel-source-2.0.36-1.i386.rpm
kernel-headers-2.0.36-1.i386.rpm

の4つだ。自分でkernelパッケージをmakeしたところで、同じものができるだけだし、どうせ再構築するんだし、でUpdatesからもってきたバイナリ・パッケージをまず入れてしまう。

rpm -Uvh で普通に上書きしようとしたら、kernel-2.0.36-1.i386.rpm とkernel-pcmcia-cs-2.0.36-1.i386.rpm がお互いに依存しあっているような状況だったので、rpm -e で kernel と kernel-pcmcia-cs をサクッと消して、それから

rpm -ivh kernel-2.0.36-1.i386.rpm
rpm -ivh kernel-pcmcia-cs-2.0.36-1.i386.rpm

として普通に入れてしまった。kernel-source、kernel-headers も同様にブチ込んだ。

cd /usr/src/linux してディレクトリを移動し、Makefile を一箇所編集し、74行目の

#INSTALL_PATH=/boot

となっている部分の#を消してコメントを外しておいた。

make menuconfig でいつものように Kernel の設定を決め、make dep ; make clean する。make boot とか make zlilo とかはせずに、単に make で kernel を作り、エラーなどがないのを確かめてから、make install でインストールした。

実際のところ、どうやってmake済みのkernelをインストールするか、というのは作法みたいなものがあると思うし、liloを使ってないとか、フロッピーブートしているとかの場合は make boot とか make zdiskとかでkernelを作るのが適切なのだろうとは思う。

が、RedHat の少くとも 5.1 や 5.2 では、上記のようにMakefileを書き換え、make installするのが一番簡単なような気がする。当然、liloを使う設定になっちゃうけどね。

で、この後は make modules; make modules_install で、make したモジュールを/lib/modulesの下にインストールするのだが、ここがイヤラシくて、RedHat の/etc/rc.d/rc.sysinit では、kernel のファイル名を見て、モジュールの置いてあるディレクトリを判定し、そこに preferred という Sym Link を張ろうとするようだ。

実際、kernel-2.0.36-0.7 を CD-ROM から普通にインストールした場合は、/boot/vmlinuz-2.0.36-0.7 というのがブートされる kernel で、モジュールはすべて/lib/modules/2.0.36-0.7 の下に収まっているはずだ。で毎回毎回ブート時にrc.sysinitがpreferredというSym Linkを張るという具合。どんな効果があるんだろうねぇ?(笑)

Makefileのコメントを外してmake installでブチ込むと、とりあえずこの辺の細かいことは意識しなくても良くなるようだ。/boot の下の System.mapとか、それへのSymLinkなどもツジツマ合わせてくれるし、古いkernelはvmlinuz.oldとして取っておいてくれるし。

で、普通に make install して /lib/modules/2.0.36 にモジュールが入って準備OK… というとそうではなくて、cat /proc/version > /lib/modules/2.0.36/.rhkmvtag として、そっとバージョン情報を隠しファイルに書いておくのがRedHat 5.2の習わしらしい。忘れると… (笑)

最後に /etc/conf.modules に

alias net-pf-4 off
alias net-pf-5 off

とお約束の呪文を書いておいた。IPXもAppleTalkも使わないので、aliasで外しとくのだ。で、念のため/etc/lilo.conf を編集して /sbin/lilo して準備完了。リブートする。

無事にブートし、モジュールも使えていることを確認したら、pcmcia-cs の make をする。いや、一回でやりゃあできるんだろうけど、もしもなにか不具合があったとき、何が悪いのかボンヤリしちゃうとイヤなので、面倒そうでもkernelをまず作り、それからpcmcia-csを入れ直すようにしている。だから、作りたてのkernelだとnetworkが見えないんだよな。わはは。いいのだろうか。

とはいっても、/usr/src/linux/pcmcia-csに移動して、make config し、make all ;make install するだけなんで実は簡単だ。preferred云々も気にせずに、普通に/lib/modules/2.0.36の下にバシバシ突っ込むだけだし。

ただ、いつも不思議(に思いながら調べてねぇヤツ>オレ)なんだけど、pcmcia-csをmake してインストールしなおすと、/etc/pcmcia の下も書き換えられるんだけど、もともとRedHatのCD-ROMから入ってくるヤツと違うんだよね、微妙に。

特に、/etc/pcmcia/network の中身が全然違うし、そもそも/etc/pcmcia/network.opts が入ってこないんだよね、インストール時にpcmciaを使うようにした場合でも。で、pcmcia-cs をインストールした後に、バックアップとして保存されている /etc/pcmcia/network.~1~ を再度 /etc/pcmcia/network として書き戻して使ってる。なぜかこうしないと、ブート時にpcmciaなethernet cardに対してifup eth0がうまく動かないのだ。謎。

さて、もう一度リブートして、すべてpcmciaも含めてうまく動作しているのを確認する。これでやっと、e2compr の作業をする準備ができた。

cd /usr/src/linux してディレクトリを移り、

gunzip -dc e2compr-0.3.9-patch-2.0.35.gz | patch -p1

としてkernelにパッチをあてる。ところどころオフセットが出るが、実際にrejectされたのは /usr/src/linux/arch/i386/defconfig だけだった。reject されるのも

  CONFIG_EXT2_FS=y
+ CONFIG_EXT2_COMPRESS=y
+ CONFIG_EXT2_IND_BITMAP=n
+ CONFIG_EXT2_COMPR_X86_CODE=y
+ CONFIG_EXT2_USE_LZV1=y
+ # CONFIG_EXT2_USE_LZRW3A is not set
+ CONFIG_EXT2_USE_GZIP=y
+ CONFIG_EXT2_USE_BZIP2=y
+ # CONFIG_EXT2_DEFAULT_COMPR_METHOD_LZV1 is not set
+ # CONFIG_EXT2_DEFAULT_COMPR_METHOD_LZRW3A is not set
+ # CONFIG_EXT2_DEFAULT_COMPR_METHOD_GZIP1 is not set
+ # CONFIG_EXT2_DEFAULT_COMPR_METHOD_GZIP3 is not set
+ # CONFIG_EXT2_DEFAULT_COMPR_METHOD_GZIP6 is not set
+ CONFIG_EXT2_DEFAULT_COMPR_METHOD_GZIP9=y
+ # CONFIG_EXT2_DEFAULT_CLUSTER_BITS_2 is not set
+ # CONFIG_EXT2_DEFAULT_CLUSTER_BITS_3 is not set
+ # CONFIG_EXT2_DEFAULT_CLUSTER_BITS_4 is not set
+ CONFIG_EXT2_DEFAULT_CLUSTER_BITS_5=y
  # CONFIG_XIA_FS is not set

という追加部分けだなので、単に CONFIG_EXT2_FS の行と CONFIG_XIA_FS の行の間に手でバサッとコピーして編集してやればおしまい。問題ない。

で、パッチをあててから再度 make menuconfig し、File System に追加されたオプションだけ見ておく。デフォルトのままで問題なさそうなので、そのまま Save して Exit した。

make dep ; make clean 以下、普段どおりに kernel を make してリブートし、何も圧縮などしていない状態で不都合がないことを確認する。

さて、これでkernelはできた。次は実際に圧縮属性を設定するコマンド類をmakeしてやろう。どこか適当な場所でソースを展開して普通にmakeすればよい。

オレの場合は、パッケージにするワケでもないのに(笑) なんとなく慣れで/usr/src/redhat/BUILDの下で make作業を行なった。cd /usr/src/redhat/BUILD してディレクトリを移り、tar zxvf ancillary-981212-glibc.tar.gz で普通に展開してやる。

ancillary-981212 というディレクトリが掘られ、その下にいろいろファイルができるのだが、configure とかその類のものはないようだ。INSTALL という文書を読んでも、パッチあててkernelを再構築しろよ、くらいしか書いてない。

Makefileはancillary-981212/srcの下にすでにあったので、そこで単に make とするだけで特にエラーもなくサクサクとコンパイルが終わった。まぁハマってもいつでも戻せるか、と思い、そのまま make install で直にブチ込む(笑)

この段階で、

/usr/bin/e2ratio
/usr/bin/e2ratio
/usr/bin/e2compress
/usr/bin/e2decompress

がインストールされる。実際には e2decompress というのは e2compress への SymLinkで、圧縮系のコマンドによくある、どちらの名前で起動されたかによって圧縮か展開かの動作を切り替えるようになっているようだ。

あれ?他にもe2fsckとか、chattrとかも必要なはずだが…?と思って探すが、それらのソースは実際には含まれていなかったのだ!

でもって、ancillary-981212/prebuild というディレクトリの中に、実はビルド済みのものがすべて置いてありましたとさ(笑)

で、ここにも例によってMakefileだけが置いてあるので、make installでブチ込んだ。さっき自分でmakeしたヤツらも全部上書きされた。つまりムダな作業だったのね(笑)

で、この虚しいmake installで、必要なコマンド類はすべて入るし、圧縮した e2fs に対応した e2fsck も

    18 Dec 20 23:53 /sbin/e2fsck -> e2fsck-1.12-e2c036*
274600 Aug 28 16:50 /sbin/e2fsck-1.12*
274748 Dec 20 23:53 /sbin/e2fsck-1.12-e2c036*

という具合にバックアップを取ってSym Linkで処理してくれ、グ〜なのだが、なぜかinfoファイルがうまくインストールされなかった。ま、とりあえずいいか、と思って詳しく追ってない(ヤル気あんのか>オレ(笑)) てなワケで、

圧縮カマしてよかですか?

まずは適当に lsattr して見て表示させてみる。

-------  - -      GNUstep

こんな風に、- が 2つ増えて表示されていれば、それは圧縮対応のlsattrだ。で、実際に圧縮を有効にするにはchattrで

chattr -RV +c -m gzip9 ディレクトリ

などとする。圧縮を無効にするには

chattr -RV -c ディレクトリ

というように。c は compression の c で、その前の + と - で有効・無効を指定するわけ。わかりやすい。

わかりやす過ぎ

あまりにもわかりやす過ぎるコマンド・オプションのせいで(人のせいにすな)、オレ様の頭はマヒしてしまい、何を血迷ったのか

chattr -RV +c -m gzip9 /

などとして、あろうことか / 以下、つまりなんでもかんでも圧縮を有効にしてしまったのだ!!

♪フンフ〜ン♪なんつってメインマシンの方でMailなぞ読みながら、横ちょのノートでやってたオレが馬鹿なのだが… chattr コマンドは正直に言われたとおり動作し、/ 以下の全ファイルを猛然と圧縮しはじめた。結構時間がかかるもので、チラチラと横目で見ていると、/procが圧縮できるかボケなどとWarningが。あ、いけね、そりゃそうだよな、と事の重大さに気がついたときには時すでに遅し。

/mnt/win95 にマウントしていた vfat までも圧縮しようとし、Warningの嵐が。

のわ〜!と急いでCtrl-Cで急停止させたものの、恐る恐るリブートしてWin95でブートしてみると、LILOはWin95をブートしようとするものの、ワケワカなエラーで起動できず。 そ、そのWin95には今日の仕事の資料が… そこにしか置いてねぇぞ!どうすんだ>オレ

仕方がないので、秘奥義 FDISK /MBR でいったんliloにお亡くなりになってもらうことにした。これが2度目の大失策、というかこっちの方が致命的だったわ。わはは。今にして思えば、vfatは圧縮できないよ、とWarningが出てたとはいえ、一応 win95 のパーティションはLinuxから読めてたし、そのままftpなりnfsなりでネットワーク越しに逃がせばよかったぜ。

とりあえず、FDISK /MBR に SYS C: で Win95 は立ち上がり、大事な資料が読めることを確認したので、さてLinuxを復旧してliloをやり直そう、ということになるよね、当然。で、こういうときのために、loadlin でも最悪立ち上がるように、Win95側のパーティションにもvmlinuzを置いていたんだ。

このvmlinuzってRedHat 5.1のインストール・ディスクかなんかの八方美人なヤツで、普段ならこれで最低でも、Linuxが立ち上がって / をマウントするくらいまでは行けてたんだ。

だが、今回はダメだった。当然だが。だって、圧縮されてるんだもん。

いろいろ考えて(今さら)試しては見たものの、どうやっても Kernel Panic で / がマウントできん。この状況を救えるとしたら、同じように e2compr のパッチがあてられて、圧縮ファイルを透過的に読める kernel だけだ。作るか… 別のマシンで。

などと考えているうちに、バカバカしくなって全部再インストールすることにした。わはははは。オレってバカバカバカ。

で、RedHat 5.2 を入れ直し、kernel を入れ替え、上記の手順を全部、chattr の直前までやりなおしたよ。ニヤニヤしながら。

で、今度は慎重に、

chattr -RV +c -m gzip9 /lib /sbin /var /bin /tmp /home /root /usr

として見た。/proc や /mnt は言うに及ばず、/etc と /boot も /dev も圧縮の指定から外した。こうしておけば、 なにかあったときにも普通のkernelでブートし、/ をマウントできると思う。

で、使用前、使用後はこんな感じ。

Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda3             975511  346201   578910     37%   /

Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda3             975511  244020   681091     26%   /

となった。だいたい30%の圧縮だ。350MB が 250MB と、絶対量としては 100MB 増えただけだが、1GBしか割り当てられないこのノートPCとしては、結構な効果があると思う。今はまだインストールしたばかりで、あまり使ってないから感じないが、もっとファイルが溜ってくると、グッとありがたみが増してくると思う。

いや〜、エラい苦労しちゃったよ(笑)


メール 戻る