「動かしながらゼロから学ぶ Linuxカーネルの教科書」とラズパイで手を動かしながらカーネルのお勉強

f:id:karaage:20200913210544j:plain:w640

動かしながらゼロから学ぶ Linuxカーネルの教科書

 日経BP様より「動かしながらゼロから学ぶ Linuxカーネルの教科書」(以降 Linuxカーネルの教科書)を献本いただきました。

書籍:

Kindle:

 私は、Linuxカーネルに関しては「カーネルって、なんか大切なやつでしょ。真ん中の方にある…」程度の知識で、訳も分からずカーネルビルドをしたことがあるくらいのレベルです。そんな私が読んだ感想ですが「分かりやすい」の一言です。

 そもそもカーネルの本って、数が少ないのと、あってもかなりマニアックな本が多いので、初学者向けにこれだけ丁寧に書いてある本ってそれだけで貴重な気がします。

 ただ、あえて疑問を呈すなら、タイトルに「動かしながらゼロから学ぶ」と書いてあるのですが、この本を読んだどれだけの人が動かしながら学べるのだろうか?ということです。1章でカーネルの基礎、2章でモジュール管理と丁寧な説明が続き、3章でいよいよカーネルビルドとなるのですが、ビルド手順の冒頭に書かれているのが

Ubuntu 20.04 LTSあるいはCent OS 8がインストールされたPC上でLinuxカーネルをビルドし、そのカーネルをインストールして起動する作業をやっていきます。

 といきなりLinux PCが要求されます。これまで補助輪付き自転車に乗っていたのに、いきなりバイクで高速走るかのようなハードモードです。カーネルの本読むくらいなら、Linux PCくらい持っているでしょと言われればそうかもしれませんが、なかなか初心者だとメインのLinux PCでカーネルビルドするのも気がひけるのではないかと思います(最悪起動しなくなりますし)。

 また、今からLinuxとカーネルを1から勉強したいという人にとっても、難しい要求に思えますが、そのような人もこの本を読むターゲットに含まれるのではないのかなと感じました。

 「そんなギャップを埋められるものがあれば良いのに」と思ったときに、ふと目に入ったのは…そう「ラズパイ」でした。

f:id:karaage:20200919014323j:plain:w640
 なんの変哲もないラズパイ

ラズパイでカーネルビルドの実験しよう!

 ラズパイ(Raspberry Pi)は、小型で安価なシングルボードコンピュータです。推奨のOSは、Raspberry Pi OSというLinux OSで、Ubuntuと同じくDebianベースのOSとなります。

 ラズパイは安価ですし、OSもデータも全てSDカードに格納されるため、カーネルがクラッシュしても、簡単にやり直すことが可能なので、カーネルをいじるような実験には最適です。

 というわけで「Linuxカーネルの教科書」を買ったけど、手元にLinux PCがないという人のために、ラズパイで書籍の最初の山場である3章のカーネルビルドを実践してみたいと思います。手を動かすことで、より書籍の内容への理解が深まること間違いなしと思います。

 これ以降の手順は、ラズパイのカーネルビルドの公式ドキュメントを参考に「Linuxカーネルの教科書」の流れに沿ってカーネルビルドを実践していきます。

ラズパイのセットアップ

 ラズパイの初期セットアップは、以下記事参照ください。

 カメラやディープラーニングの設定は不要なので、初期設定のところまでを実施すればOKです。

 ハードウェアは、ラズパイ4、OSのバージョンは「Raspberry Pi OS(32-bit) 2020-08-20」を使用しました。ラズパイ2やラズパイ3でも同様の手順でカーネルビルドできると思います(手順の途中、ハードに合わせて一部変更する点ありますが、後述します)。

 ここからは、ラズパイでターミナルを起動してコマンドを実行していきます。

 ビルドに必要なソフトウェアのインストール

 以下のコマンドを実行してインストールしましょう。

$ sudo apt update
$ sudo apt install -y git bc bison flex libssl-dev make

ソースの入手

 カーネルのソースをGitでダウンロード(clone)します。--depth=1というのは、最新版だけダウンロードするというオプションです(shallow cloneと言います)。

$ cd && git clone --depth=1 https://github.com/raspberrypi/linux

 簡単にダウンロードできますね。

ソースツリーの確認

 カーネルソースのディレクトリ構成を確認します。treeコマンドを実行しましょう。

$ tree -L 1 linux

 以下のようなディレクトリがずらっと並びます。「Linuxカーネルの教科書」と見比べると、Ubuntuとほとんど同じことが分かりますね。本にはこれらのディレクトリの簡単な説明があります(ここでは割愛します)。

linux
├── COPYING
├── CREDITS
├── Documentation
├── Kbuild
├── Kconfig
├── LICENSES
├── MAINTAINERS
├── Makefile
├── README
├── arch
├── block
├── certs
├── crypto
├── drivers
├── fs
├── include
├── init
├── ipc
├── kernel
├── lib
├── mm
├── net
├── samples
├── scripts
├── security
├── sound
├── tools
├── usr
└── virt

カーネルのビルド設定

 カーネルのビルド設定をします。以下はラズパイ4の設定です。

$ cd linux
$ KERNEL=kernel7l
$ make bcm2711_defconfig

 他のラズパイの場合は、ここの設定が変わります。ラズパイのカーネルビルドの公式ドキュメントを参考に適宜変更ください。

 上記コマンドを実行するとコンフィグファイル(.config)が生成されます。

 コンフィグファイルの中身をみてみましょう。エディタは好きなもので良いです。初心者だとVS Codeエディタが良いでしょう。以下記事を参考にインストールしてください。

 好きなエディタで、~/linux/.configファイルの中身をみてみましょう。VS Codeなら以下ですね。

$ code ~/linux/.config

f:id:karaage:20200919014234p:plain:w640

 Oh…7594行あります。凄まじいですね。

 この設定を変えることで、自分だけのカーネルをつくりあげることができます。

 といっても、何をどう変えて良いか初心者にはなかなか分かりませんね。ただ、何も変えないのも悔しいので爪痕をのこしましょう。CONFIG_LOCALVERSION="-v7l"という項目が23行目にあります。これに他のカーネルと区別するために自分だけの名前をつけてあげましょう。好きな名前でOKです。ここではKARAAGE KERNELという、からあげなのかフライドチキンなのかよく分からない名前をつけてやります。

CONFIG_LOCALVERSION="-v7l-KARAAGE_KERNEL"

 コンフィグファイルの設定はとても複雑なので、コンフィグファイルを設定するためのツールがあります。いくつかある中でも、代表的なのはmenuconfigです。

 試しにmenuconfigを起動してみましょう。まず、ラズパイでmenuconfigを使うために必要なライブラリをインストールします。

$ sudo apt-get install libncurses5-dev

 menuconfigは以下のコマンドで起動できます。

$ make menuconfig

 以下のようにGUIでセットアップが可能です。

f:id:karaage:20200919014238p:plain:w640

 ただ、これで簡単に設定できるかというと、やはり初心者には難しいですね。

 今回はそっと閉じておきましょう。

カーネルビルド

 いよいよカーネルビルドです(1つしか設定変えてませんが)。

 以下のコマンドでカーネルビルドできます。

$ cd ~/linux
$ make -j4 zImage modules dtbs
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

 ラズパイ4でだいたい1時間くらいかかります。ほとんどmake -j4 zImage modules dtbsの時間です。

 無事ビルドが終わったら、再起動しましょう

$ sudo shutdown -r now

 あとは祈りましょう。

自分だけのカーネルの起動

 無事起動すれば、カーネルビルドは成功です!おめでとうございます。

 ただ、画面に変化がないので本当に自分がビルドしたカーネルが動いているのか、疑問な人もいるでしょう(実際、中身は何も変わってないので)。

 そんな疑問を払拭するために、カーネルのバージョンを確認してみましょう。以下コマンドを実行します。

$ uname -r

 KARAAGE_KERNELと表示されています!

5.4.65-v7l-KARAAGE_KERNEL+

f:id:karaage:20200919014240p:plain:w640

 自分でビルドした、世界に1つだけのカーネルが起動しました。

カーネルビルドのTIPS

 以降、カーネルビルドに関するTIPSのメモです。

ビルドをやり直したい

 ビルドをやり直したいときは、以下コマンドを実行します。

$ make mrproper

 コンフィグファイル含めてやり直しできます。

カーネルのバックアップをとっておきたい

 以下コマンドでバックアップを作れると思いますが、バックアップ使ったことはないです。

$ cd /boot
$ sudo mkdir -p boot_org/overlays
$ sudo cp *.dtb boot_org/
$ sudo cp overlays/*.dtb boot_org/overlays/
$ sudo cp overlays/README boot_org/overlays/
$ sudo cp kernel7.img boot_org/

Jetson Nanoでカーネルビルドしたい

 Jetson NanoというNVIDIA製のシングルボードコンピュータでカーネルビルドしたい場合は、以下記事参照ください。

他のカーネル関係の入門書籍

 「Linuxカーネルの教科書」以外のカーネル関係の初心者向けの本だと、同じく日経BPさんの「Linuxカーネル超入門」を以前読んだことがあります。こちらは「Linuxカーネルの教科書」より幅広い内容を取り扱っているので「Linuxカーネルの教科書」を読んで、専門書にステップアップする一つ前の段階として読んでみるのが良いかなと思います。

まとめ

 「動かしながらゼロから学ぶ Linuxカーネルの教科書」の紹介とラズパイを使った手を動かしながらの学習方法(カーネルビルド)を紹介しました。

 カーネルビルドって、実際にやったことないと「凄く難しくて大変そう」という印象があったりしますが、ラズパイで手順通りにやれば、思ったより手軽にできます。失敗しても、ラズパイならすぐやり直しもできますしね。

 一度カーネルビルドすると、今まで意識してなかったカーネルが、グッと身近に感じられるのではないかと思います。カーネルに興味ある方は、 ラズパイ片手に「Linuxカーネルの教科書」を読みながら実践してみることオススメいたします!

書籍:

Kindle:

関連記事