最近把家里的服务器从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 了