Ubuntu 22.04 Intel 64bit向けにLinuxカーネルをセルフビルドしました。 久しぶりにビルド環境を作るところから実行したので、備忘録として記録しておきます。
Ubuntu 22.04 が動作する Intel 64bitです。
$ uname -r 5.19.0-38-generic
Ubuntu 22.04 Intel 64bit向けにLinuxカーネルをビルドしました。 久しぶりにビルド環境を作るところから実行したので、備忘録として記録しておきます。
カーネルをビルドするのに必要なパッケージをインストールします。
$ sudo apt-get build-dep linux linux-image-$(uname -r)
エラーが出ます。
E: You must put some 'deb-src' URIs in your sources.list
ソースパッケージをインストールできるように、レポジトリを追加します。 /etc/apt/sources.list をエディタで開き deb-src を含む行がコメントアウトされているので全部生かします。 10行あります。 そして、aptのupdateをかけます。
$ sudo apt update
あらためてインストールします。
$ sudo apt-get build-dep linux linux-image-$(uname -r) $ sudo apt-get install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm
カーネルのソースパッケージを取得します。 ここはroot権限をつかいません。
$ apt-get source linux-image-unsigned-$(uname -r) $ cd linux-hwe-5.19-5.19.0 $ chmod a+x debian/rules $ chmod a+x debian/scripts/* $ chmod a+x debian/scripts/misc/* $ LANG=C fakeroot debian/rules clean $ LANG=C fakeroot debian/rules editconfigs
エラーが出ます。 ツールが足りません。
dh_testdir command not found
追加インストールします。
$ sudo apt-get install debhelper
ビルドします。
$ LANG=C fakeroot debian/rules binary-headers binary-generic binary-perarch
CONFIG_LOCALVERSIONに文字列を設定するとエラーになります。 .config ファイルとdebian.hwe-5.19/config/annotations のデータを比較してUbuntuの配布にふさわしくない値を検出しているようです。 debian.hwe-5.19/config/annotations ファイルを書き換えてみましたが、ビルドの終わりの方でやはりエラーになります。 この方法は諦めました。
次のリンクに書かれている内容を参考にしました。 https://gihyo.jp/admin/serial/01/ubuntu-recipe/0578 https://gihyo.jp/admin/serial/01/ubuntu-recipe/0526
カーネルソースをgitで取得します。 バージョン5.19を持ってくればよいところを、バージョン指定しなかったので最新版6.3を持ってきてしまいました。
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git上のカーネルソースコードバージョンの確認法。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
$ git branch -a
git上のバージョン設定。
$ git checkout remotes/origin/linux-6.5.y
ワーキングディレクトリを用意します。
$ cd linux $ mkdir ../build
カーネルコンフィグレーションファイルをコピーします。 Ubuntu22.04上でセルフコンパイルするので、ここは楽です。
$ cp /boot/config-$(uname -r) ../build/.config
デバッグ用カーネルを作らないつもりでした。
$ scripts/config --file ../build/.config --disable DEBUG_INFO
一般人にはセキュアブート用の署名ファイルが手に入らないので、無効化します。 ../build/.config ファイルから以下の設定を探して文字列を空にします。 セキュアブートの説明は、後回しにします。
CONFIG_SYSTEM_TRUSTED_KEYS="" CONFIG_SYSTEM_REVOCATION_KEYS=""
ようやくビルドできます。
$ make O=../build/ olddefconfig $ make -j4 O=../build/ LOCALVERSION=-xmos $ make modules -j4 O=../build/ LOCALVERSION=-xmos $ make bindeb-pkg O=../build/ LOCALVERSION=-xmos
Pentium GOLDでコンパイルするので -j オプションは4です。 今回のLOCALVERSIONは-xmosにしました。
セキュアブートは、信頼されているOS以外EFIからブートできなくする仕組みです。 信頼されているかどうかは、マイクロソフトの秘密鍵でOSバイナリが署名されているかどうかで判定します。 本来Linuxはマイクロソフトの秘密鍵を利用できないのですが、お情けで主要なディストリビューションは署名されています。
より詳しい解説はこちらへ。 https://wiki.archlinux.jp/index.php/%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%96%E3%83%BC%E3%83%88 https://kledgeb.blogspot.com/2020/06/ubuntu-2004-74-ubuntuuefi.html
ここでビルドしたカーネルには署名はありませんので、EFIの設定でセキュアブートを外しておかないとブートできません。
2024年1月16日 カーネルソースコードを git pull して作り直そうとしたら、こんなエラーが出ました。
SIGN debian/linux-image/lib/modules/6.3.0-rc6-xmos/kernel/arch/x86/events/amd/amd-uncore.ko At main.c:298: - SSL error:FFFFFFFF80000002:system library::No such file or directory: ../crypto/bio/bss_file.c:67 - SSL error:10000080:BIO routines::no such file: ../crypto/bio/bss_file.c:75 sign-file: debian/linux-image/lib/modules/6.3.0-rc6-xmos/kernel/arch/x86/events/amd/amd-uncore.ko
No OpenSSL sign-file signing_key.pem leads to error while loading kernel modules を参考に、以下の作業をしました。
kernelのcertsディレクトリへ行って、以下の内容のx509.genkeyファイルを作る
[ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = myexts [ req_distinguished_name ] CN = Modules [ myexts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid
certsディレクトリで以下のコマンドを実行する。
$ openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem
ビルドをリトライする。
CONFIG_MODULE_COMPRESS_NONE=y
と.configを設定する。
CONFIG_MODULE_COMPRESS_ZSTD
の行をコメントアウトする。
2023年4月16日 初出
2024年1月20日 追記