Linuxカーネルビルド方法備忘録

現在位置のナビ

トップコンピュータの国雑記帳 → Linuxカーネルビルド方法備忘録

説明

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

aptのレポジトリ追加

ソースパッケージをインストールできるように、レポジトリを追加します。 /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

失敗例 Ubuntuのカーネルソースパッケージをビルド

カーネルのソースパッケージを取得します。 ここは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 ファイルを書き換えてみましたが、ビルドの終わりの方でやはりエラーになります。 この方法は諦めました。

カーネルソースをgitで取得してビルド

次のリンクに書かれている内容を参考にしました。 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

Kernelバージョン6.3では有効な対処法

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

ビルドをリトライする。

Kernelバージョン6.5でさらに必要になる対処

CONFIG_MODULE_COMPRESS_NONE=y

と.configを設定する。

CONFIG_MODULE_COMPRESS_ZSTD

の行をコメントアウトする。

掲載日

2023年4月16日 初出

2024年1月20日 追記


back button 雑記帳へ