写在前面:

最近和几个小伙伴就这个问题进行了讨论,得出的结论是,该方法适用于intel七代酷睿以前,以及amd的锐龙之前的系统。也就是说,intel从七代酷睿开始,cpu控制器原生支持nvme,不再需要额外安装驱动,amd从锐龙一代开始也是原生支持nvme驱动的,而我用的是z170芯片组,属于六代酷睿,nvme需要操作系统安装驱动才能正常使用,所以会出现蓝屏问题,如果你属于七代酷睿之后或者锐龙平台的机器,可以略过本文。

  最近618买了一个intel 760p ssd,打算把丢在公司那台电脑的垃圾西数绿盘给升级一下,由于不想重装系统,所以想当然的觉得只要把原来绿盘的数据和ESP分区的内容直接拷贝到新盘就好了。然后用bootice修复引导设置以后,尝试从新ssd启动系统,结果启动的时候在风火轮转圈圈的地方卡了很久一直下不去,最后直接自动重启了,第二次重启直接蓝屏,提示由于关键系统驱动程序丢失或损坏之类的错误,错误码是一个0xc0000之类的错误码,每次启动还不一样,真的是太奇怪了。

  后来经过分析,猜测这个蓝屏问题有点类似于n年前win7时代把bios里面硬盘模式从IDE和AHCI之间切换引起的蓝屏问题,记得那时候还在本科的时候碰到这种问题估计就直接重装了。不过其实就现在的认识来说的话,其实并不需要重装,造成蓝屏的主要原因是storahci内核驱动没有在系统启动的时候加载引起的,只要修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\StartOverride里面有个名字是0的DWORD值,内容默认是3(DEMAND_START),改成0(BOOT_START)就可以,然后再去BIOS里把IDE切换成AHCI启动就不会蓝屏了。所以效仿这一点,我猜想应该是内核里的nvme驱动没有启动时就加载引起的。说到这里,那么先来验证一下。

  首先找一台使用nvme硬盘的电脑启动,看一下stornvme驱动的情况:

  默认使用nvme启动系统的机器,storenvme驱动是启动即加载的,而我这台本来是SATA的机器呢,看了一下,是DEMAND_START,意思是需要时启动。

  也就是说,使用nvme硬盘的机器,一定要在系统启动时就加载stornvme驱动才行,否则会因为驱动没加载而造成系统没法正常读写磁盘数据而蓝屏。至此,解决方案就很简单了,只要把这个项改成BOOT_START就可以了。但是实际修改过程中发现,修改了没效果,看来还是有点问题,最后查看了注册表才看出了端倪,我这台修改了没有效果的机器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme项下面还有一个StartOverride,而正常使用nvme硬盘的机器,没有这个键。查阅了一些资料才发现,控制这个驱动启动类型的,是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme根目录下有一个叫Start的DWORD值,这个值等于0表示 BOOT_START,即系统启动就加载,3代表按需加载( DEMAND_START ),默认已经是0(BOOT_START)。但是因为设置了StartOverride这个键值,原设置就会被这个键值下的设置覆盖。而这个值会由系统每次启动根据驱动的使用情况自行进行优化,也就是说,win10其实每次启动,根据驱动是否被使用的情况,会自动优化驱动的选项,把不需要启动就加载的驱动设置了StartOverride值,让其延迟启动,这其实是一种自学习和优化的功能,可以优化开机速度。不过这里就给我们造成了一些麻烦了。那怎么解决这个问题呢?当然最容易想到的办法就是,先删除 stornvme键值下面的StartOverride目录,然后重新启动进PE系统去备份整个系统盘,然后再从nvme硬盘启动,当然这样就对操作顺序有一定要求了,就是修改过该键值以后,就不能再次进入原硬盘系统,否则又会被系统改回去。还有一种办法就是,我先不改,先迁移磁盘,然后我在PE里面修改迁移后硬盘上的注册表。下面就详细总结一下迁移的完整方法吧:

SATA AHCI模式硬盘下的win10迁移到nvme ssd步骤:

第一步:完整拷贝原硬盘ESP分区和C盘到新的nvme硬盘(由于要使用NVME硬盘必须是UEFI模式和GPT分区,所以在拷贝之前务必要把BIOS设置成UEFI模式以及将原硬盘转化为GPT分区表),这一步比较简单,可以直接用ghost或者DiskGenious的克隆分区功能,或者分区助手专业版都可以,只要能完整拷贝分区的软件都行,新的ssd可以不分区直接使用分区助手的复制磁盘功能,也可以自己分区,只需要把ESP分区和C盘完整拷贝的新的nvme硬盘上即可。(这一步有问题的,可以去网上搜索教程,有很多,我这里就不废话了)

第二步:修改ESP分区里的BCD文件,这一步的作用是,因为BCD文件记录了引导项所在磁盘,通常是用GUID唯一标识的分区。如果不修改,还会指向原来旧硬盘的分区,所以卸掉旧硬盘之后,肯定是启动不了的。这一步可以用PE里面的BOOTICE软件完成:

  注意,这里的BCD要选新硬盘的ESP分区下面的BCD文件,不要选错了,选中之后点“智能编辑模式”,然后参照我下面的图片把启动磁盘和启动分区设置对即可。

第三步检查一下UEFI启动序列设置那里是否正确,一般完成前面两步先重启一下,系统会自动识别新硬盘ESP分区上的引导器,这时候进PE里用BOOTICE软件的UEFI启动序列功能里就能看到多了一个Windows Boot Manager,我们这里为了保险起见,最好像我一样再检查一遍是否正确。

第四步:修改注册表,删除stornvme键下面的 StartOverride目录。这一步需要一点点技巧,因为我们现在刚迁移了旧系统,没法直接启动新系统去改,所以需要用一下regedit的一个“加载配置单元”功能,详细做法如下:

首先在PE里面打开运行,输入regedit,这一步会打开PE里系统的注册表编辑器,当然我们这里并不是要改PE里的注册表,而是我们只是使用regedit的编辑功能,我们想要编辑的是nvme硬盘上系统盘的注册表。首先,注册表的位置一般是在X:\windows\system32\config目录下(X是你nvme里刚迁移过来的系统盘在PE里挂载的盘符),我们单击一下HKEY_LOCAL_MACHINE分支将其选中,然后点【文件】->【加载配置单元】,然后找到 windows\system32\config\SYSTEM文件,加载后会让你输入一个加载项的名称,这里随便写就行,比如TEST,然后注册表编辑器就会把SYSTEM这个分支加载到HKEY_LOCAL_MACHINE\TEST下面,这时候我们展开这个目录,能看到这个分支和PE里的 HKEY_LOCAL_MACHINE\SYSTEM的结构类似,这个就是nvme硬盘上的注册表内容了。当然,这里有一点区别,那就是由于我们并没有启动nvme硬盘上的系统,所以CurrentControlSet这个目录是没有的,其实这个目录原本只是一个链接而已,指向的是当前加载的配置ControlSetxxx目录,由于这里只有一个ControlSet001,所以我们直接展开ControlSet001\Services\stornvme即可,然后删除 StartOverride目录,最后选中TEST分支,再使用【文件】->【卸载配置单元】,卸载分支即可。

第五步:重启,选择nvme硬盘上的Windows Boot Manager引导项(或者直接卸除原硬盘启动),这样你就会发现,可以正常进系统不会蓝屏了。

原文地址: Jarvis Blog

最后修改:2023 年 04 月 24 日
如果觉得我的文章对你有用,请随意赞赏