今回カーネルイメージをビルドしてインストールします。たぶんうまくいくハズ。


【関連記事】


【キーワード】
make-kpkg、make deb-pkt、deb、パッケージ管理システム、カーネルバージョン。
  • 2019/7/9
⑪make-kpkgとは何か?

make-kpkgですぐにでもビルドしたかったのですが、make allが一生懸命頑張っているのでそっとしておくことに。ビルドを待つ間、超ヒマなのでmake-kpkgについて調べてみました。

Debian 管理者ハンドブック 8.10. カーネルのコンパイルを読むとこんなことが書いてあります。
CULTURE kernel-package の古き良き時代

Linux ビルドシステムに適切な Debian パッケージをビルドする能力がなかった時代、Debian パッケージをビルドするのに推奨されていた方法は kernel-package パッケージに含まれる make-kpkg を使うやり方でした。
Debian界隈では既にmake-kpkgも古いと仰ってます?たしかにこのサイトではmake deb-pkgが使われてますね。

Ubuntu(Wikipedia)を見るとUbuntuはDebianから派生したディストリビューションなわけで、debパッケージを扱うことが出来るわけだから、make deb-pkgも行ける気がする。

脱線ついでにlinux kernelのmakeターゲットについてのあれこれも読んでみると、やはりmake deb-pkgが紹介されている。(とはいえmake-kpkgも定番ツールだろうと思うので、後で試してみる。)
ビルドしたkernelをrpmやdebなどのパッケージ管理システムで管理したい

普通にkernelをビルドした場合、つまり、ターゲット指定なしでmakeコマンドを実行した場合、開発者は、distributionが提供するパッケージ管理システムを使うことなく、手動、ないし"make install"を用いてkernelをインストール/アンインストールする必要があります。管理が面倒などという理由でこれが不満なかたは、"make deb-pkg"、あるいは"make rpm-pkg"コマンドを発行すると、それぞれ.deb形式、.rpm形式のkernelパッケージを作成することができます。

⑪make deb-pkgでビルド&debパッケージ作成に関する知識習得

Debian 管理者ハンドブック 8.10. カーネルのコンパイルの「8.10.4. パッケージのコンパイルとビルド」を熟読してみた。make cleanの話と生成されるパッケージに種類が書いてある。
NOTE 再ビルド前の片付け
既にそのディレクトリの中で 1 回コンパイルした状態で、(たとえばカーネル設定を大幅に変更したなどの理由で) すべてを最初から再ビルドしたい場合、make clean を実行してコンパイル済みファイルを削除しなければいけません。make distclean はさらに生成されたファイルも削除します。この中には .config ファイルも含まれますので、忘れずにバックアップしてください。

カーネル設定の準備が完了したら、make deb-pkg で 5 つの Debian パッケージが生成されます。具体的に言えば、

①カーネルイメージと関連モジュールを含む linux-image-version、
②外部モジュールのビルドに必要なヘッダファイルを含む linux-headers-version、
③一部のドライバから要求されるファームウェアファイルを含む linux-firmware-image-version (Debian の配布しているカーネルソースからカーネルをビルドする場合、このパッケージは生成されないかもしれません)、
④カーネルイメージとモジュールのデバッグシンボルを含む linux-image-version-dbg、
⑤GNU glibc などのユーザ空間ライブラリに関連するヘッダを含む linux-libc-dev


が生成されます。

ここで version は

①上流開発バージョン (Makefile 中の VERSION、PATCHLEVEL、SUBLEVEL、EXTRAVERSION から定義されます)、
②LOCALVERSION 設定パラメータ、
③LOCALVERSION 環境変数


を連結したものです。パッケージバージョンは version に規則正しく増え続けるリビジョン番号 (.version に保存されています) を付け加えたものになります。ただし、

④KDEB_PKGVERSION 環境変数

を使えばパッケージバージョンを上書きすることも可能です。


$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb 
../linux-image-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb 
../linux-image-3.16.7-ckt4-falcot-dbg_3.16.7-1_amd64.deb 
../linux-libc-dev_3.16.7-1_amd64.deb  
は無かった)


①上流開発バージョン (Makefile 中の VERSION、PATCHLEVEL、SUBLEVEL、EXTRAVERSION から定義されます)、

/usr/src/linux-3.14.79/Makefileの先頭5行にバージョンが記載されていた。これをつなげて3.14.79となる。
VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 79
EXTRAVERSION =

NAME = Remembering Coco
②LOCALVERSION 設定パラメータ、
上記のmake deb-pktコマンド例にある、LOCALVERSION=-falcot、のことだ。

③LOCALVERSION 環境変数

自分のPCでecho $LOCALVERSIONと打ってみたが何も表示されなかったので環境変数は設定されていないことが分かった。

④KDEB_PKGVERSION 環境変数
上記のmake deb-pktコマンド例にある、KDEB_PKGVERSION=$(make kernelversion)-1、のことだ。Makefileが置いてある/usr/src/linux-3.14.79でmake lernelversionを打ち込むと3.14.79と出力されるが、それに-1を付加した3.14.79-1をKDEB_PKGVERSIONに代入している。

カーネルバージョンについて、もうちょっと詳しく知りたかったので[Linux] kernel version stringを読んでみた。

⑫make deb-pkgでビルド&debパッケージ作成をやってみる

というわけで、一通り予備知識を得たので真似してやってみる。
$ make deb-pkg LOCALVERSION=-pavement1234 KDEB_PKGVERSION=$(make kernelversion)-1
 
  (building…)

  INSTALL include/asm (64 files)
dpkg-deb: `../linux-firmware-image-3.14.79-pavement1234_3.14.79-1_amd64.deb' にパッケージ `linux-firmware-image-3.14.79-pavement1234' を構築しています。
dpkg-deb: エラー: `../linux-firmware-image-3.14.79-pavement1234_3.14.79-1_amd64.deb' を作成できませ ん: 許可がありません
make[1]: *** [deb-pkg] エラー 2
make: *** [deb-pkg] エラー 2

とりあえずエラー発生。許可がない系と思ったのでsudoを付けて実行してみた。
$ sudo make deb-pkg LOCALVERSION=-pavement1234 KDEB_PKGVERSION=$(make kernelversion)-1

  (building…)

  INSTALL include/uapi (0 file)
  INSTALL include/asm (64 files)
dpkg-deb: `../linux-firmware-image-3.14.79-pavement1234_3.14.79-1_amd64.deb' にパッケージ `linux-firmware-image-3.14.79-pavement1234' を構築しています。
dpkg-deb: `../linux-headers-3.14.79-pavement1234_3.14.79-1_amd64.deb' にパッケージ `linux-headers-3.14.79-pavement1234' を構築しています。
dpkg-deb: `../linux-libc-dev_3.14.79-1_amd64.deb' にパッケージ `linux-libc-dev' を構築しています。
dpkg-deb: `../linux-image-3.14.79-pavement1234_3.14.79-1_amd64.deb' にパッケージ `linux-image-3.14.79-pavement1234' を構築しています。
dpkg-deb: `../linux-image-3.14.79-pavement1234-dbg_3.14.79-1_amd64.deb' にパッケージ `linux-image-3.14.79-pavement1234-dbg' を構築しています。

$ ls ..
linux-3.14.79
linux-firmware-image-3.14.79-pavement1234_3.14.79-1_amd64.deb ③
linux-headers-3.13.0-165
linux-headers-3.13.0-165-generic
linux-headers-3.13.0-24
linux-headers-3.13.0-24-generic
linux-headers-3.14.79-pavement1234_3.14.79-1_amd64.deb 
linux-image-3.14.79-pavement1234-dbg_3.14.79-1_amd64.deb ④
linux-image-3.14.79-pavement1234_3.14.79-1_amd64.deb ①
linux-libc-dev_3.14.79-1_amd64.deb 

linux-source-3.13.0
linux-source-3.13.0.tar.bz2
無事5つのdebパッケージが生成されました。

⑬debパッケージのインストール

8.11. カーネルのインストールを読みました。まずはカーネルパッケージ(image)の中身に関する解説。
8.11.1. Debian カーネルパッケージの特徴

Debian カーネルパッケージはカーネルイメージ (vmlinuz-version) をインストールします。カーネルの設定 (config-version) とシンボルテーブル (System.map-version) は /boot/ に置かれます。シンボルテーブルは開発者がカーネルエラーメッセージの意味を理解する際の手助けになります。それどころかシンボルテーブルがなければ、カーネルの「oops」(「oops」とはカーネル空間で起こるユーザ空間プログラムのセグメンテーション違反に相当するエラーです。言い換えれば、不正なポインタを参照して値を取得したことで生成されるメッセージです) に含まれる情報は、数字で表したメモリアドレスだけになります。アドレスとシンボルや関数名を対応付けるテーブルがなければ、この情報は役に立ちません。モジュールは /lib/modules/version/ ディレクトリにインストールされます。
カーネルパッケージの設定スクリプトは自動的に initrd イメージを生成します。initrd はブートローダによってメモリに読み込まれる小さなシステムで (このため「init RAM ディスク」と名付けられています)、Linux カーネルは initrd を使って完全な Debian システムを含むデバイス (たとえば SATA ディスクのドライバ) にアクセスするために必要なモジュールを読み込みます。最後に、カーネルパッケージの post-installation スクリプトが /vmlinuz、/vmlinuz.old、/initrd.img、/initrd.img.old のシンボリックリンクを更新します。これらはそれぞれインストールされた最新の 2 つのカーネルとカーネルに対応する initrd イメージを指します。
これらの作業のほとんどは /etc/kernel/*.d/ ディレクトリの中にあるフックスクリプトが担っています。たとえば、grub との統合は、カーネルがインストールまたは削除された際に update-grub を呼び出す /etc/kernel/postinst.d/zz-update-grub と /etc/kernel/postrm.d/zz-update-grub が担っています。
次にdpkgによるパッケージインストールの解説。
8.11.2. dpkg を使ったインストール

apt はとても便利なので、簡単に低レベルツールについて忘れてしまいます。しかし、コンパイルされたカーネルをインストールする最も簡単な方法は dpkg -i package.deb などのコマンドを使うやり方です。ここで package.deb は linux-image パッケージの名前で、たとえば linux-image-3.16.7-ckt4-falcot_1_amd64.deb です。
この章で説明されている設定手順は基本であり、サーバシステムにもワークステーションにも適用でき、半自動化された方法で広く適用できます。しかしながら、この設定手順だけで完全に設定されたシステムを十分に提供することは不可能です。「Unix サービス」として知られている低レベルプログラムを初めとする、いくつかの要素に対する設定がまだ必要です。
とにかくimageをdpkgでインストールすればいいのね。
$ sudo  dpkg -i linux-image-3.14.79-pavement1234_3.14.79-1_amd64.deb


以前に未選択のパッケージ linux-image-3.14.79-pavement1234 を選択しています。
(データベースを読み込んでいます ... 現在 253096 個のファイルとディレクトリがインストールされています。)
linux-image-3.14.79-pavement1234_3.14.79-1_amd64.deb を展開する準備をしています ...
linux-image-3.14.79-pavement1234 (3.14.79-1) を展開しています...
linux-image-3.14.79-pavement1234 (3.14.79-1) を設定しています ...
update-initramfs: Generating /boot/initrd.img-3.14.79-pavement1234
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Linux イメージを見つけました: /boot/vmlinuz-3.14.79-pavement1234
Found initrd image: /boot/initrd.img-3.14.79-pavement1234
Linux イメージを見つけました: /boot/vmlinuz-3.13.0-165-generic
Found initrd image: /boot/initrd.img-3.13.0-165-generic
Linux イメージを見つけました: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
Adding boot menu entry for EFI firmware configuration
完了
インストールがうまくいった感じ。リブートしてみた。
$ sudo reboot
リブート後、無線LANがうまく認識されないみたいなのでTeraTermで接続できず。もう1度リブートしたら繋がりました。謎だ…。

というわけでuname -aを打ち込んだところ、無事カーネル3.14に更新されていることが確認できました。
$ uname -a
Linux pavement1234 3.14.79-pavement1234 #2 SMP Tue Jul 9 06:38:10 JST 2019 x86_64 x86_64 x86_64 GNU/Linux
/bootを見てみる。いい感じにインストールされている。
$ ls /boot
System.map-3.13.0-165-generic    initrd.img-3.13.0-24-generic
System.map-3.13.0-24-generic     initrd.img-3.14.79-pavement1234
System.map-3.14.79-pavement1234  lost+found
abi-3.13.0-165-generic           memtest86+.bin
abi-3.13.0-24-generic            memtest86+.elf
config-3.13.0-165-generic        memtest86+_multiboot.bin
config-3.13.0-24-generic         retpoline-3.13.0-165-generic
config-3.14.79-pavement1234      vmlinuz-3.13.0-165-generic
efi                              vmlinuz-3.13.0-165-generic.efi.signed
grub                             vmlinuz-3.13.0-24-generic
initrd.img-3.13.0-165-generic    vmlinuz-3.14.79-pavement1234
/lib/modules/3.14.79-pavement1234/も見てみる。いい感じ。
$ ls /lib/modules/3.14.79-pavement1234/
kernel             modules.builtin      modules.dep.bin  modules.softdep
modules.alias      modules.builtin.bin  modules.devname  modules.symbols
modules.alias.bin  modules.dep          modules.order    modules.symbols.bin
さて、今回インストールまではうまく行きました。次回以降、いろいろ置いてきぼりにしてきた調査課題と、カーネルのカスタマイズについて深く掘っていきます。

続く
IMG_20190705_081659



詳解 Linuxカーネル 第3版
Daniel P. Bovet
オライリー・ジャパン
2007-02-26


組み込みLinuxシステム構築 第2版
Karim Yaghmour
オライリージャパン
2009-10-26


Linuxデバイスドライバ 第3版
Jonathan Corbet
オライリージャパン
2005-10-22



スポンサードリンク