|
|
楼主 |
发表于 2022-4-11 17:33:21
|
显示全部楼层
以使用如下命令+ b5 t: h! N# W" j2 W% ~% ?
; t9 k' S6 P3 Tqemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2; T( t! L/ @; ^0 I* F) U* D7 r
磁盘镜像如果有快照,无法进行扩容
% u7 }# o* U- L
! E& X; R* E( d' J! `再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动+ a' c5 Y* B A8 E: D
$ C4 ?7 z$ R% m6 |( k1 y
[root@cos7 ~]# virsh list --all
: [2 P- w! @% G/ _Id Name State
! _1 w$ U/ O# f$ F8 g$ \ F. q. e----------------------------------------------------
: i1 q5 @. S& q4 ~6 C) z# g4 kvm4 running! t- @( n3 h7 i |/ I
- kvm1 shut off
0 O2 I" ]! @, X1 C7 p1 x- kvm2 shut off
% y, q- N1 f4 ]8 `7 p/ V. @# V- kvm3 shut off
* R5 G0 x( i: K0 v- kvm5 shut off" u' A( g; e9 v% j
- kvm6 shut off* l% P9 h: F4 w8 I9 O7 |
登录kvm4,查看虚拟机磁盘状态,如下4 \3 f8 c7 d. Z. p% e
8 q# o4 L# z% l* ?. o[root@kvm4 ~]# fdisk -l
1 U3 i- ] m2 e- V2 ?
5 @7 X4 ?, Z, `% {, r4 TDisk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors: k8 [+ N% \, {( C& Z" f/ b; o
Units = sectors of 1 * 512 = 512 bytes
: |! W7 ]1 X4 A9 `7 s4 d! V+ y" hSector size (logical/physical): 512 bytes / 512 bytes
3 Q1 ?6 E( x9 s- K7 ]2 }6 B, jI/O size (minimum/optimal): 512 bytes / 512 bytes
8 H5 l4 G# F# k* z0 h( z" f# U- X9 jDisk label type: dos
7 R6 K4 G0 ]& R: p6 G" ~2 ZDisk identifier: 0x000b9417# u% D7 M& Z4 ^' a
6 }7 n. @, ^6 m/ _! y
Device Boot Start End Blocks Id System
3 {! ?0 K# M3 q/dev/vda1 * 2048 2099199 1048576 83 Linux
1 A; J% y# }- T+ e+ i9 h) `/ _8 L/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris% w4 x1 G: l8 }# Q2 `9 ~
/dev/vda3 10227712 104857599 47314944 83 Linux
1 S0 a' M7 O) h: T Y4 W) `3 t[root@kvm4 ~]#0 s7 `+ G# v2 T8 h2 C. o
[root@kvm4 ~]#
, q, Y9 h4 r$ x& {, F2 x! X4 y% {[root@kvm4 ~]#
6 u7 n, o* `" Y# I[root@kvm4 ~]# df -h
0 P+ W4 X. q6 H$ e. v, Q& LFilesystem Size Used Avail Use% Mounted on
. T0 \/ d. N* ndevtmpfs 1.9G 0 1.9G 0% /dev9 F" w2 A( E- {+ @
tmpfs 1.9G 0 1.9G 0% /dev/shm {3 o+ r( e( u; `' x9 l; ~4 C
tmpfs 1.9G 8.5M 1.9G 1% /run; V/ \# v8 }( g: ~, f/ i
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup) k# K @4 A' u8 b+ U1 W- ^
/dev/vda3 46G 1.3G 44G 3% /
4 I/ Q$ Y# z0 M9 o3 c# S1 G/dev/vda1 1014M 142M 873M 14% /boot
. ^, U E# _5 K6 V7 Utmpfs 379M 0 379M 0% /run/user/0
- C) C* e9 a0 l" d% f( A从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。5 Y e( |" x" ~! X7 b6 I; l
在宿主机上确认kvm4的磁盘镜像路径,如下:
3 U& x( f- ? B* M9 B2 e# M
! c5 a' z" L$ g: R4 {: N1 ][root@cos7 ~]# virsh domblklist kvm49 R, @" i' z H4 R! D
Target Source
( a1 J. @2 b+ r9 z* F------------------------------------------------" u" A; h* D* t/ |0 u
vda /var/lib/libvirt/images/kvm4.qcow2
, d# W+ g+ r& g8 x7 _; d1 yhda -# }2 ~6 O: b& }0 x, I* i6 s
可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小
2 Y+ Z- j" h6 [( I! j- D% n9 y0 W M7 p* o3 _
[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
# U$ X' B/ E2 l. `$ r+ \0 @image: /var/lib/libvirt/images/kvm4.qcow2" t8 \6 E$ \6 Q; B, }3 K& @/ N
file format: qcow2
6 K' g/ P9 M' J. n+ F8 lvirtual size: 50G (53687091200 bytes)
& k) V: s5 E& a) m6 n4 f# mdisk size: 1.5G
5 E9 N! ]& m( A- Ccluster_size: 65536$ a# u+ K( f# _6 a2 M2 D( R9 l' {
Format specific information:
2 t2 u+ s; N5 |, [ l: Dcompat: 1.1
" s4 j+ G/ I6 @lazy refcounts: true
+ e+ U( Y5 q* r如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。( Y C* i5 G1 V2 @) t: B6 U" r
现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。
1 A1 [% `" s) g5 z; p停止虚拟机后,执行如下命令
* R# F( n/ P+ |# Q
* A$ T. c) B& ~' A[root@cos7 ~]# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G
, l& a1 q( ], q: f7 LImage resized.6 b. D; D8 K) X3 ~: w
增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G; `+ T7 N! {- A
+ Y. ^4 A$ l( I8 V/ X
[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
4 `: v9 n- Z8 O" {6 Simage: /var/lib/libvirt/images/kvm4.qcow2
5 f) k( E3 {& N/ V' P( a" u/ nfile format: qcow2& P9 N* I0 W: B" U' E
virtual size: 70G (75161927680 bytes)
8 b& ~( c% u- Y v* x3 Xdisk size: 2.5G& @7 c w. P: e1 j; \
cluster_size: 655366 t" A: S K, e4 t
Format specific information:5 K5 F+ E% F, Q& k, {$ b* k
compat: 1.1; p/ S$ X; ~) k( Y, u" @$ o0 S
lazy refcounts: true
7 X4 D1 i6 L8 z" W& e) {: O磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G9 J, l& d& m; |/ \' H7 n
5 P* O" ` Q# |1 N; ] G$ i
[root@kvm4 ~]# fdisk -l0 {# z4 C0 n+ R6 @# v. v) I
( ~! y9 U# w( d6 i$ S6 QDisk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors+ w0 m/ l q1 R+ T$ u6 d
Units = sectors of 1 * 512 = 512 bytes% I6 t. m' h( |6 M; p& }
Sector size (logical/physical): 512 bytes / 512 bytes
9 P9 N$ d% i+ RI/O size (minimum/optimal): 512 bytes / 512 bytes% v8 o* Y4 J* w L6 }( ~
Disk label type: dos$ o4 w; k- {" t; {5 g- Q6 _
Disk identifier: 0x000b9417+ s0 B( y$ i! B9 j6 z
8 ^7 V4 v$ O% x8 w4 e" p
Device Boot Start End Blocks Id System3 g) M [/ a; a8 `
/dev/vda1 * 2048 2099199 1048576 83 Linux7 h: i9 A) G; S6 |
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris. G6 y! B6 ?6 V" ~ k" W' H
/dev/vda3 10227712 104857599 47314944 83 Linux% G8 y W( }0 ^! l* _
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。) H3 }& E8 R0 [ ^# l- U; r3 f
; @8 A7 o/ o0 L[root@kvm4 ~]# fdisk -lu /dev/vda3
/ b6 v/ @- e" q" M9 X# U
0 x; ~# \$ B2 @8 ~+ S* F1 LDisk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors# L: o# p' L2 s
Units = sectors of 1 * 512 = 512 bytes0 V% a1 B5 V) l7 ]1 F$ e8 {
Sector size (logical/physical): 512 bytes / 512 bytes+ [8 G8 t; R. @* v+ z! @9 R
I/O size (minimum/optimal): 512 bytes / 512 bytes2 L5 G- K9 Z* O+ \7 g
* k# Q( M* E3 H' G& p9 E
[root@kvm4 ~]#3 ]8 [$ H$ g/ z
[root@kvm4 ~]#
# T, F2 ~+ T% h3 L; p: T! B[root@kvm4 ~]#1 A% K6 D# i5 E4 S
[root@kvm4 ~]# df -h
$ M) s' }+ P% X Q$ |+ L6 RFilesystem Size Used Avail Use% Mounted on
/ {6 x. `" _1 P* ]) D+ J" bdevtmpfs 1.9G 0 1.9G 0% /dev
; G/ e( A( b, o: E6 R& s* Wtmpfs 1.9G 0 1.9G 0% /dev/shm% r9 P, ~% N0 k$ V- ?7 u
tmpfs 1.9G 8.5M 1.9G 1% /run
1 s& l) D# }3 p+ }5 ~% E& Ftmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
* V3 b# Y/ Z8 p( p" [7 H/dev/vda3 46G 1.3G 44G 3% /
. c- [# s3 E' R6 _+ v& [/dev/vda1 1014M 142M 873M 14% /boot- W2 d( t( i# y; S1 @
tmpfs 379M 0 379M 0% /run/user/02 M# j# N1 V2 D: G: V
我们现在的目标就是扩容根分区和文件系统。
: |2 D+ p3 p( m7 }1 Z; _+ f此处可以参考阿里云的文档进行扩容操作,链接如下:: H$ Z& r! i4 @/ j( S G w
https://help.aliyun.com/document ... scm=20140722.S_help! }" {; [) d% v
7 e; [, ~: B \9 h3 H) h我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。! p/ h7 \- C0 ~$ p! T* `9 \6 p
/ d3 d/ U; v# M. a0 e首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下
5 w& m( {) k: G3 Z6 J. |5 k1 Y8 [
yum install -y cloud-utils-growpart
: l. c: d/ g8 H3 O安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格( C7 w7 [( ]/ d" C; W0 h/ m5 R
1 `# a: @3 T* b; Y* f' W[root@kvm4 ~]# growpart /dev/vda 3
" v ^0 J0 X% E4 b1 L8 u$ ZCHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
3 s4 T4 x0 l: P) i4 H2 T: u可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G
- Y7 w. x, B9 a4 Z0 ^) @* D3 g5 ~& }) E% @0 r( d f4 W
[root@kvm4 ~]# fdisk -lu /dev/vda3
& D) O" ^% _9 H% I. j3 D
# t+ O/ M( Z( ]8 ?& SDisk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors0 }8 ^, S Q5 X/ c ~
Units = sectors of 1 * 512 = 512 bytes
" L; s+ l, _4 USector size (logical/physical): 512 bytes / 512 bytes: h2 s9 m# U% {: g j
I/O size (minimum/optimal): 512 bytes / 512 bytes5 l3 A v& e% L# k! [" e1 k
如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。5 C1 T* l! w1 B8 F7 e
/ U1 [6 x& }$ f- G; Q. D
[root@kvm4 ~]# growpart /dev/vda 3" h+ Z0 P. O$ X' s9 a5 p
NOCHANGE: partition 3 is size 136572895. it cannot be grown
; s. j0 Y9 d9 {1 {vda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3: N0 X ~0 C/ e
如下:
$ F s9 Y- ]1 Q7 I* Q
" O3 @8 C* I# V8 {* r[root@kvm4 ~]# xfs_growfs /dev/vda3
7 N! n3 q& N& S' F& E! tmeta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks
t" j+ Q* g( W" n= sectsz=512 attr=2, projid32bit=1
b* {/ A( o% \/ p1 t= crc=1 finobt=0 spinodes=0
6 l% H ?8 V) ]$ R6 o1 Kdata = bsize=4096 blocks=11828736, imaxpct=25$ q# k& l" L/ q' L( N
= sunit=0 swidth=0 blks8 K( `7 o9 Z) _7 |/ h
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
. l7 ~/ e) p4 r2 Plog =internal bsize=4096 blocks=5775, version=28 G9 {( K" H* \7 J: s- ^
= sectsz=512 sunit=0 blks, lazy-count=14 \5 m5 a3 U U2 }
realtime =none extsz=4096 blocks=0, rtextents=0, R' |/ i% F' z _7 J9 z
data blocks changed from 11828736 to 17071611
. g" y7 }+ ]7 G: Q" v# E% ?, f再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下
' r# z% s( [+ G# ^
; m/ U. f6 y" J7 c$ F[root@kvm4 ~]# df -h3 O6 V9 \. e+ @2 | S; l* m- @
Filesystem Size Used Avail Use% Mounted on
" @) ^! }- W' u" r i2 ddevtmpfs 1.9G 0 1.9G 0% /dev. r& M; s* S9 h3 w! U7 h
tmpfs 1.9G 0 1.9G 0% /dev/shm" e2 l- H: Q: q( ?) a- u
tmpfs 1.9G 8.5M 1.9G 1% /run4 p! S1 V/ ?$ ~5 w6 [# Q
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup6 \. m5 [; G& l$ T# {
/dev/vda3 66G 1.4G 64G 3% /1 ^# v" R: ^! b" O0 I
/dev/vda1 1014M 142M 873M 14% /boot ]; G: i. z+ p+ j8 o+ ~6 q8 b& r
tmpfs 379M 0 379M 0% /run/user/0# u' B- P3 m& P1 Q- }) t
至此,整个扩容操作已经完成了。
& e0 r+ Q3 j1 C& a9 g, F, Q H+ X0 v6 U3 _- H) r
此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。
& }5 |3 ^6 _, p) r1 u7 P/ m2 J2 F }% D
/ r ]) N' j, m$ b- `% H, D: Y如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区
' V( w) C Q) {9 E$ Y
2 N* {6 Y* S7 |( x7 Y这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。( @/ P) t# a0 C/ G9 P
但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown
$ H" b& z8 l0 b) `$ T8 |( R1 Z. V% S; j3 G; l3 p
[root@kvm1 ~]# fdisk -l+ c/ k: M: u) o* p7 C5 u& u
) l/ O, q- W, ~% ]6 iDisk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors E2 l, [, }: q$ H) ^% w
Units = sectors of 1 * 512 = 512 bytes
+ C9 j! u8 C* J6 bSector size (logical/physical): 512 bytes / 512 bytes
9 A# X4 s: w+ M0 L3 wI/O size (minimum/optimal): 512 bytes / 512 bytes( A: E! Y L7 G# W: u; C' d. P
Disk label type: dos# b" ~# A+ ^$ y
Disk identifier: 0x000ac5a29 c2 V3 ?. ]5 }7 I; ]1 r- h
8 N+ ~2 S( @: T& C* XDevice Boot Start End Blocks Id System
. {$ k: z9 r z4 H3 e* {4 x/dev/vda1 * 2048 2099199 1048576 83 Linux: Z6 ]1 t% d4 Y4 h" R% T r
/dev/vda2 2099200 1044367359 521134080 83 Linux, Z. Z: w8 o* }6 B' P' u
/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris( N r/ I. {0 Z: ] d
[root@kvm1 ~]#
: l+ u7 ~/ Y9 K8 f& D4 {[root@kvm1 ~]#
4 f0 z' U9 r5 G[root@kvm1 ~]# df -h
: l8 u; b5 w% \' t! X9 F4 GFilesystem Size Used Avail Use% Mounted on
5 s, W9 ~+ U0 K! S" o3 i( l+ `devtmpfs 909M 0 909M 0% /dev
: \" d+ Y" M' x( H, v* ~& Ztmpfs 919M 0 919M 0% /dev/shm
2 M$ r. ?- F# F* f) i- Y' e1 Otmpfs 919M 8.6M 911M 1% /run7 l4 r% d0 e% x; X+ O8 N& Y. j! s4 H
tmpfs 919M 0 919M 0% /sys/fs/cgroup- Z% U9 n. y" g# r! f. w& j. h, x
/dev/vda2 497G 1.3G 496G 1% /0 z+ C8 l* U1 K% ]4 U
/dev/vda1 1014M 142M 873M 14% /boot
4 G( ]/ E! V4 ]tmpfs 184M 0 184M 0% /run/user/0' s) o1 x) G) ?. r) F
如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。 |
|