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

5. カーネルへのパッチあて

5.1 パッチをあてる

カーネルを順番にアップグレードしていくために,パッチが配布されています。例え ば,今バージョン1.1.45を使用していて,どこかに`patch46.gz'があるこ とに気づきました。これはそのパッチをあてることで,バージョン1.1.46にアップ グレードできることを意味します。まずソースツリーをバックアップしたほうがよ いかもしれません(`make clean'して, `cd /usr/src; tar zcvf old-tree linux'すれば圧縮されたtarファイル が作成できます)。

例を続けます。/usr/srcに`patch46.gz'があるとします。 /usr/srccdして`zcat patch46.gz | patch -p0'を 実行してください(あるいは,パッチが圧縮されていない場合は `patch -p0 < patch46'を実行してください)。画面がすごい勢いで流れて 行き(あるいは遅いシステムの場合はぱらぱらと)個々のパッチ当てに成功したかど うかが表示されます。通常この表示は読むには速すぎるので,うまく行ったのかどう かわかりません。そんなときは-sフラグをつけるといいでしょう。こうす るとpatchコマンドはエラー以外のメッセージは表示しなくなります(「お れのコンピュータは何か書き換えているぜ!」って実感はないですが,こっちの方が お好みかもしれません)。うまく行かなかった部分を見つけるには /usr/src/linuxcdし,.rejという拡張子のついたフ ァイルを探してください。特定のバージョンのpatchコマンド(恐らく低機 能なファイルシステム上でコンパイルされた古いバージョンのpatch)は拡 張子#をパッチ当てできなかったファイルにつけます。.rej を探すには`find'が使用できます。

      find .  -name '*.rej' -print
とするとカレントおよびその下のサブディレクトリに存在する,拡張子.rej を持つすべてのファイルを標準出力に表示します。

すべてうまく行ったら,セクション3と4で説明したように`make clean', `config'および`dep'します。patchコマンドには少し だけオプションがあります。上述の通り,-sはエラー以外のメッセージを 出さなくなります。カーネルソースを/usr/src/linux以外に置いている なら(そのディレクトリで)patch -p1とすることでうまくパッチを当て られます。他のパッチはmanコマンドで詳しい説明を読むことができます。

5.2 何か変だ

以前,patchが`config.in'というファイルを書き換えてしまい, これが正しくないという問題がよく起こりました。これは,あなたがご自分の環境に 合わせてオプションを変更していたためです。この問題は[新しいリリースでは]修 正してありますが,古いリリースでは起こることがあるかもしれません。修正するに は,config.in.rejファイルを読んで,どこが元のパッチのままになってい るか見ます。変更された部分は行のはじめに`+'と`-'で印がつけ てあります。印で囲まれた部分を見て,それらに`y'と答えたか`n' と答えたか覚えてください。それからconfig.inを編集し,必要なら `y'を'n'へ,'n'を'y'に変更してください。

      patch -p0 < config.in.rej
として成功したら(パッチ当てに失敗しなかったら),カーネルの設定とコンパイル を続けてください。config.in.rejファイルはそのまま残りますが,消去し てしまって構いません。

まだ何か問題があるのなら,壊れたパッチを当ててしまったのかもしれません。 patchが`previously applied patch detected: Assume -R?'と いってきたら,現在のバージョンより古いパッチを当てようとしているのでしょう。 'y'と答えるとpatchはソースを元に戻そうと試みますが,恐らく 失敗します。その結果新たにカーネルソースを持って来なくてはならなくなります (最初展開したところへ展開しなおすのがいいでしょう)。

パッチを当てたものを元に戻すには,元のパッチで`patch -R'します。

パッチ当てに失敗してしまったときの最良の手段は,新たにまっさらのソースツリー (例えばlinux-x.y.z.tar.gzファイル)を持ってきて最初からやりなおす ことです。

5.3 .origファイルの消去

いくつかパッチを当てると,.origファイルがたまってきます。例えば, 私が1.1.48で最後に.origを消去した1.1.51のソースツリーでは, .origを消すことで500 kBのディスクスペースが空きました。

      find .  -name '*.orig' -exec rm -f {} ';'
とすれば面倒をすべてみてくれます。パッチ当てに失敗したファイルに.rej ではなく#を使用するバージョンのpatchでは, .origのかわりにチルド(tilde)を使用してください。

.origを消去するにはより良い方法もありますが,これはGNU xargs のバージョンによります:

      find .  -name '*.orig' | xargs rm
あるいは「極めて確実だが,もう少しおしゃべりな」方法として:
      find . -name '*.orig' -print0 | xargs --null rm --
があります。

5.4 他のパッチ

Linusが配布している以外にもパッチがあります(私はこれを「非標準」と呼ぶこと にします)。このようなパッチを当てるとLinusのパッチが当たらなくなったり,非 標準のパッチを取り除いてソースやパッチを修正しなければいけなかったり,新し いソースをインストールしなおしたり,あるいは以上の組み合せをしなくてはならな くない可能性があります。これは大変ストレスのたまることですから,(悪い結果に なりそうな)ソースの変更を望まないならLinusのパッチを当てる前に非標準パッチ を戻すか,さもなくば新しいソースをインストールしなおしましょう。それから非標 準のパッチがまだうまく当たるかどうか確認します。うまく行かなければ,うまく行 くようソースやパッチと戯れるか,新しいバージョンのパッチが出てくるのを待って (たぶん乞い願うのでしょう)古いカーネルにとどまってください。

標準の配布に含まれていないパッチはどれくらい一般的なんでしょうか?うわさを聞 くこともあるでしょう。私はカーソルが点滅することをどうしても許せないので,仮 想コンソールでカーソルが点滅しないパッチを当てていました(このパッチは少なく とも以前は新しいカーネルのリリースに合わせて頻繁にアップデートされていまし た)。ローダブルモジュールとして開発されているほとんどの新しいドライバについ ては,``非標準''のパッチが出現する頻度は著しく低くなってきています。


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