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