DockerでLinuxカーネルのビルドをしてみよう
ToDo
この記事を見て順番に従うだけでDocker上でLinuxのカーネル | kernelをビルドする方法がわかるような記事を書く
menuconfigの簡単な解説は必要
カーネルをビルドできると何が嬉しいのか伝えられる構成にしたい
組み込みLinux向けの解説をつけるとか
自前でビルドしたカーネルをRaspberry Piで動かす
uname -aで自前でビルドしたことが確認できるようにしたい
カーネルへの理解が深まるような実験をしてみたい
あえてぶっ壊してみるとか
前提知識
上級者向けの記事なので、
git, Dockerをインストール・セットアップして使い方は理解していることを前提とする
カーネルとは何かはぼんやりとわかっていることを前提とする
カーネル | kernelをビルドできると何が嬉しいの?
Linuxディストリビューションでパッケージとして配布されているLinuxカーネルは、より多くのデバイスで動作するように設定されている
自分のデバイスでだけ動けばいい場合は、もっとチューニングできる
より早く動くようになる(はず)
特に組み込みLinux環境においては重要になる
カーネルをカスタマイズするって大変なんじゃないの?
menuconfigというものである程度好きなようにカスタマイズできる
参考文献
https://github.com/takano32/build-kernel
作業フォルダを作って移動する
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 git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git /build-kernel/linux
RUN mkdir /build-kernel/build
RUN mkdir /build-kernel/dpkg
COPY ./docker-entrypoint.sh /
EXPOSE 8000
ENTRYPOINT "/docker-entrypoint.sh"
Dockerエントリーポイントのシェルスクリプトを設置する
code:docker-entrypoint.sh
#!/bin/bash
set -eux
cd /build-kernel/linux
GENERIC_CONFIG_URL=http://kernel.ubuntu.com/~kernel-ppa/config/bionic/linux/4.15.0-21.22/amd64-config.flavour.generic
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で動かしてみる
#あとで書く