使用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就不会。
在openwrt上会出现抢注的情况,u20-1和u20-2谁重启网络服务,这个IP就注册给谁
主流的操作系统厂商都提供了多种CPU架构和多种虚拟化平台的云镜像格式;
Ubuntu Cloud Images (RELEASED)、Cloud CentOS
PVE是基于Debian的Linux,使用了QEMU/KVM虚拟化技术;CentOS默认提供qcow2格式,而Ubuntu则提供的KVM是img格式。
创建虚拟机模板
基本流程:
- 创建一个虚拟机
- 删除硬盘
- 转换云镜像为磁盘并挂载
- 添加Cloud-Init并配置
- 启动操作系统并配置
- 关机转换为模板。
创建一个虚拟机
这里的名称,会自动作为本次操作系统的计算机名称。
这里默认即可,一会是要删除这个硬盘的;
一路走下去,到完成。
先分离硬盘,在删除
下载并转换镜像
下载镜像,通过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设备。
选择存储和SCSI ID为1,创建
由于刚刚删除了磁盘,所以启动选项里为空,这时候需要勾选一下刚刚添加的新磁盘为启动盘。勾选“scsi0”并拖拽到第一个,或者取消其他的,只保留scsi0也可以。
光驱默认是IDE接口,可以把它删除了,重新添加为SCSI 2;选项为“不使用任何介质”。
这个时候就可以设置Cloud-Init选项了;由于我们使用的是Ubuntu,则这里不能设置用户为“root”,因为这个账户Ubuntu默认禁用;如果有需要,可以在之后的启动后开启root,再生成模板。
在继续填写SSH公钥(可以加载文件)和IP配置,这个时候网卡的Mac地址已经生成,IP配置的选项为DHCP和Static。这些就绪之后,就可以启动这个系统了。
配置模板系统
- 设置时区
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的虚拟机备份与恢复功能,传输到其他机器上,则更方便。