2010speedloong 发表于 2021-1-11 11:05:35

UEFI启动模式下实现VHD秒还原

本帖最后由 2010speedloong 于 2021-1-11 12:16 编辑

年底了..事情特别多 恨不得多来几个周末 总感觉时间不够用 原本当天想写这篇教程的 结果拖到现在 大家见谅..
在写之前 还是必须得郑重感谢hilsonma大哥的热心帮助 使得VHD还原功能能够实现 !
因时间关系 本帖只详细说明操作流程 操作中会有些细节需要特别注意 系统使用的是win10LTSC版
留意以下关键字 : 1本地操作系统 2.原有的bootmgfw.efi 3.父VHD 4.存放VHD的目录路径 5.虚拟内存 6.注册表添加restore启动项
好了 话不多说 正式开始..
第一步骤 : 安装好本地操作系统之后或是原有的本地操作系统 先将win系统引导变更为grub2引导方式 用过之后确实感觉很好 支持UEFI
如何变更 : 1.用DG工具打开本地硬盘 给ESP分区分配盘符
                2.复制一份grubx64.efi (在efi_one目录下) 再拷贝至ESP分区里的\efi\microsoft\boot
                这个文件可自行修改efi_one\build\boot\grub\grub.cfg中的内容 再点击"制作单文件eif"重新生成 附件中上传的是我根据自己习惯更改的
                注意 : 只要grub.cfg中的内容有变更 就必须重新再生成一次 生成后再操作"如何变更"的第2步骤
                3.拷贝grubx64.efi之后 先把原有的bootmgfw.efi文件名刷一下复制 然后将原本的bootmgfw.efi改名 我是在w后面加个0 bootmgfw0.efi
                然后再将刚才拷贝过来的grubx64.efi变更文件名以及后缀为bootmgfw.efi 到此grub2启动设置完毕 重启可看到不同的引导界面
第二步骤 : 启动父VHD 存放VHD的目录路径和脚本的内容有关联 需特别注意 若个人存放VHD路径与脚本中的路径语句不一致 请自行更改正确路径
                我个人是存放在D盘vhd目录下 VHD具体的建立就不多叙述 这里需要注意的是在进入到父VHD之后 当前启动的VHD盘符默认是为C盘
                原始本地操作系统会变成D盘 依次类推 原有的D盘就会变成E盘 这里不需要将本地操作系统分区隐藏 只需要将分区号删除即可
                如若删除不了 请注意细节 是否存在虚拟内存 页面文件..
                所以建议在本地操作系统环境下就预先禁用掉虚拟内存 避免启动父VHD之后无法变更盘符的问题
                启动到父VHD后建议要做的第一件事不是安装软件或是调整设置这些
                为了避免遗忘最关键的脚本启动 强烈建议先将restore.cmd添加至启动项
如何添加 : 1.强烈建议拷贝restore.cmd脚本至C盘根目录或是自建目录都行 因为放在父VHD的C盘下无论怎样折腾 脚本都不会丢失 保证安全启动脚本
                2.win+R 运行输入regedit 进入注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
                右键新建字符串值 restore 样例: 我本人是将restore.cmd放至C盘根目录 字符串数值数据里就是填写C:\restore.cmd
                设置完后确认一下任务管理器的启动项中是否存在restore 存在即可 接着可以去操作安装软件或是系统其他设置等一系列操作
第三步骤 : 1.重启回到本地操作系统 将父VHD创建子VHD(可用VHD_OneKey)注意:创建完之后 将win_CHILD多复制一份出来 同时改名为win_CHILD1
                2.执行一下child1.cmd 创建标志文件child.1 到此..整个操作流程走完
最后一步 : 重启进入grub2启动菜单中的win_CHILD_BAK 查看还原效果
                教程中所提到的工具及脚本 可在此度娘盘下载 链接: https://pan.baidu.com/s/1x3QM0Wh-NeMddoKlYv_jMg 提取码: 2xv9

maghreb 发表于 2021-1-11 11:28:18

干洗分项

mrzhonghb 发表于 2021-1-11 11:56:33

下载附件需要多少分啊,能不能放网盘啊

2010speedloong 发表于 2021-1-11 12:12:21

mrzhonghb 发表于 2021-1-11 11:56
下载附件需要多少分啊,能不能放网盘啊

好的 稍后我调整一下

ls68057121 发表于 2021-1-11 12:20:16

看得不是很懂,是grub2每次都会自己刷一个新的子vhd出来嘛

mrzhonghb 发表于 2021-1-11 12:54:17

2010speedloong 发表于 2021-1-11 12:12
好的 稍后我调整一下

感谢楼主的网盘分享

2010speedloong 发表于 2021-1-11 13:04:44

ls68057121 发表于 2021-1-11 12:20
看得不是很懂,是grub2每次都会自己刷一个新的子vhd出来嘛

先跟着步骤来做 不会有问题的

2010speedloong 发表于 2021-1-11 13:05:45

本帖最后由 2010speedloong 于 2021-1-11 14:07 编辑

2010speedloong 发表于 2021-1-11 13:04
先跟着步骤来做 不会有问题的
grub2只是启动引导而已 实际达到还原效果最关键的是脚本和复制子VHD的操作

ls68057121 发表于 2021-1-11 14:02:47

2010speedloong 发表于 2021-1-11 13:05
grub2只是启动引导而已 实际达到还原效果最关键的是脚本和复制子VHD的操作

意思是,脚本每次都会复制指定的vhd并改名是吗

ddnflier 发表于 2021-1-11 14:22:38

先顶,然后慢慢研究

2010speedloong 发表于 2021-1-11 15:27:12

ls68057121 发表于 2021-1-11 14:02
意思是,脚本每次都会复制指定的vhd并改名是吗

是的 按照步骤可以先操作一次就能明白了 先按操作步骤跟一遍 后续如果需要根据自己喜好调整文件名这些的可在理解后再自行更改

sanshen3 发表于 2021-1-11 22:36:57

感谢楼主的网盘分享,学习一下慢慢研究{:1_186:}

qq328 发表于 2021-1-14 08:59:45

进入到父VHD系统中,原有三个分区,要全删除分区盘符吗?还是只删除D盘符?

hilsonma 发表于 2021-1-14 09:34:12

本帖最后由 hilsonma 于 2021-1-14 09:36 编辑

qq328 发表于 2021-1-14 08:59
进入到父VHD系统中,原有三个分区,要全删除分区盘符吗?还是只删除D盘符?
原有三个分区,原本是C/D/E三个盘符的,C盘是Windows系统

当你进入父VHD系统后,C盘是父VHD系统,原有的三个分区变成了D/E/F

为了使得在父VHD系统中看到的盘符内容跟原来系统一致,就需要在父VHD系统中把Windows分区的盘符D删除(只删除盘符,不是删除分区),把第二分区的盘符E改回D,把第三分区的盘符F改回E

改了之后,C盘是父VHD系统,D盘是第二分区,E盘是第三分区,看到的内容就跟原来系统中一样。而第一分区即原来的windows系统就会隐藏不见。

qq328 发表于 2021-1-14 17:47:17

谢谢大师指导

39282315 发表于 2021-1-15 15:31:41

谢谢

lk5258 发表于 2021-1-15 16:31:04

请问老大 vhd能不能支持 休眠功能?

wawakuliao 发表于 2021-1-16 15:46:14

感谢分享

langyun 发表于 2021-1-17 08:31:31

hilsonma 是一个很热心的好人

创新科技2015 发表于 2021-1-17 09:47:12

赞一个!

oym2016 发表于 2021-1-17 19:35:18

本帖最后由 oym2016 于 2021-1-19 08:29 编辑

按楼主思路,做了个 手动还原restore.cmd
::父盘=Win81x64.vhdx差分盘=BaseOS.vhdx
::批处理重复复制 差分盘为二个不同名的子盘 供实际使用文件.
::grub2(ufei)识别不同的标志,启动所对应的磁盘镜像
::子盘1=SubOS_1.vhdx标志=SubOS.1
::子盘2=SubOS_2.vhdx标志=SubOS.2
@ECHO off
PUSHD %~dp0
:Start
FOR /F "tokens=*" %%G in ('dir /s /b SubOS.*') DO (goto :revhd)
::第一次无标志时 创建SubOS_1.vhdx 标志=SubOS.1;SubOS_2.vhdx
COPY %~dp0BaseOS.vhdx %~dp0SubOS_1.vhdx >nul
ECHO SubOS_2vhdx >%~dp0SubOS_2.vhdx
ECHO SubOS1 >%~dp0SubOS.1
GOTO :end
:revhd
::获取BaseOS.vhdxSubOS_1.vhdx SubOS_2.vhdx 文件大小
for /f %%i in ('dir /s /b %~dp0BaseOS.vhdx') do (set size_b=%%~zi)
for /f %%i in ('dir /s /b %~dp0SubOS_1.vhdx') do (set size_1=%%~zi)
for /f %%i in ('dir /s /b %~dp0SubOS_2.vhdx') do (set size_2=%%~zi)

IF EXIST %~dp0SubOS.1 (
::如果SubOS_1.vhdx已还原过, 程序退出.
   if %size_1% equ %size_b% echo SubOS_1.vhdx Restored OK & TIMEOUT /t 5&exit
   DEL /S %~dp0SubOS_2.vhdx >nul
   COPY %~dp0BaseOS.vhdx %~dp0SubOS_2.vhdx >nul
   ECHO SubOS2 >%~dp0SubOS.2
   DEL %~dp0SubOS.1 >nul
) ELSE (
::如果SubOS_2.vhdx已还原过, 程序退出.
   if %size_2% equ %size_b% echo SubOS_2.vhdx Restored OK & TIMEOUT /t 5&exit
   DEL /S %~dp0SubOS_1.vhdx >nul
   COPY %~dp0BaseOS.vhdx %~dp0SubOS_1.vhdx >nul
   ECHO SubOS1 >%~dp0SubOS.1
   DEL %~dp0SubOS.2 >nul
)
:end
echo SubOS Restored !!!
TIMEOUT /t 5
exit

::grub2菜单
menuentry "Windows 8.1 Vhdx"   --class windows{
   if search -n -s -f /vhdos/SubOS.1;then
      ntboot --efi=/vhdos/bootmgfw.efi --vhd /vhdos/SubOS_1.vhdx
   elif
      search -n -s -f /vhdos/SubOS.2;then
       ntboot --efi=/vhdos/bootmgfw.efi --vhd /vhdos/SubOS_2.vhdx
   fi;
}

2010speedloong 发表于 2021-1-18 11:16:00

lk5258 发表于 2021-1-15 16:31
请问老大 vhd能不能支持 休眠功能?

不敢当 ..
休眠我没测试过 可以试一下看看
因为是镜像 个人觉得应该是能够支持的
不过我每次都是powercfg -h off {:1_201:}

2010speedloong 发表于 2021-1-18 11:17:20

oym2016 发表于 2021-1-17 19:35
按楼主思路,做了个 手动还原restore.cmd

::父盘=Win81x64.vhdx差分盘=Win81bak.vhdx差分盘由 BOOTIC ...

666 我觉得用这种方式引导无论是自动或手动 都挺方便的
后续的维护也方便 嗯..据说DD的方式不太好 也不支持UEFI

2010speedloong 发表于 2021-1-18 11:17:55

langyun 发表于 2021-1-17 08:31
hilsonma 是一个很热心的好人

是的 很感谢他的热心相助 最终得以实现

2010speedloong 发表于 2021-1-18 11:18:45

langyun 发表于 2021-1-17 08:31
hilsonma 是一个很热心的好人

是的 很感谢他的热心相助 最终得以实现

ls68057121 发表于 2021-1-19 22:42:36

可惜我不懂批处理,我原来的思路是vhd文件夹里面两个子vhd1vhd2,bak文件夹里面也是这两个子vhd,引导bcd菜单有两个选项vhd1,vhd2,0秒,开机批处理静默执行,复制bak文件夹里面两个子vhd覆盖替换vhd文件夹里面两个子vhd,不能删除或者替换就跳过,bcd当前菜单条目下移,这样每次重启,都会进入另外一个子vhd,然后覆盖替换,就会非当前使用中的子vhd删除掉,从而实现还原

ls68057121 发表于 2021-1-19 22:44:56

要实现我这样的思路,批处理要怎么样写呢,bcd应该有下移菜单的指令吧

2010speedloong 发表于 2021-1-20 09:40:07

ls68057121 发表于 2021-1-19 22:44
要实现我这样的思路,批处理要怎么样写呢,bcd应该有下移菜单的指令吧

有用到的工具都放在网盘里了 批处理也有 可以去下载来看一下

lz0389 发表于 2021-1-26 20:36:09

可以可以

lz0389 发表于 2021-1-26 20:36:40

可以可以
页: [1] 2 3
查看完整版本: UEFI启动模式下实现VHD秒还原