1. 虛擬機(jī)鏡像掛載及w2k8虛擬機(jī)啟動自檢慢問題解決辦法
guestfish套件是鏡像管理的利器,在沒有g(shù)uestfish這個套件之前,對虛擬機(jī)鏡像的處理,要么虛擬機(jī)運(yùn)行起來修改,要么使用下面介紹的辦法,總之很不方便。
下面介紹的的掛載辦法,只適應(yīng)于塊設(shè)備鏡像的掛載。
在guestfish出來之前,對鏡像的處理,只能是先轉(zhuǎn)化成raw格式,raw在轉(zhuǎn)化成裸格式,然后掛載,非常痛苦。
再一次感謝guestfish套件的作者。
w2k8虛擬機(jī)啟動啟動慢問題解決辦法
在kvm虛擬機(jī)上,經(jīng)常碰到這樣的問題,就是windows 2008 server的虛擬機(jī),有時候重啟的時候,磁盤檢查需要幾個小時,即使新裝的系統(tǒng)也是這樣,下面我們介紹通過裸設(shè)備掛載的方式擦除windows 2008 server磁盤檢查標(biāo)志的方法,繞過這個問題。
操作方法:
第一步 在宿主機(jī)上安裝最新的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
第二步 擴(kuò)展鏡像,將鏡像掛載,并檢查
先使用losetup –f 得到可用的loop設(shè)備
losetup -f
/dev/loop0
掛載鏡像
losetup /dev/loop0 /dev/vmVG/ptyyb-webzb-57_vda
使用kartx 將鏡像分區(qū)映射,如果2008鏡像是一個分區(qū),默認(rèn)會掛載到/dev/mapper/loop0p
因?yàn)?008默認(rèn)安裝的時候會有一個boot分區(qū),那么c盤就在/dev/mapper/loop0p2上,根據(jù)自己實(shí)際情況掛載
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是一套虛擬機(jī)鏡像管理的利器,提供一系列對鏡像管理的工具,也提供對外的API。
guestfish主要包含以下工具:
guestfish interactive shell 掛載鏡像,并提供一個交互的shell。
guestmount mount guest filesystem in hos 將鏡像掛載到指定的目錄。
guestumount unmount guest filesystem 卸載鏡像目錄。
virt-alignment-scan 鏡像塊對齊掃描。
virt-builder — quick image builder 快速鏡像創(chuàng)建。
virt-cat(1) — display a file 顯示鏡像中文件內(nèi)容。
virt-copy-in(1) — copy files and directories into a VM 拷貝文件到鏡像內(nèi)部。
virt-copy-out(1) — copy files and directories out of a VM 拷貝鏡像文件出來。
virt-customize(1) — customize virtual machines 定制虛擬機(jī)鏡像
virt-df(1) — free space 查看虛擬機(jī)鏡像空間使用情況。
virt-diff(1) — differences 不啟動虛擬機(jī)的情況下,比較虛擬機(jī)內(nèi)部兩份文件差別。
virt-edit(1) — edit a file 編輯虛擬機(jī)內(nèi)部文件。
virt-filesystems(1) — display information about filesystems, devices, LVM 顯示鏡像文件系統(tǒng)信息。
virt-format(1) — erase and make blank disks 格式化鏡像內(nèi)部磁盤。
virt-inspector(1) — inspect VM images 鏡像信息測試。
virt-list-filesystems(1) — list filesystems 列出鏡像文件系統(tǒng)。
virt-list-partitions(1) — list partitions 列出鏡像分區(qū)信息。
virt-log(1) — display log files 顯示鏡像日志。
virt-ls(1) — list files 列出鏡像文件。
virt-make-fs(1) — make a filesystem 鏡像中創(chuàng)建文件系統(tǒng)。
virt-p2v(1) — convert physical machine to run on KVM 物理機(jī)轉(zhuǎn)虛擬機(jī)。
virt-p2v-make-disk(1) — make P2V ISO 創(chuàng)建物理機(jī)轉(zhuǎn)虛擬機(jī)ISO光盤。
virt-p2v-make-kickstart(1) — make P2V kickstart 創(chuàng)建物理機(jī)轉(zhuǎn)虛擬機(jī)kickstart文件。
virt-rescue(1) — rescue shell 進(jìn)去虛擬機(jī)救援模式。
virt-resize(1) — resize virtual machines 虛擬機(jī)分區(qū)大小修改。
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 其他格式虛擬機(jī)鏡像轉(zhuǎn)KVM鏡像。
virt-win-reg(1) — export and merge Windows Registry keys windows注冊表導(dǎo)入鏡像。
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 合并、并導(dǎo)出注冊表文件內(nèi)容。
hivexsh(1) — Windows Registry hive shell window注冊表修改交互的shell。
hivexml(1) — convert Windows Registry hive to XML 將window注冊表轉(zhuǎn)化為xml
hivexget(1) — extract data from Windows Registry hive 得到注冊表鍵值。
guestfsd(8) — guestfs daemon guestfs服務(wù)。
3. guestfish安裝與注意事項(xiàng)
guestfish套件安裝
guestfish套件安裝非常簡單,一條命令就可以。
yum install libguestfs-tools
注意:
默認(rèn)安裝是不安裝windows系統(tǒng)支持的,如果需要修改windows系統(tǒng)鏡像,需要再運(yùn)行如下命令。
yum install libguestfs-winsupport
4. 使用guestfish查看虛擬機(jī)信息
虛擬機(jī)鏡像信息查看,主要通過virt-inspector和virt-inspector2命令
/p>
p>virt-inspector - Display OS version, kernel, drivers, mount points, applications, etc. in a virtual machine
virt-inspector 顯示os版本、內(nèi)核、驅(qū)動、掛載點(diǎn)、應(yīng)用等等。
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輸出一些固定內(nèi)容,方便腳本判斷。
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參數(shù)就可以
virt-inspector windows虛擬機(jī)示例
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格式,系統(tǒng)相關(guān)信息比virt-inspector詳細(xì)
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虛擬機(jī)示例
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查看虛擬機(jī)分區(qū)及文件系統(tǒng)
虛擬機(jī)分區(qū)及文件系統(tǒng)查看主要使用三個命令
virt-list-partitions - List partitions in a virtual machine or disk image
列出虛擬機(jī)鏡像文件分區(qū)信息
virt-filesystems - List filesystems, partitions, block devices, LVM in a virtual machine or disk image
列出虛擬機(jī)鏡像文件文件系統(tǒng),分區(qū),塊設(shè)備,lvm信息
virt-alignment-scan/p>
p>virt-alignment-scan - Check alignment of virtual machine partitions
查看虛擬機(jī)鏡像分區(qū)是否塊對齊
示例
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虛擬化文件系統(tǒng)鏡像,一般使用RAW或者QCOW2的方式:
RAW 一次性將要使用的鏡像空間分配完。
QCOW2 精簡模式,磁盤用多少,才占多少空間。
ext4的稀疏特性
我們使用不通的方式的創(chuàng)建方式幾個鏡像文件對比下,
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查看,我們會發(fā)現(xiàn)一個非常有意思的事情
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/p>
會發(fā)現(xiàn)raw是5G
du test*
5242880 test.dd
196 test.qcow2
0 test.raw
會發(fā)現(xiàn)raw是0G
為什么會這樣呢,這是因?yàn)閑xt4文件系統(tǒng)是一個支持稀疏特性的文件系統(tǒng),當(dāng)文件內(nèi)容全部是空的時候,ext4并不分配實(shí)際的空間。
那如果想要使用RAW方式,并希望一次占用完所有的空間,可以使用dd命令的方式。
qcow2 的稀疏問題
qcow2方式也有稀疏的問題,在磁盤級別上看,鏡像會有大量連續(xù)的相同空洞,比如剛創(chuàng)建的鏡像的swap分區(qū),通過virt-sparsify 我們可以消除這些空洞,從而縮小磁盤大小,便于我們傳輸磁盤鏡像。
使用virt-sparsify 前,我們需要先創(chuàng)建一個新的同樣大小的鏡像
qemu-img create -f qcow2 test2.qcow2 5G
然后使用virt-sparsify,去除鏡像空洞,語法為
virt-sparsify -x /root/test.qcow2 --convert qcow2 /root/test2.qcow2
7. 用guestfish操作虛擬機(jī)內(nèi)部文件
虛擬機(jī)內(nèi)部文件管理主要使用以下命令:
virt-df - Display free space on virtual filesystems
鏡像磁盤空間使用查看
virt-ls - List files in a virtual machine
列出指定目錄內(nèi)文件
virt-cat - Display files in a virtual machine
顯示指定文件內(nèi)容
virt-edit - Edit a file in a virtual machine
編輯指定文件
virt-copy-in - Copy files and directories into a virtual machine disk image.
將文件拷貝到虛擬機(jī)內(nèi)部
virt-copy-out - Copy files and directories out of a virtual machine disk image.q
將虛擬機(jī)內(nèi)部文件拷貝出來
virt-tar-in - Unpack a tarball into a virtual machine disk image
tar壓縮文件拷貝進(jìn)虛擬機(jī)并解壓
virt-tar-out - Pack a virtual machine disk image directory into a tarball.
鏡像內(nèi)指定目錄文件拷貝并壓縮
virt-tar - Extract or upload files to a virtual machine
解壓或者上傳文件到虛擬機(jī)
示例
查看鏡像磁盤空間
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目錄內(nèi)容
virt-ls -a centos6364.qcow2 /root
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc
.tcshrc
anaconda-ks.cfg
install.log
install.log.syslog
顯示指定文件內(nèi)容
virt-cat -a centos6364.qcow2 /root/anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
...
編輯指導(dǎo)文件
virt-edit -a centos6364.qcow2 /root/anaconda-ks.cfg
文件拷貝進(jìn)鏡像及拷貝出鏡像
touch test.txt
virt-copy-in test.txt -a centos6364.qcow2 /root/
virt-copy-out -a centos6364.qcow2 /root/test.txt /home
壓縮文件拷貝進(jìn)虛擬機(jī)并解壓
virt-tar-in -a disk.img data.tar /destination
壓縮文件拷貝進(jìn)虛擬機(jī)并解壓
virt-tar-out -a disk.img /dir files.tar
將虛擬機(jī)的home目錄拷貝出來并打包
virt-tar -x domname /home home.tar
上傳本地的壓縮文件到虛擬機(jī)并解壓
virt-tar -u domname uploadstuff.tar /tmp
8. guestfish修改鏡像格式和大小
修改鏡像格式和大小主要使用以下命令
virt-convert - convert virtual machines between formats
轉(zhuǎn)化虛擬機(jī)鏡像格式
virt-resize - Resize a virtual machine disk
修改虛擬機(jī)鏡像磁盤
示例
raw轉(zhuǎn)qcow2格式
需要先用qemu-img命令創(chuàng)建一個一樣大小的空qcow2格式鏡像文件,然后使用virt-convert命令
virt-convert -i raw -o qcow2 old.img new.qcow2
原始鏡像可以是 vmware鏡像vmx,kvm進(jìn)行,ovf的鏡像。
將指定的分區(qū)擴(kuò)大5G
創(chuàng)建一個新的鏡像,比原來大5G,然后擴(kuò)展
virt-resize --expand /dev/sda2 olddisk newdisk
將boot增加200M,剩下的空間擴(kuò)充給/dev/sda2
virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 \
olddisk newdisk
lv擴(kuò)展
virt-resize --expand /dev/sda2 --LV-expand /dev/vg_guest/lv_root \
olddisk newdisk
擴(kuò)展分區(qū),并將raw格式轉(zhuǎn)化成qcow2格式
qemu-img create -f qcow2 newdisk.qcow2 15G
virt-resize --expand /dev/sda2 olddisk newdisk.qcow2
注意:
1 如果是擴(kuò)展分區(qū),目標(biāo)磁盤文件必須大于原生磁盤;
2 磁盤縮小比較復(fù)雜,一般要求縮小到的空間遠(yuǎn)大于文件系統(tǒng)的大小。
9. guestfish掛載、修改、運(yùn)行救援方式
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
運(yùn)行一個鏡像的救援模式
示例
只讀方式將鏡像掛載到/mnt目錄
guestmount -a windows.img -m /dev/sda1 --ro /mnt
將linux虛擬機(jī)的根目錄掛載到宿主機(jī)的/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
進(jìn)入鏡像的救援模式
$ 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