易陆发现论坛

 找回密码
 开始注册
查看: 384|回复: 1
收起左侧

kvm虚机磁盘大小修改

[复制链接]
发表于 2020-1-1 17:49:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x
虽然qcow2有一个特点,客户机需要时才分配存储空间,这工作的一直很好。但是当从客户机删除了很多文件,释放了很多空间时,从KVM主机端完全看不到qcow2虚拟磁盘文件有变小的迹象。这是因为现在的文件系统都有一个特点,删除文件时并没有真正的清除文件的内容,只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据。这也是反删除甚至反格式化软件存在的基础。所以要想缩小qcow2虚拟磁盘文件的大小,就要真正释放这些未使用的空间才可以。2 m) Q+ F3 O6 ]

$ V+ ~$ g6 U- G6 p; S! i) |9 Z不同的客户机类型有不同解决方式,基本思路就是用0填充未使用的客户机磁盘空间,然后用qemu-img转换磁盘镜像文件,转换后的磁盘镜像文件将只包含所有已使用的磁盘空间。$ e, z1 f) X5 w, V

$ d. g, D+ X6 O2 Y, ^linux客户机
% m, S2 F+ T+ G* J1 \# X# _1、使用dd命令将客户机未使用的磁盘空间用0填满; j3 A) y, A0 v8 O
#dd if=/dev/zero of=~/junk
9 r" `* b" ~4 C. e0 ddd: writing to `/home/***/junk’: No space left on device
* \* n3 C' |' @; j1 d' u$ G然后
, y$ L$ j- ?/ v5 b#rm junk4 @9 B0 K) h' c' d" J% L& ~. k: A
关闭客户机
" I0 V2 b! P! n2、转换磁盘镜像文件/ q- E- Z3 N, m- u
#qemu-img convert -O qcow2 debian.qcow2 debian_new.qcow2
6 x7 J0 n1 W# c3 |& F& a; a* [
1 ?2 E, ]) g% k- F5 v9 K; ?* V+ z转换完成后可以看到debian_new.qcow2占用的KVM主机存储空间与客户机使用的磁盘空间基本是一致的。然后用新的磁盘镜像文件debian_new.qcow2启动客户机即可。7 q7 S( @8 z  G. p/ {/ G- `
 楼主| 发表于 2020-1-1 17:50:33 | 显示全部楼层
qcow2格式的虚拟磁盘初始容量设置过大,虽然并不会实际占用主机这么大的磁盘空间,只占用客户机实际使用的空间大小,但有时候还是有些不太方便,所以需要将其收缩(shrink)以下。8 W) t3 V* b1 O) W: f
qemu-img命令有一个选项resize可以改变磁盘镜像的大小,其格式如下2 W8 Y, p( s( ]* S) X
% K$ A) Q& j; ]) y
#qemu-img resize filename [+|-]size+ V' Y4 \/ X  H/ m6 B6 A
# R/ F; E( n- s3 f3 e3 a: W
+就是增加磁盘镜像的大小,-就是缩小磁盘镜像的大小,此处的磁盘镜像的大小并不是磁盘镜像文件在KVM主机中实际占用的存储空间大小,而是KVM客户机看到的磁盘的大小。2 C# ]7 ~& h" U

) w# ~6 t5 u" L- D但是扩大或收缩磁盘镜像大小远没有这么简单。
" j0 J: C4 y! T0 @6 i. G9 T8 v. d7 ~1 h
man qemu-img如是说:
- a& y5 Z0 B+ e0 |当使用此命令收缩磁盘镜像之前,必须使用客户机的文件系统和分区工具来收缩文件系统和分区,然后再执行resize操作,不然会可能丢失数据。当使用此命令扩大了磁盘镜像之后,必须使用客户机的文件系统和分区工具来使用新增加的磁盘容量。这很好理解,KVM支持的客户机操作系统多种多样,而且都有成熟的文件系统和分区操作工具,resize操作只是简单的扩大或缩小磁盘镜像大小,而不能也无需来了解客户机怎么应对这个改变,这是客户机的事情。面对这么多种类型的客户机,resize也只能做这么多工作了。
; D4 T' N1 {9 A& G7 I, z1 T
1 U3 ~7 F# x: Z# l- F不幸的是resize尚不支持qcow2格式的磁盘镜像收缩,会有提示& X7 [+ t- ^. l3 f0 u9 I/ r. r

  g+ Q" ^" q0 X) h$ R' `4 Nqemu-img: This image format does not support resize
0 |& y0 x, K$ ]* W7 V+ L. [5 k; m5 [# x; |
但是扩大qcow2磁盘镜像没有问题。磁盘镜像扩大另文再叙,先说下缩小,针对不同的客户机会有不同的操作方式。
% H4 Z& H: e; O3 Y' S2 b
2 Z, V  _! [4 u. [4 u) Blinux客户机: O% q6 F0 m; {  H

  e0 ?/ X, {6 n5 _* {) h& ]这里收缩的是一个debian客户机磁盘镜像,其他linux客户机应无不同。& }7 \; E, i1 h2 ?6 o

; d5 w/ @3 K9 D5 P- _主要的思路就是通过分配一个新的小容量的磁盘镜像,挂载为虚拟机的新的磁盘,然后使用gparted live cd启动虚拟机,将分区拷贝到新的磁盘,然后用新的磁盘启动客户机。
( f# Z' {5 i! p$ x$ v
8 y# E3 C, ^6 X4 B主要步骤如下:
0 P/ ~. o4 b" j- ?7 c0 V
/ q" l# }  b% y0 o- _- o+ H1.创建新的小容量的磁盘镜像- K0 ~* v5 f/ l* l0 O% [, ?  M* [1 }
3 _3 t5 q4 U0 V. ]4 u2 Z. m
#qemu-img create -f qcow2 debian_new.qcow2 15G
  s0 o3 z' n' J, s0 }- C% ~: AFormatting ‘debian_new.qcow2′, fmt=qcow2 size=16106127360 encryption=off cluster_size=655363 V" `9 q/ g$ m0 O; T/ ^# t
下载GParted live cd iso镜像,将二者挂载为客户机的新磁盘驱动器和光驱* i, x6 k" f5 L

+ H+ m& {/ s6 F7 @, Y1 #!/bin/bash; u0 C8 _3 H/ X1 U0 S( B$ p% m4 U
2+ L+ L9 Z% H4 P6 q9 x3 X- U
3 kvm -bios /usr/share/seabios/bios.bin -smp 32 -m 2G -rtc base=utc,clock=host     \9 n; @4 y6 C; v
4     -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap2                   \& G- _3 O) s$ x3 p/ ]6 F
5     -boot order=d -no-fd-bootchk                                                            \
1 f1 T4 N3 o5 m5 X1 X# ?0 m6     -drive file=debian.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback  \8 Z: b" F- G% \2 M5 w% l+ O0 w; o
7     -drive file=debian_new.qcow2,if=virtio,index=1,media=disk,format=qcow2,cache=writeback  \
  V, A4 C' C  n' }0 a7 y7 a8     -drive file=gparted.iso,index=2,media=cdrom  \) x- s! f! l/ F3 t' h5 a# a  K
9     -vnc :0
/ `  l' t; z+ `, h! d0 i$ a+ {2 M( Q0 d" c" R# A5 X4 I5 Z8 f
启动虚拟机
* C0 v6 h( [1 ~6 a/ d: V5 g
! R# ^! X9 P- U% v; V+ S/ g: Y2 ~为新硬盘分区,然后将老硬盘上的分区拷贝到新的硬盘分区,如果原硬盘上的分区大于新的硬盘上的分区,可以通过GParted将原分区resize到小于新分区即可。交换分区不用拷贝,只要划出交换分区,在客户机内重新设置即可。分区拷贝完成后关闭虚拟机。
' q- U: K! ]2 M$ n
: J1 `5 [/ G5 Z$ X# j7 x2.用原硬盘引导客户机,使用dd将原硬盘的MBR及grub2用到的扇区拷贝到新的硬盘,grub2用到了MBR后面的保留扇区。这个保留扇区叫做post-MBR gap,范围为MBR之后,第一个分区之前。
  \3 n. X  D  ^- ?
: O0 N9 B# m9 ]2 L# l' S, G% T#fdisk -l
0 Q/ E+ G5 h! \0 _Disk /dev/vda: 64.4 GB, 64424509440 bytes& r- A: O3 w$ R6 q
255 heads, 63 sectors/track, 7832 cylinders, total 125829120 sectors" r. }) ~' J1 Y, w$ }- p6 I1 s; Q
Units = sectors of 1 * 512 = 512 bytes
6 R9 j2 G5 B# T6 J% i, w, ^8 TSector size (logical/physical): 512 bytes / 512 bytes3 j. [+ S4 l1 z  ^6 X  F/ O6 ^
I/O size (minimum/optimal): 512 bytes / 512 bytes
3 A7 q3 ~8 ?; @' I# pDisk identifier: 0x000c6773* K) Y" S. K; u! _. K! x3 {2 w
2 d( u6 o% v( g, ?- C: F
Device Boot Start End Blocks Id System. l+ D7 O# ], |' e
/dev/vda1 * 2048 27262975 13630464 83 Linux
6 L5 m# ^7 G( B( a+ M/dev/vda2 120637438 125827071 2594817 5 Extended
" X1 G0 z* p1 [$ `6 {* f7 d& v/dev/vda5 120637440 125827071 2594816 82 Linux swap / Solaris4 {5 F% N+ }% w& Z$ C
" u$ t; ^) I; W+ C. o
Disk /dev/vdb: 16.1 GB, 16106127360 bytes
% ]3 V' y& p+ q* f+ ^2 q255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors% e& a) j9 j5 g# ?) F6 G
Units = sectors of 1 * 512 = 512 bytes: [, _4 ~3 x* V0 S7 ^/ [- M0 K) g
Sector size (logical/physical): 512 bytes / 512 bytes# r8 ~: y% g( S' }" s: N0 z
I/O size (minimum/optimal): 512 bytes / 512 bytes/ k+ J% l+ v/ ~6 l3 P
Disk identifier: 0x0005fc82
* w3 L8 }3 ]5 z. }! r% O# N5 a5 L" z7 r( U3 Y7 z3 u
Device Boot Start End Blocks Id System! [9 ^# q6 c! W! J$ \! g9 z6 J- u
/dev/vdb1 2048 27262975 13630464 83 Linux
( f1 e7 g8 |, [, n& G) ^/dev/vdb2 27262976 31457279 2097152 82 Linux swap / Solaris
: v6 }5 P+ Y  p8 T8 J1 G5 Y- }+ H6 u! \( P8 U* a) H& t9 z% A
可以看到客户机磁盘的第一个分区从2048扇区开始,保留扇区为2-2047扇区,第一扇区为MBR。因为两个硬盘分区并不完全相同,所以只拷贝MBR中的前446字节的引导代码即可。
4 [* m0 z4 ^, s4 ^8 l8 Z" a7 k9 q- Y7 h4 z9 V1 F% J3 B( w/ T
拷贝MBR引导代码' K7 X8 |3 a( o- J3 j
#dd if=/dev/vda of=/dev/vdb bs=446 count=1
# z2 c  u1 s6 @! c% L& }" b7 w4 G拷贝保留扇区" S! B0 I8 n3 j
#dd if=/dev/vda of=/dev/vdb bs=512 seek=1 skip=1 count=2046& Z. n/ C6 o) s; C% w& o) W" V) n0 I
" o2 V, k% [" B* I% |! I
3.关闭客户机,为客户机换上新的硬盘并从新硬盘启动, A3 T! l# D) S5 j
一般来说拷贝过来的分区与原分区有相同的UUID,如若不然,新硬盘将无法引导客户机,但新建的swap分区其UUID发生了变化
, j' E, `* m1 _- t' c* G
* f1 _* `. {& B) W查看新硬盘分区的UUID
% l% c% B  Z# v! m% i4 ^#blkid6 b. p) h; i6 a' ]( d5 O/ }# Y
/dev/vda1: UUID=”48ed13f7-8640-4aba-8b8a-5efb087fadbf” TYPE=”ext4″+ ?, W( j  e7 e" }0 ~: a; m
/dev/vda2: UUID=”b484c752-69be-4bcd-86c1-a3f70185cde1″ TYPE=”swap”
5 ]1 g1 p5 u8 {) K7 e3 z' s3 c0 @
打开/etc/fstab文件,将自动挂载文件系统的UUID修改成新硬盘上对应分区的UUID/ z! h6 E( K9 X& T) A
  A( K# h( c* o1 r' K1 L" z
重新启动客户机,调整完毕。3 q% h7 G# ~, ]
8 \% R# t8 C8 ]& i" D) Q$ ^. l4 m
windows客户机
9 M4 Q' }2 Z# [" A5 m- n/ f  }- ~1 D+ G# {! \* o
1.创建新的小容量的磁盘镜像
! ~; v8 ~( i2 {#qemu-img create -f qcow2 windows_new.qcow2 20G' @8 _1 G. q" ?8 d3 v7 k% ]
将其挂载为客户机的第二块硬盘,将GParted挂载为客户机的光驱,设置客户机为光驱启动并启动客户机
4 a( |" g6 O2 D8 f4 \
8 E! l; c) C6 x" S2.用gparted resize调整老硬盘分区使其略小于新硬盘容量并apply
% u3 X6 i0 D" S! P& t3.打开终端
6 n- @3 ~1 ?) {$sudo su -. }4 j7 F1 Y/ S( P
#dd if=/dev/vda of=/dev/vdb bs=512 count=1, V3 o. [8 k( P& m, |8 j
将老硬盘的MBR完整复制到新硬盘8 \1 f: g3 n' S, d% a! j  j
4.用GParted复制老硬盘分区至新硬盘,然后resize拷贝过来的分区至新硬盘全部容量
( `! N- |% w: x7 S( S7 {+ L. O* R5.将新硬盘挂载为客户机的第一块硬盘,并从新硬盘启动即可。启动时windows会检查磁盘,之后一切正常。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2020-4-5 00:13 , Processed in 0.057176 second(s), 21 queries .

Powered by 龙睿 bbs168x X3.2

© 2001-2020 Comsenz Inc.

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