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