|
|
楼主 |
发表于 2020-1-1 17:50:33
|
显示全部楼层
qcow2格式的虚拟磁盘初始容量设置过大,虽然并不会实际占用主机这么大的磁盘空间,只占用客户机实际使用的空间大小,但有时候还是有些不太方便,所以需要将其收缩(shrink)以下。
+ H& ^4 O8 C. M9 D' l- fqemu-img命令有一个选项resize可以改变磁盘镜像的大小,其格式如下1 O9 I- G+ v7 e0 w; p( `9 c. Y
; a7 N2 L6 s% M
#qemu-img resize filename [+|-]size
/ x2 E* X. h4 s4 {. }: i, B0 i9 x' S( U% [8 s3 v" ~# \
+就是增加磁盘镜像的大小,-就是缩小磁盘镜像的大小,此处的磁盘镜像的大小并不是磁盘镜像文件在KVM主机中实际占用的存储空间大小,而是KVM客户机看到的磁盘的大小。
+ T$ k, Q( K8 o* U2 U# \5 I
3 I0 T z$ n7 }7 {# s6 P h但是扩大或收缩磁盘镜像大小远没有这么简单。1 q# Y+ G* j' c3 q+ i4 u
! Q* L+ Z! M& {8 N4 F
man qemu-img如是说:7 b+ i* w9 c0 N
当使用此命令收缩磁盘镜像之前,必须使用客户机的文件系统和分区工具来收缩文件系统和分区,然后再执行resize操作,不然会可能丢失数据。当使用此命令扩大了磁盘镜像之后,必须使用客户机的文件系统和分区工具来使用新增加的磁盘容量。这很好理解,KVM支持的客户机操作系统多种多样,而且都有成熟的文件系统和分区操作工具,resize操作只是简单的扩大或缩小磁盘镜像大小,而不能也无需来了解客户机怎么应对这个改变,这是客户机的事情。面对这么多种类型的客户机,resize也只能做这么多工作了。
5 e! d! ?$ y& f9 o" `& N, C9 A, x& f* s1 Z
不幸的是resize尚不支持qcow2格式的磁盘镜像收缩,会有提示9 f H h% D# f4 _
5 D4 f7 q5 B7 n$ ?! L' Xqemu-img: This image format does not support resize
% J% W5 o2 T- s/ `# u: D5 H
9 w. F9 b6 P% u1 G3 ?6 g但是扩大qcow2磁盘镜像没有问题。磁盘镜像扩大另文再叙,先说下缩小,针对不同的客户机会有不同的操作方式。8 t; e4 A% M4 K9 b6 o
! k }* ^+ S( s* p
linux客户机! Y; @$ B, j/ B) S1 y2 O& ]
! u! f8 Y# Z. n1 q3 j这里收缩的是一个debian客户机磁盘镜像,其他linux客户机应无不同。; |3 s3 \4 S5 u5 O" x* V5 i/ ]
; o! X$ y4 v( u: e) d主要的思路就是通过分配一个新的小容量的磁盘镜像,挂载为虚拟机的新的磁盘,然后使用gparted live cd启动虚拟机,将分区拷贝到新的磁盘,然后用新的磁盘启动客户机。9 r' t* ?3 q& K. s. r( [$ g5 y
9 j- Z) u1 ^5 w' b& y主要步骤如下:
4 b$ G; k! T2 H3 H; P! @* h& W
) m: K4 z& X1 h$ F% J* e1.创建新的小容量的磁盘镜像
% O% z0 s$ `& O; E1 V; j! H
* m) k- ?$ X- g: p1 B- ?7 Q& }#qemu-img create -f qcow2 debian_new.qcow2 15G
0 u9 H4 f! p& v/ B! u) P: KFormatting ‘debian_new.qcow2′, fmt=qcow2 size=16106127360 encryption=off cluster_size=65536
, X* N" G2 R1 w3 l下载GParted live cd iso镜像,将二者挂载为客户机的新磁盘驱动器和光驱* _* L4 i) N4 v" S- g# f
# R! d1 D' Y8 o* M1 ^" x! a$ X9 Y1 #!/bin/bash% a9 d+ u1 ` L7 o8 b
2# Y0 I% M" o( t$ c
3 kvm -bios /usr/share/seabios/bios.bin -smp 32 -m 2G -rtc base=utc,clock=host \
6 n, R8 D: ]6 Y3 r, S) k! E9 [4 -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap2 \
; G5 T) L; x; Z- X6 Q! O6 f; O; y8 r1 m3 r5 -boot order=d -no-fd-bootchk \& p) g% `/ J6 }& y0 K
6 -drive file=debian.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback \
8 _. a6 e. x, X3 K% R3 l- |7 -drive file=debian_new.qcow2,if=virtio,index=1,media=disk,format=qcow2,cache=writeback \9 A S6 I/ u0 J8 C: e8 c1 Y3 B
8 -drive file=gparted.iso,index=2,media=cdrom \
0 Q) _# X5 b* @# P. U$ q9 -vnc :0
0 r7 | R1 y" `
: w$ l9 K- ]! X启动虚拟机1 ]3 Z* K; X j: Q6 u
, `$ T$ r; o# |5 Z
为新硬盘分区,然后将老硬盘上的分区拷贝到新的硬盘分区,如果原硬盘上的分区大于新的硬盘上的分区,可以通过GParted将原分区resize到小于新分区即可。交换分区不用拷贝,只要划出交换分区,在客户机内重新设置即可。分区拷贝完成后关闭虚拟机。
2 @1 T) T; s: b! D
0 k. S2 {7 Z9 W" j1 J6 h2.用原硬盘引导客户机,使用dd将原硬盘的MBR及grub2用到的扇区拷贝到新的硬盘,grub2用到了MBR后面的保留扇区。这个保留扇区叫做post-MBR gap,范围为MBR之后,第一个分区之前。( \4 k% J; _+ N1 M m) q+ y& f5 A! w
( R$ [, F2 f8 @/ X6 N3 ?. t3 l9 y#fdisk -l
2 W B5 n- g+ e& ]- t* ]Disk /dev/vda: 64.4 GB, 64424509440 bytes
) ?/ ?' k4 r- t8 ]' C) ^ e4 B255 heads, 63 sectors/track, 7832 cylinders, total 125829120 sectors
$ m+ f* K5 m" c, YUnits = sectors of 1 * 512 = 512 bytes9 |4 Q" m# I5 S1 f
Sector size (logical/physical): 512 bytes / 512 bytes) I6 N9 U2 ~9 y V: ~, x
I/O size (minimum/optimal): 512 bytes / 512 bytes
1 D& c; C, p% l9 Y2 m0 |$ U3 H+ CDisk identifier: 0x000c67737 x4 J) N3 q6 z
, O2 X4 S) e9 L+ I! C7 z+ T
Device Boot Start End Blocks Id System* d6 R; ]8 n+ M0 `1 F) Y/ t
/dev/vda1 * 2048 27262975 13630464 83 Linux) n1 Y( D6 T% |- H4 o( ^2 l
/dev/vda2 120637438 125827071 2594817 5 Extended
8 ?2 B( ^+ v" S2 m" O/dev/vda5 120637440 125827071 2594816 82 Linux swap / Solaris
+ l1 f! C5 R3 Q0 `$ ?6 a- s+ _
3 X+ B$ Z2 q0 L( V3 s+ M. iDisk /dev/vdb: 16.1 GB, 16106127360 bytes
# D! m9 O) b6 a# @$ V5 F- U9 c& Y255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors
& ?( D$ j8 j* _# [Units = sectors of 1 * 512 = 512 bytes+ o/ a9 q% u2 B, Z3 `8 S4 _5 u
Sector size (logical/physical): 512 bytes / 512 bytes
4 t2 G6 \4 Y1 L+ V5 j1 v. S- s YI/O size (minimum/optimal): 512 bytes / 512 bytes
& o9 g% _3 n1 BDisk identifier: 0x0005fc82
, y' g, J* S. f8 q! o/ J* {* R* [$ ]/ o3 q8 F/ \
Device Boot Start End Blocks Id System
5 l3 m5 b+ P7 Q- u6 r2 A/dev/vdb1 2048 27262975 13630464 83 Linux2 v6 V: q6 U) \* F( J3 m
/dev/vdb2 27262976 31457279 2097152 82 Linux swap / Solaris
+ h+ j% o( @$ k! y! x
& V# i( E4 Q- E* l! a/ ^1 x! b& h可以看到客户机磁盘的第一个分区从2048扇区开始,保留扇区为2-2047扇区,第一扇区为MBR。因为两个硬盘分区并不完全相同,所以只拷贝MBR中的前446字节的引导代码即可。
: b" r# i+ X9 i. B0 C9 B$ {% Q& o
: j8 w7 l, b, ]8 c" r0 D5 Z拷贝MBR引导代码- A% l; g+ E. O- K: V* p' r
#dd if=/dev/vda of=/dev/vdb bs=446 count=11 ~# m" t5 Q5 A$ z" l& B' w
拷贝保留扇区; H& f; W* S; L. e% C6 A
#dd if=/dev/vda of=/dev/vdb bs=512 seek=1 skip=1 count=20464 f, A/ C6 U l9 w; V D" J
) N/ B! v o% V+ r( t& ?
3.关闭客户机,为客户机换上新的硬盘并从新硬盘启动
) W1 ?3 F7 [" `( T一般来说拷贝过来的分区与原分区有相同的UUID,如若不然,新硬盘将无法引导客户机,但新建的swap分区其UUID发生了变化
- Y+ ]8 P" ]# A P6 R3 `: O; A* E2 X! ?2 L' \$ t9 S
查看新硬盘分区的UUID9 |! x X' H! m" l: h9 R9 Z0 z
#blkid
" \' N t0 L3 l7 P/dev/vda1: UUID=”48ed13f7-8640-4aba-8b8a-5efb087fadbf” TYPE=”ext4″
. G, ^/ b7 }4 Q }8 |$ e. D/dev/vda2: UUID=”b484c752-69be-4bcd-86c1-a3f70185cde1″ TYPE=”swap”
5 y7 S6 V+ |" d* c6 Q! z
# c9 l" W4 @+ }打开/etc/fstab文件,将自动挂载文件系统的UUID修改成新硬盘上对应分区的UUID2 v" s) L2 o5 }$ m
; F/ v& p, n: s* D) q: t
重新启动客户机,调整完毕。
; ]+ Q+ |2 M: |' n5 C- A9 p
: c: _' `8 u( M, B( s* |' Jwindows客户机9 f# q5 q# `# v) C# N9 ~$ |
6 L# {, ^6 N( I- M4 |; C. O0 Y$ t
1.创建新的小容量的磁盘镜像
/ p9 v9 }2 l \#qemu-img create -f qcow2 windows_new.qcow2 20G
3 f, z9 Q" Z& d. `" Q6 X H将其挂载为客户机的第二块硬盘,将GParted挂载为客户机的光驱,设置客户机为光驱启动并启动客户机
+ l, r: r; ^3 U3 W4 H5 O4 z: e8 p# W
2.用gparted resize调整老硬盘分区使其略小于新硬盘容量并apply
+ }6 m: Y# F! E6 w9 Z) Y( ~* B3.打开终端2 d; m# E, ~1 J+ f, j( X
$sudo su -
5 z8 U% f6 r) \, k8 V#dd if=/dev/vda of=/dev/vdb bs=512 count=1
8 r* n% ]. r$ M9 ]( B% U将老硬盘的MBR完整复制到新硬盘
# W; a. |) d/ E7 S- o& o4.用GParted复制老硬盘分区至新硬盘,然后resize拷贝过来的分区至新硬盘全部容量
2 c U' s ?5 i, ?5.将新硬盘挂载为客户机的第一块硬盘,并从新硬盘启动即可。启动时windows会检查磁盘,之后一切正常。 |
|