Last modified: Mon Dec 31 21:56:03 JST 2001

Linux カーネル バージョンアップ

間違いや改良点などありましたらメール下さい


 Linuxも最新カーネルはバージョンが2.2.14になりました。(2000/01/??)
 作業の1.〜8.はSlackware-2.3.0に特化した話です。 純粋にカーネルだけを入れ換える場合には、 カーネルのバージョンアップからお読みください。 ですが、これももう古い情報になってます。 私の今のLinuxシステムは、Vine Linux 2.1.5 なので、そっちの kernel アップデートをお読みください。


以下の順で作業します。
  1. ld.so
  2. GNU make
  3. libc
  4. libg++
  5. binutils
  6. gcc,g++
  7. ncurses
  8. sysvinit
  9. カーネルのバージョンアップ (2000/04/24)
  10. カーネルのテスト (1999/04/25)
  11. modulesのインストール (1999/04/25)
  12. カーネルのインストール (1999/04/25)
  13. RedHat系Linuxでの注意点 (1999/11/08)
  14. 手順一覧 (1999/11/08)
  15. pppd(PPxP)

では順に説明していきましょう。
  1. ld.soのバージョンアップ
     作業の1.〜8.がSlackware-2.3.0に特化した話です。
     以前のLinuxシステムは、Slackware-2.3.0のパッケージをベースに カーネルだけをバージョンアップし続けたシステムです。 ですからlibcやgccなどのいろいろなものが 割と古いものとなってしまっています。 カーネルを2.0にするこの機会にそれらもろもろのソフトも 一緒にバージョンアップすることにしました。 (この作業はUNIX USER 96年9月号のプレイパーソナルLinux の記事を参考にしています)

    使用したものはld.so-1.7.14.tar.gzです。

    が入っています。
    ldconfigはダイナミックリンクライブラリのリンクを作成するコマンド。
    lddコマンドはあるコマンドがどんなライブラリを リンクしているかを表示するコマンドです。
    ld.soはa.out用の、ld-linux.soはELF用のダイナミックリンカーです。

    これはコンパイルの必要がないのでこれからやります。
    これは簡単です。展開したディレクトリにinstldso.shという シェルスクリプトがあるのでそれを実行するだけです。

  2. GNU makeのバージョンアップ
    使用したものはmake-3.74-direntfix-elf.tgzです。
    古いmakeコマンドは次に入れ換えるlibcを使用すると動作しませんので 先にこっちを入れ換えます。

    これも展開したディレクトリにmakeのバイナリがあるので それを/usr/binに置くだけです。

  3. libcのバージョンアップ
    使用したものはlibc-5.3.12.bin.tar.gzです。
    Cのライブラリですね。
    同じものを上書きするとどうなるか分かりませんので、 まず最初に現在稼働中のlibcのバージョンを確認して下さい。 同じでなければいいです。
    # ldd /bin/sh
    とか打てばlibcのバージョンが見れます。
    それを確認したら古いファイルやシンボリックリンクを削除して アーカイブを展開します。
    # rm -f /lib/lib.so /lib/libm.so
    # rm -f /usr/lib/libc.so /usr/lib/libm.so
    # rm -f /usr/include/wcstr.h /usr/include/mbstr.h
    # rm -f /usr/include/iolibio.h /usr/include/iostdio.h
    # rm -f /usr/include/ld_so_config.h /usr/include/localeinfo.h
    # rm -rf /usr/include/netinet /usr/include/net /usr/include/pthread
    # ln -fs /usr/src/linux/include/scsi /usr/include/scsi
    # tar zxf libc-5.3.12.bin.tar.gz -C /
    # ldconfig
    これはカレントディレクトリにlibc-5.3.12.bin.tar.gzがある場合です。

  4. libg++のバージョンアップ
    使用したものはlibgPP-2.7.1.4.bin.tar.gzです。
    g++のライブラリです。
    これは現在の最新のJE、JE-0.9.7zがこの新しいg++のライブラリを 使用しているために入れ換えます。 g++のバージョンが低いとmuleやgroff等がうまく動作しないそうです。 今回g++を入れたということは私はまだ0.9.7zを入れてないということですね。
    これもlibcと同様に以下のようにして入れ換えます。
    # rm /usr/lib/libstdc++.so /usr/lib/libg++.so
    # rm -rf /usr/include/g++
    # tar zxf libgPP-2.7.1.4.bin.tar.gz -C /
    # ldconfig
    これもカレントディレクトリにlibgPP-2.7.1.4.bin.tar.gzがある場合です。

  5. binutilsのバージョンアップ
    使用したものはbinutils-2.6.0.14.bin.tar.gzです。
    ld, nm, ranlib等のコマンドのパッケージです。
    # tar zxf binutils.2.6.0.14.bin.tar.gz -C /
    # ln -fs /usr/lib/libbfd.so.2.6.0.14 /usr/lib/libbfd.so
    # ln -fs /usr/lib/libopcodes.so.2.6.0.14 /usr/lib/libopcodes.so
    これもカレントディレクトリにbinutils-2.6.0.14.bin.tar.gzがある場合です。

  6. gccのバージョンアップ
    これがないと何もコンパイルできないですね。
    使用したものはgcc-2.7.2.bin.tar.gzです。
    元気がある人、慎重な人はソースからがんばってコンパイルしましょう。:p
    # rm -f /usr/bin/cc /usr/bin/g++ /usr/bin/cpp
    # tar zxf gcc-2.7.2.bin.tar.gz -C /
    # ln -fs /usr/lib/gcc-lib/i486-linux/2.7.2/cpp /lib/cpp
    これもアーカイブがカレントにあるとしています。

  7. ncursesのバージョンアップ
    ncursesやtermcapはどちらも画面制御のためのライブラリです。
    termcapライブラリはcursesライブラリと組み合わせて BSD風の画面制御ライブラリになります。 ncursesはtermcapも内蔵していてSystemV風の画面制御ライブラリです。
    私は面倒くさがりやなのでncursesだけをインストールしました。
    ncurses-1.9.9e.bin.tar.gz使用。
    # rm -f /usr/lib/libform.* /usr/lib/libpanel.*
    # rm -f /usr/lib/libncurses.* /usr/lib/libmenu.*
    # tar xzf ncurses-1.9.9e.bin.tar.gz -C /

  8. initのバージョンアップ
    これは特に現状のinitに困ったいた訳ではないですが、 せっかくなのでアップしました。
    でもRedHatやSlackware3.0以降の人はやっちゃ駄目だそうです。
    Slackware3.0以前のシステムの場合、 同時にrcファイルも入れ換えましょう。
    sysvinit-2.62.tar.gz使用で、これを展開したディレクトリで
    # make
    # make install
    でOKです。 rcファイルの入れ換えは以下のようにしてバックアップを取って入れ換え、 それからrcファイルへの自分の変更点を新しいrcファイルに忘れずに 反映しましょう。
    新しいrcファイルは展開したディレクトリのslackware/etc/配下にあります。
    # mkdir /etc/rc.d/old
    # cp -p /etc/rc.d/rc* /etc/rc.d/old
    # rm -f /etc/rc.d/rc.0
    # cp -p /etc/inittab /etc/inittab.old
    # cd slackware/etc/rc.d
    # cp ../inittab /etc
    # tar cf - rc* | tar xf - -C /etc/rc.d
    # chmod 700 /etc/rc.d/rc*
    # chown root.root /etc/rc.d/rc*

  9. カーネルのバージョンアップ
     まずはkernelのソースを展開しましょう。お決まりでは/usr/src/linux がカレントバージョンになりますが、kernelのアーカイブは./linux/ からの相対ディレクトリで固められていますので、/usr/src/ 直下で展開しましょう。 それと、前のバージョンのカーネルは退避しておくべきでしょうね。 私はそれぞれのバージョン毎にディレクトリを作っています。例えば、
    # cd /usr/src
    # mkdir linux-2.2.14
    # ln -s linux-2.2.14 linux
    # tar xvfz linux-2.2.14.tar.gz
    の様にしています。
     展開が終わったら、Configure.helpを JFプロジェクト が翻訳したものに置き換えましょう。こうすることで、 make xconfigなどの際に参照するHELPを日本語で見ることができます。 JF: Configure.help Japanese translations からConfigure.help-2.2.14.jaを入手して、
    # cd /usr/src/linux/Documentation
    # mv Configure.help Configure.help.orig
    # mv Configure.help-2.2.14.ja Configure.help
    とします。次は、カーネルオプションを設定しましょう。
    # make config
    とします。これでカーネルに取り込む機能や、デバイスドライバを指定します。 どの版からなのかは定かではありませんが、今は
    # make xconfig
    という手もあります。これはX WindowのGUIで設定が行えて、 helpも表示されますし、私はこちらをお勧めします。
    (テキストベースの make config では、設定を誤っても戻れないし、 前後の相関が見れませんから不便に思っていました)

     設定が終わったらコンパイルします。

    # make clean
    # make dep
    # make bzdisk (またはmake zdisk。bzdiskの方が圧縮率が高いです)
    make bzdiskでは最後にフロッピーディスクドライブ(FDD)へ 新しいカーネルイメージが書き出されますので、 フロッピーをさしておいてください。 これはいきなりハードディスク上へカーネルをインストールするのでなく、 まずはFDDでブートしてカーネルが正しいかを確認するためです。 (あなたが冒険家ならば modulesのバージョンアップ に進んでいきなりハードディスクへインストールしましょう)

  10. カーネルのテスト
     さて、そうしたら新しいカーネルを試すためにリブートをして、 FDDに書き出したカーネルで起動させてみましょう。let's reboot! :)

     無事にシステムは立ち上がったでしょうか?
    この段階ではまだモジュールが読み込まれていないと思いますが、 新しいカーネル自体はうまく動いているようならば モジュールをインストールしてから、 カーネルをハードディスクにインストールしましょう。 ただ、うまく動いているかどうかの見極めも、まぁ、 いろいろチェックポイントがあるのですが、詳しくは割愛します。 よく分からなかったら、少なくともログインプロンプトが出ているかどうか、 uname -a してバージョン番号は正しいか、を見てみましょう。

  11. modulesのインストール
     次はmodulesのインストールです。
    # make modules
    # make modules_install
    これでモジュールがインストールされます。 具体的には/lib/modules/配下にカーネルのバージョン名のついた ディレクトリが作成されます。 しかし、RedHat系Linuxの方は RedHat系Linuxでの注意点を読んでください。

  12. カーネルのインストール
     カーネルをハードディスクにインストールします。 しかし、RedHat系Linuxの方はまず先に RedHat系Linuxでの注意点 を読んでからにして下さい。

    # cd /usr/src/linux
    # make bzlilo
    これで新しいカーネルイメージが/にコピーされ、 そのliloの設定もなされます。 あとはリブートすれば新しいカーネルで起動されます。
    お疲れ様でした。:)

  13. RedHat系Linuxでの注意点
     カーネルとモジュールのインストールについて、 Vine、、、というかRedHat系のLinuxでは、 Slackwareなどとは少し勝手が違うので注意が必要です。 というか、本来はRPMにてインストールするのがスジですから、 以下に示す方法は御自分でゴリゴリとインストールする方法です。
     カーネルソースを自分でmake xconfigしてカーネルを作り直し make bzliloした場合に、Slackwareでは/にカーネルファイルvmlinuz が置かれるのですが、 Vine(RedHat系)では/boot配下にカーネルを置くので、 そちらへ自分でコピーしてあげないとなりません。
     # cd /
     # mv arch/i386/boot/bzImage /boot/vmlinuz-2.2.14
     # mv System.map /boot/System.map-2.2.14
    vmlinuz-2.2.14という名前は適当です。 (Vine Linux 1.1のカーネルはvmlinuz-2.0.36-3vl3でした) ちなみにvlとはvine linuxという意味だそうですね。
    :/sbin/installkernel という コマンドもこれらをやってくれます。 このコマンドが存在するディストリビューションならば こちらでやった方が簡単でしょう。
     # cd /usr/src/linux
     # /sbin/installkernel 2.2.14 arch/i386/boot/bzImage System.map
    とすると、作ったカーネルとSystem.mapをそれぞれ vmlinuz-2.2.14, System.map-2.2.14 という名にして /bootに置いてくれます。 System.map -> /boot/System.map-2.2.14 なシンボリックリンクも張ってくれます。

     これだけではブート時にモジュールを認識してくれません。 Vineでは起動時に/etc/rc.d/rc.sysinitのスクリプトが カーネルのバージョンを見て、モジュールディレクトリの preferredという名前のシンボリックリンクを張っています。 /etc/rc.d/rc.sysinitを見ると、

    # Set up kernel version-dependent symlinks.
    rm -f /lib/modules/preferred
    if [ -n "$USEMODULES" ]; then
        ktag="`cat /proc/version`"
        mtag=`grep -l "$ktag" /lib/modules/*/.rhkmvtag` 2> /dev/null
        if [ -n "$mtag" ]; then
    	mver=`echo $mtag | sed -e 's,/lib/modules/,,' -e 's,/.rhkmvtag,,' -e 's,[ 	].*$,,'`
    	ln -sf /lib/modules/$mver /lib/modules/preferred
    	ln -sf /boot/System.map-$mver /boot/System.map
    	ln -sf /boot/module-info-$mver /boot/module-info
        fi
    fi
          
    とやっていますので、/proc/versionの内容と /lib/modules/配下にある.rhkmvtagというファイルの内容が一致する ディレクトリへ/lib/modules/preferredとしてリンクを張ります。 なので、あるカーネルに対応したモジュールは、そのディレクトリ内に その起動されたカーネルが吐き出す/proc/versionと同じ内容を持つ .rhkmvtagというファイルを持っていないとなりません。 持っていないとカーネル起動後に モジュールが正しく参照されません(上記リンクが張られないので)。
    私は以下のように.rhkmvtagを作りました。
     # cd /usr/src/linux
     # strings vmlinux | grep Linux | grep version > /lib/modules/2.2.14/.rhkmvtag

     そして再度ブートをすれば、 今度はちゃんと新カーネルに新モジュールが読み込まれるはずです。
     無論、/etc/lilo.confは手で修正して /bootにある正しいカーネルがロードされるように編集して、 /sbin/liloコマンドを実行しておくことを忘れずに。 ちなみに私の/etc/lilo.confは、

    boot = /dev/hda
    timeout = 50
    prompt
      vga = normal
      append = "mem=130688k"
      read-only
    map=/boot/map
    install=/boot/boot.b
    image = /boot/vmlinuz-2.2.14
      label = linux
      root = /dev/hda5
    image = /boot/vmlinuz-2.2.12-y1
      label = linux_2.2.12
      root = /dev/hda5
    image = /boot/vmlinuz-2.0.36-3vl3
      label = linux.sysorg
      initrd = /boot/initrd-2.0.36-3vl3.img
      root = /dev/hda5
    other = /dev/hda1
      label = win
      table=/dev/hda
          
    です。

     それから、Vine1.0beta→Vine1.1のバージョンアップインストール をした後、同様にカーネルのリコンパイルをしたのですが、 その時にはPPxPが うまく動きませんでした。 userlinkのモジュールが認識されず読み込まれません。 起動時のエラーをCtrl-Sで止めて見てみると、 /lib/modules/misc/userlink.o を読み込もうとしてエラーがでます。 なので、もう一度、自分でuserlinksをリコンパイルして 同じところに置きました。
     # tar xvfz userlink-0.99.tar.gz
     # cd userlink-0.99
     # configure
     # make
     # mv /lib/modules/misc/userlink.o /lib/modules/misc/userlink.o.sysorg
     # cp -pi userlink.o /lib/modules/misc/.

    ちなみに起動時のPPxPの処理は/etc/rc.d/init.d/ppxp の中でやっています。(userlinkのロードなど)

    :kernel2.2にする時も同様です。

  14. 手順一覧
     カーネルバージョンアップ(リコンパイル)の一連の手順を書いておきます。
    1. カーネルソースの展開(/usr/src/linux)
    2. make xconfig
    3. make dep; make clean; make bzdisk
    4. 新カーネルのFDでブートの確認
    5. make modules; make modules_install
    6. strings vmlinux | grep Linux | grep version > /lib/modules/$(VER)/.rhkmvtag
    7. installkernel $(VER) $(KERNEL-IMAGE) $(SYSTEM-MAP)
    8. userlinkのリコンパイル
    9. vi /etc/lilo.conf ; /sbin/lilo
    10. Let's Reboot!

  15. pppdのバージョンアップ
    pppdよりも今はPPxPをお勧めします。設定も利用もかなり楽です。 インストールはこちらを参照ください。


とまぁ、以上です。カーネルの入れ換えはできましたでしょうか?

All Right Reserved, Copylight (C) Yoshinori ARAI. 1996-2000

ひとつ戻る back icon

あらいよしのり