为 Proxmox VE 定制 Debian 虚拟机模板
基底系统
不同安装媒介的区别
媒介 | Cloud Image | netinst | DVD |
---|---|---|---|
特性 | 云镜像 | 网络安装镜像 | 完整安装镜像 |
文件格式 | qcow2, raw 等 | .iso | .iso |
安装向导 | 无安装向导 | 交互式安装向导 | 交互式安装向导 |
网络依赖 | cloud-init | 安装时强依赖 | 安装时不依赖 |
初始系统 | 预装好的最小化系统 | 从零开始按需安装 | 从零开始按需安装 |
灵活性 | 较低 | 极高 | 极高 |
最佳场景 | 云平台、自动化脚本 | 有网的物理机 | 无网的物理机 |
综上所述,选择
Cloud Image
作为基底系统更符合PVE虚拟化环境!
下载基底系统
这里选择
Debian13
作为基底,选择genericcloud
版本即可!
特性 | genericcloud | generic |
---|---|---|
目标环境 | 现代虚拟化平台 | 老旧环境虚拟化平台 |
优化程度 | 专为云环境优化 | 更通用更广泛 |
推荐度 | 强烈推荐 | 仅作为后备或特殊情况选择 |
下载链接: 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"
-
初始设置与系统配置
--smp 2 --verbose
: 告诉virt-customize
在其临时的“操作”虚拟机(Appliance VM)中使用2个CPU核心以加快处理速度,并打印详细的进度信息。--timezone "Asia/Hong_Kong"
: 将系统的默认时区设置为“亚洲/香港”。--run-command "systemctl enable serial-getty@ttyS1.service"
: 启用串口控制台的登录功能。这对于像 Proxmox VE 这样的虚拟化平台至关重要,它允许你直接访问虚拟机的控制台。
-
引导加载程序 (GRUB) 调整
--append-line "... GRUB_DISABLE_OS_PROBER=true"
: 禁用 GRUB 的一个功能,该功能会扫描磁盘上是否存在其他操作系统。在一个单一操作系统的虚拟机中,这个功能是无用的,禁用它可以略微加快启动速度并防止潜在问题。--run-command "update-grub"
: 应用上述对 GRUB 的更改,使其在下次启动时生效。
-
SSH 访问配置
此部分修改了 SSH 服务器的设置,使其更容易访问,尤其是在实验或开发环境中。... PermitRootLogin yes
: 明确允许 root 用户通过 SSH 登录。... PasswordAuthentication yes
: 允许用户使用密码进行登录。Cloud Image 通常会禁用此项,强制仅使用 SSH 密钥。... PrintLastLog yes
: 确保系统在用户成功登录后显示上次登录的时间和地点,这有助于安全意识。
-
包管理 (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
)、curl
、wget
、dnsutils
(dig
,nslookup
) 以及各种iputils
工具。 - 用户工具:
nano
(一个简单的文本编辑器)、htop
(一个高级的任务管理器)、bash-completion
(命令自动补全) 和figlet
(创建文本横幅)。
-
网络性能调优 (Sysctl & BBR) 🚀
--run-command 'cat <<EOF > /etc/sysctl.d/99-custom.conf ...'
: 这部分写入一个庞大的配置文件,用于调整内核的网络协议栈以获得高性能。- 主要优化点:
- 增加 TCP 内存缓冲区 (
rmem
,wmem
) 以更好地处理高带宽连接。 - 启用 Google 的 BBR 拥塞控制算法 (
tcp_congestion_control=bbr
)。BBR 非常适合现代网络,能显著提高吞吐量并减少延迟。 - 启用 IP 转发,允许这台机器在需要时充当路由器。
- 增加 TCP 内存缓冲区 (
-
最终定制与品牌化
--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 内核版本等信息的脚本,使欢迎信息更简洁。
-
镜像清理与模板准备 ✨
这是收尾的关键步骤,用于减小镜像体积并使其为克隆做好准备。--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
参考资料
其他文章