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

kvm虚机磁盘大小修改

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-1-1 17:49:20 | 显示全部楼层 |阅读模式
虽然qcow2有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从KVM主机端完全看不到qcow2虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小qcow2虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。* c# p" q2 G8 d, z
' A& ?. L* ~3 r3 M  d$ U* A7 }7 r
不同的客户机类型有不同解决方式,基本思路就是用0填充未使用的客户机磁盘空间,然后用qemu-img转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。# c7 a8 W! I% f1 N: p+ L/ _
; q5 O# }" Y/ Q5 Q3 O. _/ Z1 p4 w
linux客户机
2 M: V  i' ]+ a4 y1、使用dd命令将客户机未使用的磁盘空间用0填满
; d; f0 A" }; |* @#dd if=/dev/zero of=~/junk
( p: y; s( Z+ i: G7 B/ w) ?dd: writing to `/home/***/junk’: No space left on device
/ m% \" W& P/ T然后
! |$ k- e" i% e% X9 q" ]3 k% l, V#rm junk
9 {* _1 D: X& J7 [/ y% _关闭客户机
+ `. w/ l2 c5 P/ Q2、转换磁盘镜像文件
4 o3 M+ w* ?- S# h#qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2
+ U3 Q+ u7 q& `8 ?% N/ g! n; M6 @; d9 Y
转换完成后可以看到debian_new.qcow2占用的KVM主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件debian_new.qcow2启动客户机即可。
5 w$ p! O/ q  b  q

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-1-1 17:50:33 | 显示全部楼层
qcow2格式的虚拟磁盘初始容量设置过大,虽然并不会实际占用主机这么大的磁盘空间,只占用客户机实际使用的空间大小,但有时候还是有些不太方便,所以需要将其收缩(shrink)以下。
* F6 r+ u3 M. pqemu-img命令有一个选项resize可以改变磁盘镜像的大小,其格式如下8 M! L8 [0 K: b( G0 [+ Y5 q1 T4 @: t  x

8 R5 T* z! F" w2 e#qemu-img resize filename [+|-]size: _( x* h$ V5 k& K  I; `
' z  u& \& I) G
+就是增加磁盘镜像的大小,-就是缩小磁盘镜像的大小,此处的磁盘镜像的大小并不是磁盘镜像文件在KVM主机中实际占用的存储空间大小,而是KVM客户机看到的磁盘的大小。
, S; T, I: i  c; {) V1 H& a, G/ |" ]8 I2 T+ L4 J% p+ {
但是扩大或收缩磁盘镜像大小远没有这么简单。
1 ~" W* @1 W8 v9 @6 d6 x; B- d8 d& ^3 m  p- Y
man qemu-img如是说:
! b, p8 [. N# ~$ X4 f# h当使用此命令收缩磁盘镜像之前,必须使用客户机的文件系统和分区工具来收缩文件系统和分区,然后再执行resize操作,不然会可能丢失数据。当使用此命令扩大了磁盘镜像之后,必须使用客户机的文件系统和分区工具来使用新增加的磁盘容量。这很好理解,KVM支持的客户机操作系统多种多样,而且都有成熟的文件系统和分区操作工具,resize操作只是简单的扩大或缩小磁盘镜像大小,而不能也无需来了解客户机怎么应对这个改变,这是客户机的事情。面对这么多种类型的客户机,resize也只能做这么多工作了。% H5 B: m! x2 o- }7 v% ^5 H6 \
9 l# K* \$ b: x- {" d( _
不幸的是resize尚不支持qcow2格式的磁盘镜像收缩,会有提示
9 d$ h' Y5 p9 U
! M2 S& G' @: f7 l8 Z+ [" Zqemu-img: This image format does not support resize1 U1 |8 g6 b$ j: U# \

# d( ~. u( a) Q6 x6 b. `4 H但是扩大qcow2磁盘镜像没有问题。磁盘镜像扩大另文再叙,先说下缩小,针对不同的客户机会有不同的操作方式。, S& F. T& O9 h" E3 `0 m5 D1 u* g3 H
7 c, _3 N+ [, m/ K  q
linux客户机7 c9 }6 c0 r* X: V
% a* |. ]& Y4 ]3 p) {3 Y
这里收缩的是一个debian客户机磁盘镜像,其他linux客户机应无不同。
$ ~: M1 }7 P# I. l' i* ~* S& l
6 [, r  }5 `9 Z; r( o8 O- z主要的思路就是通过分配一个新的小容量的磁盘镜像,挂载为虚拟机的新的磁盘,然后使用gparted live cd启动虚拟机,将分区拷贝到新的磁盘,然后用新的磁盘启动客户机。
& p! l3 i7 z  Z5 ?9 u' E4 r* q" i8 ]8 j# Q7 B
主要步骤如下:
8 L2 E/ q  E% \  J' Q
! ]+ X8 `0 [; A8 m: m1.创建新的小容量的磁盘镜像* V/ W. J$ j) B0 l# F( \  O

0 F. e' N5 U" U) n#qemu-img create -f qcow2 debian_new.qcow2 15G* K2 _6 l3 H0 }0 R% I" P, n
Formatting ‘debian_new.qcow2′, fmt=qcow2 size=16106127360 encryption=off cluster_size=65536
3 r8 @  `( {- T0 @& V0 B; y下载GParted live cd iso镜像,将二者挂载为客户机的新磁盘驱动器和光驱
$ O; X+ V  h  S
1 U7 K$ X) R6 C) A3 x/ W0 v7 w% v1 #!/bin/bash
7 |! J  ~2 e$ u) e! i20 F- V7 i1 e. c/ Z0 _. ~
3 kvm -bios /usr/share/seabios/bios.bin -smp 32 -m 2G -rtc base=utc,clock=host     \7 k( E; a# b+ S. Y  P% t0 i8 X
4     -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap2                   \1 P& g0 s: Z: I: X7 C/ L! ~# {& _0 z. }
5     -boot order=d -no-fd-bootchk                                                            \% G$ f2 s5 }$ f- |. ^
6     -drive file=debian.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback  \
, v- R8 |6 M, G/ z" k7     -drive file=debian_new.qcow2,if=virtio,index=1,media=disk,format=qcow2,cache=writeback  \
( m7 g6 a2 Y  K( F8     -drive file=gparted.iso,index=2,media=cdrom  \8 L% k# H" U: d7 F0 H) o
9     -vnc :0
6 ^, J% m# h+ ~5 z. G9 G
! x  a4 o. y* a6 e0 M6 ]0 ^启动虚拟机
% u/ |# L  b) J" X; p3 D" t
" p( z  r% [$ }" K0 u# z为新硬盘分区,然后将老硬盘上的分区拷贝到新的硬盘分区,如果原硬盘上的分区大于新的硬盘上的分区,可以通过GParted将原分区resize到小于新分区即可。交换分区不用拷贝,只要划出交换分区,在客户机内重新设置即可。分区拷贝完成后关闭虚拟机。& y% m* R7 S% ]7 Z
- I) F4 c, Y. O& @7 v, Q2 S* O% `
2.用原硬盘引导客户机,使用dd将原硬盘的MBR及grub2用到的扇区拷贝到新的硬盘,grub2用到了MBR后面的保留扇区。这个保留扇区叫做post-MBR gap,范围为MBR之后,第一个分区之前。
; k" t2 D" L9 @4 M7 h' U% \/ Q
' M5 J, @5 y' [! k, v; `/ P' L#fdisk -l) e9 H2 U. V5 q6 L
Disk /dev/vda: 64.4 GB, 64424509440 bytes/ f& D" ^. J0 O' o& B
255 heads, 63 sectors/track, 7832 cylinders, total 125829120 sectors
; K3 f' E7 `3 U# s: ]% m7 e4 MUnits = sectors of 1 * 512 = 512 bytes
& Z. d) |" _: M( k( z8 ~) d1 l( [, DSector size (logical/physical): 512 bytes / 512 bytes% l8 e. w: q1 f# ?- K; H) s
I/O size (minimum/optimal): 512 bytes / 512 bytes
. {- \1 O9 a9 n8 m1 I, p0 @* qDisk identifier: 0x000c6773
3 \/ t2 _0 c5 I' m  ?) ?# x( N/ ?5 G6 o7 j$ {% s  k9 [2 H
Device Boot Start End Blocks Id System
( F6 C: a9 e  @6 m' ~7 \/dev/vda1 * 2048 27262975 13630464 83 Linux; v; q3 a& A4 R2 F
/dev/vda2 120637438 125827071 2594817 5 Extended2 y( b0 b% C# k2 B
/dev/vda5 120637440 125827071 2594816 82 Linux swap / Solaris
6 d3 R( F) N) v* w2 B" S, I* q! x! G4 ~* {1 |$ [
Disk /dev/vdb: 16.1 GB, 16106127360 bytes+ b. z! ^! n$ ^* A  v. B- ?/ y
255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors. b4 L; D6 `5 M. w/ I, z- V: l
Units = sectors of 1 * 512 = 512 bytes
% f# J3 I# S  C& s$ p, HSector size (logical/physical): 512 bytes / 512 bytes
7 _, O9 u/ D$ j3 PI/O size (minimum/optimal): 512 bytes / 512 bytes
/ N9 w) g! y. S9 [Disk identifier: 0x0005fc82
' V; G3 \$ F5 j: y4 `, G: t6 t* }; I! H
Device Boot Start End Blocks Id System# P* s" g; w7 c
/dev/vdb1 2048 27262975 13630464 83 Linux5 J% [; D, l# K5 j
/dev/vdb2 27262976 31457279 2097152 82 Linux swap / Solaris" Y6 X9 b' A/ L' d. g( ?: ~

8 c; t0 d% x! v! a2 b可以看到客户机磁盘的第一个分区从2048扇区开始,保留扇区为2-2047扇区,第一扇区为MBR。因为两个硬盘分区并不完全相同,所以只拷贝MBR中的前446字节的引导代码即可。4 M9 h6 @- u3 S6 Z. H

5 a, d1 M' ]! h7 r& x; O( H拷贝MBR引导代码9 m" v+ |9 Y1 Q
#dd if=/dev/vda of=/dev/vdb bs=446 count=16 r/ T2 T8 r: C! z7 w
拷贝保留扇区. V5 `5 _2 S3 F* |( i* u: V
#dd if=/dev/vda of=/dev/vdb bs=512 seek=1 skip=1 count=2046
) L" A. u! y7 ]  N
8 X. _; D# ^4 t( }& O3.关闭客户机,为客户机换上新的硬盘并从新硬盘启动
& B9 ~/ @' @* ]) n$ l一般来说拷贝过来的分区与原分区有相同的UUID,如若不然,新硬盘将无法引导客户机,但新建的swap分区其UUID发生了变化: o0 m" J, v. K2 a6 c

7 P8 x" F' [; |  H( `) A查看新硬盘分区的UUID$ X0 ~+ C2 u& ^' w, R0 E5 M
#blkid+ t; S" N$ J; R0 u. f+ c
/dev/vda1: UUID=”48ed13f7-8640-4aba-8b8a-5efb087fadbf” TYPE=”ext4″
2 I5 D2 A1 n3 O7 ?0 a' E9 _/dev/vda2: UUID=”b484c752-69be-4bcd-86c1-a3f70185cde1″ TYPE=”swap”- B' e+ L; V& x7 k( p5 K3 Y( p, u0 }
% j, F% ]2 U8 g0 D' w6 M- @9 R
打开/etc/fstab文件,将自动挂载文件系统的UUID修改成新硬盘上对应分区的UUID
9 v$ c8 y4 H3 W: w9 Q% J# I- @7 d. r) \1 }) u
重新启动客户机,调整完毕。
0 i2 b6 g$ D! e" X# Y$ B' h2 `# h" g7 e9 c5 x9 {8 K1 M, L
windows客户机
/ z' W9 E4 C% c/ ^6 `# z+ f4 x2 W2 v" q. t% f4 \7 p2 x) w
1.创建新的小容量的磁盘镜像1 Z; U& w) b- M6 X
#qemu-img create -f qcow2 windows_new.qcow2 20G2 D$ p+ M0 u; O6 a. U
将其挂载为客户机的第二块硬盘,将GParted挂载为客户机的光驱,设置客户机为光驱启动并启动客户机- U* @& _8 g; t" S9 f6 c# e, Z

4 j% Q1 `0 S; j4 S2.用gparted resize调整老硬盘分区使其略小于新硬盘容量并apply
$ Q" [. I0 F2 p2 F5 G' S! o9 W0 A3.打开终端6 r( O# ^& K1 v# w5 D
$sudo su -
# Q& z- _) M# @#dd if=/dev/vda of=/dev/vdb bs=512 count=1
$ C3 k0 p* [1 e3 B- E将老硬盘的MBR完整复制到新硬盘( V" x+ x7 O) U1 t
4.用GParted复制老硬盘分区至新硬盘,然后resize拷贝过来的分区至新硬盘全部容量
. ]3 D* Q8 I- h) T) z5.将新硬盘挂载为客户机的第一块硬盘,并从新硬盘启动即可。启动时windows会检查磁盘,之后一切正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 02:44 , Processed in 0.021167 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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