最近把家里的服务器从vmware的esxi 技术栈换成了更省心省资源和容易管理的Proxmox8.2.2,这里记录下配置步骤

创建模板虚拟机

创建一台虚拟机,具体配置参考如下(记得勾选高级,不然有些选项看不到)

名称
- ubuntu22-templates

操作系统
-  不使用任何介质

系统
- 勾选 QEMU代理
- 其他均保持默认

硬盘
- 删除硬盘
- 若已添加,先分离后删除

CPU
- 在类别处下拉到最后修改为host

内存
- 取消勾选防火墙
- 取消勾选Bollooning设备

点下一步-->完成


创建后,进入【硬件】页面,继续修改:

- 删除 CD / DVD 驱动器
- 添加 串行端口
  - 序号 0
  - 这一步非必须,如果没有通过 xterm.js 访问虚拟机的需求,可以不添加
添加 CloudInit 设备
- 总线/设备 选择: SCSI
- 序号 1

制作模板镜像

镜像下载

需要先下载镜像文件,大家可以在Ubuntu Cloud的官网 https://cloud-images.ubuntu.com/releases 下载最新的镜像

这里我们以 ubuntu 22.04 版本进行,下载地址: ubuntu-22.04-server-cloudimg-amd64.img

镜像制作

通过ssh登录到PVE主机内,进行操作

1、下载镜像文件

mkdir ~/cloud_img && cd $_
wget https://init.ac/files/ubuntu-22.04-server-cloudimg-amd64.img

2、导入镜像

使用以下命令进行导入,其中命令中 vmid 是我们第一个步骤中创建虚拟机后的虚拟机ID,可以在 pve web端的侧边栏中看到,ubuntu-22.04-server-cloudimg-amd64.img为镜像文件名,ssd-data存储池,也可以自行更改。

qm importdisk <vmid> ubuntu-22.04-server-cloudimg-amd64.img ssd-data

# 导入成功后返回以下内容
importing disk 'ubuntu-22.04-server-cloudimg-amd64.img' to VM 100 ...
  Wiping dos signature on /dev/ssd-data/vm-100-disk-0.
  Logical volume "vm-100-disk-0" created.
transferred 22.5 MiB of 2.2 GiB (1.00%)
transferred 2.2 GiB of 2.2 GiB (100.00%)
Successfully imported disk as 'unused0:ssd-data:vm-100-disk-0'

此时回到虚拟机的硬件菜单,可以看到一个新的硬盘:

图一

选中新增的硬盘,单击上方的 编辑,将总线 更改为“SATA”,之后点击添加

图二

此时会有一个 硬盘0 (SATA),再次选中,选择上方的 磁盘操作调整大小,作为虚拟机的系统盘,默认大小可以给 5GB (注意:这个空间不要给太大,因为直接影响到最后新开机器时的速度)

生成模板镜像

虚拟机参数配置

之后点击左边栏的Cloud-Init ,在这里可以编辑用户、 ssh公钥、 IP地址信息

用户
 - 自定义写一个用户名,ssh链接的时候使用,这里写appuser

密码
 - 不填

DNS域
 - 不填

DNS服务器
 - 使用主机设置

SSH公钥
  - 这里大家需要生成一个;cloud镜像里默认禁止以密码连接ssh

IP配置
 - 根据实际环境设置,可以选择 DHCP 

编辑完成后,点击上方的 重生成镜像

上述步骤都完成后,点击左边 选项引导顺序勾选sata0并拖到第一位

图三

虚拟机系统配置

这里可以先启动下虚拟机,启动过程可以在左侧的控制台中查看到。

关于虚拟机的IP,如果在网络配置中配置的是静态IP,则使用静态IP通过ssh连入服务器内,如果是DHCP则在路由器后台看下虚拟机的 IP,登入服务器内检查前面的cloud-init配置是否都正确,以及来进行我们的系统初始化配置。

切换到root下进行

sudo su - 

安装必要依赖

apt update
apt-get install -y qemu-guest-agent apt-transport-https ca-certificates curl gnupg lsb-release net-tools ntpdate htop 

时间校正

timedatectl set-timezone Asia/Shanghai && /usr/sbin/ntpdate ntp1.aliyun.com
echo "*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com" >> /var/spool/cron/crontabs/root

安装docker

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository -y "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

apt-get install -y docker-ce=5:20.10.24~3-0~ubuntu-jammy docker-ce-cli containerd.io

cat <<EOF > /etc/docker/daemon.json
{
    "data-root": "/data/docker",
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

usermod -aG docker appuser # 配置普通用户使用docker命令(可选)

内核参数优化

echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables

ssh配置优化

sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config

服务启动优化

systemctl enable docker
systemctl enable --now qemu-guest-agent cron

善后清理处理

需要安装的软件包全部安装完毕后,可以清理一下 apt 的缓存,毕竟是作为模板使用的虚拟机,硬盘空间尽量精简一些,加快后续克隆新虚拟机时的速度,克隆出来的虚拟机可以自行扩容硬盘后再添加其他软件。

# 关闭不必要的服务
systemctl mask apt-daily.service apt-daily-upgrade.service
systemctl stop ufw && systemctl disable ufw

# 清理残留
sudo apt clean
sudo apt autoclean
sudo apt --purge autoremove

清除机器 ID

# 不清除的话;新克隆的虚拟机IP都是和模板一样
cloud-init clean && rm -rf /var/lib/cloud/*
echo -n > /etc/machine-id

清理历史命令

cat /dev/null > ~/.bash_history && history -c

关机制作模板

在 PVE 管理后台点击“关机”,然后在左侧的虚拟机列表中右键点击这台虚拟机,选择“转换为模板”。这样,一个基于 cloud-init 的虚拟机模板即制作完成了。

克隆虚拟机

上述模板步骤都完成后,我们基于上述模板来新创建一台虚拟机,看一下效果。

鼠标右键模板 克隆

名称
  - 需要自己定义一个,开机后cloud-init会使用虚拟机名称作为虚拟机的hostname

模式
  - 完整克隆 (完整克隆就是独立的一份,链接克隆就是做个软链接)

VMID
  - 虚拟机ID可以自定义

目标存储
  - 虚拟机的存储位置,可以下拉进行选择目标磁盘

图四

复制完成后,在开机前,最好进入虚拟机的【硬件】页面,自定义一下虚拟机的硬件配置:

- 内存,处理器,网络等
    - 可以随意按需修改
- 硬盘
    - 最好扩容一下,因为按照上文配置的虚拟机模板,硬盘只一块10GB的系统盘,一般来说是不够用的

最后

得益于模板是基于Ubuntu的Cloud镜像制作的,机器开机后会自动按照 cloud-init 的配置调整系统,比如生成各种需要随机的ID和 MAC地址,配置网络等,一般来说系统开机后就可以直接使用了。

常见小问题:

  • 为什么克隆虚拟机要很久:检查 硬盘0 (SATA) 是不是给增加的大小太大了
  • 如果开机前忘记扩容硬盘了,那么此时也可以进行扩容
  • 开机后,虽然在系统内通过 hostname 命令查看主机名,显示确实是虚拟机名称,但在路由器的 DHCP 服务端看来,不知为何依然是和模板相同的 hostname; 解决方法倒是很简单,将虚拟机重启,即可对外展示正确的 hostname 了
Last modification:September 22, 2024
如果觉得我的文章对你有用,请随意赞赏