zoukankan      html  css  js  c++  java
  • 【转载】深入理解OpenStack-手动制作qcow2镜像

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

    手动制作镜像

    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
  • 相关阅读:
    lower_bound和upper_bound
    memcache教程
    php header() 函数
    修复TortoiseGit文件夹和文件图标不显示
    mysql数据类型
    PDO类PDO、PDOStatement、PDOException
    mysqli和pdo对mysql数据库的操作
    php 关键字
    几个入口文件定义函数
    php --魔术常量 /魔术方法
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/10971859.html
Copyright © 2011-2022 走看看