linux系統qcow2鏡像的制作


一.簡單說明

PS: 最近有客戶需要在雲平台上部署我們的產品,好久沒有做過qcow2鏡像了,這里還是把制作流程記錄下來。
QCOW2鏡像格式是Qemu支持的磁盤鏡像格式之一。它可以使用一個文件來表示一個固定大小的塊設備。與Raw鏡像格式相比,QCOW2具有如下優點:

  • 更小的文件大小,即便不支持holes(稀疏文件)的文件系統同樣適用
  • 支持寫時拷貝(COW, Copy-on-write),QCOW2鏡像只反映底層磁盤鏡像所做的修改
  • 支持快照,QCOW2鏡像可以包含鏡像歷史的多重快照
  • 支持基於zlib的數據壓縮
  • 支持AES加密

二.制作Qcow2鏡像環境部署

2.1 基礎ISO

這里,我們安裝centos7.5環境即可。

2.2軟件安裝:

[root@qcow2-build ~]# yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python python-virtinst libvirt-client virt-install virt-viewer

啟用libvirtd服務與設置開機啟動

[root@qcow2-build ~]# systemctl start libvirtd
[root@qcow2-build ~]# systemctl enable libvirtd

查看kvm是否安裝

[root@qcow2-build ~]# lsmod |grep kvm
kvm_intel             188688  14 
kvm                   636969  1 kvm_intel
irqbypass              13503  1 kvm

2.3 配置網絡

# 修改網卡的配置文件如下
[root@qcow2-build network-scripts]# cat ifcfg-enp1s0 
TYPE=Ethernet
BRIDGE=br0
BOOTPROTO=none
NAME=enp1s0
DEVICE=enp1s0
ZONE=public
# 創建br0,配置如下
[root@qcow2-build network-scripts]# cat ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.16.30.22
NETMASK=255.255.255.0
GATEWAY=172.16.30.254
DNS1=8.8.8.8
ZONE=public

三.制作qcow2鏡像

3.1 編寫制作qcow2鏡像的python腳本

[root@qcow2-build ~]# cat create_qcow2_by_iso.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author         : yuhaohao
# @Email          : yuhaohaozz@163.com
# @Time           : 2020/06/09 9:20
# @Version        : 1.0

import sys
import subprocess
import random
import string
import time

isofile=str(sys.argv[1])

try:
    hostinfo = {}
    hostinfo['name'] = \
    subprocess.check_output("echo %s|sed -r 's/(.*yuhaohao_)(.*)(_x86.*)/\\2/'" % isofile, shell=True).split('\n')[0]
    hostinfo['nic'] = '00:00:00:00:00:' + str(sys.argv[2])
    # 定義VNC的端口如5928
    hostinfo['vncport'] = '59' + str(sys.argv[2])
    # QCOW2鏡像的名稱
    hostinfo['disk'] = hostinfo['name'] + '.qcow2'
    # 內存配置4G
    hostinfo['ram'] = 4096
    # CPU核數
    hostinfo['vcpus'] = 2
    # 系統磁盤大小
    hostinfo['disksize'] = '290G'
    hostinfo['isofile'] = isofile
    hostinfo['vncpassword'] = ''.join(random.sample(string.ascii_letters + string.digits, 12))
except Exception as e:
    print('we have exception:' + e)
    exit(2)
print(hostinfo)


def create_vm():
    # QCOW2鏡像存放在/home/yuhaohao目錄
    subprocess.call('qemu-img create -f qcow2 /home/yuhaohao/{disk} {disksize}'.format(**hostinfo), shell=True)
    subprocess.call('virt-install --virt-type kvm \
--name {name} \
--os-variant rhel7 \
--ram {ram} \
--cdrom={isofile} \
-m {nic} \
--autostart \
--vcpus {vcpus}  \
--disk=/kvm/{disk} \
--graphics vnc,listen=0.0.0.0,port={vncport},keymap=en-us \
--network bridge=br0 \
--noautoconsole'.format(**hostinfo), shell=True)


if __name__ == '__main__':
    create_vm()
    print('Your vnc port is {vncport}'.format(**hostinfo))

3.2 制作qcow2鏡像

這里我們基於現有的kubernetes集群封裝的ISO鏡像制作qcow2格式的鏡像:

  • 制作qcow2鏡像
[root@qcow2-build ~]# chmod -R 777 create_qcow2_by_iso.py
[root@qcow2-build ~]# ./create_qcow2_by_iso.py oss_1.6.0.0_x86_64_20200608.iso 29

這里通過vnc viewer采用http://${IP}:5929連接查看安裝進度,安裝完成后,系統會自動關機。

  • 修改配置
[root@qcow2-build ~]# virsh start oss_1.6.0.0_x86_64_20200608.iso
# 修改/etc/default/grub
[root@oss ~]# vi /etc/default/grub
# 將biosdevname=1 改為了net.ifnames=0 biosdevname=0
GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0 net.ifnames=0 biosdevname=0 crashkernel=auto rd.luks.uuid=luks-13dadde4b-das3-43b0-d8fe-ed322a62c6b8
[root@oss ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
......
[root@oss ~]# systemctl restart network 
# 重新配置grub2
[root@oss ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
# 關機
[root@oss ~]# shutdown -h 0
  • 獲取qcow2鏡像
[root@qcow2-build ~]# ls /home/yuhaohao/oss_1.6.0.0_x86_64_20200608.iso.qcow2 -alh
-rw-r--r-- 1 qemu qemu 197K Jun  9 15:27 /home/yuhaohao/oss_1.6.0.0_x86_64_20200608.iso.qcow2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM