Update 2019/05/26: 由于服务器已换装 Windows 10 做系统,本文将不再更新,缺失的屏幕截图也不会补上。
服务器上的硬盘越来越多,数据也存放得越来越乱。不仅出现了数据跨盘,在硬盘出现问题的时候也容易丢数据。自从发现了 Windows Server 的 Storage Spaces 功能之后,便琢磨将硬盘做成阵列,由系统控制,然后在上面搭建虚拟磁盘,或许是一个很好的解决办法。
无奈 Windows Server 2012 的 Storage Spaces 功能太有限,于是就更新到了 Windows Hyper-V Server 2016。至于原因嘛,
- 最小化系统,轻便。
- 原生支持文件共享(SMB/CIFS),其他机器可以直接访问数据。
- 可以用 Hyper-V 搭载 Linux/Android 等等虚拟机。
- (最重要的)免费!
安装
首先去微软的 Evaluation Center 下载 Windows Hyper-V Server 2016。(其实现在已经有 2019 版,但是因为 Windows 1809 更新出现问题暂时下架了)
这里要注意,虽然语言选择里面有中文,但是还是推荐安装英文版。因为 Hyper-V Server 没有图形界面只有 PowerShell,很多设置都要通过命令行更改,安装中文版的话,例如防火墙规则什么的都是中文版,跟网上找到的各种教程有出入,设置起来比较麻烦。
安装很快,重启进入系统之后,先设置密码,然后果然只有一个命令行和一个服务器设置工具(也是命令行)。
这里首先要确认远程管理和远程桌面都打开,远程桌面可以选择比较低的加密等级(反正局域网环境)。
开启远程管理工具访问权限
远程管理工具包括 服务器管理器(RSAT)、远程防火墙、远程计算机管理和远程磁盘管理。
服务器管理器(RSAT)
首先在服务器端开启 RSAT。在命令行窗口执行命令 PowerShell
。然后执行以下命令。
Enable-PSRemoting
Enable-WSManCredSSP -Role server
然后再客户端开启远程 RSAT。
Enable-PSRemoting
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<ServerName>"
Enable-WSManCredSSP -Role client -DelegateComputer "<ServerName>"
Enable-WindowsOptionalFeature -Online -FeatureName:Microsoft-Hyper-V -All
cmdkey /add:<ServerName> /user:Administrator /pass
如果服务器和客户端不在域里面而是使用工作组的话,需要在客户端打开 DCOM 匿名访问。首先打开 DCOM 设置。
dcomcnfg.exe
然后找到“组件服务” > “计算机” > “我的电脑”,右键单击“我的电脑”,选择“属性”。
在打开的对话框里选择“COM 安全”选项卡,在“访问权限”下面点击“编辑限制...”按钮。
将“ANONYMOUS LOGON”下面的“远程访问”设置成“允许”。
开启更多的远程管理
在服务器的 PowerShell 窗口里执行。(参考来源)
netsh advfirewall set currentprofile settings remotemanagement enable
netsh advfirewall firewall set rule group=”Remote Administration” new enable=yes
netsh advfirewall firewall set rule group=”File and Printer Sharing” new enable=yes
netsh advfirewall firewall set rule group=”Remote Service Management” new enable=yes
netsh advfirewall firewall set rule group=”Performance Logs and Alerts” new enable=yes
Netsh advfirewall firewall set rule group=”Remote Event Log Management” new enable=yes
Netsh advfirewall firewall set rule group=”Remote Scheduled Tasks Management” new enable=yes
netsh advfirewall firewall set rule group=”Remote Volume Management” new enable=yes
netsh advfirewall firewall set rule group=”Remote Desktop” new enable=yes
netsh advfirewall firewall set rule group=”Windows Firewall Remote Management” new enable =yes
netsh advfirewall firewall set rule group=”Windows Management Instrumentation (WMI)” new enable =yes
net start vds
安装驱动
一般来讲,装完系统之后还需要装一大堆驱动程序,比如主板、声卡、显卡、PCI-SATA 数据卡等等。
这里推荐在其他的电脑上下载驱动,解包,然后通过 U 盘把驱动程序复制到 Hyper-V Server 上。
如果需要在 Hyper-V Server 上下载驱动,需要用以下 PowerShell 指令。
Invoke-WebRequest <URL> -OutFile <FileName>
如果出现无法建立 SSL/TLS 连接,需要先设置安全协议。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
解包需要用到以下 PowerShell 指令。(更多压缩包方面的指令请参见这里)
Expand-Archive -LiteralPath <Zip-File> -DestinationPath <Path>
然后使用 PnPUtil
安装驱动程序。
pnputil -i -a <Driver-INF-File>
安装 GUI 工具
- 文件管理器推荐 Explorer++
设置存储池和虚拟磁盘
备份数据
因为硬盘加入存储池的时候会清除其中的数据,所以数据备份还是必要的。
如果在备份数据的时候遇到文件权限问题,可以用以下命令解决。
takeown /f "C:\" /r
icacls "C:\" /grant Administrators:F /t
建立存储池
首先将硬盘重新初始化。
在服务器管理工具中,重新扫描存储,然后这块刚刚重新初始化的硬盘就会出现在“原始池(Primordial)”里面了。
在把所有硬盘都重新初始化之后,就可以创建存储池了。
存储池建好之后,新建虚拟磁盘。我比较喜欢 parity 布局,就算是有一块硬盘工作不正常了,也可以根据 parity 尽量将数据恢复出来。精简类型则更有弹性,可以创建名义上比可用空间更多的磁盘。只要先创建一个足够大的虚拟,日后只要不停地加新硬盘,然后把新硬盘添到存储池里,不需要对虚拟磁盘做任何改动。但是虚拟磁盘的名义空间越大,其分配表所需要的空间也就越大。
提高存储池性能
如果虚拟磁盘选择了 parity 布局的话,复制文件的时候会发现速度不稳定,先是速度特别快,然后降为 0,如此往复。要修复这个问题,需要将存储池设为“已有备用电源保护”。
Get-StoragePool
Set-StoragePool -FriendlyName <StoragePool> -IsPowerProtected $true
向存储池添加新硬盘
首先,新硬盘也要像之前那样先进行初始化操作。然后通过 RSAT 添加到已存在的存储池中。
添加完之后,虽然可用空间已经增加,但是写入的时候还会出现空间不足的提示。所以这里需要多加一个“重新平衡数据(rebalancing)”的操作。
Optimize-StoragePool -FriendlyName "<PoolName>"
从储存池中删除硬盘
首先,要先将硬盘标记为“Retired”,防止写入新数据。
Get-PhysicalDisk
Set-PhysicalDisk -FriendlyName <hdd_name> -Usage Retired
然后,让系统将硬盘上的数据移走。这里要每个虚拟磁盘都执行一遍。
Get-VirtualDisk
Repair-VirtualDisk -FriendlyName <vhd_name>
然后在RSAT里面确认硬盘中的数据已经全部移除(已用空间接近于0)。之后从存储池里删除磁盘。
Remove-PhysicalDisk -FriendlyName <hdd_name>
设置共享
建立非管理员用户
如果需要区分各个使用环境的权限(比如限制视频盒子只有读取权限),就需要建立非管理员用户。
$Password = Read-Host -AsSecureString
New-LocalUser "<UserName>" -Password $Password -FullName "<FullName>" -Description "<Description>"
如果提示密码不符合复杂性要求,可以用以下命令关闭密码复杂性检查。
secedit /export /cfg c:\secpol.cfg
(gc C:\secpol.cfg).replace("PasswordComplexity = 1", "PasswordComplexity = 0") | Out-File C:\secpol.cfg
secedit /configure /db c:\windows\security\local.sdb /cfg c:\secpol.cfg /areas SECURITYPOLICY
rm -force c:\secpol.cfg -confirm:$false
建立共享
最简单的新建共享的方法就是通过服务器管理器(RSAT)
设置权限
默认的权限是所有人只读,如果需要允许管理员更改内容,需要单独加入规则。