第524回ではメインラインビルドのバイナリパッケージのインストール方法を紹介しました。今回はメインラインカーネルをできるだけそのままビルドする方法を紹介します。
Ubuntuのカーネル事情
改めて言うまでもないことではありますが、
さてカーネルはコンピューターシステムにおいてハードウェアとアプリケーションを仲立ちする存在です。つまりあるハードウェアがUbuntuで動くかどうかを調べる場合、
最新のハードウェアのサポートという観点から考えると、
たとえばここ数回のリリースにおけるUbuntuのバージョンとカーネルのリリース日の比較は次のとおりです。
バージョン | リリース日 | Ubuntuにおける扱い |
---|---|---|
4. |
2016年1月 | 16. |
4. |
2016年3月 | |
4. |
2016年5月 | |
4. |
2016年7月 | |
4. |
2016年9月 | 16. |
4. |
2016年12月 | |
4. |
2017年2月 | 17. |
4. |
2017年4月 | |
4. |
2017年6月 | 17. |
4. |
2017年9月 | |
4. |
2017年11月 | |
4. |
2018年1月 | 18. |
4. |
2018年4月 | |
4. |
2018年6月 |
このようにUbuntuの場合は、
通常のリリースは9ヶ月のサポート期間なので、
そこで導入されているのがHWE
HWEカーネルについては、
Ubuntu用のカーネルをビルドする方法
さて、
- より新しいUbuntuカーネルがリリースされるのをおとなしく待つ
- Ubuntuカーネルにパッチを当ててビルドし直す
- Ubuntuのメインラインビルドを使う
- Upstreamのソースコードをそのままビルドする
カーネルに詳しいと言い切れない人に対しておすすめするのは1.の
ただし本当に単に待つだけでは、
2.は本来のUbuntuカーネルを少し改変することで修正される不具合の場合に有効です。特にUpstreamなどではパッチが存在し取り込まれている場合に使える手でしょう。UbuntuカーネルのソースコードはパッケージリポジトリやカーネルチームのGitリポジトリからダウンロードできます。詳しい手順は第333回で紹介していますので、
Ubuntuのリリースカーネル以外のバージョンを使いたい場合は、
最後の4.はUbuntuカーネルではなくUpstreamのカーネルをそのまま使う方法です。ただしカーネルコンフィグはUbuntuのそれを使うことも可能です。たとえば仮想マシンの上など、
前フリが長くなってしまいましたが、
カーネルビルド環境の準備
まずはLinuxカーネルのビルドに必要なパッケージをインストールしましょう。
$ sudo apt install git ccache fakeroot libncurses5-dev $ sudo apt build-dep linux
個別にインストールしているパッケージの用途は次のとおりです。
- git:ソースコードの取得・
管理に使用する - ccache:ビルドの高速化
(今回は使用しません) - fakeroot:カーネルパッケージ作成時に使用
- libncurses5-dev:カーネルコンフィグ時のUIをビルドする際に必要
次のbuild-dep
」/etc/
のdeb-src
フィールドを有効化しておく必要があります。該当するファイルを手で編集するか、
「build-dep
」Build-Depends
」
$ apt showsrc linux (中略) Build-Depends: debhelper (>= 9), dh-systemd, cpio, kernel-wedge, ... (後略)
linuxパッケージの場合はおよそ数百MBのパッケージをダウンロード・
ちなみに
最後にVanillaカーネルの最新のソースコードをダウンロードします。
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux $ mkdir ../build
最後にビルドデータを置くディレクトリを作っています。
カーネルパッケージをビルドする
カーネルパッケージを作成する際は主に、
このうちカーネルコンフィグではカーネルの各種機能のオンオフやデフォルトパラメーターの設定、
Ubuntuが動いている実機がある場合は、/boot
ディレクトリにコンフィグファイルがあります。それをそのままコピーしましょう。
$ cp /boot/config-`uname -r` ../build/.config
実機がない場合や別リリース・/boot
が空なので、
$ wget -O ../build/.config http://kernel.ubuntu.com/~kernel-ppa/config/bionic/linux/4.15.0-21.22/amd64-config.flavour.generic
フレーバーやアーキテクチャーごとにコンフィグファイルが置いてありますので、
UbuntuカーネルのコンフィグからCONFIG_
を外しておくと、
$ scripts/config --file ../build/.config --disable DEBUG_INFO
ダウンロードしたコンフィグを元に最新のカーネルにあわせて作り直します。
$ make O=../build/ olddefconfig make[1]: ディレクトリ '/home/ubuntu/kernel/build' に入ります HOSTCC scripts/basic/fixdep GEN ./Makefile HOSTCC scripts/kconfig/conf.o YACC scripts/kconfig/zconf.tab.c LEX scripts/kconfig/zconf.lex.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf scripts/kconfig/conf --olddefconfig Kconfig .config:890:warning: symbol value 'm' invalid for HOTPLUG_PCI_SHPC .config:1144:warning: symbol value 'm' invalid for NF_NAT_REDIRECT .config:1147:warning: symbol value 'm' invalid for NF_TABLES_INET .config:1148:warning: symbol value 'm' invalid for NF_TABLES_NETDEV .config:1331:warning: symbol value 'm' invalid for NF_TABLES_IPV4 .config:1336:warning: symbol value 'm' invalid for NF_TABLES_ARP .config:1343:warning: symbol value 'm' invalid for NF_NAT_MASQUERADE_IPV4 .config:1378:warning: symbol value 'm' invalid for NF_TABLES_IPV6 .config:1388:warning: symbol value 'm' invalid for NF_NAT_MASQUERADE_IPV6 .config:1416:warning: symbol value 'm' invalid for NF_TABLES_BRIDGE .config:3992:warning: symbol value 'm' invalid for HW_RANDOM_TPM .config:4941:warning: symbol value 'm' invalid for LIRC .config:6167:warning: symbol value 'm' invalid for SND_SOC_INTEL_SST_TOPLEVEL .config:6172:warning: symbol value 'm' invalid for SND_SOC_INTEL_MACH .config:7725:warning: symbol value 'm' invalid for DELL_SMBIOS_WMI .config:7726:warning: symbol value 'm' invalid for DELL_SMBIOS_SMM # # configuration written to .config # make[1]: ディレクトリ '/home/ubuntu/kernel/build' から出ます
「warning」
カーネルとカーネルモジュールをビルドしましょう。
$ time make -j9 O=../build/ LOCALVERSION=-stock make[1]: ディレクトリ '/home/ubuntu/kernel/build' に入ります GEN ./Makefile scripts/kconfig/conf --syncconfig Kconfig GEN ./Makefile WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h HOSTCC scripts/basic/bin2c (中略) LD [M] sound/usb/usx2y/snd-usb-usx2y.ko LD [M] virt/lib/irqbypass.ko LD [M] sound/x86/snd-hdmi-lpe-audio.ko make[1]: ディレクトリ '/home/ubuntu/kernel/build' から出ます real 17m23.013s user 124m57.950s sys 11m6.538s
モジュール側は次のようにビルドします。
$ time make modules -j9 O=../build/ LOCALVERSION=-stock
LOCALVERSION
はメインラインビルドとは異なるということを明示するためにつけています。指定してもしなくてもかまいません。またカーネルコンフィグのCONFIG_
を有効にすると、
最後にカーネルパッケージを作成しましょう。4.
$ make bindeb-pkg O=../build/ LOCALVERSION=-stock make[1]: ディレクトリ '/home/ubuntu/kernel/build' に入ります /bin/bash /home/ubuntu/kernel/linux/scripts/package/mkdebian dpkg-buildpackage -r"fakeroot -u" -a$(cat debian/arch) -b -nc -uc dpkg-buildpackage: info: source package linux-4.18.0-rc2-stock dpkg-buildpackage: info: source version 4.18.0-rc2-stock-1 dpkg-buildpackage: info: source distribution bionic (中略) INSTALL debian/headertmp/usr/include/xen/ (4 files) INSTALL debian/headertmp/usr/include/asm/ (62 files) dpkg-deb: building package 'linux-headers-4.18.0-rc2-stock' in '../linux-headers-4.18.0-rc2-stock_4.18.0-rc2-stock-1_amd64.deb'. dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_4.18.0-rc2-stock-1_amd64.deb'. dpkg-deb: building package 'linux-image-4.18.0-rc2-stock' in '../linux-image-4.18.0-rc2-stock_4.18.0-rc2-stock-1_amd64.deb'. dpkg-genbuildinfo --build=binary dpkg-genchanges --build=binary >../linux-4.18.0-rc2-stock_4.18.0-rc2-stock-1_amd64.changes dpkg-genchanges: warning: package linux-image-4.18.0-rc2-stock-dbg in control file but not in files list dpkg-genchanges: info: binary-only upload (no source code included) dpkg-source --after-build build dpkg-buildpackage: info: binary-only upload (no source included) make[1]: ディレクトリ '/home/ubuntu/kernel/build' から出ます
bindeb-pkg
ターゲットはバイナリパッケージのみを、deb-pkg
ターゲットならソースパッケージも作ってくれます。
$ ls -1 ../*.deb ../linux-headers-4.18.0-rc2-stock_4.18.0-rc2-stock-1_amd64.deb ../linux-image-4.18.0-rc2-stock_4.18.0-rc2-stock-1_amd64.deb ../linux-libc-dev_4.18.0-rc2-stock-1_amd64.deb
Ubuntuのカーネルパッケージと異なり、
カーネルパッケージをインストールする
あとはlinux-image*.deb
パッケージを、
$ sudo apt install ../*.deb
システムを再起動し、/etc/
のGRUB_
からquiet splash
」sudo update-grub
」
これで問題なく起動することを確認したら、