Proxmox VE 初使用

等了接近 4 个月,小主机硬酷 R1 终于发货了。买这个小主机的原因是 QNAP 453B Mini 负载过重(跑了十几个 Docker)在 R86S 和硬酷 R1 之间纠结了比较久,最终还是迫于颜值选了 R1 的顶配版(N6005+16G 内存+NVME SSD 接口),体积十分小巧,4 个 2.5G 网口,差不多都可以做硬路由器了。

最初规划是将 NAS 上的所有 Docker 全部迁移到 R1 上,让 NAS 回归存储的功能,同时也可以将 NAS 作为 R1 的远程存储使用。既然 R1 的性能这么强,那么不装个 Proxmox VE 虚拟机环境跑更多东西压榨一番的话确实有点浪费。于是下面是我的折腾记录。

阅读更多

Proxmox VE(以下简称 PVE)是一个虚拟化平台,你可以理解为「整个系统就是为了跑虚拟机而生的」。PVE 是基于 Debian 的封装,相当于在原版 Debian 上安装了一大堆虚拟机管理相关的私有包。所以之前 Debian 的使用经验,在这里差不多都可以直接用。

来电自启

一个优秀的小主机一定要有来电自启的功能。这样当发生一些意外断电之后,只要来电,里面跑的服务就能重启,很是方便。

开机按 F2 进 BIOS,在「Chipset->PCH Configuration -> State After G3」,将值改为「S0 State」就好了。保存退出。吐槽:这 BIOS 设置项确实不咋友好。

装系统

去官网下载 PVE 最新版安装包(我下载的是 7.3 版本),用 balenaEtcher 制作安装 U 盘。开机,F2 进 BIOS,在 BIOS 里关闭 SecurityBoot,使用安装 U 盘引导启动。进入安装向导后,无脑下一步下一步即可。安装过程中,IP 设置比较重要,设置成一个不和当前路由器/网关冲突的又好记的 IP 即可,然后 DNS 改为路由器/网关的 IP,或者使用一些公共 DNS 即可。安装系统大概需要 3 分钟左右。

安装好后,插网线,重新开机,用浏览器进入。主要注意的是,默认的 HTTPS 端口是 8006,也就是说你需要输入 https://IP:8006 才能进入。注意一定是 https。用户名是 root。

进入系统后,左边是硬件相关。「数据中心」是上帝视角,下面的「pve」是我们的这台主机;下面会有两个节点,一个是「local(pve)」是和「如何创建虚拟机」有关的,比如虚拟机镜像啥的都在这里管理,另一个是「local-lvm(pve)」是和虚拟机的存储有关的,比如各个虚拟机的磁盘都是在这儿管理的。其实改成「文件夹视图」的话,各种概念会更清楚一点。

我这里遇到了点问题:好像是自己的固态硬盘(三星 PM991 NVME)和 R1 咋的不兼容,如果直接把 SSD 放在机器里的硬盘位,那么就各种报错(提示 PCIe Bus Error: severity=Uncorrected(NonFatal), type=Transaction Layer (Receiver ID) device [8086:4db8] error status/mask=002000000/00000000 [21]ACSViol (first)),无法正常进入安装程序。不仅仅是 PVE,安装 Debian 也是如此。所以装系统的时候,我先将 SSD 放在了硬盘盒里,当成移动硬盘来挂载,这样没出啥问题。装好后,想把 SSD 还安装回机器里,但一装回机器就报错,无法启动……所以只好继续用移动硬盘模式来搞。(后来又在原商家处买了个 256G 的定制版 SSD……

网络相关

看到好多教程都说需要去改文件才能改 IP。其实吧,UI 上可以完成这个事儿。

点击「数据中心 -> pve」,右边有「系统 -> 网络」,在这里改掉 IP 即可。

另外,安装过程中会让你填 DNS,默认是 127.0.0.1。这个设置会导致 PVE 不能联网。一般来说需要改成路由器/网关的 IP。如果你有自己的 DNS,或者想用例如 223.5.5.5 的公共 DNS ,也可以直接在中间菜单的「系统 -> DNS」里改掉。

软件源

我自己之前被镜像源坑过,自那之后一直都用的是官方源。那有人会问了,如果官方源速度巨慢怎么办?没有什么是一个代理解决不了的事儿。

由于我们没有买 PVE 的企业版付费订阅,所以 apt update 会一直报错(遇到更新 pve 相关的源,就报 401 错误)。我们需要将付费订阅源换成免费无订阅源。

点击「数据中心-pve」,中间菜单有「更新-存储库」。首先在列表里选中 https://enterprise.promox.com/debian/pve,然后点击上方的「禁用」,这样就禁用了需要付费订阅源。再点击旁边的「添加」,在列表里面选「Non-Subscription」就好了。这样,我们既可以收到 PVE 的安全更新,又不用付费。

然后呢,点击「数据中心 -> pve」,中间菜单有「Shell」,放心大胆地 apt updateapt upgrade -y 吧~

虚拟机

PVE 不就是用来跑虚拟机的嘛~

普通虚拟机

首先需要将系统镜像上传到 PVE 里。点击「数据中心 -> pve -> local」,中间菜单有「ISO 镜像」。点击「上传」,可以上传你本机的镜像;如果你网络比较好的话还可以试试「从 URL 下载」。再或者,你也可以将镜像直接传(或者下载)到 /var/lib/vz/template/iso/ 文件夹里。

然后就是创建虚拟机啦。大大的「创建虚拟机」就在右上方。按照向导来走,没啥坑:选中 ISO 镜像后,右边「客户机操作系统」最好选与之匹配的信息;磁盘、CPU、内存啥的按照需求来选大小就是了。那还有啥难的?用就是啦~

由于 Windows 比较耗资源,所以可以找找各种精简版系统。除了国内的那些,最近发现一个叫「AtlasOS」的 Win10 精简版还不错,2C2G 就能流畅跑起来。至于各种 Linux 嘛,1C1G 就能玩出各种花了。

OpenWRT

OpenWRT 其实是「导入」。就是说,你下载到的东西,其实是个虚拟机磁盘(而不是安装包),是一个已经做好了的能跑的虚拟机,我们只需要将它跑起来就好了。

我们先新建个虚拟机:「VM id」你随便填一个(例如 100),推荐勾选「开机自启」,「操作系统」那里选「不使用任何介质」,「磁盘」那里在左侧全删光,「网络-模型」那里推荐选「半虚拟化」。然后不开机。

然后从 OpenWRT 官网上下载镜像。「型号」选 Generic x86/64,下方的各种镜像随你选。其中带有 squashfs 的镜像具有「一键恢复出厂设置」的神奇 feature,简直手残党的福音。下载下来后,将.img.gz 文件解压成.img 文件(命令为 gzip -d your_file.gz ,或者你用 7z 等工具来解压也成),然后将.img 文件上传到 PVE 里,方式同前述。或者你也可以先进入 PVE 的节点 Shell,然后进入到 /var/lib/vz/template/iso 文件夹,直接将心仪的镜像下载下来,最后用 gzip -d your_file.gz 解压,效果都是一样的。

左侧点击「数据中心 -> pve」,从中间菜单进入 PVE 的节点 Shell,再进到 /var/lib/vz/template/iso 文件夹。然后输入 qm importdisk 你的 VMID 你的镜像文件名 local-lvm ,就能将镜像导入到虚拟机里面。或者说,我们给了虚拟机一个装有 OpenWRT 系统的硬盘了。

下一步,让虚拟机使用这个装有系统的硬盘。点击你创建的虚拟机,菜单中找到「硬件」,会发现果然多了一个「未使用的磁盘」,双击之,然后直接点击「添加」。这时候可以看到磁盘的大小为 124M。这 124MB 磁盘里面有 87MB 是空闲的,如果你是 OpenWRT 的重度使用者,那么 87MB 也凑合够折腾好久了。但如果你说不够用,那么我们可以选中这个磁盘,点击上方的「Disk Action – Resize」来调整磁盘大小。讲真,完全没必要分配超过 512MB 的磁盘空间,你用不完它的。

最后一步,在「选项」里面找到「引导顺序」,双击之,在对话框内将我们新添加进去的「硬盘」打勾,将这个硬盘拖动到最前面,并去掉其他东西(例如网络、CD)前面的勾。注意要点击「OK」哈,别点成旁边的「Reset」了。

到这里,我们就可以放心大胆去启动这台 OpenWRT 虚拟机了。但此时,这台 OpenWRT 的 IP 地址是 192.168.1.1,可能和我们的路由器啊啥的冲突,或者不在我们需要的网段内,导致其他设备(例如你现在在用的这台电脑)连不上这个 OpenWRT。那么我们可以 vi /etc/config/network/ ,将里面的 lan 段的 192.168.1.1 改成我们期望的 IP 地址(比如 192.168.1.10 啥的,反正不要和路由器、网关、PVE 的 IP 地址冲突即可),保存退出,最后使用 /etc/init.d/network restart 重启网络。这样我们在浏览器里就可以访问刚才设定的 IP 地址,连上这台性能强劲的高端 OpenWRT 有线路由器,为所欲为了。目前来说,只有一个 LAN,没有 WLAN。如果需要添加 WAN 或者添加其他网口,还需要做另外的一些事情。

点击「数据中心->pve」,再中间菜单里找到「系统-> 网络」,会发现已经有一个 vmbr0 的设备,它在用 enp1s0 ,也就是第一块网卡。我们照虎画猫,依次把 enp2s0~enp4s0 添加为 vmbr1 ~ vmbr3 ,里面的各种设置都和 vmbr0 保持一致。然后回到那个特殊的虚拟机里,在中间菜单里面找到「硬件」,点击「添加-网络设备」,然后依次把新创建的 vmbr 都添加进来就好了。

什么?直通?不存在的!你觉得我是会在意那点点性能损失的人么?你觉得我是会去折腾直通的人么?另外,「直通」之后,这个网口就只能给这个虚拟机来用了,其他设备都不能再使用这个设备了,我觉得不划算。

PS:对于 OpenWRT 来说,请尽量使用 WebUI(LuCI)进行操作,没事儿不要进 ssh 里面瞎搞。ssh 里面改配置文件能完成的事儿,LuCI 里面也几乎都能完成。

Debian?

我们会发现,在 EC2 或者其他云平台上,重装系统的时候,并没有说让我们走安装流程,而是直接提供了一个「安装好了的」系统镜像给我们用,就像上文 OpenWRT 那样。这个是怎么实现的呢?找了点资料,发现是通过「Cloud Init」和「Cloud Image」实现的。

首先,去下载 Debian 的云镜像。按照说明,我们可以下载文件名中带 generic 或者是带 genericcloud 字样的文件。我自己是推荐下载后缀名为 .qcow2 的镜像文件。

下载好后,参照前面 OpenWRT 的方法,创建不带硬盘的虚拟机,然后在中间菜单的「硬件」里面添加「CloudInit 设备」,再去中间菜单的「CloudInit」里面设置用户名、网络等信息,最后将这个云镜像使用 qm importdisk 你的 VMID 你的镜像文件名 local-lvm 导入到虚拟机内,并设在中间菜单的「选项-> 网络」里置好启动顺序即可使用。

CloudInit 镜像还有一点好处是可以十分方便地使用 xterm.js。VNC 里面复制粘贴都很不方便,但 xterm 里面就可以。具体方法嘛,在「硬件」里面添加一个「串行接口」就好了。如果不是 CloudInit 镜像,那么你需要先添加一个串行接口,然后去虚拟机里面编辑 /etc/default/grub 文件,将 GRUB_CMDLINE_LINUX 的值修改为 "console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0" ,然后使用 update-grub 来更新 grub,然后重启虚拟机。

用 LXC 跑 Docker

我买小主机的最初需求是啥?跑 Docker 啊!关于 Docker,我其实蛮纠结的。其实跑 Docker 有三种方式:

  1. 按理说,PVE 是基于 Debian 的,那么直接在宿主机上安个 Docker 其实就成了,最多了再来个 portainer 方便使用
  2. 另一种方法是,自己起个 Debian 的 VM,把所有 Docker 都跑在这里面
  3. 但是大家都说,在 PVE 里面使用 Docker 的最佳方式是用 LXC 容器。也就是说,新建一个特殊的虚拟机,然后把 Docker 都跑在这个虚拟机里面

我也不知道为啥大家都选了 LXC 方案(可能仅仅是因为基础占用比较少,裸系统仅占 35MB 内存),就是说在 PVE 里面跑个系统容器(算是一个特殊的 Linux 虚拟机),然后再在这个特殊的 Linux 虚拟机里面跑 Docker。反正威联通的选择和大家的选择比较类似,不过它是用的 LXC 的升级版——LDX,并且天天给我说「我们已经放弃 LXC 啦~用 LXD 吧!」。但我在 PVE 的 FAQ 里面查到了一句话:

If you want to run application containers, for example, Docker images, it is best to run them inside a Proxmox Qemu VM

并且在 PVE 的 LXC 的介绍里面查到了这样一段话

If you want to run application containers, for example, Docker images, it is recommended that you run them inside a Proxmox Qemu VM. This will give you all the advantages of application containerization, while also providing the benefits that VMs offer, such as strong isolation from the host and the ability to live-migrate, which otherwise isn’t possible with containers

点击「数据中心-pve-local」,右边有「CT 模板」(在 PVE 里,「CT」好像是「Container/容器」的简称)。点击「模板」,里面列出了一大堆模板,我觉得叫「基础 OS」是不是更合适啊……找一个顺眼一点的(例如 debian-11-standard),点击「下载」就完事儿了。

还是由于你懂得的网络问题,在国内下载这些模板似乎并不顺利,几分钟才下载 2KB 的数据。解决办法么……你看,下载 Log 窗口里第一句话写的是啥?是不是「将 XXX 下载到 XXX」?哎这就好办了。我们将这个东西复制出来,将下载停掉,回到节点 Shell 里面,设置好代理,然后进入到目标文件夹(/var/lib/vz/template/cache/),直接用 wget 下载就好了。当然~如果你有旁路由网关,也可以在「系统-网络」那里设置一下网关,走自动代理。好像记得还有办法手动设置走代理来着,写这个文章的时候突然找不到了。

然后就是「新建 CT」。步骤其实和新建虚拟机是一模一样的。我尝试后发现,需要不勾选「无特权容器」,新建完成后,在「选项」里面开启「嵌套」就能正常跑 Docker 了;如果选上「无特权容器」,那么后续不管是在 feature 里开启「嵌套(nesting)」还是开启「按键(keyctl)」,Docker 都报错。

进入系统后,你会得到一个最小化安装的纯净版 Linux,我们需要自己安 Docker。先 apt update 然后再 apt upgrade -y ,最后再用 apt install docker 安装 docker,或者按照 Docker 的官方教程来走。由于我们自己就是 root,所以无需再把自己添加到 docker 组。如果发现 apt update 疯狂报错,先别急着换源和挂代理,先去这个 LCX 虚拟机的「网络」设置看看,eth0 那地方的 IP 和网关填了没,没填的话补上,或者选 DHCP 让自动分配也行。

对于我自己来说,老套路,先安个 docker-compose,再起个 portainer。这下爱咋折腾咋折腾吧,应该「我们都一样~」了。

遇到的问题

  1. 如果虚拟机死掉了,比如 CPU 占 100%,或者内存给干爆了,那么这个虚拟机会比较难关机。建议是,在最初折腾的时候,不要把虚拟机的「开机自启」给选上。这样遇到关不了机的问题的时候,可以直接重启主机。
  2. 使用 CloudInit 镜像,有时候会出现「虚拟机开机就死机」的情况,目前不知道是咋回事儿。
  3. R1 的风扇确实比较吵……晚上为了能睡好觉,建议设置个定时开关机。新版散热套装早点出来吧……这样就能 24 小时开机了。
  4. 我发现晚上关机的话,第二天早上机器是温温的……可能是待机功耗有那么一点点大?但,理论上来说就一个 LAN 远程启动,功耗不应该有那么大呀?

已发布

分类

作者:

标签

评论

《“Proxmox VE 初使用”》 有 3 条评论

  1. qiao 的头像
    qiao

    就是看了你这篇我也搞了个 PN41

  2. 硬酷R1 开发者 的头像

    来了,感谢老哥对 #硬酷 R1 的折腾分享!

  3. molezz 的头像

    linux allinone 平台相对于别家的优势就是 lxc/lxd 容器啦

发表回复

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