由于我先在 macbook 上装了 grub2, 尝试用 grub2 引导 winpe 安装 windows,结果老是报错, 无法启动 winpe。 后来查了一下网上的安装步骤, 要用 "Boot Camp" 制作 windows 启动 U 盘。 "Boot Camp" 是 mac 自带的一个工具, 简单看了一下它会下载 mac 驱动整合到 windows 的安装盘。 这样看, 原来是原生的 winpe 缺少 mac 驱动, 所有无法在 mac 上启动。 由于 macbook 没有光驱, 所以要求提供一个安装光盘镜像和一个 U 盘, U 盘内容将被全部擦除来制作 windows 安装盘。 以就是说, 在 macbook 上安装 windows 是 mac 自己开发工具和驱动来支持的, 原生 windows 并不支持。

按步骤操作了一下, 结果第一步就提示说启动盘不对, 我还是以为是说启动 U 盘分区结构不对, 于是对 U 盘做了各种分区调整, 甚至填 "0" 抹空, 还是说不对。 想了一会儿觉得是说 mac 系统盘的分区结构不对。

mac 默认的分区结构如下:

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 125926CF-FE2E-477D-8F6A-BB33EE74CBF1
                                 Unlocked Encrypted

disk0 是物理盘, 划了 3 个分区, 一个 ESP (EFI System Partition), 一个系统盘, 一个恢复盘。 然后 mac 把系统盘虚拟成 disk1, 在 GUI 磁盘工具上只能看到系统盘。 难怪有 mac 老鸟给我说 mac 不支持分区。 mac 系统难用但是硬件还不错, 所以后来 mac 为了拉拢 windows 用户, 开发工具和驱动开始支持 windows, 这样就必须划一块磁盘空间给 windows。 于是 mac 做了磁盘分区功能, 但这是个 "残疾" 的分区功能, 你只能再额外划一个分区出来, 而不能像 linux 的 parted 等工具那样自由定制磁盘分区。 在 GUI 磁盘工具上, 只能看到一个分区或者两个分区, 这是 mac 认可的 "合法" 形式, 而我的系统盘已经使用 ubuntu 划了 6, 7 个分区, 于是 mac 不认了。

mac 默认的分区表结构, mac 下看:

ali-59375mac:~ hanyong$ sudo gpt show /dev/disk0
      start       size  index  contents
          0          1         PMBR
          1          1         Pri GPT header
          2         32         Pri GPT table
         34          6         
         40     409600      1  GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
     409640   59299296      2  GPT part - 53746F72-6167-11AA-AA11-00306543ECAC
   59708936    1269536      3  GPT part - 426F6F74-0000-11AA-AA11-00306543ECAC
   60978472  428994096      4  GPT part - 48465300-0000-11AA-AA11-00306543ECAC
  489972568     262151         
  490234719         32         Sec GPT table
  490234751          1         Sec GPT header

ubuntu 下看:

root@ubuntu-mate:~# parted /dev/sda 'print free  unit s  print free'
Model: ATA APPLE SSD SM0256 (scsi)
Disk /dev/sda: 251GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size   File system  Name                  Flags
        17.4kB  20.5kB  3072B  Free Space
 1      20.5kB  210MB   210MB  fat32        EFI System Partition  boot, esp
 2      210MB   250GB   250GB  hfs+         mac
 3      250GB   251GB   650MB  hfs+         Recovery HD
        251GB   251GB   3584B  Free Space

Model: ATA APPLE SSD SM0256 (scsi)
Disk /dev/sda: 490234752s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start       End         Size        File system  Name                  Flags
        34s         39s         6s          Free Space
 1      40s         409639s     409600s     fat32        EFI System Partition  boot, esp
 2      409640s     488965175s  488555536s  hfs+         mac
 3      488965176s  490234711s  1269536s    hfs+         Recovery HD
        490234712s  490234718s  7s          Free Space

root@ubuntu-mate:~# gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 490234752 sectors, 233.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 4F4270B0-E0DF-408E-98AB-3393CF3FD4E1
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 490234718
Partitions will be aligned on 8-sector boundaries
Total free space is 13 sectors (6.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              40          409639   200.0 MiB   EF00  EFI System Partition
   2          409640       488965175   233.0 GiB   AF05  mac
   3       488965176       490234711   619.9 MiB   AB00  Recovery HD
  • partedgdisk 的分区 End 包含在分区内, 是 [begin, end] 区间。
  • mac 在磁盘首尾各留了 40 sector, PMBR 占 1, GPT 表占 1 + 32 = 33, 所以 parted 看到首尾各有 6, 7 sector 的空。
  • "恢复分区" 占 1269536 sector, 合 619MiB + 912KiB, 没有对齐到 'MiB'。默认在尾部 [ 488965176s , 490234711s ]

要么我把 linux 分区删了恢复 mac 出厂设置, 这样有点麻烦 (还得做数据迁移), 借同事原装 mac 来搞吧。

TODO: IMG

如上图, mac 要求制作启动盘的同时划分磁盘分区, 只能选择划给 windows 的磁盘空间大小, 不能自由定制分区。 然后开始下载 windows 支持软件 (其中应该包括 mac hfs 文件系统驱动) 和制作安装盘。

TODO: IMG

接下来是漫长的等待, 先去做其他事。 再回来看时, 已经自动跳到 windows 安装界面, 自动重启了吗(?)。 直接点窗口上的关闭按钮退出, 然后系统重启了。 关机, 拔出 U 盘, 插到我 mac 上, 却发现是个空 U 盘, 开机长按 "Option" 键出来的启动菜单也没有安装 windows 的选项, 但插回原电脑确是可以的, 又是黑科技(?)。 后来发现现在 macbook 会自己划一块空间来做启动盘, 不需要 U 盘了, 那个 U 盘插不插根本没用。

这样看, 只有恢复原有分区结构才能安装 windows 了。 备份 ubuntu , 把多的分区干掉, 只留 mac 自己的 3 个分区和一片空闲区域。 mac 磁盘工具看不见空闲区域, "Boot Camp" 还是说磁盘不对, 好吧, u 盘重启到 ubuntu 帮你把第 4 个分区创建起来, 占满空闲空间, 不过我就懒得格式化了。 "Boot Camp" 则以为这台电脑安装了 windows 了, 可以给你删除 windows 恢复 mac。 那恢复呗, 然后又报错说不能恢复, 这系统好傻。 磁盘工具的分区列表还是没有这个分区, 它知道有这么一块空间的存在, 但基本上不能执行什么有效操作。 格式化成 fat32 重启, 磁盘工具看到分区了, "Boot Camp" 还是不工作。 格式化成 mac hfs+ 重启, 磁盘工具把 "恢复分区" 都搞出来了, "Boot Camp" 还是不工作。 突然发现 U 盘从 disk2 变成了 disk1, 之前的虚拟磁盘 disk1 不见了, 不知道是不是因为这个导致 "Boot Camp" 恢复 mac 失败。 于是拔下 U 准备再试试, 结果发现 "恢复分区" 也不能正常工作了, "Command+R" 只能进入一个 "Internet Recovery" 的东西。 对比一下分区表, "恢复分区" 类型从 Apple_Boot 变成了普通的 Apple_HFS, mac 系统盘也从 变成了普通的。 网上查了下各种 mac 恢复办法, 试了下长按 "Command+Option+R+P" + 按一下电源启动, 结果更糟糕, 连 "SIP" 权限也搞丢了, grub 启动项也搞丢了无法恢复。 网上查到 Apple_Boot 的 UUID 是 426F6F74-0000-11AA-AA11-00306543ECAC, 参考 https://en.wikipedia.org/wiki/GUID_Partition_Tablegdisk 可以修改 GTP 分区类型, 通过 gdisk 命令找到其也识别 af05 Apple Core Storage 类型, 但没找到 Apple_Boot。 参考 ubuntu 文档: http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-mac-osx 制作 U 盘启动盘, 这个工具在 ubuntu 下 sudo aptitude install unetbootin 就能安装使用。 制作完成后所幸还能使用 U 盘启动 ubuntu。 启动到 ubuntu 使用 gdisk 修正 mac 分区表 GPT 分区类型。 使用 UUID 修正后发现原来 Apple_Boot 在 gdisk 里叫 ab00 Recovery HD, gdisk 是支持的。 修正后重启, 稍微停顿后进入系统(可能是在恢复什么设置?), 然后发现 "恢复分区" 也隐藏起来, 虚拟磁盘 disk1 也出来了。 拔出 U 盘, 再试 "Boot Camp", 果然又说可以删除 windows 恢复系统, 点恢复, 还是坑爹的报错。 重启系统, 发现原来 mac 是在这个时候坑爹的把分区类型 (partition type) 搞错了, 并把分区 4 删了。 再进 ubuntu 用 parted 创建分区, 这回创建成 hfs+ 文件系统类型, 再用 gdisk 更正分区类型。 重启到 mac, 格式化新建的分区, 看起来正常很多了, 但还是不能把分区 4 跟系统盘合并。 检查下磁盘, 说分区 4 结尾空间不够, 是要留空闲空间吗? 计算了下大小, 要留 128MiB, 跟 windows 那个 MSR 很像。 尝试用 mac 的磁盘工具缩小分区 4, 又把分区搞乱了, 服了 mac。 再重启到 ubuntu 来收拾烂摊子, mac 又搞出个分区 5, 屁股后面果然留了 128MiB 空闲空间。 删掉分区 5, 扩大分区 4, 屁股后面留 128MiB 空闲, 再重启到 mac, 磁盘检查没发现问题, 但分区 4 和系统盘还是连不起来, "Boot Camp" 还是不工作。 经过反复折腾, 看来除了用 linux 操作 hfs+ 移动和扩容, 我是没办法把 mac 的这个分区合成一个盘了。 再看了看提示, mac 认可两种分区格式, 一种是只有一个盘, 一种是做了 windows 分区, 那么用 U 盘启动同事电脑到 ubuntu, 看看做了 windows 分区是什么样, 还是只多一个分区 4, 类型 msftdata, 文件系统 fat32。 屁股留了几百 KiB, align-check opt ok, 应该是做了对其到 MiB。 把我的分区 4 也搞成这样看看。 果然 "Boot Camp" 又提示可以恢复了, 然后还是恢复出错。 之前因为担心兼容问题一直没用 linux 操作 hfs+ 分区, 事到如今搞不定, 只有试试拿 gparted 来给 hfs+ 分区移动和扩容了, 恢复 mac 要的 "单一分区"。 按网上的说法, "恢复分区" 可以随意挪动的, 创建一个相同大小的分区, 把数据 dd 拷贝过去, 设置好正确的分区类型就可以了。 使用 parted + dd + gdisk 将 "恢复分区" 挪到磁盘最末尾, 原 "恢复分区" 删掉, 试了下可以启动到恢复模式, 磁盘检查也没发现问题, 磁盘分区显示可以扩大系统盘占满整个磁盘了。 重启到正常模式, "Boot Camp" 依然不工作, 磁盘工具真正执行调整分区大小操作报错。 最后百般折腾都没有办法, 一狠心全盘格式化重装搞定。 发现只要别破坏 "恢复分区", 系统就还有救, 只是恢复模式网络重装系统非常非常慢。 全盘格式化重装 mac 后, EFI, mac 系统, "恢复分区" 也全部重建了, 恢复如新。

恢复系统后, 再执行 "Boot Camp", mac 分区拖到最小, 本来只想留 30G 的, 最小只能拖到 37G。 "Boot Camp" 准备好后自动重启进入 Windows 安装界面。 分区选择界面看到 Mac 把 windows 安装盘和 "Boot Camp" 驱动划了一个大概 8G 的保留分区, 这个保留分区也是从保留的 37G 划出来的, mac 系统只占用了不到 30G。 "Boot Camp" 准备的 windows 安装分区是没有格式化的, 需要手动格式化。 这里我将这个分区删除, 重建一个小的 35G 分区给 win 做系统盘。 稍后在 ubuntu 再划 10-20G 给 win 做 D 盘吧, 剩下的全给 ubuntu。 windows 安装好后, 自动将安装盘挂为 D 盘, 到安装盘 "BootCamp" 目录下安装驱动, 安装完驱动重启后, 安装盘自动取消挂载 (但还可以到磁盘管理手动挂回来), 至此安装完成。