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

kvm虚机磁盘大小修改

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-1-1 17:49:20 | 显示全部楼层 |阅读模式
虽然qcow2有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从KVM主机端完全看不到qcow2虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小qcow2虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。
9 s% O+ u4 ]3 H  R
* O& }, U8 A' {2 t: Z不同的客户机类型有不同解决方式,基本思路就是用0填充未使用的客户机磁盘空间,然后用qemu-img转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。
1 n- z9 h0 N$ \6 l2 S& m7 C/ ^; d& i, a1 ^
linux客户机+ E: M1 G  ^, w; M: }! P4 x
1、使用dd命令将客户机未使用的磁盘空间用0填满
4 w: H& M2 V2 u8 }4 s#dd if=/dev/zero of=~/junk
7 l3 Y9 T' ^2 g- [7 t! D/ Z6 }dd: writing to `/home/***/junk’: No space left on device
% I; M1 |4 M4 {7 }9 a然后9 ^3 L# y4 w/ ^- l- f8 Q; L2 g
#rm junk& b4 }' E+ M1 z5 Z8 U( X9 P
关闭客户机  n; B5 \9 U( R% x7 m/ c
2、转换磁盘镜像文件) T1 o4 ~1 V! ?5 n' B8 j; T
#qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2
9 g2 @$ b  |$ {. v2 o, I7 e7 L4 Q
  a$ w9 X2 V2 D# w% v, @转换完成后可以看到debian_new.qcow2占用的KVM主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件debian_new.qcow2启动客户机即可。7 f% [; A. \2 V6 U  S( k( _. e

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-1-1 17:50:33 | 显示全部楼层
qcow2格式的虚拟磁盘初始容量设置过大,虽然并不会实际占用主机这么大的磁盘空间,只占用客户机实际使用的空间大小,但有时候还是有些不太方便,所以需要将其收缩(shrink)以下。
1 n! ~4 ]8 O: n: M9 _- S) @qemu-img命令有一个选项resize可以改变磁盘镜像的大小,其格式如下! J6 ~0 M# I) B& N5 a
" H4 I0 n% v5 H' ?  L2 ~. f5 E
#qemu-img resize filename [+|-]size
' I7 Z6 y: I8 q: E9 O5 ?
' a$ M4 K- I. ~) B9 j7 ^+就是增加磁盘镜像的大小,-就是缩小磁盘镜像的大小,此处的磁盘镜像的大小并不是磁盘镜像文件在KVM主机中实际占用的存储空间大小,而是KVM客户机看到的磁盘的大小。
7 H: B& a/ S  s+ O( C) }- k8 g# d
但是扩大或收缩磁盘镜像大小远没有这么简单。
, K/ I4 Z3 t% ?( _  D; A: b; Q% y$ [( o% W! \
man qemu-img如是说:# v  p9 q+ q3 `: K7 p7 a2 H: ?* ^5 G$ Y
当使用此命令收缩磁盘镜像之前,必须使用客户机的文件系统和分区工具来收缩文件系统和分区,然后再执行resize操作,不然会可能丢失数据。当使用此命令扩大了磁盘镜像之后,必须使用客户机的文件系统和分区工具来使用新增加的磁盘容量。这很好理解,KVM支持的客户机操作系统多种多样,而且都有成熟的文件系统和分区操作工具,resize操作只是简单的扩大或缩小磁盘镜像大小,而不能也无需来了解客户机怎么应对这个改变,这是客户机的事情。面对这么多种类型的客户机,resize也只能做这么多工作了。
% `$ a, T; o. Q' W0 g% T* z* _. q& t. t) @& r  ~3 C* t. I$ J9 u
不幸的是resize尚不支持qcow2格式的磁盘镜像收缩,会有提示' u5 f: G9 T' X+ Z

8 }5 C! t  ?; Bqemu-img: This image format does not support resize; t+ B0 k: ~& K  e

  j9 L- ?, U( i0 g6 m但是扩大qcow2磁盘镜像没有问题。磁盘镜像扩大另文再叙,先说下缩小,针对不同的客户机会有不同的操作方式。  r6 X+ `# M) z
" E! M0 N" a( h9 [' ^
linux客户机( p: I6 r1 @  U, c" r* H

1 _' r6 J+ W, e9 u: I/ g这里收缩的是一个debian客户机磁盘镜像,其他linux客户机应无不同。
9 b2 k1 \. Y% x0 q( V8 B4 x) L! Z3 |, V- S6 @8 g
主要的思路就是通过分配一个新的小容量的磁盘镜像,挂载为虚拟机的新的磁盘,然后使用gparted live cd启动虚拟机,将分区拷贝到新的磁盘,然后用新的磁盘启动客户机。4 |6 a, }, q1 e. ^& X' W

! N' }2 L' W8 ]2 d& Y主要步骤如下:
; Y: W1 y  H2 G
- |& n3 [5 L1 e' b9 i1.创建新的小容量的磁盘镜像
& W- h5 I# f# s
$ ^% R5 U2 d( b+ Q) d8 q; v#qemu-img create -f qcow2 debian_new.qcow2 15G# }4 ]. W- C( b  r! p4 }
Formatting ‘debian_new.qcow2′, fmt=qcow2 size=16106127360 encryption=off cluster_size=65536( q1 r" U  F0 G4 @: l' M7 p
下载GParted live cd iso镜像,将二者挂载为客户机的新磁盘驱动器和光驱$ F. ~2 I. I  [& j: u& m

4 b9 j5 V  F" L! k  E% _1 #!/bin/bash, v% f  p8 w3 b3 m; p
2$ Z2 B$ C7 {- k# e& N. |
3 kvm -bios /usr/share/seabios/bios.bin -smp 32 -m 2G -rtc base=utc,clock=host     \
% K1 d( B: }% k0 ^. f4     -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap2                   \. l9 k; G. t. G# J  m( Q
5     -boot order=d -no-fd-bootchk                                                            \0 v. I- ?7 ?4 ^: h/ w' O
6     -drive file=debian.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback  \
5 E9 g, a+ X$ K( Q7     -drive file=debian_new.qcow2,if=virtio,index=1,media=disk,format=qcow2,cache=writeback  \
# d! _/ C% r8 [" o; e/ {8     -drive file=gparted.iso,index=2,media=cdrom  \
6 e6 r& k' A( `& i% Y9     -vnc :00 E' U" r6 d3 I: ~

8 q7 a% J' c" P: |1 m5 ^  I3 ^* |启动虚拟机
, R; s( z3 F/ x- a" q6 Y, i/ a% O
) k7 c4 I' O2 O  [, I  k4 V为新硬盘分区,然后将老硬盘上的分区拷贝到新的硬盘分区,如果原硬盘上的分区大于新的硬盘上的分区,可以通过GParted将原分区resize到小于新分区即可。交换分区不用拷贝,只要划出交换分区,在客户机内重新设置即可。分区拷贝完成后关闭虚拟机。$ Y7 e- A- P4 M- |4 {

9 q7 m: [7 |/ ^% s2.用原硬盘引导客户机,使用dd将原硬盘的MBR及grub2用到的扇区拷贝到新的硬盘,grub2用到了MBR后面的保留扇区。这个保留扇区叫做post-MBR gap,范围为MBR之后,第一个分区之前。
% t' Y9 m( p2 g
( V) F; O) V, s) C' P8 u/ [#fdisk -l
/ v2 [' t1 n* @- o3 ^9 {' g4 c0 vDisk /dev/vda: 64.4 GB, 64424509440 bytes
9 Q' o0 s6 x1 f9 I255 heads, 63 sectors/track, 7832 cylinders, total 125829120 sectors
' p# r2 I# {$ z, k5 i; [2 PUnits = sectors of 1 * 512 = 512 bytes) k6 A+ o: ~' C8 e2 ]. p5 R
Sector size (logical/physical): 512 bytes / 512 bytes
( C( x  n/ M  D* s" D1 w! EI/O size (minimum/optimal): 512 bytes / 512 bytes; E/ y9 n  [! [& w
Disk identifier: 0x000c6773
; L9 H* I- V" u" ]2 t$ Y( y5 S" s& D
Device Boot Start End Blocks Id System5 P" t1 x3 A2 D, Y
/dev/vda1 * 2048 27262975 13630464 83 Linux2 K- l( R( {/ E; Y5 A3 P+ f
/dev/vda2 120637438 125827071 2594817 5 Extended
# X9 x% e- S* G( G* g% i/dev/vda5 120637440 125827071 2594816 82 Linux swap / Solaris
/ A. F1 {, y% g
6 y' c; o& z# [+ C2 DDisk /dev/vdb: 16.1 GB, 16106127360 bytes7 E5 a7 S8 `) J6 H& H7 X
255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors* ]9 r) S' m! [3 ?6 Y
Units = sectors of 1 * 512 = 512 bytes
0 h4 \6 `3 T3 W1 x% jSector size (logical/physical): 512 bytes / 512 bytes
# E8 K) m1 F( |0 y: X. II/O size (minimum/optimal): 512 bytes / 512 bytes
1 U$ F/ ^; R9 f, p- F, \; mDisk identifier: 0x0005fc82
" ?: r2 t8 @' @0 y4 g; H9 U
7 n: ?* k" _! _Device Boot Start End Blocks Id System
. d( z/ G' J+ ^; C$ ?: ?" ^* b, a/dev/vdb1 2048 27262975 13630464 83 Linux$ ]6 [5 i. v/ y! o, k: L+ n
/dev/vdb2 27262976 31457279 2097152 82 Linux swap / Solaris+ ]# i# i2 ^7 \2 @1 g( }$ |
9 d$ a. S# B( S6 j1 F" V
可以看到客户机磁盘的第一个分区从2048扇区开始,保留扇区为2-2047扇区,第一扇区为MBR。因为两个硬盘分区并不完全相同,所以只拷贝MBR中的前446字节的引导代码即可。
4 K. r6 W7 u& t! v6 \
, L* ^/ o  E8 ~/ p! u拷贝MBR引导代码
) R5 A% b# i8 n5 H! V- B; R, d#dd if=/dev/vda of=/dev/vdb bs=446 count=1' u1 P/ t) _6 x( Z8 B& R/ Y7 {
拷贝保留扇区) b  P& h! j% n3 I
#dd if=/dev/vda of=/dev/vdb bs=512 seek=1 skip=1 count=2046
: L6 K4 [+ c+ _* i" x$ v) T6 t  s. N: `) H; A+ V* ?: N
3.关闭客户机,为客户机换上新的硬盘并从新硬盘启动
, o( R7 o# x. o; q一般来说拷贝过来的分区与原分区有相同的UUID,如若不然,新硬盘将无法引导客户机,但新建的swap分区其UUID发生了变化
) H/ P; r% l/ n, _4 F4 Y. x! a3 r! I  X
4 R# F. R/ v" r) x$ M3 n  r查看新硬盘分区的UUID
+ x+ A& L* G; d#blkid) r% F1 A) n6 L/ o, C
/dev/vda1: UUID=”48ed13f7-8640-4aba-8b8a-5efb087fadbf” TYPE=”ext4″
! R. T& q: p0 _6 `/dev/vda2: UUID=”b484c752-69be-4bcd-86c1-a3f70185cde1″ TYPE=”swap”
8 l/ I8 r8 E6 c2 t! _0 i
& ]+ F, p2 o5 v打开/etc/fstab文件,将自动挂载文件系统的UUID修改成新硬盘上对应分区的UUID
; u0 u1 n- H' j' @( z# P# s! K! m1 a6 x7 |9 v9 h5 q" y( H1 Q. ~2 u
重新启动客户机,调整完毕。
2 M, j5 N1 {# l+ F* c# n
# A  _) V$ n/ |! @! awindows客户机! b0 A0 g7 O) c( }+ T9 w, H3 [
5 A! w# _! `7 K+ c( r, G3 a
1.创建新的小容量的磁盘镜像
  [- P( }0 f$ e#qemu-img create -f qcow2 windows_new.qcow2 20G5 P% m# ], E, x9 n
将其挂载为客户机的第二块硬盘,将GParted挂载为客户机的光驱,设置客户机为光驱启动并启动客户机+ d: t2 |" s) }; |# K) x
# ]2 N" s1 q) `4 v
2.用gparted resize调整老硬盘分区使其略小于新硬盘容量并apply
, a6 S" f) v' P4 b4 x3.打开终端$ U* r9 z0 N0 c6 j0 @  }3 ]. ?  \- Q
$sudo su -8 p, f+ o3 K4 T5 V3 E3 ~6 ^; V7 s
#dd if=/dev/vda of=/dev/vdb bs=512 count=1
% f3 y/ `$ D' z将老硬盘的MBR完整复制到新硬盘
) k9 ]" j& r* w3 G. j& \4.用GParted复制老硬盘分区至新硬盘,然后resize拷贝过来的分区至新硬盘全部容量
# y! W/ N3 {; `. ^4 D* n5.将新硬盘挂载为客户机的第一块硬盘,并从新硬盘启动即可。启动时windows会检查磁盘,之后一切正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 02:47 , Processed in 0.019699 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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