公司的zOcean配合上万M网络往往可以比固态硬盘快,但目前zOcean暂时只支持SMB协议。

由于Photoshop只能使用物理硬盘分区而不能使用SMB传统的映射分区,导致无法很好的利用zOcean作为缓存盘。而传统的ceph速度太慢,严重拖慢Photoshop的打开文件速度。
由于zOcean还好支持SMB 4.0,因此支持挂载smb文件夹内的iso甚至vhd文件。(SMB3.0以上才行)

连接SMB

先按照正常的方式访问smb服务器,检查访问速度是否正常。
测试SMB速度

创建并挂载vhdx

win10目前还不能用磁盘管理在SMB映射分区内创建、挂载vhdx文件,必须使用命令来进行创建与挂载。
首先以管理员身份运行cmd,powershell不能正常的运行命令因此最好不用它。
然后按如下方式进行创建并挂载:

C:\Windows\system32>diskpart.exe

Microsoft DiskPart 版本 10.0.17134.1

Copyright (C) Microsoft Corporation.
在计算机上: PS

DISKPART> create vdisk file=\\192.168.72.1\whshare\vhds\pstest.vhdx maximum =200000 type=expandable

  100 百分比已完成

DiskPart 已成功创建虚拟磁盘文件。

DISKPART> attach vdisk

  100 百分比已完成

DiskPart 已成功连接虚拟磁盘文件。

DISKPART> create partition primary

DiskPart 成功地创建了指定分区。

DISKPART> format quick label=OnsiteBackup fs=ntfs

  100 百分比已完成

DiskPart 成功格式化该卷。

DISKPART> assign letter=G

DiskPart 成功地分配了驱动器号或装载点。

DISKPART> exit

退出 DiskPart...

上面的命令相对简单:

  • 在网络共享上创建一个 200GB 的虚拟磁盘。
  • 对其进行格式化,并分配一个驱动器号。

默认情况下,“diskpart”将创建一个 VHDX 磁盘,这是一种更新的虚拟磁盘格式,具有更高的弹性和更好的可扩展性能。如果你想从这个设置中获得尽可能多的性能,可以将“type=expandable”改成“type=fixed”,从动态大小改成固定大小。尽管这种性能提升可以忽略不计。

PS设置

根据如图所示,对PS进行设置,由于我有200G内存,因此内存可以使用70%,选择文档较大的模式。修改缓存盘为挂载的G盘。
我这里是Adobe Photoshop CS6 (64 Bit)
PS设置

卸载 VHD

卸载虚拟磁盘是最大的问题。Windows无法在重新启动之前自动卸载虚拟磁盘。使用关机脚本和基于事件的计划任务,都不太适合,因此使用了脚本。

但是为什么我们需要担心卸载呢?好吧,事实证明,如果您在没有先卸载基于网络的虚拟磁盘的情况下重新启动服务器,则后续的挂载尝试将失败。我只能猜测其原因,但我怀疑 SMB 服务器上留下了陈旧的锁,导致 Windows 认为虚拟磁盘仍在使用中:

Failed to add device '\\smbserver\vhds\wsbackup.vhdx'. Attachment failed to open because of error: 'The process cannot access the file because it is being used by another process.'

不仅无法卸载,还不能删除。
要从此情况中恢复,需要重新启动网络存储服务器上的 SMB/Samba 服务。

对此的预防性解决方案非常简单:始终在重新启动服务器之前卸载网络虚拟磁盘。有几种不同的方法可以实现这一点。
个人使用的话,可以创建一个名为“myhalt.bat”的自定义重启/关闭脚本。

@ECHO off
cls
:start
ECHO.
ECHO What would you like to do?
ECHO 1. Reboot
ECHO 2. Shutdown
ECHO 3. Exit this script
set choice=
set /p choice=Enter your choice: 
ECHO Your choice: 
if not '%choice%'=='' set choice=%choice:~0,1%
if '%choice%'=='1' goto reboot
if '%choice%'=='2' goto shutdown
if '%choice%'=='3' goto end
ECHO "%choice%" is not valid, try again
ECHO.
goto start

:reboot
C:\scripts\detach.bat
shutdown.exe /r /t 00
goto end

:shutdown
C:\scripts\detach.bat
shutdown.exe /s /t 00
goto end

:end
exit

脚本内“detach.bat”内容如下所示。

%WINDIR%\system32\diskpart.exe /s C:\scripts\detach.txt

可以从终端执行“myhalt.bat”或在桌面上放置一个快捷方式。尽管如此,这是一个有问题的解决方案:如果服务器遇到电源故障或有人忘记使用此自定义脚本,我必须在下一个计划的备份作业之前进行干预。这就是为什么拥有一个有效的监控解决方案来检查备份虚拟磁盘是否存在很重要的原因。

自动挂载 VHD

使用虚拟磁盘作为备份目标的第二大问题是挂载它。没有内置的方法可以在重新启动后自动挂载虚拟磁盘,因此我们需要我们自己的解决方案。值得庆幸的是,我们可以使用熟悉的工具来完成工作;选择两种安装解决方案之一:

使用计划任务在引导时挂载虚拟磁盘。考虑添加 1 分钟延迟以确保网络可用。
在网络连接后立即挂载虚拟磁盘。如果使用此选项,您现在应该了解我之前代码内*警告的相关性。此外,请务必将执行用户从“SYSTEM”更改为管理员帐户,否则脚本将无法正常执行。
无论您使用哪个选项,您都需要创建一个脚本来装载您的虚拟磁盘。首先,我们创建一个包含“diskpart”命令的文本文件。将此文件命名为“attach.txt”并将其保存到“C:scripts”。

select vdisk file="\\smbserver\vhds\wsbackup.vhdx"
attach vdisk
exit

请注意,这里没有分配驱动器号。这是因为 Windows 会记住之前分配给该磁盘的驱动器号。接下来,我们创建一个 BATCH 脚本来执行这些命令。将其命名为“attach.bat”并将其保存到与“attach.txt”相同的目录中。

%WINDIR%\system32\diskpart.exe /s C:\scripts\attach.txt
timeout /t 10 /nobreak > NUL

总结

这个方法只是用比较特殊的方法对本人的需求进行解决,但实际上不能作为产品为客户提供。实际上还是得使用iscsi版zOcean而不是用这种奇葩的操作。


参考:
Leveraging SMB and VHDs for Windows Server Backups

最后修改:2021 年 08 月 30 日
如果觉得我的文章对你有用,请随意赞赏