User Mode Linux を試してみた

Linux カーネルのビルド時間を計るついでに、ビルドしたカーネルをユーザ空間で動かすための User Mode Linux(UML)という仕組みを試してみた。

やったこと

カーネルのソース入手

kernel.org

構成

以降、カーネルのビルドに関してはmakeのオプションとしてARCH=umを指定する必要がある。

make menuconfig ARCH=umとして、必要なオプションを有効にする。 Save 後、構成をまとめた.configファイルが生成される。 規定の構成make alldefconfig ARCH=umとの差分は次の通り。 主な変更点は、UML と hostfs の有効化である。

$ diff -u .config uml.config
--- .config	2024-11-19 11:59:07.431004027 +0900
+++ uml.config	2024-11-19 08:24:06.872762675 +0900
@@ -196,7 +196,7 @@
 # CONFIG_STATIC_LINK is not set
 CONFIG_LD_SCRIPT_DYN=y
 CONFIG_LD_SCRIPT_DYN_RPATH=y
+CONFIG_HOSTFS=y
 CONFIG_MCONSOLE=y
 # CONFIG_MAGIC_SYSRQ is not set
 CONFIG_KERNEL_STACK_ORDER=2
@@ -221,7 +221,8 @@
 CONFIG_SSL_CHAN="pty"
 # end of UML Character Devices

+CONFIG_VIRTIO_UML=y
 CONFIG_ARCH_SUSPEND_POSSIBLE=y

 #
@@ -296,6 +297,7 @@
 CONFIG_EFI_PARTITION=y
 # end of Partition Types

+CONFIG_BLK_MQ_VIRTIO=y
 CONFIG_BLK_PM=y

 #
@@ -711,7 +716,12 @@
 # CONFIG_UIO is not set
 # CONFIG_VFIO is not set
 # CONFIG_VIRT_DRIVERS is not set
+CONFIG_VIRTIO_ANCHOR=y
+CONFIG_VIRTIO=y
 CONFIG_VIRTIO_MENU=y
 CONFIG_VHOST_MENU=y
 # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set

ビルド

make -j linux ARCH=um

linuxファイルが出来上がる。 これは通常のプログラムのようにして起動できる Linux カーネルである。

./linux

ルートファイルシステムの設定をしていないので、このままでは即 panic。 適当なディレクトリsomedirを作って、次のように実行する。

./linux rootfstype=hostfs rootflags=/path/to/somedir rw

init がないので、またしても即 panic。 init や常用コマンド、動的リンクのためのライブラリなどを含んだ Alpine Linux の MINI ROOT FILESYSTEM の tarball を取得する。

取得後、somedirへ展開して、かつ init を/bin/shに明示的に指定する。

./linux rootfstype=hostfs rootflags=/path/to/somedir rw init=/bin/sh

結果、シェルが起動され、あれこれ操作が可能になる。

参考

他の init

systemd, SysVinit など数多くあるが、いずれもコンパイルしてルートファイルシステムに持っていき、動的リンクのためのライブラリを/libなどへ複製してくれば利用できる。 どのファイルが必要かはldd <program_file>で確認できる。