前言
最近我的一个兄弟在搞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