【转载】深入理解OpenStack-手动制作qcow2镜像

时间:2022-05-05 11:19:15

深入理解OpenStack-手动制作qcow2镜像

2018-01-18

手动制作镜像

1
官方虽提供qcow2系统镜像,但对于有需求的企业来说,还是定制镜像比较靠谱,下面就手动定制一个镜像
  • 给虚拟机创建一个网络
1
2
3
4
5
6
7
8
9
10
11
手动创建镜像需要确保libvirt运行有default网络,这个网络可以给虚拟机提供上网服务。

查看当前是否启用default网络
[root@compute ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes


注:如果没有启用,使用以下命令启用default
virsh net-start default
  • 创建虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
13
(1)创建一个目录mkdir -p /data   
上传iso镜像到/data目录

(2)创建一个10G的磁盘文件给虚拟机使用
qemu-img create -f qcow2 /data/centos.qcow2 10G

(3)安装
virt-install --virt-type kvm --name centos7.4_x86_64 --ram 1024 \
--disk /data/centos.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux \
--location=/data/CentOS-7-x86_64-Minimal-1611.iso
  • 使用TightVNC Viewer客户端连接虚拟机
1
2
3
4
5
6
要想连接虚拟机就需要执行一条命令来查看刚才新建虚拟机的端口信息
[root@compute ~]# netstat -lntup |grep kvm
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 90011/qemu-kvm
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 41365/qemu-kvm

可以看到,当前运行有两台虚拟机,我刚刚创建的虚拟机端口是5901。
1
2
3
4
5
6
运行TightVNC Viewer客户端,Remote Host输入:192.168.56.12:5901 进行连接。连接成功后,就看到操作系统的引导界面了,这时候可以对虚拟机进行系统安装了。也可以根据企业需求进行个性化安装。

安装结束后,点击reboot

注:只有配置了KVM虚拟机,libvirt就会生成一个与操作系统对应的xml文件,其记录了kvm虚拟机的状态。路径如下:/etc/libvirt/qemu/CentOS-6.6-x86_64.xml
注:此文件只能通过“virsh edit”命令修改
  • 启动KVM虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
列出所有虚拟机
[root@compute ~]# virsh list --all
Id Name State
----------------------------------------------------
7 instance-00000003 running
12 centos7.4_x86_64 shut off


启动虚拟机
[root@compute ~]# virsh start centos7.4_x86_64
[root@compute ~]# virsh list --all

当此虚拟机再次启动后,再使用TightVNC Viewer客户端,Remote Host输入:192.168.56.12:5901 进行连接。

此时可以在此系统中编辑已经提前准备并测试好的系统初始化脚本,并让脚本开机后运行,测试无误后将此虚拟机关机。(此步骤是把开机初始化脚本给封装到镜像中)

在这个虚拟机系统中运行shutdown -h now 即可
  • 关于系统优化脚本-脚本参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash

set_key(){
if [ ! -d /root/.ssh ]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/metadata-key 2>/dev/null
if [ "$?" -eq 0 ]; then
cat /tmp/metadata-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
restorecon /root/.ssh/authorized_keys
rm -f /tmp/metadata-key
echo "Successfully retrieved public key from instance metadata"
echo "*****************"
echo "AUTHORIZED KEYS"
echo "*****************"
cat /root/.ssh/authorized_keys
echo "*****************"
else
FAILED=`expr $FAILED + 1`
if [ $FAILED -ge $ATTEMPTS ];then
echo "Failed"
break
fi
sleep 5
fi
done
}

set_hostname(){
echo "hehe"
SET_HOSTNAME=$(curl -s http://169.254.169.254/2009-04-04/meta-data/hostname | awk -F '.' '{print $1}')
VM_HOSTNAME="$SET_HOSTNAME".example.com
hostnamectl set-hostname $VM_HOSTNAME
}

set_static_ip(){
echo "hehe"
/bin/cp /tmp/ifcfg-eth0-example /etc/sysconfig/network-scripts/ifcfg-eth0
VM_IPADDR=$(curl -s http://169.254.169.254/2009-04-04/meta-data/local-ipv4)
sed -i "s/9.9.9.9/$VM_IPADDR/g" /etc/sysconfig/network-scripts/ifcfg-eth0
}

main(){
set_key;
set_hostname;
set_static_ip;
rm -f /tmp/get_metadata.sh
/bin/cp /tmp/rc.local /etc/rc.d/rc.local
}
main

将制作好的/data/centos.qcow2镜像文件上传到Glance

1
2
3
4
5
6
7
8
9
10
注:在控制节点进行镜像上传

(1)source变量
source /scripts/admin-openrc

(2)镜像上传
openstack image create "CentOS7.4_x86_64" --file /data/centos.qcow2 \
--disk-format qcow2 --public

(3)openstack dashboard中创建虚拟机,并验证脚本执行情况

附录:virsh命令-使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
virsh --help

virt-clone -o centos7_mini -n centos7_mini15 --auto-clone #克隆mini,新克隆的为mini15
-o #原始机名字,必须为关闭或暂停状态
-n #新客户机的名称
--auto-clone #从原始客户机配置中自动生成克隆名称和存储路径
--replace #不检查命名冲突,覆盖任何使用相同名称的客户机
-f #可以指定克隆后的主机镜像放在指定目录下

virsh autostart xxx #让子机随宿主机开机自动启动
virsh autostart --disable xxx #解除自动启动

virt-install #建立kvm虚拟机
virsh list #查看正在运行的KVM虚拟机
virsh list --all #查看所有KVM虚拟机
virsh start name #启动KVM虚拟机
virsh shutdown name #正常关闭KVM虚拟机
virsh destroy name #强制关闭KVM虚拟机(类似于直接断电)
virsh suspend name #挂起KVM虚拟机
virsh resume name #恢复挂起的KVM虚拟机
virsh dumpxml name #查看KVM虚拟机配置文件,可以把输出的内容定义到xml里,用来克隆迁移用。
virsh edit name #编辑KVM虚拟机的xml配置文件
virsh define /etc/libvirt/qemu/name.xml #定义注册虚拟机,需要先查看xml文件对应的镜像,img等路径是否存在或修改指定路径
virsh undefine name #彻底删除KVM虚拟机,不可逆,如果想找回来,需要备份/etc/libvirt/qemu的xml文件

注:gentoo使用livecd安装的过程中,关于安装文件如何上传到livecd的问题,解决方案如下:

1
kvm安装安装启动livecd,然后通过桥接联网将文件上传,再执行脚本安装和初始化。最后将qcow2文件上传到glance。最后通过openstack dashboard来使用qcow2镜像安装gentoo