雑記帳

ちょっとした文章とかメモ書きとか。

BHyVeはっかそん

かなり遅れました。BHyVeハッカソンが某所で行われていたので参加してきました。

BHyVeの管理ツールをちょこっとLLで書けたらいいかなーと参加したら、
二日目に隣のn_kaneさんがvmmctl –destoryコマンドを叩くとホストのFreeBSDがパニックする事
を発見してカーネルをいじりだして実際にパニックしなくさせるようにまでカーネルをいじっててびっくり。Σ(´∀`;)

流石に何かしないとマズイと思って以下のパッチを書きました。

やっぱり一発じゃコンパル通らなかったよ…

という事で少しFreeBSDで修正しました。

--- vmmctl.c.orig	2012-05-03 14:04:37.000000000 +0900
+++ vmmctl.c	2012-08-08 00:31:25.291915647 +0900
@@ -47,6 +47,8 @@
 
 #include <machine/vmm.h>
 #include <vmmapi.h>
+#include <dirent.h>
+#include <ctype.h>
 
 #include "intel/vmcs.h"
 
@@ -59,6 +61,7 @@
 
 static const char *progname;
 
+static int vmmdir(void);
 static void
 usage(void)
 {
@@ -244,6 +247,7 @@
 
 static uint64_t desc_base;
 static uint32_t desc_limit, desc_access;
+char buf[80];
 
 static void
 dump_vm_run_exitcode(struct vm_exit *vmexit, int vcpu)
@@ -342,6 +346,18 @@
 	return (vm_set_register(ctx, vcpu, VMCS_IDENT(field), val));
 }
 
+static int vmmdir()
+{
+	DIR *dp;
+	char *path = "/dev/vmm";
+	if((dp = opendir(path)) == NULL) {
+		(void)closedir(dp);
+		return (1);
+	}
+	(void)closedir(dp);
+	return (0);
+}
+
 enum {
 	VMNAME = 1000,	/* avoid collision with return values from getopt */
 	VCPU,
@@ -1478,6 +1494,25 @@
 	if (error)
 		printf("errno = %d\n", errno);
 
+	if (!error && vmmdir()) {
+		printf("warn: /dev/vmm exist!\n");
+		if (fgets(buf, sizeof(buf), stdin) == NULL) {
+			fprintf(stderr, "Input error\n");
+			exit(1);
+		}
+		if (strchr(buf, '\n') != NULL) {
+			buf[strlen(buf) - 1] = '\0';
+		} else {
+			fprintf(stderr, "too many input(>80)\n");
+			exit(1);
+		}
+		printf("Do you execute \"vmmctl --destroy\" ?(Y/N)");
+		if (toupper(getchar()) == 'Y') {
+		} else {
+			exit(error);
+		}
+	}
+
 	if (!error && destroy)
 		vm_destroy(ctx);

こんな感じに。

BHyVeの動く最近のマシンいいなぁ、と思った2日間なのでした。

広告

BHyVeはっかそん」への1件のフィードバック

  1. しゅううさんは衰退しました (@syuu1228) 2012年8月8日 8:24 PM

    NTT-Xで1万円鯖買おう!>BHyVeの動く最近のマシンいいなぁ、と思った

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。