はじめに
Linuxを扱えることはITエンジニアの教養といっても過言ではありません。
Linux上でアプリケーションの開発や実行ができるエンジニアの方でもKernelまで踏み込んで学んだことがある人は少ないのではないでしょうか。
もちろんすべてのエンジニアがKernelを学ぶ必要があるとは思いません。しかし、近年では当たり前になっているDockerやKubernetesなどのコンテナ技術を深く学ぶにはKernelまで踏み込む必要があります。
私自身、インフラエンジニアではありませんが業務でコンテナ技術を扱うことが多いため、Kernelを学ぶ第一歩としてKernelをソースコードからビルドしてインストールしてみました。
以下は、Kernelをビルドした時の覚書になります。
ミニマムスタートで進めてますので、随時内容はアップデートしていきたいと思います。
CentOSでKernelビルド
前提環境
ここではCentOS 7.9.2009を用いてLinuxのKernelをビルドをします。今回はCentOS-7-x86_64-Minimal-2009.iso
イメージを使用しています。
また、CentOSはVirtualBoxで起動し、仮想マシン内からインターネット接続ができることを前提としています。
Windows環境の場合、Hyper-Vが有効になっているとVirtualBoxで正常に仮想マシンを動作できないことがあるようです。
OSをインストールできたとしてもKernelのコンパイル中にエラーとなることもあるため、Hyper-Vは無効化することをおすすめします。
CentOS7 isoイメージ
なお、CentOSにはrootユーザとしてroot
、一般ユーザとしてcentos
を作成しており、一般ユーザでsudoが利用できるように/etc/sudoers
に以下の行を追加しています。
今回はカーネルをビルドするだけの環境なのでセキュリティは気にしません。一般ユーザはrootユーザと同じコマンドが使えるようになります。
centos ALL=(ALL) ALL
事前準備
まずはyum updateを実行しておきます。
$ sudo yum update -y
sshでVMに接続できるようにする場合は、sshをインストールします。
$ sudo yum -y install openssh-server
$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 火 2022-09-27 20:30:40 JST; 11min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 9161 (sshd)
CGroup: /system.slice/sshd.service
└─9161 /usr/sbin/sshd -D
SSHするためにIPアドレスを確認したいので、ifconfig
コマンドをインストールします。
$ sudo yum install net-tools
なお、net-tools
をインスト―スしなくても以下のコマンドでIPアドレスが確認できます。
$ ip addr show
ビルドツールのインストール
Kernelをビルドするためのビルドツールをインストールします。
Kernelのバージョンによって、gccのバージョンXX以上のように決まっていますので必要なバージョンをインストールします。
今回はgcc11をインストールします。
$ sudo yum groupinstall 'Development Tools'
$ sudo yum install centos-release-scl
$ sudo yum install scl-utils
$ sudo yum install devtoolset-11
なお、インストールしただけではgcc11は使えるようになりません。
以下のコマンドでgcc11を使えるようにします。
$ scl enable devtoolset-11 bash
$ gcc -v #gccバージョン確認
その他、ビルドに必要なパッケージのインストール
$ sudo yum install openssl-devel
$ sudo yum install elfutils-libelf-devel
Kernelのソースコードは以下から入手できます
※Linux KernelはそれぞれのLinuxディストリビューションで提供されているものがありますので、利用できれば
今回は5.19.11
をビルドします。
ソースコードを取得してダウンロードします。
ソースコードは.tar.xz
で圧縮されてますので解凍します。
$ curl -OL https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.11.tar.xz
$ tar Jxf linux-5.19.11.tar.xz
Kernelのビルドではまずconfgiファイルを用意する必要があります。
ここでは現在起動しているKernelのconfigをコピーして使用することtにします。
$ cd linux-5.19.11
$ cp /boot/config-$(uname -r) .config
$ make oldconfig
$ make
make oldconfig
コマンドを実行すると設定の有効/無効を聞かれますので設定します。とりあえずビルドできれば良いのであれば全てデフォルトのままで問題ありません。
なお、カーネルのビルドには時間がかかります。私の環境だとビルド完了までに2時間半ほどかかりました。
kernelインストール
kernelのビルドが完了したところで続いてはインストールを行います。
以下のコマンドによりkernelモジュールとkernelのインストールができます。
$ sudo make modules_install
$ sudo make install
インストール完了後にOSを再起動します。
起動時の画面で先ほどインストールしたKernelが選択できるようになっています。
UbuntuでKernelビルド
追ってUbuntuでのKernelビルド手順も追加する予定です。