Linux 4.12: livepatch: 適用したライブパッチを無効化する機能の動作確認

久々のLinuxの記事です。

一つ前のリリースですが、Linux 4.12でライブパッチ(livepatch)へ機能追加がなされ、
適用したライブパッチを無効化することができるようになりました。

サンプルに記載のとおりですが、試してみたので記事にしてみます。


なお、ライブパッチについてはLinux 4.0で追加されてからちょこちょこと記事を書いていますので、良ければ見てみてください

1. 有効化するカーネルコンフィギュレーション

menuconfigで

  • CONFIG_LIVEPATCH
  • CONFIG_SAMPLE_LIVEPATCH

を有効化します。


なお、ビルド・インストール方法は、上述の記事をみてみてください。


変更したい項目のmenuconfig内の場所は、
menuconfig画面内で"/"キーを押すとコンフィグ内を検索できます。
"livepatch"で検索すると、コンフィグの場所を調べることが出来ます。


なお、ftrace関係のコンフィグが有効化されていないとlivepatchのコンフィグは現れません。
(コンフィグの依存関係は"Debpnds on"に書かれていて、見方も上述の記事で少し説明しています。)

2. サンプルの試し方

カーネルをビルドすると、ライブパッチのサンプル(livepatch-sample.ko)は、
linux/samples/livepatch/livepatch-sample.c に出来上がっています。


このサンプルは /proc/cmdline を変更するライブパッチで、
insmod livepatch-sample.ko した後、
/proc/cmdline をreadすると"this has been live patched"が読めます。


そして、

$ echo 0 > /sys/kernel/livepatch/livepatch_sample/enabled

を実行すると、適用したパッチを無効化出来ます。


■ 実行例

補足. UEFI用のイメージとしてビルドしたカーネルを使用する

上記の実行例では、UEFI用のイメージ(UEFIアプリケーション)として実行できるように
Linuxカーネルをビルドしています。


そうすることで、PC内蔵のUEFIシェル、あるいは配布されているUEFIシェル[*1]を使用して、
Linuxカーネルを起動できます。

[*1] https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/FullShell/X64

1. UEFI用のイメージとしてカーネルをビルド

menuconfigで"CONFIG_EFI_STUB"を有効化してカーネルをビルドします。

2. qemuとovmfをインストール
$ sudo apt-get install qemu-system-x86
$ sudo apt-get install ovmf

※ OVMFはQEMU用のUEFIファームウェアです。

3. ディレクトリ構造を作成

例えば、以下のようなディレクトリ構造を作成します。

fs1/
└── bzImage.efi
fs2/
└── <ルートファイルシステムのディレクトリ構造を作成>
4. QEMUで起動
$ qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -hda fat:fs1 -hdb fat:fs2

※ 2つ目のディスク(hdb)もfat指定しているのに理由はなく、単にext3とかの指定方法がわからないだけです。


すると、UEFIシェルが起動するので、以下のように入力すると、
Linuxカーネルを起動できます。

Shell> fs0:
fs0:> bzImage.efi root=/dev/sdb rootwait