好多年前,应景写过如何制造一个包含Windows 8或者Windows Server 2012的VHD,并且在Windows 7或者Windows 8环境中直接启动到VHD中的系统。

    换了一家公司后,一直忙于学习新的系统,但仍然关注Windows的进展。时间总是过得很快,感觉还是不久以前给全国的合作伙伴讲Windows Server 2012,转眼间Windows 8.1 Preview / Windows Server 2012 R2 Preview 就已经出来了。Windows 8.1也就罢了,Windows Server 2012 R2 还是有不少新特性可以看看的,以后有机会可以另起一贴介绍。

    言归正传,介绍一下如何创造一个可以直接启动的Windows 8.1 / Windows Server 2012 R2的VHD。

    之前用的是WIM2VHD.wsf,这是一个把WIM文件转化为VHD文件的脚本,我在几年前介绍过如何完成这一工作,有兴趣可以搜索我之前的Blog。

    但是问题在于,这个脚本当年是为Windows 7 / Windows Server 2008写的,而正如我几年前写的,Windows 8 的 Boot Manager重写了,所以使用这个脚本做出来的VHD是无法启动的,必须手动传送一个启动环境给VHD上的系统。具体作法请搜我之前写的内容中bcdboot命令行。


    为了解决这一问题,我之前写了一个脚本程序,用于自动挂载VHD磁盘,自动完成传送工作。好消息是,现在这个脚本更新了,变成了一个PowerShell脚本,叫做Convert-WindowsImage.ps1,有关的信息可以在这里查到:http://gallery.technet.microsoft.com/scriptcenter/Convert-WindowsImageps1-0fe23a8f

    具体作法我就不废话了,站点上都写得很明白。我想介绍的是在我的 UEFI 启动环境中,出现的问题和解决的办法。

0

    第一个问题,也许你会发现这个PowerShell 脚本无法运行。这需要修改PowerShell的运行策略,可以参考图中命令行。此外,由于这个脚本是从网站上下载过来的,NTFS会记录其文件属性,因此运行时会给出安全提示。

    第二个问题,你会发现运行脚本时,在修改bootmgr的时候,提示找不到BCD Store。(ERROR : Could not get the BootMgr object from the Virtual Disks BCDStore.)这个问题是由于UEFI启动环境的目录与传统BIOS方式的不一样,不是boot,而是efi\microsoft\boot,所以脚本会找不到bcd文件,即bcd store。原本想改写一下这位兄弟的PowerShell脚本,但一直真的忙死了,还是在他页面上留几句话算了。

    第三个问题,我使用了EasyBCD来添加启动项,但是发现选择启动项无法启动到VHD的操作系统。这是由于使用了UEFI系统,而默认添加的启动项所使用的加载路径是\Windows\System32\winload.exe,需要把它改成\Windows\System32\winload.efi。

    使用支持UEFI的Windows 8启动环境的好处是,看上去漂亮多了。

6ac4c7b9jw1e72yx18q0wj218g0x7k26

    你可以看到更多的启动选项,他们是由硬件 UEFI 提供的启动选项。在这里,我又遇到两个问题。

    第一个问题,我点击了EastBCD的Save。实际上,你不点击这个按键,添加的记录也会在。点击了以后,漂亮的UEFI的选项界面不见了,回到了Windows 7以前的字符界面。把美丽的UI还给我!尝试了很久,从重新传送启动文件,到替换bootmgr,都没有用。最后发现,你可以关掉displaybootmenu,终于,美丽的UI又出现在我眼前。要是有个办法可以让妹纸也重新出现在我眼前多好啊!

    第二个问题,新加的启动项一般在最后。以前的字符界面还好,内容不多。可是现在图形的启动选项有10几个,你确定每次都有耐心翻到最后?一个字,改!分析了一下,其实也很容易,重新填写displayorder参数就可以了。标记,粘贴到写字板,按照启动项对应的标识符,调整顺序,再贴回命令行,搞定。

Windows 启动加载器 
------------------- 
标识符                  {40a7c004-f7af-11e2-b9f8-dd44c2d22392} 
device                  vhd=[D:]\e00e1972-d07b-4e8f-b17b-e7e716022811.vhdx 
path                    \Windows\system32\winload.exe 
description             Windows Server 2012 R2 Preview 
locale                  en-US 
osdevice                vhd=[D:]\e00e1972-d07b-4e8f-b17b-e7e716022811.vhdx 
systemroot              \Windows 
detecthal               Yes

C:\Windows\system32>bcdedit /set {40a7c004-f7af-11e2-b9f8-dd44c2d22392} path \Wi 
ndows\system32\winload.efi 
操作成功完成。

C:\Windows\system32>bcdedit /set {bootmgr} displayorder {current} {40a7c003-f7af 
-11e2-b9f8-dd44c2d22392} {40a7c004-f7af-11e2-b9f8-dd44c2d22392} {9f012074-9b60-1 
1e2-86c8-f078a4898bea} {9f012075-9b60-11e2-86c8-f078a4898bea} {9f012076-9b60-11e 
2-86c8-f078a4898bea} {9f012077-9b60-11e2-86c8-f078a4898bea} {9f012088-9b60-11e2- 
86c8-f078a4898bea} {9f012085-9b60-11e2-86c8-f078a4898bea} {9f012089-9b60-11e2-86 
c8-f078a4898bea} {9f012083-9b60-11e2-86c8-f078a4898bea} {9f01208c-9b60-11e2-86c8 
-f078a4898bea} {9f012086-9b60-11e2-86c8-f078a4898bea} {9f012087-9b60-11e2-86c8-f 
078a4898bea} {9f01208b-9b60-11e2-86c8-f078a4898bea} {9f012084-9b60-11e2-86c8-f07 
8a4898bea} {9f01208a-9b60-11e2-86c8-f078a4898bea} {9f01207b-9b60-11e2-86c8-f078a 
4898bea} {9f01207c-9b60-11e2-86c8-f078a4898bea}

    最后,放一下我的BCD的最终版……

C:\Windows\system32>bcdedit

Windows 启动管理器 
-------------------- 
标识符                  {bootmgr} 
device                  partition=\Device\HarddiskVolume2 
path                    \EFI\Microsoft\Boot\bootmgfw.efi 
description             Windows Boot Manager 
locale                  en-US 
integrityservices       Enable 
default                 {current} 
resumeobject            {8ee0377a-9ada-11e2-bec5-806e6f6e6963} 
displayorder            {9f012074-9b60-11e2-86c8-f078a4898bea} 
                        {9f012075-9b60-11e2-86c8-f078a4898bea} 
                        {9f012076-9b60-11e2-86c8-f078a4898bea} 
                        {9f012077-9b60-11e2-86c8-f078a4898bea} 
                        {9f012088-9b60-11e2-86c8-f078a4898bea} 
                        {9f012085-9b60-11e2-86c8-f078a4898bea} 
                        {9f012089-9b60-11e2-86c8-f078a4898bea} 
                        {9f012083-9b60-11e2-86c8-f078a4898bea} 
                        {9f01208c-9b60-11e2-86c8-f078a4898bea} 
                        {9f012086-9b60-11e2-86c8-f078a4898bea} 
                        {9f012087-9b60-11e2-86c8-f078a4898bea} 
                        {9f01208b-9b60-11e2-86c8-f078a4898bea} 
                        {9f012084-9b60-11e2-86c8-f078a4898bea} 
                        {9f01208a-9b60-11e2-86c8-f078a4898bea} 
                        {9f01207b-9b60-11e2-86c8-f078a4898bea} 
                        {9f01207c-9b60-11e2-86c8-f078a4898bea} 
                        {current} 
                        {40a7c003-f7af-11e2-b9f8-dd44c2d22392} 
                        {40a7c004-f7af-11e2-b9f8-dd44c2d22392} 
timeout                 5 
displaybootmenu         No

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012074-9b60-11e2-86c8-f078a4898bea} 
description             Setup

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012075-9b60-11e2-86c8-f078a4898bea} 
description             Boot Menu

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012076-9b60-11e2-86c8-f078a4898bea} 
description             Diagnostic Splash Screen

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012077-9b60-11e2-86c8-f078a4898bea} 
description             Lenovo Diagnostics

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012088-9b60-11e2-86c8-f078a4898bea} 
description             USB HDD

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012085-9b60-11e2-86c8-f078a4898bea} 
description             ATA HDD0

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012089-9b60-11e2-86c8-f078a4898bea} 
description             PCI LAN

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012083-9b60-11e2-86c8-f078a4898bea} 
description             USB CD

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f01208c-9b60-11e2-86c8-f078a4898bea} 
description             USB FDD

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012086-9b60-11e2-86c8-f078a4898bea} 
description             ATA HDD1

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012087-9b60-11e2-86c8-f078a4898bea} 
description             ATA HDD2

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f01208b-9b60-11e2-86c8-f078a4898bea} 
description             ATA HDD3

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f012084-9b60-11e2-86c8-f078a4898bea} 
description             ATAPI CD0

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f01208a-9b60-11e2-86c8-f078a4898bea} 
description             ATAPI CD1

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f01207b-9b60-11e2-86c8-f078a4898bea} 
description             Other CD

固件应用程序(101fffff) 
------------------------------- 
标识符                  {9f01207c-9b60-11e2-86c8-f078a4898bea} 
description             Other HDD

Windows 启动加载器 
------------------- 
标识符                  {current} 
device                  partition=C: 
path                    \Windows\system32\winload.efi 
description             Windows 8 Enterprise 
locale                  en-US 
recoverysequence        {9f01208e-9b60-11e2-86c8-f078a4898bea} 
integrityservices       Enable 
recoveryenabled         Yes 
osdevice                partition=C: 
systemroot              \Windows 
resumeobject            {8ee0377a-9ada-11e2-bec5-806e6f6e6963} 
bootmenupolicy          Standard 
hypervisorlaunchtype    Off 
hypervisordebug         Yes

Windows 启动加载器 
------------------- 
标识符                  {40a7c003-f7af-11e2-b9f8-dd44c2d22392} 
device                  partition=C: 
path                    \Windows\system32\winload.efi 
description             Windows 8 Hyper-V 
locale                  en-US 
recoverysequence        {9f01208e-9b60-11e2-86c8-f078a4898bea} 
integrityservices       Enable 
recoveryenabled         Yes 
osdevice                partition=C: 
systemroot              \Windows 
resumeobject            {8ee0377a-9ada-11e2-bec5-806e6f6e6963} 
bootmenupolicy          Standard 
hypervisorlaunchtype    Auto 
hypervisordebug         Yes

Windows 启动加载器 
------------------- 
标识符                  {40a7c004-f7af-11e2-b9f8-dd44c2d22392} 
device                  vhd=[D:]\e00e1972-d07b-4e8f-b17b-e7e716022811.vhdx 
path                    \Windows\system32\winload.exe 
description             Windows Server 2012 R2 Preview 
locale                  en-US 
osdevice                vhd=[D:]\e00e1972-d07b-4e8f-b17b-e7e716022811.vhdx 
systemroot              \Windows 
detecthal               Yes