无限延时写入引起系统盘文件损坏问题的一个改善方法

交流 PrimoCache软件使用过程中遇到的问题以及心得等
这里提供官方的技术支持
回复
martinMT
1级用户
1级用户
帖子: 3
注册时间: 周四 5月 06, 2021 9:08 am

无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 martinMT »

目前发现,如果使用vhdx 虚拟磁盘的方式安装并引导操作系统,与primocache的无限延时写入功能配合,可以在一定程度上减少掉电、错误复位等现象后被缓存的系统盘文件损坏的问题。系统状态数据直接“回滚”到上次关机时的状态。

primocache 的延时写入是个人非常喜欢的一个功能。对系统盘启用该功能,设定足够大的RAM作为缓存,可以有效地减少SSD的磨损。然而,该功能很惧怕停电、误复位操作等现象,一旦出现,再次开机后,就会出现系统盘文件损坏,影响使用的严重问题。比如,在我这里,由于开机按键与复位按键距离非常近,导致经常出现打算唤醒睡眠状态的机器时误触复位按键的现象,进而导致系统重启后,浏览器相关文件损坏 、报错,之前打开的网页全部丢失,以及其它文件丢失的问题,大概有十多次了。之前的解决方法只能是用镜像还原系统。

后来,偶然一个机会,发现并尝试使用了vhdx 虚拟磁盘的方式安装并引导操作系统(WIN10)。然后发现,在这种模式下,停电、复位几乎不再引起系统盘文件损坏了(当然本次开机写入C盘的数据依旧会丢失),而是直接“回滚”到上次关机时的状态。也就是说除了本次开机写入C盘的数据丢失之外,系统和系统盘上的软件不再崩溃了。

例外只有两次,一次是对C盘写入的数据超过了缓存容量(我这里用4GB作为写入缓存,无限模式),这倒是不难理解,因为一旦写入量超过了缓存大小,关机之前就必然有数据写入系统盘了。然后复位之后系统文件系统发现文件对不上,很自然地会出错。另一次是更改了驱动(不清楚那次写入量是否超过了4GB)。

具体原理尚不清楚。但粗略感觉,似乎是因为,这种模式可以使得primocache的相关功能能够更加优先地启动。从而将在默认状态下primocache不能涉及到的系统盘区域也缓存起来。

关于虚拟磁盘安装引导系统的方法,感兴趣的朋友可以参考这篇文章:https://www.zhihu.com/question/59409036 ... 2973548092
我就是在这里学到的相关方法,不过没有使用到文中提到的差分盘功能。

采用这种方法,自己已经差不多不再担忧掉电和系统复位损坏系统了。欢迎有兴趣的朋友讨论。

25.05.23 一个小更新。
大家在使用这种方法的时候,记得关闭 windows 的快速启动。之前安装别的软件,打开了快速启动,然后这种方法就失效了。关闭后就又可用了。顺便一提,我现在用的这台台式机,应该是主板或者是电源有些问题,有将近10%的概率在睡眠唤醒的时候复位,因此经常能被动进行这个试验 :lol:
上次由 martinMT 在 周五 5月 23, 2025 12:19 pm,总共编辑 1 次。
头像
Support
技术支持组
技术支持组
帖子: 2743
注册时间: 周日 12月 21, 2008 10:42 am
联系:

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 Support »

感谢分享!
Primo Ramdisk | PrimoCache
Romex Software 技术支持组
martinMT
1级用户
1级用户
帖子: 3
注册时间: 周四 5月 06, 2021 9:08 am

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 martinMT »

以下是一个使用虚拟磁盘引导并安装系统的简要说明。

1.准备虚拟磁盘镜像文件。
使用WIN10系统自带的工具即可完成。
a.右键“此电脑”——管理——存储——磁盘管理——选中一个分区——在上侧的“操作”按钮中会出现“创建VHD”的条目并点击。
b.推荐使用VHDx+动态扩展,其它根据需要选择即可。
c.完成后,先关闭“计算机管理”窗口,然后再次进入磁盘管理。然后窗口会提示新建立的虚拟磁片没有初始化。根据提示进行初始化。再对该虚拟磁片进行分区、格式后等操作即可。之所以需要先退后进,是因为在上一步无法进行初始化,估计是一种Bug。

2.将系统镜像灌入前述的虚拟磁盘镜像文件中。
a.准备一个系统镜像(比如WIN10),以及Dism++软件。
b.加载前述的虚拟磁盘镜像文件,完成后系统中会多出一个分区。
c.打开Dism++,选择 文件——释放镜像。在新出现的窗口中,映像目录直接选择WIN10镜像文件即可,安装路径选择虚拟磁盘挂载的盘符,选中添加引导*和格式化两个项目,目标映像选择希望安装的系统版本,然后点击确定,等到出现完成的提示即可。然后弹出虚拟磁盘,并将虚拟磁盘镜像文件保存到需要的位置。
* 注意,这个“添加引导”选项很可能是不必要的,而且可能会影响本机的BCD文件。建议完成此步骤后,检查一下本机的启动文件(比如在msconfig-引导中查看),并将多出来的启动项目删除。或者测试一下干脆不开启这个选项。

3.修改BCD文件实现从虚拟磁盘的启动。
a.准备一个安装有PE(比如微PE)的启动盘。
b.使用PE引导进入系统。
c.挂载ESP分区(比如PE中的引导修复工具就有这个功能)。默认状态下此分区是隐藏的,不便于后面的操作,需要使该分区显示出来。
d.打开bootice工具(这也是PE中自带的工具)。进入“BCD编辑”页——其它BCD文件——手动选择BCD文件所在的位置(在前面挂载的ESP分区里)。具体位置比如在ESP分区内的 EFI\microsoft\Boot目录下(注意,ESP分区根目录下的Boot目录内的BCD文件不是目标文件!)——点击“智能编辑模式”,在新出现的页面的左侧,添加一个新的启动项条目。
e.输入必要的参数。比如以此图为例子:(图片来自https://www.zhihu.com/question/594090361/answer/2973548092
01.jpg
对图片中选项的一些简要说明:
设备类型:选择VHD(x)。
启动磁盘:选择虚拟磁盘文件所在的磁盘。
启动分区:选择虚拟磁盘文件所在的分区即可。
设备文件:这里需要手动输入虚拟磁盘文件的路径(不包括盘符和冒号,如上图)
设备文件旁边的“分区”按钮:选择自动搜索即可。
菜单标题:本系统准备使用的名称,输入喜欢的名称即可。建议有点区分度,以免多系统的时候混淆。
其它选项推荐保持默认。完成参数输入后,点击下面的“保存当前系统设置”,关闭软件,退出PE,重新启动系统。

* 注意,实践发现,WIN11的启动信息与WIN10的启动信息在BCD文件存在冲突。因此建议需要使用这两个系统的时候,准备两份单独的BCD文件。

4.安装系统。重启后,这个虚拟磁盘镜像文件会被当作一个正常的分区进行引导启动,并进入安装系统的环节。进入这一步后,就和常规的系统安装没有区别了。

5.安装并使用PrimoCache,开启无限写缓。按照官方说明即可。这个大家应该都会了吧。
您没有权限查看这个主题的附件。
上次由 martinMT 在 周日 9月 22, 2024 7:34 am,总共编辑 4 次。
martinMT
1级用户
1级用户
帖子: 3
注册时间: 周四 5月 06, 2021 9:08 am

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 martinMT »

顺带一提,前两天又停了次电,系统盘又没有出现文件损坏。成功次数+1。
头像
Support
技术支持组
技术支持组
帖子: 2743
注册时间: 周日 12月 21, 2008 10:42 am
联系:

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 Support »

:thumbup:
Primo Ramdisk | PrimoCache
Romex Software 技术支持组
[email protected]
4级用户
4级用户
帖子: 23
注册时间: 周六 1月 08, 2022 7:48 pm

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 [email protected] »

bcdboot 可直接引导 比你这波操作简单,
或者我天天测硬件,这命令我用的太熟了而已,

vhdx这个本来就是按固定大小一次性写入,不覆盖之前数据空间,不用cache也有cache延迟写入功能,windows 2024就有,win10 没用过


Bcdboot - Bcd 启动文件创建和修复工具。

bcdboot.exe 命令行工具用于将关键启动文件复制到
系统分区并创建新的系统 BCD 存储。

bcdboot <source> [/l <locale>] [/s <volume-letter> [/f <firmware>]] [/v]
[/vbcd] [/m [{OS Loader ID}]] [/addlast] [/p] [/c]

source 指定 Windows 系统根路径的位置。

/l 指定要在初始化 BCD 存储时使用的
可选区域设置参数。默认值为美国英语。

/s 指定一个可选的卷号参数,以指定
复制启动环境文件的
目标系统分区。默认值为固件所标识的
系统分区。

/v 启用详细模式。

/vbcd 启用 BCD 日志记录。

/m 如果提供了操作系统加载程序 GUID,则此选项会将
给定的加载程序对象与系统模板合并,以生成一个
可启动条目。否则,仅合并全局对象。

/d 指定应保留现有默认 Windows
启动项。

/f 与 /s 命令一起使用,指定目标系统分区的
固件类型。<firmware> 的选项为 "UEFI"、
"BIOS" 或 "ALL"。

/addlast 指定应最后添加 Windows 引导管理器
固件条目。默认行为是首先
添加它。

/bcdclean 清理 BCD 存储。默认情况下仅移除 BCD 中的任何重复
条目。后面可以带有 "full"。在这种情况下,
会扫描每个条目。如果该条目的相应设备
不存在,则会删除该条目。

/p 指定应保存 Windows 引导管理器固件条目
位置。如果条目不存在,
将在第一个位置添加新条目。

/c 指定不应迁移模板描述的任何
现有对象。

/bootex 如果满足必要条件,请使用 bootex 二进制文件进行维护。

/offline 强制以脱机方式处理启动文件服务。根据
显示“bootex”开关强制选择启动文件。

示例: bcdboot c:\windows /l en-us
bcdboot c:\windows /s h:
bcdboot c:\windows /s h: /f UEFI
bcdboot c:\windows /m {d58d10c6-df53-11dc-878f-00064f4f4e08}
bcdboot c:\windows /d /addlast
bcdboot c:\windows /p
martinMT
1级用户
1级用户
帖子: 3
注册时间: 周四 5月 06, 2021 9:08 am

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 martinMT »

楼上这位网友,你可能理解错了这个帖子的含义。
它不是用来表达“我懂得vhdx技术,所以我多么厉害”这样的含义,
而是用来表达“将primocache软件与vhdx技术结合起来使用,可能有个很棒的效果,很有实际意义。感兴趣的朋友可以试一试”这个意思。
houenyu
1级用户
1级用户
帖子: 2
注册时间: 周四 5月 29, 2025 12:28 pm

Re: 无限延时写入引起系统盘文件损坏问题的一个改善方法

帖子 houenyu »

其实最好是针对每个盘都可以设置不同的延时写少秒数就好了,这样会非常的灵活,希望能加上这个功能。最好是所有的参数都可以按分区来设置,那就非常好用了。

对于上面我说的这个需求,其实我现在已经找到了方法了,很简单就是为每个分区创建一个任务,这样就可以对每个任务进行不同的设置了,一开始就是没有想到。
回复