1. 镜像制作目标
提前准备好现成的qcow2镜像文件,以该镜像为基础创建虚拟机,登陆到虚拟机在虚拟机中部署相应的环境,满足测试或者生产需求,最终导出自己制作好的镜像。
2. 宿主机需安装的软件
yum install -y acpid cloud-init cloud-utils-growpart curl dhclient dmidecode dracut ethtool gdisk iputils irqbalance net-tools NetworkManager nfs-utils openssh openssh-clients openssh-server qemu-guest-agent rsyslog sysstat tar tuned vim wget qemu-kvm libvirt libguestfs-tools-c
3. 安装虚拟机
安装虚拟机主要有两种方式,第一种是根据安装命令安装,可安装一个基本的虚拟机镜像,第二种是通过配置文件模板安装虚拟机。
3.1 通过命令安装虚拟机
需根据实际情况修改,主要修改name(虚拟机名称)、disk path(qemu文件目录),此处虚拟机名称以test_name为例,disk path以/xxx/test.qcow2为例。
virt-install \
--connect qemu:///system \
--name test_name \
--arch x86_64 \
--vcpus 8 \
--ram 16384 \
--disk path=/xxx/test_name.qcow2,format=qcow2,device=disk,bus=virtio \
--channel unix,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0 \
--network default,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--video virtio \
--import \
--debug
3.2 通过配置文件模板安装虚拟机
- 在当前目录下构建一个包含如下内容的xml文件,配置项请根据需要制作镜像的情况按需修改。但以下几项为必须修改项:
- uuid字段修改为一个新的合法uuid,至少与本宿主机之前创建的虚拟机不同。(可使用uuidgen命令随机生成一个uuid)
- name字段修改为自定义的虚拟机名称。
- source file修改为本次制作镜像的qcow2文件的地址。
- mac address修改为一个合法的mac地址,至少与与本宿主机之前创建的虚拟机不同,注意如涉及多个网卡,多个网卡的mac地址均需要修改。(可使用下面的命令随机构造一个mac地址)
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'
<domain type='kvm' id='124'>
<name>test_name</name>
<uuid>e5852563-1c0f-4eca-924b-3c9156bd9d93</uuid>
<memory unit='KiB'>16777216</memory>
<currentMemory unit='KiB'>16777216</currentMemory>
<vcpu placement='static'>8</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='host-model' check='partial'/>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/xxx/test_name.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<interface type='network'>
<mac address='61:0f:1d:b5:cf:b8'/>
<source network='default'/>
<model type='virtio' queues='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='virtio' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
- 使得该文件配置生效
virsh define source_vm.xml
- 启动虚拟机
virsh start test_name(虚拟机名,上面配置文件中的name字段)
或
virsh start 124(虚拟机id,上面配置文件第一行的id字段,如与已建虚拟机id重复,则id会由系统重新分配,可通过的virsh list -all查看目前所有的虚拟机)
- 修改虚拟机的配置信息(修改已经存在的虚拟机的配置信息)
上述的第1步和第2步仅适用于新创建虚拟机时指定虚拟机的配置信息,但实际制作镜像的场景可能会在虚拟机创建后修改虚拟机的配置文件,那么需要在关机的状态下编辑配置文件并保存后重新启动虚拟机就会以新修改的配置启动虚拟机。
- 关闭虚拟机
virsh shutdown test_name
或
virsh shutdown 124
- 编辑配置文件
virsh edit test_name
4. 登陆虚拟机和修改密码
- 登陆虚拟机
virsh console test_name(虚拟机名)
或
virsh console 124(虚拟机id)
- 修改密码(如知道镜像的密码,则无需执行此过程)
由于我们可能使用的基础镜像是他人制作,我们不知道该镜像创建出后虚拟机登陆的初始密码,所以需要修改该镜像的初始登陆密码。
- 关闭虚拟机(为保证修改后的密码能够生效)
virsh shutdown test_name
或
virsh shutdown 124
- 加密密码,将自己需要加密的密码填入,这里以test_password为例
openssl passwd -1 -salt 'ctimage''test_password'
- 将刚才生成的加密后的密码在下面的文件进行修改,将root:开始到倒数最后一个:之间的内容替换为刚才的加密后的登陆密码,然后保存文件即可。
virt-edit -d test_name /etc/shadow
- 重新启动虚拟机进行登陆
# 重新启动虚拟机
virsh reboot test_name/124
# 登陆虚拟机
virsh console test_name/124
输入刚才设置的密码即可成功以root身份登陆到该虚拟机。
5. 环境构建
在配置好正确的yum源后,即可根据项目需要在基础镜像的基础上安装一些软件或进行一些其他操作。
5.1. 安装软件
登陆到构建出的虚拟机后,即可按照测试或者生产需求安装自己需要的软件,下面以安装vim为例:
yum -y install vim
6. 镜像导出和使用
经过上面的流程,以成功制作出了满足项目运行条件的镜像,接下来需要导出制作出的镜像方便后续使用。
- 复制镜像
cp test_name.qcow2 test_name2.qcow2
- 导出镜像的配置信息
virsh dumpxml test_name > source_vm.xml
- 镜像使用
有了qcow2格式的镜像文件和镜像的配置信息,即可通过前面介绍的步骤利用新创建出的镜像启动一个新的虚拟机。