|
|
楼主 |
发表于 2022-4-11 17:33:21
|
显示全部楼层
以使用如下命令
7 J7 m1 \ ?5 D* g2 m
2 H4 n5 X+ }3 Gqemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2
( p1 g) E: x1 r2 a3 {磁盘镜像如果有快照,无法进行扩容: s- t& F! E8 d. }) _
# ^/ f1 n0 x9 n# }% P再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动
* F% W8 R! A& n0 T0 ~, b0 l9 `* c6 T6 B) z B9 {
[root@cos7 ~]# virsh list --all
# P# ^: I( C9 G) eId Name State
# ^6 r& Z% g) O1 ?; V* {9 }----------------------------------------------------
% U8 d1 @* T$ \5 H# r7 |+ b4 kvm4 running
1 g6 i9 n7 Z4 E& `+ S0 ^- kvm1 shut off
# `. K' H3 z; |9 I b9 y2 n% {8 A- kvm2 shut off8 a0 n# O1 P# n8 {) Z$ J" b" ~
- kvm3 shut off, c ~, X: Q" D
- kvm5 shut off1 f4 I' S0 v" Z; d$ T* q. d3 Q
- kvm6 shut off1 j" [8 S ~8 \, L: D( B% d
登录kvm4,查看虚拟机磁盘状态,如下& H4 K: |2 v0 w) y- [$ Q
7 ~. F5 E6 Q. w) X[root@kvm4 ~]# fdisk -l
- |( @* {% R8 s5 ]
) L3 o( A6 d, P' Y$ R2 |Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors3 p1 |- O7 `( `$ j0 k$ z8 d4 @7 u
Units = sectors of 1 * 512 = 512 bytes
7 O7 b% \$ F3 R: h7 ?" o: {, e% OSector size (logical/physical): 512 bytes / 512 bytes
2 s8 E1 X, V8 E" mI/O size (minimum/optimal): 512 bytes / 512 bytes
" ^6 ^, w; w) J, @0 Z/ FDisk label type: dos
, x4 F8 C7 ~3 DDisk identifier: 0x000b94175 x* g [, T. i+ X- `& Y6 D
0 ]7 ]. ^9 X H; x4 c/ RDevice Boot Start End Blocks Id System2 Z; P7 J4 E- @ I" j8 P
/dev/vda1 * 2048 2099199 1048576 83 Linux7 T' `8 Y' t; c
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris* x# x# v" z3 @/ v1 Y4 N
/dev/vda3 10227712 104857599 47314944 83 Linux
X- C* T+ B! p! o3 V0 L; u[root@kvm4 ~]#. A9 k& v7 v3 t% u- E
[root@kvm4 ~]#/ U/ r4 e4 j$ G1 i
[root@kvm4 ~]## E6 M+ i' _# F$ L! x; d3 z% f
[root@kvm4 ~]# df -h8 V# \* p3 S: m+ T
Filesystem Size Used Avail Use% Mounted on" u/ M# N0 k# T) m4 U, U
devtmpfs 1.9G 0 1.9G 0% /dev* Y* [+ w! k4 P. c& u* i' d- G M! P
tmpfs 1.9G 0 1.9G 0% /dev/shm6 h5 ^8 q: c* q8 j. O0 I
tmpfs 1.9G 8.5M 1.9G 1% /run6 |- u ?- ~1 r, k- J4 ~# o
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
; V5 Q3 F1 }4 Z- C7 H/dev/vda3 46G 1.3G 44G 3% /
! N$ s( p! e' E& w8 F/dev/vda1 1014M 142M 873M 14% /boot; _5 O% c+ h: h( T4 O! A
tmpfs 379M 0 379M 0% /run/user/0
! X, \3 w; F3 m$ ?# g从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。! R2 _( w" F2 z& _* {
在宿主机上确认kvm4的磁盘镜像路径,如下:
5 y7 Q4 i, x! n) s( N3 \2 B2 Z% q H+ C1 i {" r
[root@cos7 ~]# virsh domblklist kvm4" r4 C/ A$ m7 [0 V( [! k
Target Source
( ]6 [, k. y( G; q------------------------------------------------
* V% I! E' X0 R3 M0 v2 Gvda /var/lib/libvirt/images/kvm4.qcow2
5 C4 y8 G$ `0 h* e5 Shda -: i- T' Z$ C; w5 `& H, z, p3 D
可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小2 g' l) ^1 L/ o* }
& G0 i$ p6 ?* x" Q2 j. r[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
1 j7 ]9 y! Q5 X- s( v0 {1 Q- l2 S; Aimage: /var/lib/libvirt/images/kvm4.qcow2
. y4 G/ n. e* s9 [: ofile format: qcow2
6 R1 M1 N- ]+ H- t& t+ Zvirtual size: 50G (53687091200 bytes)
8 b# e T G* W4 Cdisk size: 1.5G# U, `/ E3 W5 B/ S3 J4 T: O
cluster_size: 65536
# p5 d n8 T( R, j- k8 pFormat specific information:
* F" V5 E! ~4 V+ N# dcompat: 1.1
% v: I' }; t k5 ~lazy refcounts: true
3 m. W3 ?* p3 F% [9 D& C6 o1 t) \如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。
. [; U/ r. e: h0 {& ?, g现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。% j+ W$ W' B+ x3 C! Q3 Q
停止虚拟机后,执行如下命令$ z# D$ ~5 _6 ~
# B+ j$ Q. P: y1 R[root@cos7 ~]# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G; {2 A' [! ~8 r
Image resized.: h! J% S3 f# {9 f* ]: u
增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G1 Y3 q$ [7 o2 T# K5 r
) `% C8 J* C1 [! O5 G
[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2) T5 f' ~) \% v+ c2 H& ?
image: /var/lib/libvirt/images/kvm4.qcow2
+ q) a) b- y/ f% w7 X0 vfile format: qcow2
; v0 t7 ^3 f$ A/ D' X( Qvirtual size: 70G (75161927680 bytes)8 w7 x V& E) ?) u) u7 J% N9 d
disk size: 2.5G
+ @* i2 F6 I) D3 Pcluster_size: 65536* m5 J, E o0 f! M5 j3 W
Format specific information:9 ?+ ]' B- m& L# _; S' W0 |
compat: 1.1
) R& j2 M4 Y0 u3 \3 Q! h+ elazy refcounts: true
7 R9 j0 |4 @$ S磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G0 {- K; A' K6 O, }( Y# R% ^
3 D- s! h! L/ o c5 T
[root@kvm4 ~]# fdisk -l
( s" t; Q2 O+ C& |/ N4 k 3 o2 S. R$ q% q1 |- a) F
Disk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors
6 j. c( u1 g. ` sUnits = sectors of 1 * 512 = 512 bytes7 j: A. Y+ b, f6 c& S' L
Sector size (logical/physical): 512 bytes / 512 bytes
; ?, C! t' U; i5 A; E; v! GI/O size (minimum/optimal): 512 bytes / 512 bytes
! G4 j$ \; Z' v. t; X: y, b' TDisk label type: dos8 }% E! c1 D6 e! R& Z
Disk identifier: 0x000b94175 {1 ~* C0 } k6 l5 a+ T$ h
- J" G- W/ C: }2 ~
Device Boot Start End Blocks Id System
3 m6 ~: p+ T& f5 t: J9 U/dev/vda1 * 2048 2099199 1048576 83 Linux
8 P! j! L* u5 Q2 q+ e- U0 x/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris
7 j5 U: r; \( Y$ j/dev/vda3 10227712 104857599 47314944 83 Linux6 l/ [% k( ^$ h5 }- v C2 l$ f
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。7 J7 c. N& x; x* [- O
1 l2 x& k" P5 @8 U
[root@kvm4 ~]# fdisk -lu /dev/vda3
1 T# V: a+ n4 U$ ]& ?, @# H9 v % w+ z* K* e) H. J
Disk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors: n! m# N& w" H" @" Q" T
Units = sectors of 1 * 512 = 512 bytes
5 s( b- L9 s8 z, I& O" DSector size (logical/physical): 512 bytes / 512 bytes, D/ A. m& M8 j1 E) s$ ~1 Y
I/O size (minimum/optimal): 512 bytes / 512 bytes/ r: Q( U. n4 [2 {9 I, h9 v: f u
6 w# n9 ^' }/ y- q. ^; |/ T6 k, u! h
[root@kvm4 ~]#
: j9 y4 W; T2 Z8 l! B* V[root@kvm4 ~]# E3 E0 r h& b* O- }) u" n) Q
[root@kvm4 ~]#
' Q! |: c1 A- c4 F. `4 }[root@kvm4 ~]# df -h' E# I5 h! m6 S$ l9 [' l
Filesystem Size Used Avail Use% Mounted on
# l/ h; Y" b" }+ q6 Y! }* Z i5 adevtmpfs 1.9G 0 1.9G 0% /dev7 [! F, W$ x( e; E& a# A
tmpfs 1.9G 0 1.9G 0% /dev/shm" a' E( g( ?- U, k
tmpfs 1.9G 8.5M 1.9G 1% /run# ]# T) z6 x- E& d
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup# B7 x' C* {8 S0 ?: s: s9 U
/dev/vda3 46G 1.3G 44G 3% / |; K# a8 M# _1 d& L! d7 L: g$ V
/dev/vda1 1014M 142M 873M 14% /boot
9 O: D9 A2 b* \' Qtmpfs 379M 0 379M 0% /run/user/0. e, i% _) L6 J. ]6 O
我们现在的目标就是扩容根分区和文件系统。; g# i1 |3 Z, {+ Y' A
此处可以参考阿里云的文档进行扩容操作,链接如下:+ E1 F; D* `9 `$ e3 z' f
https://help.aliyun.com/document ... scm=20140722.S_help, M* i/ V2 s6 u, |$ V$ I
* t" a l8 o. y) F" t
我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。
1 h' [$ L: U# y. {% J& c7 T. }4 D- D% ?# `( w
首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下
% N7 x% U- p! B& f; R) X, ~
% x$ u: q% J6 } V1 ?; nyum install -y cloud-utils-growpart
; H( U* i3 \/ C3 O" f安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格) {9 H+ V Y" m n
9 J9 O6 X; d: b
[root@kvm4 ~]# growpart /dev/vda 3) e: S, S# \1 \1 ]8 @6 u* s9 d8 a
CHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
# m, W, a" C. {可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G+ m* ?6 y; ]+ U4 K
! Q" G3 M5 N) X3 ]
[root@kvm4 ~]# fdisk -lu /dev/vda3+ h+ I' H+ o' z, v3 [. m
& j/ V1 l/ v1 A; ^/ C' u ^
Disk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors& O- i0 C* }; p- V
Units = sectors of 1 * 512 = 512 bytes+ d4 D) s9 \/ b0 g' Q) }' R8 L5 k n6 _
Sector size (logical/physical): 512 bytes / 512 bytes& r2 F+ @( b/ \8 F* ~) e# m1 g, z
I/O size (minimum/optimal): 512 bytes / 512 bytes9 l* r+ e2 n m& O4 y2 i) w
如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。6 f B" J; V" `2 t) ^- ]
. r" \% d/ `5 p% [% _% E
[root@kvm4 ~]# growpart /dev/vda 3
0 q" F" E# C D2 D* D; c4 aNOCHANGE: partition 3 is size 136572895. it cannot be grown
; h& f' t! ^& c- K5 fvda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3
, P3 O1 m6 g- G" i6 a7 ]如下:
& g$ }% p/ a$ x; p' G6 [" {" r, t9 p; |8 ]: v0 q, f( B) _' f
[root@kvm4 ~]# xfs_growfs /dev/vda32 F( N8 ~, A' ~; ]( w
meta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks0 ^0 T0 W9 U# ]. Q* Y9 k( b) P$ s( x
= sectsz=512 attr=2, projid32bit=15 s% g! U3 s1 i& V4 t4 D9 f! f
= crc=1 finobt=0 spinodes=07 V7 o# o8 K6 C( l* p: P0 }
data = bsize=4096 blocks=11828736, imaxpct=25
) p% L$ [; `1 `- s; y1 i" T= sunit=0 swidth=0 blks
# m2 \) R' G# G8 C4 Xnaming =version 2 bsize=4096 ascii-ci=0 ftype=1
( O: i6 T1 h$ l. C( Ilog =internal bsize=4096 blocks=5775, version=2
/ F/ a6 z, k e7 Y8 t1 X7 D3 `4 c= sectsz=512 sunit=0 blks, lazy-count=1
5 O/ X w" X' g6 {. c/ Urealtime =none extsz=4096 blocks=0, rtextents=0! _" {$ B ?+ x+ H$ g8 z
data blocks changed from 11828736 to 17071611
. q2 t2 {. U F6 G再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下9 O+ | r. i% f9 ?
' m; o" y5 f: V9 ]7 F- ?1 B' L[root@kvm4 ~]# df -h8 ?, G N# \! S' L0 ?
Filesystem Size Used Avail Use% Mounted on
6 O& _. [3 z( ]$ Zdevtmpfs 1.9G 0 1.9G 0% /dev
" T+ x4 i8 W/ c5 k' Ptmpfs 1.9G 0 1.9G 0% /dev/shm
/ P% m- E$ K: H; y/ Xtmpfs 1.9G 8.5M 1.9G 1% /run
& j, |, G" z4 U( S F# m7 ltmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
& T" o" u4 e, l- l$ r# f/dev/vda3 66G 1.4G 64G 3% /# w) e8 @ H0 x( ?' F! d) ]* N
/dev/vda1 1014M 142M 873M 14% /boot
U8 C! g9 x) W( Z, {tmpfs 379M 0 379M 0% /run/user/07 [) N' p# S) n) O
至此,整个扩容操作已经完成了。
% c" g, X9 z1 N% S
# R5 ]9 f4 [4 v+ O8 L# X此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。
& Q5 V, B; k. v# X# ?3 q) z8 B3 T7 D
如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区* z9 l5 s- j# }3 `' e$ N
! x( B# X* Q5 ^* d0 o/ }
这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。
0 F& n% [/ n8 X3 a, N& L但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown
+ @) a% p, y8 @6 I" Z7 o; i g t; ~ ]
[root@kvm1 ~]# fdisk -l5 g# r. n! c& Y! W3 M7 i, t; Y
8 b! J( E2 _" p, N# S! x' _
Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors
2 S# x, N ^( Y4 o* D0 X( {Units = sectors of 1 * 512 = 512 bytes2 }9 J( {( F! p) @; C! j0 q& V( S
Sector size (logical/physical): 512 bytes / 512 bytes
7 E- b0 p6 R; m$ z1 e. KI/O size (minimum/optimal): 512 bytes / 512 bytes/ M& ]2 N! G7 g" x, k( \" K
Disk label type: dos. n. y+ _' @$ p5 d, x9 g" H
Disk identifier: 0x000ac5a2
# O4 k# N1 v" }! P0 w+ |
9 N/ Q5 E, U; V& y+ {$ B3 V3 v- UDevice Boot Start End Blocks Id System! U! ^. {+ f- Y4 O6 a/ z, r, e/ [9 @
/dev/vda1 * 2048 2099199 1048576 83 Linux, d" t3 {9 g* D! T) c+ q
/dev/vda2 2099200 1044367359 521134080 83 Linux* T# `4 r2 e5 P: L- Y
/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris
f0 ?7 y0 J3 f* T" w D" N: q[root@kvm1 ~]#. d5 D! m: e5 f$ K6 H) j$ g; R
[root@kvm1 ~]#. P) t+ e4 E: P8 \
[root@kvm1 ~]# df -h! m/ K" |7 Y2 u1 m
Filesystem Size Used Avail Use% Mounted on! h9 `+ Q H# b1 K4 d
devtmpfs 909M 0 909M 0% /dev" r5 T# j$ i& V! \; Y0 k! z1 j/ e! k
tmpfs 919M 0 919M 0% /dev/shm' k$ N. F5 x, U! B1 n6 w& d
tmpfs 919M 8.6M 911M 1% /run
& z {- S0 |3 w" mtmpfs 919M 0 919M 0% /sys/fs/cgroup
( Y1 i1 ]" v( y! b0 y/dev/vda2 497G 1.3G 496G 1% /# e6 k" u' `1 A1 G5 d; X
/dev/vda1 1014M 142M 873M 14% /boot
1 A, a5 x7 r7 e- D! o' L1 Otmpfs 184M 0 184M 0% /run/user/0
. G1 x& }% |, _9 A7 k( N. P6 Z如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。 |
|