Plum's Blog

记一次非常蛋疼但有意义的服务器部署

前言:大概从去年年底左右,我接到了一个很奇怪的任务,需要部署一个有着特殊功能的服务器,服务器本体是来自单位淘汰的一台老机器拿来利旧。结果没想到就是这么一个任务,让我断断续续的部署了半年的时间,因为这项任务并不怎么紧迫,只是“有就行,没有也无所谓“的状态,所以倒也没对工作本身造成什么影响,只是在部署的过程中遇到了大量的坑,还碰到了“疑似”硬件损坏,还意外得到了“高人指点”,解决的办法也是百转千回,期间多次想要放弃,但是最后不知道为啥我还是坚持下来了,我自己都不知道为什么。所以思来想去还是记录一下过程,或许会对有相同经历的人有所帮助。

避免傻逼来跳脸先做个声明:

1,不要问我这种服务器有没有意义
2,不要说什么“加钱上XXX不就得了“
3,不要说什么“电子垃圾别折腾了”
4,不要说什么“这种方案不安全”

这些问题我比你清楚,你就当我自己图一乐吧。


接受任务:一个特殊的“跳板服务器”

我们单位实行内外网分离方式来确保安全,运行业务的系统在独立的内网中,而连接互联网的网络和业务系统是物理分开的。

但是这就带来一个问题,有些外包公司的工程师需要远程维护服务器,就没有什么可靠途径。原来我们这边用的方法就是找几台双网卡的电脑,开机装个向日葵,需要的时候打开报数字,对方连接开始处理问题。

然后近年来开始严查“六关”,就是下班要求电脑都得关机,而且这些双网卡的电脑数量太少,一群人抢一台是常有的事情。

于是后来上面一个大头目就问我:能不能弄一个大内存的服务器,虚拟成好多个小系统,系统目的就是运行个类似向日葵的服务让人远程当跳板,别的功能都不怎么需要……

我一听,这特么不就是虚拟化么,但是双网卡的问题怎么解决?服务器接双网卡么?后来商量了一下,在网络层面做了一个映射,将内网的堡垒机的 Web 登陆界面映射到了外网的一个 IP 地址上,并且对特定的 IP 地址做了绑定。只有使用这个 IP 地址的机器,可以通过 Web 打开并登陆内网的堡垒机维护界面,进而进入内网进行数据维护。

后来头目问我这个东西能不能搞,最好还能实现定时管理,比如这些虚拟化的机器只有特定时间段可以使用,其他时间都无法连接……

我一想,用虚拟化平台来做,简直不要太简单,定时管理什么的只需要定时开关机就行了,恰巧我也想玩玩那种虚拟化服务系统,就有了点兴趣。头目表示说这个东西不急,毕竟现在大家还在排队用双网卡的机器,也就是费事点。能搞就搞,搞不成无所谓,实在不行,那就加钱上专业设备(如果能过审的话)。

其实我觉得这并不是什么好的解决办法,更好的其实是更为完善的堡垒机,带有网闸和账号管理之类的,但因为我自己想玩玩虚拟化,所以还是把这个任务接了下来。


记录1:没有视频信号,超出显示范围

接了任务之后就开始挑服务器,头目的意思是“利旧”,尽可能用淘汰的老硬件,如果有需求可以进行一些小升级。这个需求对于我这种垃圾佬来说居然莫名的感觉很“燃”,结果挑来挑去,发现符合配置要求的服务器只有 4 台,其中 3 台都是 IBM 时代的东西,最新的是一台 HP DL580 G7,这台机器居然有足足 64GB 的内存,还插满了四路 CPU,每颗 CPU 6 核 12 线程,总计 24 个核心,简直就是做虚拟化的最佳选择。

硬盘方面有 5 块,每块 600G,内置有 Raid 卡 P410i,虽然不多,但作为虚拟化应该是够用了。

于是就下载了 Proxmox VE 8.1,开始装系统。

结果第一步就遇到了大问题,启动自 Proxmox 的安装盘之后,直接屏幕就黑屏了,提示还是“没有信号,超出显示范围”。

这提示给我干懵了,我上次看到这个还是小时候连接 CRT 显示器,显卡不小心把刷新率设置到 85Hz 甚至更高的时候。

索性开始搜索,很快就找到了问题所在:

https://forum.proxmox.com/threads/out-of-range-issue-on-hp-servers.111086/

大概意思就是这机器显卡太老了,无法正常启动显卡驱动,解决办法也很简单,在安装的 Grub 界面按下 E,添加 nomodeset 就行了。


记录2:Raid 卡不支持 HBA,且主板仅支持 MBR

系统安装的时候发现不能装 Grub,因为分配的 Raid 5 不能作为启动盘使用。

因为是 5 块硬盘,全插在 P410i 的 Raid 卡上,想着不如弄成 HBA 模式吧,用 Proxmox VE 来管理全部硬盘,还能弄个 ZFS。但是这个 Raid 卡居然不支持 HBA 直通,网上有直通的教程,也是通过修改 Linux 内核来支持,太麻烦了。

研究了一圈,想要在上面安装系统的话,你需要单独划出来一块硬盘,自己创建一个 Raid0,并且在 Raid 设置中将其设置为启动盘,把系统装在上面。

而剩余的 4 块硬盘做个 Raid 5 的话……容量太小了,放不下太多镜像,想着直接做个条带什么的。结果不行,理由是做出来的 Raid 容量大于了 2TB,系统无法识别,强行用也可以,就是你多出 2T 的空间就浪费了。

这时候就不得不说这个服务器的主板了,完全不支持 UEFI,这就意味着和 GPT 磁盘完全说拜拜了,只有 MBR 的启动引导,而 MBR 最大支持的硬盘空间是 2TB,超过 2TB 的硬盘是无法被识别的……毕竟是利旧服务器,不想搞硬 Raid 了,于是就想着不然让 Proxmox VE 接管硬盘管理,做软 Raid 吧。

但我们前面说了,P410i 在这个主板上不支持 HBA,怎么办呢?故技重施,每个硬盘单独创建一个单磁盘 Raid0,用来实现做类似 HBA 的形式,虽然会失去 Smart 信息,但是对于这么一个老古董来说,谁在乎呢?


记录3:CPU 核多但低能

最后兜兜转转终于开始安装系统了, Proxmox VE 的安装还是很快的,毕竟是基于 Debian 的魔改系统。装好之后搭配 ZFS 分区,发现磁盘性能并不怎么快,尝试在上面简单装了个 Win10 LTSC,速度慢的无法忍受,无论是虚拟磁盘读写,还是系统的 CPU 占用都居高不下……

这时候我才发现了重要的问题:这个机器的 CPU 居然是 E7-4807,6 核 12 线程,主频却只有 1.86GHz,而且没有 Turbo Boost,这个主频实在是太低了,跑虚拟机压根不知道能跑的动什么系统。如果我没记错的话,ATOM 的 X5 8550 主频也比这个高吧?

一开始我尝试多给虚拟机分配核心,然后关掉 Windows 10 大量的特效和占用并对服务进行精简,但依然收效甚微,这个 CPU 性能实在是太低了……尤其是图形性能,低的发指,而 Proxmox VE 对 Windows 的支持也是基于 KVM 的,迄今为止也没有什么好的 GPU 驱动。目前倒是有一个在开发的,结果还是不可用状态:
https://github.com/virtio-win/kvm-guest-drivers-windows/pull/943

我现在都不知道这个服务器的配置是干嘛来的,核心这么多,内存这么多,但主频又不行,问了下这个服务器原来是跑的一个“知识数据库”,查了下最早的负责人居然还他妈是我,我都没印象,我就记得他们工程师来了两次升级了一下数据,公司就跑路了。

我于是开始想,有什么办法来提升这台机器的虚拟化。既然是跑 Windows,那或许装 Windows Server 就是最优解?


记录4:除了“它”你别无选择

安装 Windows Server 在这台机器上可谓是困难重重,首当其冲的就是驱动问题。

首先是这机器原来是跑 Windows Server 2003 的,还是他妈的 32bit 版本,这已经不能用古董来形容了,尝试安装 Windows Server 2008,似乎也没有 Hyper-V 这种东西。想要跑虚拟化的话至少要走 Windows Server 2012 甚至更高。

那么问题来了,HP DL580 G7 这个老古董的机器,官方提供最后的驱动支持似乎是只有 2008 的,好像还是 32bit……什么 Windows Server 2012 之类的,压根没驱动。

我尝试了强行安装,代价就是主板芯片组都驱动不起来,你想在任务管理器里看框框都看不到。

没办法,只能根据设备管理器里看到的硬件 ID,一个一个在网上找驱动,没想到还真让我找齐了,大部分都驱动起来了……除了那块型号很奇怪的 ATI 的显卡。

ATI,啊,多么怀念的名字,想起我小学的 Rage 128 了,虽然现在叫 AMD 了,但没想到时隔多年我又他妈被这玩意给囚禁了。显卡驱动装不上就会导致 Hyper-V 压根不可用,我本来就是冲着图形性能来的,你没显卡驱动,那还 GPU 个毛线啊。

我原本还想着要是 Hyper-V 不行,我就弄个 Virtualbox 或者 Vmware 之类的开虚拟机也行,结果全被这个傻逼显卡驱动干碎了。

搜来搜去,发现这个问题是无解的,在 2024 年,能提供这块显卡支持的,只有 Linux 了。我有想过找一个 PCI-E 的显卡插上,但是一看服务器机器的挡板不好找,还是算了。

虽然 Linux 下可以跑 Virtualbox,但是缺乏好用的远程管理,Virtualbox 有个项目叫做 phpvirtualbox,但是这个项目死了很久了。有人 Fork 了这个项目,提供了最新版本的支持,但是支持很有限,Virtualbox 的每次小版本更新,你就得重新编译一次,而且还有大部分功能处于不稳定状态……

结果就是兜兜转转,发现能用的选项还是只有 Proxmox VE。

不如说,我除了 Proxmox VE 之外,别无选择。


记录5:闲鱼大法和最终的 Proxmox VE

想来想去,还是不愿意放弃,解决单核性能太差的方法有很多,既然软件不行,那就从硬件入手,最终我选择了闲鱼大法。

我发现闲鱼上能用不到 70 元的价格买到 4 颗 E7-4860,直接干到 10 核 20 线程,除了核心更多之外,频率终于提升了,默频 2.26 GHz, 可以 Turbo 到 2.67 GHz,单核性能也有了很大的改善。要说不爽的是 CPU 本体不贵,但购买邮费占比太高。

收到 CPU 后立即拆开服务器,HP 的服务器不但网上有手册,而且机箱上也有图示,拆起来很方便,不仅更换了 4 颗 CPU,而且还重新涂抹了硅脂,改良了散热。

更换后一次点亮,重新装回 Proxmox VE 8.1,再次运行虚拟机,虽然感觉还是不算太快,但至少比原来好太多了。至于图形性能,直接用 QXL,放弃所有 3D,只提供 2D 加速,至少跑个向日葵什么的当个跳板机是完全够用了。

于是在 Proxmox VE 中配置了 NAT 网络:
https://blog.einverne.info/post/2021/10/proxmox-ve-config-nat-vm-use-same-public-ip.html

设置了 ZFS 的最大内存占用:
https://www.cnblogs.com/surplus/p/14055003.html

更换了国内的数据源:
https://mirrors.tuna.tsinghua.edu.cn/help/proxmox/

并且通过自己的计划任务,实现了对应虚拟机的自动启动和关闭。

就此,这台“虚拟平台服务器”就开始了内部测试阶段,我也找了几个用户来进行测试,看起来运转良好,直到两个月后的一天……


记录6:为提升性能,升级出了大错

这个”土垃圾虚拟服务器“运行了大概两个月,属于”内部测试试运行“阶段,给了大概 3-4 个人来跑,反响还算 OK,毕竟不需要去排队抢机器了。但是伴随着运行时间变长,我发现服务器本身的响应速度也开始变慢。

可能是因为平常使用 Linux 有强迫症,总觉得这个服务器还可以优化的速度更快,所以在 Swap 上还有内核调度上也进行了一些调整,虽然有效果,但也一般般。

这时候 Proxmox VE 发布了 8.2 版本更新,我看了下 Changelog 发现了很多似乎很有用的新特性。

我并非十分激进的人,但是我现在服务器已经装上了 Proxmox VE 8.1,我心想从 8.1 升级到 8.2 完全不是什么“大版本升级”吧,应该是没什么问题的……

所以为了进一步优化性能,选择了升级,然后为了安全起见,进行了 ZFS 的快照和备份,速度慢的发指,但好歹是完成了。

升级还算顺利,就在 Proxmox VE 自带的 Web UI 下就可以,但是升级到一半的时候就发现不对劲了,系统开始出现卡死,出现了类似 I/O 读写错误,心想不妙,尝试了许多方式,没有办法拯救,于是只能重启。

重启后系统就进入了彻底的完蛋模式,启动后发现 rootfs 都难以挂载,多次重启后 zfs 挂载也报错。

我心想坏了,不会是硬盘炸了吧?

找了个 Ubuntu Live CD 修复了 ZFS 的文件头,重启后的确又可以挂载了,结果没运行一会,再次出现了 I/O 读写错误。

其实这时候我已经基本放弃上面的数据了,其实上面也没啥数据,都是跳板机,备份也是怕麻烦再重新配置一次,于是跟试用的 3 个用户打了招呼,找了台 16G 内存的 PC 机,单独又装了个 Proxmox VE,配置了三个虚拟机,给他们临时先用着。值得一提的是我装的就是 Proxmox VE 8.2,一切正常。

然后抱着重新来过,死马当活马医的态度,开始了对这个“被我升级挂”的服务器的修复历程。


记录5:到底是硬盘还是 CPU

因为系统出现的问题就是 I/O 读写错误,正常人第一个想到的就是硬盘挂了。现在连全新安装 Proxmox VE 8.2 的系统都很勉强,装到一半就会卡死,怎么看都像是硬盘问题。

但是服务器上的硬盘灯一切正常,我甚至弄了个 Ubuntu Live CD 对硬盘进行了检查,每个都好得很。

但硬盘这种事情,谁说得清呢,没准是暗病呢?但是这时候我在日志里又看到了另一个操蛋的记录:

NMI: IOCK error (debug interrupt?) for reason 61 on CPU 0

这就给我干懵逼了,不会是 CPU 坏了吧,难道被闲鱼上的贩子骗了?但不应该啊,我活了这么久,这是第一次见到 CPU 还能非物理损伤坏掉的?上次看到 CPU 挂还是早些年 AMD 毒龙之类的冒烟。

我拆掉了机器,仅仅保留 1 颗 CPU,再次安装 Proxmox VE 8.2,居然一切顺利。

果然是 CPU 的问题?

装好系统后进行了一些简单配置,结果过了 20 分钟之后,系统再次失去响应,依然是熟悉的 I/O 读写错误。

草!到底是 CPU 还是硬盘?

我开始了排除法,得到了以下的结果:

我陷入了疑惑,如果是 CPU 问题,不能 4 颗同时挂了?概率太小了。如果是硬盘问题,为啥怎么测试都没毛病?

但硬要我选择的话,我还是倾向于硬盘,这时候我看到了主板 Raid 卡也有了新的报错,P410i 说 Raid 卡电池没电了,缓存读写被关闭,而且有些时候还读不出 Raid 信息,更加坚定了我认为是硬盘问题的信念,于是我决定就此入手。


记录6:吕布骑狗,土垃圾用新固态

折腾了有半个星期,机器到底是 CPU 坏了还是硬盘坏了一直无法确定,我甚至觉得可能是内存坏了,进行了内存的插拔测试,发现和内存无关。但是这个问题一直无法解决,就放置了下来。

过了有好几个月,单位的组长问这个服务器咋样了,就说了这事儿,对方说不行换个硬盘看看,于是从仓库里拿出来一个新硬盘,一看,好家伙,还是服务器用的固态。这玩意插到这个老古董的服务器上真的是“吕布骑狗“了。

既然如此那就来试试吧,插上固态之后立即开始 Proxmox VE 8.2 的安装,居然安装很顺利,不需要我禁用 CPU 核心就可以装上不死机,难道真的是硬盘的问题吗?

结果机器放了半个小时,再次出现了 I/O 读写错误。

…………

果然不是硬盘的问题,那问题在哪儿呢?我看到了启动时报错的 Raid 卡信息,想起了这个问题……

难道是这块 P410i 有问题吗?

拆开机器进行了研究,发现这块 P410i 是可以整个拆下来的,上面除了 Raid 还有一些其他的模块,搜了下网上的确有 Raid 卡损坏导致的类似故障,就想着……不如换一块 P410i 看看?

但是找遍了机房仓库,找不到类似的设备和备件,原来那么多 HP 的服务器居然都不见了…

这时候我想起了闲鱼,搜了一下,发现这板子居然只要 80 块钱,既然都折腾这么久了,还是不想放弃,不如就更换一下看看?


记录7:偶遇高人

闲鱼上卖给我这个板子的人是一个海南的,他看我要买,还给了点优惠,送了我一块 Raid 的电池,还有上面插的扩展缓存。

板子收到后经过检查成色非常新,应该是难得的库存备件,闲鱼上的老哥居然还给我详细的安装手册,照着装了下来,成功启动。

Raid 卡报错全部消失,安装系统也一切顺利。

看来问题真的要解决了,只需要等待半小时看会不会再次 I/O 错误了。

20 分钟过去了,依然正常

30 分钟来到了,错误还是如约而至……

这时候我真的是打算放弃了,能换的都换了,能测的都测了,难不成让我换主板吗?闲鱼上这种机器都可以买到,也就 200 块钱,可是真的有必要吗?

这时候闲鱼上的老哥还很热情的问我解决了没,我只能如实相告。

结果那个老哥的兴致起来了,开始给我提建议,让我进入 HP 的检测模式进行全部硬件的检测,他几乎知无不尽,完全了解 HP 服务器的全部设置。在他的帮助下,我对服务器进行了全方位的体检,得到了一个很疑惑的结论:

硬件都没有问题。

我就好奇的问那个老哥,你为啥这么了解?作为贩子来说这有点过于反常理了。

老哥意味深长的回答:“我以前是惠普金牌工程师,后来不干了,现在卖一些烂在手里的备件。“

最后老哥还说自己因为疫情收入下降,降薪,从惠普离职后自己给别的小公司做项目,还被赖账,现在还有很多钱没拿到手之类的……

居然能在闲鱼遇到金牌工程师……要知道这服务器都过保好多年了,你打电话给惠普付费都不一定会有人理你。

老哥最后告诉我说他几乎可以确定硬件没问题,唯一的问题可能就是原来的 Raid 卡电池没电了,会关闭缓存,让磁盘性能下降,现在电池补上了,应该磁盘性能会大幅上升,别的没理由会出现硬盘错误。

“我觉得你还是从软件方面找找原因”。

这是“前惠普金牌工程师”留下的建议。


记录8:被忽略的错误

那个工程师老哥的话更让我疑惑了,软件问题?软件能有什么问题?

我只是从 8.1 升级到 8.2,弄了个新内核,新 QEMU,新 ZFS,能有什么问题?如果有问题应开始就应该挂载不上,不应该是准时半小时后报错啊?

如果有问题为啥禁用部分 CPU 就可以安装,可以改变问题出现的时间呢?

重新复盘之后,发现问题出现在 8.1 升级到 8.2 时,如果真的是软件问题,那只能是这两者之间的问题了。

于是我仔细看,发现了盲点:
https://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_8.2

里面有这么一句话:

#### Kernel: `intel_iommu` now defaults to on

The `intel_iommu` parameter defaults to `on` in the kernel 6.8 series. Enabling IOMMU can cause problems with older  hardware, or systems with not up to date BIOS, due to bugs in the BIOS.

The issue can be fixed by explicitly disabling `intel_iommu` on the kernel commandline (`intel_iommu=off`) [following the reference documentation](https://pve.proxmox.com/pve-docs/chapter-sysadmin.html#sysboot_edit_kernel_cmdline).

然后搜了一下 “intel_iommu” 与“NMI: IOCK error ”这个错误的关系,找到了这封古老的内核邮件:

https://lore.kernel.org/linux-iommu/20191206072453.5jjwrjedqbjimx45@cantor/t/

看起来“intel_iommu” 参数会导致在一些惠普的老服务器上出现死机的状况,而 Proxmox VE 从 8.2 开始默认开启了这个参数,之前的内核是关闭的。

于是抱着试试看的心态,在内核参数的 grub 里关闭了这个参数“intel_iommu=off”……

重启后,问题再也没出现,一切恢复正常。

我一开始不太放心,又简单测试了大概半个星期,服务器再也没死机和出现过 I/O 读写错误,现在才可以确认真的问题被修复了。

断断续续历时快 4 个月,没想到原因就这么简单,真的有种想骂人的感觉。和闲鱼上的那个老哥说了这个情况,他也表示这个问题的确很罕见。可能因为“intel_iommu” 这个参数主要是搞显卡直通的,大部分都需要手动开启,很少有内核会主动默认开启的吧,而对于我这个平台,显卡直通毫无意义,能跑就行。


记录9:完整复盘

所以来进行一次完整的问题复盘:

首先这台破服务器接手的时候应该是没有硬件问题的,除了 CPU 有点慢之外,也通过闲鱼进行了升级。

但是服务器上的 Raid 卡电池电量严重不足,不过还勉强能用。所以装了系统,试运行了两个月,一切正常。

在这“两个月”期间,Raid 卡上的电池彻底没电,也充不进去,导致了机器磁盘性能的严重下降,拖累了整机性能和虚拟机性能,引起了我的注意,我开始进行优化。

优化了一堆,效果有,但不明显,这时候 Proxmox VE 8.2 发布,看到新内核和新的 ZFS,我觉得可以通过升级来获取性能提升,就进行了升级,没想到新版默认开启了 “intel_iommu” 这个参数,会导致老机器的死机问题,准确说是“会导致惠普的老服务器出现死机和其他稳定性问题”。

我开始排查硬件问题,从 CPU 内存,到硬盘,最后到 Raid 卡,唯独忽略了软件本身,毕竟我弄了台老的 16G 台式机跑 Proxmox VE 8.2 是完全正常的。

其实根本的问题还是“intel_iommu” 这个参数,关闭了就全部解决了。而这次升级也并非没有意义,至少换了个 Raid 卡的新电池,彻底解决了磁盘性能低下的问题。


记录10:完成任务

知道了根本问题,服务器开始重装系统进行部署,比起原来多了一块固态跑系统,也换了 Raid 卡的电池,磁盘性能大幅提升。标配的 64G 内存可以开十来个虚拟机,而且 ZFS 的快照功能也工作正常了,这台老古董服务器终于焕发了新生。

目前上面的系统都运行平稳,完全满足了原有的需求,不如说性能比预想的还要好很多。


结语:虽然蛋疼至少有收获

经过了这么一圈折腾,我不能说是“瞎折腾”吧,至少还是有意义和收获的:

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »