okacl's blog

私的なメモ置き場になるヨカーン

User Mode Linux の設定 2

引き続きメモ

  • COWの使用方法
  • UMLでローダブルモジュールを使う
  • UMLで自作モジュールをテストする

環境: 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);


モジュールの作成。
MakefileUMLを指定しているので、UML用のモジュールが作成される。

HostOS$ make


ゲストOSからカーネルモジュールをインストールする。
(ゲストOS-ホストOS間はhostfsでリンク済み)

GuestOS# insmod /mnt/work/modtest/modtest.ko
modtest_init: init

出力を確認したので、ゲストOSからカーネルモジュールを削除する。

GuestOS# rmmod modtest
modtest_exit: exit


結果画面

f:id:okacl:20120915151548p:plain