動かしながらゼロから学ぶ Linuxカーネルの教科書
日経BP様より「動かしながらゼロから学ぶ Linuxカーネルの教科書」(以降「Linuxカーネルの教科書」)を献本いただきました。
追記:第2版が出たのでリンクを追記しました。プロセス間通信(9章)、仮想化昨日「KVM」の仕組み(10章)が大幅追加されていますので、今から買うなら第2版がおすすめです。
私は、Linuxカーネルに関しては「カーネルって、なんか大切なやつでしょ。真ん中の方にある…」程度の知識で訳も分からずカーネルビルドをしたことがある、くらいのレベルの漢(おとこ)です。そんな私がこの「Linuxカーネルの教科書」を読んだ感想ですが…「分かりやすい」の一言でした!
そもそもカーネルの本って、数が少ない上にあったとしてもかなりマニアックな本であることが常なので、初学者向けに丁寧に書いてある本というだけで貴重だと思います(個人の感想です)。
ただ、あえて疑問を呈するとするなら、この本を読みながらタイトル通り「動かしながらゼロから学ぶ」ことが出来る人がどれだけいるのか?ということです。本書の構成は、1章でカーネルの基礎、2章でモジュール管理と丁寧な説明が続き、3章でいよいよカーネルビルドとなるのですが、ビルド手順の冒頭に書かれているのが以下の文です。
Ubuntu 20.04 LTSあるいはCent OS 8がインストールされたPC上でLinuxカーネルをビルドし、そのカーネルをインストールして起動する作業をやっていきます。
いきなりLinux PCが要求されます。これまで補助輪付き自転車に乗っていたのに、いきなりバイクで高速走るかのようなハードモードです。
「この本読んで今からカーネル勉強しよう!」という初心者だとメインのPCにLinuxをインストールしてカーネルビルドするのは勇気がいるのではないかと思います。失敗すると、最悪起動しなくなりますからね(何度も起動しなくなりました)。
この書籍のターゲットは、Linuxを既に使っている人はもちろん、上記のような今からLinuxとカーネルを勉強したい人も含まれると思うのですが、なかなか大きいハードルがあるように感じました。
「そんなギャップを埋められるものがあれば良いのに」と思ったとき、ふと私の目に入ったのは…そう「ラズパイ」でした。
なんの変哲もないラズパイ
ラズパイでカーネルビルドの実験しよう!
ラズパイ(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エディタが良いでしょう。ターミナルで以下コマンドでインストールできます(既にインストールされているかもしれません)。
$ sudo apt update $ sudo apt install code
VS Codeエディタの使い方に関しては、よろしければZennで公開している以下の電子書籍を参照ください。
エディタで、~/linux/.config
ファイルの中身をみてみましょう。VS Codeなら以下ですね。
$ code ~/linux/.config
Oh…7594行あります。凄まじいですね。
この設定を変えることで、自分だけのカーネルをつくりあげることができます。
といっても、何をどう変えて良いか初心者にはなかなか分かりませんね。ただ、何も変えないのも悔しいので爪痕をのこしましょう。CONFIG_LOCALVERSION="-v7l"
という項目が23行目にあります。これに他のカーネルと区別するために自分だけの名前をつけてあげましょう。好きな名前でOKです。ここではKARAAGE KERNEL
という、からあげなのかフライドチキンなのかよく分からない名前をつけてやります。
CONFIG_LOCALVERSION="-v7l-KARAAGE_KERNEL"
コンフィグファイルの設定はとても複雑なので、コンフィグファイルを設定するためのツールがあります。いくつかある中でも、代表的なのはmenuconfig
です。
試しにmenuconfig
を起動してみましょう。まず、ラズパイでmenuconfig
を使うために必要なライブラリをインストールします。
$ sudo apt install libncurses5-dev
menuconfig
は以下のコマンドで起動できます。
$ make menuconfig
以下のようにGUIでセットアップが可能です。
ただ、これで簡単に設定できるかというと、やはり初心者には難しいですね。
今回はそっと閉じておきましょう。
カーネルビルド
いよいよカーネルビルドです(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+
自分でビルドした、世界に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カーネルの教科書」を読みながら実践してみることオススメいたします!
関連記事
変更履歴
- 2024/07/22 第2版に関して追記
- 2021/12/27 文章を修正