カーネルを順番にアップグレードしていくために,パッチが配布されています。例え
ば,今バージョン1.1.45を使用していて,どこかに`patch46.gz
'があるこ
とに気づきました。これはそのパッチをあてることで,バージョン1.1.46にアップ
グレードできることを意味します。まずソースツリーをバックアップしたほうがよ
いかもしれません(`make clean
'して,
`cd /usr/src; tar zcvf old-tree linux
'すれば圧縮されたtarファイル
が作成できます)。
例を続けます。/usr/src
に`patch46.gz
'があるとします。
/usr/src
にcd
して`zcat patch46.gz | patch -p0
'を
実行してください(あるいは,パッチが圧縮されていない場合は
`patch -p0 < patch46
'を実行してください)。画面がすごい勢いで流れて
行き(あるいは遅いシステムの場合はぱらぱらと)個々のパッチ当てに成功したかど
うかが表示されます。通常この表示は読むには速すぎるので,うまく行ったのかどう
かわかりません。そんなときは-s
フラグをつけるといいでしょう。こうす
るとpatch
コマンドはエラー以外のメッセージは表示しなくなります(「お
れのコンピュータは何か書き換えているぜ!」って実感はないですが,こっちの方が
お好みかもしれません)。うまく行かなかった部分を見つけるには
/usr/src/linux
へcd
し,.rej
という拡張子のついたフ
ァイルを探してください。特定のバージョンのpatch
コマンド(恐らく低機
能なファイルシステム上でコンパイルされた古いバージョンのpatch
)は拡
張子#
をパッチ当てできなかったファイルにつけます。.rej
を探すには`find
'が使用できます。
find . -name '*.rej' -printとするとカレントおよびその下のサブディレクトリに存在する,拡張子
.rej
を持つすべてのファイルを標準出力に表示します。
すべてうまく行ったら,セクション3と4で説明したように`make clean
',
`config
'および`dep
'します。patch
コマンドには少し
だけオプションがあります。上述の通り,-s
はエラー以外のメッセージを
出さなくなります。カーネルソースを/usr/src/linux
以外に置いている
なら(そのディレクトリで)patch -p1
とすることでうまくパッチを当て
られます。他のパッチはmanコマンドで詳しい説明を読むことができます。
以前,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
ファイル)を持ってきて最初からやりなおす
ことです。
いくつかパッチを当てると,.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 --があります。
Linusが配布している以外にもパッチがあります(私はこれを「非標準」と呼ぶこと にします)。このようなパッチを当てるとLinusのパッチが当たらなくなったり,非 標準のパッチを取り除いてソースやパッチを修正しなければいけなかったり,新し いソースをインストールしなおしたり,あるいは以上の組み合せをしなくてはならな くない可能性があります。これは大変ストレスのたまることですから,(悪い結果に なりそうな)ソースの変更を望まないならLinusのパッチを当てる前に非標準パッチ を戻すか,さもなくば新しいソースをインストールしなおしましょう。それから非標 準のパッチがまだうまく当たるかどうか確認します。うまく行かなければ,うまく行 くようソースやパッチと戯れるか,新しいバージョンのパッチが出てくるのを待って (たぶん乞い願うのでしょう)古いカーネルにとどまってください。
標準の配布に含まれていないパッチはどれくらい一般的なんでしょうか?うわさを聞 くこともあるでしょう。私はカーソルが点滅することをどうしても許せないので,仮 想コンソールでカーソルが点滅しないパッチを当てていました(このパッチは少なく とも以前は新しいカーネルのリリースに合わせて頻繁にアップデートされていまし た)。ローダブルモジュールとして開発されているほとんどの新しいドライバについ ては,``非標準''のパッチが出現する頻度は著しく低くなってきています。