2011年1月1日土曜日

Ubuntu 10.10のカーネル再構築

一時はやめた、カーネルの再構築をやってみた。
(1)下準備
$ aptitude search linux-source
でパッケージ名を検索し、
$ sudo aptitude install linux-source-2.6.35
でソースをインストール、というかダウンロード。
カーネルビルドに必要なパッケージをインストール。
$ sudo aptitude install kernel-package build-essential libncurses5-dev libqt3-mt-dev
これで準備OK
(2)ソースの展開。
$ cd /usr/src
$ sudo tar jxvf linux-source-2.6.35.tar.bz2
/usr/src/linux-source-2.6.35というディレクトリにソースが展開される。
(3).configファイルのコピー
$ sudo cp /boot/config-2.6.35-24-generic .config
これで、現在のカーネルコンフィギュレーションファイルがコピーされる。
(4)カーネルコンフィギュレーション
$ sudo make oldconfig
これは、新しいカーネルコンフィギュレーションとの整合性を取るためのものらしい。本来なら、新しい設定が増えたりすると、質問してくるらしいが、今回はなかった。
$ sudo make menuconfig
ここからが、実際のカーネルコンフィギュレーション。設定項目が多すぎるので、詳細は割愛するが、私のように調子に乗って「関係ねーや」とか言っていろいろ切りすぎると、kernel panicで動かなくなるので要注意。
書いてある説明では、
[*] built-in =カーネルに組み込み
[ ] excluded =カーネルに組み込まない
<M> module =モジュールにする(多分、カーネルには組み込まないけど、必要になったら呼び出すってことだと思う)
<  >が付いてるところはモジュールにすることが可能。
Shift + / 、すなわち、?を入力する要領でキーを押してやれば、その設定項目のヘルプが参照可能。
/ で設定項目のサーチが可能。 
とりあえず、Processor type and features -> Processor familiyをいじったり、Intel CPUならAMDの、AMD CPUならIntelのを切る程度から始めたほうがいいかもしれない。
あと、Networking support -> Amateur Radio support はアマチュア無線のデバイスか何か知らないけど、それがないなら絶対にいらない。
Kernel hackingはすべて切っといてもカーネル開発をしないなら問題ないらしい。
絶対にいらない(他社製で、Dell laptop support)と思えるもの以外は<M>にしておけば、なんとかなる気がする。
(5)Extraversionの変更
$ sudo vim Makefile
で、EXTRAVERSION=の後ろをわかりやすく、かつ、標準のカーネルのそれとは変わるようにしておいたほうがいい。同じ名前にすると、インストール時に当然ややこしくなる。
この部分は、カーネルのバージョンの例えば、2.6.35-24-genericで言えば、「-24-generic」 に相当する。私は、EXTRAVERSION=.original0xにしておいた。
(6)omnibookのMakefileの編集
omnibookというモジュールのMakefileに問題があり、そのため、ビルドが止まってしまうことがあった。簡単に言うと、原因は、変数の扱いがミスってるために、makeが当該のファイル(sections.lds)を参照できないため。ということで、環境によっては大丈夫かもしれないが、一応、修正しておくのが良い。
$ gksudo gedit
でroot権限でgeditを実行し(vimの検索機能の使い方を知らないorzため)、ソースのディレクトリ内のubuntu/omnibook/Makefileを開く。
で、sectionsで検索をかけると、
EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds
とある。ここが問題の箇所。ちなみに、変数PDWの処理がおかしい(if で分岐すると、elseの時にはソースのパスが代入されないらしい)。
で、他のサイトでは、変数PWDにちゃんと正しい値が代入されるように書き換えていたが、めんどくさいので、汎用性はなくなるが、$(PWD)を消して、絶対パスを記してやればいいと思う。どうせ、他の場所でビルドしないし。
ってことで、この箇所を、
EXTRA_LDFLAGS += /usr/src/linux-source-2.6.35/ubuntu/omnibook/sections.lds
に書き換える。
(7)いよいよビルド。
$ sudo su -
で、rootになって、
# export CONCURRENCY_LEVEL=(CPU、コア、スレッドの数より+1の数)
で、makeに使う、CPUとかの数の上限を高めておくと並列でやってくれるらしい。AtomはHTTだが、どこまでいってもシングル・コアなので、効果は限られていただろうが、一応やった。おまじない程度。
# logout 
でrootを抜け、
$ sudo make-kpkg clean 
$ sudo make-kpkg --initrd --revision=(適当。ここでは日付にしておいた) kernel_image kernel_headers
でビルドが開始される。
(8)新しいカーネルのインストール
ビルドが完成すると、1つ上のディレクトリにdebパッケージが生成されるのでこれをインストール。
$ cd ..
$ sudo dpkg -i linux-image-2.6.35.(EXTRAVERSION)_(revision)_i386.deb linux-headers-2.6.35.(EXTRAVERSION)_(revision)_i386.deb
1組しかパッケージがないなら、めんどくさいから、これでもいい。
$ sudo dpkg -i *.deb 
これでインストールされる。GRUBも自動で更新される。
(9)再起動、そして新しいカーネル(?)
再起動をかければ、自動で新しいカーネルから起動するはず。
起動しない場合(kernel panicとか)、起動時にシフトキーを押してやれば、GRUBからカーネルを選択して起動できるようになるので、きちんと動いていたカーネルを選択して起動してやればいい。
カーネルの削除自体は、aptitudeとかを使ってやれば、普通のアプリと同じように削除できる。

カーネルを再構築して速く、軽くなったかって?分からんわw
ただ、カーネルコンフィギュレーションは面白かったし、いろんなことを処理してるんだなぁってことで、Linuxの仕組みにはちょっと明るくなった。

参照したサイト一覧
http://mwlab.net/2010/07/ubuntu-10-04-rebuild-kernel.html
http://ankyo.blog.so-net.ne.jp/2010-01-05
http://ky-hive.jp/blog/?p=257
http://www.itmedia.co.jp/enterprise/articles/0708/21/news018.html
omnibookのsections.ldsがおかしい原因について記したサイト
(参考にする前に絶対パスをしてしてやる解決策を見出したんだと、自分の臨機応変さについては主張しておきたい(笑))
http://ankyo.blog.so-net.ne.jp/2010-05-04-1

0 件のコメント:

コメントを投稿