追記(2021/11/15): clang-13 で Linux 5.15 をコンパイルする話はこちら。最近はclangでできることはgccではなくclangを用いている。カーネルコンパイルではclangを用いるとLTO, CFI, Shadow Stackなどgccでは選べない設定項目が選べる。
追記(2021/07/30): Intel/AMD系なら KCFLAGS=-march=native
, それ以外なら KCFLAGS=-mcpu=native
を付けるとコンパイルした計算機で動作が速くなる (KCFLAGSの説明)。たとえば make -j 4 KCFLAGS=-march=native bindeb-pkg
など
- 最近の正しい手順は
make bindeb-pkg
なのにqiita内の記事にはどこにも書いていない -
CONFIG_SYSTEM_TRUSTED_KEYS=
を空文字列にしないとコンパイル出来ない -
kernel-package
のmake-kpkg
は最近廃止された - Debian 管理者ハンドブックも古い
- CONFIG_PSI (Pressure Stall Information) をDebianでしたい
という事情でやり方を調べるのに苦労したのでメモします。Debian の公式な手順は https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html に書いてあります。Secure Bootには以下の手順は対応していません。Pressure Stall Information の説明は
- PSIをLXCのコンテナで試す: その(2) そもそもの値の定義・CPU Pressureをもう少し測る ←良記事でお勧めです
- https://facebookmicrosites.github.io/psi/docs/overview
などが参考になります。LinuxカーネルソースのDocumentation
の中のpsi.txt
に、システムの負荷が一定値を超えたらユーザープロセスに通知して処理を始める方法も書いてあります。Ubuntuの場合Disco (19.04)およびそれより新しいものは標準でPSIを使えるようになっていて /proc/pressure/
にあるファイルから情報を読み取れます。PSIは最近のDebianやUbuntuカーネルではONになっていて atop
(top
のエラいやつ)で表示できます。
構築環境の準備
/etc/apt/sources.list
で deb-src
で始まる行をすべてコメントアウトしていることも多いと思いますが、そうすると apt-get build-dep
などが動かないので有効にして sudo apt-get update
して下さい。
sudo apt-get install build-essential libncurses-dev fakeroot dpkg-dev
sudo apt-get build-dep linux
カーネルソースの入手
以下のどちらかをやってください
- ディストリビューションのカーネルソースパッケージを入手する。例えば
sudo apt-get install linux-source
。入手したカーネルソースは/usr/src
に置かれる - https://www.kernel.org から最新のソースを入手する
カーネルソースのアーカイブを、一般ユーザーのホームディレクトリなど適切な場所に展開する、例えば xzcat linux-???.tar.xz | tar xvf -
ディストリビューションのカーネル.configの入手と設置
自分で make nconfig
ですべての項目を適切に設定する場合はこの手順は不要です。
- いま使っているカーネルと同じ(または近い)バージョンを再構築する場合
/boot
にあるconfigナントカファイルをカーネルソースディレクトリの.config
という名前にコピーする。 - Debian の最新バージョンを使う場合
experimental
レポジトリから入手する。例えばsudo apt-get -t experimental install linux-config-5.0
。.configファイルは/usr/src
に置かれる。 - Ubuntu の最新バージョンおよび古いバージョンの
.config
は https://kernel.ubuntu.com/~kernel-ppa/config/ から入手できる。
このコンフィグファイルを例えば linux-5.1.15/.config
という名前でコピーする。上記の2番目と3番目のコンフィグファイルではCONFIG_SYSTEM_TRUSTED_KEYS=
が空文字列になっているためコンパイルがエラーで止まるトラブルが発生しない…
最低限必要な.config
への変更
-
CONFIG_SYSTEM_TRUSTED_KEYS
をから文字列にするか自分で用意した.pem
ファイルに設定しないとエラーでコンパイルができない
普通はn
にして構わない設定項目
-
CONFIG_MODULE_SIG
をn
にするとモジュール構築時に電子署名しなくなるから時間が短くなる -
CONFIG_DEBUG_INFO
をn
にするとデバッグ情報が含まれなくなりファイルサイズとコンパイルに必要なディスク容量が減る
筆者の個人的な設定
-
CONFIG_PSI=y
: Pressure Stall Information を使用したいから -
CONFIG_CPUSETS=n
CONFIG_PROC_PID_CPUSET=n
: cgroup v2環境下でlibvirt
5.0を用いるときにエラーが出る から。Ubuntu Discoでcgroup v2を有効にしてvirt-manager
などを使おうとすると operation 'setCpusetMemoryMigrate' not supported と怒られて起動しませんが、CONFIG_CPUSETS=n
したカーネルなら使えます。この問題はlibvirt
のバージョンが5.2以上なら解決しているため、Ubuntu Eoan
またはDebian Experimental
からlibvirt-daemon
をインストールすると直ります。
上記の設定をまとめて、カレントディレクトリを linux-5.1.15
などに移してから
linux-5.1.15$ ./scripts/config --disable MODULE_SIG --disable DEBUG_INFO --set-str SYSTEM_TRUSTED_KEYS "" --set-str MODULE_SIG_KEY "" --enable PSI --disable CPUSETS --disable PROC_PID_CPUSET
で実行できる。
.config
ファイルをコンパイルしたいカーネルバージョンに合わせる
make oldconfig
すると上記で作った .config
ファイルには存在しない設定項目をどうするか聞いてくれるので、回答する
コンパイル
nice make -j 6 bindeb-pkg
-j
と LOCALVERSION=
の引数は好きなように変えて下さい。コンピューターの性能に依存しますが数十分かかるので気長にまちます。本記事の末尾にあるように /proc/pressure/cpu
が100%近くなるまで -j
の引数を大きくするとCPUの遊び時間が無くなります。
インストール
NVIDIAのプロプライエタリドライバみたいにDKMS を使うデバイスドライバを用いているときにkernel-image
だけインストールすると再起動後に画面が出なくなったりして悲しくなるため、注意する。再起動する前にリモートログイン出来るようにせってしたほうがよい。
上記のコンパイル成功後に linux-imageナントカ
, linux-headersナントカ
, linux-libc-devナントカ
というパッケージができるため、まずlinux-headersナントカ
, linux-libc-devナントカ
を sudo dpkg -i
でインストールする。その後にlinux-imageナントカ
をインストールするが、DKMSを用いているときはサードパーティ製モジュールの再コンパイルが行われるからそこでエラーが起きないか注視する。エラーが出ているのに再起動すると悲しいことになる。
Pressure Stall Information
コンテナを用意してその中で上記の手続きを実施し、PSIをLXCのコンテナで試す: その(2) そもそもの値の定義・CPU Pressureをもう少し測る の記事に従ってコンテナの io.pressure
と cpu.pressure
を眺めると、apt-get build-dep
ではIOが原因で処理遅延が生じ make bindeb-pkg
では主にCPUが原因で処理遅延が生じていることがよくわかります。また、CPUをフル稼働させるように、注目しているControl Groupの cpu.pressure
が100%近くになるまでジョブを詰め込む用途にも使えます。
参考文献
-
BuildADebianKernelPackage 良記事。
CONFIG_SYSTEM_TRUSTED_KEYS = ""
しないとコンパイルがエラーで止まることがちゃんと書いてある - https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html は Debian の公式な手順書
-
linux kernelのmakeターゲットについてのあれこれ 良記事。この記事で勧められるように
make help | less
を読むと新しい知識が増える -
第526回 Ubuntuで最新のカーネルをお手軽にビルドする方法 Ubuntuでは
CONFIG_SYSTEM_TRUSTED_KEYS=
の問題は元々生じないからそのことは記事では触れられていないのであった…