1. 程式人生 > >KVM映象管理利器-guestfish使用詳解

KVM映象管理利器-guestfish使用詳解

本文轉載 :http://xiaoli110.blog.51cto.com/1724/1568307?utm_source=tuicool
KVM映象管理利器-guestfish使用詳解

本文介紹以下內容:

 

1. 虛擬機器映象掛載及w2k8虛擬機器啟動自檢慢問題解決辦法

2. KVM虛擬化與guestfish套件

3. guestfish安裝與注意事項

4. 使用guestfish檢視虛擬機器資訊

5. 使用guestfish檢視虛擬機器分割槽及檔案系統

6. 去掉磁碟空洞--KVM虛擬映象的稀疏問題

7. 用guestfish操作虛擬機器內部檔案

8. guestfish修改映象格式和大小

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

 

1. 虛擬機器映象掛載及w2k8虛擬機器啟動自檢慢問題解決辦法

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

下面介紹的的掛載辦法,只適應於塊裝置映象的掛載。

在guestfish出來之前,對映象的處理,只能是先轉化成raw格式,raw在轉化成裸格式,然後掛載,非常痛苦。

再一次感謝guestfish套件的作者。

w2k8 虛擬機器啟動啟動慢問題解決辦法

在kvm虛擬機器上,經常碰到這樣的問題,就是windows 2008 server的虛擬機器,有時候重啟的時候,磁碟檢查需要幾個小時,即使新裝的系統也是這樣,下面我們介紹通過裸裝置掛載的方式擦除windows 2008 server磁碟檢查標誌的方法,繞過這個問題。

操作方法:

第一步 在宿主機上安裝最新的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 image 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 images 映象資訊測試。

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 image

列出虛擬機器映象檔案分割槽資訊

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

列出虛擬機器映象檔案檔案系統,分割槽,塊裝置,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 image.

將檔案拷貝到虛擬機器內部

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

將虛擬機器內部檔案拷貝出來

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

tar壓縮檔案拷貝進虛擬機器並解壓

virt-tar-out - Pack a virtual machine disk image 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 image ...
  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