前言

最近我的一个兄弟在搞NAS,他和我聊了聊下面的一段话:

于是乎我突发奇想:既然家里的NAS支持千兆传输,那又何尝不能当“虚拟内存”来使用呢(?)

制作“虚拟内存”需要本地盘的加持,而SMB协议却无法挂载为本地盘。也许ISCSI协议可以实现我的需求,但遗憾的是,ISCSI协议需要使用一整块分区来作为硬盘,我使用了4块硬盘组了RAID,主板上的硬盘接口已经被占满,,我不可能会为了挂载NAS为本地盘而格式化我NAS上的所有数据,所以只能从SMB协议这边下手了。

因为SMB协议的种种限制,要想获得“基于SMB协议的虚拟内存”还是需要一点技巧的。

下面开灶。

正文

创建本地磁盘

上网查资料,只看到了一篇比较有用的干货,不过这也够了。

首先,SMB协议在Windows中只能挂载为网络盘,而我们需要挂载为本地盘的话,就需要一个VHD镜像文件

右键“此电脑”,点开“管理”。

选择“磁盘管理”。

然后选择“操作”,创建VHD。

创建VHD页面如下图所示:

“位置”可直接填写本地盘或映射过的有盘符的网络盘路径,但不能直接填写无映射的网络盘。

“大小”直接设置即可(请不要设置超过网络盘的可用空间)。

“格式”最好选择”VHDX”,因为可自动从“电源故障事件中恢复”。

关于“类型”,“动态扩展”具有最高的灵活性,如果你想从这个设置中获得尽可能多的性能,可以设置成固定大小。不过这种性能提升几乎完全可以忽略不计。

完成的配置图如下:

点击“确定”后,右键点击没有初始化的磁盘,点击“初始化磁盘”。

点击“确定”。

右键点击未分配的空间,选择“新建简单卷”,一直点击下一页,完成创建分区。

这时候在“此电脑”中就会出现新的本地盘了。

开关机保活脚本配置

既然成功挂载了VHD,那为什么要设置在开/关机时自动挂载/卸载呢?

其实这里存在一个很大的问题。自Win10 1809版本后,Windows无法在关机之前自动卸载虚拟磁盘,也不能在开机时自动加载虚拟硬盘。

这就造成了如果在关机时没有正常卸载VHD文件,即使在开机时使用脚本自动加载也不能加载成功。

错误的原因其实来自于SMB服务:

事实证明,如果您在没有先卸载基于网络的虚拟磁盘的情况下重新启动服务器,则后续的挂载尝试将失败。我只能猜测其原因,但我怀疑 SMB 服务器上留下了陈旧的锁,导致 Windows 认为虚拟磁盘仍在使用中:Failed to add device ‘\192.168.0.5\VHDX\memory.vhdx’. Attachment failed to open because of error: ‘The process cannot access the file because it is being used by another process.’不仅无法卸载,还不能删除。要从此情况中恢复,需要重新启动网络存储服务器上的 SMB/Samba 服务。

因为必须使用本地盘来设置虚拟内存,我们不得不在开机时挂载VHD到本地盘上,所以必须同时正确配置开关机脚本才能实现开机自动挂载VHD,进而实现”使用NAS作为虚拟内存”这一目的。

设置开关机脚本

我们先要创建开关机脚本。

打开“C:\Users{用户名}”用户根目录,在根目录下新建”vhdx.bat”和“vhdx_detach.bat”两个文件。

右键编辑”vhdx.bat”。修改路径后,复制下面的脚本进去,保存。

@echo off
echo select vdisk file=”\smbserver\VHDs\games.vhdx”>vhdsel
echo attach vdisk>>vhdsel
diskpart /s vhdsel
del /f /q vhdsel
exit

右键编辑”vhdx_detach.bat”。修改路径后,复制下面的脚本进去,保存。

@echo off
echo select vdisk file=”\smbserver\VHDs\games.vhdx”>vhdsel
echo detach vdisk>>vhdsel
diskpart /s vhdsel
del /f /q vhdsel
exit

如果有多个VHD需要挂载,复制多行执行即可。

设置开机运行脚本

开机脚本需要在任务计划程序中设置。

首先搜索并打开“任务计划程序”

点击创建基本任务。

名称随便写。

设置为计算机启动时。

这里默认。

脚本地址就写刚刚”vhdx.bat”文件地址就行。

最好将“vhdx.bat”文件放在用户根目录下面,避免出现权限问题。

勾选下面的框打开属性。

按图进行配置(使用管理员账户即可)。

在“条件”页面中,取消勾选下面两个框。

在“设置”页面中,这个选项可开可不开,根据看开机时能否自动挂载来决定。

点击“确定”,输入管理员账户的密码,点击“确定”保存设置。

这时候可以点击右边的“运行”测试挂载是否正常。

设置关机运行脚本

Win+R打开运行,输入gpedit.msc,打开“组策略”。

选择 “用户配置” -> “Windows 设置” -> “脚本(登录/注销)” ,双击右栏的“注销”打开。

点击“添加”。

选择刚刚在用户根目录下编辑的”vhdx_detach.bat”脚本,脚本参数不用填,点击确定。

注意:这里必须放在用户根目录下才能正常运行,如果放在其他目录可能会因为权限问题而无法正常卸载!!

点击“确定”保存设置。

性能测试

通过测试,它可以完美的跑到千兆的网速并且不会掉速(具体性能取决于您的设备)。

这张图前面带宽跑得很高是个Bug,之后的传输速度可以稳定在我家内网最大传输速度千兆。

如果您的内网网络环境良好,你完全可以把它当成一块正常的本地盘来使用。

注意事项

这种方法仅适用于 Windows 系统挂载磁盘到本地,Linux 用户请参考其他方案。(在Linux貌似也没啥必要使用SMB了,本身SMB就是用于Windows和Linux之间的文件传输的,在Linux和Linux或许还有更好的方案)

PicID:wfiYDfJXf5BiQ3Mj