KVM 虛機鏡像操作, 擴容和壓縮


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

在原鏡像上擴容

首先在宿主機上, shutdown虛機, 然后resize鏡像

sudo qemu-img resize centos7_002.qcow2 150G

重啟虛機后, 在虛機中, 通過fdisk -l 能看到硬盤容量增大, 但是在df -h中, 容量還未變. 通過以下操作進行擴容

  1. 通過 lsblk 查看硬盤大小和分區, 確定要擴容的分區序號, 這里要擴容的是 vda1, 對應的序號是1
  2. 通過 growpart /dev/vda 1 對分區擴容
  3. 通過 xfs_growfs /將容量體現到文件系統

命令記錄

[milton@centos7002 ~]$ sudo lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  150G  0 disk 
└─vda1 253:1    0   50G  0 part /
[milton@centos7002 ~]$ sudo growpart /dev/vda 1
CHANGED: partition=1 start=2048 old: size=104855519 end=104857567 new: size=314570719 end=314572767
[milton@centos7002 ~]$ sudo xfs_growfs /
meta-data=/dev/vda1              isize=512    agcount=26, agsize=524224 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=13106939, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 13106939 to 39321339
[milton@centos7002 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           7.8G   17M  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda1       150G   12G  139G   8% /
tmpfs           1.6G     0  1.6G   0% /run/user/1000

遇到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://pve.proxmox.com/wiki/Shrink_Qcow2_Disk_Files)


免責聲明!

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



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