通常のアップグレードの後,新しく構築したカーネルが奇妙な動作をするとき
は,新しいカーネルをコンパイルをする前に「make clean
」を実行
するのを忘れた可能性があります.症状はいろいろで,システムが完全にクラッ
シュしてしまったり,入出力がおかしくなったり,速度が遅くなったりするか
もしれません.「make dep
」も忘れずに実行してください.
カーネルが多量のメモリを使いこんだり,あまりに巨大だったり,あるいはせっかく 新しい Quadbazillium-III/4400 を投入してやったというのにコンパイルがい つまでたっても終わらないという場合は,いらないものまでカーネルに組みこ んでしまっているかもしれません(デバイスやファイルシステムなどです).い らないものは組みこまないようにしましょう.メモリを浪費することになるか らです.カーネルの巨大化によって現われる,もっとも目立つ症状は,メモリ とディスクの間でスワップが頻繁に起こるというものです.ディスクがあまり にもうるさく,停止時にジェット機の着陸時のような音がする古い富士通製の Eagles というハードディスクも使っていない場合には,カーネルの設定を調 べてみましょう.
カーネルがどれくらいメモリを消費してるかは,/proc/meminfo
あ
るいは `free
' コマンドの ``total mem
'' からマシンに
搭載しているメモリ量を差し引くことでわかります.
PC 用の設定オプションは以下の場所にあります.まずは「General Setup」の `Parallel port support' と `PC-style hardware' を選んでください.それ から `Character devices' の `Parallel printer support' を選択してくだ さい.
すると名前表示されます.Linux 2.2 では,プリンタのデバイス名は前のリリー
スと異なっています.その結果,古いカーネルで使っていた lp1
は
新しいカーネルでは lp0
となります.これを調べるには
`dmesg
' コマンドを使うか,/var/log
のログを見てくだ
さい.
コンパイルできない場合,パッチ当てに失敗していたり,カーネルソースがど
こか壊れているのかもしれません.gcc のバージョンが違っていたり,gcc そ
のものが壊れているのかもしれません(例えばインクルードファイルがおかし
いなど).Linus さんが README
で説明しているシンボリックリンク
が正しく設定されていることを確認してください.一般的に言って,標準のカー
ネルをコンパイルできない場合はシステムに重大な問題があり,特定のツール
を再インストールする必要があるかもしれません.
場合によっては,ハードウェアの問題で gcc がクラッシュすることがありま す.エラーメッセージは ``xxx exited with signal 15'' というような感じ になり,一般に大変ミステリアスに見えます.このことについてはあまり触れ ませんが,一度わたしも遭遇したことがあります - 原因はキャッシュメモリ の不良で,コンパイラが時々ゲロを吐く[core dump する]ことがありました. この問題に遭遇したら,まず gcc を再インストールしてみてください.外部 キャッシュをオフにしたり,RAM の容量を減らしてみたらカーネルコンパイル がうまく行く場合は,この辺を疑ってみるべきでしょう.
ハードウェアに問題があるかもしれないと言うと,多くの人はいい気持がしな
いようです.でも,私は話をでっちあげているわけじゃありません.専用の
FAQ もあります -- http://www.bitwizard.nl/sig11/
を見てくださ
い.
LILO を実行していないか,LILO の設定が正しくありません.以前私が遭遇し
たのは設定ファイルの問題でした.`boot = /dev/hda
' ではなく
`boot = /dev/hda1
' と書いていました(これは慣れるまでは本当に
紛らわしいですが,一旦動作する設定ファイルを作ったら後は変更する必要は
ありません).
あらら.ここでの最善の策はフロッピーディスクや CD-ROM から起動し,別の
ブート可能なフロッピーを作ることです(`make zdisk
' などとしま
す).ルートファイルシステム(/
)の場所とそのファイルシステムの
種類(ext2 や minix など)を知っている必要があります.以下の例では
/usr/src/linux
というソースツリーが置かれているファイルシステ
ムとその種類,そしてこれが通常はどこにマウントされているかも知っていな
ければなりません.
以下の例では,/
は /dev/hda1
にあり,また
/usr/src/linux
が存在するファイルシステムは
/dev/hda3
であり,通常は /usr
にマウントされています.
どちらも ext2 ファイルシステムです.
/usr/src/linux/arch/i386/boot
に存在する,動作するカーネルイ
メージは bzImage
と呼ばれます.
この復旧法の考え方は,もしちゃんと動作する zImage
が存在する
なら,それを新しいフロッピーで使用できるというものです.これよりうまく
いくかどうかは定かではありませんが(これはどのようにしてシステムを破壊
したかによります),別の方法について例の後に説明します.
まずは起動/ルートディスクの組み合せか,あるいは復旧ディスクから起動を 行い,動作するカーネルがあるファイルシステムをマウントします:
mkdir /mnt mount -t ext2 /dev/hda3 /mnt
mkdir
したときにディレクトリはすでに存在するといわれても,無
視してください.続いて動作するカーネルイメージがあったディレクトリへ
cd
します.以下のことに注意してください:
/mnt + /usr/src/linux/arch/i386/boot - /usr = /mnt/src/linux/arch/i386/bootフォーマットしたディスクをドライブ ``A:'' に入れ(断じて起動ディスクや ルートディスクじゃありません!),カーネルイメージをフロッピーへダンプ し,そのイメージが使うルートファイルシステムを設定します:
cd /mnt/src/linux/arch/i386/boot dd if=bzImage of=/dev/fd0 rdev /dev/fd0 /dev/hda1
/
に cd
し,通常は /usr
となるファイルシス
テムをアンマウントします:
cd / umount /mnt
これで,作成したフロッピーからシステムを通常通りにリブートできるはずで す.リブート後,lilo の実行(あるいは失敗の原因の除去)を忘れずに行って ください!
上述の通り,一般的な対処法がもう一つあります.動作するカーネルがたまた
ま /
にある場合(例えば/vmlinuz
),それをブートディス
クとして使うことができます.先に述べた条件をすべて満たしていて,かつカー
ネルイメージが /vmlinuz
である場合,上の例をすべてこれに合う
ように変更するだけです:/dev/hda3
を
/dev/hda1
(/
ファイルシステムです)へ,
/mnt/src/linux
を /mnt
へ,if=bzImage
を
if=vmlinuz
へ変更します.どうして /mnt/src/linux
が
出てくるのか,という点については気にしないでください.
LILO を大きなドライブ(1024 以上のシリンダを持つもの)で使用すると,問題 が生じることがあります.この問題に関する情報については LILO mini-HOWTO などを参照してください.
これは重大な問題かもしれません.リリース 1.0 以降のカーネル(94 年の 4
月 20 日前後)から,ファイルシステムのバッファを定期的にフラッシュする
`update
' というプログラムの修正・置き換えが行われました.
`bdflush
' のソースを入手し(カーネルソースを取ってきたところで
見つかるはずです),インストールします(インストールはおそらく古いカーネ
ルの下で実行するほうがよいでしょう).これはインストールの際に自動的に
`update
' としてインストールされ,リブートの後は,新しいカーネ
ルが文句を言うことはなくなるはずです.
何とも不思議なことに,ATAPI ドライブがうまく動かないという人がたくさん います.たぶんこれは,間違いが起こるポイントがたくさんあるからでしょう.
IDE インタフェースに繋がっているドライブが問題の CD-ROM だけの場合,ジャ ンパの設定を「master」または「single」にしなければなりません.たぶん, これが一番ありがちな間違いです.
(例えば)Creative Labs はサウンドカードに IDE インタフェースを載せてい ます.しかし,これは奥の深い問題を起こします.すなわち,IDE インタフェース が 1 つしか無いマザーボードもありますが,多くのマザーボードには IDE インタフェースが 2 つあります(普通は IRQ 15).したがって,普通は SoundBlaster のインタフェースを 3 番目の IDE ポート(私は IRQ 11 くらい と聞きました)にすることになります.
ところがこれは Linux では問題を起こします.つまり,バージョン 1.2.x は 3 つ目の IDE インタフェースをサポートしていないのです(1.3.x 系列のどこ かでサポートされるようになりましたが,このカーネルは開発版ですし,自動 検出も行われないのを忘れないでください).これを回避する方法はいくつか あります.
2 番目の IDE ポートが既にあり,これが使われていないか,あるいはまだデ バイスが 2 つ繋がっていないことがあります.この場合にはサウンドカード から ATAPI ドライブを取り外し,2 番目のインタフェースに接続してくださ い.そうすればサウンドカードのインタフェースを無効にすることもできます. これでとりあえず IRQ も節約できます.
2 番目のインタフェースがなければ,サウンドカードのインタフェースをジャ ンパで設定して,IRQ15 (2 番目のインタフェース)にしてください.これで動 作するはずです.
route
プログラムや,その他のプログラムで経路を操作するものを
全て新しいバージョンにしてください.
/usr/include/linux/route.h
(実際には /usr/src/linux
にあるファイルです)が変更されているからです.
少なくともバージョン 1.2.1 までアップデートしてください.
/usr/src/linux
にできるファイル vmlinux
をブートイメー
ジとして使用してはいけません;[..]/arch/i386/boot/bzImage
を使っ
てください.
/etc/termcap
内の,コンソール用 termcap エントリを
dumb
から linux
に変更してください.terminfo のエン
トリを作成する必要もあるかもしれません.
Linux のカーネルソースにはたくさんのインクルードファイル(名前が
.h
で終わるファイル)が入っています.これは,
/usr/include
にある標準のインクルードファイルとして参照されま
す.これらのファイルは以下のように参照されます(ここで xyzzy.h
は /usr/include/linux
に存在するもののどれかです):
#include <linux/xyzzy.h>通常,
/usr/include
ディレクトリには linux
というリン
クがあり,これはカーネルソースの include/linux
ディレクトリ
(普通のシステムでは /usr/src/linux/include/linux
)を指していま
す.このリンクが張られていなかったり,あるいはおかしなところへ張られて
いると,ほとんどのプログラムをコンパイルできなくなってしまいます.カー
ネルソースがあまりにディスクスペースを消費するからとこれを消去してしま
うと,このリンクが消滅してしまい明らかに問題になります.ファイルのパー
ミッション(ファイルへのアクセス許可)でもうまくいかない原因になります;
あなたのシステムの root
が,デフォルトで他のユーザーにインク
ルードファイルを見せないように umask を設定していたり,かつカーネルを
展開するときに p
オプション(ファイルモードを変更しない)をつけ
ないと,他のユーザーはやはり C コンパイラを使用できなくなります.
chmod
コマンドでパーミッションを変更することもできますが,イ
ンクルードファイルを展開し直すほうが楽でしょう.最初にソース全体を展開
したときのコマンドに引数を追加するだけです.
blah# tar zxvpf linux.x.y.z.tar.gz linux/include注意: ``
make config
'' は /usr/src/linux
にリンクが存
在しなければ,リンクを張り直します.
少ししかありませんが以下のコマンド例は,カーネルが設定した ソフトリミットを増やす方法を知りたい人の参考になるでしょう:
echo 4096 > /proc/sys/kernel/file-max echo 12288 > /proc/sys/kernel/inode-max echo 300 400 500 > /proc/sys/vm/freepages