KVM鏡像操作
qemu-img命令
創建鏡像 qemu-img create
# 創建一個設備空間大小為10G的鏡像
qemu-img create -f qcow2 centos7-guest.qcow2 10G
# 基于backing_file創建大小為20G的鏡像, 使用-b引數, -F用于指定backing_file的格式
qemu-img create -F qcow2 -b /path/to/backing-kvm.img -f qcow2 /path/to/target.qcow2 20G
# 基于backing_file創建大小為20G的鏡像, 使用-o引數, 都在-o引數內指定
qemu-img create -f qcow2 -o backing_file=/path/to/rhel6u3.img,backing_fmt=qcow2,size=20G /path/to/target.qcow2
關于backing_file的說明
If the option backing_file is specified, then the image will record only the differences from backing_file. No size needs to be specified in this case. backing_file will never be modified unless you use the "commit" monitor command (or qemu-img commit).
查看鏡像資訊 qemu-img info
qemu-img info rhel6u3.img
轉換鏡像格式 qemu-img convert
使用-f指定源檔案格式, 用-O指定目標檔案格式
qemu-img convert -f raw -O qcow2 centos.img centos.qcow2
qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw
縮小鏡像實際占用的磁盤大小
在虛機中進行檔案相關的操作(復制, 解壓)后, 即使洗掉了檔案, 虛機依然占用檔案空間, 如果要減小空間占用, 可以通過如下的方式
Linux虛機端
Linux虛機端, trim a device and free all unused storage on the underlying device
fstrim -av
將未使用的空間用0填充, 因為洗掉的檔案依然存在, 如果不寫零, 無法回收這些空間. 這一步會將虛機預設的空間全部填充, 取決于磁盤性能, 可能會很慢
dd if=/dev/zero of=/mytempfile
# 洗掉產生的檔案
rm -f /mytempfile
Windows虛機端
對于Win7/2008R2 及以上版本會自動裁剪(trim), 可以通過下面命令查看是否開啟
fsutil behavior query DisableDeleteNotify
上面應當會輸出0, 否則使用下面的命令設定
fsutil behavior set DisableDeleteNotify 0
然后執行下面的命令
- 整理碎片, 用windows自帶的或者第三方工具例如 Defraggler or UltraDefrag.
- 使用SDelete(推薦)或者Eraser, 將空閑空間填充0
使用SDelete
- 下載 SDelete 保存到 C:\windows\system32\
- 運行下面的命令填零
sdelete -z
- 如果有多個磁區, 例如 E:, 使用
sdelete -z e:
壓縮虛機鏡像
在宿主機進行操作
qemu-img convert -O qcow2 vm_pbc.qcow2 vm_pbc_shrink.qcow2
帶壓縮引數, 會比較慢
qemu-img convert -O qcow2 -c vm_pbc.qcow2 vm_pbc_shrink.qcow2
virt-filesystems命令
查看鏡像的磁盤大小
virt-filesystems --long --parts --blkdevs -h -a c7guest1.qcow2c
Name Type MBR Size Parent
/dev/sda1 partition 83 8.0G /dev/sda
/dev/sda device - 8.0G -
virt-resize命令
將舊鏡像中的檔案系統擴充到新鏡像中, 用于調整虛機磁盤大小
# 創建一個50G容量的qcow2空白鏡像
qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G
# 將鏡像擴充到新鏡像中去, 通過--expand指定需要擴張的磁區
virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 /data/images/win2012-50gb.qcow2
此時只是將在虛機磁盤上增加了可用空間, 但是未體現到檔案系統, 啟動虛機后, 在虛機中擴充磁區大小
# 查看磁區
df -h
# 查看磁區對應的磁盤大小, 能看出來/dev/vda1已經增長, 但是未體現到df -h的輸出中
fdisk -l
# 如果/dev/vda1格式是xfs
xfs_growfs /dev/vda1
# 如果/dev/vda1格式是ext2,3,4
resize2fs /dev/vda1
對鏡像進行擴容操作
下面的例子演示了如何將vm_n01.qcow2這個鏡像擴容到40G
# 先檢查鏡像的磁區結構, 以便后面對指定的磁區進行擴容
virt-filesystems --long --parts --blkdevs -h -a vm_n01.qcow2
# 更名
mv vm_n01.qcow2 vm_n01.qcow2.bak
# 用原名創建一個40G的空白鏡像
qemu-img create -f qcow2 vm_n01.qcow2 40G
# 將舊鏡像匯入到空白鏡像
virt-resize --expand /dev/sda1 vm_n01.qcow2.bak vm_n01.qcow2
# 檢查匯入后的新鏡像
virt-filesystems --long --parts --blkdevs -h -a vm_n01.qcow2
# 洗掉舊鏡像
rm vm_n01.qcow2.bak
用新鏡像匯入創建虛機后
# 查看磁區
df -h
# 查看磁區對應的磁盤大小, 能看出來/dev/vda1已經增長, 但是未體現到df -h的輸出中
fdisk -l
# 如果/dev/vda1格式是xfs
xfs_growfs /dev/vda1
# 如果/dev/vda1格式是ext2,3,4
resize2fs /dev/vda1
遇到e2fsck版本太低的問題
centos7自帶的e2fsck版本過低, 運行resize報錯
virt-resize: error: libguestfs error: resize2fs: e2fsck 1.42.9
(28-Dec-2013)
/dev/sda1 has unsupported feature(s): metadata_csum
e2fsck: Get a newer version of e2fsck!
解決: 編譯最新版本
# 需要預先安裝 wget gcc-c++
sudo wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.46.4/e2fsprogs-1.46.4.tar.gz
sudo tar xvf e2fsprogs-1.46.4.tar.gz
sudo cd e2fsprogs-1.46.4
sudo ./configure
sudo make
sudo make install
sudo yum -y install libguestfs-xfs
使用RAW格式對鏡像擴容
Ubuntu20.04 Focal Cloudimage擴容, 參考 https://www.cnblogs.com/milton/p/15382673.html
# resize原始鏡像
qemu-img resize focal-server-cloudimg-amd64-50g.qcow2 50G
# 轉換為raw格式鏡像
qemu-img convert -f qcow2 -O raw focal-server-cloudimg-amd64-50g.qcow2 focal-server-cloudimg-amd64.raw
# 重命名以防混淆
mv focal-server-cloudimg-amd64.raw focal-server-cloudimg-amd64-50g.raw
# 運行parted
parted focal-server-cloudimg-amd64-50g.raw
######################## 開始
GNU Parted 3.1
Using /data/backup/vm_images/focal-server-cloudimg-amd64-50g.raw
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Error: The backup GPT table is not at the end of the disk, as it should be.
This might mean that another operating system believes the disk is smaller.
Fix, by moving the backup to the end (and removing the old backup)?
Fix/Ignore/Cancel? Fix
Warning: Not all of the space available to
/data/backup/vm_images/focal-server-cloudimg-amd64-50g.raw appears to be used,
you can fix the GPT to use all of the space (an extra 100245504 blocks) or
continue with the current setting?
Fix/Ignore? Fix
Model: (file)
Disk /data/backup/vm_images/focal-server-cloudimg-amd64-50g.raw: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot
1 116MB 2361MB 2245MB ext4
(parted) resizepart
Partition number? 1
End? [2361MB]? 53.7G
(parted) p
Model: (file)
Disk /data/backup/vm_images/focal-server-cloudimg-amd64-50g.raw: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot
1 116MB 53.7GB 53.6GB ext4
(parted) q
########################### 結束
# 查看raw格式的磁區大小是否正確
virt-filesystems --long --parts --blkdevs -h -a focal-server-cloudimg-amd64-50g.raw
Name Type MBR Size Parent
/dev/sda1 partition - 50G /dev/sda
/dev/sda14 partition - 4.0M /dev/sda
/dev/sda15 partition - 106M /dev/sda
/dev/sda device - 50G -
# 轉回qcow2格式
qemu-img convert -f raw -O qcow2 focal-server-cloudimg-amd64-50g.raw focal-server-cloudimg-amd64-50g-resized.qcow2
# 再次檢查
virt-filesystems --long --parts --blkdevs -h -a focal-server-cloudimg-amd64-50g-resized.qcow2
Name Type MBR Size Parent
/dev/sda1 partition - 50G /dev/sda
/dev/sda14 partition - 4.0M /dev/sda
/dev/sda15 partition - 106M /dev/sda
/dev/sda device - 50G -
參考
- Shrink Qcow2 Disk Files https://pve.proxmox.com/wiki/Shrink_Qcow2_Disk_Files
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/433262.html
標籤:Linux
上一篇:018 磁盤 IO 性能監控/壓測工具(sar、iotop、fio、iostat)
下一篇:Windows10安裝vue環境
