Windows 做NAS真有那么好?这是很多人的疑问,为什么有那么多现成的NAS系统,还得劳动Windows的大驾呢?
这件事情就得从我们使用NAS的一个核心需求来说了。NAS作为网络中存储文件的一个服务,首先要达到的一个目标就是对存储的管理。
存储的概念在传统的意义上来说就是我们要把数据存储到存储器中,现在用的最多的存储器就是硬盘了。
不过,由于技术的发展,在大家传统认知之下,把文件存储到磁盘这件事已经被不知不觉的复杂化了。
现在的文件存储并不是直接按照文件分配表将文件存储到磁盘的扇区中,其中还有很多不为普通用户所知道的秘密。
同时,各种新的文件管理系统(FS)也广泛出现,已经并不是我们常说的FAT、NTFS的年代了。
这一切的始作俑者都是虚拟化技术带来的存储变革。
先了解下背景信息,然后iN再说说在Windows上要怎么做。
在DOS时代,我们依靠文件分配表(FAT)来存储文件,这时候我们只有两个和存储相关的概念:磁盘、分区。
通常我们给一个物理磁盘进行分区,然后给分区分配一个盘符,我们就可以通过C:D:E:……这些盘符来访问到我们的磁盘了。当然了iN一直推荐都2000年代了,硬盘没必要分区,就一个C盘足矣。
例如新装的这个Windows Server 2025如果打开资源管理器一看,还的确就只有一个C盘。
但事情是这么简单么?进入命令行,利用diskpart看一下这张盘:
你会发现除了C盘(主要)之外还有另外的2个分区并没有显示出来,它们没有被系统赋予盘符处在不可访问的状态上。
再深究一下,我们还可以通过windows的磁盘管理看到iN的这台机器的硬盘还有没有划分分区的情况:
这仅仅是从软件层面来看,其实现在在用的机器还有一个阵列卡,可以把一些硬盘在阵列卡中合并虚拟成不同的驱动器。
软件公司这样做的概念就是让你看到的那个驱动器盘符并不一定是代表了某块硬盘
这样做是有好处的!
将多个硬盘合并虚拟成一个或多个驱动器盘符的做法有几个好处:
- 通过将多个物理硬盘虚拟成一个驱动器(盘符),我们可以更灵活地管理存储容量。用户可以轻松地向计算机中插入新的硬盘以扩展存储空间,而无需重新配置或调整现有的系统。
- 使用硬件阵列或软件 RAID 等技术,可以将多个物理硬盘合并为一个驱动器,并提供容错能力。如果一个硬盘故障,系统仍然可以继续工作,并且用户可以在不影响数据完整性的情况下更换故障硬盘。
- 通过在多个硬盘之间分配数据存储,可以提高读写操作的性能。某些 RAID 配置和存储优化技术可以实现数据的分段和并行处理,从而加快数据访问速度。
- 将多个硬盘虚更抽象为一个盘符,我们就可以忽略掉硬盘的管理,只去关注一个盘符的容量是多少,这样用户对数据存储的体验就和实际上的硬件相互隔离了。
而这一切实际上是依靠“池化(POOL)”来完成的。
Windows Server和普通的NAS系统不同的是拥有一个存储池(Storage Pool)
“池化”的概念源于虚拟化,将相同的资源进行汇总统一调用。我们在研究存储池的时候,我们会发现存储池的存储架构中将存储进行了分层化,如果细致的划分层次就是从物理磁盘-Raid层-存储池-存储空间-虚拟磁盘-卷-文件空间这样的一个存储层次结构。
所以,从本质的意义上来说Windows 存储池并不是一个软RAID,这就和群晖这样的RAID是有那么一点点区别的。
当然了,如果真心的想做RAID,在存储池中有和软RAID相等价的处理方式。但Raid这件事吧,iN的建议还是通过Raid卡来实现是更加靠谱的路线。
基础的概念讲完了,我们来实际操一下:
实际上从GPT(GUID Partition Table,Guid分区表)分区建立之后,Windows 系统就将存储池的概念贴合到默认设置中,即便在windows系统中未建立一个真正意义上的存储池,硬盘也是依靠存储池的概念进行划分的。所以在windows服务器管理器中如果查看卷的时候会显示\\\\?\\volume{……}这样的标识,将我们的硬盘分区标识出来。
实际上“C:”这个分区本身也有自己的GUID,只不过为了兼容前期的系统软件被转写成了“C:”。
既然是从底层虚拟化了,我们是可以通过磁盘管理我们可以直接创建一个虚拟硬盘挂载到Windows系统中。例如:
1.在计算机管理/磁盘管理中选择创建VHD:
2.设定VHD(虚拟磁盘)参数:
这时候,在磁盘管理器中就可以出现一个未初始化的磁盘:
这个磁盘在Windows中使用和物理硬盘没有任何区别。我们可以在这个虚拟磁盘上继续建立卷。
这时候,一个新建立的盘符就在Windows中出现了。
但是这并不是Windows 系统真正推荐的一个使用方法。还记得前面iN说都2000年代了还要分区吗?
Windows真正推荐的方法是根据功能将磁盘挂载到合适的目录中去。例如我们在C:盘下建立一个ISO目录用来存储安装虚拟机所需要的ISO文件。我们可以看到C盘的容量还有10个G的空间,是不是看似很小?这就可以利用到目录挂载的功能将一个磁盘的存储空间直接挂载到一个空白目录中。
这时候你再到C盘中去看,你发现出现了一个叫做ISO的磁盘标记,这个硬盘驱动器在Windows中已经被当作一个目录来使用。
我们可以通过这个特性使用超级灵活的方式对一个单一驱动器的存储结构进行规划,例如,当这个ISO(容量1GB)存满了怎么办?
替换一个新的目录驱动器即可——再建立一个更大的isonew文件夹
将iso内的文件拷贝到新的isonew中
然后把老的ISO文件夹改个名,再将新的ISONEW改成iso,这样一来系统从应用层面是无法感知到ISO这个目录是被换了磁盘的。
而老的ISO目录直接删除掉就可以了,于是:
和替换前是没有任何差别的——至少你看和程序看都是一模一样的。
删除掉的ISO驱动器在哪里了呢?——回收站!
如果我们再去磁盘管理器中去查看原始的ISO的磁盘分区的话,它的影卷副本中是有一个回收站的记录的:
这个记录实际上也暴露出了磁盘分区的GUID标识。当清空回收站后:
这条标识就被永久删除掉了:
和“c:\\iso\\”一样归纳为“已禁用”状态。我们可以从磁盘管理器中删除掉这个虚拟磁盘。
看到这里,是不是觉得一个为了一个目录大小这么破费周章太麻烦了吧?——iN也是这样觉得的。原因并不在于方法,而是在于Windows server真正的存储池咱们还没有用到呢!
现在,我们引入存储池来把刚刚的操作做一次。
为什么叫“池”而不叫“库”或者“仓库”,也不叫“阵列”什么奇怪的名字。其原因就在于人们总是可以将任何东西扔到池子里面去。这是“池”和其他容器不一样的地方。
现在我们向存储池内丢一块硬盘进去:
首先新建立一个存储池:
这里有一个忠告,建立IT基础设施的时候,应该有一个基础的命名规范,在名字中尽量详尽的包括基本信息,例如范例里面使用的名字就包括了类型、时间和地点。
选择一块硬盘丢到池子里:
这时候点下一步后创建,我们就建立了一个存储池。
在存储池的摘要窗口中我们可以看到存储池中有一个磁盘和1.8T的容量。
但是在虚拟磁盘的位置我们还看不到任何驱动器。
点这里开启创建虚拟驱动器向导
这时候,我们就可以在选择存储池的窗口中看到我们刚刚建立的存储池。虽然存储池内只有一块硬盘,但是这块硬盘的确是和我们有一个存储池的隔离层了。
给这块虚拟磁盘定义一个名字,还是参考之前的命名规则。
这里弹出一个机箱感知的窗口,如果有多个磁盘盘柜,这个选项会启动,最大限度的来保证数据安全。
在这块虚拟磁盘中我们可以建立镜像和校验,不过这些选项在只有一块磁盘的存储池中是做不到的,所以,我们就只能选择Simple。
Simple在做的就是简单的存储,并不做额外的数据校验以及其他的纠错。
存储池内的虚拟硬盘可以自行增加容量或选择固定容量,iN建议是给虚拟磁盘一个固定的大小,自行增长的磁盘开始设置会方便一些,但是在后期管理起来并不简单。
设置虚拟硬盘的大小为20GB
从摘要上我们可以得到这次设置的基本信息,直接创建就可以创建出虚拟磁盘。
在虚拟磁盘建立完毕后,会弹出卷设置向导,这时候我们就可以设置驱动器了
通过卷向导选择刚刚建立的虚拟磁盘
现在看到有一个很好的名字标签的重要性了吧?
指定卷的大小
设置驱动器号或文件夹,我们还是和之前一样指向到c:\\iso。
设置这个卷的标识。
生成卷。
这里是处理摘要。
到C盘去看,我们就会发现iso又出现在了C盘的根目录。
而在存储池中也标记了一个新的虚拟硬盘:
这个虚拟盘用起来就和目录一样了,存储一些文件什么的和普通磁盘没有区别。
往iso目录中拷贝一些文件,这时候iso的驱动器就立刻要被填满……
我们如果要扩大iso的文件夹还需要像之前一样再建立一个虚拟盘来倒腾吗?答案是否定的。
需要扩大容量的时候,我们回到存储池:
在虚拟磁盘上选择扩展虚拟磁盘。
给定一个新的容量。这时候虚拟磁盘的容量就被扩大。但是现在如果去看c:\\iso的容量,你会发现还是20GB,这是因为我们扩大的是虚拟硬盘的大小,而c:\\iso是虚拟硬盘上的一个“卷”。所以回到服务器管理器的卷的管理中:
这时候卷的大小还是20GB,而卷所属的虚拟硬盘大小则变成了40GB。我们再扩展一下卷。
选择扩展卷,我们把卷扩展到30GB。(这里玩个花样,让你知道存储池和虚拟硬盘有多强悍)
在将c:\\iso扩展到30GB后,顺手又建立了一个5GB的卷。这时候你看磁盘的分区分布:
这个虚拟硬盘前部是一个30GB的分区,中间是一个5GB的分区,后面还有5GB的分区没有利用到。
这时候我们再扩展c:\\iso呢?会不会被ajoker这个分区阻挡呢?
答案是肯定的:
扩展出来的这部分分区被ajoke所阻挡,导致扩展失败。道理就是这样,磁盘分区无论是虚拟盘还是物理盘都是以偏移量为基准的,在一个分区后面如果建立了一个新的分区,那么这个分区就不能继续扩展了。
所以目前我们看到的c:\\iso是30GB
但是如果非得扩展呢???倒也不是不可能……
我们只需要把这个虚拟磁盘转换成动态磁盘,这样一来,GPT的结构就会发生变化使用动态的分区表进行空间划分。
不过,关于基本盘和动态盘之间的区别讲起来有点多,咱们就找时间继续讲。
好了,让我们把视线继续拉回存储池,存储池顾名思义就是一台服务器上所有存储器的一个资源池。在Windows Server中存储池可以说是“生冷不忌”。我们可以不断的向一个存储池内增加存储资源,也就是加硬盘。
加入的硬盘的容量在Windows Server的调度下统一管理。例如我们可以继续向存储池内增加各种容量和规格的硬盘:
SAS接口SATA接口都可以增加,容量不一致也可以增加。最终在存储池内会形成一个统一的存储空间,如果在存储池内增加了多块硬盘,那么在设立新的虚拟磁盘的时候我们也可以有多种不同的选择。
当然了大家看:
最早安装系统的时候,一块240G的硬盘划分出来40GB用作系统盘,这不,还剩下183.46G的剩余空间没有划分,那么……这半块硬盘能不能放入存储池呢?
答案是——可以!
看到了硬盘直接加入即可,半块硬盘也不会被浪费掉。
这时候我们看到的存储池内就比较乱了,不仅仅有SATA的机械硬盘,还有SAS的机械硬盘,甚至还有SATA的固态硬盘。
其实现在给大家演示的Windows机器上面还有一个“磁盘5”
这是iN家里的SAN盘柜里面的一块硬盘。利用ISCSI和这台Windows服务器进行连接。
SAN的部分我们也会找时间来展开细讲一下。
在这台机器上外挂一个ISCSI硬盘的作用是用作重要数据热备份。
和建立其他虚拟磁盘一样,先在存储池中建立一个DB20240404的虚拟硬盘:
关闭随后弹出的新建卷向导,回到计算机的磁盘管理,这时候我们看到虚拟盘已经挂载:
选择“新建镜像卷”
把iscsi上的磁盘选入:
这时候我们就可以建立一个60GB的带有本地校验机制并且和远端磁盘同步镜像的卷
这样一来,当我们向本地的MASTERDATA目录内写入内容的时候,远端的SAN上也可以接收到相同的数据镜像。
对于重要数据来说,如果本地计算机发生严重故障,实际上,我们还是可以借助这份存储在远端SAN上的数据进行恢复。
没刹住车,今天讲的案例有点多。实际上如果真的要玩存储,目前Windows Server的存储池是可以吊打一众的NAS的,毕竟成熟的商用系统和家用系统比较本身就是有那么一点欺负人的意思。
但随着Windows Server将要在今年夏天有那么一点许可证上的销售变化,大家提前了解一下,或许会发现Windows Server其实也会挺香的。
当然了,今天讲的不少,但是对于存储池的灵活运用还仅仅是讲了一个皮毛,有更多的“黑科技”可以以后陆续做专题的。
大家要注意的一点是——在虚拟化的大环境内,“池”是很重要的概念,无论是处理器、内存、存储、GPU现在都可以池化。玩转虚拟化,并不是什么网卡直通或者显卡直通、而是要玩转“池”。