找回密码
 注册
查看: 3606|回复: 1

kvm虚机磁盘大小修改

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-1-1 17:49:20 | 显示全部楼层 |阅读模式
虽然qcow2有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从KVM主机端完全看不到qcow2虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小qcow2虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。
4 j/ Z3 ?6 N2 @, [. X4 F. a5 T2 ?3 H" L" d2 k3 w  K/ x2 g
不同的客户机类型有不同解决方式,基本思路就是用0填充未使用的客户机磁盘空间,然后用qemu-img转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。
" j6 ^" e  Y  n- x7 x' q# D. b( d$ M* n1 H$ ?
linux客户机
+ C. k: I( R2 E; p3 N7 @1、使用dd命令将客户机未使用的磁盘空间用0填满
" c4 A* U5 G" [) ~& U9 I#dd if=/dev/zero of=~/junk
+ u, s8 h5 ], gdd: writing to `/home/***/junk’: No space left on device
  Z4 g) p, v4 v+ w) h然后
6 w$ F# ^( ~4 u" g3 e2 h#rm junk
- M2 H) z! I4 T' A/ F关闭客户机' N8 G! o, l% l, y" \. ^% N2 a
2、转换磁盘镜像文件  w- S) Y9 z2 q
#qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2
& ]+ b2 z/ l5 F7 t. O  i6 F0 k9 _  W/ O3 o( h
转换完成后可以看到debian_new.qcow2占用的KVM主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件debian_new.qcow2启动客户机即可。8 X5 ]: R2 ]% {# i0 G9 k6 o

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-1-1 17:50:33 | 显示全部楼层
qcow2格式的虚拟磁盘初始容量设置过大,虽然并不会实际占用主机这么大的磁盘空间,只占用客户机实际使用的空间大小,但有时候还是有些不太方便,所以需要将其收缩(shrink)以下。
; A! Q8 Z5 T# v5 G; Uqemu-img命令有一个选项resize可以改变磁盘镜像的大小,其格式如下
9 w' l; K0 c+ ^$ p! o# K
# L. {9 U( ]5 I$ w/ m  X. y, a#qemu-img resize filename [+|-]size/ w& Q$ V* ^  w+ N) M  x0 ~
' W  j9 T; U4 {
+就是增加磁盘镜像的大小,-就是缩小磁盘镜像的大小,此处的磁盘镜像的大小并不是磁盘镜像文件在KVM主机中实际占用的存储空间大小,而是KVM客户机看到的磁盘的大小。7 L; x% J; D8 d2 W. y
$ P" L# ?! d+ |: O* H5 d0 O
但是扩大或收缩磁盘镜像大小远没有这么简单。& m0 k! j; _% E6 ]" y
3 ~  x: d+ C- _8 k( T
man qemu-img如是说:' b: m; v) t+ W( `4 v
当使用此命令收缩磁盘镜像之前,必须使用客户机的文件系统和分区工具来收缩文件系统和分区,然后再执行resize操作,不然会可能丢失数据。当使用此命令扩大了磁盘镜像之后,必须使用客户机的文件系统和分区工具来使用新增加的磁盘容量。这很好理解,KVM支持的客户机操作系统多种多样,而且都有成熟的文件系统和分区操作工具,resize操作只是简单的扩大或缩小磁盘镜像大小,而不能也无需来了解客户机怎么应对这个改变,这是客户机的事情。面对这么多种类型的客户机,resize也只能做这么多工作了。
1 v" }- f/ R1 i2 l) X' H- V( s
$ u% F! y( l9 L9 ~不幸的是resize尚不支持qcow2格式的磁盘镜像收缩,会有提示/ F2 w0 y* C1 Z* S2 O$ c

5 y9 x1 Q( d3 rqemu-img: This image format does not support resize
; Y, r) ~$ w: w- t2 R6 ?. V, g% J$ @
但是扩大qcow2磁盘镜像没有问题。磁盘镜像扩大另文再叙,先说下缩小,针对不同的客户机会有不同的操作方式。, t% n+ ~7 B5 s6 J& c: G) n

. }3 M6 j" s* ~+ C. X8 j0 Clinux客户机4 c4 b& Y5 F! {, v' }5 Y- Y

. u+ A) W# [5 }, ^6 G" m这里收缩的是一个debian客户机磁盘镜像,其他linux客户机应无不同。/ ^8 B1 i5 d- k5 I' \1 ^: s( _; y- x* s

+ n: Q; Y) V8 G- e0 W1 \主要的思路就是通过分配一个新的小容量的磁盘镜像,挂载为虚拟机的新的磁盘,然后使用gparted live cd启动虚拟机,将分区拷贝到新的磁盘,然后用新的磁盘启动客户机。3 R3 c$ J5 y9 j& c" j
+ M& ]- d! A8 o; q
主要步骤如下:
: Y" {8 v; [7 K9 ^0 N+ s- `
; i0 N8 q: }, h" R) k1.创建新的小容量的磁盘镜像
8 c7 M; h2 O7 w2 G/ u7 U8 Z% L& ]& d! b  W9 h) f. N( A
#qemu-img create -f qcow2 debian_new.qcow2 15G' {' r% Z% n4 T
Formatting ‘debian_new.qcow2′, fmt=qcow2 size=16106127360 encryption=off cluster_size=655361 s! v7 z3 G9 Q- R/ Q
下载GParted live cd iso镜像,将二者挂载为客户机的新磁盘驱动器和光驱2 S) G8 s3 h; A3 b  C( q* O

) \. r( I) _7 g3 o! J1 #!/bin/bash
+ \" L% Q% x, j29 W# [5 A' G1 C# o- P
3 kvm -bios /usr/share/seabios/bios.bin -smp 32 -m 2G -rtc base=utc,clock=host     \
. e# Q& i, S6 p6 U4     -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap2                   \
5 f2 x% `* j( I. C$ s5     -boot order=d -no-fd-bootchk                                                            \0 G: z4 f) ~% F3 E  v3 ^
6     -drive file=debian.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback  \
* |: [7 T; R" F4 i3 o2 X, d5 d, z/ a7     -drive file=debian_new.qcow2,if=virtio,index=1,media=disk,format=qcow2,cache=writeback  \. B4 e9 e) l1 k* K  n. G3 l# y! H
8     -drive file=gparted.iso,index=2,media=cdrom  \" `, W9 Y% H  h1 j3 c3 H
9     -vnc :0
$ O% g2 A: z; c+ ^" @1 [: a1 ^& s/ k  A8 W
启动虚拟机& d& u2 [3 D+ @
& j, g$ k( O; o: N- J" \
为新硬盘分区,然后将老硬盘上的分区拷贝到新的硬盘分区,如果原硬盘上的分区大于新的硬盘上的分区,可以通过GParted将原分区resize到小于新分区即可。交换分区不用拷贝,只要划出交换分区,在客户机内重新设置即可。分区拷贝完成后关闭虚拟机。
- R' o# o# d; P, @' `6 y/ w% g5 r) g2 n! g- p& x  ~
2.用原硬盘引导客户机,使用dd将原硬盘的MBR及grub2用到的扇区拷贝到新的硬盘,grub2用到了MBR后面的保留扇区。这个保留扇区叫做post-MBR gap,范围为MBR之后,第一个分区之前。
5 Y9 ?2 j" H3 A+ q$ J! ^( F! b/ P" }! ]; O+ @9 H: K; E0 r
#fdisk -l
" O4 {4 v7 i8 r( I, X  Y9 SDisk /dev/vda: 64.4 GB, 64424509440 bytes/ |9 \& L  R5 A8 d& c4 t% k1 @
255 heads, 63 sectors/track, 7832 cylinders, total 125829120 sectors
, C+ U3 r" Y" i/ u% J+ KUnits = sectors of 1 * 512 = 512 bytes" o, h# ~3 z/ K7 L  ^5 X8 J/ O
Sector size (logical/physical): 512 bytes / 512 bytes4 v* k. k  q. K3 A6 q) k
I/O size (minimum/optimal): 512 bytes / 512 bytes
! p, l. t1 s) r+ n6 i3 F  zDisk identifier: 0x000c6773) ^+ c1 ?2 v6 x" [% }" Z

2 j* _6 ]4 u4 e7 ]( E7 TDevice Boot Start End Blocks Id System, t: m9 x3 G% k- H5 }+ Q
/dev/vda1 * 2048 27262975 13630464 83 Linux
& F1 a* E0 Y4 d/ w/dev/vda2 120637438 125827071 2594817 5 Extended0 B0 J( z# o) g
/dev/vda5 120637440 125827071 2594816 82 Linux swap / Solaris' O( P3 B0 x2 V! p8 x0 O% M' u
: z' |2 S# `8 z$ D
Disk /dev/vdb: 16.1 GB, 16106127360 bytes  k& w/ t) U# G1 v+ x
255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors+ q7 ^# N  _- p' Y
Units = sectors of 1 * 512 = 512 bytes* ]1 \* w6 w: {2 J, s3 |
Sector size (logical/physical): 512 bytes / 512 bytes; g0 ^/ _( _, j0 x" C
I/O size (minimum/optimal): 512 bytes / 512 bytes
1 \9 c/ }& ^4 L% F" i8 ]$ I- oDisk identifier: 0x0005fc82
& k  u' I' c8 S: r
1 K+ ]. c% v6 f" F! C0 ?' JDevice Boot Start End Blocks Id System8 N& g$ y9 _0 D0 D) y; ]
/dev/vdb1 2048 27262975 13630464 83 Linux7 v( I5 o) S* H  C8 G
/dev/vdb2 27262976 31457279 2097152 82 Linux swap / Solaris* }8 A: S  M0 ?! y) E% X

3 R' U% r, l% w( F, M( g' S可以看到客户机磁盘的第一个分区从2048扇区开始,保留扇区为2-2047扇区,第一扇区为MBR。因为两个硬盘分区并不完全相同,所以只拷贝MBR中的前446字节的引导代码即可。0 Y: V' \' Z4 X% ~  J* Y" i

$ `% q0 m7 c4 }. U& c拷贝MBR引导代码0 p( s5 s7 D- S
#dd if=/dev/vda of=/dev/vdb bs=446 count=1
5 Z- L4 O( A. {) L拷贝保留扇区
/ v; n4 W2 {8 \/ M#dd if=/dev/vda of=/dev/vdb bs=512 seek=1 skip=1 count=2046
+ {8 Q. w+ c9 W; D; m8 a6 n4 ~* Q6 }& G  q
3.关闭客户机,为客户机换上新的硬盘并从新硬盘启动
; ^; {2 r) }- x2 d8 U一般来说拷贝过来的分区与原分区有相同的UUID,如若不然,新硬盘将无法引导客户机,但新建的swap分区其UUID发生了变化
/ M4 V5 [8 d2 w* X' O, g/ H
, L' |( Q0 y( P- E: l5 z( L" k查看新硬盘分区的UUID& `  ~% r  N. }' q
#blkid
7 S' ^3 p, a! g3 d+ D5 W/dev/vda1: UUID=”48ed13f7-8640-4aba-8b8a-5efb087fadbf” TYPE=”ext4″8 p' M& q2 ?( b+ t& P3 J1 f) C
/dev/vda2: UUID=”b484c752-69be-4bcd-86c1-a3f70185cde1″ TYPE=”swap”) n" g: K+ V/ q* y) W
7 j- T/ X2 `1 v  |; }
打开/etc/fstab文件,将自动挂载文件系统的UUID修改成新硬盘上对应分区的UUID
/ [, F4 Y1 s4 h! Z, V2 O
- q+ q5 i/ r9 X$ ]重新启动客户机,调整完毕。
6 B: q, M% H6 F* L
+ g$ w% @6 `1 L7 twindows客户机2 W# s7 K  W/ g* z: q! t
/ n  G& U) R/ C3 m& S. m. t
1.创建新的小容量的磁盘镜像
7 b' j8 F" \. i#qemu-img create -f qcow2 windows_new.qcow2 20G1 f4 b5 `9 ~  J8 ^/ e- ?" H: Y
将其挂载为客户机的第二块硬盘,将GParted挂载为客户机的光驱,设置客户机为光驱启动并启动客户机
* [  B/ J8 O3 f& c% i( W' V, \: m. S/ B! J
2.用gparted resize调整老硬盘分区使其略小于新硬盘容量并apply, q2 E4 C' i4 Z' F" u- m
3.打开终端
# C* O( c) u9 o) m5 y( O- ~$sudo su -& L1 h9 T4 s/ {4 [" e9 \' i; a
#dd if=/dev/vda of=/dev/vdb bs=512 count=1
) y% w% r. b) e. e% s将老硬盘的MBR完整复制到新硬盘* J9 r4 ]1 q6 v4 ^5 W, [$ b, |
4.用GParted复制老硬盘分区至新硬盘,然后resize拷贝过来的分区至新硬盘全部容量5 p+ d: N4 |/ q4 F
5.将新硬盘挂载为客户机的第一块硬盘,并从新硬盘启动即可。启动时windows会检查磁盘,之后一切正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:41 , Processed in 0.022581 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表