PVE使用Cloud Image做模板-Linux篇

使用PVE的Cloud-Init功能,配合Cloud Image镜像,创建主机模板,快速生成新系统。

前言

Cloud Image专用于适配云计算的一种镜像格式(模板),面向私有云和公有云;它与ISO镜像的区别是,ISO镜像是可引导的带安装器的一种镜像格式,通常情况,走光驱通道启动安装器,把系统安装到硬盘上;而这个过程需要填写一些系统需要的信息,如计算机名称、用户名信息、网络信息和机器配置之类的;虽然也可以通过PXE的方式进行全自动引导安装,但与云镜像的方式还是有很大不同;至少云镜像的方式更快,从本地直接拉起镜像;

云镜像是不带安装器的,它本身就是个虚拟磁盘文件格式,换句话说就是,它就是一个装好的系统,加上Cloud-Init程序进行初始化。

不管是PXE还是云镜像的方式,都有一个共同的特点,就是一个全新的系统;这里全新的系统更多指的是系统内各种ID会自动生成,这一点对于需要搭建集群的环境来说,至关重要;并通过Cloud-Init程序,可以每次定义不同的用户名、密码、IP和SSH密钥。在克隆方面VMware Workstation做的不错。

值得高兴的是,PVE的非订阅版本提供了这个功能,配合操作系统厂商提供的云镜像文件,制作镜像之后,我们可以快速的克隆出各种机型,实现快速和个性化交付。

版本信息

  • PVE 7.0-13
  • CentOS-7-x86_64-GenericCloud-2009.qcow2
  • ubuntu-20.04-server-cloudimg-amd64.img(20211004)

update

2021年10月14日

不知道什么原因,用Ubuntu cloud image做的模板,在克隆后获取IP的时候,克隆出来的机器竟然只会获取一个IP,用centos就不会;后来用ubuntu的ISO镜像安装后(20.04默认已经安装cloud-init)手动添加外部的Cloud-Init,做模板,这个问题解决了;

即便是使用上述方法也不行;只要是克隆的,就会出现问题;在pfsense和openwrt做二级路由的时候;

这种问题只会出现在Ubuntu上,Centos就不会。

pfsense

在openwrt上会出现抢注的情况,u20-1和u20-2谁重启网络服务,这个IP就注册给谁


主流的操作系统厂商都提供了多种CPU架构和多种虚拟化平台的云镜像格式;

Ubuntu Cloud Images (RELEASED)Cloud CentOS

PVE是基于Debian的Linux,使用了QEMU/KVM虚拟化技术;CentOS默认提供qcow2格式,而Ubuntu则提供的KVM是img格式。

创建虚拟机模板

基本流程:

  1. 创建一个虚拟机
  2. 删除硬盘
  3. 转换云镜像为磁盘并挂载
  4. 添加Cloud-Init并配置
  5. 启动操作系统并配置
  6. 关机转换为模板。

创建一个虚拟机

这里的名称,会自动作为本次操作系统的计算机名称。

设置虚拟机名称
不使用任何介质
勾选QEMU代理

这里默认即可,一会是要删除这个硬盘的;

保持默认

一路走下去,到完成。

先分离硬盘,在删除

分离硬盘
删除硬盘

下载并转换镜像

下载镜像,通过SSH登录到母机上;进入镜像的存放目录或者使用Web页面的下载镜像功能也可以;但是之后的转换云镜像为磁盘的操作需要命令行来完成。

如果你没有添加过额外的存储,那么默认路径在 /var/lib/vz/template/iso 目录下;以Ubuntu为例;使用 qm 命令将下载的云镜像文件转为一个磁盘文件;我这里添加了 /raid0 目录存储虚拟机和镜像文件;

bug:使用ubuntu-20.04-server-cloudimg-amd64-disk-kvm.img这个镜像或开机会提示attempting initrdless boot;所以得下载不带KVM关键字的镜像;至少这个日期版本(20211004)是有问题的。

# 下载镜像
wget https://cloud-images.ubuntu.com/releases/focal/release-20211004/ubuntu-20.04-server-cloudimg-amd64.img

# 转换云镜像为虚拟磁盘
qm importdisk 104 ubuntu-20.04-server-cloudimg-amd64.img raid0 --format=qcow2
# 104 为虚拟机的ID
# raid0 为存储的名称,如果没有额外存储,则默认是local
# --format=qcow2 为转换后的格式

# 看到Successfully,转换完成
Successfully imported disk as 'unused0:raid0:104/vm-104-disk-0.qcow2'

CentOS的Cloud Image提供了qcow2格式,则无需使用--format参数

回到虚拟机“硬件”页面;多了一块“未使用的磁盘0”;双击后,点击添加。

添加新硬盘

这里初始磁盘容量比较小,可以点击磁盘“调整磁盘大小”;显示的是MB,增量的是GB。

调整磁盘大小

在点击“添加”Cloud-Init设备。

添加Cloud-Init设备

选择存储和SCSI ID为1,创建

添加Cloud-Init设备

由于刚刚删除了磁盘,所以启动选项里为空,这时候需要勾选一下刚刚添加的新磁盘为启动盘。勾选“scsi0”并拖拽到第一个,或者取消其他的,只保留scsi0也可以。

光驱默认是IDE接口,可以把它删除了,重新添加为SCSI 2;选项为“不使用任何介质”。

这个时候就可以设置Cloud-Init选项了;由于我们使用的是Ubuntu,则这里不能设置用户为“root”,因为这个账户Ubuntu默认禁用;如果有需要,可以在之后的启动后开启root,再生成模板。

在继续填写SSH公钥(可以加载文件)和IP配置,这个时候网卡的Mac地址已经生成,IP配置的选项为DHCP和Static。这些就绪之后,就可以启动这个系统了。

配置模板系统

  1. 设置时区
sudo timedatectl set-timezone Asia/Shanghai

2. 设置APT仓库源

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

3. 安装软件或更新系统

# 更新源和安装常用软件
sudo apt update && sudo apt install vim bash-completion -y

# 安装qemu代理
sudo apt install qemu-guest-agent -y
sudo systemctl enable --now qemu-guest-agent

# 更新系统
sudo apt upgrade

4. 修改SSH配置;(有必要)

# 开启root登录(如果需要的话;这里开启了之后Cloud-Init用户就可以设置root)
PermitRootLogin yes

# 开启密钥登录
PubkeyAuthentication yes
# 密钥路径
AuthorizedKeysFile

# 开启密码登录(默认只允许密钥登录)
PasswordAuthentication yes

# 不允许空密码登录
PermitEmptyPasswords no

# 关闭连接的DNS解析
UseDNS no

5. 清理缓存

sudo apt autoclean all

6. 其他自定义配置

关机,转换为模板,就可以了。

后记

使用Cloud-Init的方式可以不用架设PXE服务器,也不用因为普通的克隆导致新系统的各种ID和源系统相同。对于经常需要做实验的环境来说,快速初始化一些全新的操作系统效率很高。另外,如果不是集群模式,又有多台PVE的话,只需要做好一个,使用PVE的虚拟机备份与恢复功能,传输到其他机器上,则更方便。