次のページ 前のページ 目次へ

7. いくつかの落とし穴

7.1 make clean

通常のアップグレードの後,新しく構築したカーネルが奇妙な動作をするとき は,新しいカーネルをコンパイルをする前に「make clean」を実行 するのを忘れた可能性があります.症状はいろいろで,システムが完全にクラッ シュしてしまったり,入出力がおかしくなったり,速度が遅くなったりするか もしれません.「make dep」も忘れずに実行してください.

7.2 巨大あるいは遅いカーネル

カーネルが多量のメモリを使いこんだり,あまりに巨大だったり,あるいはせっかく 新しい Quadbazillium-III/4400 を投入してやったというのにコンパイルがい つまでたっても終わらないという場合は,いらないものまでカーネルに組みこ んでしまっているかもしれません(デバイスやファイルシステムなどです).い らないものは組みこまないようにしましょう.メモリを浪費することになるか らです.カーネルの巨大化によって現われる,もっとも目立つ症状は,メモリ とディスクの間でスワップが頻繁に起こるというものです.ディスクがあまり にもうるさく,停止時にジェット機の着陸時のような音がする古い富士通製の Eagles というハードディスクも使っていない場合には,カーネルの設定を調 べてみましょう.

カーネルがどれくらいメモリを消費してるかは,/proc/meminfo あ るいは `free' コマンドの ``total mem'' からマシンに 搭載しているメモリ量を差し引くことでわかります.

7.3 パラレルポートが動かない/プリンタが動かない

PC 用の設定オプションは以下の場所にあります.まずは「General Setup」の `Parallel port support' と `PC-style hardware' を選んでください.それ から `Character devices' の `Parallel printer support' を選択してくだ さい.

すると名前表示されます.Linux 2.2 では,プリンタのデバイス名は前のリリー スと異なっています.その結果,古いカーネルで使っていた lp1 は 新しいカーネルでは lp0 となります.これを調べるには `dmesg' コマンドを使うか,/var/log のログを見てくだ さい.

7.4 カーネルをコンパイルできない

コンパイルできない場合,パッチ当てに失敗していたり,カーネルソースがど こか壊れているのかもしれません.gcc のバージョンが違っていたり,gcc そ のものが壊れているのかもしれません(例えばインクルードファイルがおかし いなど).Linus さんが README で説明しているシンボリックリンク が正しく設定されていることを確認してください.一般的に言って,標準のカー ネルをコンパイルできない場合はシステムに重大な問題があり,特定のツール を再インストールする必要があるかもしれません.

場合によっては,ハードウェアの問題で gcc がクラッシュすることがありま す.エラーメッセージは ``xxx exited with signal 15'' というような感じ になり,一般に大変ミステリアスに見えます.このことについてはあまり触れ ませんが,一度わたしも遭遇したことがあります - 原因はキャッシュメモリ の不良で,コンパイラが時々ゲロを吐く[core dump する]ことがありました. この問題に遭遇したら,まず gcc を再インストールしてみてください.外部 キャッシュをオフにしたり,RAM の容量を減らしてみたらカーネルコンパイル がうまく行く場合は,この辺を疑ってみるべきでしょう.

ハードウェアに問題があるかもしれないと言うと,多くの人はいい気持がしな いようです.でも,私は話をでっちあげているわけじゃありません.専用の FAQ もあります -- http://www.bitwizard.nl/sig11/ を見てくださ い.

7.5 新しいバージョンのカーネルでブートしていないようだ

LILO を実行していないか,LILO の設定が正しくありません.以前私が遭遇し たのは設定ファイルの問題でした.`boot = /dev/hda' ではなく `boot = /dev/hda1' と書いていました(これは慣れるまでは本当に 紛らわしいですが,一旦動作する設定ファイルを作ったら後は変更する必要は ありません).

7.6 LILO を実行し忘れた,あるいはまったくブートできない

あらら.ここでの最善の策はフロッピーディスクや 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=bzImageif=vmlinuz へ変更します.どうして /mnt/src/linux が 出てくるのか,という点については気にしないでください.

LILO を大きなドライブ(1024 以上のシリンダを持つもの)で使用すると,問題 が生じることがあります.この問題に関する情報については LILO mini-HOWTO などを参照してください.

7.7 `warning: bdflush not running' という警告が出る

これは重大な問題かもしれません.リリース 1.0 以降のカーネル(94 年の 4 月 20 日前後)から,ファイルシステムのバッファを定期的にフラッシュする `update' というプログラムの修正・置き換えが行われました. `bdflush' のソースを入手し(カーネルソースを取ってきたところで 見つかるはずです),インストールします(インストールはおそらく古いカーネ ルの下で実行するほうがよいでしょう).これはインストールの際に自動的に `update' としてインストールされ,リブートの後は,新しいカーネ ルが文句を言うことはなくなるはずです.

7.8 IDE/ATAPI CD-ROM ドライブが動かない

何とも不思議なことに,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 番目のインタフェース)にしてください.これで動 作するはずです.

7.9 廃れてしまった経路要求に対しておかしな警告が出る

route プログラムや,その他のプログラムで経路を操作するものを 全て新しいバージョンにしてください. /usr/include/linux/route.h(実際には /usr/src/linux にあるファイルです)が変更されているからです.

7.10 1.2.0 でファイアウォールが動作しない

少なくともバージョン 1.2.1 までアップデートしてください.

7.11 ``Not a compressed kernel Image file(カーネルイメージファイルが圧縮されていない)''

/usr/src/linux にできるファイル vmlinux をブートイメー ジとして使用してはいけません;[..]/arch/i386/boot/bzImageを使っ てください.

7.12 1.3.x にアップデートした後コンソール端末に問題が出る

/etc/termcap 内の,コンソール用 termcap エントリを dumb から linux に変更してください.terminfo のエン トリを作成する必要もあるかもしれません.

7.13 カーネルアップグレードの後コンパイルできなくなったようだ

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 にリンクが存 在しなければ,リンクを張り直します.

7.14 上限値を大きくする

少ししかありませんが以下のコマンド例は,カーネルが設定した ソフトリミットを増やす方法を知りたい人の参考になるでしょう:

echo 4096 > /proc/sys/kernel/file-max
echo 12288 > /proc/sys/kernel/inode-max
echo 300 400 500 > /proc/sys/vm/freepages


次のページ 前のページ 目次へ