KVM系统镜像制作

 

使用virt-install创建虚拟机并安装GuestOS

  virt-install是一个命令行工具,它能够为KVM、Xen或其它支持libvirt API的hypervisor创建虚拟机并完成GuestOS安装;此外,它能够基于串行控制台、VNC或SDL支持文本或图形安装界面。安装过程可以使用本地的安装介质如CDROM,也可以通过网络方式如NFS、HTTP或FTP服务实现。对于通过网络安装的方式,virt-install可以自动加载必要的文件以启动安装过程而无须额外提供引导工具。当然,virt-install也支持PXE方式的安装过程,也能够直接使用现有的磁盘映像直接启动安装过程。

#制作虚拟机镜像所需的工具:
  yum install virt-install libvirt-daemon qemu-kvm qemu-img libguestfs-tools

  virt-install命令有许多选项,这些选项大体可分为下面几大类,同时对每类中的常用选项也做出简单说明。
  ◇ 一般选项:指定虚拟机的名称、内存大小、VCPU个数及特性等;
    -n NAME, --name=NAME:虚拟机名称,需全局惟一;
    -r MEMORY, --ram=MEMORY 【virt-install 1.5.0 以后不推荐使用的旧参数】
    --memory 可设定内存参数
      #虚拟机内在大小,单位为MB;
      #它所支持的子选项:
      maxmemory
      hugepages
      hotplugmemorymax 和 hotplugmemoryslots
      内存参数映射到<currentMemory>元素,'maxmemory'子选项映射到<memory>元素,
      'hotplugmemorymax'和'hotplugmemoryslots'映射到< maxmemory >元素。
      hotplugmemorymax: 应该定义内存动态大小调整的参数. hotplug: 热插拔

      

    --vcpus VCPUS=?[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]
    VCPU个数及相关配置;【具体参数: virt-install --vcpus=? 】
  --cpu=CPU:CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?来获取支持的CPU模式;
  --keymap=en-us
    #指定键盘布局.
    #xml配置文件中可修改VNC配置项: <graphics type='vnc' port='-1' keymap='en-us'/>

  --arch=ARCH
    #为虚拟机请求一个非本地CPU架构,这个选项当前只对qemu客户机有效,但是不能够使用加速机制。
    #如果忽略,在虚拟机中将使用主机CPU架构。
  --metadata OPT=VAL,[...]
    #为VM设置非必须的信息,如: 添加title(在使用virsh list --title时,可显示title描述信息),description, uuid等

  --check-cpu # 检查指定的虚拟CPU数不要超过物理CPU个数,如果超过将返回警告信息。
  --cpuset=CPUSET
   #设置哪个物理CPU能够被虚拟机使用。“CPUSET”是一个逗号分隔数字列表,也可以指定范围,例如:
    0,2,3,5 : Use processors 0,2,3 and 5 #使用0,2,3 和5 处理器
    1-3,5,6-8 : Use processors 1,2,3,5,6,7 and 8 #使用1,2,3,5,6,7,8处理器
   # 如果此参数值为‘auto’,virt-install将使用NUMA(非一致性内存访问)数据试图自动确定一个优化的CPU定位。

  --os-type=OS_TYPE
   #针对一类操作系统优化虚拟机配置(例如:‘Linux’,‘windows’),这将试图选择最适合的ACPI与APIC设置,
    支持优化鼠标驱动,virtio以及通常适应其他操作系统特性。

  --os-variant=OS_VARIANT
   #指定特定操作系统名(例如’fedora8’, ’winxp’)可让libvirt进一步优化虚拟机配置,特别是选择驱动上,使用更
    适合的驱动,如virtio等,来提高VM的性能。这个参数是可选的并且不需要与 "--os-type"选项并用。

  --host-device=HOSTDEV
   #附加一个物理主机设备到客户机。HOSTDEV是随着libvirt使用的一个节点设备名
    (具体设备如’virsh nodedev-list’的显示的结果)

  ◇ 安装方法:指定安装方法、GuestOS类型等;
    -c CDROM, --cdrom=CDROM:光盘安装介质;
    -l LOCATION, --location LOCATION:安装源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;
    --pxe:基于PXE完成安装;
    --livecd: 指定安装媒体为LiveCD,因此需要配置客户机以永久地从CDROM设备引导。
        还可以组合使用“ --disk none”标志。
    --os-type=DISTRO_TYPE:操作系统类型,如linux、unix或windows等;
    --os-variant OS_VARIAN
         优化特定操作系统的客户配置(例如'fedora18'、'rhel7'、'winxp')。虽然不是必需的,但是强烈建议指定此选项,
    因为它可以通过在其他客户机调整中指定virtio来极大地提高性能。
        默认情况下,virt-install将尝试从安装媒体自动检测此值(目前仅支持URL安装)。
    使用特殊值“none”可以禁用自动检测。
    若要强制自动检测可以设为“auto”。使用命令“osinfo-query os”获取可接受的os变体列表。

    -x EXTRA, --extra-args=EXTRA:根据--location指定的方式安装GuestOS时,用于传递给内核的额外选项,
          例如指定kickstart文件的位置,--extra-args "ks=http://172.16.0.1/class.cfg"

    --boot=? 可查看详细的可用参数列表
        #指定安装过程完成后的配置选项,如指定引导设备次序、
        使用指定的而非安装的kernel/initrd来引导系统启动等 ;例如:
          --boot cdrom,fd,hd,network,menu=on
        #设置启动顺序为cdrom,fd(软盘),hd(第一个找到的磁盘),network(使用PXE启动),在启动时显示启动菜单。

          --boot kernel=KERNEL,initrd=INITRD,kernel_args="console=/dev/ttyS0"
        #使用指定的内核选项,让Guest永久引导一个本地kernel/initrd对。

          --boot uefi
        #将VM配置为从UEFI引导。为了让virt-install知道正确的UEFI参数,libvirt需要通过domcapabilities XML
        已知的UEFI二进制文件,所以只有在使用正确配置的发行版包时,这才可能有效。

  ◇ 存储配置:指定存储类型、位置及属性等;
   #旧选项,不建议使用
     --disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path,opt1=val1,opt2=val2等;
      常用的选项有:
        device:设备类型,如cdrom、disk或floppy等,默认为disk;
        bus:磁盘总线类型,其值可以为ide、scsi、usb、virtio或xen;
        perms:访问权限,如rw、ro或sh(共享的可读写),默认为rw;
        size:新建磁盘映像的大小,单位为GB;
        cache:缓存模型,其值有none、writethrouth(缓存读)及writeback(缓存读写);
        format:磁盘映像格式,如raw、qcow2、vmdk等;
        sparse:磁盘映像使用稀疏格式,即不立即分配指定大小的空间;
    --nodisks:不使用本地磁盘,在LiveCD模式中常用;
    --disk=DISKOPTS

  #新选项,基于virt-install 1.5.0
    --disk opt1=val1,opt2=val2,...
     可用选项:
      path
        用于指定VM的存储设备,可为镜像文件或物理磁盘设备,
        它支持URL路径(如:http://a.com/a.img),但磁盘文件不会下载到本地.
        若提供的镜像文件不存在,则会自动创建,但参数中必须指定了size=?G .

      pool    #一个要在其上建立新存储的已有的libvirt存储池名,需要指定一个‘size’值。
      vol      #要使用的一个已有的libvirt存储卷,指定格式类似’poolname/volname’
    其他可用选项(Other available options)
      device
        磁盘设备类型。取值是’cdrom’, ’disk’, lun or ’floppy’,默认为 ’disk’。
        如果’cdrom’作为指定值并且没有选择安装方法,cdrom将被作为安装媒介。
      bus
        磁盘总线类型,取值是’ide’, 'sata', ’scsi’,’usb’, ’virtio’ 或 ’xen’.
        由于不是所有的hypervisor对所有总线类型都支持,因此默认值为依赖于所使用的hypervisor。
      removeable
        设置可移动标志(/sys/block/$dev/removable)。仅用于QEMU和bus=usb。Value可以是on或off。
      readonly=[on|off]    #设置驱动设备为只读.
      shareable=[on|off]     # 设置驱动设备为共享。
      perms          # 磁盘权限,取值为’rw’ (读/写), ’ro’ (只读), or ’sh’ (共享 读/写),默认值为’rw'
      size          #以GB为单位的新建存储大小。
      sparse=[true|false]     #设置是否创建稀疏格式的磁盘。
      format=[qcow2|raw|vmdk|....]
      cache=[none|writethrough|writeback|writethrough]   #设置虚拟磁盘的缓存模式.
          # unsafe:不安全的缓存(性能最好) > writeback: 回写缓存(性能较好) >
            writethrough:通写缓存(安全性高,性能次之)
        writeback:仅将数据写入磁盘缓存就返回完成,缓存中的数据在即将被换出时,才写入磁盘.
        writethrough: 将数据写入磁盘缓存的同时也写入磁盘,都完成后返回完成。
        none:读写都不使用缓存,而writeback 和 writethrough默认都优先使用缓存。

      backing_store #指定创建新镜像文件的后端镜像文件。
      backing_format #指明后端镜像文件的磁盘格式
      discard
        丢弃请求(也称为“trim”或“unmap”)是被忽略还是传递给文件系统。
        值可以是“unmap”(允许传递丢弃请求)或“ignore”(忽略丢弃请求)。
        自1.0.6起(仅适用于QEMU和KVM)

  ◇ 网络配置:指定网络接口的网络类型及接口属性如MAC地址、驱动模式等;
    -w NETWORK, --network=NETWORK,opt1=val1,opt2=val2:
     将虚拟机连入宿主机的网络中,其中NETWORK可以为:
      bridge=BRIDGE:连接至名为“BRIDEG”的桥设备;
      network=NAME:连接至名为“NAME”的网络;
      其它常用的选项还有:
       model:GuestOS中看到的网络设备型号,如e1000、rtl8139或virtio等;
       mac:固定的MAC地址;
          省略此选项时将使用随机地址,但无论何种方式,对于KVM来说,其前三段必须为52:54:00;
      --nonetworks:虚拟机不使用网络功能;

  #新选项:virt-install 1.5.0
    -w NETWORK, --network Options 【virt-install --network=? 】
      连接客户机到主机网络。若忽略此选项,默认会将VM的虚拟网口绑定到宿主机上的物理桥上
      【物理桥:即与物理网卡桥接的虚拟网桥】
      若没有物理桥,则默认桥接到default桥上。
      Options可为以下值:
        bridge:BRIDGE #指定VM启动时,将其桥接到指定宿主机的虚拟网桥上。
        network:NAME #指定VM启动时,将其虚拟网卡连接到virsh 创建的虚拟网络上。默认是default网络
        user       #设置使用Qemu内部实现的TCP/IP协议栈来配置VM连接到宿主机的网络。
        none      #不添加任何虚拟网口到default桥上.
        model     #设置VM网卡的类型:如:'e1000'、'rtl8139'、'virtio'...
        mac     #指定客户机网卡物理地址;如果忽略这个参数或者指定了值"RANDOM",
            将随机产生一个适当的地址。对应基于Xen的虚拟机,物理地址中最先的3对必须
            是’00:16:3e’,而QEMU或KVM虚拟机必须是’54:52:00’。
        filterref    #在libvirt中控制防火墙和网络过滤。值可以是由“virsh nwfilter”子命令定义的任何network filter。
·              可用的过滤器可以列出运行'virsh nwfilter-list',例如:'clean-traffic', 'no-mac-spoofing',…
        virtualport_type    #指定虚拟端口的类型
          支持的类型: openvswitch, 802.Qbg, 802.Qbh,midonet ,
            他们都有自己的子选项,我还不太理解。就不写出来了。

  以下选项以标记为废弃:
    -b BRIDGE, --bridge=BRIDGE
      指定连接客户机网卡的桥接设备。这个参数不能与 "--network"选项共同使用。指定
      Bridge device to connect the guest NIC to. This parameter is deprecated in favour of the "--network" parameter.
    -m MAC, --mac=MAC
      指定客户机网卡物理地址;如果忽略这个参数或者指定了值"RANDOM",将随机产生一个适当的地址。
      对应基于Xen的虚拟机,物理地址中最先的3对必须是’00:16:3e’, 而QEMU或KVM虚拟机必须是’54:52:00’。
    --nonetworks
      请求一个没有任何网卡的虚拟机。
      Request a virtual machine without any network interfaces.

  ◇ 图形配置:定义虚拟机显示功能相关的配置,如VNC相关配置;
    #指定图形显示相关的配置,此选项不会配置任何显示硬件(如显卡),而是仅指定虚拟机启动后对其进行访问的接口;
    --graphics TYPE,opt1=val1,opt2=val2
      TYPE:指定显示类型,可以为vnc、sdl、spice或none等,默认为vnc;
      port:TYPE为vnc或spice时其监听的端口;
      listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,可以通过修改/etc/libvirt/qemu.conf定义新的默认值;
      password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码;
    --noautoconsole:禁止自动连接至虚拟机的控制台;

  ◇ 设备选项:指定文本控制台、声音设备、串行接口、并行接口、显示接口等;
    --serial=CHAROPTS
      附加一个串行设备至当前虚拟机,根据设备类型的不同,可以使用不同的选项,
        格式为“--serial type,opt1=val1,opt2=val2,...”,例如:
          --serial pty:创建伪终端;
          --serial dev,path=HOSTPATH:附加主机设备至此虚拟机;
    --video=VIDEO:指定显卡设备模型,可用取值为cirrus、vga、qxl或vmvga;

  ◇ 虚拟化平台:
    虚拟化模型(hvm或paravirt)、模拟的CPU平台类型、模拟的主机类型、
    hypervisor类型(如kvm、xen或qemu等)以及当前虚拟机的UUID等;
    -v, --hvm:当物理机同时支持完全虚拟化和半虚拟化时,指定使用完全虚拟化;
    -p, --paravirt:指定使用半虚拟化;
    --virt-type:使用的hypervisor,如kvm、qemu、xen等;所有可用值可以使用’virsh capabilities’命令获取;

  ◇ 其它:
    --autostart:指定虚拟机是否在物理启动后自动启动;
    --print-xml:如果虚拟机不需要安装过程(--import、--boot),则显示生成的XML而不是创建此虚拟机;
        默认情况下,此选项仍会创建磁盘映像;
    --force:禁止命令进入交互式模式,如果有需要回答yes或no选项,则自动回答为yes;
    --dry-run:执行创建虚拟机的整个过程,但不真正创建虚拟机、改变主机上的设备配置信息及将其创建的需求通知给libvirt;
    -d, --debug:显示debug信息;

  尽管virt-install命令有着类似上述的众多选项,但实际使用中,其必须提供的选项仅包括--name、--ram、--disk(也可是--nodisks)
及安装过程相关的选项。此外,有时还需要使用括--connect=CONNCT选项来指定连接至一个非默认的hypervisor。
  --connect URI     
    连接到一个非默认hypervisor,选择默认链接基于以下规则:
    qemu:///system
      用于创建由系统libvirtd实例运行的KVM和QEMU客户机。
      这是virt-manager使用的默认模式,也是大多数KVM用户想要的。

    qemu:///session
      用于为作为普通用户运行的libvirtd创建KVM和QEMU客户机。

    xen:///
      用于连接到xen

    lxc:///
      连接到创建的LXC容器

使用示例:

1. 安装Ubuntu server18.10【参数使用,可参考此设置】
  virt-install --name ubuntuserver1810x64 \
    --memory memory=2048,maxmemory=3000 \   #--memory 2048 等价于 --memory memory=2048
    --vcpus vcpus=2,cores=2 \
    --virt-type kvm \
    --disk path=/image/kvm/vm1.qcow2,format=qcow2,size=10,sparse=true,bus=virtio,device=disk,cache=writeback \
      #若vm1.qcow2不存在,将自动创建,自动创建大小为size所设定的值10G(默认单位:G), sparse:指定为稀疏格式
      # bus:指定驱动为virtio, 设备类型为disk, 使用缓存类型为writeback
    --disk path=ubuntu-18.10-live-server-amd64.iso,device=cdrom \
    --network bridge:kvmbr0,model=virtio \
      #设置VM启动后连接到brctl创建的kvmbr0网桥上。
    --graphics vnc,listen=0.0.0.0,port=5902,password=123456789 \
    --os-variant ubuntu17.10

2. 使用网络yum源来启动网络安装CentOS
  virt-install --name "centos6" \
    -r 512 --vcpus=2 \
    --location http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-x86_64/ -x "ks=http://172.16.0.1/centos6.x86_64.cfg" \
    --disk path=/images/kvm/centos6.img,size=120,sparse \
    --force -w bridge=br100,model=virtio

3.下面这个示例创建一个名为rhel5的虚拟机,其hypervisor为KVM,内存大小为512MB,磁盘为8G的映像文件
 /var/lib/libvirt/images/rhel5.8.img,通过boot.iso光盘镜像来引导启动安装过程。
  # virt-install \
    --connect qemu:///system \
    --virt-type kvm \
    --name rhel5 \
    --ram 512 \
    --disk path=/var/lib/libvirt/images/rhel5.img,size=8 \
    --graphics vnc \
    --cdrom /tmp/boot.iso \
    --os-variant rhel5

4. 下面的示例将创建一个名为rhel6的虚拟机,其有两个虚拟CPU,安装方法为FTP,并指定了ks文件的位置,磁盘映像文件为稀疏格式,连接至物理主机上的名为brnet0的桥接网络:
  # virt-install \
    --connect qemu:///system \
    --virt-type kvm \
    --name rhel6 \
    --ram 1024 \
    --vcpus 2 \
    --network bridge=brnet0 \
    --disk path=/VMs/images/rhel6.img,size=120,sparse \
    --location ftp://172.16.0.1/rhel6/dvd \
    --extra_args “ks=http://172.16.0.1/rhel6.cfg” \
    --os-variant rhel6 \
    --force

5. 下面的示例将创建一个名为rhel5.8的虚拟机,磁盘映像文件为稀疏模式的格式为qcow2且总线类型为virtio,安装过程不启动图形界面(--nographics),但会启动一个串行终端将安装过程以字符形式显示在当前文本模式下,虚拟机显卡类型为cirrus:
  # virt-install \
    --connect qemu:///system \
    --virt-type kvm \
    --name rhel5.8 \
    --vcpus 2,maxvcpus=4 \
    --ram 512 \
    --disk path=/VMs/images/rhel5.8.img,size=120,format=qcow2,bus=virtio,sparse \
    --network bridge=brnet0,model=virtio
    --nographics \
    --location ftp://172.16.0.1/pub \
    --extra-args "ks=http://172.16.0.1/class.cfg console=ttyS0 serial" \
    --os-variant rhel5 \
    --force \
    --video=cirrus

6. 下面的示例则利用已经存在的磁盘映像文件(已经有安装好的系统)创建一个名为rhel5.8的虚拟机:
  # virt-install \
    --name rhel5.8
    --ram 512
    --disk /VMs/rhel5.8.img
    --import


实际在使用virt-install制作云环境系统镜像的基本步骤:


注意:每个虚拟机创建后,其配置信息保存在/etc/libvirt/qemu目录中,文件名与虚拟机相同,格式为XML。
1.创建磁盘镜像
  qemu-img create -f qcow2 -o size=100G ubnutuserver1810x64.qcow2

2.安装ubuntu系统到磁盘镜像,这里需要注意,因为ubuntu18.10.live-server-amd64.iso镜像太新了,当前virt-install还没有提供支持,
因此我就使用了最接近的版本ubuntu17.10来代替。 具体当前virt-install支持那些可用系统关键字可执行命令: osinfo-query os
  virt-install --virt-type kvm \
    --os-variant ubuntu17.10 \
    --name ubuntuserver1 \
    --ram 2048 --cdrom=ubuntu-18.10-live-server-amd64.iso \
    --disk=ubuntuserver1810x64.qcow2,bus=virtio,format=qcow2 \
    --network=bridge:kvmbr0 --graphics vnc,listen=0.0.0.0,port=5900,password=12345678 \
    --check all=off

3.ubuntu安装完成后,它要求重启,但重启实际是关机,需要使用下面命令来启动,测试是否安装成功.
  方式1:
    qemu-kvm -name vm1 -m 2G -smp 1 \
      -drive file=ubuntuserver1810x64.qcow2,if=virtio,media=disk,cache=writeback,format=qcow2 \
      -net nic -net tap,script=ifup,downscript=ifdown -vnc :1

  方式2:
    virsh destroy ubuntuserver1 #若没有使用virsh启动过ubuntuserver1,可不做。
    virsh --connect qemu:///system start ubuntuserver1 #启动VM

4. 安装cloud-init到VM中
  这个我还不熟悉:
    在创建Ubuntu镜像时,cloud-init必须明确的配置元数据源.
    openstack元数据服务是仿照Amazon EC2元数据服务,运行dpkg-reconfigure 命令设置镜像cloud-init软件包
    使用的元数据,当出现提示时,选择EC2数据源。
  dpkg-reconfigure cloud-init

  编辑/etc/cloud/cloud.cfg文件中添加一行修改cloud-init使用的账号名,添加: user:admin
  这是来配置cloud-init存放公钥到admin账号。

5. 封装镜像为通用镜像
  当安装好系统后,它会在网卡配置文件,以及udev的规则文件中添加一些网卡的MAC地址信息,这些不利于云环境中镜像的通用性,
 因此需要使用virt-sysprep工具来清除VM中的MAC信息.
  yum install -y guestfish
  virt-sysprep -d ubuntuserver1

6. 删除libvirt的镜像管理信息,因为需要将制作好的镜像放到openstack等公有云的镜像管理仓库中,而不需要libvirtd来管理VM镜像,因此需要删除libvirtd创建镜像时的一些元数据,这样下次创建就不会出现下次在使用"ubuntuserver1"时,它报错说ubuntuserver1已存在的问题。
  virsh undefine ubuntuserver1

开源通用磁盘镜像文件使用注意事项:

#可从一些开源系统的官网下载制作好的通用磁盘镜像文件,只需要在使用前将root密码修改了,就可以它做模板来复制一份磁盘文件,就能用于VM的启动了。

  # yum install libguestfs-tools
  # virt-customize -a /os/images/CentOS-7-x86_64-GenericCloud-1511.qcow2 --root-password password:123456

qemu-img 创建,修复,查看镜像文件的方法:

qemu-img是qemu用来实现磁盘映像管理的工具组件,其有许多子命令,分别用于实现不同的管理功能,而每一个子命令也都有一系列不同的选项。
其使用语法格式为“qemu-img subcommand [options]”,支持的子命令如下:

  创建虚拟磁盘文件:
  ◇ create:创建一个新的磁盘映像文件
    #注: qemu-img创建的磁盘映像文件是采用稀疏磁盘格式创建的.
      因此用:du -sh linux.img 可看到其大小很小.

    #创建一个raw(裸磁盘)格式的磁盘镜像
     qemu-img create -f raw -o size=2G /images/xen/linux.img
    或
     qemu-img create -f raw /images/xen/linux.img 2G
    #若想知道当前指定的磁盘格式支持哪些额外参数:
     qemu-img create -f qcow2 -o ? /images/xen/linux.img
      size : 指定qcow2格式的虚拟磁盘大小。
      backing_file: 指定其后端存储快照信息的映像文件位置.
      backing_fmt: 指定后端映像文件的格式。
      encryption: 是否对创建的映像文件加密
      cluster_size: 指定qcow2格式的簇大小.
      preallocation: 指定创建qcow2格式的磁盘映像文件时,需要预先做些什么:
        > off : 什么也不做,创建一个空磁盘.
        > metadata: 预先创建qcow2的元数据信息,建议设置.
        > full: 直接填充成指定大小的磁盘文件,它包含了metadata.
      lazy_refcounts=[on|off]
        on:延时更新引用计数,已避免元数据更新过多影响I/O性能.但这可能在VM崩溃时,重建引用计数表时(qemu-img check -r all),会非常耗时.
        off: 默认值.

  #创建一个类似于VMware的链接克隆磁盘文件
    qemu-img create -f qcow2 -b /tmp/rhel6u3.img  /tmp/rhel6u3.qcow2
    或
    qemu-img create -f qcow2 -o backing_file=/tmp/rhel6u3.img  /tmp/rhel6u3.qcow2
   注:
    -o backing_file 和 -b FileName 功能一样.它们都是创建一个后端镜像文件的一个快照,当对快照磁盘文件
   rhel6u3.qcow2修改时,它会CoW(写时复制)将后端镜像文件rhel6u3.img中数据复制到当前快照磁盘后,在
      做修改保存,所以它实际上就是VMware上的链接克隆。
    后端镜像文件的内容是不会被修改的,除非在QEMU monitor中使用“commit”命令或者使用
    “qemu-img commit”命令去手动提交这些改动。
    另外 size参数在此时也不是必须的,其值默认为后端镜像文件的大小。

  ◇ check:检查磁盘映像文件中的错误;
    对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对“qcow2”、“qed”、“vdi”格式文件的检查。
    (1) qcow2: QEMU 0.8.3版本引入的镜像文件格式,也是目前使用最广泛的格式。
    (2) qed(QEMU enhanced disk): 从QEMU 0.14版开始加入的增强磁盘文件格式,
      它是为了避免qcow2格式的一些缺点,同时提高性能而引入,目前还不够成熟。
    (3) vdi(Virtual Disk Image): Oracle的VirtualBox虚拟机中的存储格式。
      参数-f fmt是指定文件的格式,如果不指定格式qemu-img会自动检测,filename是磁盘镜像文件的名称(包括路径)。
    如:
      qemu-img check -f qcow2 /tmp/rhel6u3.qcow2

  ◇ convert:转换磁盘映像的格式;
   格式:
    qemu-img convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename2 […]] output_filename
      -c :对输出的镜像文件进行压缩,仅支持qcow2和qcow格式,且此压缩是只读的,若压缩的扇区被重写,
        则会被重写为未压缩的数据。
      -f : 指定源磁盘映像文件的格式.
      -O : 指定输出磁盘映像文件的格式.
      -o : 指定输出磁盘映像文件的其它选项:如:后端镜像、文件大小、是否加密等等
    注: 使用backing_file选项来指定后端镜像,让生成的文件是copy-on-write的增量文件,
      这时必须让转换命令中指定的后端镜像与输入文件的后端镜像的内容是相同的,
      尽管它们各自后端镜像的目录、格式可能不同。
    #注: 一般来说,输入文件格式fmt由qemu-img工具自动检测到,而输出文件格式output_fmt根据自己需要来指定,默认会被转换为raw文件格式(且默认使用稀疏文件的方式存储以节省存储空间)。另外如果使用qcow2、qcow、cow等作为输出文件格式来转换raw格式的镜像文件(非稀疏文件格式),镜像转换还可以起到将镜像文件转化为更小的镜像,因为它可以将空的扇区删除使之在生成的输出文件中并不存在。
    如:
       qemu-img convert /tmp/my-vmware.vmdk /tmp/my-kvm.img

  ◇ info:显示指定磁盘映像的信息;
    注: 如果文件是使用稀疏文件的存储方式,也会显示出它的本来分配的大小以及实际已占用的磁盘空间大小。如果文件中存放有客户机快照,快照的信息也会被显示出来。
    如: 
      qemu-img info /tmp/rhel6u3.img

  ◇ snapshot:管理磁盘映像的快照;
    格式: qemu-img snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename
      -l: 选项是查询并列出镜像文件中的所有快照
      -a snapshot : 是让镜像文件使用某个快照
      -c snapshot : 是创建一个快照
      -d snapshot : 是删除一个快照。

  ◇ commit:提交filename文件中的更改到后端支持镜像文件(创建时通过backing_file指定的)中去;
    格式: qemu-img commit [-f fmt] filename

  ◇ rbase:改变镜像文件的后端镜像文件,只有qcow2和qed格式支持rebase命令;
    格式: qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
        -b backing_file:指定作为后端磁盘映像的文件
        -F backing_fmt:指定将后端映像文件转换为何种磁盘映像格式。
        注:
          rbase操作可工作于两种模式下,安全模式(Safe Mode)【默认模式】和 非安全模式【Unsafe Mode】
          在安全模式下qemu-img会去比较原来的后端镜像与现在的后端镜像的不同进行合并处理;
        -u 可指定非安全模式(Unsafe Mode),此模式主要用于将后端镜像进行了重命名或移动位置之后对前端镜像文件的修复处理,由用户去保证后端镜像的一致性。

  ◇ resize:增大或缩减磁盘映像文件的大小;
    格式: qemu-img resize filename [+ | -]size
        + : 增加
        - :减少
        size: 单位支持:K/M/G/T
   注意:
    缩小镜像的大小前,需保证客户机里面的文件系统有空余空间,否则会数据丢失,
  另外,qcow2格式文件不支持缩小镜像的操作。在增加了镜像文件大小后,也需启动客户机到
  里面去使用“fdisk”、“parted”等分区工具进行相应的操作才能真正让客户机使用到增加后的镜像空间。
  不过使用resize命令时需要小心(最好做好备份),如果失败的话,可能会导致镜像文件无法正常使用而造成数据丢失。
  如:

    qemu-img resize /tmp/rhel6u3-a.img +2G



qemu-kvm 制作镜像示例:
  1. 创建一个Busybox虚拟机示例:
    (1) 创建一个虚拟磁盘映像文件:
      qemu-img create -f raw -o size=2G /images/xen/busybox.img
    (2) 将其格式化并挂载:
      cd /images/xen
      mkfs.ext2 busybox.img
      mount -o loop /images/xen/busybox.img /mnt
    (3) 编译busybox
      下载busybox:
      tar xvjf busybox-*.tar.bz2
      cd busybox*
      make menuconfig
    # 注:若busybox需要进行静态编译则需要安装: yum install glibc-static ;
    # 此RPM包可以支持静态编译,使编译的应用程序可直接包含所需要的外部库,而非连接载入外部库.
      busybox Settings-->Build Optons-->Build BusyBox as a static binary(no shared libs)
          |-->Installation Options(”make install" behavior)
      make
      make install    #注:安装后,busybox会文件安装到当前编译目录下的_install目录中.
      cd _install
      cp -a * /mnt    #将busybox的所有文件copy到busybox.img中,作为一个模拟的根文件系统.
                    # 提供以下目录,也是十分重要的:
      mkdir -pv /mnt/{proc, var, sys, etc, dev, usr, tmp, home, root, opt}
    (4) chroot测试:
      chroot /mnt

  2. 使用KVM制作CentOS,Ubuntu,Windows镜像:
  【下面的方法,仅供参考,测试ubuntu18.10时,失败了, 建议新系统都是有virt-install来制作】

  这里以Windows XP为例,其它和它一样:
  #先创建一个50G的qcow2的磁盘镜像文件
    qemu-img create -f qcow2 -o size=50G /images/kvm/winxp.img

    #指定光盘为第一引导项,启动系统安装WinXP操作系统
    qemu-kvm -name WinXP-001 -smp 4,sockets=1,cores=2,threads=2 -m 512 \
      -drive file=/images/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 \
      -drive file=/root/winxp_ghost.iso,media=cdrom \
      -boot order=d,once=d,menu=on \
      -vnc :1

posted @ 2019-08-01 11:47  张朝锋  阅读(7482)  评论(0编辑  收藏  举报