资源的精打细算:家里云虚拟机的拆分与融合

· 技术 · 约 2911 字

本篇文章主要围绕我的家里云上的、用于网络服务的 Linux 虚拟机和用于挂 QQ 的 Windows 虚拟机,用口水话讲述我是如何通过「拆分」和「融合」虚拟机、以节省内存消耗的。

动机

导入一下开头讲的、本文围绕的两个虚拟机的情况:

  • 用于网络服务的 Linux 虚拟机:基底系统是 Debian 13 Cloud,分配了 2 核 2GB,上面运行了 [REDACTED]、SmartDNS 和 Tailscale,平日内存占用约在 500MB 上下;

  • 用于挂 QQ 的 Windows 虚拟机:

    • 我自用的基底系统是 Windows Server 2022 Datacenter,分配了 2 核 8GB(平日要挂两个 QQ 培养一下账号等级);

    • Aris 为我的家里云赞助了一张 Intel i226-V 有线网卡,因此他得到了我的家里云和 NAS 的访问权限,故因其服务需要创建了一个虚拟机,基底系统同样是 Windows Server 2022 Datacenter,资源分配了 2 核 4GB。

其实前者情况还好,后者问题才是最大的:要跑起来一个带 DE 的 Windows Server 需要的资源较多,平日两个 VM 一起运行占了将近 8GB 内存。但是嘛,我脑子一抽、想进一步优化前者,所以制定了如下优化方案:

  • 对用于网络服务的 Linux 虚拟机进行进一步拆分:

    • [REDACTED] 和 SmartDNS 对环境的要求不高,综合考虑后,移入基于 Debian 13 的 LXC 容器;

    • Tailscale 在 LXC 里的配置相当麻烦,因此不考虑优化内存占用、而是优化启动速度,决定移入基底系统为 Alpine Linux (x86_64, virt) 的虚拟机;

  • 对仅仅用于挂 QQ 的 Windows 虚拟机进行融合,重新利用多用户特性、减少单独运行系统所带来的不必要内存开销。

拆分 Linux 虚拟机

这个时候我已经开学、返回南宁,如果贸然把虚拟机掐了,那就不会有本文了。因此我的做法是:先创建好对应的 LXC 容器和虚拟机、将服务一步步挪出去原本的虚拟机之后再掐掉。

迁移 [REDACTED] 和 SmartDNS 至 LXC 容器

截至本文写就,Proxmox 已有版本 13.1-2 的 Debian LXC 模板提供。因此我下载了该模板,并创建了一个分配了 2 核 2GB 的 LXC 容器。

由于 [REDACTED] 服务依赖,需要在 Resources 里添加一个路径为 /dev/net/tun 的 Device Passthrough。

启动 LXC 容器后,跟普通的 Debian 系统一样,安装软件包、写好配置并启动服务即可。So easy

迁移 Tailscale 至 Alpine Linux 虚拟机

选用 Alpine Linux 是因为它采用了非常轻量的 OpenRC 作为 init system。虽然我 systemd 用的多、不太适应 OpenRC,但鉴于这个虚拟机只用来跑一个 Tailscale、只涉及到自启动配置,所以问题不大。

Alpine Linux 在其官网提供了 Virtual 版本。该版本精简了内核、并对虚拟环境进行了优化,闭眼选。

安装

下载镜像、配置好一个同样分配了 2 核 2GB 的虚拟机、挂载镜像并启动后,用户名键入 root 并回车以登入 tty,执行 setup-alpine 进行安装向导。

虽然 Alpine Linux 非常的强悍、可以将系统挂载并仅在内存上运行,但我还是老实将系统安装在了数据盘上。除此之外,Alpine Linux 的安装向导非常的明了,这里就不再赘述安装过程。

配置

为了能够在 PVE Console 上直接查看虚拟机的相关信息(例如 IP 地址),需要给虚拟机额外安装一个 qemu-guest-agent,而该软件包和 Tailscale 一样、位于社区源里。因此需要 vi /etc/apk/repositories、将社区源那一行的注释取消。随后,执行 apk update 拉取软件源,并 apk add tailscale && apk add qemu-guest-agent 即可。

要让 Tailscale 能够转发子网,需要对系统做一些额外配置:

  1. 执行 vi /etc/sysctl.conf

  2. 添加两行内容:net.ipv4.ip_forward = 1net.ipv6.conf.all.forwarding = 1,保存退出;

  3. 执行 sysctl -p

Alpine Linux 有 /etc/sysctl.d 目录,你也可以根据自己的偏好、将配置文件放入该目录。

启动 Tailscale

假设 Tailscale 已完成登入。我需要转发 192.168.2.0/24 网段,因而执行:

$ tailscale up --advertise-routes=192.168.2.0/24

Tailscale 客户端启动后,前往 Tailscale Console 批准该路由即可。

掐掉原本的 Linux 虚拟机

到这一步之后,确认一下各服务运行是否正常,就可以把原本的虚拟机给删掉了。相比原本的虚拟机,LXC 容器 + Alpine 虚拟机仅占用了不到 300MB 的内存。

融合 Windows 虚拟机

这里考虑到潜在的、性能不够用的可能,虚拟机基底系统继续沿用 Windows Server 2022 Datacenter 而不是更新的 Windows Server 2025,并分配了 4 核 8GB 内存。Windows 的安装过程不再赘述。

对比之前的 Windows 虚拟机,新的虚拟机的唯一区别在于用户:Administrator 将仅用于更改系统的一些选项,我为我自己和 Aris 分别创建了管理员账户,之后各自通过 RDP 连接到虚拟机做自己的事情。

Windows 多用户真的不应被忽视。相比之前为一个人的简单需求单独开个虚拟机,融合之后的内存占用少了整整 4GB。

小结

这篇文章并没有什么技术力,而是对目前一个比较尴尬的事实做出的补救措施。

嗯对的,这个事实便是如今高昂的内存价格。自去年年末开始,DDR5 内存、DDR4 内存甚至 DDR3 内存被一帮不知道什么心态的人炒起来、价格直至现在都没有回归的芽头。虽然我个人有点先见之明、早早给家里云上好了 32GB DDR4 ECC 内存,但面对不合理的消耗、可用的内存空间总会有见底的那一天。在不明确内存价格何时回归之前,做好内存用量的控制、免得哪天想搭服务发现没内存可分配,也是一种明智之举。

喜欢的话,投喂亿下孩子吧(逃)
爱发电

💬 在 s-complex/discussions 上发表你对本文的看法。