On Mon, 14 Feb 2011 13:19:38 +0900
<mur...@graduate.chiba-u.jp> wrote:

>  ところで、またまた方法がわからなくて困っているのですが、
> もしかして、FreeBSDは、AT互換機の場合、基本パーティション
> にしかインストールできないのでしょうか?

できなくはありませんが, 非常に難しいです. 3つほど大きな困難を乗り越え
なくてはなりません.

まずインストール自体ですが, FreeBSDのfdiskでは拡張パーティションを切れ
ないので, LinuxのfdiskでFreeBSD用の拡張パーティションを切る必要がありま
す. その後, bsdlabelでFreeBSD用スライスを切り, そしてインストールという
ことになります. これらの作業は全てコマンドラインインターフェイスで行う
ので, ディスク管理コマンド等について精通していないとまず無理でしょう.

次にFreeBSD標準のbootローダの問題があります. FreeBSDのbootローダは標準
では拡張パーティションを取り扱えないため, そのままではインストールでき
てもbootできません. bootローダのソースにパッチをあててコンパイルしなお
せば, 対応できるようになりますが, そのためには既にFreeBSDが動いている
システムが必要です. また, 添付してあるパッチはちょっと古いので, 現在で
はうまくパッチがあたらないかもしれません.

最後にbootできたとして, カーネルなどをちゃんと読み込むために, /boot下の
loader.4thとかをいじくる必要があります. これらはFORTH言語で記述されてい
るため, それについての基礎的な知識が必要になります.

こんな具合なので, FreeBSDハンドブックとかでは「拡張パーティションには
インストール出来ません」ということで終わっていたと思います.

-- 
Katsurajima "Raven" Naoto(桂島 直人)
Family Emblem: Circle and Left 3 Clove-TOMOE(丸に左三つ丁子巴)
e-mail: ra...@katsurajima.jp
--- sys/boot/i386/libi386/biosdisk.c.orig	2007-11-13 08:53:43.000000000 +0900
+++ sys/boot/i386/libi386/biosdisk.c	2007-12-25 17:59:45.000000000 +0900
@@ -96,6 +96,7 @@
 	    struct disklabel		mbr_disklabel;
 	    int				mbr_nslices;	/* slice count */
 	    struct dos_partition	mbr_slicetab[NEXTDOSPART];
+	    u_int			mbr_extbase;
 	} _mbr;
 	struct {
 	    int				gpt_nparts;		
@@ -107,6 +108,7 @@
 #define	od_disklabel		_data._mbr.mbr_disklabel
 #define	od_nslices		_data._mbr.mbr_nslices
 #define	od_slicetab		_data._mbr.mbr_slicetab
+#define	od_extbase		_data._mbr.mbr_extbase
 #define	od_nparts		_data._gpt.gpt_nparts
 #define	od_partitions		_data._gpt.gpt_partitions
 
@@ -601,6 +603,7 @@
      * Find the slice in the DOS slice table.
      */
     od->od_nslices = 0;
+    od->od_extbase = 0;
     if (bd_read(od, 0, 1, buf)) {
 	DEBUG("error reading MBR");
 	return (EIO);
@@ -748,6 +751,8 @@
 		DEBUG("no magic in extended table");
 		goto done;
 	}
+	if (od->od_extbase == 0)
+		od->od_extbase = dp->dp_start;
 	base = dp->dp_start;
 	dp = (struct dos_partition *)(&buf[DOSPARTOFF]);
 	for (i = 0; i < NDOSPART; i++, dp++) {
@@ -755,7 +760,10 @@
 			continue;
 		if (od->od_nslices == NEXTDOSPART)
 			goto done;
-		dp->dp_start += base;
+		if (dp->dp_typ == DOSPTYP_EXT)
+			dp->dp_start += od->od_extbase;
+		else
+			dp->dp_start += base;
 		bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp));
 		od->od_nslices++;
 	}

メールによる返信