VHD实现Windows7瞬间还原.docx
- 文档编号:11371409
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:12
- 大小:25.13KB
VHD实现Windows7瞬间还原.docx
《VHD实现Windows7瞬间还原.docx》由会员分享,可在线阅读,更多相关《VHD实现Windows7瞬间还原.docx(12页珍藏版)》请在冰豆网上搜索。
VHD实现Windows7瞬间还原
VHD实现Windows7瞬间还原
作者:
liyusha 团队锦囊来源:
远景论坛 点击数:
1968 更新时间:
2010-4-15
本文不定期更新,会不断完善代码,改进性能,增加功能,谢谢关注。
首先确定一点,本文已经被我试验成功,所以怀着迟疑态度的人现在可以抱着电脑研究去了。
试验成功的帖子在这里:
用论坛的复制代码功能可能导致出现乱码,可以复制到记事本中然后再从记事本复制出去,一般会解决。
本文的系统还原不同于其他的还原软件,不改写硬盘数据,不毁坏分区,不虚拟写入,不需要缓冲区,不会因为长期不关机而死机,不借助任何辅助软件,完全是系统自带功能,还可以随时修改还原点,所以最稳定最可靠。
可以说是目前最安全最快速的硬盘还原方法。
如果你没有VHD系统,也没做过VHD系统,那么请在论坛学习VHD系统相关知识。
如果你已经做过VHD系统,那么你要做的仅仅是建立一个子VHD盘,复制一个自删除的批处理文件,修改一下启动项。
如果你做过VHD系统,那么我想这些对你来说是非常的小菜。
原理篇:
如果你有两套系统,你还会担心你的其中一套系统坏掉吗?
当你一套系统坏掉的时候,启动到另一套系统就OK了。
此文就是以此为原理来实现瞬间还原的。
瞬间还原,也就是让你从一个系统重启到另一个系统而已。
但是两套系统又太浪费磁盘空间,我们能不能让两套系统公用同样的系统文件呢?
答案是肯定的,VHD虚拟磁盘就能帮助我们实现。
我们可以把两套系统中一模一样的文件放在母盘里,两套系统不同的文件分别存储在两个子VHD文件里,这样我们就不会太浪费磁盘空间了。
其实用VHD系统某种程度上还能节省空间。
(因为其实Windows7里面的文件很多都是通过磁盘映射来的,两个一模一样的文件看似在两个文件夹中,但是实际上其中一个只是另一个的映射,但是却需要占用两份磁盘空间。
但是在VHD里,这样的两个相同的文件却只占用一份磁盘空间,所以我的一个系统做成VHD文件只需要占用3.5G的磁盘空间)。
也许这样说您还是不能明白,那么我换一种说法。
我们把当前的系统状态保存下来,就是VHD母盘,然后我们使用系统之后,对系统所作的更改都放在一个VHD子盘中,当我们需要还原系统的时候,我们就删掉VHD子盘,这样就还原到了母盘状态,然后我们再新建一个子VHD,好让下次也可以还原到母盘状态。
技术上实现的原理是利用VHD的差异磁盘。
建立一个母盘,A、B两个差异盘,平时使用A盘引导系统,当系统崩溃的时候使用B盘引导系统并自动删除A差异盘并建立新的A差异盘。
并调整启动选单,让B系统变为默认系统。
等到B系统坏了的时候启动A系统,开机后自动删除B差异盘并建立新盘,调整启动选单让A差异盘为默认系统。
如此反复,达到瞬间还原,只要重启一次系统就还原的目的。
而且还要为以后的扩展功能做准备,比如说加上可以随时保存修改的系统还原功能,或者加上可以设定多个还原点的系统还原功能。
所以我们在自启动文件夹中只放一个类似快捷方式的符号连接,实际位置则在D盘中,这样可以任意修改而且还不被系统还原掉。
操作系统定期是要更新的,虽然我们的瞬间还原可以藐视一切病毒和漏洞,但是一个东西用久了难免会觉得不好用,我们总会有各种各样的理由想修改一下,小到想换个主题,大到对从前的母盘设置不满意,都需要面对一个棘手的问题,那就是母盘如何修改。
如果用从前的办法的话,规模就跟重做一次瞬间还原系统相当了。
如何方便的修改已经成型的母盘一直是我一个没解决的问题,后来又拿我老婆的笔记本不断研究,终于在各种错误和偶然中找到了最简便的修改方式,现拿出来与大家分享。
首先说一个可能大家不知道的技巧。
通常我们以为创建了子盘之后就不能再更改母盘,甚至最好还把母盘改成只读属性,其实不然,子盘只是记载了对母盘的修改,而没有校验母盘是否修改的功能,我们就是利用这一个“错误”的方法来实现修改母盘的目的的。
思路是这样的:
把当前正在使用的系统的引导信息改成母盘的信息,重启之后会进入母盘,而且会清空两个子盘,并且删除自启动的批处理。
这之后我们可以尽情的修改系统直到我们再次满意。
当需要封装母盘的时候我们首先要把自启动的批处理还原回去,然后再把引导信息修改为原来的子盘。
就此大功告成,整个过程只需修改两次引导。
准备篇:
可能用到的文件如下:
母盘,就是系统还原最原始的状态,每次还原都还原到母盘状态,我们这里为节约体积用动态磁盘。
VHD容量为8G,文件大小为5G,文件路径为D:
\Win7.vhd,并且里面已经安装有优化过精简过个性化设置过的Win7系统。
差异盘A,我们正在使用的系统盘。
文件路径为D:
\Win7A.vhd
差异盘B,我们为了系统还原准备的临时盘。
文件路径为D:
\Win7B.vhd
其中差异盘A跟差异盘B都是挂到母盘上的差异盘。
足够大的物理分区一个,大小要大于2倍VHD的容量+VHD实际体积,NTFS格式,且不能磁盘压缩。
最好是单独一个分区专门放这个。
我举例为D盘
Windows7系统可以正常引导。
实战篇:
1、制作一个VHD的Windows7系统。
文件路径为D:
\Win7.vhd
2、用管理员身份在命令提示符下执行如下命令for/f"tokens=1-2"%ain('Bcdedit-create/d"Win7"/applicationosloader')doecho%b得到诸如echo{9bc08e8d-80f8-11de-86ed-001fc6de4e51},记下大括号以及其中的内容,就是启动项标识符,留作下面使用重复上面动作动作,得到另一个大括号的内容,也同样记录下来,留作下面使用,如果不会的话,就直接用这两个吧:
{9bc08e8c-80f8-11de-86ed-001fc6de4e51}{9bc08e8d-80f8-11de-86ed-001fc6de4e51}(下面的例子就用此,如果想省事儿,就请直接用这个,如果想用自己的标识符,那么下面所有的标识符请自行替换,一共就两个标识符而已,很好换。
)
3、新建一个空白批处理文件,名字为FirstRun.bat,放到D盘里面,留作自启动批处理的符号连接源文件。
4、在物理机上挂接母盘,(如果本系统就是母盘,则不用重复挂接)控制面板-管理工具-计算机管理-磁盘管理。
磁盘管理几个字上点右键,附加VHD。
浏览到D:
\Win7A.vhd并确定。
磁盘中会多出一个VHD虚拟磁盘。
输入如下命令以建立自启动批处理的符号连接
mklink“VHD盘符:
\Users\你的用户名\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup\FirstRun.bat”“D:
\FirstRun.bat”
5、用记事本打开D:
\FirstRun.bat,输入如下命令,其中大括号中的标识符带表上一步得到的两个启动项的标识符,请替换成你自己的。
echocreatevdiskfile="D:
\Win7A.vhd"parent="D:
\Win7.vhd">"D:
\creatA.txt"
echocreatevdiskfile="D:
\Win7B.vhd"parent="D:
\Win7.vhd">"D:
\creatB.txt"
del"D:
\Win7?
.vhd"
diskpart/s"D:
\creatA.txt"
diskpart/s"D:
\creatB.txt"
del"D:
\creat?
.txt"
bcdedit/default{current}
bcdedit/set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}description"Windows7瞬间还原”
bcdedit/set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}description"Windows7瞬间还原”
bcdedit/set{current}description"Windows7已恢复"
bcdedit/importD:
\BcdBakup
iferrorlevel1gotoDelRun
delD:
\BcdBakup
gotoend
:
DelRun
del "C:
\Users\你的用户名\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup\FirstRun.bat"
:
end
经试验,这个批处理是可以用的。
然后在磁盘管理里面断开这个VHD文件的映射。
上面的命令的目的是设置当A启动的时候自动删除B盘并生成新的B盘,设置当B启动的时候自动删除并生成新的A盘。
最后判断是否能成功导入BcdBakup这个BCD引导配置的备份文件,如果导入成功则删除这个文件,如果没导入成功则删除自启动的批处理。
(这段用作修改还原点操作。
)
如果大家有疑问,我会等会儿在回复中回答这些命令的含义。
4、建立两个差异盘A和B。
用管理员方式运行命令提示符,输入如下命令(同上,大括号内的标识符你可以替换成自己的数据,但是请保证跟上面一致)
DISKPART
DISKPART>createvdiskfile="D:
\Win7A.vhd"parent="D:
\Win7.vhd"
DISKPART>createvdiskfile="D:
\Win7B.vhd"parent="D:
\Win7.vhd"
exit
(其实创建一个就行了)
5、生成A和B的引导
用管理员方式运行命令提示符,输入如下命令
bcdedit-create{9bc08e8c-80f8-11de-86ed-001fc6de4e51}-d"Windows7正常使用"-applicationOSLOADER
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}devicevhd=D:
\WIN7A.vhd
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}path\windows\system32\boot\winload.exe
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}localezh-CN
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}inherit{bootloadersettings}
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}osdevicevhd=D:
\WIN7A.vhd
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}systemroot\windows
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}nxoptin
bcdedit-set{9bc08e8c-80f8-11de-86ed-001fc6de4e51}detecthalyes
bcdedit-displayorder{9bc08e8c-80f8-11de-86ed-001fc6de4e51}/addfirst
bcdedit-create{9bc08e8d-80f8-11de-86ed-001fc6de4e51}-d"Windows7瞬间还原"-applicationOSLOADER
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}devicevhd=D:
\WIN7B.vhd
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}path\windows\system32\boot\winload.exe
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}localezh-CN
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}inherit{bootloadersettings}
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}osdevicevhd=D:
\WIN7B.vhd
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}systemroot\windows
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}nxoptin
bcdedit-set{9bc08e8d-80f8-11de-86ed-001fc6de4e51}detecthalyes
bcdedit-displayorder{9bc08e8d-80f8-11de-86ed-001fc6de4e51}/addfirst
6、重启。
7、如果不想启动的时候看见本来的系统,请自行用bcdedit来删除引导,因为这个与本文无关,故不再多述。
其他:
附送另一个我以前写的一个批处理,也能起到自动建立Win7A引导的目的。
修改第二行的Win7A.vhd改成Win7B.vhd就能建立Win7B.vhd的引导(倒数第二行和倒数第三行是假设引导分区是C盘,否则请做相应修改这两行中的C:
)
delD:
\Parent?
.txt
echoCREATEVDISKFILE="D:
\Win7A.vhd"PARENT="D:
\Win7.vhd"noerr>"D:
\Parent.txt"
echoselectvdiskfile="D:
\Win7A.vhd"noerr>>"D:
\Parent.txt"
echoattachvdisknoerr>>"D:
\Parent.txt"
echoselectPARTITION=1>>"D:
\Parent.txt"
echoattachvdisknoerr>>"D:
\Parent.txt"
echoASSIGNLETTER=Bnoerr>>"D:
\Parent.txt"
diskpart/s"D:
\Parent.txt"
echoSELECTVOLUME=C>"D:
\Parent7.txt"
echoactive>>"D:
\Parent7.txt"
diskpart/s"C:
\Parent7.txt"
diskpart/s"C:
\Parent.txt"
bcdbootB:
\windows/sC:
bootsect/nt60C:
/mbr
delC:
\Parent?
.txt
使用篇:
重启之后,开机会多出两个系统,一个叫正常使用,一个叫瞬间还原。
当我们选择正常使用启动的时候,我们就会跟没还原一样,还是用的原来的系统,当我们选择瞬间还原启动的时候,我们的系统就会变成母盘的状态,然后进入桌面,当第一次进入桌面的时候会出现一个DOS窗口,作用是删除另一个子VHD(就是上次启动时候的正常使用系统),然后再重新建立一个空的子VHD来代替,以备下次还原时候使用。
再把目前的子VHD设置成默认启动项,并且启动项的名字改成正常使用,把刚才建立的新的子VHD的启动项改名字成瞬间还原。
这个DOS窗口会自删除,所以第二次启动就不会出现了。
(因为这是保存在母盘里面的,所以当下次还原的时候还会回到母盘的状态,这个DOS窗口还会出现一次,并且把自己再删除,所以能无限次使用,但是每次还原只出现一回,也就是本原理的奇妙之处。
)
当需要保存修改的时候,用管理员权限在命令提示符下运行如下命令:
bcdedit/exportD:
\BcdBakup
//这步是备份BCD引导配置文件以备修改完恢复瞬间还原的引导菜单
bcdedit/set{current}osdevicevhd=D:
\WIN7.vhd
//设置默认引导为母盘VHD
bcdedit/set{current}devicevhd=D:
\WIN7.vhd
//设置默认引导为母盘VHD【这条貌似可以不用】
2、重启到母盘系统,然后修改系统到喜欢的状态,然后再次重启。
3、如果期间多次重启,则可能导致自启动的批处理自己删除了自己,可以手动复制回去,或者再次运行一下上面第一点中的命令。
技巧篇:
1、怎样制作最佳的VHD母盘。
首先我推荐动态磁盘来做母盘,这样可以最节约空间。
其次,母盘里面的系统要用NTFS磁盘压缩,这样更进一步节约空间。
尤其是windows文件夹中的winsxs文件夹,获取管理员权限然后压缩之后,整个母盘可以控制在3.5G以下。
正常的磁盘清理垃圾,清理各种软件的缓存,设置好所有常用的软件,争取以后还原之后什么都不需要设置就可以直接使用。
2、放VHD文件的磁盘要设置成多大的分区。
推荐VHD动态磁盘内部的空间大小设置成10G,这样下来之后母盘是4G,平常的话母盘+两个子盘占用的空间就是10G+0G+4G=14G(因为虽然是动态VHD,但是系统登陆之后仍然会把空间扩充到最大,所以依然是10G大小。
但是系统关机后会还原到最小状态)。
如果用一阵子,其中的一个子盘会慢慢变大(因为存储的是对母盘的改变,当然会越变越大。
)到后来可能会占用5G多呢。
(我就占用到超过6G过)不过也不太可能撑满10G。
所以暂时就当它能扩充到5G吧。
当我们系统还原的时候,假设子盘扩充到5G,当选择启动项“瞬间还原”登陆系统但是dos窗口还没出现的时候,系统占用磁盘空间为5G+10G+4G=19G。
因为我们用的第二个子VHD启动,所以上一个公式的0G变成10G。
10G因为关机了变成了5G。
4G母盘是永远不变的。
因此我们可以大概的这样设定,装载VHD盘的硬盘分区空间设定为20G。
这样启动的VHD系统,容量是10G,并且有6G可用空间。
(但是全选里面的文件夹看占用空间却是8G左右。
而看分区使用情况的话却是4G左右,很奇妙,即使是NTFS磁盘压缩也压缩不到这个程度,所以推断,VHD里面的文件映射只占用一个文件的磁盘空间。
)但是如果一个子盘使用过久,即使关机状态也超过了6G的话,或者非法关机,所以VHD仍然是10G而没缩小的话。
如果这时启动时候选择瞬间还原系统来还原,就会造成另一个子VHD,因为空间不足无法扩充到10G,而在登陆帐户的时候造成蓝屏死机。
所以这个20G的分区并不是最安全的选择,最安全的当然是10G+10G+4G=24G的时候最安全,不过子VHD很少会扩充成10G这样,所以这是在浪费空间。
当然如果你说你平时不做什么,磁盘空间又很紧张的话,把20G改成18G也是可以正常使用的,但是不推荐设置成17G以下,太冒险了。
如果真的因为空间不足而无法启动,只要用任何方法,删除那个体积大的子盘就行了。
(比如说用PE系统或者DOS,我本人很推荐安装一个PE系统,跟VHD放一个盘,即使只有20G空间也应该不影响什么。
)
3、把系统还原到任意时间点。
其实只需要备份一下子系统,然后以后想还原到这个状态的时候还原子系统就行了。
答疑篇:
1、VHD性能不行。
确实VHD性能是有所损失,但是我使用了这么久,性能损失基本可以忽略不计。
毕竟操作系统也就开机的时候狂读硬盘,平常我们看电影玩游戏听音乐,用的都不是系统盘,都是我们的真实硬盘,可以非常肯定的告诉大家,VHD做系统盘,平常使用中,那个性能的损失,是感觉不出来的。
2、还原软件不安全。
以前的还原软件都要加载特殊驱动或者在磁盘引导区写入特殊代码或者改变分区。
基本上原理都是在硬盘中单独开辟出一块空间存储对磁盘所做的更改,还原的时候直接把这一块空间数据删除。
时间越久系统越不稳定,因为它们拦截改写了windows写入磁盘的方式。
而我这种方式的还原,虽然原理差不多,但是是基于windows7对VHD的支持上建立的,因此不会加载第三方驱动,不改写硬盘数据,更不会损坏硬盘数据,而且不管用多久,都不会不稳定蓝屏死机。
3、硬盘空间不够折腾。
其实想一下,我们16G的C盘可以有多少G的剩余空间?
也就是6G左右而已,如果加上系统自带的备份,一定超过20G,就算用Ghost备份,也是差不多20G的。
而用我的方法制造的VHD,虽然容量是10G,但是剩余空间也有6G,也就是说,20G的分区里面,只比16G多了4G母盘空间而已,但是却能做到瞬间还原,比任何方式做的还原都快速便捷。
所以硬盘空间并不是问题。
除非你从来不备份,也不保留Windows安装盘的ISO文件。
4、看起来好复杂很难。
做过VHD系统的人,基本上bcdedit命令也都了解的差不多了,怎么把VHD添加到启动项也很清楚,怎么做子VHD也都轻车熟路。
其实你要做的只是把我的批处理文件放在母盘的相应目录。
然后重启,就这么简单。
三步:
放入批处理到母盘,生成两个子VHD,建立新启动项。
从此以后再无后顾之忧。
5、Boot文件坏了还能恢复吗。
很遗憾,是不能恢复的,但是同理,还原软件在引导损坏的情况下,也是失效的。
没有任何东西在引导坏了的情况下还能继续启动执行还原操作。
所以推荐各位用U盘或者光盘的PE系统。
同时不要直接点自动修复启动项,因为这个东西不会修复VHD启动项的。
但是可以把两个子VHD挂接到硬盘之后再执行这个自动修复启动项的操作,但是这样虽然能修复启动,但是还原之后自动修改引导菜单名字的功能会失效,除非你自己用老的GUID重新手动添加引导。
6、滚动条之后登陆桌面之前蓝屏。
请检查你的磁盘空间。
子VHD虽然只有几K,但是启动之后会变成10G(具体视你的设定)。
没那么大空间就会蓝屏。
7、这个不好使。
我这篇只注重原理,原理是百分百可行的,至于哪里出了问题,可以发站内信给我。
我们一起研究特殊情况,互相学习共同进步。
但是请不要诋毁这么多文字,那只能显示出你知识的浅薄。
8、之后还能休眠和睡眠吗?
当然可以,至少我的混合睡眠都是完全可以的,前提是你安装好主板或者笔记本厂家的电源驱动哦。
才疏学浅,只在几台电脑上测试通过(条件有限没太多电脑),希望对大家有帮助,如果有疑问,请回帖。
此原理已经被shuaicai同学做成了一个特别牛X的批处理文件,传送门:
原文地址:
54ming6595
继续完善【用VHD做Windows7的瞬间还原】20100921
继续完善【用VHD做Windows7的瞬间还原】20100921
回复
发帖
返回列表
PCBETABeta1
UID612帖子219PB币229 威望57 贡献0
1楼跳转到 »倒序看帖
打印字体大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHD 实现 Windows7 瞬间 还原