基底系统

不同安装媒介的区别

媒介Cloud ImagenetinstDVD
特性云镜像网络安装镜像完整安装镜像
文件格式qcow2, raw 等.iso.iso
安装向导无安装向导交互式安装向导交互式安装向导
网络依赖cloud-init安装时强依赖安装时不依赖
初始系统预装好的最小化系统从零开始按需安装从零开始按需安装
灵活性较低极高极高
最佳场景云平台、自动化脚本有网的物理机无网的物理机

综上所述,选择Cloud Image作为基底系统更符合PVE虚拟化环境!

下载基底系统

这里选择Debian13作为基底,选择genericcloud版本即可!

特性genericcloudgeneric
目标环境现代虚拟化平台老旧环境虚拟化平台
优化程度专为云环境优化更通用更广泛
推荐度强烈推荐仅作为后备或特殊情况选择

下载链接: Debian Official Cloud Images

定制镜像

本教程使用libguestfs-tools工具定制镜像

libguestfs-tools可以在不启动虚拟机的情况下,像操作本地文件一样,安全地对虚拟机磁盘内部的文件系统进行各种操作,本质上会挂载当前 Linux 系统的内核来启动一个 QEMU 虚拟机.

裁剪镜像

# 安装
sudo apt install -y libguestfs-tools

# 使用工具包中的 virt-customize 定制镜像
sudo virt-customize -a debian-13-genericcloud-amd64-20250911-2232.qcow2 \
  --smp 2 --verbose \
  --timezone "Asia/Shanghai" \
  --append-line "/etc/default/grub:# disables OS prober to avoid loopback detection which breaks booting" \
  --append-line "/etc/default/grub:GRUB_DISABLE_OS_PROBER=true" \
  --run-command "update-grub" \
  --run-command "systemctl enable serial-getty@ttyS1.service" \
  --run-command "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config" \
  --run-command "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config" \
  --run-command "sed -i 's/^#*PrintLastLog.*/PrintLastLog yes/' /etc/ssh/sshd_config" \
  --run-command "sed -i 's|Types: deb deb-src|Types: deb|g' /etc/apt/sources.list.d/debian.sources" \
  --run-command "apt purge iptables -y " \
  --run-command "sed -i 's|generate_mirrorlists: true|generate_mirrorlists: false|g' /etc/cloud/cloud.cfg.d/01_debian_cloud.cfg" \
  --update --install "sudo,qemu-guest-agent,spice-vdagent,bash-completion,unzip,wget,curl,figlet,net-tools,iputils-ping,iputils-arping,iputils-tracepath,nano,htop,dnsutils,nftables" \
  --run-command "systemctl enable nftables" \
  --run-command 'cat <<EOF > /etc/sysctl.d/99-custom.conf
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_ecn=0
net.ipv4.tcp_frto=0
net.ipv4.tcp_mtu_probing=0
net.ipv4.tcp_rfc1337=0
net.ipv4.tcp_sack=1
net.ipv4.tcp_fack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_adv_win_scale=1
net.ipv4.tcp_moderate_rcvbuf=1
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.ipv4.tcp_rmem=4096 87380 33554432
net.ipv4.tcp_wmem=4096 16384 33554432
net.ipv4.udp_rmem_min=8192
net.ipv4.udp_wmem_min=8192
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.ipv4.conf.all.route_localnet=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
EOF' \
  --run-command "apt-get -y autoremove --purge && apt-get -y clean" \
  --append-line "/etc/systemd/timesyncd.conf:NTP=time.apple.com time.windows.com" \
  --run-command 'figlet Bitrate Network > /etc/motd' \
  --delete "/etc/update-motd.d/10-uname" \
  --delete "/var/log/*.log" \
  --delete "/var/lib/apt/lists/*" \
  --delete "/var/cache/apt/*" \
  --truncate "/etc/machine-id"
  1. 初始设置与系统配置

    • --smp 2 --verbose: 告诉 virt-customize 在其临时的“操作”虚拟机(Appliance VM)中使用2个CPU核心以加快处理速度,并打印详细的进度信息。
    • --timezone "Asia/Hong_Kong": 将系统的默认时区设置为“亚洲/香港”。
    • --run-command "systemctl enable serial-getty@ttyS1.service": 启用串口控制台的登录功能。这对于像 Proxmox VE 这样的虚拟化平台至关重要,它允许你直接访问虚拟机的控制台。
  2. 引导加载程序 (GRUB) 调整

    • --append-line "... GRUB_DISABLE_OS_PROBER=true": 禁用 GRUB 的一个功能,该功能会扫描磁盘上是否存在其他操作系统。在一个单一操作系统的虚拟机中,这个功能是无用的,禁用它可以略微加快启动速度并防止潜在问题。
    • --run-command "update-grub": 应用上述对 GRUB 的更改,使其在下次启动时生效。
  3. SSH 访问配置
    此部分修改了 SSH 服务器的设置,使其更容易访问,尤其是在实验或开发环境中。

    • ... PermitRootLogin yes: 明确允许 root 用户通过 SSH 登录。
    • ... PasswordAuthentication yes: 允许用户使用密码进行登录。Cloud Image 通常会禁用此项,强制仅使用 SSH 密钥。
    • ... PrintLastLog yes: 确保系统在用户成功登录后显示上次登录的时间和地点,这有助于安全意识。
  4. 包管理 (APT) 与软件安装

    • ... sed ... Types: deb: 修改 APT 源文件,使其只下载二进制包 (deb) 而忽略源码包 (deb-src),这对于服务器来说很少需要,并且可以加快 apt update 的速度。
    • ... sed ... generate_mirrorlists: false: 告诉 cloud-init 在首次启动时不要浪费时间去寻找最快的软件包镜像源,而是使用预定义的源。
    • --update --install "...": 首先,在镜像内部运行 apt update。然后,安装一系列常用和必备的工具
      • qemu-guest-agent: 对虚拟化环境最重要的工具。它允许 PVE 主机更好地与虚拟机通信(例如,实现正常关机、报告IP地址等)。
      • sudo: 使用 root 权限运行命令的标准工具。
      • 网络工具: net-tools (如 ifconfig)、curlwgetdnsutils (dig, nslookup) 以及各种 iputils 工具。
      • 用户工具: nano (一个简单的文本编辑器)、htop (一个高级的任务管理器)、bash-completion (命令自动补全) 和 figlet (创建文本横幅)。
  5. 网络性能调优 (Sysctl & BBR) 🚀

    • --run-command 'cat <<EOF > /etc/sysctl.d/99-custom.conf ...': 这部分写入一个庞大的配置文件,用于调整内核的网络协议栈以获得高性能。
    • 主要优化点:
      • 增加 TCP 内存缓冲区 (rmem, wmem) 以更好地处理高带宽连接。
      • 启用 Google 的 BBR 拥塞控制算法 (tcp_congestion_control=bbr)。BBR 非常适合现代网络,能显著提高吞吐量并减少延迟。
      • 启用 IP 转发,允许这台机器在需要时充当路由器。
  6. 最终定制与品牌化

    • --append-line "... NTP=time.apple.com time.windows.com": 添加苹果和微软的公共时间服务器,以实现可靠的时钟同步。
    • --run-command 'figlet Bitrate Network > /etc/motd': 使用新安装的 figlet 工具创建一个 ASCII 艺术横幅 "Bitrate Network",它将在用户登录时显示。
    • --delete "/etc/update-motd.d/10-uname": 删除了一个默认在登录时显示 Linux 内核版本等信息的脚本,使欢迎信息更简洁。
  7. 镜像清理与模板准备 ✨
    这是收尾的关键步骤,用于减小镜像体积并使其为克隆做好准备。

    • --run-command "apt-get -y autoremove --purge && apt-get -y clean": 删除所有不再需要的依赖包并清理 APT 缓存。
    • --delete "/var/log/*.log": 删除所有日志文件,让新虚拟机从一个干净的状态开始。
    • --delete "/var/lib/apt/lists/*"--delete "/var/cache/apt/*": 深度清理所有包管理器的缓存文件。
    • --truncate "/etc/machine-id": 这是为创建模板所做的最重要的一步。它清空了系统的唯一机器ID。任何从这个模板克隆出的虚拟机在首次启动时都会生成自己全新的、唯一的ID,从而防止在网络上发生冲突。

缩小镜像

因为 virt-customize 使用该硬盘镜像文件启动了虚拟机执行命令导致的硬盘空间分配.为了减少镜像体积,我们需要使用 virt-sparsify 将硬盘镜像文件中的未使用空间清除掉.

sudo virt-sparsify --compress debian-13-genericcloud-amd64-20250911-2232.qcow2 debian-13-amd64-bitrate.qcow2

制作模板

将减少体积后的镜像上传到PVE的HOME目录中(即/root)

# 创建一个空白虚拟机
qm create 900 \
  --machine q35 \
  --cpu cputype=host \
  --bios ovmf \
  --vga virtio \
  --scsihw virtio-scsi-single \
  --scsi1 "local:cloudinit" \
  --serial0 socket \
  --net0 virtio,bridge=vmbr0 \
  --agent 1 \
  --ostype l26 \
  --memory 1024 \
  --name "debian-13-cloud-template"

# 将镜像文件attach到创建的空白虚拟机(900)中,并设置启动盘
qm importdisk 900 "/root/images/debian-13-amd64-bitrate.qcow2" local -format qcow2
qm set 900 --scsi0 "local:900/vm-900-disk-0.qcow2,discard=on,ssd=1"
qm set 900 --boot order=scsi0
qm resize 900 scsi0 5G

# 添加EFI磁盘
qm set 900 --efidisk0 local:0,efitype=4m,format=qcow2

# 将设置好的镜像转换为模板

qm template 900

参考资料

  1. 为 Proxmox VE 定制 Debian Cloud 系统镜像与创建虚拟机模板