安装 PVE 驱动的个人虚拟化实验环境

status
Published
type
Post
slug
my-homelab-powered-by-pve-install
date
Dec 26, 2023
tags
PVE
Linux
Config
DevOps
summary
PVE 是一款个人虚拟化环境软件,可以在小型主机或老旧笔记本上安装,提供虚拟化环境来构建自己的 HomeLab。安装 PVE 的步骤包括准备引导工具、下载安装 PVE 镜像、配置软件源、创建模板等。通过 PVE,可以方便地管理和部署虚拟机,进行基础设施即代码的实践。

准备

引导工具

使用 Ventoy 来将U盘制作为启动设备
2023-12 当前正式版 Ventoy 无法启动 PVE 8.1,需使用 CI 版本:https://github.com/ventoy/Ventoy/actions/runs/7088423200

PVE 镜像

当前最新版本 8.1

安装

可参考官方 wiki 说明:
Installation - Proxmox VE
////////////////////////////////////////////////////////////////////////// // asciidoc JS helper for Proxmox VE mediawiki pages // // code based on original asciidoc.js, but re-written using jQuery // ////////////////////////////////////////////////////////////////////////// var asciidoc = { toc: function ($content) { // toc generator var tocholder = $content.find('#toc'); if (!tocholder) { return; } tocholder.html(''); tocholder.hide(); var html = "<div id=\"toctitle\"><h2>Contents</h2></div><ul>"; var n = 0; $content.find("div.sect1").each(function(){ var h = jQuery(this).find("h2").first(); var id = h.attr("id"); if (id != null) { n++; html += "<li class=\"toclevel-1\">" + "<a href=\"#" + id + "\">" + "<span class=\"toctext\">" + h.html() + "</span></a></li>"; } }); html += "</ul>"; if (n > 3) { tocholder.html(html); tocholder.show(); } }, // footnote generator footnotes: function ($content) { var noteholder = $content.find('#footnotes'); if (!noteholder) { return; } noteholder.html(''); // Rebuild footnote entries. var refs = {}; var n = 0; var inner_html = ''; $content.find("span.footnote").each(function(){ n++; var span = jQuery(this); var note = span.attr("data-note"); var id = span.attr("id"); if (!note) { // Use [\s\S] in place of . so multi-line matches work. // Because JavaScript has no s (dotall) regex flag. note = span.html().match(/\s*\[([\s\S]*)]\s*/)[1]; span.html("[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + "' title='View footnote' class='footnote'>" + n + "</a>]"); span.attr("data-note", note); } inner_html += "<div class='footnote' id='_footnote_" + n + "'>" + "<a href='#_footnoteref_" + n + "' title='Return to text'>" + n + "</a>. " + note + "</div>"; if (id != null) { refs["#"+id] = n; } }); if (inner_html) { noteholder.html("<hr>" + inner_html); } if (n != 0) { // process footnoterefs. $content.find("span.footnoteref").each(function(){ var span = jQuery(this); var href = span.find("a").first().attr("href"); href = href.match(/#.*/)[0]; // in case it return full URL. n = refs[href]; span.html("[<a href='#_footnote_" + n + "' title='View footnote' class='footnote'>" + n + "</a>]"); }); } } }; // add init to mediawiki resource loader queue (window.RLQ=window.RLQ||[]).push(function(){ // cannot use mw.hook directly here yet, the mediawiki.base module is not yet available mw.loader.implement('pve.doctoc', function() { mw.hook('wikipage.content').add(function($content) { asciidoc.toc($content); asciidoc.footnotes($content); }); }); });
安装完成后,即可根据过程中配置的IP地址,在同一局域网其他机器浏览器访问 https://IP:8006
用户名 root ,密码为安装过程中所配置的,登录成功即可看到如下界面
notion image

配置

订阅弹窗去除

sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/orig_cmd\(\); void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js systemctl restart pveproxy.service

软件源

  • 删除企业订阅源
rm /etc/apt/sources.list.d/pve-enterprise.list
  • Proxmox 软件源镜像
# 中科大源 echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list # 更新(可选) apt update && apt dist-upgrade
  • Debian 系统源镜像
# 中科大源 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 # 加入 non-free 仓库(可选) sed -i 's|contrib$|contrib non-free|g' /etc/apt/sources.list # 更新 apt update && apt-get install -y apt-transport-https ca-certificates --fix-missing
  • LXC 源镜像(CT Templates)
sed -i.bak "s#http://download.proxmox.com/images#https://mirrors.ustc.edu.cn/proxmox/images#g" /usr/share/perl5/PVE/APLInfo.pm wget -O /var/lib/pve-manager/apl-info/mirrors.ustc.edu.cn https://mirrors.ustc.edu.cn/proxmox/images/aplinfo-pve-7.dat systemctl restart pvedaemon
  • Ceph 源
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription" > /etc/apt/sources.list.d/ceph.list sed -i.bak "s#http://download.proxmox.com/debian#https://mirrors.ustc.edu.cn/proxmox/debian#g" /usr/share/perl5/PVE/CLI/pveceph.pm
如果是使用的老旧的笔记本电脑安装,可考虑如下配置
# 3 分钟后关闭屏幕,下次重启前有效 setterm -blank 3 # 持久化设置,需修改配置文件 vi /etc/default/grub # 修改内容如下 GRUB_CMDLINE_LINUX="consoleblank=120" # 保存后应用配置 update-grub # 合盖不休眠 sed -i 's/#HandleLidSwitch=suspend/HandleLidSwitch=ignore/g' /etc/systemd/logind.conf systemctl restart systemd-logind.service

创建模板

创建 Debian Cloud-Init Template

  • 选择镜像
这里我们选用 genericcloud-amd64.qcow2
  • 下载镜像
打开 PVE Shell
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
  • 创建虚拟机
# 创建 id 为 100,名为 debian-12-cloudinit-template,2C/2G 的虚拟机,其网卡 net0 桥接到 vmbr0,且跟随宿主机重启 qm create 100 --name "debian-12-cloudinit-template" --onboot 1 --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0 # 将下载好的 debian 12 cloud init 镜像导入到上一步创建的虚拟机,存储在 local-lvm qm importdisk 100 debian-12-genericcloud-amd64.qcow2 local-lvm # 将导入的磁盘镜像以 scsi 驱动器的方式装载到虚拟机的 scsi 控制器 qm set 100 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-100-disk-0 # 将上面导入了 debian-12 镜像的磁盘设置为可启动并限制 BIOS 仅从该磁盘启动 qm set 100 --boot c --bootdisk scsi0 # 添加 cloud-init CD ROM 驱动器,用来提供 cloud-init 参数给虚拟机 qm set 100 --ide2 local-lvm:cloudinit # 如果没有通过 xterm.js 访问虚拟机的需求,可不执行 qm set 100 --serial0 socket --vga serial0 # 启用 QEMU Guest Agent 功能 qm set 100 --agent enabled=1 # 核对确认虚拟机配置 qm config 100
notion image
此时如无特殊需要或问题,就可以把此虚拟机转换成模板了,执行命令: qm template 100 。但为了使用更顺手,我还希望对此虚拟机做一些配置后再转换为模板。
Cloud-Init 页面配置说明
用户
  • 系统内第一个非 root 用户的名称,可自定义(建议配置)
  • 若未配置
    • 系统启动后不会新增用户,默认使用 root 用户
    • 默认允许 root 用户通过 SSH 登录
密码
  • 系统内第一个非 root 用户的密码,可自定义(建议配置)
  • 若【用户】未配置,则此处的密码则为 root 密码
DNS 域 / DNS 服务器
  • 留空则使用 DHCP,配置了则使用静态 DNS
SSH 公钥
  • 若未配置,则 SSH 允许通过密码登录
  • 若已配置,则 SSH 禁止通过密码登录,仅允许通过公钥对应的私钥登录
IP 配置
  • 可分别配置对应网卡的 IPv4 和 IPv6 地址策略
  • 支持静态 IP 或 DHCP
 
  • 配置虚拟机
启动刚刚配置的虚拟机,进入 Shell
软件源修改,文件位于 /etc/apt/mirrors/
echo "https://mirrors.ustc.edu.cn/debian" | sudo tee /etc/apt/mirrors/debian.list echo "https://mirrors.ustc.edu.cn/debian-security" | sudo tee /etc/apt/mirrors/debian-security.list
# sudo 免密码 (可选,cloud-init 似乎默认配置了) sudo tee /etc/sudoers.d/hk <<< 'hk ALL=(ALL) NOPASSWD: ALL' # 设置时区 sudo timedatectl set-timezone Asia/Shanghai # 更新 sudo apt update # 安装 qemu 代理 sudo apt install -y qemu-guest-agent # 启动 qemu 代理 sudo systemctl enable --now qemu-guest-agent # 安装软件包 sudo apt install -y htop git neofetch tree acpid # 清理 sudo apt clean sudo apt autoclean sudo apt autoremove # 清空 machine-id sudo truncate -s 0 /etc/machine-id /var/lib/dbus/machine-id
以上配置完成后,将虚拟机关机,执行命令 qm template 100 转换为模板。
在 Web 页面上可以查看该模板,后续即可在页面上基于此模板快速创建虚拟机了。当然也可以执行命令qm clone 100 101 --name vm101 --full 来进行该操作。
notion image
克隆配置说明
模式
  • 两种模式的区别
    • 链接克隆 :类似快照,磁盘上仅存储「克隆后的副本相对于模板发生变化的部分」,克隆后的虚拟机无法使用迁移功能,但优势是占用的磁盘空间较小
    • 完整克隆 :直接将模板对应的虚拟机磁盘文件全量复制一份,虚拟机中的任何改动,只会存储在自己的虚拟磁盘文件中,可以在 PVE 集群中自由地迁移
  • 如果 PVE 宿主机只有一台,即 PVE 是单节点模式部署的,那么此处可以随意选择
  • 如果 PVE 宿主机不止一台,且组成了集群,有节点迁移和高可用的需求,那么此处最好选择 完整克隆
VM ID
  • 可以自定义,也可以使用 PVE 默认的自增 ID
名称
  • 需要自己定义一个,开机后,cloud-init 会使用虚拟机名称作为虚拟机的 hostname
克隆完成后进入虚拟机的「硬件」页面,按实际需要调整虚拟机的硬件配置:硬盘、内存
处理器、网络等。
 
下一步准备使用 Terraform 来管理部署 PVE 中的虚拟机,体验一下基础设施即代码 (IaaS)。
 
 

参考致谢