読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Linuxカーネルコンパイル

Linuxカーネル
前回に引き続きカーネルの更新についてです。今回はやや難しいやり方。 手順としては ①コンパイル環境の設定&カーネルソースを手に入れる ②現カーネルを元に、更新カーネルの設定をする ③②とは別の設定。CPUとか。 ④コンパイルして.debファイルを作成 ⑤インストール となります。 コンパイル環境 幾つかのパッケージをインストールします。 # aptitude install build-essential kernel-package libqt3-mt-dev libncurses5-dev ◆ソースのダウンロード The Linux Kernel Archives 好きなバージョンを選んでいいですが、あんまり現バージョンと離れすぎると、引き継ぐ設定とは別で新しい項目がたくさんになるので出来れば近いものの方が問題なくバージョンアップできると思います。 私が試したのは Ubuntu11.04:3.0→3.3 Ubuntu10.04:2.6.32.39→2.6.32.56 です。結論から言うと前者は成功、後者はカーネルパニックになったので何度も再検証してます。未だに解決できてないのでこれはまたカーネルパニックへの対応として別記事で載せる予定です。 ◆解凍して現バージョンから設定を引き継ぐ ダウンロードしたソースは/usr/src/へコピーします。 # mv linux-source-xxx.tar.bz2 /usr/src/ # cd /usr/src # tar xvjf linux-source-xxx.tar.bz2 # cd linux-source-xxx ディレクトリ移動して解凍。そして移動。 現バージョンの設定を持ってきます。 # cp /boot/config-xxx-generic .config # make oldconfig ◆個別設定 次にGUIで各種設定を行います。 # make xconfig make menuconfigでも同じ事ができますが、xconfigの方がGUIな分わかりやすいです。 主に編集するのはCPUの部分。これをいじるだけで随分変わるそうな。実際試した感想では特にわからなかったが。 以下すべてProcessor type and featuresの設定。 Processor Family:Core 2/newer Xeon High Memory Support:4G以上なら64Gを選択 Maximum Number of CPUs:コアの数。仮想含む。システムモニタに表示される分 (ダブルクリックで編集できるようになる) SMT(Hyper Threading) Scheduler Support;Core iシリーズならON Preemption Model:Preemptible Kernel(Low Latency Desktop) Timer Frequency:1000Hz 終わったら保存して終了します。 カーネルコンパイル # make-kpkg clean # make-kpkg --initrd kernel_image kernel_headers --append_to_version="string" --revision=123 -j 3 「-j」は並列コンパイルのオプションです。ただ10.04では出来なかったので、その場合は以下のコマンドを打った上で # export CONCURRENCY_LEVEL=3(コア数+1がいいらしい) 大体2コアで30〜40分、12コアでは7分程度で終わりました。やっぱり並列処理させると早いんですね。 ◆できた.debファイルをインストール /usr/src/にimage.debとheaders.debができているので、それを image→headers の順にインストール 再起動後に # cd /lib/modules/(新しいカーネル名) # ln -s /usr/src/linux-headers(新しいカーネル名) build としてシンボリックリンクを張る。こうしないと新しいカーネルでドライバ類をインストールしようとするときにダメになるらしい。最悪起動しなくなるとも。 で、先に申し上げたように再起動後11.04は問題なく更新でき、10.04の方はカーネルパニック。 まぁ古いカーネルで再起動してSynapticでインストールしたカーネルを削除すれば元通りになりましたが。 あとブート時のOS数も更新されたりされなかったりで不明。もう少し検証する必要がありますね。 ◆補足 もしコンパイル中にerrorが起きたら以下の対処をすればいいかも。私のケースでは必要ありませんでしたが。 # ln -s /usr/src/linux-source-xxx/ubuntu /ubuntu ◆補足2 # make xconfig ..... In file included from scripts/kconfig/qconf.cc:48: scripts/kconfig/qconf.moc:13:34: error: private/qucomextra_p.h: そのようなファイルやディレクトリはありません みたいなエラーが起きて起動ができない場合はQtの選択が違う可能性が高いです。普通はQt4にしないとダメなので # update-alternatives --config moc   選択肢    パス            優先度  状態 ------------------------------------------------------------ * 0            /usr/bin/moc-qt3   45        自動モード   1            /usr/bin/moc-qt3   45        手動モード   2            /usr/bin/moc-qt4   40        手動モード をしてqt4を選択してください。ただカーネルが古い場合は逆にqt3じゃないと動かないとかいう記事もありました。選択したら # make distclean # make xconfig このdistcleanを忘れると起動しないので注意。 ソース: Ubuntu 11.04ではじめてのカーネルコンパイル&インストール 初めてのKernel compile ~xconfig編~ Ubuntu日本語フォーラム カーネルをコンパイルしよう make xconfig broken on 2.6.37-rc2 ハウツー:自分のシステムに最適なカーネルを構築する