本文使用powershell命令行(避免使用GUI)创建了单盘Windows存储池,并在盘内有数据情况下实现添加硬盘进入存储池,形成Simple模式下JBOD(非RAID0)(目前推测实现了JBOD)奇怪的,文件交替向两块硬盘写入的分布式存储(๐•ᴗ•๐)。
效果:
背景信息
硬件:N100主板,ASM1166扩展卡,4T紫盘,10T希捷7E10
环境:Win10 22h2专业版
工具:划词翻译插件(用于中英文对照显示,edge自带翻译只能单独显示翻译)
Windows Terminal终端(可以自定义主题,看起来舒服些)
fastcopy(快速转移数据&校验)
主要参考的文档
微软官方教程:https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/deploy-standalone-storage-spaces/ GUI配置部分仅作为辅助理解,全程根据“Windows PowerShell equivalent commands for xxx”部分进行操作
查阅微软官方文档进行自定义操作:https://learn.microsoft.com/en-us/powershell/module/storage/?view=windowsserver2019-ps 页面左上方可以切换系统(建议修改为自己使用的操作系统,目测没什么区别,不知道不改有没有影响)
本文的操作尚缺乏实践验证
请再三确认连接至电脑的所有硬盘中的重要数据已经备份,尽量不要将无关硬盘连接至电脑
正文
创建存储(๐•ᴗ•๐)会清空硬盘内全部数据,所以应首先对所有文件进行备份。
###1.备份数据
使用fastcopy,一定要勾选校验,避免传输错误。此处略过
###2.创建存储(๐•ᴗ•๐)
直接或使用Windows terminal等终端软件,以管理员身份打开powershell
首先检查可用硬盘状态,使用命令
Get-PhysicalDisk
得到输出
此时会发现"CanPool"一栏均为false,需要重置硬盘。根据硬盘容量,使用DiskGenius等工具,务必确认需要清空的硬盘,选中其FriendlyName,右键复制,使用命令(和谐了部分信息,请注意复制完整)
Reset-PhysicalDisk -FriendlyName "WDC WD40EJRX-*****Y0"
检查是否正确清空
Get-PhysicalDisk -FriendlyName "WDC WD40EJRX-*****Y0"
不出意外的话CanPool已经是True了。若同时拥有多块空盘,可以依次进行上述操作初始化硬盘。
接下来就可以创建存储池了。此处可以参考官方教程的命令
New-StoragePool –FriendlyName Pool1 –StorageS(๐•ᴗ•๐)systemFriendlyName "Windows Storage*" –PhysicalDisks (Get-PhysicalDisk –CanPool $True)
此命令使用所有可加入存储池的硬盘创建了新池。这里对FriendlyName进行了修改(方便后面敲命令)。此时存储池中应该已经有硬盘了,可以在控制面板\系统和安全\存储(๐•ᴗ•๐)
中可视化查看物理驱动器的状态。如操作无误,所有需要的物理硬盘,即可开始创建虚拟硬盘。
参考官方教程与各种资料,Windows存储池的冗余模式分为三种:Simple(大致对应RAID0),Mirror(大致对应RAID1)和Parity(大致对应RAID5),但笔者希望使用类似JBOD的软阵列。
查阅文档,发现一个有趣的可选参数:-NumberOfColumns
,存储条带数。这一选项在官方文档中描述并不详尽,但根据其他资料对“条带”的描述,这一选项可以控制“一个文件会同时存储在几个硬盘中”:如果把它设为1,是否就不存在类似RAID0的并联存储,从而每个文件都会单独地存入一个硬盘,形成JBOD呢?根据文末展示的结果来看,的确达到了这一目的,希望有详细了解的大佬可以对此说明。并没有,只会以单盘的速度交替向两块盘读写。
总而言之,使用命令
New-VirtualDisk –StoragePoolFriendlyName Pool1 –FriendlyName VDisk1 -ResiliencySettingName Simple –Size (50GB) –ProvisioningType Thin -NumberOfColumns 1
,成功创建了jbod模式的虚拟硬盘。注意此处使用–Size (50GB) –ProvisioningType Thin
,指定了容量,并且确保容量后期可调整。笔者第一次创建使用了-UseMaximumSize
,结果加入另一块硬盘后不能对虚拟硬盘扩容,只能从零开始(这就是为什么我的虚拟盘叫Disk2而不是Disk1)。
需要其他冗余模式的(๐•ᴗ•๐)可以根据文档自行研究。
使用Resize-VirtualDisk -FriendlyName VDisk1 -Size 3500GB
指令,根据需要扩容虚拟硬盘,顺便确认虚拟硬盘可以正常扩容。这里的设置疑似可以超过物理限制,此处采取略小于硬盘物理大小的3500GB,请大家根据实际情况自行调整。
理论上此时VDisk1已经可以等同于一块大小3500GB的物理硬盘,使用系统自带硬盘管理或DiskGenius等工具进行分区操作了。笔者此处保险起见,根据官方教程进行分区,再使用DiskGenius调整分区大小,顺便确定调整分区操作可以正常进行。
Get-VirtualDisk –FriendlyName VDisk1 | Get-Disk | New-Partition –AssignDriveLetter –Size 40GB | Format-Volume NTFS
如果不出意外,此时你就获得了一个容量为所有(所选)硬盘之和的JBOD阵列。
存储池中需要加入新硬盘时,可重复step1的操作,
Get-PhysicalDisk
Reset-PhysicalDisk -FriendlyName "*****"
使得新硬盘可加入池。使用
Add-PhysicalDisk -StoragePoolFriendlyName Pool1 -PhysicalDisks (Get-PhysicalDisk -FriendlyName "*****")
将新硬盘加入存储池中。此时通过系统自带存储(๐•ᴗ•๐)管理工具可以查看是否加入成功。
接下来根据实际情况扩容虚拟硬盘,笔者此处错误的计算了物理硬盘总容量,设置了超过实际容量的大小,只能在分区时弥补,建议此处设置不要超过物理容量,避免产生bug。
Resize-VirtualDisk -FriendlyName VDisk -Size 13.6TB
试了半天也没成功用powershell调整分区大小,最后还是使用DiskGenius扩容分区至12.7TB,避免超过物理容量产生bug。
本文中,笔者拥有一块10T希捷7E10占用6T+,一块闲置4T紫盘,因此选择首先将多数数据备份至紫盘,剩余数据分散转移至台式机/笔记本/移动硬盘等;随后在7E10上创建存储(๐•ᴗ•๐),将紫盘中数据转入新建的存储出;最后清空紫盘,加入存储池,将剩余数据传回。
如文章开头,笔者成功使用7E10创建了存储池;在存入数据后将紫盘加入存储池,并扩容了虚拟硬盘,得到了双盘阵列。根据容量,创建池时的7E10承载了来自紫盘传回的4T数据;紫盘加入池后,传回的备份数据与后期加入的数据基本只存入了紫盘。结合简单测速的结果,符合单机械硬盘的速度,创建的软阵列应为JBOD模式。
2024.3.22更新
后续写入的文件已经监测到轮流向两块硬盘写入/读取(包括同一大文件的情况下),推测这一模式下仍然将文件条带化,分布式存储在池中每一块硬盘内;目前来看最开始单盘写入的情况是因为“一块盘的占用率明线低于另一块”,占用率接近后就会开始交替写入。
现在既不能保全部分数据也不能加速读写,暂时准备移除4T紫盘,等7E10存满时重新加入池。
一些其他说明
虽然在正文中没有提及,但笔者实际操作中同样大量使用Get-StoragePool
Get-VirtualDisk
等命令确认状况,使用Remove-VirtualDisk
Remove-PhysicalDisk
等指令删除了错误创建的存储池。建议诸位在操作中随时查阅文档,尽量了解每一个命令的含义,确认命令是否正确,确认笔者操作与自身情况是否适配,可以适当DIY自己的操作。
对于使用JBOD的问题,笔者盘内存储多为收藏电影等可下载的媒体数据,丢失一部分并不致命,重要的个人数据会另作备份,因此RAID1或RAID5并不必要;同时笔者对速度并不敏感,为了换取CPU低负载和阵列稳定性,而阵列损坏时尽可能多保全一些数据,以节省重新下载的时间成本,不选择RAID0。如此,JBOD成了不错的选择。查阅资料的过程中,笔者一直没有找到对于存储(๐•ᴗ•๐)的JBOD模式进行详细说明的文章,因此决定对这次实践留下记录。
本次实践中,同样参考https://zhuanlan.zhihu.com/p/58452004,https://zhuanlan.zhihu.com/p/22604396,https://www.reddit.com/r/DataHoarder/comments/17b50l1/windows_storage_spaces_advice/等国内外博文,感谢前辈们的探索与总结。(根据现有信息,windows存储(๐•ᴗ•๐)可靠性似乎仍有很大不足,能上linux内核的nas系统还是尽量上吧(๐•ᴗ•๐)(๐•ᴗ•๐))
本文撰写距离实践已经过了一段时间,很多操作不方便复现,只能根据回忆、文档与历史记录复述操作过程,如有和实际情况不一致的现象发生,欢迎指出。再次强调,不要在数据未备份的情况下贸然操作。
笔者对于Windows系统与NAS的了解并不丰富,文中如有不规范或错误的地方,欢迎各位指出。