Windows Hyper-V Server 2016 安装笔记

Update 2019/05/26: 由于服务器已换装 Windows 10 做系统,本文将不再更新,缺失的屏幕截图也不会补上。

服务器上的硬盘越来越多,数据也存放得越来越乱。不仅出现了数据跨盘,在硬盘出现问题的时候也容易丢数据。自从发现了 Windows Server 的 Storage Spaces 功能之后,便琢磨将硬盘做成阵列,由系统控制,然后在上面搭建虚拟磁盘,或许是一个很好的解决办法。

无奈 Windows Server 2012 的 Storage Spaces 功能太有限,于是就更新到了 Windows Hyper-V Server 2016。至于原因嘛,

  1. 最小化系统,轻便。
  2. 原生支持文件共享(SMB/CIFS),其他机器可以直接访问数据。
  3. 可以用 Hyper-V 搭载 Linux/Android 等等虚拟机。
  4. (最重要的)免费!

安装

首先去微软的 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

Enable-Remoting-Client.png

如果服务器和客户端不在域里面而是使用工作组的话,需要在客户端打开 DCOM 匿名访问。首先打开 DCOM 设置。

dcomcnfg.exe

然后找到“组件服务” > “计算机” > “我的电脑”,右键单击“我的电脑”,选择“属性”。

dcomcnfg-1.png

在打开的对话框里选择“COM 安全”选项卡,在“访问权限”下面点击“编辑限制...”按钮。

dcomcnfg-2.png

将“ANONYMOUS LOGON”下面的“远程访问”设置成“允许”。

dcomcnfg-3.png

开启更多的远程管理

在服务器的 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 工具

设置存储池和虚拟磁盘

备份数据

因为硬盘加入存储池的时候会清除其中的数据,所以数据备份还是必要的。

如果在备份数据的时候遇到文件权限问题,可以用以下命令解决。

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)

设置权限

默认的权限是所有人只读,如果需要允许管理员更改内容,需要单独加入规则。

添加新评论