KVM鏡像管理利器-guestfish使用詳解

KVM鏡像管理利器-guestfish使用詳解linux


本文介紹如下內容:web


1. 虛擬機鏡像掛載及w2k8虛擬機啓動自檢慢問題解決辦法

2. KVM虛擬化與guestfish套件

3. guestfish安裝與注意事項

4. 使用guestfish查看虛擬機信息

5. 使用guestfish查看虛擬機分區及文件系統

6. 去掉磁盤空洞--KVM虛擬鏡像的稀疏問題

7. 用guestfish操做虛擬機內部文件

8. guestfish修改鏡像格式和大小

9. guestfish掛載、修改、運行救援方式
shell


1. 虛擬機鏡像掛載及w2k8虛擬機啓動自檢慢問題解決辦法

guestfish套件是鏡像管理的利器,在沒有guestfish這個套件以前,對虛擬機鏡像的處理,要麼虛擬機運行起來修改,要麼使用下面介紹的辦法,總之很不方便。windows

下面介紹的的掛載辦法,只適應於塊設備鏡像的掛載。centos

在guestfish出來以前,對鏡像的處理,只能是先轉化成raw格式,raw在轉化成裸格式,而後掛載,很是痛苦。bash

再一次感謝guestfish套件的做者。app

w2k8虛擬機啓動啓動慢問題解決辦法dom

在kvm虛擬機上,常常碰到這樣的問題,就是windows 2008 server的虛擬機,有時候重啓的時候,磁盤檢查須要幾個小時,即便新裝的系統也是這樣,下面咱們介紹經過裸設備掛載的方式擦除windows 2008 server磁盤檢查標誌的方法,繞過這個問題。ide

操做方法:工具

第一步 在宿主機上安裝最新的ntfs-3g

wget http://tuxera.com/opensource/ntfs-3g_ntfsprogs-2012.1.15.tgz
tar -zxvf ntfs-3g_ntfsprogs-2012.1.15.tgz
cd ntfs-3g_ntfsprogs-2012.1.15
./configure --bindir=/usr/bin
make
make install


第二步 擴展鏡像,將鏡像掛載,並檢查

先使用losetup –f 獲得可用的loop設備

losetup -f
/dev/loop0


掛載鏡像

losetup /dev/loop0 /dev/vmVG/ptyyb-webzb-57_vda


使用kartx 將鏡像分區映射,若是2008鏡像是一個分區,默認會掛載到/dev/mapper/loop0p1

由於2008默認安裝的時候會有一個boot分區,那麼c盤就在/dev/mapper/loop0p2上,根據本身實際狀況掛載

kpartx -av /dev/loop0


檢查鏡像,嘗試 –b –d很重要,只有最新版的ntfs-3g支持

ntfsfix -b -d /dev/mapper/loop0p1


分離鏡像映射

kpartx -dv /dev/loop0


分離鏡像掛載

losetup -d /dev/loop0


2. KVM虛擬化與guestfish套件

咱們來看看guestfish套件是什麼

guestfish是一套虛擬機鏡像管理的利器,提供一系列對鏡像管理的工具,也提供對外的API。

guestfish主要包含如下工具:

guestfish interactive shell  掛載鏡像,並提供一個交互的shell。

guestmount mount guest filesystem in hos 將鏡像掛載到指定的目錄。

guestumount unmount guest filesystem 卸載鏡像目錄。

virt-alignment-scan 鏡像塊對齊掃描。

virt-builder — quick p_w_picpath builder 快速鏡像建立。

virt-cat(1) — display a file 顯示鏡像中文件內容。

virt-copy-in(1) — copy files and directories into a VM 拷貝文件到鏡像內部。

virt-copy-out(1) — copy files and directories out of a VM 拷貝鏡像文件出來。

virt-customize(1) — customize virtual machines 定製虛擬機鏡像

virt-df(1) — free space 查看虛擬機鏡像空間使用狀況。

virt-diff(1) — differences 不啓動虛擬機的狀況下,比較虛擬機內部兩份文件差異。

virt-edit(1) — edit a file 編輯虛擬機內部文件。

virt-filesystems(1) — display information about filesystems, devices, LVM 顯示鏡像文件系統信息。

virt-format(1) — erase and make blank disks 格式化鏡像內部磁盤。

virt-inspector(1) — inspect VM p_w_picpaths 鏡像信息測試。

virt-list-filesystems(1) — list filesystems 列出鏡像文件系統。

virt-list-partitions(1) — list partitions 列出鏡像分區信息。

virt-log(1) — display log files 顯示鏡像日誌。

virt-ls(1) — list files 列出鏡像文件。

virt-make-fs(1) — make a filesystem 鏡像中建立文件系統。

virt-p2v(1) — convert physical machine to run on KVM 物理機轉虛擬機。

virt-p2v-make-disk(1) — make P2V ISO 建立物理機轉虛擬機ISO光盤。

virt-p2v-make-kickstart(1) — make P2V kickstart 建立物理機轉虛擬機kickstart文件。

virt-rescue(1) — rescue shell 進去虛擬機救援模式。

virt-resize(1) — resize virtual machines 虛擬機分區大小修改。

virt-sparsify(1) — make virtual machines sparse (thin-provisioned) 鏡像稀疏空洞消除。

virt-sysprep(1) — unconfigure a virtual machine before cloning 鏡像初始化。

virt-tar(1) — archive and upload files 文件打包並傳入傳出鏡像。

virt-tar-in(1) — archive and upload files 文件打包並傳入鏡像。

virt-tar-out(1) — archive and download files 文件打包並傳出鏡像。

virt-v2v(1) — convert guest to run on KVM 其餘格式虛擬機鏡像轉KVM鏡像。

virt-win-reg(1) — export and merge Windows Registry keys windows註冊表導入鏡像。

libguestfs-test-tool(1) — test libguestfs 測試libguestfs

libguestfs-make-fixed-appliance(1) — make libguestfs fixed appliance

hivex(3) — extract Windows Registry hive 解壓windows註冊表文件。

hivexregedit(1) — merge and export Registry changes from regedit-format files 合併、並導出註冊表文件內容。

hivexsh(1) — Windows Registry hive shell window註冊表修改交互的shell。

hivexml(1) — convert Windows Registry hive to XML 將window註冊表轉化爲xml

hivexget(1) — extract data from Windows Registry hive 獲得註冊表鍵值。

guestfsd(8) — guestfs daemon guestfs服務。

3. guestfish安裝與注意事項

guestfish套件安裝

guestfish套件安裝很是簡單,一條命令就能夠。

yum install libguestfs-tools


注意:

默認安裝是不安裝windows系統支持的,若是須要修改windows系統鏡像,須要再運行以下命令。

yum install libguestfs-winsupport


4. 使用guestfish查看虛擬機信息

虛擬機鏡像信息查看,主要經過virt-inspector和virt-inspector2命令

virt-inspector - Display OS version, kernel, drivers, mount points, applications, etc. in a virtual machine

virt-inspector 顯示os版本、內核、驅動、掛載點、應用等等。

virt-inspector2 - Display operating system version and other information about a virtual machine

virt-inspector2 顯示os版本和其餘信息。

virt-inspector示例

virt-inspector centos5332.qcow2
linux centos i386 5.3 (CentOS release 5.3 (Final)) on /dev/vmvg/root:
  Mountpoints:
    /dev/vmvg/root /
    /dev/sda1 /boot
    /dev/vmvg/swap swap
  Filesystems:
    /dev/sda1:
      label: /boot
      UUID: 152ec813-72cc-4ea1-ad76-71c470feff2f
      type: ext3
      content: linux-grub
    /dev/vmvg/root:
      label:
      UUID: 9462b99e-04d9-4648-9d5d-2ce50d8ed8f2
      type: ext3
      content: linux-root
    /dev/vmvg/swap:
      type: swap
  Modprobe aliases:
    binfmt-204 binfmt_aout
    binfmt-263 binfmt_aout
    binfmt-264 binfmt_aout
    binfmt-267 binfmt_aout
    binfmt-387 binfmt_aout


也能夠經過--query輸出一些固定內容,方便腳本判斷。

virt-inspector --query centos5332.qcow2
windows=no
linux=yes
rhel=no
fedora=no
debian=no
fullvirt=yes
xen_domU_kernel=no
xen_pv_drivers=yes
virtio_drivers=yes
kernel_arch=i386
userspace_arch=i386


輸出也能夠是xml格式 加--xml參數就能夠

virt-inspector windows虛擬機示例

windows i386 5.2 (Microsoft Windows Server 2003) on /dev/sda1:
  Mountpoints:
    /dev/sda1 /
  Filesystems:
    /dev/sda1:
      type: ntfs
      content: windows-root
  Applications:


virt-inspector2 輸出爲xml格式,系統相關信息比virt-inspector詳細

virt-inspector2 示例

virt-inspector2 centos5332.qcow2
<?xml version="1.0"?>
<operatingsystems>
  <operatingsystem>
    <root>/dev/vmvg/root</root>
    <name>linux</name>
    <arch>i386</arch>
    <distro>centos</distro>
    <product_name>CentOS release 5.3 (Final)</product_name>
    <major_version>5</major_version>
    <minor_version>3</minor_version>
    <package_format>rpm</package_format>
    <package_management>yum</package_management>
    <hostname>localhost.localdomain</hostname>
    <format>installed</format>
    <mountpoints>
      <mountpoint dev="/dev/vmvg/root">/</mountpoint>
      <mountpoint dev="/dev/sda1">/boot</mountpoint>
    </mountpoints>
    <filesystems>


virt-inspector2 windows虛擬機示例

<arch>i386</arch>
    <distro>windows</distro>
    <product_name>Microsoft Windows Server 2003</product_name>
    <major_version>5</major_version>
    <minor_version>2</minor_version>
    <windows_systemroot>/WINDOWS</windows_systemroot>
    <windows_current_control_set>ControlSet001</windows_current_control_set>
    <hostname>ks-55e1e4a74d40</hostname>
    <format>installed</format>
    <mountpoints>
      <mountpoint dev="/dev/sda1">/</mountpoint>
    </mountpoints>
    <filesystems>
      <filesystem dev="/dev/sda1">
        <type>ntfs</type>
        <uuid>4A5061F55061E7E1</uuid>
      </filesystem>
    </filesystems>
    <drive_mappings>
      <drive_mapping name="C">/dev/sda1</drive_mapping>
    </drive_mappings>
    <applications>
      <application>
        <name>Google Chrome</name>


5. 使用guestfish查看虛擬機分區及文件系統

虛擬機分區及文件系統查看主要使用三個命令

virt-list-partitions - List partitions in a virtual machine or disk p_w_picpath

列出虛擬機鏡像文件分區信息

virt-filesystems - List filesystems, partitions, block devices, LVM in a virtual machine or disk p_w_picpath

列出虛擬機鏡像文件文件系統,分區,塊設備,lvm信息

virt-alignment-scan

virt-alignment-scan - Check alignment of virtual machine partitions

查看虛擬機鏡像分區是否塊對齊

示例

linux 鏡像查看

virt-list-partitions centos6232.qcow2
/dev/sda1
/dev/sda2
virt-list-filesystems centos6232.qcow2
/dev/sda1
/dev/vmvg/root


windows 鏡像查看

virt-list-filesystems win2k3.qcow2   
/dev/sda1    
 virt-list-partitions win2k3.qcow2    
/dev/sda1


檢查鏡像是否塊對齊

virt-alignment-scan -a win2k3.qcow2
/dev/sda1 32256 512 bad (alignment < 4K)
virt-alignment-scan -a centos6232.qcow2
/dev/sda1 1048576 1024K ok
/dev/sda2 210763776 1024K ok


6. 去掉磁盤空洞--KVM虛擬鏡像的稀疏問題

RAW格式和QCOW2

KVM虛擬化文件系統鏡像,通常使用RAW或者QCOW2的方式:

RAW 一次性將要使用的鏡像空間分配完。

QCOW2 精簡模式,磁盤用多少,才佔多少空間。

ext4的稀疏特性

咱們使用不通的方式的建立方式幾個鏡像文件對比下,

qemu-img create -f raw test.raw 5G
qemu-img create -f qcow2 test.qcow2 5G
dd if=/dev/zero of=/root/test.dd bs=1G count=5


經過ls du查看,咱們會發現一個很是有意思的事情

ls -l
-rw-r--r-- 1 root root 5.0G Oct 13 22:46 test.dd
-rw-r--r-- 1 root root 193K Oct 13 22:58 test.qcow2
-rw-r--r-- 1 root root 5.0G Oct 13 22:58 test.raw


會發現raw是5G

du test*
5242880 test.dd
196 test.qcow2
0 test.raw


會發現raw是0G

爲何會這樣呢,這是由於ext4文件系統是一個支持稀疏特性的文件系統,當文件內容所有是空的時候,ext4並不分配實際的空間。

那若是想要使用RAW方式,並但願一次佔用完全部的空間,可使用dd命令的方式。

qcow2 的稀疏問題

qcow2方式也有稀疏的問題,在磁盤級別上看,鏡像會有大量連續的相同空洞,好比剛建立的鏡像的swap分區,經過virt-sparsify 咱們能夠消除這些空洞,從而縮小磁盤大小,便於咱們傳輸磁盤鏡像。

使用virt-sparsify 前,咱們須要先建立一個新的一樣大小的鏡像

qemu-img create -f qcow2 test2.qcow2 5G


而後使用virt-sparsify,去除鏡像空洞,語法爲

virt-sparsify  -x   /root/test.qcow2 --convert qcow2 /root/test2.qcow2


7. 用guestfish操做虛擬機內部文件

虛擬機內部文件管理主要使用如下命令:

virt-df - Display free space on virtual filesystems

鏡像磁盤空間使用查看

virt-ls - List files in a virtual machine

列出指定目錄內文件

virt-cat - Display files in a virtual machine

顯示指定文件內容

virt-edit - Edit a file in a virtual machine

編輯指定文件

virt-copy-in - Copy files and directories into a virtual machine disk p_w_picpath.

將文件拷貝到虛擬機內部

virt-copy-out - Copy files and directories out of a virtual machine disk p_w_picpath.q

將虛擬機內部文件拷貝出來

virt-tar-in - Unpack a tarball into a virtual machine disk p_w_picpath

tar壓縮文件拷貝進虛擬機並解壓

virt-tar-out - Pack a virtual machine disk p_w_picpath directory into a tarball.

鏡像內指定目錄文件拷貝並壓縮

virt-tar - Extract or upload files to a virtual machine

解壓或者上傳文件到虛擬機

示例

查看鏡像磁盤空間

virt-df -a centos6364.qcow2
Filesystem 1K-blocks Used Available Use%
centos6364.qcow2:/dev/sda1 198337 32098 155999 17%
centos6364.qcow2:/dev/vmvg/root 16308136 1210172 14269548 8%


查看鏡像/root目錄內容

virt-ls -a centos6364.qcow2 /root
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc
.tcshrc
anaconda-ks.cfg
install.log
install.log.syslog


顯示指定文件內容

virt-cat -a centos6364.qcow2 /root/anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
...


編輯指導文件

virt-edit -a centos6364.qcow2 /root/anaconda-ks.cfg


文件拷貝進鏡像及拷貝出鏡像

touch test.txt
virt-copy-in test.txt -a centos6364.qcow2 /root/
virt-copy-out -a centos6364.qcow2 /root/test.txt /home


壓縮文件拷貝進虛擬機並解壓

virt-tar-in -a disk.img data.tar /destination


壓縮文件拷貝進虛擬機並解壓

virt-tar-out -a disk.img /dir files.tar


將虛擬機的home目錄拷貝出來並打包

virt-tar -x domname /home home.tar


上傳本地的壓縮文件到虛擬機並解壓

virt-tar -u domname uploadstuff.tar /tmp


8. guestfish修改鏡像格式和大小

修改鏡像格式和大小主要使用如下命令

virt-convert - convert virtual machines between formats

轉化虛擬機鏡像格式

virt-resize - Resize a virtual machine disk

修改虛擬機鏡像磁盤

示例

raw轉qcow2格式

須要先用qemu-img命令建立一個同樣大小的空qcow2格式鏡像文件,而後使用virt-convert命令

virt-convert  -i raw -o qcow2 old.img new.qcow2

原始鏡像能夠是 vmware鏡像vmx,kvm進行,ovf的鏡像。

將指定的分區擴大5G

建立一個新的鏡像,比原來大5G,而後擴展

virt-resize --expand /dev/sda2 olddisk newdisk


將boot增長200M,剩下的空間擴充給/dev/sda2

virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 \
olddisk newdisk


lv擴展

virt-resize --expand /dev/sda2 --LV-expand /dev/vg_guest/lv_root \
olddisk newdisk


擴展分區,並將raw格式轉化成qcow2格式

qemu-img create -f qcow2 newdisk.qcow2 15G
virt-resize --expand /dev/sda2 olddisk newdisk.qcow2


注意:

1 若是是擴展分區,目標磁盤文件必須大於原生磁盤;

2 磁盤縮小比較複雜,通常要求縮小到的空間遠大於文件系統的大小。

9. guestfish掛載、修改、運行救援方式

guestmount - Mount a guest filesystem on the host using FUSE and libguestfs

掛載鏡像到某個目錄

guestfish - the libguestfs Filesystem Interactive SHell

掛載鏡像並獲得一個交互的shell

virt-rescue - Run a rescue shell on a virtual machine

運行一個鏡像的救援模式

示例

只讀方式將鏡像掛載到/mnt目錄

guestmount -a windows.img -m /dev/sda1 --ro /mnt


將linux虛擬機的根目錄掛載到宿主機的/mnt目錄

guestmount -a linux.qcow2 -m /dev/sda2  /mnt


guestfish編輯鏡像grub文件

 

guestfish --rw --add disk.img \
          --mount /dev/vg_guest/lv_root \
          --mount /dev/sda1:/boot \
          edit /boot/grub/grub.conf


進入鏡像的救援模式

$ virt-rescue --suggest -d Fedora15
        Inspecting the virtual machine or disk p_w_picpath ...
        This disk contains one or more operating systems. You can use these
        mount commands in virt-rescue (at the ><rescue> prompt) to mount the
        filesystems.
        # /dev/vg_f15x32/lv_root is the root of a linux operating system
        # type: linux, distro: fedora, version: 15.0
        # Fedora release 15 (Lovelock)
        mount /dev/vg_f15x32/lv_root /sysroot/
        mount /dev/vda1 /sysroot/boot
        mount --bind /dev /sysroot/dev
        mount --bind /dev/pts /sysroot/dev/pts
        mount --bind /proc /sysroot/proc
        mount --bind /sys /sysroot/sys
       Another way is to list the logical volumes (with lvs(8)) and partitions (with parted(8)) and mount them by hand:
        ><rescue> lvs
        LV VG Attr LSize Origin Snap% Move Log Copy% Convert
        lv_root vg_f15x32 -wi-a- 8.83G
        lv_swap vg_f15x32 -wi-a- 992.00M
        ><rescue> mount /dev/vg_f15x32/lv_root /sysroot
        ><rescue> mount /dev/vda1 /sysroot/boot
        ><rescue> ls /sysroot
       Another command to list available filesystems is virt-filesystems(1).
       To run commands in a Linux guest (for example, grub), you should chroot into the /sysroot directory first:
        ><rescue> chroot /sysroot
相關文章
相關標籤/搜索