2004年1月12日月曜日

Debian GNU/Linux, kernel 2.2.x と 2.4.x とを共存させる

新カーネル導入設定と旧カーネルとの同居

今だに、Debian GNU/Linux では、カーネルの安定版としてバージョン2.2.x系を採用している。 (2003年7月現在) しかし、他の多くのLinuxディストリビューションでは2.4.x系が主流となっている。 各種USBデバイスを繋げられること、ALSAの新しいバージョン(ver.0.9)が使えるようになることなど、2.2.xから2.4.xへのアップグレード利点も多い。 そこで、 旧カーネル2.2.17も生かしつつ、新カーネル2.4.20を試していく ことにする。 旧カーネルと新カーネルはそれぞれ起動し分けることができるよう、LILOの設定も行いたいと思う。

Debianといえば、apt。 カーネルのソースも apt-get コマンドで持ってくるのだ。
root になってから以下のようにカーネルソースを頂戴してくる。

$ su -
Password:
# apt-get install kernel-source-2.4.20
すると /usr/src/kernel-source-2.4.20.tar.bz2 が置かれるので、これを展開してやることとする。 展開された kernel のソースは /usr/src/kernel-source-2.4.20 以下に置かれる。
そうしたら、例のごとく(?)カーネルの設定をグラフィカルなインタフェースで行なうため、make xconfig する。
# cd /usr/src/kernel-source-2.4.20
# make xconfig
下に、2.2.17 のときの xconfig の画像とそのときの設定項目、2.4.20 のときの xconfig の画像とそのときの設定項目を並べた。 設定の可能な項目がいろいろと増えたのが視覚的にも比べられる。
2.2.17のとき
2.2.17 での xconfig の様子
そのときの設定可能項目
  Code maturity level options
  processor type and features
  Loadable module support
  General setup
  Plug and Play support
  Block dvices
  Networking options
  Telephony Support
  SCSI support

  I2O device support
  Network device support
  Amateur Radio support
  IrDA (infrared) support
  ISDN subsystem
  Old CD-ROM drivers (not SCSI, not IDE)
  Character devices
  USB support
  Filesystems

  Console drivers
  Sound
  Kernel hacking
2.4.20 のとき
2.4.20 での xconfig の様子
そのときの設定可能項目
  Code maturity level options
  Loadable module support
  Processor type and features
  General setup
  Memory Technology Devices(MTD)
  Parallel port support
  Plug and Play configuration
  Block devices
  Multi-devie support (RAID and LVM)
  Networking options
  Telephony Support
  ATA/IDE/MFM/RLL support

  SCSI support
  Fusion MPT device support
  IEEE 1394 (FireWire) support (EXPERIMENTAL)
  I2O device support
  Network device support
  Amateur Radio support
  IrDA (infrared) support
  ISDN subsystem
  Old CD-ROM drivers (not SCSI, not IDE)
  Input core support
  Character devices
  Multimedia devices

  File systems
  Console drivers
  Sound
  USB support
  Bluetooth support
  Kernel hacking
  Library routines

カーネルの設定。 いっぺんにいろいろ設定するのは危険なので、必要最低限の設定だけにしておく。

カニさんチップの載った愛用のイーサネットカードを使うための設定。
Network device support → Ethernet(10 or 100 Mbit) → Realtek RTL-8139 PCI Fast Ethernet Adapter support を n から m へ。
こいつのモジュール名は、helpを表示させて確認した。 どうやら今度からは 8139too.o という名前になるらしい。

いろいろなファイルシステムを扱いたかったので、その辺の設定。
File systems → Ext3 journalling file system support を n から y へ
File systems → DOS FAT fs support を n から y へ
File systems → MSDOS fs support を n から y へ
File systems → VFAT(windows-95) fs support を n から y へ
File systems → Native Language Support → Japanese charsets(shift-jis, Euc-jp) を n から y へ


設定が終わったら保存して終了。

カーネルをコンパイル。(構築)

# pwd
/usr/src/kernel-source-2.4.20
# make-kpkg kernel_image
# cd /usr/src
# dpkg -i kernel-image-2.4.20_Custom.1.0_i386.deb
このあと、リブートを経て、晴れて新しいカーネルから起動する。
ここで、eth0 が消えていたので、新しいカーネルにネットワークカードを認識させる。
モジュール8139tooをinsmodし、ifconfigでIPアドレスを振った。 そしてルーティングの設定をrouteでしてあげれば、内ネットワーク、外ネットワークをちゃんと区別できるようになった。
具体的には以下のようなコマンドで解決した。
# insmod 8139too
# ifconfig eth0 192.168.0.4 netmask 255.255.255.0
# ifconfig eth0 up
# route -add -net 0.0.0.0 netmask 0.0.0.0 dev eth0 gw 192.168.0.1
見ての通り別段複雑なルーティングテーブルじゃあるまいに、内のネットワークにあるホスト、外のネットワークにあるホストそれぞれに ping を打って、ちゃんと返事が帰ってくればオッケーでしょう。
なお、今後は起動時に自動的に eth0 を認識してもらうため、 /etc/modules に 8139too を書き加えておいた。

まだまだやることはいっぱいだ(1) 「カーネルを起動し分ける」
LILOを使って、次の4つを起動し分けるようにしたい。

  1. 新しく構築したばっかりの最新の2.4.20カーネル
  2. そのいっこ前の2.4.20カーネル
  3. もう使わないかもしれないけど、いちおう2.2.17カーネル
  4. Windows98
まずは、
/boot/vmlinuz-2.4.20 を /boot/old.vmlinuz-2.4.20 にコピー。
そうしたら次のようなシンボリックリンクをはる。
/vmlinuz        →  /boot/vmlinuz-2.4.20
/vmlinuz.2.2.17 →  /boot/vmlinuz-2.2.17
/vmlinuz.old    →  /boot/old.vmlinuz-2.4.20
今後カーネルを再設定し、構築したものは /boot/vmlinuz-2.4.20 に上書きされるので、古い /boot/old.vmlinuz-2.4.20 も生かしておけるようになる。

次にこの3つのカーネルとwin98とを選んでブートできるように /etc/lilo.conf を書く。 /etc/lilo.conf の骨子は以下の通りだ。
lba32
boot=/dev/hda
# boot=/dev/fd0  ### installing LILO in a floppy
root=/dev/hda1
install=/boot/boot.b
map=/boot/map
delay=20
vga=normal

default=Linux

image=/vmlinuz
        label=Linux
        read-only

image=/vmlinuz.old
        label=LinuxOLD
        read-only
        optional

image=/vmlinuz.2.2.17
        label=Linux2.2.17
        read-only
        optional

other=/dev/hda3
        label=win
        table=/dev/hda
LILOでの起動プロンプトで Linux, LinuxOLD, Linux2.2.17, win の4つのラベルからそれぞれ 新2.4.20カーネル、旧2.4.20カーネル、2.2.17カーネル、Windows98 の4種の起動方法が選べるようになる。
なお、上記の boot=/dev/hda をコメントアウトし、 boot=/dev/fd0 のコメントをとり有効にしてから root で /sbin/lilo を実行すると、LILOをフロッピーディスクにインストールできる。 起動ディスク用にLILOディスクが一枚あると便利である。
そのまま書き換えずに root で /sbin/lilo を実行するとハードディスクの MBR に LILO が書き込まれる。
MBRとフロッピーにLILOを 書き込んだらリブート。 Shiftキーを押しながらブートすれば、3つのカーネルと1つの別の OS どれを起動するか選べるようになった。

まだまだやることはいっぱいだ(2) 「コンパクトフラッシュカード R/Wを使う」
コンパクトフラッシュカードリーダ(以下CFと表記するかも)の読み書きのできる REX-CF03F という製品を使うため、カーネル 2.4.x を再構築する。
USB CF R/W と USBプリンタ を利用できるにいたるまでの設定は ここここ で、もうすでに済ませてある。 今回行うのはカーネルレベルで USBデバイスを扱うための設定となる。
まずはこの製品の紹介webサイトに置いてあるパッチを手に入れ、これをあてる。 パッチは /usr/src/kernel-source-2.4.20/drivers/usb/storage ディレクトリに入っている transport.c と unusual_devs.h の2つのファイルにあてる。
~user/lib にメーカのwebサイトから手に入れたパッチを展開し、
root になってから以下のようにパッチを当てた。 もちろんパッチの当て方はパッチに同梱の説明書に詳しく書いてあるので、 実際にやる人はそちらをよく読むべきだと思う。

# cd /usr/src/kernel-source-2.4.20/drivers/usb/storage
# patch -p1 < ~user/lib/cf03/patch/redhat7-1/transport.patch
# patch -p1 < ~user/lib/cf03/patch/redhat7-1/unusual_devs.patch

次にカーネルのコンフィグを行う。 /usr/src/kernel-source-2.4.20 にカレントディレクトリを移し、例によって # make xconfig で設定をする。
  • USB Support → Support for USB を y から m にする
    (モジュール名は usbcore.o)
  • USB Support → UHCI Alternate Driver (JE) Support が m になっているか確認する
    (モジュール名は uhci.o、 2.2.17カーネルのときとは違う名前になったので注意か
  • USB Support → USB Mass Storage Support が m になっているか確認する
    (モジュール名は usb-storage.o)
  • USB Support → USB Printer support を n から m にする
    (モジュール名は printer.o)
同梱の説明書には
Code maturity level options → Prompt for development and/or incomplete code/drivers
も有効にせよとあるが、有効にしなくても現に動いているので筆者はこれを無視した。
それと、上記にわかるとおり、CF R/Wの設定といっしょに usb プリンターの設定もこっそりと行っている。

旧バージョンのカーネル用のモジュールの名残がまだ詰まっている /usr/src/modules を /usr/src/modules2.2.17 と名前を変えてから、カーネルを再構築、そして、リブートを行う。
リブート後からは root権限で # depmod -av の後に、uhci, usb-storage, printer を modprobe してやれば、CF R/W も usb プリンターも利用できるようになった。

まだまだやることはいっぱいだ(3) 「音楽演奏」
これは手短に紹介。
alsaのソースを apt で頂いてくる。

# apt-get install alsa-source
するとここで debconf 設定の画面となる。 ここで isapnp 、 デバッグ用メッセージ、サウンドカードに載っているチップにあうドライバ(筆者のものでは sb8 (Sound Braster Pro用)) まで対話的に選択していける。 つぎに /usr/src/alsa-driver.tar.gz を展開する。
# cd /usr/src
# tar xvzf alsa-driver.tar.gz
そうしたら /usr/src/kernel-source-2.4.20 へ行き、
# cd /usr/src/kernel-source-2.4.20
# make-kpkg modules_image
そして /usr/src にできている alsa-modules の debパッケージをインストール。 その後、alsaconf で設定を行った。
# cd ..
# dpkg -i alsa-modules-2.4.20_0.9.2-7+Custom.1.0_i386.deb
# alsaconf
以上で終わり。 音楽演奏も可能となった。
以前使っていたバージョン0.4の alsa で演奏をさせると、マクロメディアフラッシュ等で画像の再生に演奏が追い付かなかった。 だがこのバージョン0.9 ではその問題はかなり解消された。 よかったよかった。