WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Linux カーネルの更新方法(旧)

この記事はすでに時代遅れです。改訂版の記事を投稿してありますので、そちらをご参照ください。

今日は、Linux カーネルの更新方法について書いてみたいと思います。一般的な手順に関しては「Gentoo Linuxカーネルアップグレードガイド」に非常によくまとめられていますので、ここでは VMware 環境を前提にして、特有の情報を織り交ぜていきます。

なお、ここでは gentoo-sources-2.6.14-r5 から gentoo-sources-2.6.14-r6 にアップデートすることを前提に書いていきます。

新しいカーネルソースを入手する

新しいカーネルソースの入手といっても、特別なことをする必要はまったくありません。emerge で普通にシステムを更新する再に、もしカーネルのアップデートがあれば自動的にソースが "/usr/src" 以下に展開されます。

もし特定パッケージの更新を抑制するでご紹介した方法でカーネルソースの更新を止めている場合は、"/etc/portage/package.mask" の該当行を削除し、以下のコマンドでカーネルソースパッケージを更新してください(gentoo-sources を使用していた場合。カーネル選択の詳細は Gentoo Linuxカーネルガイドをご参照ください)。

emerge --update gentoo-sources

/usr/src/linux を書き換える

カーネルをコンパイルするためには、シンボリックリンクである "/usr/src/linux" がコンパイルするソースを正しく指している必要があります。それには、以下のコマンドを実行します。

cd /usr/src
ln -sfn linux-2.6.14-gentoo-r6 linux

もしくは、USEフラグsymlink を追加しておけば、パッケージを更新したときに自動的にシンボリックリンクも書き換えるようになります。

カーネルをコンパイルする

準備が整ったところで、カーネルをコンパイルしましょう。カーネルコンパイルには、"make oldconfig" を使う簡易的な方法と、手動で設定する方法です。前者はリビジョン(カーネルパッケージ名の最後の "-r?" の部分)のみが違うなど、比較的変更が少ない場合に、前回のコンフィギュレーションファイルを引き継いでコンパイルする方法です。この方法は手軽ですが、コンフィギュレーションファイルの項目が追加・変更された場合に不具合を起こす原因になります。それを認識した上で行いましょう。時間に余裕があれば、なるべく後者の方法で行うのがよいと思います。

"make oldconfig" を使う方法

まず、現在のカーネルのコンフィギュレーションファイルを新しいカーネルソースのディレクトリにコピーします。以下のコマンドでよいでしょう。

cd /usr/src/linux
cp ../linux-2.6.14-gentoo-r5/.config .

そして、以下のコマンドを実行してコンフィギュレーションファイルを更新します。

make oldconfig

このとき、追加されたオプションについて扱いを尋ねてくるときがありますので、適切に設定してください。なにも入力せずに Enter を押せばデフォルトの設定になります。また、? を入力して Enter を押せば簡単な説明を見ることもできます。もし不安に思ったときは、処理を中断して手動で設定する方法に切り替えましょう。

設定が終わったら、普通にカーネルをコンパイルしてください。

make && make modules_install

手動で設定する方法

こちらは、インストール時とほぼ同じ手順でカーネルコンフィギュレーションを行い、コンパイルすることになります。以下のコマンドでコンフィギュレーションメニューに入ります。

cd /usr/src/linux
make menuconfig

コンフィギュレーションの詳しい情報はカーネルコンパイルを参照してください。設定が終了したら、こちらも普通にコンパイルし

make && make modules_install

カーネルを /boot にコピーする

上記のいずれの方法でコンパイルした場合でも、生成したカーネルは手動で "/boot" にコピーする必要があります。以下のようにコピーすれば OK です。

mount /boot
cd /usr/src/linux
cp arch/i386/boot/bzImage /boot/kernel-2.6.14-gentoo-r6
cp .config /boot/config-2.6.14-gentoo-r6

これでカーネルのコンパイルは終了です。次はこのカーネルを起動できるようにするために、ブートローダーの設定を行います。

GRUB のエントリーを追加

ブートローダー GRUB の設定ファイルに新しいカーネルのエントリーを追加しましょう。vim などのテキストエディタで "/boot/grub/grub.conf" を開き、以下を最初のエントリーとして挿入して保存してください。

title Gentoo Linux 2.6.14-r6
root (hd0,0)
kernel /boot/kernel-2.6.14-gentoo-r6 root=/dev/sda3 clock=pit nosmp noapic nolapic

ルートファイルシステム以外のカーネルオプションは VMware の時刻遅れを防止するためのものです。詳細は「VMware で Linux を動かした際の時刻のずれを解消する」を参照してください。

以前のエントリーはまだ消さないほうが無難です。エントリーを残しておけば、もし新しいカーネルで問題が起きても古いカーネルで起動できます。

再起動

ここまできたら、仮想マシンを再起動します。

shutdown -r now

正常に再起動できたでしょうか。VMwareTools をインストールしている場合は、ネットワークカードの認識でエラーが出るはずです。それは次で対処しますので、ここでは無視してください。もしそれ以外の原因で不具合が発生した場合は、古いカーネルで起動してカーネルオプションなどを確認してみてください。

VMwareTools のモジュールを再構築する

カーネルを更新するときは、カーネルモジュールもすべて再構築しなければなりません。そう、VMwareTools のカーネルモジュールも再構築が必要なのです。面倒ですが仕方がありません。手順は VMwareTools のインストールでご紹介したものがそのまま適用できますが、ここで必要な作業だけを簡単にまとめておきます。

ダミーのファイル・ディレクトリを作成します。

touch /etc/init.d/vmware-tools
chmod 700 /etc/init.d/vmware-tools
mkdir /etc/init.d/rc{0,1,2,3,4,5,6}.d
echo '/etc/init.d/net.eth0 $1' >> /etc/init.d/network
chmod 755 /etc/init.d/network

VMwareTools を再インストールします。

  1. "/usr/bin/vmware-config-tools.pl -skipstopstart" を実行します。
  2. vmhgfs モジュールをビルドするか尋ねてくるので、そのまま Enter を押します。
  3. カーネルのヘッダファイルのパスを尋ねてきます。そのまま Enter を押せば、自動検出されたパスが使用されます。

ビルドが終わったら、動作チェックします。手順は以下のとおりです。最初の 3 つのコマンドはエラーが出ると思いますが、問題ありません。

/etc/init.d/net.eth0 stop
rmmod pcnet32
rmmod vmxnet
depmod -a
modprobe vmxnet
/etc/init.d/net.eth0 start

ダミーファイルを削除します。

rm -rf /etc/init.d/rc?.d
rm -rf /etc/init.d/vmware-tools
rm -f /etc/init.d/network

このあたりはスクリプトにするという手もありますが、root ユーザーで実行しているだけにちょっと不安ですね。

これでカーネルの更新作業は完了です。もう一度再起動してみましょう。今度はネットワークカードも正常に認識されるはずです。

古いカーネルを削除する

新しいカーネルが安定しているようなら、古いカーネルを削除できます。以下の手順で行うとよいでしょう。

まず、古いカーネルバイナリを削除します。

mount /boot
rm /boot/kernel-2.6.14-gentoo-r5
rm /boot/config-2.6.14-gentoo-r5

次に、"/boot/grub/grub.conf" から古いカーネルのエントリーを削除します。それが終わったら、"/boot" をアンマウントしておきましょう。

umount /boot

そして、カーネルのソースをアンインストールします。以下のコマンドは、最新以外のカーネルソースをアンインストールします。くれぐれも、現在使用中のカーネルをアンインストールしないように注意してください。

emerge --unmerge gentoo-sources-2.6.14-r5

もしくは、こっちのほうがいいか?

emerge --clean gentoo-sources-2.6.14-r5

ただし、緊急時のためにひとつくらいは古いカーネルを保持しておくことをお勧めします。世の中、何があるかわかりませんからね。(^^;

以上で、カーネルの再コンパイルは完了です。残念ながら、けっこう手間がかかる作業ですが、慣れるしかないですね。カーネル設定のどこをデフォルトから変更しているかなど、メモっておくとよいかと思います。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles