Macbook上的双系统,Macdrive的驱动文件在大量IO操作之后有可能导致Windows XP系统
蓝屏,于是打算把Mac的系统盘缩小一些,另外划分一个NTFS分区给Windows用。

分区之前的系统软硬件情况如下:
Macbook MB062,内存扩充至2G
分区表为:
disk0s1 EFI 200MB
disk0s2 HFS+ 80GB   (43G可用空间)
disk0s3 NTFS 31.5GB  (7G可用空间)
操作系统为Mac OS X 10.5.6和Windows XP SP3
Macdrive的版本似乎是7.2.1
手头没有Mac OS X和Windows XP的安装盘,Mac OS X上没有安装第三方的分区软件,安装
有iDefrag Lite。

由于要保持Windows XP的系统盘位于MBR分区表的最后一个,所以计划将Mac OS X的系统
盘disk0s2拆分为两个分区。

按照增加分区的常规操作,需要先启动Windows XP,修改启动文件boot.ini。
在命令提示符下执行
attrib -r -h -s c:\boot.ini
然后打开boot.ini,将其中的两处partition(3)改为partition(4)并保存。
之后在命令提示符下执行
attrib +r +h +s c:\boot.ini
此时Windows系统在分区划分成功之前就无法引导了。
完成上面的操作后重启到Mac OS X,在终端中执行
sudo diskutil resizeVolume disk0s2 50G “MS-DOS FAT32″ newdisk 30G
即可完成增加分区。

但是由于Mac的系统盘中的文件分布较为散乱,分区末尾的剩余空间很少,所以在执行
diskutil操作时提示剩余空间不足,无法实现上述分区目标。此时,若有iDefrag或类似
的HFS+分区碎片整理程序,则可通过光盘启动后整理磁盘碎片使分区中的可用空间集中到
分区尾部,也可使用iPartition的启动光盘执行分区的调整操作。

由于手头没有这两个软件,短时间内也没能从网上下载到,于是改用GParted对HFS+分区
进行调整。用GParted(版本1.8.8)的Live CD启动,将disk0s2(GParted中显示为sda2
)的尺寸缩小到50GB。此过程甚为耗时,花了一个小时完成了分区的缩小。
之后启动到Mac OS X,在终端中执行
sudo diskutil resizeVolume disk0s2 50G “MS-DOS FAT32″ newdisk 30G
成功的创建出新的FAT32分区。

此时系统的分区表为:
disk0s1 EFI 200MB
disk0s2 HFS+ 50GB
disk0s3 FAT32 30GB
disk0s4 NTFS 31.5GB
其中最后一个分区为Windows XP的系统分区。
由于使用了Mac OS X的diskutil创建分区,因此GPT分区表和MBR分区表的内容是同步的。

重新启动电脑,启动时按Alt/Option键,发现仅有Mac OS X的磁盘图标,无法启动到
Windows系统。在Mac OS X的系统预置-启动磁盘中可以认出Windows的分区,但是若指定
从Windows分区启动的话则会在启动时黑屏,提示No bootable device。这是因为MBR分区
表中Windows分区未标记为可引导而导致的。

解决此问题的正确方法为:在Mac OS X的终端中执行
sudo fdisk -e /dev/disk0
在fdisk的界面中输入print,查看MBR分区表中的活动分区,若不是Windows系统所在分区
的话输入flag <分区数字编号>来设置/取消活动分区标记,将Windows系统所在分区设为
活动,然后依次输入w和q保存改动,重启之后即可正常引导。

但是当时又用GParted的Live CD引导,在GParted中查看分区信息,并且执行了一个严重
错误的操作:用GParted修改了Windows系统分区disk0s4(GParted中显示为sda4)的
flag。由于GParted存在一个bug,对于GPT分区表中的FAT32和NTFS分区,若使用
GParted设置了分区的flag,在分区flag不是boot的情况下,flag会固定为msftres。在
Mac OS X系统中,flag为msftres和boot的分区均不能自动挂载,因此在Finder中看不到
对应的磁盘。在Mac OS X的磁盘工具中,对于flag为msftres的分区,分区名称显示为灰
色,无法挂载;对于flag为boot的分区,看不到分区名称,分区表中对应位置显示为可用
空间。同时,使用GParted修改GPT分区之后,会导致MBR分区表被修改为EFI Protective
格式,即MBR分区表中仅有一个EFI分区,占据了所有可用空间,从而导致Windows无法引
导。

为了解决Windows分区的引导问题,下载了gptsync,在Live CD的终端中使用。gptsync可
根据GPT分区表的内容生成对应的MBR分区表,其中flag错误的Windows系统分区在MBR分区
表中被设置为EFI分区,需使用fdisk调整分区的id为NTFS,并设置为活动分区。此后在启
动时按Alt/Option键可看到Windows的磁盘图标,Windows可正常引导,但是Mac OS X中
依然无法自动挂载分区。

为了最终解决Windows分区在GPT分区表中的错误flag问题,在Mac OS X上安装rEFIt,并
使用经修改过的diskpart(文件来源地址见后)将Windows分区的flag改回MSDATA。对于
MB062,diskpart需使用32位的版本,按照文件来源页面中的提示,由rEFIt进入EFI
Shell之后,输入diskpart,然后依次输入
select 0
inspect
chtype 3 MSDATA
即可将错误的flag改掉。
由于diskpart会将MBR分区表改为EFI Protective格式,因此需要再次运行gptsync(在
EFI Shell中)和fdisk(在Mac OS X的终端中)设置MBR分区表。

至此,增加分区的操作全部完成。

修改过的diskpart可从以下地址获得:
http://forum.insanelymac.com/index.php?showtopic=31562