Linux OS 開発環境/ツール

【PC】Linuxビルドのノウハウ(ビルドとインストール)

Linuxのカーネルビルドとインストールに関するメモです。

この記事で解決できること

  • Linuxのカーネルビルドとインストールに関するノウハウを知ることが出来る。

関連記事

【PC】Linuxビルドのノウハウ(ビルドとインストール)

【PC】Linuxビルドのノウハウ(残課題)

【WSL】WindowsでLinuxを動かす

【Yocto】組み込みLinuxの主流はYocto

【Linuxコマンド】便利な小技たち(TIPS)

【ネットワーク】WindowsからUbuntu14.04に接続する方法2つ

【Linuxコマンド】パッチを使いこなしたい

【UNIX時間】2038年問題について整理する

前置き的な話

Linuxのビルドってなんか複雑。Yoctoは色々自動化されてて基本を理解するのには適さない気がするので、ソースを落として自分でmakeしたい。しかし、いきなり詳しくなれないし、王道の手順を知っておきたいので、得意な人に聞いたり、ネットで調べたり、ポイントを押さえながら進めていきたいです。が、最終的には過去に購入したLinuxの本たちを読み込み深く理解したいと思ってます(言うのは自由)。また、自分のスキルを促成栽培したいわけではなくて、応用力を付けるためにも途中で疑問に思ったことを寄り道しながら1つずつ解消していきたいです。

組込LinuxはBSPのマニュアル通りに進めればビルドしたu-boot、カーネル、ファイルシステムで比較的簡単に起動できますが、カーネルを自力でバージョンUPしたり、カスタマイズしようとすると、色々わかってないことが多いことに気づく。しかもハードウェアが特殊なのでハマると抜け出すのに時間がかかる。なのでまずはPC Linuxから始めてみることに。

何はともあれThe Linux Kernel Archive(本家)のソースを落とす。カーネルとモジュールにパッチを当てる。ビルドする。インストールする。という一連の手順を少しずつ見ていきます。...ってこういう話、5年くらい前から言ってるけど全然出来てないワタクシでした。今回はやり遂げたいです。

カーネルビルド方法を調べる

まず初心者向けKernelのビルド手順本家Linux カーネルをコンパイルして仮想PCで起動するを読んだ。断片的だがまずThe Linux Kernel Archive(本家)からソースを落とすのが基本の様子。

そもそも自分が使ってるカーネルバージョンなんだっけ

我が家はUbuntu14.04を使ってます。unameで色々調べてみるとカーネル3.13でした。カーネル3.14あたりにUPDATEするならハードル低めですかね。

% uname -a
Linux pavement1234 3.13.0-165-generic #215-Ubuntu SMP Wed Jan 16 11:46:47 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux すべて表示

% uname -s
Linux カーネル名

% uname -n
pavement1234 ノード名

% uname -r
3.13.0-165-generic カーネルリリース番号

% uname -v
#215-Ubuntu SMP Wed Jan 16 11:46:47 UTC 2019 カーネルバージョン

% uname -m
% uname -p
% uname -i
x86_64 マシンのハードウェア名、プロセッサの種類、ハードウェアプラットフォーム、すべてこれが表示された

% uname -o
GNU/Linux OS

$ uname --version
uname (GNU coreutils) 8.21
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie。 uname自体のバージョン情報

 

The Linux Kernel Archive(本家)でカーネル3.14をダウンロードする

さて、The Linux Kernel Archive(本家)に来ました。最新のstable(安定版)は5.1.16のようです。まずこのページの単語から調べてみよう。

まず真ん中あたりにカーネルVerらしきものが列挙されているが、その左に記載されたmainline、stable、longterm、linux-nextの違いを知るためLinuxカーネルのソースコードを読んで、システムコールを探る (1/3)を読んだ。

mainline 最新バージョン
stable 安定バージョン
longterm 長期メンテナンスが行われるバージョン

linux-nextが良く分からないので更に2017年3月6日 「ルールを守らないリクエストはもう受け付けない」―Linus,やや不機嫌ながらLinux 4.11-rc1を公開を読んでみると、以下のことが分かった。とにかく新しいカーネルにパッチを入れたいときは、まずここに入れないとライナス氏の怒りを買うみたいですね。

linux-next Stephen Rothwellが管理するGitリポジトリで、開発者は次期カーネルにマージさせたいパッチがあれば、まずここに入れる。パッチのIDをlinux-nextとマージウィンドウで一致させるためだ。だが、ルールは必ずしも守られない。Linusは「fixesやstartxのシステムコール関連などのパッチはある程度しかたない。でも<linux/sched.h>に関してはかなりひどい。そして今回目立ったのはサブシステムやInfiniBand、DRM、btrfsなど」と具体的なソースをあげ、「?こんな簡単なルールすら守れないなら、それに見合った結果を手にすることになるだろう」とコメント、「次のマージウィンドウではそういう"自分勝手なパイバス行為"はいっさい受け付けない。もし次回、linux-nextに入っていないコードをマージさせようとするヤツがいて、そいつが僕の“クソリスト”の常連なら、また僕に怒鳴られることになるだろう」と強い口調で警告している。

Stephen Rothwell氏。The linux-next and -stable treesに写真がのってました。

次に気になったのがtarballtar ball(ターボール)って何?と思って調べてみるとかなり深かった!を読むと、tar(wikipedia)に以下の解説がある。tarballはjargon(専門用語、隠語)の類みたい。イマイチジョーク(面白さ)が理解できませんが、まあいいか。

UNIX系コミュニティでは、圧縮したtar形式のファイルを"tarball"(ターボール)と呼ぶこともある。
この語は、元々は「リーマスじいや(英語版)」の童話『タールの赤ん坊(英語版)』に由来し、それに油塊(タールボール)を引っ掛けたジョーク的用語である。

jargonと言うと、ついついヨーダ記法を思い浮かべてしまう。

ヨーダ記法とは左辺に定数を持ってくるスタイル。スターウォーズのヨーダがこういう文法・語順で喋ることに由来しますが、私の周りではあまり人気がありません。

 if( NULL == parameter )

stable(5.1.16)のtarballをクリックするとlinux-5.1.16.tar.xzというファイル名である。

xzって何?Linux で tar.xz 形式のファイルを解凍するを見るとこう書いてある。

xz

LZMA2のデータ圧縮アルゴリズムを採用したデータ圧縮フォーマット、およびその圧縮プログラム。圧縮に時間がかかるが圧縮率は優秀です。

xzを解凍するときはこんな感じ。

①xzの解凍 → tarの解凍と順番に行う方法
$ xz -dv xxx.tar.xz
$ tar xfv xxx.tar

②tar.xz をまとめて解凍
$ xz -dc xxx.tar.xz | tar xfv -

③xz -dc の代わりに xzcat
$ xzcat xxx.tar.xz | tar xfv -

④GNU tar 1.22 から xzフォーマットをサポートしてる
$ tar Jxfv xxx.tar.xz

せっかくなので、気になったことを一通り調べてみることに。

tarballの横にあるpgpを開くとこういうのが出てくる。PGP 鍵を用いたファイルの暗号化を読んだ。gpgと言うコマンドでPGP鍵を使えるみたい。ちょっと脱線しすぎなので一旦戻る。

-----BEGIN PGP SIGNATURE-----
Comment: This signature is for the .tar version of the archive
Comment: git archive --format tar --prefix=linux-5.1.16/ v5.1.16
Comment: git version 2.22.0

iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl0cjh4ACgkQONu9yGCS
aT4MTg//SueSNjP5VAfAhFYCeYmZ5iNu1WIxqYJNOd0Th0kePJXimL1k6ULA1QMX
gP7LVERLMsE7HnLAp7zI11U2Hm6Nu2jlRBKM19wsGDywVWiu7iBbwHIKfZBslvHV
7ZfevSAf65FWUay5i6OA4LcvuKx6l+luYIDXKpKQJql8T4KL/B6W3Yy32DVsLCJw
cWIdzTq/Natwm+Uf/7IFkjCaigXdXUXgSUZTMOH+6hk8tNwad9Vo2uJQdzxz3zzN
mqAsWBZCE6FTxnRrGQIg+2/Q68RRjHrtQT5Y0NzzlL9+rlDgOQxfCsEJ/h+A0Wk4
VbdHLjptg45tUA9AkUbY1Aa5I9XeJ440F4kL4JiRd4ZJ6ahRD20To7wdzBuANMpc
kaZXP7Eer3Azy8DZ3xDy3vLZdu024924lcdayaf4NgxoCuhWw/AS4gKRXi/xkstg
9BUvS93Sh6fRxpcWoRXSuzvXa/jl9XVOCJcObN8RoJlqF0eV9ISsqiE8lQL0IA94
QDMyFNOmKnPWkS61cQNFl0HTqNr/34rDeH5ch3+uGv+r/wUNQnID5ogMW1OUjniL
H2A4beR0Gc8fKyHp7JSUBNiYzyxqBO5HXoCQJfgvQF+dgt7ja4fU4S2z49nsFQyX
Gd1nnuRzJNmChkaAICPNcVZ/mZb+8ShbLT/4GbYleORNOm/S0RE=
=canC
-----END PGP SIGNATURE-----

次にpatchinc.patch。両方落としてみたが、どっちも普通のパッチだった。patchのリンクにマウスを持っていくと「Download to previous mainline」と表示される。inc.patchのリンクにマウスを持っていくと「Download incremental patch」と表示される。まだ違いが分かってない。いつか調べよう。

view diff。要はパッチ化した差分をGUIで見れるようにしたやつ?。

browse。これはすごく便利。ディレクトリ階層を掘っていけばソースを見れる。

changelog。コミットのログですね。更新履歴。

これでThe Linux Kernel Archive(本家)のトップページに書いてある単語は一応理解した。次はHTTP、GIT、RSYNCと書いてあるリンクを掘ってみたい。実はちょっと掘ってみたが、こんな感じのディレクトリ階層が見えたものの、どれを選べばよいのかイマイチわからない。

適当にlinux→kernel→v3.xと掘ったところ、カーネル3.14が居そうな感じ。

カーネル3.14は3.14.79が一番新しいバージョンみたい(2016年9月11日8:05 75M )

ダウンロードした(74.9MB)。

カーネルアーカイブをWindowsからLinuxにコピーしたい。

なんとなくscpでコピーしてみたい...。

Windows10でCMDプロンプトを開きscpと打ってみた。Usageが出るので使えそう。

Linuxでもscpと打ってみた。Usageが出るので使えそう。

【 scp 】コマンド――リモートマシンとの間でファイルをコピーするを読んだ。いくつかコマンド打ち込んだがエラー発生。ちょっとメンドクサイ感じだし、横道に逸れた調査なので今回はパス(次回試してみたいネタではある)。

TeraTermで効率良くファイル転送を読んだところ、WindowsからLinuxにファイル転送する場合、TeraTermウィンドウにファイルをドラッグ&ドロップすればよいみたい。LinuxからWindowsにファイル転送する方法も書いてある。

ドラッグ&ドロップしたら、こんな画面が出てきて。

OK押したらコピーが始まり、ファイル転送できた。Tera Term超便利。

linux-3.14.79.tar.xzを解凍する

linux-3.14.79.tar.xzはLinux側のホームディレクトリにコピーされた。xzなのでJオプションを付けてtar解凍。linux-3.14.79が出来た。

 command
$ tar Jxvf linux-3.14.79.tar.xz

(なんかJオプション付けなくても解凍できた。イマドキのtarは高機能みたい。)

linux-3.14.79の中を探索

ls。カーネルソースって感じ。

 

linux-3.14.79を/usr/srcに移動

カーネルソースは/usr/srcに置くことになってるらしいので、そうする。

 command
$ sudo mv linux-3.14.79 /usr/src

.configをコピー

/bootconfig-3.13.0-165-genericという名前でカーネル3.13.165の.configが置いてあるので、/usr/src/ linux-3.14.79に.configという名前でコピーする。これにより現在動作してるカーネルとホボ同じ設定になるはず(設定項目にバージョン毎の差異があると完全一致しないという意味でホボ)。

 command
$ cp /boot/config-3.13.0-165-generic /usr/src/linux-3.14.79/.config

ビルドツールのインストール

そういえば、このUbuntu14は組込LinuxをビルドしてるPCなので、ビルドツールがインストール済み。デフォルトでは入ってない気がするので明示的にインストールしておく。初心者向けKernelのビルド手順を読むと、これらのツールを入れとくといいみたい。

 command
$ sudo apt-get -y update
$ sudo apt-get -y install build-essential
$ sudo apt-get -y install libncurses-dev
$ sudo apt-get -y install fakeroot
$ sudo apt-get -y install kernel-package
$ sudo apt-get -y install linux-source
$ sudo apt-get -y install libssl-dev

カーネル4.16ではこれもいるみたい。

 command
$ sudo apt-get -y install bison
$ sudo apt-get -y install flex

ツールがinstall済かを見るにはどうすればいいか。aptコマンドチートシートを読んだ。sudo dpkg -lを打つとインストール済みのパッケージが全部表示されるみたいなのでgrepでキーワードを絞る。

 command
$ sudo dpkg -l | grep build-essential hitしたしインストール済みだった。
$ sudo dpkg -l | grep libncurses-dev hitしなかったがインストール済だった。
$ sudo dpkg -l | grep fakeroot hitしたしインストール済みだった。
$ sudo dpkg -l | grep kernel-package hitしなかったのでインストールした。
$ sudo dpkg -l | grep linux-source hitしなかったのでインストールした(カーネル3.13のソース)。
$ sudo dpkg -l | grep libssl-dev hitしなかったのでインストールした。
$ sudo dpkg -l | grep bison hitしなかったのでインストールした。
$ sudo dpkg -l | grep flex hitしなかったのでインストールした。

さらにsudo apt show kernel-packageを試してみた。パッケージの情報が表示された(上記ツールの中でパッケージ情報が表示できないのもいくつかある)。

 command
$ sudo apt show kernel-package
Package: kernel-package
Priority: optional
Section: universe/misc
Installed-Size: 1,890 kB
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Manoj Srivastava <srivasta@debian.org>
Version: 12.036+nmu3
Depends: build-essential, make (>= 3.80-10), po-debconf, gettext, file, debianutils (>= 2.30), binutils (>= 2.12), util-linux (>= 2.10o), module-init-tools (>= 0.9.10)
Recommends: cpio
Suggests: linux-source | kernel-source, e2fsprogs (>= 1.41.4), libncurses-dev, docbook-utils, xmlto, bzip2, linux-initramfs-tool, grub (>= 0.93) | grub2, jfsutils (>= 1.1.3), mcelog (>= 0.6), oprofile (>= 0.9), pcmciautils (>= 004), ppp (>= 2.4.0), procps (>= 3.2.0), reiserfsprogs (>= 3.6.3), squashfs-tools (>= 4.0), udev (>= 081), xfsprogs (>= 2.6.0), quota, btrfs-tools
Download-Size: 427 kB
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
APT-Manual-Installed: yes
APT-Sources: http://jp.archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages
Description: A utility for building Linux kernel related Debian packages.
This package provides the capability to create a Debian kernel image
package by just running make-kpkg kernel_image in a kernel source
directory tree. It can also package the relevant kernel headers into
a kernel-headers package. In general, this package is very useful if
you need to create a custom kernel, if, for example, the default
kernel does not support some of your hardware, or you wish a leaner,
meaner kernel. It also scripts the steps that need be taken to
compile the kernel, which is quite convenient (forgetting a crucial
step once was the initial motivation for this package). Please look at
/usr/share/doc/kernel-package/Rationale.gz for a full list of advantages
of this package.

make menuconfigでカーネルコンフィギュレーション画面を開く

/usr/src/linux-3.14.79/でmake menuconfigを打つ。

 command
$ cd /usr/src/linux-3.14.79/
$ make menuconfig

カーネルコンフィギュレーション画面が開いた。今回は特にパラメタの変更はしない。

「Save」を押すと.configをそのまま保存するか、リネームするか聞いてくるので「OK」を押す。

.configの書き込み成功。「Exit」で抜けるとカーネルコンフィギュレーション画面に戻るので、更に「Exit」を押して抜ける。

抜けた後のコンソールログはこんな感じ。

 command
$ make menuconfig
scripts/kconfig/mconf Kconfig *** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.

make allでカーネルイメージとドライバモジュール(*.ko)をビルド

とりあえずこれでビルドしてみる。

 command
$ make all
scripts/kconfig/conf --silentoldconfig Kconfig
SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_32_ia32.h
SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_64_x32.h
SYSTBL  arch/x86/syscalls/../include/generated/asm/syscalls_64.h
HOSTCC  arch/x86/tools/relocs_32.o
HOSTCC  arch/x86/tools/relocs_64.o
HOSTCC  arch/x86/tools/relocs_common.o
HOSTLD  arch/x86/tools/relocs
CHK     include/config/kernel.release
UPD     include/config/kernel.release
(ビルドがひたすら続く…)

2014年ぐらいに初めてカーネルビルドにチャレンジしたとき。職場のGURU的存在からmake allmake installで行け、と教わったので、今回もそれでいこうと思ったのだが、ビルドが長いので待っている間に初心者向けKernelのビルド手順+ + カーネル再構築 + +を読むと誰もmake allしてない。みんなmake-kpkgでビルドしてる。どゆこと?

どうもmake-kpkgでビルドするとパッケージ管理対象になる。するとdpkgでインストールできるようになって便利みたい。せっかくビルドしているが構築したバイナリは一旦お蔵入りにしよう(そのうち試してみよう)。次回、make-kpkgから再開します。

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も行ける気がする。

ビルドした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パッケージ作成をやってみる

というわけで、一通り予備知識を得たので真似してやってみる。

 command
$ 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を付けて実行してみた。

 command
$ 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でインストールすればいいのね。

 command
$ 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
完了

インストールがうまくいった感じ。リブートしてみた。

 command
$ sudo reboot

リブート後、無線LANがうまく認識されないみたいなのでTeraTermで接続できず。もう1度リブートしたら繋がりました。謎だ…。

というわけでuname -aを打ち込んだところ、無事カーネル3.14に更新されていることが確認できました。

 command
$ 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を見てみる。いい感じにインストールされている。

 command
$ 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/も見てみる。いい感じ。

 command
$ 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

さて、インストールまではうまく行きました。

まとめ

とりあえずインストールまで駆け足で実施しました。

いろいろ宿題が残ってるので、残課題編をまとめます。

関連記事

【PC】Linuxビルドのノウハウ(ビルドとインストール)

【PC】Linuxビルドのノウハウ(残課題)

【VirtualBox】仮想OS環境にUbuntu18 LTS(Linux)をインストールする手順

【WSL】WindowsでLinuxを動かす

【Yocto】組み込みLinuxの主流はYocto

【Linuxコマンド】便利な小技たち(TIPS)

【ネットワーク】WindowsからUbuntu14.04に接続する方法2つ

【Linuxコマンド】パッチを使いこなしたい

【UNIX時間】2038年問題について整理する

  • この記事を書いた人
  • 最新記事

ペイヴメント

ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。

-Linux, OS, 開発環境/ツール

Copyright© ペイヴメントのエンジニア塾 , 2020 All Rights Reserved.