无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 26053|回复: 46
打印 上一主题 下一主题

充分发挥VHD的还原系统优势

[复制链接]
跳转到指定楼层
1#
发表于 2010-12-15 19:12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有更新,到这里下载:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=202619

VHD差分系统的其中一个重要的优势就在还原系统上,只需要简单的文件替换即可完成。但相对于启动到图形界面,再打开资源管理器进行替换,我们花在启动图形界面上的时间远远超过“还原”操作本身。
因此,我有个想法,是否有高手可以开发一个可配置的,自动替换VHD的程序,可以挂到BCD启动项中,即可实现1秒系统还原,更好的情况可能是,该程序替换完成后,直接跳转回引导界面,甚至不用重启电脑,直接进入还原后的系统。这种快捷将会是目前所有一键还原无可比拟的。

我没有这方面编程的经验,无法实现,不知道有没有高手对这个想法有没有兴趣?

=====================================

基于0cat0的DD写文件的方法,用VB写了一下,可以根据不同的环境配置。自己这边测试成功了。实测整个还原过程只有2秒钟不到。

适用情景:
使用动态VHD差分的形式安装的WIN7系统,并且在安装过程中,对需要还原的子VHD有做好备份。使用此程序配置后,即可实现瞬间还原的效果。

使用方法:
打开后,选择系统所在的VHD,选择备份的VHD,输入要定义的名称,点配置;
然后在启动WIN7时可以看到还原菜单.选择后瞬间还原完成,无需重启.

程序发出来,算是抛砖引玉,希望有人可以按类似的思路完善一下。

程序在VHD系统中运行,主要就是做几个事:
根据选择的VHD文件,把“RESTORE.MBR”和“RESTORE.SYS”复制到VHD所在分区根目录
在VHD所在的分区,根据填写的启动项名称,生成RESTORE.CMD,运行后加入启动项、自动删除自己
在VHD所在的分区,根据选择的VHD文件,生成RESTORE.LST,即GRUB菜单

所以完成后,VHD所在分区会多出三个文件:”RESTORE”、“RESTORE.MBR”和“RESTORE.SYS”

还原的流程就是:bootmgr->Grub4dos->用dd写VHD->bootmgr。
好处就是不用自己理解和修改代码,当然可以更完善,也最好不用VB写。本人水平有限,哪个大侠有兴趣就出手吧,呵呵


=================================
2011.04.08 更新
停止下载,有空时更新新版
抱歉,一直没能在这里投入精力,上一个程序确实存在路径判断的问题。修正了一下。
另外优化了操作过程,添加了删除旧还原启动项的功能,不用另找工具去删了。


=================================
2011.01.22  更新,主要是对VHD差分链进行检测,实现了列出差分链列表,检测所选的VHD还原后是否会破坏差分链,选择的还原用VHD是否有效(与被还原VHD有相同的父VHD),避免配置还原后造成一些不必要的问题。不过目前还只能添加其中一个差分链的还原
但是检测的原理是基于观察总结的不知是否可靠,有待测试(原理:VHD&H240&中记录了父VHD信息)
下面是截图,下载见“VHD瞬间还原1.2[待测试].rar”(附件大小限制307.2 kb ,真是崩溃!!):
http://u.115.com/file/t32627601a


=================================

晚上又搞了一下,现在可以防止误操作了(把g4d的password命令当验证码来用了),免得一下按错,抱憾终生,呵呵
另外,还原前后会有中文提示,在VHD分区生成的文件自动隐藏

见附件“VHD瞬间还原2.rar”





[ 本帖最后由 jebbs 于 2011-11-21 19:23 编辑 ]

点评

楼主把界面名称改一下更明白 系统VHD--改成类似 在用的子VHD 比较好理解些吧  发表于 2022-7-13 23:22

评分

参与人数 1无忧币 +5 收起 理由
879792799 + 5 赞一个!

查看全部评分

2#
发表于 2010-12-15 20:51:54 | 只看该作者
这个也许就是你要的那种。
http://bbs.wuyou.net/forum.php?m ... 9619&highlight=
回复

使用道具 举报

3#
发表于 2010-12-15 22:37:12 | 只看该作者
我觉得这位老大的贴子http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1里的工具可以满足楼主的要求啊!
回复

使用道具 举报

4#
 楼主| 发表于 2010-12-15 22:47:09 | 只看该作者
谢谢LS两位,不过你们没有真正理解我的意思<br />VHD的差分系统我已经装好在用了,我重要的一个观点就是,还原VHD,花在启动操作环境的时间远远多于还原操作本身(也就是替换VHD这个操作),比如你们提供的链接中的批处理,是需要启动WIN7PE的,大概需要2,3分钟的时间;<br />如果我的想法是可行的,那么这个时间可以由2,3分钟降到几秒钟,巨大的差别。并且对于菜鸟来说,只是选择一下菜单,而不是去找PE,找操作的方法。

刚看了一下epjtg介绍的那个批处理,莫非VHD系统支持在开机时,直接替换正在使用的子VHD??!!

我每创建一次子VHD都会有备份,因此还原时并不像那个批处理里的那么复杂,只是文件的替换而已,但能是VHD WIN7里替换正在使用的VHD,我还是不信



[ 本帖最后由 jebbs 于 2010-12-15 23:21 编辑 ]

点评

G4D 的DD命令的却可以在系统启动前覆盖将要启动的vhdvhd  发表于 2022-7-13 23:24
回复

使用道具 举报

5#
 楼主| 发表于 2010-12-15 22:50:17 | 只看该作者
可能的一个做法会是,用GRUB启动一个支持NTFS的DOS镜像,这个镜像启动后只做一件事,就是替换VHD
但是这样这个镜像本身做起来就不是通用的,也不易配置,并且也不知道如何在替换完VHD后返回BCD引导而不用重启
回复

使用道具 举报

6#
发表于 2010-12-16 00:34:25 | 只看该作者
楼主的想法很好,不过真的要做也不是不可能的,只要在启动菜单里面加上G4D启动,用G4D替换就行了,不过具体的实现方法我是无能为力了,呵呵。。。
回复

使用道具 举报

7#
 楼主| 发表于 2010-12-19 16:56:23 | 只看该作者
沉了~~~~~~~~
回复

使用道具 举报

8#
发表于 2010-12-19 21:03:56 | 只看该作者
回复

使用道具 举报

9#
发表于 2010-12-24 09:54:28 | 只看该作者
已经可以用G4D加菜单替换了,呵呵,看下面的帖子:

http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

10#
 楼主| 发表于 2010-12-27 11:11:45 | 只看该作者
谢ls,回去就试试~~~
回复

使用道具 举报

11#
发表于 2010-12-27 11:18:19 | 只看该作者

回复 #10 jebbs 的帖子

具体方法已经添加到自己的教程里面的:

http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

12#
 楼主| 发表于 2010-12-28 20:35:07 | 只看该作者

回复 #11 0cat0 的帖子

呵呵,不错,一站式教程~~~
我觉得下面可以研究一下,使用G4D+WENV,实现一个可以通用的menu.lst,可以通用地安装和使用

貌似我这边在>grub 命令行下,执行WENV就不行,设好根分区后,用/WENV就可以,不知道什么原因,刚开始接触WENV~~~

PS:运行你帖子中的批处理,不能正常工作,BCDTEMP.TXT中的内容是:
The boot configuration data store could not be opened.
系统找不到指定的文件。

我的情况是,有个100M的启动用分区,启动后是自动隐藏的

[ 本帖最后由 jebbs 于 2010-12-28 21:31 编辑 ]
回复

使用道具 举报

13#
发表于 2010-12-29 09:17:33 | 只看该作者

回复 #12 jebbs 的帖子

我的那个CMD是不能隐藏BCD所有盘的,不然会找不到的,还有,CMD里面已经设置了VHD文件的完整路径为/My_BOOT/WIN7_X86.VHD,如果跟我的不一样,要自己改的。。。

因为想做得傻瓜一点,所以所有的东西就是把路径和文件名都设置到里面去了。。。
回复

使用道具 举报

14#
 楼主| 发表于 2011-1-4 22:27:01 | 只看该作者
更新了,顶。。。。。
回复

使用道具 举报

15#
发表于 2011-1-5 19:01:37 | 只看该作者
还是用g4d方便 这个思路非常好
回复

使用道具 举报

16#
发表于 2011-1-5 20:05:36 | 只看该作者
回复

使用道具 举报

17#
发表于 2011-1-16 15:41:42 | 只看该作者
我想还原多个子VHD,想多增加一个还原选项,请问如何设置?
再多请教一下,那个RESTORE.SYS是干嘛用的?能否删除?
回复

使用道具 举报

18#
 楼主| 发表于 2011-1-16 19:56:47 | 只看该作者

回复 #17 浊辅音 的帖子

所有文件都不能删除,呵呵
RESTORE.SYS实际就是GRLDR,为了不与引导用的其它GRLDR冲突,也为了好记就改了这个名
还原多个子VHD:
你是指有多个VHD系统?如果是,目前这个不行,除非按这个原理手工配置了。
如果是同一个系统的多个差分VHD,应该不能还原中间一级的VHD的
回复

使用道具 举报

19#
发表于 2011-1-16 20:24:41 | 只看该作者
谢谢回复。多个VHD指的是我有多个同属于同一个父VHD系统的子VHD,比如两个。我想在恢复的时候选择两个子VHD之间的其中一个恢复。
是否可以做两个g4d,改为不同的名字,再配置不同的恢复的任务?
回复

使用道具 举报

20#
 楼主| 发表于 2011-1-17 18:41:50 | 只看该作者

回复 #19 浊辅音 的帖子

嗯,手工的话,有技术没约束啊~~呵呵
再用一份G4D也是可以的,只是下面这样更快:
你只要把RESTORE.LST打开(在隐藏的RESTORE文件夹里),手工再复制修改加一个就完了,对,还有把timeout也改一下。
timeout 0
default 0

fontfile /RESTORE/fonts.gz
#splashimage /RESTORE/back.xpm.gz

title 瞬间还原系统
pause --wait=0 为确认这不是误操作,请输入验证码(0978):
password 0978
dd if=()/BACK/Win7Normal.vhd of=()/Win7Normal.vhd
pause --wait=3 还原完成,返回启动菜单
find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /BOOTMGR

title 放弃还原,返回引导菜单
find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /BOOTMGR

比如复制粘贴中间的,改成:

title 瞬间还原系统2
pause --wait=0 为确认这不是误操作,请输入验证码(0978):
password 0978
dd if=()/BACK/Win7Normal2.vhd of=()/Win7Norma2l.vhd
pause --wait=3 还原完成,返回启动菜单
find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /BOOTMGR

[ 本帖最后由 jebbs 于 2011-1-17 18:50 编辑 ]
回复

使用道具 举报

21#
发表于 2011-1-17 19:38:05 | 只看该作者
嗯,的确是省事多了,谢谢!
回复

使用道具 举报

22#
发表于 2011-1-22 20:18:54 | 只看该作者
怎么选择vhd路径后再选择同目录下系统vhd提示请勿选择指定路径外的vhd?
回复

使用道具 举报

23#
 楼主| 发表于 2011-1-23 13:13:30 | 只看该作者

回复 #22 425360202 的帖子

你确定是同一个目录吗?不是子目录或其它目录?
回复

使用道具 举报

24#
发表于 2011-1-23 19:19:28 | 只看该作者
确定是同一目录,我是在vhd的win7里运行的。

[ 本帖最后由 425360202 于 2011-1-23 19:21 编辑 ]
回复

使用道具 举报

25#
 楼主| 发表于 2011-1-24 19:47:26 | 只看该作者
我这边试了 是好的呀~~||
等有空深入看看
回复

使用道具 举报

26#
发表于 2011-1-24 21:16:30 | 只看该作者
我现在用的方案是基于NTBOOT启动盘的VHD快速还原模式, 缺点,必须用GRUB4DOS引导NTBOOT.IMG后再引导VHD系统,
优点  快速还原就不说了,可以把VHD放到任意的NTFS分区,包括隐藏分区(ID为12的NTFS分区也行),而且可以复制新VHD子系统  让一台电脑的VHD系统变成真正意义上的多用户
回复

使用道具 举报

27#
 楼主| 发表于 2011-1-26 18:44:55 | 只看该作者

回复 #26 xiaoy 的帖子

发个帖弄出来学习学习啊,呵呵
回复

使用道具 举报

28#
发表于 2011-1-26 20:13:38 | 只看该作者
debug off
command --set-path=(fd0)/grub/
fontfile (fd0)/grub/fonts
default 1
timeout 3
menuset 15 15 15 15 15 21 20 40 5 3 10
write 0x60000 0
insmod (fd0)/grub/WENV
find --set-root --devices=h /win7/vhdparent.bak && default 0      //父VHD存在就以第一项启动  可在任意分区下创建win7目录来存放VHD文件
find --set-root --devices=h /win7/win7.vhd && wenv set name=win7   //公用版假定为win7.vhd  子VHD文件

title 启动您的Win7系统\n\t请输入您的系统名称。
find --set-root --devices=h /asus.bin && slic /asus.bin    //免激活处理
wenv get name && WENV call pause --wait=4 5秒后将启动公用版win7系统,按ESC键启动您的专用版win7. || wenv set name=$input,请输入您的系统名称: || configfile (fd0)/menu.lst
wenv get name || wenv set name=$input,请输入您的系统名称: || configfile (fd0)/menu.lst
wenv set tmp=/win7/${name}.vhd
wenv call find --set-root --devices=h ${tmp} || fallback --go 3
write --offset=0x4E74 (fd0)/boot/bcd b
wenv get tmp=0x600000
cat --locate=\\x2F --replace=\\x5C (md)0x3000+3
wenv call write --offset=0x7D72 (fd0)/boot/bcd *0x600000$
wenv call write --offset=0x82EA (fd0)/boot/bcd *0x600000$
WENV calc cur_drv=*0x82A0 & 127
WENV calc cur_pri=*0x829C>>16 & 65535
write 0x60004 0
write 0x60000 0
WENV calc cur_drv=*0x82A0 & 127
wenv call dd if=(hd${cur_drv})+1 of=(md) bs=1 count=4 skip=0x1b8 seek=0x60000
cat --length=0 ()-1
dd if=(md) of=(md) bs=1 count=8 skip=0x8290 seek=0x60008
cat --locate=\x2E\xB5\x41\x7D --replace=*0x60000 (fd0)/boot/bcd
cat --locate=\0\x7E\0\0 --replace=*0x60008 (fd0)/boot/bcd
chainloader (fd0)/boot/bootmgr
boot                                    

title 启动常规版Win7或XP系统\n\t优先搜索启动Win7,其次XP。      //不存在父VHD则搜索启动正常安装版的WIN7或XP
find --set-root --devices=h /asus.bin && slic /asus.bin        //免激活处理
errorcheck off
find --set-root --devices=h /ntldr && unhide && chainloader /ntldr     
find --set-root --devices=h /bootmgr && unhide && chainloader /bootmgr
errorcheck on
boot

title 创建或还原您的专用版win7系统\n\t输入已有用户名则还原,新用户名则创建。
wenv get name && WENV call pause --wait=5 5秒后将还原公用版win7系统,按ESC键还原或新建您的专用版win7. || wenv set name=$input,请输入您需要还原或新建的系统名称: || configfile (fd0)/menu.lst
wenv get name || wenv set name=$input,请输入您需要还原或新建的系统名称: || configfile (fd0)/menu.lst
WENV call find --set-root --devices=h /win7/${name}.vhd || fallback --go 4
WENV call pause --wait=9 原系统中的资料将丢失! 不想还原请按ESC键取消。 || configfile (fd0)/menu.lst
diskid && wenv set part=*0x4ff00$                 //获取GHOSTID
WENV call write --offset=0x19 (fd0)/autoexec.bat ${part}
write --offset=0x1a (fd0)/autoexec.bat .    //修改:为.
WENV call write --offset=0x7c (fd0)/autoexec.bat ${name}.vhd   //修改autoexec.bat中的变量
chainloader (fd0)/io.sys

#3
title
pause 输入错误,按任意键返回选择菜单 && configfile (fd0)/menu.lst

#4
title
wenv check "${name}"<>"" || fallback --go 3
WENV call pause --wait=0 输入密码后将创建${name}的专用win7系统!
password =wuyou || fallback --go 3
WENV call find --set-root --devices=h /win7/win7vhd.bak || WENV call pause win7系统的一键还原已被破坏,请联系XX电脑,电话:XXX。&& chainloader (hd0)+1   // win7vhd.baK为子VHD备份文件 97KB
diskid && wenv set part=*0x4ff00$
WENV call write --offset=0x19 (fd0)/autoexec.bat ${part}
write --offset=0x1a (fd0)/autoexec.bat .
WENV call write --offset=0x7c (fd0)/autoexec.bat ${name}.vhd && chainloader (fd0)/io.sys

[ 本帖最后由 xiaoy 于 2011-1-26 20:21 编辑 ]
回复

使用道具 举报

29#
发表于 2011-1-26 20:16:36 | 只看该作者
autoexec.bat
内容为
@ECHO OFF
cls
set part=       //分区号由GRUB写入
echo Please wait a while...
        
echo omnifs copy %part%:\win7\win7vhd.bak %part%:\win7\            >a:\vhd.bat    /空白处由GRUB写入
call a:\vhd.bat
      
GRUB --time-out=0 --config-file=(fd0)/menu.lst
回复

使用道具 举报

30#
 楼主| 发表于 2011-1-26 21:41:15 | 只看该作者
先研究了~~
你开个贴啊,反正这个区也这么冷清~~~,最好弄成个成品发出来,哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-27 21:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表