|
|
楼主 |
发表于 2022-4-11 17:33:21
|
显示全部楼层
以使用如下命令& n# W% z8 Z( K
+ S6 X0 W1 j5 ?; U6 l6 @& H- Hqemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2* N- X) O' P, R& L
磁盘镜像如果有快照,无法进行扩容
/ z6 W6 G1 K9 l6 e0 J Y4 L0 N5 ]2 ?; }. q1 o
再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动; `6 j6 A O* O, f5 ?- L( d
- r3 [6 j4 F, `4 o' Y
[root@cos7 ~]# virsh list --all0 V& ^$ N5 n, b% m8 {9 h& v3 |9 ^
Id Name State- q& n" K( ?; g) ~3 Z9 @
---------------------------------------------------- o4 v' p7 ^: E( t! z& r% F8 Q+ S2 Z
4 kvm4 running, Z0 |" s3 J7 q, P( L. E& r
- kvm1 shut off
# E2 x1 P4 T. b8 O: i- kvm2 shut off
7 t$ B) T4 z: l. ?$ Y- kvm3 shut off( c [9 p6 @3 h# v. v& l% e
- kvm5 shut off6 L: _* @9 O+ t4 T* H, P5 z& `8 W: v9 s
- kvm6 shut off- y9 E# I( @+ n* X
登录kvm4,查看虚拟机磁盘状态,如下9 D0 L: g5 J' R3 D% P2 ]% P
/ c8 ]( l! o' K! m9 E/ p
[root@kvm4 ~]# fdisk -l' y7 P4 R! B0 y* z/ R* e/ D- m
6 s9 e3 z: T% s) @* U
Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
! _) {/ A$ W lUnits = sectors of 1 * 512 = 512 bytes3 i) t1 p) A+ \( v# r, E7 y9 n
Sector size (logical/physical): 512 bytes / 512 bytes% |* C0 m+ j' y$ ~
I/O size (minimum/optimal): 512 bytes / 512 bytes! z- b9 {8 `3 O5 l3 a/ q) I
Disk label type: dos
% C7 o# F/ G0 @3 Z9 m) lDisk identifier: 0x000b9417
' ]! W8 W1 G6 l; y: ?" N9 |: ^ # y* o$ O# y; Y0 E- j( S
Device Boot Start End Blocks Id System
! s5 n# ~, l9 P& f: p& G. z/dev/vda1 * 2048 2099199 1048576 83 Linux5 `) ?0 J/ D$ X0 f5 W1 ]3 o Y
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris; L8 }8 a* K6 f( w$ [0 d
/dev/vda3 10227712 104857599 47314944 83 Linux- B. H: i, }1 F; B' `" p
[root@kvm4 ~]#
* ~) P+ A* d! z4 s, f/ W[root@kvm4 ~]#
3 _4 u+ Z1 a% X; `* E5 y[root@kvm4 ~]#+ H. b; X# b# f7 h+ @6 {" Q9 F
[root@kvm4 ~]# df -h
3 G9 _7 Q9 G3 m* y8 a4 E7 E- TFilesystem Size Used Avail Use% Mounted on9 ^/ v$ W5 _" u0 c
devtmpfs 1.9G 0 1.9G 0% /dev+ s( @$ v$ P0 u! I
tmpfs 1.9G 0 1.9G 0% /dev/shm
- B% e& E# V. Y! w$ qtmpfs 1.9G 8.5M 1.9G 1% /run! B0 L0 ]& ?: V% V$ o$ \
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup# w+ n' F$ s2 z5 |
/dev/vda3 46G 1.3G 44G 3% /
& Z! \# A, P) d1 g( P. D6 y& u/dev/vda1 1014M 142M 873M 14% /boot# m, j/ n3 k9 w
tmpfs 379M 0 379M 0% /run/user/0& F. m0 i5 X J! x' l8 {
从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。 e* @9 `* H: G4 S
在宿主机上确认kvm4的磁盘镜像路径,如下:" W1 ^. A) a, F- m: W# G
' ~! a' F+ R) {7 g) |; k
[root@cos7 ~]# virsh domblklist kvm4! J! G5 W- o, C
Target Source2 y& m6 F. O% R" j5 H2 o
------------------------------------------------
, j+ d& t9 c2 O/ @9 i* K9 t% j( m& qvda /var/lib/libvirt/images/kvm4.qcow2
3 r( H5 Z0 s n+ shda -
6 o' D# Z, y5 |& u可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小
3 h- [, W( z5 n3 Q/ p/ V6 J
: e) Q$ F* P! T3 ~: N[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
6 f/ c( N7 y5 l' A6 Fimage: /var/lib/libvirt/images/kvm4.qcow2 x! N& U9 }# J) _3 F; q2 W
file format: qcow2
% C9 |- ]( r3 @- E( H0 Y0 F; Q5 kvirtual size: 50G (53687091200 bytes)* y( ^' @ ~0 ?0 V
disk size: 1.5G- k' E$ M+ y. t
cluster_size: 655369 b9 Q' O) p* o" J
Format specific information:. C+ p& \# w" u6 k2 B; @
compat: 1.1. y( v2 ~) J, e! S7 t% F
lazy refcounts: true8 D+ o9 }3 x+ j3 R
如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。/ e% s1 x9 I1 k
现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。* M+ }, ~2 q. j9 M
停止虚拟机后,执行如下命令
, ^- {0 T ]0 {( q0 P( `: T
* L0 E; o# P! r$ w[root@cos7 ~]# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G
$ ~8 F9 }. c6 ^# S* S$ sImage resized.
8 t1 {0 a6 E/ }' r% k增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G
& ~( \5 B* T( a% W5 p2 H; C e% R4 n
[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2- G( D+ }3 b1 m8 `4 g* ~, j, n, E
image: /var/lib/libvirt/images/kvm4.qcow2
: l# e+ u4 O% Y2 `file format: qcow2
$ |" E1 y+ {1 Yvirtual size: 70G (75161927680 bytes)
: m' N# ^" y, Y' Kdisk size: 2.5G
( y; F3 l! `% Kcluster_size: 65536
- E1 `) T; u+ zFormat specific information:0 q9 ^5 J. |7 D; q
compat: 1.1
- R6 [, i2 r' S9 b clazy refcounts: true
4 ]! F2 z, Y, ], ?. f磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G3 `: I, G& y+ I* {; K" I
& v5 x# A8 V+ l3 M: M( Y
[root@kvm4 ~]# fdisk -l, K; [5 C! q+ o9 ]0 W
' D* u. T+ C( t- TDisk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors
' }- |% B7 |1 o+ `+ @ r( N5 gUnits = sectors of 1 * 512 = 512 bytes
, D) }8 v* [: Y3 P. C* v ESector size (logical/physical): 512 bytes / 512 bytes
9 G7 j4 `6 o- J, V3 h' v7 HI/O size (minimum/optimal): 512 bytes / 512 bytes6 B8 S# s) k' T# U" ^' y7 V, F5 h: b
Disk label type: dos$ G# F* t; @: w3 O5 G" o: x) E' c
Disk identifier: 0x000b9417
, P( w: D! I0 L0 A9 Y
0 |" D! s7 l$ O- nDevice Boot Start End Blocks Id System# B8 s* v! j3 ]! Q7 e
/dev/vda1 * 2048 2099199 1048576 83 Linux
. p3 f; ?& C8 g8 l- T/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris
; K* T$ V+ Y/ N2 c/dev/vda3 10227712 104857599 47314944 83 Linux2 W9 V! M+ ]6 c+ O7 p$ s$ y: Q
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。
* p* ~4 | k/ O# s; h, e$ V9 }: [+ `- [! Y; d T/ F6 }4 K
[root@kvm4 ~]# fdisk -lu /dev/vda3- Y! e1 |/ c* C R9 D
: G% r5 _8 G- JDisk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors% C- h2 u9 U5 S5 A9 d- @
Units = sectors of 1 * 512 = 512 bytes. B$ k( ]7 J% C3 A
Sector size (logical/physical): 512 bytes / 512 bytes
1 T& t6 q+ X8 E2 gI/O size (minimum/optimal): 512 bytes / 512 bytes6 E9 q; _- ~0 |1 c% @' _. D7 Y
6 x% ?3 C" \$ |& j; k: g# ?: N- @. }
[root@kvm4 ~]#
4 E R) |+ ?0 v! _) O( J/ p[root@kvm4 ~]#
; t# q# g2 ^: b/ Q6 _9 ?9 R. Y[root@kvm4 ~]#
2 F9 c X" z, D7 O: s( A[root@kvm4 ~]# df -h
) e) p( E! y6 p, J4 _* R/ W5 i+ m1 sFilesystem Size Used Avail Use% Mounted on5 ^- n4 H" E5 W9 n4 Q) K
devtmpfs 1.9G 0 1.9G 0% /dev, a3 _9 n0 p. |7 ~7 m
tmpfs 1.9G 0 1.9G 0% /dev/shm4 u* q+ O0 F6 p
tmpfs 1.9G 8.5M 1.9G 1% /run
% p" a8 |+ x. @, H" Q5 j! Itmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup: \0 |7 a) R6 O
/dev/vda3 46G 1.3G 44G 3% /
7 z+ i. U$ C- e2 t3 A* ^/dev/vda1 1014M 142M 873M 14% /boot3 _; |0 T o2 n" B
tmpfs 379M 0 379M 0% /run/user/0
2 F% x6 J" [: Y: M; g7 f我们现在的目标就是扩容根分区和文件系统。
: }3 G) k+ l$ u6 Y5 h; E' h6 `此处可以参考阿里云的文档进行扩容操作,链接如下:
/ C; }4 X9 |1 Qhttps://help.aliyun.com/document ... scm=20140722.S_help' c- d) N, \1 _/ W; h* q1 T: B) y
: n( n) g# f6 {/ w2 p' U1 @( H- M我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。
/ y; K% |# @& H+ A" n
% b, K% u# [" }$ l+ K6 R0 z# Q$ [首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下
# Q# \& ~0 c4 o; R7 l2 b ~( O$ _* w
yum install -y cloud-utils-growpart
5 O3 }: \3 ?2 n2 b' Z安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格+ ~7 ]* q7 U) |" p: Q2 j3 Z
7 O! z* X3 [4 V# i" N
[root@kvm4 ~]# growpart /dev/vda 3
+ c* G6 @9 `4 h* eCHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
2 E- ?7 K1 |# r: |/ ^4 I可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G
' k& ?9 T$ ?/ E6 l! b5 `( ^# }5 p0 S
% _4 R- \- y! _; G) j* ]. {[root@kvm4 ~]# fdisk -lu /dev/vda3: K4 M( a5 F! Q3 }( B0 v+ ]+ O( {% s
5 X0 g$ s# N/ x3 l
Disk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors
X3 i8 F/ J3 K _8 e/ RUnits = sectors of 1 * 512 = 512 bytes
2 p0 ]6 G& Z+ RSector size (logical/physical): 512 bytes / 512 bytes
7 p0 e7 M6 _+ J3 t; A# ~I/O size (minimum/optimal): 512 bytes / 512 bytes6 P g# B x$ a
如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。% ?: t' f0 w1 S' ~7 l
7 ]/ B% |/ S* t+ M% W; S
[root@kvm4 ~]# growpart /dev/vda 3
! Y; R7 l) _( lNOCHANGE: partition 3 is size 136572895. it cannot be grown$ W1 z0 T5 @6 S8 z" f
vda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3
9 y D! Q; F- p" ?+ M Z) c) C如下:3 r! b4 }8 r% p; f5 c( P
+ O/ s; I& ?* R. N[root@kvm4 ~]# xfs_growfs /dev/vda3
/ d3 r4 p1 A H# _/ |8 x7 Tmeta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks1 R: ?, ^, J S+ ?! O" e2 K$ I
= sectsz=512 attr=2, projid32bit=1* x* N3 V# `' T# F4 ^, {8 w
= crc=1 finobt=0 spinodes=0! |0 U. r9 K8 Q( ]8 ~1 e! T
data = bsize=4096 blocks=11828736, imaxpct=25
0 e, m0 s# P+ Z5 `= sunit=0 swidth=0 blks
) ?1 |, _! Z: @1 I$ c7 F- h9 inaming =version 2 bsize=4096 ascii-ci=0 ftype=1& v9 t, x5 t7 P) b, A) `
log =internal bsize=4096 blocks=5775, version=2
2 |& _6 v5 x" e% O. n2 P6 ~/ X' @= sectsz=512 sunit=0 blks, lazy-count=1
0 K- B% F; @+ Crealtime =none extsz=4096 blocks=0, rtextents=0& ]) p$ |# o! ]8 d0 e) w
data blocks changed from 11828736 to 170716117 Y4 N1 N% G3 }- y# O0 ?3 t {' `
再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下
. V2 ^4 Z @' Y! E' `! G% x I7 u# k O9 e
[root@kvm4 ~]# df -h4 @+ v) \2 b$ e. ^, I1 l
Filesystem Size Used Avail Use% Mounted on, ]' C: a& l5 s# q( c4 L4 d
devtmpfs 1.9G 0 1.9G 0% /dev
$ }' ^7 W6 W2 J* o8 B! h1 L- |tmpfs 1.9G 0 1.9G 0% /dev/shm# b* E% I& s+ {7 F( M6 U. K9 U; k
tmpfs 1.9G 8.5M 1.9G 1% /run
; w- m& S1 K; S2 S8 \( \tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
. J; I, {6 O& p, A; ^( @9 t/dev/vda3 66G 1.4G 64G 3% // H7 C: |5 b- W( [. m& W
/dev/vda1 1014M 142M 873M 14% /boot5 M5 O/ k$ p L) v8 e1 A+ q
tmpfs 379M 0 379M 0% /run/user/0
. s" R9 C9 l; j8 y至此,整个扩容操作已经完成了。3 N9 s' ?; I& v
) ~3 ]7 o/ V6 o) ~& M8 V c
此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。
& i/ T7 L, l8 e2 }& k3 _# X' p
9 |5 Q N$ k" M3 a如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区
: U& S! v' X( }. o; ~- x$ ^1 i, W- g
这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。
* }7 a3 a1 r* u0 c+ a2 B( P但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown4 K8 F. h3 V8 N
5 ^1 N- p" @: U) B3 @& Y
[root@kvm1 ~]# fdisk -l% _! C! b- E a& Q
9 b7 j* [; m; @! m
Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors; u/ w, r0 C2 d0 s; y! g$ H2 h' N
Units = sectors of 1 * 512 = 512 bytes; E L: O" k9 e% |' Q
Sector size (logical/physical): 512 bytes / 512 bytes+ Z2 e3 M$ l/ u7 ]
I/O size (minimum/optimal): 512 bytes / 512 bytes
3 \( L) K4 H* @3 R; K0 Q yDisk label type: dos
/ V6 `: Y- k8 {! UDisk identifier: 0x000ac5a2
/ t; P5 S/ h& w: r/ f- j; @: R4 }
0 a% l9 k7 I3 @% E8 y- r8 z+ fDevice Boot Start End Blocks Id System. X$ M& _) o }5 h, ^( j: s
/dev/vda1 * 2048 2099199 1048576 83 Linux
" k# A' _! B5 Y- l1 F/dev/vda2 2099200 1044367359 521134080 83 Linux+ {$ M6 N" B: T; F, E
/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris! p/ |+ K0 @& i0 [4 _9 k s
[root@kvm1 ~]#
4 ]7 y% k+ E; @0 L& o[root@kvm1 ~]#
( ]$ N. e! y8 d2 H5 O[root@kvm1 ~]# df -h) u# [+ G3 ]7 Q+ G5 @
Filesystem Size Used Avail Use% Mounted on( K2 d" ]* {8 K: n, ~
devtmpfs 909M 0 909M 0% /dev
# z" V3 d3 a* R. ^' ptmpfs 919M 0 919M 0% /dev/shm6 q9 E; R8 A' H; L
tmpfs 919M 8.6M 911M 1% /run# c2 W7 G- b9 `+ Z/ n
tmpfs 919M 0 919M 0% /sys/fs/cgroup
+ @4 c. I* A$ j5 u$ v- A% @3 m/dev/vda2 497G 1.3G 496G 1% /
$ U# T% A4 ]) o+ G+ p- E8 F" S/dev/vda1 1014M 142M 873M 14% /boot) {3 E6 M7 A7 [& B
tmpfs 184M 0 184M 0% /run/user/0
# u$ V' h* r( n0 o$ S7 f6 p如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。 |
|