/dev/null

脳みそのL1キャッシュ

Linux Kernel をビルドする

はじめに

やむを得ない事情で Linux Kernel 弄って、ビルドして、実験することが度々あるので作業記録をここに残す

バージョン

ホスト環境を汚したくないので QEMU + Ubuntu Cloud Image を使って仮想環境を準備する。ホスト環境やソフトウェアのバージョンは以下の通り

$ uname -a
Linux kali 5.10.0-kali3-amd64 #1 SMP Debian 5.10.13-1kali1 (2021-02-08) x86_64 GNU/Linux
$ qemu-system-x86_64 --version
QEMU emulator version 5.2.0 (Debian 1:5.2+dfsg-3)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

また、今回は Ubuntu Server 14.04 LTS (Trusty Tahr) の Ubuntu Cloud Image を使う

VM のブート

何はともあれ cloud image のサイズを増やす

$ qemu-img resize ubuntu.img +30G

確かデフォルトではパスワード認証は無効化されているので、cloud-init でパスワード認証を有効にする必要がある。 以下で cloud-init の設定ファイルを書いて、cloud-localds を使って設定用のイメージを作成し、これを後ほど QEMU の引数に渡す

$ cat <<EOT > cloud.txt
#cloud-config
password: root
chpasswd: { expire: False }
ssh_pwauth: True
EOT
$ cloud-localds cloud.img cloud.txt

この時点でのディレクトリ内は

$ ls
cloud.img  cloud.txt  ubuntu.img

続いて、起動用のシェルスクリプトを書く(毎回 QEMU の引数を指定するのが面倒臭いので)

$ cat <<EOT > run.sh
#!/bin/bash

qemu-system-x86_64 \
    -smp 2 \
    -m 4096 \
    -nographic \
    -enable-kvm \
    -drive file=ubuntu.img,format=qcow2 \
    -drive file=cloud.img,format=raw \
    -netdev user,id=net0,hostfwd=tcp::2222-:22 \
    -device e1000,netdev=net0
EOT

vCPU は 2 つ、メモリは 4GB、KVM を有効にし、GUI を無効にして serial 接続にする、という設定になっている。

あとはこのスクリプトを実行して VM をブートする。なお、ユーザー名は ubuntu で、パスワードは cloud-config に書いたものである

$ sudo ./run.sh
...(snip)...
Ubuntu 14.04.6 LTS ubuntu ttyS0

ubuntu login: ubuntu
Password:
Last login: Tue Feb  2 15:00:11 UTC 2021 on ttyS0
Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.14.0 x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Feb 26 17:06:37 UTC 2021

  System load: 0.16               Memory usage: 1%   Processes:       64
  Usage of /:  14.7% of 31.66GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/


ubuntu@ubuntu:~$

Linux Kernel のビルド

今回は Linux 3.14 をビルドする

$ wget http://ftp.jaist.ac.jp/pub/Linux/kernel.org/linux/kernel/v3.x/linux-3.14.tar.gz
$ tar xvfz linux-3.14.tar.gz
$ cd linux-3.14

ビルドする前にビルドに必要なパッケージをインストールしておく

$ apt update
$ apt install build-essential libelf-dev libncurses5-dev

.config ファイルを生成する。色々聞かれるけど基本 Enter 連打で問題ない

$ make localmodconfig

最後にビルドしてインストールする

$ make -j4
$ sudo make modules_install
$ sudo make install

再起動(ctrl+a x で終了して、再度 sudo ./run.sh を実行)して uname -a を実行してみると

$ uname -a
Linux ubuntu 3.14.0 #2 SMP Tue Feb 2 14:13:55 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

3.14Linux カーネルが適用されていることがわかる