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


免責聲明!

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



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