WIM 、VHD、FFU格式比较
比较WIM、VHD、VHDX和FFU:所有用于将 Windows 部署到新设备这些文件格式。 下面是它们之间的比较:
Windows 映像 (WIM) | 虚拟硬盘 (VHD/VHDX) | 完整 Flash 更新 (FFU) | |
常见用途 | 用于测试和修改 Windows 映像最快。 可以在同一个存储多个映像变体。WIM 文件,通常相对较少所需的额外存储空间。 | 有关将 Windows 部署到虚拟 Pc 最简单。 可以直接从单个 VHD/VHDX 文件启动一个新的设备。 | 用于捕获和部署 Windows 某工厂车间最快。 |
图像处理样式 | 基于文件的 | 基于扇区 | 基于扇区 |
压缩 | 支持多种类型的压缩 | 无 | FFU 捕获使用 DISM 时,默认情况下使用 Xpress Huffman |
它捕获内容? | 一组文件,最多的整个分区。 | 捕获完整的驱动器的信息,包括分区集。 | 捕获完整的驱动器的信息,包括分区集。 |
应用映像后,会发生什么情况? | 将文件和文件夹添加到分区。 如果已存在具有相同的名称,文件和文件夹在'替换为 re。 否则,不保留现有文件。 | 清除整个驱动器。 | 清除整个驱动器。 |
可以部署到不同大小的硬盘? | 是。 | 是的但新的驱动器必须是相同的大小等于或大于原始。 | 是的但新的驱动器必须是相同的大小等于或大于原始。 |
可以修改映像? | 是。 使用 DISM 等工具,可以装载、 修改和卸载映像。 | 是的可以装载 VHD/VHDX,就好像可移动媒体和修改的文件。 | 是。 使用 DISM 等工具,可以装载、 修改和卸载映像。 |
可靠性 | 包括用于验证签名提前之前在设备上闪烁的目录和哈希表。 哈希表是在捕获过程中生成和应用映像时进行验证。 |
从 Windows 10 版本1709开始,DISM 能够捕获、部署和服务 FFUs,但有以下限制:
- 应用 FFU 的驱动器必须与从中捕获它的驱动器相同或更大
- 不支持加密磁盘的 FFU 捕获
- 不支持捕获启用了卷影复制服务(VSS)的磁盘
- 不支持拆分压缩的 FFUs
捕获和应用 Windows 完全更新(FFU)映像 文档目前的更新时间为2019/01/07
FFU的优势也很明显部署所需的时间短相对Wim格式来说,当然将压缩的等级修改之后也会随之增加部署时间,另外不用配置window启动BCD选项之类的,省去了很多操作。并且无论是在工厂模式抓取还是用户模式抓取,亦或者在OOBE阶段抓取OS,都不影响OS的完整性。
FFU更多的是用来进行备份,因为上述的限制导致它的应用不会有wim格式的镜像应用那么广泛。
附件中提供了我制作的FFU抓取脚本与部署脚本,以下备注下可以修改的项。
部署脚本
REM ***********iNet FFU Apply*********************
TITLE iNet FFU Apply 18362.190621.0.0
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
call |time>x:\starttime.txt
set Disk_type=SD
@rem ************************************************************************
@rem Disk_type=SD & EMMC; Disk_type=SATA & SSD; Disk_type=NVMe & PCIE SSD
@rem ************************************************************************
这里Disk_type目前支持三种,SD是EMMC存储硬盘,SATA是表示SATA接口的硬盘,NVMe表示PCIE SSD,这里同类型的磁盘只支持一个,存在多个会出现异常。此选项为必填项,它将决定抓取哪个类型的磁盘,当抓取的磁盘类型不存在时将会报错。
脚本中保留了Wim相关的SFu相关的部署信息,这部分根据上述的限制,是不支持拆分压缩的FFUs,虽然dism命令可以看到有关SFU部署相关的范例,但是实际验证确实无法执行SFU的部署,也许后续会更新这部分。暂时保留
部署完成后
for /f "tokens=5" %%A in (x:\starttime.txt) do echo Script Start Time is %%A
for /f "tokens=5" %%A in (x:\stoptime.txt) do echo Script Stop Time is %%A
@echo.
wpeutil shutdown
::exit
建议使用关机命令,将wpeutil shutdown屏蔽(用::或者rem)将exit前面的::删除掉,就会退出脚本,这里会直接进行重启动作,可能会存在一直重复不断刷机的现象,具体取决于BIOS中关于第一启动项的设置。这里也与在部署后找寻磁盘有关系。
抓取脚本
REM *********** Capture the FFU image from iNet *****************************
TITLE iNet capture FFU 18362.190620.0.0
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
call |time>x:\starttime.txt
set ErrorInfo=Unknown
set Disk_type=SD
set CaptureFFUFileName=install.ffu
set Capturename=iNet_Capture_FFU
set CaptureDescription=iNet_Capture_OS
@rem ************************************************************************
@rem Disk_type=SD & EMMC; Disk_type=SATA & SSD; Disk_type=NVMe & PCIE SSD
这一部分可以做设置的变量Disk_type与部署脚本中一样,CaptureFFUFileName参数为选填项;更改与否都不会影响抓取结果(不修改则为默认值),此名称可以后续更改。Capturename参数为选填项;更改与否都不会影响抓取结果(不修改则为默认值),此参数显示在镜像内部,不可后续更改。CaptureDescription参数为选填项;更改与否都不会影响抓取结果(不修改则为默认值),此参数显示在镜像内部,此名称不可后续更改。以上两个参数均可通过Powershell命令读取(不可读取SFU文件格式的镜像)
Powershell Get-WindowsImage -ImagePath "%InstallPath%\%FFU_IMAGE%" -index 1
抓取时会识别抓取的U盘中是否有images文件夹,并且请确认U盘为NTFS格式的U盘,同步会生成一个CaptureDiskSize.txt文件。这里会记录抓取的磁盘size(GB),这里实际上应该获取Byte是最好的,但是目前没有找到方法,如果有好的建议欢迎留言。
在抓取FFU前,制作镜像请按照通常做镜像的方式制作,当镜像制作并验证完成后,可以部署一个母盘,然后将母盘用FFU的方式抓取出来。
在抓取FFU之前,应确保OS已经抓取了PPKG,并且应用了SingleInstance参数,另外winre恢复分区也是部署成功的。
因为FFU部署不需要使用BCD进行重写入启动项,所以不需要额外的配置更新winPE,即使是RS1及之前的不适用于FFU的镜像版本也可以使用,只需要当前WinPE环境支持FFU即可。
FFU部署的缺点,目前此脚本,只适用于同样大小的磁盘,如果抓取的磁盘与部署的磁盘理论上来讲是同等大小的,但是实际容量有差异,依然会部署失败。这里可以查看部署的dism.log确认是否为此原因导致。
2020年10月8日17:25:15
对于磁盘的校验功能已经完善。
做法是现在Capture脚本中对磁盘的容量进行一次读取,并写到FFU 镜像information中,我写入的是Description参数,然后在Apply FFU中读取镜像对应的Description参数与当前磁盘的大小进行比对。这里需要注意获取的值是11位整数,直接进行比较会超过CMD的比较范围,要进行一次切割。
此功能的是需要Capture脚本与Apply脚本进行配套使用,意义在与如果磁盘大小无法进行部署,可以避免磁盘格式化,提前做规避,并且可以弹出对应的错误提示不需要查看log文件就可以进行直观的判断。
另外对于SFU的部署,原因查明是因为镜像抓取时相应的压缩格式导致,此处抓取时不压缩的FFU文件是可以被切割成SFU并且可以Apply的。另外部署的命令也有细微区别,不压缩的FFU文件巨大,所以使用场景不适用,个人弃用。
用到的相关文档
WIM vs. VHD vs. FFU: comparing image file formats
Capture and apply Windows Full Flash Update (FFU) images
脚本下载链接: