On Mon, 14 Feb 2011 13:19:38 +0900
<[email protected]> 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: [email protected]
--- 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++;
}