PVE 折腾之旅

前言

因为要在服务器中跑几个大程序,云服务器的 2G 内存显得不是那么够用了,启动程序直接爆内存,于是还是上车了心水了很久的小主机,性能不需要太强,内存够大功耗足够小就 ok,目前整服务器 N100 的 U 性能完全足够了,看了下各大厂商的,感觉还是零刻的接口比较符合我的要求,畅网的四网口适合软路由,不过我有个斐讯 N1 作旁路由所以软路由暂时没需求,遂在闲鱼找了个卖家花 1k 左右整了个零刻 N100,带 16G DDR5 阿斯加特内存 + 250G 固态,均全新,后来了解到卖家是个厂商清库存的,算下单买的话价格其实也差不多,就直接上车了

之前 PVE 系统装在另一个 500G SSD 当中,跑了几个服务几个虚拟机将就用着,但由于我软硬件洁癖实在严重,这也一直搁置了,刚好现在有时间就又重新装一遍,这次选择装在 250G 固态上,文件系统也由 Ext4 改成了 Btrfs ,下文就沿着以前写的继续添笔了

PVE

入手之后便开始了虚拟化的折腾之旅,考虑到 ESXI 对部分硬件的兼容性不太行,就直接选择 PVE 了,ESXI 的好处是功能很完善,然后配置很简单,PVE 的话主要是基于 Debian 开发的,所以配置直通这块需要用到命令行操作比较多,不过也当练手 Debian 了

PVE 即 Proxmox Virtual Environment,也简称 Prxomox VE,安装 PVE 过程很简单,安装引导也很完善,安装步骤和安装系统类似

安装 PVE

PVE 官网下载 ISO 镜像

image-20230817115148418

下载之后制作安装 u 盘,可以用 rufus 擦除,我有保存 ISO 的习惯,所以选择了 Ventory,不需要擦除,直接把 ISO 文件拷贝进去就行

接下来忘了截图,就把大致步骤说下,可以参考具体视频看,比如司波图大佬的 AIO 教程

强烈建议主机连接网线接入可上网的路由器,这样后面配置管理地址的时候很方便

之后就是把 u 盘插入到主机上,然后惯例进入 bios,将首选启动项设置为 u 盘

选择安装硬盘,设置 root 用户的密码,邮箱可以接收虚拟机状态的订阅,然后点击下一步

host name 一般填的是 pve.lan,ip 地址最好同网段,网关和 dns 服务器接入网络自动配置(主要方便这一步,不过如果自己配置的话那就另说了,这些设置后面都可以通过命令行更改,所以无需担心,不过如果能开个好头后面就懒得操作了)

最后点击安装即可,安装完成后会自动重启,然后会显示一个命令行,上面有一行网址那个就是管理地址,一般是上一步设置的 ip 地址 + 8086 端口

浏览器中输入网址,输入用户名 root 和刚刚设置的密码然后就可以进入了:

image-20230818103942811

image-20230817120216299

更改默认源

由于 PVE 是基于 Debian 的,国内访问的话需要换 PVE 和 Debian 的源,这里使用的是中科大源,还是比较快比较稳的

命令行的话点击 pve 节点再点击 Shell

image-20230817120527917

操作和 Debian 差不多,记得先进行备份:

1
mv /etc/apt/sources.list /etc/apt/sources.list.bk

这里使用的是中科大镜像源

下面两条命令用来替换底层 Debian 系统的镜像源,可以自选命令替换,第二条主要替换的是 security 安全补丁源,这里我没替换 USTC 的镜像源,安全补丁官方相对于镜像源要更新的快些

1
2
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list

替换 pve-subscriptionpve-no-subscription,记得把 pve-subscription.list 中的自带官方源给注释了

1
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list

PVE 8.0 的 Ceph 源在 /etc/apt/sources.list.d/ 目录下,也进行换源操作:

1
2
3
4
5
if [ -f /etc/apt/sources.list.d/ceph.list ]; then
  CEPH_CODENAME=`ceph -v | grep ceph | awk '{print $(NF-1)}'`
  source /etc/os-release
  echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-$CEPH_CODENAME $VERSION_CODENAME no-subscription" > /etc/apt/sources.list.d/ceph.list
fi

之后执行命令进行更新:

1
2
apt update
apt upgrade -y

image-20230817135151615

如果需要使用 PVE 网页端下载 CT Templates,可以替换 CT Templates 的源:

1
sed -i.bak 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

重启服务:

1
systemctl restart pvedaemon.service

删除订阅通知

由于并未订阅,每次进入 PVE 界面都需要手动叉掉订阅通知,这里可以通过修改 /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js 来删除订阅通知

记得修改前先备份

直接把 Ext.Msg.show 改成 Ext.Msg.noshow 即可:

存储点

文件系统

Ext4

如果是 Ext4 文件系统,则 PVE 具有两个存储点,分别是 local 和 local-lvm

image-20230818113256125

PVE 默认安装的系统盘是基于 LVM 的结构:

  • pve-root 根目录
  • pve-swap 虚拟内存
  • pve-data 磁盘镜像存储

在 LVM 当中存在一个 thinpool 叫做 data,可以通过 lvs 命令进行查看:

image-20230818113651083

查看存储配置文件:

image-20230818113912145

local 存储点是一个 dir 类型的目录,可存放 iso 镜像、容器模板、VZDump 备份文件等

local-lvm 存储点则是 lvmthin 类型,其下有个名为 datathinpool,逻辑卷组 vgnamepve,可存放磁盘映像和容器

lvm-thin 的优点在于可以方便调整空间,但由于虚拟机是作为块设备进行存储,因此不能直接拷贝文件到其他地方进行备份或迁移,无法进行文件操作,且磁盘格式为 raw 无法修改,快照是基于块技术进行的

文件存储支持文件操作,如果需要快照,则需要使用 qcow2 磁盘格式

目前 qcow2 泛用于文件存储中,便于进行文件操作,因此不建议使用 lvm-thin 作为存储底层

这里直接删除 lvm-thin

Tips:删除之前需要将位于 lvm-thin 上的虚拟机移动到 local

数据中心 -> 存储 -> local,将 local 存储点的内容勾选所有,并点击 OK:

image-20230818120206505

先使用 df -h 查看当前存储:

image-20230818121353989

使用 lvremove /dev/pve/data 命令删除逻辑卷:

image-20230818121701884

再使用 lvextend -rl +100%FREE /dev/pve/root 命令将空间扩展至 pve-root

image-20230818122244114

再使用 df -h 查看当前存储,根目录已经扩容成功:

image-20230818122322510

网页上存储配置的 lvm-thin 也需要删除

后续创建虚拟机可以直接创建在 local 目录类型下,并且也便于进行备份,格式需要选择 qcow2

image-20230818122815873

Btrfs

Btrfs 文件系统创建的 PVE 很干净,只有一个 local-btrfs 存储

Virtual Machine

个人服务器需要用到 Docker 服务,PVE 支持 lxc 容器,目前网络上很多教程是在 PVE 上创建 lxc 容器后在容器内部部署 Docker 服务,并根据不同 Docker 服务的需求通过多个 lxc 容器进行业务隔离,相对于 VM 来说,lxc 容器的性能较优,基于宿主机内核进行运行

lxc 是系统容器,docker 是应用容器,lxc 注重的是系统隔离性,但有些 docker 服务需要用到 lxc 的特权容器,非特权容器对有些 docker 服务不兼容,开特权容器的话又破坏了 lxc 隔离性的初衷,可能对宿主机文件进行修改,于是这里选择另开一个虚拟机,直接将 docker 服务部署在整个虚拟机上,虽然有性能损耗,但还是能用的(

系统选择的是 Debian 12,首先点击 local 存储点的 iso 镜像进行镜像上传:

image-20230818123808830

然后点击右上角的创建虚拟机:

image-20230818124229649

image-20230818124452165

image-20230818124541011

image-20230818132220058

image-20230818133318305

image-20230818133642221

image-20230818133715994

image-20230818133751393

如图,已经创建成功了:

image-20230818133833537

接下来按正常流程安装即可,其他系统的虚拟机创建类似,这里不再赘述

控制台

PVE 对虚拟机有三种控制方式:

  • novnc:默认的远程控制,可以直接调用一些热键,比如 ESC、Ctrl、关机、重启等,具有强大的硬件控制功能
  • spice:需要 virt-viewer 插件支持,将显示适配器设置为 SPICE 之后,支持 spice 控制台,相当于虚拟机控制台,可以添加 usb 映射高级功能,适用于图形界面
  • xterm.js:串口控制台,依靠串口实现,使用串口显示,需要添加虚拟串口设备后支持 xterm.js 控制台,lxc 自带,适用于命令行操作

由于默认的 novnc 无法复制粘贴,这里提供添加 xterm.js 支持的方法:

  • 将虚拟串行端口添加到 VM,vmid 为虚拟机的 VMID,serial0 为串行端口

    1
    
    qm set vmid -serial0 socket
    

    也可以直接在图形界面添加,这里不做演示

    添加完后重启虚拟机,在虚拟机终端输入以下命令,查看串口 ttyS0 是否成功添加:

    1
    
    sudo dmesg | grep ttyS0
    

    image-20230819150732973.png

  • 修改 grub 启动参数,将终端信息输入到串口,编辑 /etc/default/grub 文件:

    1
    
    GRUB_CMDLINE_LINUX="quiet console=tty0 console=ttyS0,115200"
    

    quiet 意味着在启动过程中,只显示关键的启动信息,同时将控制台信息发送到屏幕输出以及特定串行端口即 ttyS0,并设置数据传输速度为 115200

  • 更新 grub

    1
    
    sudo update-grub
    
  • 重启 vm,之后即可正常使用 xterm.js 进行远程控制

    image-20230819151425309

SSH

安装服务器必备的 SSH

  • 安装 SSH 服务器

    1
    
    sudo apt install ssh
    
  • 设置 SSH 服务开机自启

    1
    
    sudo systemctl enable ssh
    
  • 启动 SSH 服务

    1
    
    sudo systemctl start ssh
    
  • sshd 配置文件在 /etc/ssh/sshd_config,根据需要自行修改相关配置

  • 最后重启 SSH 服务

    1
    
    sudo systemctl restart ssh
    

Docker

参照官网安装手册,由于我是 Debian 系统,使用中科大源的时候只需要将 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可

其他系统安装方法参照 官方安装文档,换源方法参照 Docker CE 源使用帮助

注意:docker compose 目前更改为 v2 版本,替代了原先的 docker-compose v1 版本