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

kvm虚机磁盘大小修改

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-1-1 17:49:20 | 显示全部楼层 |阅读模式
虽然qcow2有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从KVM主机端完全看不到qcow2虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小qcow2虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。/ G( |3 \# I/ J# T/ |  U9 o
" d: v* D' Q; u( b# b4 {- a
不同的客户机类型有不同解决方式,基本思路就是用0填充未使用的客户机磁盘空间,然后用qemu-img转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。
, o4 L6 {7 k+ }0 i+ K: `5 y0 X  J" b
linux客户机+ a2 [8 y! o" r4 x& T; C- a- g1 F- u# e
1、使用dd命令将客户机未使用的磁盘空间用0填满, A8 O3 l! m4 \( C
#dd if=/dev/zero of=~/junk1 _# f4 V$ H- ?" L
dd: writing to `/home/***/junk’: No space left on device/ n! u, B+ @/ ^" C$ D
然后
$ t% H# V2 Y* j5 n#rm junk
* ?5 _. R' f' Y8 k  o+ B3 B* i& Q关闭客户机
0 d* b* Q- g' S- ^2、转换磁盘镜像文件
8 t$ i! Q; U8 c#qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2
8 N! Z4 z' ~# m9 i' i
0 {, w, I% f- z  v! Q转换完成后可以看到debian_new.qcow2占用的KVM主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件debian_new.qcow2启动客户机即可。/ K5 A6 D+ H3 {% g( Q7 b

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 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会检查磁盘,之后一切正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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