Ubuntu 22.04LTS kernel rebuild

kernel

小さな Ubuntu のインストール方法を記事にしています。そちらも併せてご覧頂ければと思います。

Ubuntu 22.04 linux kernel ソースからのビルド方法 (linux-6.5.13)

Ubuntu 22.04 のカーネルソースをビルドしようとしたらハマってしまったので、こちらのブログでビルド手順の記録を残しておきます。

カーネルバージョンの更新に伴い、一部修正しています。

ビルド環境の構築

カーネルのビルド環境は一般的な手順と同様です。

  • 必要なパッケージのインストール
    以下のコマンドで Ubuntu 上に必要なパッケージをインストールします。
$ sudo apt-get install make gcc libssl-dev
$ sudo apt-get install libncurses-dev
$ sudo apt-get install git
$ sudo apt-get install dpkg-dev
$ sudo apt-get install flex bison
$ sudo apt-get install dwarves libelf-dev
  • カーネルソースをダウンロードするための /etc/apt/source.list の編集
    Ubuntu がインストールしているカーネルソースを apt コマンドでダウンロードできるようにします。linux kernel と言ったら一般的には www.kernel.org からソースを取得しますが、Ubuntu 用にソースを改変しているため、特別な理由がある場合を除いて、この手順でソースを取得することを推奨します。
#deb cdrom:[Ubuntu 22.04.2 LTS _Jammy Jellyfish_ - Release amd64 (20230223)]/ jammy main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ jammy main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ jammy main restricted
この↑#を外してステートメントを有効化する

## Major bug fix updates produced after the final release of the
## distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
この↑#を外してステートメントを有効化する
  • ubuntu kernel source の取得
    /etc/apt/source.list の編集を終えたら、以下のコマンドで編集後の source.list の有効化とソースファイルの取得を行います。ubuntu 22.04 では、linux-hwe-5.19-5.19.0 という名称のフォルダにソースが配置されます。
  • source の取得は一般ユーザでOK
    前回までの記載はrootでソースを取得していましたが、一般ユーザでも構いません。
$ sudo apt-get update
$ apt-get source linux-image-unsigned-$(uname -r)

kernel ビルド前準備

  • kernel configuration (kernel 更新による変更あり)
    カーネルソースが取得できたら /boot から現在の config ファイルを .config としてコピーして make menuconfig を行いますが、このときに変更が必要なパラメータがあります。

    変更前 CONFIG_SYSTEM_TRUSTED_KEYS=”debian/canonical-certs.pem”
    変更後 CONFIG_SYSTEM_TRUSTED_KEYS=””

    変更前 CONFIG_SYSTEM_REVOCATION_KEYS=”debian/canonical-revoked-certs.pem”
    変更後 CONFIG_SYSTEM_REVOCATION_KEYS=””

    この変更方法は make menuconfig で行っても、menuconfig 前に .config を直接編集することでも構いませんが、ビルド時には必ず CONFIG_SYSTEM_TRUSTED_KEYS を null にする必要があります。

    その他として必須ではありませんが、ビルドしたカーネルを簡単に確認するために以下の設定を行います。
    CONFIG_LOCALVERSION=”custom”
  • PEM 形式の署名ファイルの配置
    次の内容のテキストファイルを linux-hwe-5.19-5.19.0/certs へx509.genkeyというファイル名で保存します。この手順でカーネルモジュールを署名付きにして insmod できるようにします。
[ 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
  • openssl コマンドの実行
    linux-hwe-5.19-5.19.0/certs がカレントであることを確認して以下のコマンドを実行します。
$ openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 \
-config x509.genkey -outform PEM -out signing_key.pem -keyout signing_key.priv

kernel ビルドと署名付きモジュールの作成

  • カーネルとモジュールのビルド
    これからカーネルをビルドしますが、多くのモジュールのビルドを伴うため長時間が必要となります。PCのスペックにも依存しますが概ね一晩くらいと考えておけばよいと思われます。
$ cd ..
$ make bzImage modules
  • モジュールへの署名付与
    ビルドが終わったら以下のコマンドでモジュールに署名を付与します。
    もしかしてこの手順は既に不要かもしれません。(カーネルビルド中に実施済みかも)
$ cd certs
$ sudo openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
-config x509.genkey -outform PEM -out signing_key.x509 -keyout signing_key.pem

module と kernel のインストール

  • debian/scripts/sign-module への実行権付与
    debian/scripts/sign-module に実行権がないため module のインストール時にエラーが発生します。従って、このタイミングまでに実行権を付与しておきます。
$ chmod +x debian/scripts/sign-module
  • デバッグシンボルを strip したモジュールのインストール
    ubuntu のデフォルトは多くのモジュールをサポートしてます。この理由はできる限りの PC を使えるようにしたためですが、この代償として initramfs (initrd) のサイズが大きなものとなっています。デバッグシンボルが残った状態では initramfs のサイズが大きすぎて ubuntu が起動できないため、以下のコマンドでモジュールをインストールします。
$ sudo make modules_install INSTALL_MOD_STRIP=1
  • カーネルのインストール
    モジュールのインストールが終わったらカーネルをインストールします。ここは特別なことはありませんので、通常のコマンドでインストールします。
$ sudo make install

ubuntu 再起動とカーネル名の確認

カーネルのインストールが終わったら ubuntu を reboot させます。再起動が終わったら以下のコマンドでビルドしたカーネルが使用されていることを確認します。

$ uname -r
5.19.17custom

終わりに

最近の ubuntu はセキュリティの強化を行っているようで、ubuntu 22.04 では Windows とのデュアルブートをデフォルトで廃止しました。比較対象として CentOS 9 では署名付きモジュールはデフォルトではありませんでした。CentOS が 9 で廃止されてしまいましたが、エンジニアとして常に新しい情報をキャッチアップする努力が必要であると痛感しています。

2024/6/18 追記
またカーネルのビルドは毎回何が変わったのかを気にしながら作業する必要がありますね。