Windows, 操作系统

细数在Windows 10配置Software RAID1时所遇到的坑

Windows在日常应用外的场景,给我的印象一直都不太好,特别是排错方面,异常麻烦,遇到莫名奇妙的错误,要么没有日志,要么事件查看器中只有个错误代码,或者输出一个内容不仅又臭又长还根本看不出什么问题.log文件。像Windows更新突然无法安装,Visual Studio或者某个程序一直安装失败或者别的Windows组件的各种疑难问题,除了重装Windows还有什么解决办法?所以除了日常应用,其余的一直都在避免依赖Windows。

最近给机子加了个4TB的机械硬盘,其实一开始是打算买两个4T组RAID1的,不过考虑到没那么多重要数据需要R1,而且目前也有一个1TB的,所以就只买了一个4T的,打算从4T中单独拿1T出来和旧的1T组R1。

两个硬盘容量不一样,首先就排除硬RAID了,其实我一开始也没考虑硬R,虽然我的主板带RAID功能,但得考虑更换主板的情况。如果购买阵列卡,就又得考虑阵列卡损坏,可能你会说哪有那么快损,没那么快损就是个大问题,到时坏了买不回一样的咋办?所以剩下的选择自然只有软RAID了。

第一个坑:BitLocker

在Windows上的软R1就是mirrored volume,需要把硬盘转为“动态磁盘”,第一个坑就来了,动态磁盘不支持BitLocker!

Dynamic disks are not supported by BitLocker. Dynamic data volumes will not be displayed in the Control Panel. Although the operating system volume will always be displayed in the Control Panel, regardless of whether it is a Dynamic disk, if it is a dynamic disk it cannot be protected by BitLocker.

至于为何不支持,我目前也没找到解释,自然我也不会理解为什么不能支持动态磁盘,这不是针对分区的加密吗?为什么还会依赖磁盘格式?

当然对于此问题也不是没有解决办法,那就在动态磁盘的卷里面创建VHD,然后在对VHD启用BitLocker。不过既然用VHD,我何不在两个硬盘上各创建一个1TB的VHD,然后基于这两个VHD创建mirrored volume呢?这样我就不用转移现有近1T的数据进VHD了。

第二个坑:VHD与动态磁盘

创建好VHD,附加到系统,右键,我才发现VHD是不能转换为动态磁盘的:

这里我又再次无法理解微软的操作了,既然你是虚拟硬盘,为什么不能提供与真实硬盘一样的功能?你限制这限制那是什么鬼操作?Linux有给loop device的功能加各种限制吗?

提到这个限制,我就想起Windows以前是不支持U盘多分区的,当然Windows 10后来某个更新后开始支持了。也是个无法让人理解的操作。

那好,既然你识别为VHD后不给转换为动态磁盘,那我把VHD作为虚拟机的虚拟磁盘,虚拟机识别为普通磁盘,自然可以转换为动态磁盘了吧?

于是使用Virtual Box添加VHD作为虚拟磁盘:

成功转换为动态磁盘:

不过附加到物理机上后,我才发现微软早有所准备:

动态的VHD直接显示为Invalid……

后来找了下,发现Windows有个Storage pool的功能,也可以用来创建mirrored volume,试了下,的确支持VHD:

Two-way mirror即RAID1:

创建过程一切顺利,正当我开开心心地开始用时,问题又来了……

第三个坑:diskpart

如果你去网上找系统启动后自动attach VHD的方法,你会找到利用diskpart的教程,类似我下面的操作:

也有使用PowerShell的Mount-VHD的,不过我没装Hyper-V(装了后就不能用VMWare了),所以不能使用Mount-VHD。

然后问题又来了,我发现在diskpart里面,attach vdisk居然会莫名卡在100%的位置:

在事件查看器里面你也可以找到对应的错误:

告诉你出错,丢你一个错误代码,嗯,我也知道出错了,那错误详情是什么?你这个错误代码代表什么,网上也没资料,你倒是告诉我啊?

如果在attach第一个vhd时卡住了,需要过好久才会出现successfully的提示,这里卡住也不是还没attach到系统,而是已经attach了,但是不知道遇到什么情况停了,因为在这里停了,自然暂时也不会attach第二个vhd。所以在Windows的storage pool会以单盘模式启用,次数多了,会提示你reset第二个硬盘。

既然你喜欢停在100%,但是又不影响attach,那我让你两个同时attach不就好了?所以又有了改进版:

暂时完美,两个同时停在100%也不影响使用。接下来的问题就是开机运行了。

第四个坑:计划任务与快速启动

这里的“At startup”就是个坑,你会发现,快速启动的情况下,这个任务不会运行……

当然也可以改成用户登录时调用等别的触发条件,然后第六个坑就来了。

第五个坑:快速启动

快速启动导致了第五个坑,第五个坑还有别的方法解决,不过这里的坑是真的不知如何是好。

未attach VHD前,通过前面写的批处理成功attach VHD后,如果下次系统是快速启动的,attach VHD就会提示你已经attach,关键是,提示已经attach了,Storage pool里面也不会看到这两个VHD创建的pool:

既然你说已经attach了,那detach再attach总可以吧:

微软:“不好意思,也不行。”

后来我试了下不通过diskpart,使用磁盘管理下的Attach VHD菜单,不会遇到diskpart在100%卡住,也不会有快速启动时,VHD提示已attach的问题:

这里我又不太明白了,磁盘管理和diskpart难道attach VHD使用的是不同的实现?这又是什么操作……

难道我得放弃开机自动attach VHD,转而每次手动到磁盘管理attach?

后记

没想到在Windows上组个软RAID也能这么艰难。莫名奇妙的功能限制;不同的工具,同一功能不同的实现;PowerShell中的Mount-VHD也无法理解为何硬要依赖Hyper-V,为什么不见你diskpart或磁盘管理要求Hyper-V?系统提供VHD的支持,却又不提供开机自动attach的实现。还有快速启动导致的功能异常……

如果是在Linux上,这是个很简单的事情,根本不会有不允许基于虚拟硬盘建立RAID、物理卷不允许启用加密之类的限制,更不会限制U盘不允许多分区这种奇葩的操作。对于虚拟磁盘,按挂载物理盘的方式加个记录就可以系统启动时自动挂载。

我现在倒要考虑是不是要另外组台机子运行Linux专门作储存了。