Site Overlay

NUC + ESXi 的新体验

这篇文章其实是去年9月的时候写的,主要诱因就是我搞坏了原来NUC上安装的Ubuntu的Network Manager,导致远程连接不上,虽然其实Network Manager并非必须,但我还是决定重新装一下系统,一方面是因为觉得少点什么心里不爽,另一方面也是因为这样裸机跑系统缺乏比较有效的快照措施(现在找到了个叫TimeShift的软件似乎不错,实验室用一段时间之后再来说说感受),需要有一套更加易用的体系,否则必然有一天会陷入要么费力抢救数据要么费力擦屁股的困局。在LUG@NJU群里面问的时候,有老哥就提出“不如虚拟化”,再想到之前社团里面玩了挺长一段时间的ESXi的,不妨试试能不能在NUC上装一下。
结果还真的有社区在维护ESXi的社区版本驱动,跌跌撞撞装上了之后,效果还挺不错,虽然还没加上定期的快照脚本,但是因为过去半年其实也没怎么用这里的功能,所以就算出现了意外也不会有什么大事。
现在,由于对家里小米路由器的改造彻底失败(之前Network Manager炸掉其实和它也有一点关联),没办法在家里用上IPv6,因此决定一步到位直接上OpenWRT,NUC的硬件显然是没办法支持软路由(其实也可以,但是拖一堆线太丑,我还打算假期清理下电视后面的线来着),所以大概到时候就会退役了。不过有ESXi的基础,迁移工作应该不会太过困难,也借此机会把这篇文章发出来,作为对兢兢业业工作了两年的NUC的纪念吧。
玩家
2022年1月20日于仙林

自定义镜像

懒得具体讲了,都在参考链接里:

参考:https://soulteary.com/2021/06/22/nuc-notes-install-esxi7.html
https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.1

在运行VMware PowerCLI时,可能会因为PowerShell的执行策略导致无法运行,可以用下面的语句临时设定执行策略:

PS > Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

参考:https://anjia0532.github.io/2020/06/19/vsphere-7-custom-network-adapter/
https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages
https://www.virten.net/2015/03/esxi-6-0-image-for-intel-nuc/

结果用不了,因为文章里给出的驱动补丁是Intel的网卡,而NUC6居然用的是螃蟹网卡。
而螃蟹网卡似乎只有社区驱动,RT8111对应的驱动可以用v-front.de的net55-r8168包,但是代价是由于ESXi的兼容性,只能用6.7版本。
只能就只能吧,为了保险,顺手加上了sata-xahci包,因为NUC5需要,虽然不确定NUC6用不用的上,但是能省一次是一次。
在新建立一个ESXi镜像Profile的时候,要加上-AcceptanceLevel "CommunitySupported"选项,因为和Intel的不同,v-front.de的驱动包属于是社区维护的,直接装入官方包会导致可靠性不符合标准。

结果装到一半说内存不够要4GiB以上,那就明天再说吧,反正内存也在路上了。
听说可能还有固件兼容性的问题,而且刷BIOS的程序只有Windows版,但愿我们这台没有吧,手头是真的没有能用的WinToGo了。

第二天了。

看起来固件是好的,内存没注意有两个槽,然后ARK上又说最高8GiB,所以就买了根8GiB的内存,结果现在内存就是尴尬的12GiB,后面估计会把4GiB的给群晖,不过群晖内存兼容性也难说,说不定最后还是12GiB,反正内存多多益善嘛。

安装的时候ESXi要求复杂密码,看来这是从6.7版本开始加强的要求,社团的两台6.5版本都不要求复杂密码。

安装Docker

安装完了Ubuntu server,配置好了IP地址,现在准备开始部署服务了。
因为之前部署的时候几乎没有写笔记,所以这次很多步骤需要参考原来的配置文件,手头目前没有硬盘盒,所以先整点简单的肯定会用上的。
开始之前,先拍个快照。

参考:https://mirrors.nju.edu.cn/
https://docs.docker.com/engine/install/linux-postinstall/

网上推荐的Docker装法基本上都是用官方的PPA源,但是考虑到DockerHub的访问速度,我对官方PPA源的速度并不是很有信心,因此选择了质量高稳定性好维护者负责的NJU Mirror。

添加PPA源并安装docker-ce,这一步NJU Mirror的帮助里面有详细的描述,安装完后,顺手换掉DockerHub的源。

安装完成后,将当前用户加入docker组:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

然后重启虚拟机,即可获取控制Docker的权限。

需要注意的是,Docker涉及到很多操作系统底层的机制,因此用户组docker的权限与root相当,在将一个普通用户加入docker组之前要三思而后行。

一切结束后可以docker run hello-world来测试Docker安装是否正确,确认正确后,拍个快照,Docker安装完成。

部署DDNS

参考:https://github.com/rehiy/dnspod-shell/

简单的很,另外用一个脚本用来记录日志:

#!/bin/sh

path="/path/to/dnspod-shell"

date +%Y/%m/%d\ %H:%M:%S >> ${path}/log.txt
${path}/ddnspod.sh >> ${path}/log.txt

把这个脚本加入crontab中,设置成每10分钟运行一次:

*/10 * * * * /path/to/dnspod-shell/auto.sh

运行正常,拍个快照, DDNSPod部署完成。

部署SoftEther VPN服务器

参考:https://www.softether.org/
https://wiki.debian.org/LSBInitScripts
https://zhjwpku.com/2016/11/29/set-up-vpn-server-using-softether.html

这个也是本次的主要目标。

首先下载安装包

$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

解压,并编译

$ tar -zxvf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
$ cd vpnserver/
$ make

将编译好的文件移动到/usr/local下,并修改权限

$ sudo mv vpnserver/ /usr/local/vpnserver
$ cd /usr/local/vpnserver/
$ sudo chmod 600 *
$ sudo chmod 700 vpnserver
$ sudo chmod 700 vpncmd

/etc/init.d下创建一个服务脚本vpnserver

#!/bin/sh
# chkconfig: 2345 99 01
### BEGIN INIT INFO
# Provides: vpnserver
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: SoftEther VPN Server
### END INIT INFO
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
    $DAEMON start
    touch $LOCK
    ;;
stop)
    $DAEMON stop
    touch $LOCK
    ;;
restart)
    $DAEMON stop
    sleep 3
    $DAEMON start
    ;;
*)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit 0

并赋予执行权限

$ sudo chmod +x /etc/init.d/vpnserver

然后使用systemd设置开机自启,最后启动服务。

接下来,在Windows PC上打开SoftEther VPN Server Manager,输入服务器域名,端口选择5555(默认四个中的一个,而且相对不常用),并开始连接。
第一次连接时会要求设置密码。

在进入后的设置向导中,选择“VPN的其他高级设置”,手动设置VPN服务器。

  1. 设置L2TP/IPSec服务,并更改PSK。
  2. 上传证书,并将对应的CA证书放入安装目录下的chain_certs目录。
  3. 设置OpenVPN和MS-SSTP VPN服务。
  4. 删除443端口的监听,反正电信也不给开。
  5. 设置SoftEther提供的DDNS,不用白不用,可以为Debug提供帮助。
  6. 在虚拟HUB设置中,设置用户账户。
  7. 在虚拟HUB设置中,设置虚拟NAT,打开SecureNAT。

OpenVPN的配置文件可能需要手动修改服务器地址。

重启下机器,在浏览器中打开服务对应的端口,如果能正确加载出网站,配置就对了一大半,剩下的配置需要等机器在家部署好才能测试,先拍个快照

2022年3月6日更新:
有的时候在连回家里的VPN后,出现了部分外网时断时续的症状,我目前无法定位问题原因。
作为规避,我关闭了SecureNAT功能,改为使用一个网桥桥接VPN HUB和本地网卡,目前工作正常。
参考:http://blog.dengxj.com/archives/9/ (https://web.archive.org/web/20220306081340/http://blog.dengxj.com/archives/9/)

实体盘虚拟化

由于懒,因此决定将原来NUC的盘直接做成虚拟磁盘,看看能不能省点事情。
逛了一圈,似乎没有直接能把整块磁盘转换为vmdk的工具,可能是因为只能识别挂载在Windows下的盘,而ext4估计不行。
所以先在Linux里面用dd把磁盘做成img映像:

$ sudo dd if=/dev/sda of=/path/to/imgfile.img status=progress

最后一个参数是为了显示进度条,否则实在是心慌。

然后用StarWind V2V Converter将img文件转换为vmdk,这个软件支持直接把转换好的虚拟磁盘附加到ESXi上,可以节省一点操作步骤。

修复引导

参考:https://jingyan.baidu.com/article/4ae03de3dbdac83eff9e6be0.html

首先要在Live CD里面挂载原有的文件系统,由于原来用的LVM安装,因此要用如下方法挂载:

mount /dev/mapper/vgubuntu-root/ /mnt
mount /dev/sda1/ /mnt/boot/efi
mount -o bind /dev/ /mnt/dev
mount -o bind /sys/ /mnt/sys
mount -o bind /proc/ /sys/proc
chroot /mnt

然后就可以尝试修复GRUB:

grub-install /dev/sda

结果没用,提醒什么BIOS引导模式什么缺少bios_grub标志什么的,年轻的我还没有意识到问题的关键,就在gparted里面把EFI分区flag设置为bios_grub
结果依然没啥用,能开机了但是一过POST就卡在光标跳跳跳,想了想试试再update-grub,倒是不卡了整个画面疯狂在BIOS自检和引导里面乱窜。

还好每一步都拍了快照,否则500G镜像重拷一遍肯定要了我老命。

最后发现网上有个叫boot-repair的工具看起来交互式的很好用,就试试看,结果失败了,但是工具给了一个很重要的提示,说不能在Legacy BIOS模式下工作。
这启发了我,我原先在NUC上装系统的时候,毫无疑问用的肯定是UEFI的方式引导,但是在检查了VMware的虚拟机设置后,我发现默认竟然是Legacy方式(VMware管这个分别叫EFI和BIOS),这能引导才有鬼了。

在把虚拟机引导方式切换成UEFI后,直接就能正常启动,不用修复引导了。

那么在这种时候,我们一般说,虽然自己像傻子一样折腾了半天,显得弱智无比却什么也没捞到,但是收获了宝 贵 的 经 验。

1 thought on “NUC + ESXi 的新体验

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据