本文是一组系列文章的上篇,供所有读者免费阅读。如果你对本文的后续部分感兴趣,或者希望看到更多类似的深入指南,请考虑成为少数派会员,获得更多专属内容。
引言
「自部署」是进阶玩家绕不过的课题。在云服务价格越发高企的大背景下,自部署可以用更低的成本获得更高的自由度、隐私性。
但部署在哪里呢?除了云主机、NAS 等传统选择外,近两年一个明显的新热点是迷你主机。这是因为随着处理器性能的提升,移动版和低功耗版处理器也足以胜任常见的计算任务,整机成本也比较低廉。于是,越来越多玩家选择入手迷你主机作为家庭服务中枢。1
接下来的问题就是装什么系统了。Windows 上可以运行更多日常使用的程序,交互起来也更方便,但能运行的服务相对不如 Linux 上多;Linux 则正好相反。
那么有没有同时能运行两种甚至更多系统的方案呢?
最容易想到的自然是在现有操作系统中安装虚拟机,例如通过 Windows 内置的 Hyper-V 管理工具、WSL 2,还有第三方的 VMware Workstation 等。但是,这些 2 类虚拟机管理器(Type-2 Hypervisor)的共同缺点是宿主机系统本身需要占用相当多的资源,并且 Windows(特别是面向消费者的版本)因为频繁更新、稳定性一般,并不是一个称职的服务器系统。
如果想要避免这些缺陷,就可以考虑使用 1 类虚拟机管理器(Type-1 Hypervisor),也称为虚拟化管理平台。如果把一台电脑想象成一个屋子,服务器虚拟化平台就相当于将其划分成独立的、适应不同需求的小房间。虚拟化管理平台不依赖于宿主操作系统(其本身就可以看成一种操作系统),离底层硬件更近,因此运行效率更高,也更稳定。
目前,市面上的虚拟化管理平台主要有 VMware vSphere、Hyper-V 和 Proxmox。其中,VMware vSphere 的核心组件 VMware ESXi 曾经可以免费下载,又因为 VMware 的生态和招牌在外,一度是一些玩家的首选。但博通收购 VMware 后见钱眼开,将所有的 VMware 产品都转向了订阅制,开源、社区支持广泛、用户界面友好的 Proxmox 就成了家庭用户几乎唯一的低成本选择。这就是我们今天要介绍的主角。
下面,本文将依次介绍 Proxmox 的优势以及安装方式,并在后续的文章中演示如何用 Proxmox 虚拟化系统和程序以及 Proxmox 上的高级设置,来全方位让读者了解如何从零开始搭建一个家庭服务中心。
安装 Proxmox
Proxmox 有两种官方安装方法,一是通过官方镜像安装,二是在 Debian 的基础上覆盖安装。一般推荐使用方法一,问题比较少,下面简单演示步骤。
准备
在安装以前, 首先要准备 (1) 一台需要安装 Proxmox 的电脑,(2) 一个至少 8G 的 U 盘,以及 (3) 从 Proxmox 官方下载的安装镜像。用镜像烧录工具(如 Etcher)把镜像烧录到准备好的 U 盘里。
接着,在电脑的 BIOS 设置里打开虚拟化。Intel 的称为 Intel® Virtualization Technology for Directed I/O (VT-d)或被称为 VT-x;AMD 则称为 AMD-V。其他处理器则需要根据具体情况,按需设置。此外,还需关闭安全启动,并将引导顺序改为 U 盘优先。
重启后进入安装界面,选择「Install Proxmox VE」。同意用户协议后,在「Target Harddisk」这一步可以考虑点击「Option」展开更多设置做一个简单的调整,从上到下依次为:
- 文件系统:如果你的主机有相当充足的内存(通常是大于等于 32GB 的情况),可以选择
zfsbtrfs
这样更安全的文件格式,否则我建议使用ext4
。关于zfs
的介绍可以参考这份文档。 - hdsize:可以简单理解要不要使用整个硬盘,一般就是硬盘的最大值。如果你懂得 Linux 指令,打算留一部分空间给别的用途,那么这边可以根据需求灵活调整。后续 swapsize+maxroot+minfree+maxvz 总容量等于 hdsize。
- swapsize:Linux 中的交换空间大小,可以简单理解为内存不足时可以用多少硬盘空间当作内存。默认是已安装内存的大小,最小为 4 GB,最大为 8 GB,且不能超过 hdsize/8。可以设置为 0,这样就不会创建 swap 空间了。
- maxroot:可以简单理解为安装 Proxmox 的空间有多大,最大不能超过 hdsize/4.
- minfree:可以简单理解为虚拟机硬盘的快照保存空间。如果硬盘超过 128GB ,minfree 默认保留 16GB,否则建议是 hdsize/8。
- maxvz:存放虚拟机的数据卷最大空间,也就应该是这里填写数字最大的选项。
如果用的是 zfs
这样更安全也更复杂的文件系统,可以参考 Proxmox 的文档做更细致的调整。
接着设置地区、时区、键盘键位、root 密码等常用设置。在 FQDN(域名)一步,如果不打算暴露在公网(也最好不要),可以随便起一个名字。
安装完成以后就会自动重启。如果在局域网内访问安装时指定的 IP 地址(默认为 8086 端口)能看到 web 管理界面,就表示安装成功了。
在 Proxmox 里安装虚拟机
经过安装步骤以后,终于可以开始正式在 Proxmox 中安装虚拟机和容器。
在此之前,先铺垫一些基础知识——Proxmox 管理界面的右上角有两个显眼的按钮「创建虚拟机」和「创建 CT」(LXC 容器)。它们有什么区别呢?
前面提到过,如果把一台电脑想象成一个屋子,Proxmox 就能够将其划分成独立的、适应不同需求的小房间。
虚拟机:这种方式隔离出来的是全功能的「套房」,有自己的厨房、卫生间、客厅等设施,和其他房间完全不共享。也就是说,每个虚拟机都有自己的操作系统,完全模拟了一台独立的计算机中的硬件设备和软件;虚拟机隔离性更好,虚拟机内部的操作和应用都不会影响到其他虚拟机,但也相对占用主机资源。
LXC 容器:这种方式划分出的更像是大楼中的开放式办公空间,虽然每个空间看起来是独立的,但是会共享走廊、卫生间这样的公共设施。虽然每个容器内可以运行不同的应用和服务,但容器都共享宿主机操作系统的基础组件,不需要为每个容器都复制一遍操作系统,运行效率也相比虚拟机高效且节省资源。
因此,Windows、BSD 这样的非 Linux 系统最好用虚拟机运行,而 Ubuntu、Docker 这样的 Linux 发行版或基于 Linux 的软件则可以运行在 LXC 容器中。
实例:安装 Windows 11 虚拟机
下面将以大家熟悉的 Windows 11 为例,来介绍 Proxmox 中虚拟机安装流程。
准备
从微软官网下载 Windows 11 官方镜像2,如果你希望在 Windows 中体验到更好的虚拟化性能,我的建议是再需要从开源社区下载 Virtio 的 Windows 驱动的 ISO 版本。然后将下载好的文件上传到可以存储 ISO 镜像的地方,一般情况下叫做 local
,来方便在后续安装时调用。
设置虚拟机
接着「创建虚拟机」,确认安装的「节点」,填入数字唯一的「VM ID」和不能有空格和特殊字符「名称」就可以「下一步」了。
在「操作系统」步骤中,「使用 CD/DVD 光盘镜像文件(ISO)」中找到 刚刚上传到 local 里的 Windows 11 镜像文件,在「客户机操作系统」里选择「Microsoft Windows」和「11/2022」,勾选「为 VirtIO 驱动程序添加额外驱动器」并找到 刚刚上传到 local 里的 VirtIO 驱动镜像文件。
接下来「显卡」下就可以选择性能最好的「VirtIO-GPU」和「VirtIO SCSI single」,如果你后面还打算让 Proxmox 可以自动化管理3 Windows,那么可以把「Qemu 代理」也钩上。因为 Windows 11 默认安装需要 UEFI 和 TPM,所以还确认机型是较新的「q35」并使用「OVMF(UEFI)」作为 BIOS,添加「EFI 存储」和「TPM 存储」到「local-lvm」里。
接着就是添加「硬盘」,因为 要创建的最现代的 Windows 11,所以在「总线/设备」中应该优先选择「SCSI」,具体而言选项之间有如下区别,其他选项需要移步 Proxmox 官方文档:
- SATA:2003 年开始替代 IDE 的磁盘控制器,允许更高吞吐和更多的设备连接。但在 Proxmox 项目中维护的情况可能不如下面 2 个。
- SCSI:最初设计于 1985 年的服务器硬件连接器,可以连接最多 14 个其他硬件。VirtIO SCSI single 在性能表现上是最好的,此外勾选「IO Thread」有助于进一步提升性能。
在「缓存」的设置也相对复杂,不过如果你想在安全和性能之间两者兼得那么建议使用无缓存;如果你希望有更好的硬盘性能,且接受在极限情况下才会出现的数据丢失风险,那么请选择 Write Back。具体而言每个选项的含义如下:
- 无缓存:不使用宿主机的缓存(一般为内存),但使用硬盘上的缓存。所有的读写操作直接交互到物理存储设备,不经过宿主机的缓存系统。尽可能避免数据损坏,并尽量保证数据完整性。此外,如果你 Proxmox 中的硬盘存放目的地是 ZFS 文件系统,也请选择无缓存。
- Direct Sync:既不使用宿主机的缓存,也不使用硬盘上的缓存。每一个写的操作都会立刻同步到物理存储设备。当你需要完全避免数据损坏并确保数据完整性时,特别是希望搭建一个不含 UPS 备份电源的存储系统(如 NAS)时,请选择这个。
- Write through:使用宿主机的缓存,但不使用硬盘上的缓存。每个写入操作在立刻同步到物理存储设备的同时,并写入到宿主机的缓存,但只有在完全写入到物理存储设备时才会认为写入完成。安全性和「无缓存」相当,但 Write through 在读取时可以从内存中直接获取数据,读性能相对更好;而「无缓存」借助硬盘上的缓存,写性能相对更好。
- Write back:使用宿主机的缓存,也使用硬盘上的缓存。写操作会在写入到宿主机的缓存时就报告完成,但可能正在写入硬盘(甚至可能硬盘上的缓存都没有写完),这时候断电会导致数据丢失。虚拟机稍后还需要发送一个 flush 指令,来确保数据已经安全写入硬盘。Write back(不安全)则是跳过了这个 flush 指令,因此 Write back(不安全)也不应该用于存储重要数据的虚拟机中。
如果你的虚拟机硬盘即将放在一个 SSD 里(比如我的 local-lvm 就是 SSD 的),那么「丢弃」也请钩上,这个选项告诉虚拟机这块硬盘是个 SSD,来启用 trim 命令。在这一步最好还需要勾选右下角的「高级」选项,并勾选「SSD 仿真」选项。
CPU 设置中自由分配「核心」数,「类别」则拉到底选择「Host」4;内存也可以自由分配;网络选择桥接到之前设置好的「vmbr0」上,模型选择性能最好的「VirtIO(半虚拟化)」,有 VLAN 调整需求的话,还可以在这里输入「VLAN」数值,最后完成即可。
如果你还有其他希望添加、调整的硬件,比如希望把 U 盘接入到虚拟机中,这时可以通过「硬件」做额外的调整。接着启动虚拟机就能进入安装步骤了。
其他需要注意的细节
如果你和我一样采用的是 Virtio 相关的选项,那么在安装 Windows 之前还需要加载 SCSI 驱动以及网卡驱动,不然在安装的时候会找不到硬盘、或者卡在欢迎界面进不去系统。具体而言,点击「安装」>「输入/跳过序列号」>「选择想要的版本」>「同意用户须知」>「自定义安装」时,是看不到任何驱动器的。
你需要点击「加载驱动」>「浏览」,找到 Virtio 驱动所在的光盘,分别找到 SCSI 驱动「vioscsi」、网卡驱动「NetKVM」,找到「w11」下的「amd64」文件夹,最后点击 OK 即可在安装驱动界面看到这个驱动,安装时也只需要点击「Next」即可完成。
安装完成进入系统以后也记得,找到 Virtio 驱动所在的光盘里的「virtio-win-gt-x64」和「virtio-win-guest-tools」来完成其他必要驱动和辅助程序的安装。
安装 LXC 容器并运行 Docker
相比于直接安装在 Proxmox 物理机上,LXC 容器运行 Docker 不仅更安全、可以直接控制可以使用的资源、也可以整体打包备份加强安全性,而且 LXC 容器和宿主机共享一套架构,性能开销趋近于零。所以在 LXC 容器里运行 Docker 才是最正确的方式。此外, 还能在 LXC 容器里直接运行其他 Linux 程序,相对 Docker 的依赖也能小很多。
准备
前往 Proxmox 中可以存放「CT 模版」的存储区,一般情况下称为 local
,点击「模版」,下载适合自己的系统模版。我个人比较喜欢以稳定而闻名的 Debian Stable,所以后续的内容也以 Debian 12 为例,大家可以根据自己的喜好选择其他的发行版。
设置 LXC 容器
接着「创建 CT」,和虚拟机一样确认安装的「节点」是不是希望的那个,填入数字唯一的「VM ID」和不能有空格和特殊字符「名称」。勾选「无特权的容器」和「嵌套」,「嵌套」指的是嵌套虚拟化,可以在虚拟环境中使用其他虚拟化软件。
设置「密码」或「SSH 公钥」,就可以进入下一步「模版」了。模版部分也很简单,找到刚刚下载好的模版,选中即可。
其他的设置内容这里也不再赘述,可以根据需求灵活陪孩子,最后直接点击「完成」即可。
接着,前往这个 LXC 容器的「选项」里启用「按键」「FUSE」,来满足安装 Docker 时的需求。一般而言其他的 Linux 程序是不需要启用这两个选项。
容器内的设置步骤
设置完成容器以后,即可用 root
和刚设置的密码或 SSH 私钥登录容器了。按照惯例输入:
apt clean && apt update #清除 apt 缓存,并更新 apt 缓存
#替换清华 Debian 镜像 https://mirrors.tuna.tsinghua.edu.cn/help/debian/
apt install -y fuse-overlayfs #安装 fuse-overlayfs 组件
ln -s /usr/bin/fuse-overlayfs /usr/local/bin/fuse-overlayfs #在两个文件夹之间创建软连接
接着跟着 Docker 官方文档安装 Docker,国内用户同样可以用清华的 Docker 镜像 安装。
#删除有的 Docker 相关内容
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done
#安装必要下载 PGP 密钥所需要的依赖
apt-get install ca-certificates curl gnupg lsb-release
# 添加 Docker 的 GPG 公钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# 将 Docker 官方源添加到 apt 库中
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启用 Docker 守护服务
systemctl enable docker
安装完成后,可以用docker run hello-world
测试 Docker 是否安装正常。最后就可以在 Docker 里运行其他你希望运行的应用了,比如我就在家 LXC 容器里运行了 AdGuard Home 和 HomeBridge。