曾经,一台共享空间的 PHP 「虚拟主机」在大部分人眼里就是很高级的「服务器」了,后来随着虚拟化技术的发展,OpenVZ, Xen, KVM 虚拟机越来越普及,Linode 和 DigitalOcean 更是将 $10/mo 的廉价 VPS 推广开来,VPS 可以做很多 PHP 共享主机做不到的事情。近两年,随着越来越多中小企业的发展,「微型服务器」的概念也慢慢出现了。HP ProLiant MicroServer Gen8 就是其中的一员。最近我也入手了一台,当家庭服务器使用。
一、购买
Gen8 是 2013 年的产品了,现在的售价已经比刚出来时便宜不少了。爱折腾的可以去海淘一个便宜的版本,我为了省事就直接在〇东上购买了。〇东上提供了三个型号,分别是:
- Intel G1610 CPU + 2 GB RAM
- Intel G2020 CPU + 2 GB RAM
- Intel E3-1220Lv2 CPU + 4 GB RAM
主要的区别就是在 CPU 了,三款 CPU 分别是赛扬(Celeron)、奔腾(Pentium)和至强(Xeon)系列的产品,价格也由低到高。然而这内存实在是令人郁闷,两条插槽明明可以可以最高 16 GB(甚至单条 16 GB 的话可以最高 32 GB,兼容性未知),但最高配置也就 4 GB 是什么鬼……考虑了一下自己主要是用来做 NAS 使用,但是同时又有虚拟化的需求,因此决定购买赛扬型号的,然后自己加内存。
最终我的购买清单是:
- HP ProLiant Gen8, Intel G1610 CPU, 2 GB RAM
- Kingston DDR3 1600 ECC RAM, 8 GB
- Samsung 850 EVO SSD, 120 GB
- WD Red NAS HDD, 2 TB
- 六类网线,3 米 * 3
Gen8 一共四个 SATA 盘位外加一个光驱位,因此有心折腾的话最多可以扩展成五块硬盘。我按照我目前的需求就一块 SSD 一块 HDD 搞定了。网线我买了三根,是因为 Gen8 有三个 RJ-45 接口,两个是主网卡上的,另一个是 iLO 的管理接口。在 iLO 中也可以设置让 iLO 和主网卡共享网络接口。
二、开箱及组装
以上内容合计约 3700 人民币,下单后当天下午就送到了。以下多图杀猫,点击可看大图。
在装硬盘的时候我踩坑了。由于之前对 Gen8 的 SATA 背板不了解,想当然地买了块普通的 2.5 英寸转 3.5 英寸硬盘支架,想要把 SSD 装到 1 号槽、HDD 装到 2 号槽的时候发现 2.5 英寸的 SSD 套个普通的 3.5 英寸支架并不能插进硬盘槽里……于是最后的解决方案是把 1 号槽的背板拆下来,拉到顶上,把 SSD 塞在那里,于是最后把 SSD 放顶上了。好在那儿本来就是光驱的位置,所以并不影响盖上盖子。
另一种方案是把 SSD 接到闲置的光驱线上,这样下面四个盘位都可以插满大容量 HDD。这种方案需要自己购买 SATA 转接线。
在装好硬盘之后,需要在 BIOS 里配置 B120i RAID 控制器。说是 RAID 控制器,其实是个伪 RAID,加之我并没有 RAID 需求,我直接禁用掉了,这样操作系统看到的就是个普通的 SATA 控制器,能直接访问到下面挂载的硬盘。
三、搭建 ESXi 虚拟化环境
来自三年后的更新:推荐使用 Proxmox VE 虚拟化方案。真香。
Gen8 作为一个微型服务器,定位于中小企业和家庭,配置远不如它那些安身于 IDC 里的同侪们,但是用作网络存储却是非常合适。四盘位使用 3 TB 硬盘可提供 12 TB 的存储空间;如果使用那些 6 TB 的硬盘的话,更可扩展至 24 TB 存储空间。我入手 Gen8 也是想作为网络存储的,但是同时又想一机多用,跑几个虚拟机玩玩。因此需要一套虚拟化方案。
虚拟化方案选择
纳入我考虑范围的有 VMware ESXi、XenServer、libvirt + QEMU 这三种方案。综合我自己的需求、自身的兴趣(后两者都已经玩过了,第一个还没玩过),以及 Twitter 的投票,我选择了 VMware ESXi 作为虚拟化方案。
ESXi 的前身是 ESX,是 VMware 出品的优秀的 bare metal 虚拟化方案,在 VMware 网站上可以免费注册得到一份授权,可无限期使用。与 VirtualBox、QEMU、Hyper-V 等方案不同,ESXi 是 Type-1 Hypervisor,它直接运行于裸机上,不需要先安装一个操作系统,因此性能开销小,本身占地也很小,很适合安装到 TF 卡或 U 盘等小型存储器中。正巧,Gen8 的机箱内主板上有一个 USB 和一个 TF 卡接口,可以把 ESXi 安装进去。由于 ESXi 启动完成之后就在内存中运行了,不用担心 U 盘和 TF 卡的读写性能问题。
安装并连接到 ESXi
在 VMware 网站上可以下载到 ESXi 6 的安装镜像,但是 HP 为 Gen8 专门制作了一个定制版的 ESXi 镜像,自带了 Gen8 的驱动程序,建议使用 HP 版本包括我在内已经有两位用户发现 HP 定制版 ESXi 与 RDM 有兼容性问题,会导致 ESXi 虚拟机卡死。使用原版 ESXi 镜像无兼容性问题。安装镜像约 380 MiB,局域网内网络挂载安装也不会太慢,直接使用 iLO 的虚拟光驱挂载功能即可。注意,默认的 iLO 版本并不支持虚拟光驱功能,需要去 HP 那里申请一个 60 天 iLO Advanced 试用版授权。或者你可以本地起个一个 HTTP 服务器,然后使用 iLO 免费版里的从 URL 加载镜像的功能安装。
我不知道原版 ESXi 安装过程是什么样的,但是 HP 为 Gen8 定制的 ESXi 安装镜像在整个安装过程中除了问了我安装到哪里,其他什么也没问。我自然是选择安装到 U 盘了(记得提前插好)。安装完成后可以看到上灰下黄的屏幕上显示着 ESXi 通过 DHCP 自动获取的 IP 地址,用浏览器访问即可看到欢迎页面,然后……你几乎什么也不能做,不过你可以顺着欢迎页面上的链接去下载个 vSphere Client。
这是令我比较郁闷的部分。通过这几天的使用,我发现 ESXi 是个好东西,但是它提供的连接方式却不怎么样。目前你有四种方式去管理它上面的虚拟主机:
- 使用 vSphere Client —— 这是一个 Windows-only 的客户端;
- 使用 vSphere Web Client —— 你需要部署 vCenter,对于只跑一个 ESXi 实例的用户来说太不值得了;
- 使用 vSphere CLI —— 也依赖 vCenter;
- 安装 ESXi Web UI —— 似乎是个 2016 年新出的试验产品,功能还不完善,bug 也多。
作为一个 Arch Linux 用户,我自然想免客户端直接从浏览器里管理虚拟机了,但是安装并使用了 ESXi Web UI 之后我发现它实在是初级了一些,于是最后还是屈服于 VirtualBox + Windows + vSphere Client 了。
连接到 ESXi 之后需要先创建数据存储(Datastore)。前面说过,我的 Gen8 主板上插了个 16 GB 的 U 盘(ESXi 就装在里面),硬盘位插了一块 SSD 和一块 HDD,我直接把整块 SSD 都添加到 ESXi 里作为 Datastore 了。ESXi 会将其分区并格式化成 VMFS 作为虚拟机存储。剩下的 HDD 则通过 RDM 分配给虚拟机使用。
创建磁盘映射(RDM)
vSphere Client 的 GUI 还是不错的,功能强大、操作简单,创建虚拟机的过程不再详述。下面讲讲 RDM。
前面说过,NAS 将是 Gen8 的重要用途,因此大容量硬盘是少不了的,但是我的 NAS 是跑在虚拟机里的,考虑到数据迁移和恢复的便利性,最好能让虚拟机直接访问到物理磁盘,而不是再隔一层文件系统。让虚拟机直接访问到物理机的磁盘有两种思路:Passthrough 和 RDM (Raw Disk Mapping)。前者需要 CPU 支持 VT-d,并且按照 @Orz_C 的实验,似乎只能把整个 SATA 控制器(连同下面的四个盘位)一起直通进去,不能单独传递下面挂载的磁盘。很遗憾,我的赛扬 CPU 虽然支持 VT-x 却不支持 VT-d,并且我的 SATA 控制器下面挂的并不都是想传递给虚拟机的硬盘,因此此路不通。
那就用 RDM 吧。RDM 其实是 VMDK(VMware 开发的开放虚拟磁盘格式)的功能,原理是创建一个(几乎不占空间的)特殊 .vmdk 文件映射到一块物理磁盘,当虚拟机向这块 VMDK 写入时,实际写入的是后面的物理磁盘。在 VirtualBox 里也可以用这种方法让虚拟机直接使用物理磁盘。ESXi 支持在 GUI 中创建到 LUN 的 RDM,却必须要借助命令行才能创建到本地 SATA 磁盘的 RDM。
在 ESXi 的设置中打开 SSH 访问,用 SSH 登录之后看到 /dev/disks/
底下有 Gen8 上所有的磁盘:
[root@ezsetupsystem3ca82a9fd134:~] ls -lh /dev/disks/ total 4160150040 -rw------- 1 root root 14.4G Mar 13 16:29 mpx.vmhba32:C0:T0:L0 -rw------- 1 root root 4.0M Mar 13 16:29 mpx.vmhba32:C0:T0:L0:1 -rw------- 1 root root 250.0M Mar 13 16:29 mpx.vmhba32:C0:T0:L0:5 -rw------- 1 root root 250.0M Mar 13 16:29 mpx.vmhba32:C0:T0:L0:6 -rw------- 1 root root 110.0M Mar 13 16:29 mpx.vmhba32:C0:T0:L0:7 -rw------- 1 root root 286.0M Mar 13 16:29 mpx.vmhba32:C0:T0:L0:8 -rw------- 1 root root 2.5G Mar 13 16:29 mpx.vmhba32:C0:T0:L0:9 -rw------- 1 root root 111.8G Mar 13 16:29 t10.ATA_____Samsung_SSD_850_EVO_120GB_______________S21XXXX_____ -rw------- 1 root root 111.8G Mar 13 16:29 t10.ATA_____Samsung_SSD_850_EVO_120GB_______________S21XXXX_____:1 -rw------- 1 root root 1.8T Mar 13 16:29 t10.ATA_____WDC_WD20XXXX_________________________WD2DXXXX -rw------- 1 root root 1.8T Mar 13 16:29 t10.ATA_____WDC_WD20XXXX_________________________WD2DXXXX:1 lrwxrwxrwx 1 root root 20 Mar 13 16:29 vml.0000000000766d68626133323a303a30 -> mpx.vmhba32:C0:T0:L0 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:1 -> mpx.vmhba32:C0:T0:L0:1 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:5 -> mpx.vmhba32:C0:T0:L0:5 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:6 -> mpx.vmhba32:C0:T0:L0:6 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:7 -> mpx.vmhba32:C0:T0:L0:7 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:8 -> mpx.vmhba32:C0:T0:L0:8 lrwxrwxrwx 1 root root 22 Mar 13 16:29 vml.0000000000766d68626133323a303a30:9 -> mpx.vmhba32:C0:T0:L0:9 lrwxrwxrwx 1 root root 74 Mar 13 16:29 vml.0100000000202020202057442d574343344d30465a36374831574443205744 -> t10.ATA_____WDC_WD20XXXX_________________________WD2DXXXX lrwxrwxrwx 1 root root 76 Mar 13 16:29 vml.0100000000202020202057442d574343344d30465a36374831574443205744:1 -> t10.ATA_____WDC_WD20XXXX_________________________WD2DXXXX:1 lrwxrwxrwx 1 root root 72 Mar 13 16:29 vml.0100000000533231564e58414831373636383944202020202053616d73756e -> t10.ATA_____Samsung_SSD_850_EVO_120GB_______________S21XXXX_____ lrwxrwxrwx 1 root root 74 Mar 13 16:29 vml.0100000000533231564e58414831373636383944202020202053616d73756e:1 -> t10.ATA_____Samsung_SSD_850_EVO_120GB_______________S21XXXX_____:1
那些 mpx 开头的是那只 16 GB 的 U 盘及其分区,四个 t10 开头的代表 SSD 和 HDD,剩下的那些是指向前面那些的符号链接。
这里我选择 WDC 的那个块设备(即我的 WD 硬盘),创建 RDM:
vmkfstools -r /dev/disks/XXXX /vmfs/volumes/EVO/WDYYYY.vmdk
vmkfstools -r /vmfs/devices/disks/XXXX /vmfs/volumes/EVO/WDYYYY.vmdk
更正:创建时应使用 /vmfs/devices/disks/
下的路径而汪是 /dev/disks/
下的路径,否则会报 Failed to create virtual disk: The specified device is not a valid physical disk device (20).
错误。
第一个参数是代表物理磁盘的块设备(注意不带冒号,即整块硬盘,而不是其中的分区),第二个参数是创建的 .vmdk 文件的路径,我这里保存到上一节创建的名为 EVO 的 Datastore(即我的 SSD)根目录下名为 WDYYYY.vmdk
的文件(我是拿硬盘序列号作为文件名的)。
另外,-r
参数创建的是 Virtual Compabilitiy Mode RDM,即 ESXi 会截获除 READ / WRITE 之外所有 SATA 指令;如果换成 -z
参数,则是创建 Physical Compability Mode RDM,即 ESXi 除了 LUN REPORT 指令,其他全部原样传递给物理磁盘。没啥特殊需求用 -r
即可。两种模式只有在 hdparm
等涉及到磁盘本身参数的命令才会有区别,数据层面没有区别。
将这样创建得到的特殊 .vmdk 文件分配给虚拟机,便可在虚拟机中访问到外层 ESXi 的硬盘。
四、搭建 NFS 和 Samba
接下来需要将硬盘中的文件分享给其他主机。如果你的网络里只有 Linux 主机的话,那么搭个 NFS 就足够了。初版 NFS 于 1984 年由 Sun 研发,几十年来久经考验,十分适合局域网内文件共享。
在 Linux 发行版中,NFS 服务通常由 nfs-utils 包提供,安装后修改 /etc/exports
文件,将硬盘挂载点共享出去即可。比如这是我的配置:
/media/disk1/public 192.168.2.0/24(ro,sync,no_subtree_check,no_root_squash) /media/disk1/incoming 192.168.2.0/24(rw,sync,no_subtree_check)
共享了 public 和 incoming 两个目录,前者允许局域网内读写操作,后者则是只读。修改此文件用后可以用 exportfs -rav
命令重载。注意,no_root_squash
使得拥有 NFS 客户机 root 权限的人也可以 root 身份对 NFS 服务器的共享目录进行操作(与 MooseFS 的默认行为一致),如果不需要这一特性可以关闭。
在我的 Linux 笔记本上,可将 NFS 挂载项写个 /etc/fstab
实现开机自动挂载(voila 是文件共享服务器的主机名):
# NFS @ voila voila:/media/disk1 /nfs/voila nfs4 rsize=8192,wsize=8192,timeo=14,_netdev 0 0
因为我还需要向 Windows 用户分享文件,因此我还装了一个 Samba。Samba 的配置比 NFS 复杂多了,以下是我用的最简配置:
# /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = Voila Samba Server hosts allow = 192.168.2. 127. log file = /var/log/samba/%m.log max log size = 50 security = user map to guest = Bad User [public] comment = Public Read-only path = /media/disk1/public public = yes browseable = yes read only = yes [incoming] comment = Public Read-write path = /media/disk1/incoming public = yes only guest = yes browseable = yes read only = no writable = yes
启动 Samba 服务后,列在 hosts allow
里的主机即可无密码访问 Samba 共享。Windows 用户可以将 Samba 目录映射为网络驱动器,方便日后访问。
五、家庭服务器的其他用途
本节列举一些我能想到家庭服务器的其他用途,可能是我已经实现的、正在实现的、想要实现的,以及暂时不想实现的。排名不分先后,仅供参考:
- 下载服务(Aria2 § Web UIs);
- 照片备份服务;
- 视频转码服务;
- 音乐播放服务(mpd、DLNA);
- 游戏分享服务(Steam In-Home Streaming);
- 翻墙网关(x86 架构的 AES 性能远高于 ARM 或 MIPS 路由器);
- 网络质量监控服务(
SmokePing、Collectd、Grafana已实现:《collectd + Graphite + Grafana 搭建网络质量监控系统》); - 邮件网关(Hillary Clinton email controversy);
- 软件源镜像;
- 备份服务(已实现:《BorgBackup —— 增量备份方案》);
- 网络电话。
六、致谢
以下推友作为 Gen8 的先驱玩家,在本文作者折腾 Gen8 的过程中给予了诸多帮助和指导,特此感谢(排名由 sort
提供):
三年后的更新:《MicroServer Gen8 改造小记》
四年后,新服务器:《HPE MicroServer Gen10 Plus 上手玩》