WIN7@USB攻略:把Windows 7旗舰版装到移动硬盘/U盘(VHD版)
真正的移动版WIN7,在移动硬盘/U盘上运行的WIN7
为什么要用VHD而不是直接用真实硬盘呢?因为——方便,用VHD的话,只要硬盘空间足够,就可以放进10个20个系统而不必考虑分区的问题,每个系统只不过是一个VHD文件罢了。卸载也非常方便,直接把相应的VHD删除,然后再删掉相应的bcd引导项就完事。制作另一个新的移动系统更是简单,把VHD复制到另一个移动硬盘,然后重建引导,就一切OK。
——————————————————————————————————
我在前一个贴里讲了如何把WIN7安装到VHD里,然后用这个VHD启动计算机并且运行WIN7。
现在我会继续这个攻略,把这个装了WIN7的VHD移植到移动硬盘,然后用移动硬盘启动计算机,并且运行VHD中的WIN7。(U盘也可以!只要它够大!)
制作好的移动版WIN7兼容性非常好,比我以前做的移动XP要更好!我用这个移动版WIN7启动了两台笔记本,联想Y450和Dell的D630,完全没有任何问题。唯一的麻烦是第一次启动新计算机时,要重新安装驱动。移动版win7的性能比本地的要略低,一是USB2.0的速度限制,二是VHD的读写驱动会稍微拖慢硬盘读写速度,但是不会低太多,这个贴的最后,我会发本地win7和移动win7的性能对比图。
下面攻略开始:
工具准备
      - 联想Y450本本,已安装Windows 7旗舰版(或者WINPE3.0版),用来给移动WIN7做引导
      - Win7.vhd,15G, 位于Y450 D:盘
      - 移动硬盘,80G分为两个分区,分区一是移动XP的系统分区,分区二是数据盘。
步骤
      1. 启动Y450进入Win7,打开win7磁盘管理工具,附加vhd文件,把D:/win7.vhd附加到系统。成功后可以在计算机里看到一个新分区,我给它分配的盘符是V:,所以V:盘里就是已经预先安装好的完整的win7系统文件。
      2. 因为USB驱动的关系,这个VHD上的win7从移动硬盘上启动时会蓝屏报错:007B!所以下面要修改VHD win7的USB驱动。
            2.1 进入 V:\windows\inf\ 文件夹,到如下文件,依次双击打开,到对应的部分,修改内容如下(黄背景红字符为增加的内容),然后保存覆盖原文件:
usb.inf
;[SignatureAttributes]
editor版本;usbccgp.sys=SignatureAttributes.DRM
;usbhub.sys=SignatureAttributes.DRM
[StandardHub.AddService]
DisplayName = %StandardHub.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
;StartType = 3 ; SERVICE_DEMAND_START
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbhub.sys
;LoadOrderGroup = Base
LoadOrderGroup = System Bus Extender
[CommonClassParent.AddService]
DisplayName    = %GenericParent.SvcDesc%
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
;StartType      = 3                  ; SERVICE_DEMAND_START
StartType      = 0                  ; SERVICE_DEMAND_START
ErrorControl  = 1                  ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbccgp.sys
;LoadOrderGroup = Base
LoadOrderGroup = Boot Bus Extender
——————————————————————————————————————
usbport.inf
[ControlFlags]
;BasicDriverOk = *
;ExcludeFromSelect = *
;[SignatureAttributes]
;usbehci.sys=SignatureAttributes.DRM
;usbhub.sys=SignatureAttributes.DRM
;usbohci.sys=SignatureAttributes.DRM
;usbport.sys=SignatureAttributes.DRM
;usbuhci.sys=SignatureAttributes.DRM
;[SignatureAttributes.DRM]
;DRMLevel=1300
[EHCI.AddReg.NT]
HKR,,EnumPropPages32,,"usbui.dll,USBControllerPropPageProvider"
HKR,,Controller,1,01
;HKLM,System\CurrentControlSet\Services\usbehci,BootFlags,0x00010003,4
[EHCI.AddService]
DisplayName = %EHCIMP.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
;StartType = 3 ; SERVICE_DEMAND_START
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbehci.sys
;LoadOrderGroup = Base
LoadOrderGroup = Boot Bus Extender
[OHCI.AddReg.NT]
HKR,,EnumPropPages32,,"usbui.dll,USBControllerPropPageProvider"
HKR,,Controller,1,01
;HKLM,System\CurrentControlSet\Services\usbohci,BootFlags,0x00010003,4
[OHCI.AddService]
DisplayName = %OHCIMP.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
;StartType = 3 ; SERVICE_DEMAND_START
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbohci.sys
;LoadOrderGroup = Base
LoadOrderGroup = Boot Bus Extender
[UHCI.AddReg.NT]
HKR,,EnumPropPages32,,"usbui.dll,USBControllerPropPageProvider"
HKR,,Controller,1,01
;HKLM,System\CurrentControlSet\Services\usbuhci,BootFlags,0x00010003,4
[UHCI.AddService]
DisplayName = %UHCIMP.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
;StartType = 3 ; SERVICE_DEMAND_START
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbuhci.sys
;LoadOrderGroup = Base
LoadOrderGroup = Boot Bus Extender
[ROOTHUB.AddReg.NT]
HKR,,EnumPropPages32,,"usbui.dll,USBHubPropPageProvider"
;HKLM,System\CurrentControlSet\Services\usbhub,BootFlags,0x00010003,4
[ROOTHUB.AddService]
DisplayName = %ROOTHUB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
;StartType = 3 ; SERVICE_DEMAND_START
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbhub.sys
;LoadOrderGroup = Base
LoadOrderGroup = System Bus Extender
————————————————————————————————————
usbstor.inf
[USBSTOR.AddService]
DisplayName = %USBSTOR.SvcDesc%
ServiceType = 1
;StartType = 3
StartType = 0
ErrorControl = 1
ServiceBinary = %12%\USBSTOR.SYS
LoadOrderGroup = System Bus Extender
            2.2 进入 v:\Windows\System32\DriverStore\FileRepository\,
到名为usb.inf_……的文件夹,然后把刚才改好的usb.inf文件复制到此处覆盖原文件;
然后继续名为usbport.inf_……的文件夹,用改好的usbport.inf文件覆盖此处的原文件;
继续名为usbstor.inf_……的文件夹,用改好的usbstor.inf覆盖此处的原文件。
(注意:这个位置的文件夹和文件所有权属于TrustedInstaller,直接改是不行的,首先要修改所有权为登录用户,并且赋予完全权限,才可以修改。修改步骤请自己网上搜。)
            2.3 文件改好了,接下来要改注册表 V:\windows 的注册表。修改注册表有很多方法,我下面用的是最简单的一种
                  2.3.1 打开写字板,把如下代码复制到写字板中,保存为(注意不是!)
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\UsbBootWatcherService]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000000
"ImagePath"=hex(2):25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,6d,33,\
32,5c,55,73,62,42,6f,6f,74,57,61,74,63,68,65,72,2e,65,78,65,00
"DisplayName"="Usb Boot Watcher Service"
"ObjectName"="LocalSystem"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\UsbBootWatcherService]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\UsbBootWatcherService]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\pciide]
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\intelide]
"Start"=dword:00000000
                  2.3.2 打开写字板,把如下代码复制到写字板中,保存为
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbccgp]
"Group"="Boot Bus Extender"
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbehci]
"Group"="Boot Bus Extender"
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbhub]
"Group"="Boot Bus Extender"
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbohci]
"Group"="Boot Bus Extender"
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]
"Start"=dword:00000000
"Group"="Boot Bus Extender"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbuhci]
"Group"="Boot Bus Extender"
"Start"=dword:00000000
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
回复匿名网友:再做第二步的时候到了重启进入VHD的时候写入注册表的那个环节可不可以通过其他方式写入注册表而不是进入vhd的系统才写入,有没有不进入VHD写入注册表的?比如ghost的镜像,如何写入GHOST镜像中的系统啊?
2.3.3 在本地win7修改VHD win7注册表的方法如下
1. 进入v:\windows\system32\config\,到名为system的文件,复制到随便哪里
2. 打开本地win7的注册表编辑器,定位到HKEY_LOCAL_MACHINE,然后从菜单选择[文件]-[加载配置单元]-选择刚才复制的system文件导入注册表,并且改名为temp(或者随便什么名)
3. 修改本攻略中2.3.1和2.3.2中的和内容。把其中所有HKEY_LOCAL_MACHINE\SYSTEM\改为HKEY_LOCAL_MACHINE\temp\,保存。
4. 双击 把内容导入注册表
5. 右键点击注册表项HKEY_LOCAL_MACHINE\temp\,选[导出]-改保存类型为[注册表配置单元文件]-起名为system(无后缀名)-确定保存
6. 把改好的system复制到v:\windows\system32\config\,覆盖原文件(或者把原文件改名),做这一步,你可能需要system或是administror权限,请自己网上搜索获得权限的方法
经过上面几步,VHD win7的注册表就改好了。
如果是ghost镜像,你需要用ghostexp获得镜像内的system文件,然后按上述步骤修改,改好后用ghostexp把改好的system文件写入ghost镜像的同一位置。】
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
            2.4 关机重启进入V:盘的Win7,即本地的VHD Win7。到2.3中创建的和文件,分别双击运行,文件中的内容即被写入VHD Win7的注册表。
            2.5 重启,进入本地Windows7。
      3 在步骤2中,USB驱动已经改好了,现在win7.vhd中的系统已经可以在移动硬盘中运行了。插上移动硬盘,把D:\win7.vhd文件复制到G:\ (移动硬盘数据盘,事先准备好大于15G的空闲空间)
      4 不要急着用移动硬盘去启动计算机,因为——引导还没有建立!下面我们来手动给G:\win7.vhd建立引导。
            4.1 把本地Windows7的系统盘中boot文件夹和bootmgr文件完整复制到移动硬盘 F:\ (这相当于移动硬盘的C盘)根目录下
            4.2 进入 c:\windows\system32 文件夹,把如下三个文件复制到 F:\boot\ 文件夹下:
                  —— 用来给移动硬盘MBR写引导信息
                  —— 用来建立、修改bcd引导项
                  —— 用来复制bcd引导项
            4.3 运行cmd进入命令行,依次运行如下命令:
                  bcdboot c:\windows /s f: —— 把本地Windows7的引导项复制到F:盘(即移动硬盘)
                  bootsect /nt60 f: /mbr —— 这个命令将把nt60版的引导信息写入移动硬盘的mbr!因此一定要小心别搞错了盘符!
                  bcdedit /store f:\boot\bcd /copy {default} /d "Windows 7 VHD USB"
                  回车后返回这种格式的GUID, {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx},后续命令中我用{GUID}代替
                  bcdedit /store f:\boot\bcd /set {GUID} device vhd=[g:]\win7.vhd
                  bcdedit /store f:\boot\bcd /set {GUID} osdevice vhd=[g:]\win7.vhd
                  bcdedit /store f:\boot\bcd /set {GUID} detecthal on —— 打开detecthal参数,对移动win7的兼容性非常重要,作用是启动时强制检测hal(即俗称的电源管理模式,做过系统封装的都知道这东西的重要性)。xp就没有这个功能……
                  bcdedit /store f:\boot\bcd /displayorder {GUID} /addlast
                  bcdedit /store f:\boot\bcd /timeout 5
                  改这改那,终于都改好了。OK,现在一切就绪。
      5 关机,用移动硬盘启动Y450吧……
      6 还可以用它来启动Dell D630,嘿嘿……第一次启动时Windows7会自动安装驱动。
攻略完成!
注意:关于Windows 7版本的选择,第一,一定要旗舰版,因为只有旗舰版才支持VHD!第二,要考虑激活Windows 7的问题,因为当你在其它机器上启动这个系统,因为硬件改了,Windows会要求你重新激活……如果你的是特定的OEM版,很可能启动不了另一台计算机。真希望微软快点出个像XP时代的VLK大客户版……
下面上hdtune测试结果,只做了读取和随机存取测试,写入的因为要格式化分区所以没做了……
先是USB-VHD-WIN7的虚拟盘的测试
下面是本地win7的
(这个攻略一样可以应用于真实移动硬盘。如果直接改install.wim,还可以把安装光盘改成移动Windows 7版的,不过,正常安装时,Windows 7的setup不允许安装到usb设备,这点还没想到办法克服……或许boot.wim的相关设置也要改。
  总之,Windows 7 移动版比xp好做了多,通用性也强得多。喜欢折腾的朋友可以试试,有什么问题的话,可以给我留言,或者hi我。)
——————————————————————————————————————————————
最新测试:这个Windows 7 USB VHD版的通用性比我想象的还要强悍,今天我用它启动我的老台式机,01年的,P4 1.5G,512M内存,USB1.1,bios无usb启动选项,我插上移动硬盘后,从硬盘项可以看到移动硬盘,从它启动后顺利进入WIN7 USB VHD系统!当然因为USB1.1的关系,启动时间5分钟……运行速度嘛,能感觉到明显的停滞感……没办法,这老爷机出厂的时候USB2.0还不成气候呢。还有网卡,声卡,显卡驱动全都不能识别……太老啦
还能说什么呢?实在是太强悍了……联想到现在的USB3.0,什么时候能让这个系统在上面跑跑,哇……流口水YY中……
下面上图:
发个链接:无忧启动论坛fujianabc大大的贴,他写的安装器非常方便,支持把win7直接安装到移动硬盘。强烈推荐!(这两个贴里也讲了win7从移动硬盘启动的三种方法,仔细看会有收获)
《GUI 3-1:win7/vista安装器,支持安装系统到USB硬盘,可在xp的pe下运行,x86/x64通用》
《从u盘启动win7/2008 R2的方法,更新:换机器免sysprep的方法》
根据win7 embedded和hyper-v R2的文档及这个帖子中的测试,win7/2008 R2 usb启动其实只是由两个注册表项控制的:
HKLM\system\CurrentControlSet\Control\BootDriverFlags
HKLM\system\CurrentControlSet\Control\PnP\PollBootPartitionTimeout
把第一个值设成4就可以在启动开始阶段就加载usb驱动;
而第二个则控制内核等待启动分区PnP反应时间,usb启动设为15000(win7 embedded的值)或者30000(hyper-v r2中的值)
由此看来,usb启动普通win7非常的简单,微软完全已经设计好了。默认不能装到usb设备纯粹是微软策略上的考虑。