User Mode Linux の設定 2
引き続きメモ
環境: Ubuntu 12.04 32bit on VMware (Windows7 64bit)
COWの使用方法
COWファイルを使うと、元のファイルシステムに影響が出なくなるので、
復旧が楽になる。
COWファイルを作成する。
uml_mkcow <COW file> <backing file>
HostOS$ uml_mkcow ./root0.cow fs_root
または、UML起動時にも作成可能。
HostOS$ linux-3.3.8 umid=root0 ubda=root1.cow,fs_root
※ linux-3.3.8 より後のカーネルだとCOWファイル名がおかしくなる問題がある
COWファイルを作成すると次回からの起動は、COWファイルの指定のみでできる。
HostOS$ linux-3.3.8 umid=root0 ubda=root1.cow
COWファイルでいろいろした設定をマージして、新しいディスクイメージに書き戻す。
uml_moo <COW file> <new baking file>
HostOS$ uml_moo root1.cow fs_root_2
UMLでローダブルモジュールを使う
ローダブルモジュールを生成する。
ここでは、ひとまずmodディレクトリにローダブルモジュールをインストールしている。
HostOS$ make modules_install INSTALL_MOD_PATH=./mod ARCH=um
ローダブルモジュールをゲストOSにコピー。
HostOS# mount -o loop fs_root /mnt/mkfs HostOS$ cp -R ./mod/lib/modules/3.3.8/ /mnt/mkfs/lib/modules/ HostOS# sudo umount /mnt/mkfs/
モジュールの依存関係のリストを作成する。
GuestOS# depmod
UMLで自作モジュールをテストする
UMLでモジュールのテストをすると、カーネルパニックが発生しても、短時間で簡単に復旧できるのが利点。
カーネルモジュールの作成はHostOS側で行う。
↓はファイル構成。
modtest -┬─ Makefile --- modtest.c
Makefileを作成する。
Host$ mkdir modtest Host$ cd modtest Host$ vim Makefile
# KERNELSRCDIRには、UMLで使用するカーネルイメージのソースファイルを指定する KERNELSRCDIR = /home/stia/linux_kernel/linux-3.3.8/ BUILD_DIR := $(shell pwd) VERBOSE = 0 obj-m := modtest.o all: make -C $(KERNELSRCDIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) ARCH=um modules clean: make -C $(KERNELSRCDIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) ARCH=um clean
簡単なカーネルモジュールを作成する。
HostOS$ vim modtest.c
#include <linux/init.h> #include <linux/module.h> int modtest_init(void) { printk(KERN_INFO "%s: init\n", __func__); return 0; } void modtest_exit(void) { printk(KERN_INFO "%s: exit\n", __func__); } module_init(modtest_init); module_exit(modtest_exit);
モジュールの作成。
MakefileでUMLを指定しているので、UML用のモジュールが作成される。
HostOS$ make
ゲストOSからカーネルモジュールをインストールする。
(ゲストOS-ホストOS間はhostfsでリンク済み)
GuestOS# insmod /mnt/work/modtest/modtest.ko modtest_init: init
出力を確認したので、ゲストOSからカーネルモジュールを削除する。
GuestOS# rmmod modtest modtest_exit: exit
結果画面