解决因超大内存导致的Windows系统安装故障
一台 Dell 工作站,硬件配置有 128GB 内存和 512GB 固态硬盘,IT 人员为 512GB 固态硬盘平均划分了两个分区,在安装 Windows 操作系统时发生故障,具体表现为在 Specialize 阶段初始化系统时发生错误,如下图所示:
检查了相关日志文件,发现记录有 “CopyProfileDirectory from C:\Users\Administrator failed (0x80070070)” 错误事件,经分析 0x8007007 为磁盘容量已满导致的故障。
在当前案例场景下检查,512GB 仅划分了两个分区,且只格式化了用于安装系统的分区,而当前硬件设备配置了超大容量的内存(128GB),导致在 Specialize 阶段生成 Hiberfil.sys 文件后,没有可用空间再生成 Pagefile.sys,因为设备存储没有其他有效格式分区,系统无法利用其他分区存储 Pagefile.sys,最终导致 0x80070070 故障。
这个看似简单的问题实际上在解决过程中非常复杂,尤其是在企业 IT 环境中。如果单纯为了解决本次故障,可以将第二个分区格式化,这样在 Specialize 阶段初始化时,如果系统分区容量不够,则会自动在第二分区上创建 Pagefile.sys。但如果企业采用了定制的标准化系统映像,那么问题就会非常复杂。
起初 gOxiA 计划在 Specialize 阶段的 RunSynchronous 中添加一条命令“powercfg /h off”来实现关闭休眠文件(Hiberfil.sys),但测试发现此条命令并不会生效。翻阅了微软官方的文档提示应该在 RunAsyncronous 中执行该命令,于是又进行了尝试,结果发现并未生效,也检查了相关的日志文件,确实在 Specialize 阶段成功执行了命令,但也确实并未生效。而微软官方文档推荐在 AuditMode 阶段执行,也就是说 oobe 也是支持的,但是这些阶段执行“powercfg /h off”并不能解决本案例实质性问题。
为了解决这个问题只能从注册表下手,可以修改注册表,将系统 Power 下的 HibernateEnabled 键值设置为 0 ,即可禁用休眠功能。测试在 Specialize 阶段执行如下命令行。
测试结果是 Specialize 阶段修改了注册表也不会即刻生效,所以最终的结果是直接修改映像(WIM)的注册表键值。通常采取的做法是 Mount WIM,然后在注册表中加载映像中的注册表文件,位于“C:\Windows\System32\config”。
问题虽然是解决了,但是也引发了其他的问题,企业环境中的笔记本该怎么办呢?!这里给出几个方案供选择:
1. 按照不同机型,分配不同的映像。
2. 按照不同机型,应用不同的应答文件。
3. 不同机型使用同一个映像和应答,附加专为企业定制的配置工具,在配置过程中识别机型,并执行相关配置和维护脚本。