Ubuntu Weekly Recipe

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

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

DTBファイルのインストール

ハードウェアのプロパティについて記述するDevice Treeに対応したアーキテクチャであれば,DTBファイルをパッケージに含めることができます。OpenBlocks AX3用のDvice Treeがカーネルのソースコードに含まれていますので,これもパッケージに含めてしまいましょう。

$ echo -e 'dtb_files_generic\t+= armada-xp-openblocks-ax3-4.dtb' >> debian.master/rules.d/armhf.mk

armhf.mkの中に,⁠dtb_files_フレーバー名 += DTVファイル名」と書いておくと,そのフレーバーのバイナリパッケージの「/lib/firmware/カーネルバージョン/device-tree/」以下にDTBファイルが保存されます。Debice Treeのソースコードは「arch/arm/boot/」以下に存在しますので,そこから必要になるファイル名を探してください。

debian.master/changelogの編集

最後にdebian.master/changelogを編集します。このときのバージョン名がCONFIG_VERSION_SIGNATUREなどに使われます。よくわからなければ,下記コマンドのように1つ前のエントリのバージョンに「+ラベル」というバージョンにしておきましょう。

$ dch -v "$(dpkg-parsechangelog -SVersion -ldebian.master/changelog)+obs1" \
    -c debian.master/changelog "Support OpenBlocks AX3"
Linux (3.13.0-30.55+obs1) trusty; urgency=low

(変更点をここに記述)

Linux (3.13.0-30.55) trusty; urgency=low

(3.13.0-30.55リリース時の変更点)

Linux (3.13.0-30.54) trusty; urgency=low

ただし,この場合binary-genericターゲットのmodule-check/abi-checkはchangelog上の1つ前のエントリ(3.13.0-30.55)に対して実行しようとします。しかしながら,debian.master/abi/以下には2つ前のエントリ(3.13.0-30.54)の情報しかないため,チェックに失敗してしまいます。本来はメンテナースクリプトを使って前のバージョンのABI情報を生成するのですが,面倒であればチェックそのものをスキップしてしまいましょう。

$ skipmodule=true skipabi=true fakeroot debian/rules binary-generic

上記のようにskipmodule/skipabiにtrueを設定しておけば,module-check/abi-checkは何も行いません。恒常的に設定を変更したい場合は,debian/rules.d/0-common-vars.mkのAUTOBUILDに1を設定してください。

あとは「パッケージのビルド」に従ってビルドすれば,変更が適用されたパッケージが作成されます。debファイルはlessコマンドで中身を表示できますので,新規に指定したモジュールやDTBファイルがlinux-imageパッケージに含まれるか確認してください。

そして次のステップへ

新規に作成したカーネルパッケージは,そのままdpkgコマンドでインストールできます。GRUBがインストールされた環境であれば,/etc/kernel/postinst.d/zz-update-grubによって,GRUBの起動エントリも自動的に更新されているはずです。インストール後再起動し,unameコマンドで新しいカーネルになっていることを確認してください。

今回の例ではパッケージ名が公式リポジトリのそれと同じになるので,Pinで固定しないと公式リポジトリのカーネルパッケージがアップデートされたときに,別のカーネルに差し変わってしまうでしょう。

ARMデバイスのように,ブートローダーがU-Bootの場合はもう一手間以上必要になります。UbuntuのカーネルパッケージにはU-Boot用のイメージファイルは含まれていないため,既存のカーネルイメージやInitramfsをu-boot-toolsパッケージのmkimageコマンドで変換し,場合によってはU-Bootの環境変数やboot.scrを変更しなくてはいけないからです注4⁠。

Initramfs(通常は/boot/initrd.img-3.13.0-30-genericといった名前になります)は,カーネルパッケージには存在しません。パッケージインストール時に,initramfs-toolsパッケージのコマンドで自動生成やアップデートを行うためです。

カーネルそのものはMultiPlatformに対応しているARMデバイスすべてで共通になるのですが,U-Boot対応のカーネルイメージはボードによって異なります。よって,UbuntuのNetbootインストール用のカーネルイメージはボード毎にDTBデータを埋め込んだ状態で用意されています。Netbootでインストールしたい場合は,同じようにカーネルイメージを作成したうえで,Initramfsイメージ(uInitrd)に今回作ったlinux-imageのカーネルモジュールをインストールしておく必要があるでしょう。なおこのuInitrdもU-Bootのヘッダー部分(先頭64バイト)がデバイス毎に異なりますので,そのまま他のデバイスに流用することはできません。

別にインストーラーは必要ないということであれば,開発マシン上でUbuntu Coreを外付けディスクなりSDカードなりに展開したうえで,chrootしてdpkgコマンドで作成したカーネルパッケージをインストールしてしまえば,ルートファイルシステムの完成です。この方法ならInitramfsも手に入れられるので一石二鳥になります。

このようにデバイスによっては,パッケージを作成した後もいろいろとやらなければいけないことが出てくるものの,一度「Ubuntuのやり方」を把握しさえすれば,あとは他の対応デバイスと同じことが実現できます。最近はHummingBoardなどおもしろそうなARMデバイスもちょこちょこ増えていますので,夏休みの課題に特定ボード向けのカーネルパッケージを作ってみるのはいかがでしょうか。

注4)
このへんはflash-kernelパッケージによってある程度自動化できます。ただしUbuntu 14.04 LTSのflash-kernelはDebianのそれに比べて古いバージョンをベースにしており,OpenBlocks AX3のサポートが入っていないため,OpenBlocks AX3上で動かすためにはカスタマイズが必要です。

著者プロフィール

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

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