Ubuntu Weekly Recipe

第333回 カーネルパッケージをビルドしよう

この記事を読むのに必要な時間:およそ 9 分

Ubuntuのカーネルパッケージは,Linuxカーネルにいくつもの手を加えUbuntuのさまざまな機能にとって必要なConfigを有効にしたうえで作成しています。今回はそのUbuntuカーネルパッケージを少しだけカスタマイズしてビルドする方法を紹介します。

カーネルパッケージをビルドする理由をひねりだす

第278回のUbuntuカーネルとの付き合い方でも紹介したように,UbuntuにとってLinuxカーネルはもっとも重要なコンポーネントの1つです。そのためカーネルに対しては,フルタイムで働くCanonical社員も含む専用のメンテナンスチームが次期リリースに向けての開発方針の決定,アップストリームからのパッチの取り込み,サポート期間中のすべてのリリースにおけるセキュリティアップデート対応などを行っています。

そんなカーネルパッケージですから,普通の利用であればUbuntuパッケージをそのまま使用するほうが良いでしょう。もしカスタマイズするとなると,自分でセキュリティアップデートに追随する必要がありますし,コンフィグの変更によって何かのソフトウェアが動かなくなる可能性もあります。よって,よっぽどのことがない限り,独自のカスタマイズはしないことを強くお勧めします。

それを踏まえたうえでカーネルパッケージを自前でビルドする必要があるとすれば,次のような動機が考えられます。

カーネルそのものやドライバーの開発

Linuxカーネルやカーネルドライバーの開発者であれば,当然のことながらカーネルをビルドする必要は出てくるでしょう。ただしこのケースの場合は,Ubuntuのカーネルをベースにすることはほとんどなく,アップストリームの特定のバージョンのカーネルだったり,LSP/BSPなどで提供されるベンダーのコードを利用することになりますし,あえてパッケージングまで行うこともあまりないはずです。もしパッケージングするとなるとMainlineBuildsという形で,Debianパッケージに必要なファイル群のカーネルソースコードへの取り込みから行うことになります。

Ubuntuカーネルの不具合を修正したい

カーネルに起因すると思われる何か不具合に遭遇したときに,デバッグメッセージを仕込んだカーネルを作成して,テストします。すでに他の場所で修正されていることがわかっている場合は,それの修正を取り込んで試してみることもあるでしょう。

特定のデバイスやソフトウェアを動かすためにConfigを変更する必要がある

カーネルの特定の機能と連携するタイプのデバイスやソフトウェア(たとえばsystemdやLXC)を使うとき,Ubuntuの標準設定とは異なるConfigで,カーネルを再構築しなければならないときがあります。

パフォーマンスチューニング

特定の用途向けにLinuxカーネルを使うとき,パフォーマンスをチューニングするために,Linuxカーネルのコードその物に手を加えたり,Configを変更することもあります。パラメーターの変更程度であればカーネルオプションやsysctlでも行えたりしますが,より深く,より細かくとなると,カーネルの再構築も必要になってくるかもしれません。とくにUbuntuのカーネルは,一般的なデスクトップPCやPCサーバー上で動かすことを想定して設定が行われていますので,用途を限定したときに不要となるものも多数存在するでしょう。

知的好奇心・勉強・興味本位

これは言わずもがな,ですね。

今回は例としてOpenBlocks AX3のカーネルパッケージを作成してみます。OpenBlocks AX3はMarvellのARMADA XP(MV78260)を搭載した国産の小型ARMサーバーです注1)。12.04まではUbuntuでもARMADA XP用のイメージを配布していたために,そのイメージを使えば比較的簡単にOpenBlocks AX3上にUbuntuをインストールできましたが,Ubuntu 14.04 LTSではARMADA XPのイメージは提供されなくなりました。

幸い,ARMADA XPのソースコードやOpenBlocks AX3のDevice Treeは14.04で採用されている,3.13カーネルには取り込まれています。さらに,14.04のARM向けカーネルはCONFIG_ARCH_MULTIPLATFORMが有効になっているので,genericフレーバーにConfigを追加するだけで,OpenBlocks AX3のカーネルパッケージを作成できそうです。

そこで,ここではConfigを変更したカーネルパッケージの作成方法を紹介しつつ,具体例としてOpenBlocksを取り上げます。上記の動機に照らし合わせると,3つ目の「特定のデバイスやソフトウェアに……」に該当します。あくまで例ですので,作成手順は他のアーキテクチャーやフレーバーにも応用できます。

注1)
標準のOSとしてDebianの7.xが採用されていますので,あえてUbuntuをインストールするよりは,Debianをそのまま使いつづけるほうが簡単で確実です。

パッケージにするメリット

カーネルをただビルドして使用するだけでなく,パッケージ化するメリットにはどんなものがあるのでしょうか。

まず複数マシンへのカーネルやモジュール,ソースコードのインストールやアップグレード,ダウングレードが簡単になります。パッケージファイルをコピーしてdpkgコマンドを実行するだけで済むのは魅力的ではないでしょうか。もちろんリポジトリの構築や電子署名も行えば,aptコマンドによるインストールも可能です。

さらにパッケージにしておけば,DKMSによるモジュールの再構築や,Initramfsの生成,GRUBの起動エントリの更新も自動的に行われます。これは/etc/kernelディレクトリ以下のスクリプトがカーネルパッケージのインストールや削除,更新時に実行されるためで,具体的にどんなことをやっているのかは,/etc/kernelディレクトリを参照してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入