DockerでLinuxカーネルのビルドをしてみよう
ToDo
カーネルをビルドできると何が嬉しいのか伝えられる構成にしたい
組み込みLinux向けの解説をつけるとか
自前でビルドしたカーネルをRaspberry Piで動かす
uname -aで自前でビルドしたことが確認できるようにしたい
カーネルへの理解が深まるような実験をしてみたい
あえてぶっ壊してみるとか
前提知識
上級者向けの記事なので、
git, Dockerをインストール・セットアップして使い方は理解していることを前提とする カーネルとは何かはぼんやりとわかっていることを前提とする
Linuxディストリビューションでパッケージとして配布されているLinuxカーネルは、より多くのデバイスで動作するように設定されている
自分のデバイスでだけ動けばいい場合は、もっとチューニングできる
より早く動くようになる(はず)
特に組み込みLinux環境においては重要になる
カーネルをカスタマイズするって大変なんじゃないの?
参考文献
作業フォルダを作って移動する
mkdir build-kernel && cd build-kernel
LinuxカーネルをビルドできるDockerfileを設置する
code:Dockerfile
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV DEBCONF_NOWARNINGS yes
RUN grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list
RUN apt-get update
RUN apt-get install -y git ccache fakeroot libncurses5-dev
RUN apt-get build-dep -y linux
RUN mkdir /build-kernel/build
RUN mkdir /build-kernel/dpkg
COPY ./docker-entrypoint.sh /
EXPOSE 8000
Dockerエントリーポイントのシェルスクリプトを設置する
code:docker-entrypoint.sh
set -eux
cd /build-kernel/linux
curl -L $GENERIC_CONFIG_URL > /build-kernel/build/.config
./scripts/config --file /build-kernel/build/.config --disable DEBUG_INFO
make O=/build-kernel/build/ olddefconfig
time make -j9 O=/build-kernel/build/ LOCALVERSION=-stock
time make modules -j9 O=/build-kernel/build/ LOCALVERSION=-stock
time make bindeb-pkg O=/build-kernel/build/ LOCALVERSION=-stock
cd /build-kernel
cp *.deb dpkg
python3 -m http.server
Dockerイメージをビルドする
docker build -t build-kernel .
Dockerイメージを実行する
docker run -p 8080:8000 build-kernel
実行結果を確認する
open http://localhost:8000/
https://gyazo.com/9e4259051a151e9bbd7ea919412bab72
ビルドしたカーネルをホストOSでインストールする(大丈夫か?)
menuconfigのカスタマイズ
Raspberry Pi向けのクロスコンパイルをしてみる
Raspberry Piで動かしてみる