- 积分
- 16844
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 2022-4-11 17:33:21
|
显示全部楼层
以使用如下命令
. K6 F$ _1 M1 u; Y
, t V* r3 l3 o j9 gqemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2) d$ s& I( N& Q0 {& H% ~$ ?% _
磁盘镜像如果有快照,无法进行扩容
/ t6 B# G& z3 w( X
S) _# n4 j- q" f* o, A; f再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动% x7 N9 g: G! w) E! t
' u/ \3 T" Q* t' z+ p6 h) f6 C
[root@cos7 ~]# virsh list --all
: I) w1 n" i, r7 Z2 h z; sId Name State6 v# \$ J$ y- B+ Q3 T% `6 ^& w* A
----------------------------------------------------; L! C) z' x9 E" W# J/ ]# ?. g- c
4 kvm4 running
2 T3 M( m; J+ P! X% s* l- kvm1 shut off2 Y! a& ]6 q* v- e; p+ ^7 G
- kvm2 shut off! K( U2 E" m5 e
- kvm3 shut off, ]! d' _( m; A$ F- I5 x1 z
- kvm5 shut off( p- s9 j# M; E3 J+ W
- kvm6 shut off
+ ]7 ~* A0 h' Z4 Z- W6 H/ o4 ~登录kvm4,查看虚拟机磁盘状态,如下
1 H+ c: I* v/ i& z
+ K8 W- B, P* _3 t- c5 ^[root@kvm4 ~]# fdisk -l6 l/ j5 n! F* I; s
" v) R* k5 I9 R9 \Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
+ S! S) @+ i# ^5 gUnits = sectors of 1 * 512 = 512 bytes+ y- }+ `# n9 c) W: O" h" h1 }: L
Sector size (logical/physical): 512 bytes / 512 bytes4 K5 m$ q6 L) k9 a9 B3 a3 @; k
I/O size (minimum/optimal): 512 bytes / 512 bytes
3 N- x/ [4 J$ z; yDisk label type: dos$ z, l3 z- R$ M- t' k
Disk identifier: 0x000b9417$ V' ` ^: U) z6 y! N! u; Q/ t
$ i( K k% p' ?9 _Device Boot Start End Blocks Id System
0 C! L. m! y* \" L9 R/dev/vda1 * 2048 2099199 1048576 83 Linux3 n# u u2 Y6 O% ~# X9 T
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris4 }" K3 B+ |) A: n7 z/ t! U6 E
/dev/vda3 10227712 104857599 47314944 83 Linux
; j! m+ g) c, G% x& e! ~5 h[root@kvm4 ~]#) X# J# T# s& [
[root@kvm4 ~]#; V; M( r# D& k' p$ X# O" J# \, c
[root@kvm4 ~]#* E# g# B2 x& P5 f
[root@kvm4 ~]# df -h
& c# i, A2 w# y }* ZFilesystem Size Used Avail Use% Mounted on+ P, U5 m- y: Z |3 r6 C8 g
devtmpfs 1.9G 0 1.9G 0% /dev& R. x3 o* H5 x$ I
tmpfs 1.9G 0 1.9G 0% /dev/shm
& q; t( R9 P) F6 ~( P0 {1 ]: @tmpfs 1.9G 8.5M 1.9G 1% /run
0 h1 k* Z& f ^$ Btmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup/ h" ?. E6 Z' K1 h; s" F
/dev/vda3 46G 1.3G 44G 3% /! v @) ^/ ?% Y
/dev/vda1 1014M 142M 873M 14% /boot
3 x0 v! L& F+ S) u: V! ?tmpfs 379M 0 379M 0% /run/user/0
; @. u! G H# G( d从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。. q, `- N* X$ p: P- v+ {% e8 [
在宿主机上确认kvm4的磁盘镜像路径,如下:
0 n( ?: H3 \, R: w* m, w% K& X2 W2 e, h+ h& x
[root@cos7 ~]# virsh domblklist kvm4
7 G) V5 B. q6 K$ S* z4 V0 sTarget Source
& c7 W6 V2 M# Q; F/ F------------------------------------------------# N- a- I+ Y* A
vda /var/lib/libvirt/images/kvm4.qcow2$ }" V% N W5 V. j+ H' F% c2 Y
hda -
; v, I3 }1 @" L2 P3 w' w可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小# u( X- o9 V2 A5 d, F& w+ j
; K( K3 d0 Y- d5 t+ p
[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2( A+ P2 N$ N( b% I Y+ c
image: /var/lib/libvirt/images/kvm4.qcow2# y1 p- y( T' P, H% c0 \4 ^
file format: qcow2
! a. G2 a' j! ^9 avirtual size: 50G (53687091200 bytes)* J2 p+ N1 y+ X0 U2 ~. ?( [1 C
disk size: 1.5G
" o7 h5 p* y* B; wcluster_size: 655366 b3 S7 V4 M2 ?. W, V* ~
Format specific information:
' W+ Z0 I5 T* O6 B# Rcompat: 1.1
' j& I: j) e2 T) U! I* ?2 i& Llazy refcounts: true
2 z2 l, u& f3 U6 u, j- \如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。
# @$ K1 A, L% U2 E# @现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。6 q# }# j+ W6 p) H, ]
停止虚拟机后,执行如下命令5 ~8 e) r9 P/ i7 [4 }5 I
1 Y. M( S1 M* g" \! O/ @
[root@cos7 ~]# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G- m' P3 {, z4 K; G! _0 [
Image resized.
0 S0 R* j8 @/ d3 y( O% y增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G7 S$ X& w w, l
/ Z; n' ~5 t. N. W' H9 D0 Z[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2/ S$ y% ~" B9 V" a9 o
image: /var/lib/libvirt/images/kvm4.qcow2& e8 O. a: o. p3 H4 e- k+ Z
file format: qcow2
5 H. f$ o# }: v1 ~virtual size: 70G (75161927680 bytes); ?! q$ W) C1 H0 R: G
disk size: 2.5G
3 ?; P# J; E9 p' f5 a9 Dcluster_size: 65536$ d$ o9 X5 E3 p3 B) n9 s
Format specific information:
, [, g6 m0 }* r8 [- K7 zcompat: 1.1
, D2 X! K4 l! s5 c; i+ Alazy refcounts: true
2 g5 }8 J, ]" ]1 ]! ]: K磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G
& `. [5 a2 _. O# x0 c# p
# \$ {3 n' r: j' S6 d6 z I. v7 M+ ][root@kvm4 ~]# fdisk -l, M9 E( I9 a H9 ~$ N
' L* Y5 C% d) h, L# I9 q" F' TDisk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors
$ m& T, o3 {- S h' jUnits = sectors of 1 * 512 = 512 bytes
6 X4 Y8 f% |+ eSector size (logical/physical): 512 bytes / 512 bytes1 S# J$ Y N, L0 e8 ^/ e
I/O size (minimum/optimal): 512 bytes / 512 bytes! w6 o( `; \1 K8 @ c
Disk label type: dos
( V7 G% P0 G$ z" lDisk identifier: 0x000b94174 N( c) A1 E3 \( W
! e; C2 }5 [, E3 Y. j) t! e* }
Device Boot Start End Blocks Id System
8 z, n) j: D9 u' l/dev/vda1 * 2048 2099199 1048576 83 Linux& D A. Q) M6 B Y8 i
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris7 r+ u4 X9 n7 j0 N @0 N7 v
/dev/vda3 10227712 104857599 47314944 83 Linux' E. _; i7 ]# S- D+ d
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。! m9 O1 ?- ]; z; P; b% z! T5 `2 x
; d+ M, J/ a2 Y- ]8 |0 j[root@kvm4 ~]# fdisk -lu /dev/vda3" C; Q! c7 v/ n8 c; w( r8 x
$ x" T6 k0 K) K4 z
Disk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors
+ X2 o# Y: L6 F- G) ^+ N4 b6 tUnits = sectors of 1 * 512 = 512 bytes$ L( Y% `0 o! m9 c
Sector size (logical/physical): 512 bytes / 512 bytes
* A. {" M: B# |- {I/O size (minimum/optimal): 512 bytes / 512 bytes
' x7 M7 B) z+ Q5 m
+ F c$ N# m3 c1 j4 w4 x[root@kvm4 ~]#5 W7 z7 ?* \) U, ~1 N
[root@kvm4 ~]#: U; U4 |, X- w9 }* \3 W
[root@kvm4 ~]#7 [6 [- ~* f) O' f: H& M) I
[root@kvm4 ~]# df -h
1 b$ V. A/ w: RFilesystem Size Used Avail Use% Mounted on. r9 M, \. C( H8 G
devtmpfs 1.9G 0 1.9G 0% /dev1 g6 \1 [7 b$ ?& X- L) q$ W h! S
tmpfs 1.9G 0 1.9G 0% /dev/shm; a6 ], b1 a* X; ~
tmpfs 1.9G 8.5M 1.9G 1% /run
% M2 |. e4 y6 G( Etmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup! M# {: H5 S$ k
/dev/vda3 46G 1.3G 44G 3% /
" k3 j6 G2 D- m/ v& U/dev/vda1 1014M 142M 873M 14% /boot- ` D* K, A) n4 w0 t7 j1 W
tmpfs 379M 0 379M 0% /run/user/0
7 `. e8 V" j5 k* a我们现在的目标就是扩容根分区和文件系统。# _; A! z! b) [ y5 F' P% c# h
此处可以参考阿里云的文档进行扩容操作,链接如下:
8 G. U: _' L8 Xhttps://help.aliyun.com/document ... scm=20140722.S_help( _) i' S* B) e. u% P
. f' {! s: f J7 l: M6 u, @我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。# D8 J0 F* U; v+ K8 v, s) J: a! g
, r: W7 B" _; J4 \$ r7 |
首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下
6 }5 B4 o+ v3 a- B; I/ I* s3 b0 B* C4 @+ l/ B* z) a
yum install -y cloud-utils-growpart" C5 o5 \" @ ]$ Q& P& e
安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格9 t# x( q8 q& b. P" w+ Q
: ?7 }* c$ s b b
[root@kvm4 ~]# growpart /dev/vda 3
, y- c4 k' n& Y3 k( FCHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
! p8 a: n6 p9 w4 B可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G
9 n* f% J. t' G- @. b0 h
0 V' g a7 u; Z[root@kvm4 ~]# fdisk -lu /dev/vda3
# f- O! o2 Z! i& \% L/ J; y/ \ % G, J- S. [: {$ M3 C
Disk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors
& u+ H0 w/ ~9 \. ^' w5 @) gUnits = sectors of 1 * 512 = 512 bytes/ Z" `1 X. G0 U5 T
Sector size (logical/physical): 512 bytes / 512 bytes3 P1 X( Z! {7 P. [6 ]- V
I/O size (minimum/optimal): 512 bytes / 512 bytes
3 W' Q4 q3 x' q如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。
' k2 P: D0 t( W7 a6 ~# N& X( U, I' Q
[root@kvm4 ~]# growpart /dev/vda 3. {. @* S0 s6 ~+ y( A
NOCHANGE: partition 3 is size 136572895. it cannot be grown
& E' M h* K9 t Evda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3; k. Y1 i+ I5 \4 U$ M& @( D
如下:
" l0 [- P! X9 b0 I8 r5 ]: y0 N* p2 q. n, I
[root@kvm4 ~]# xfs_growfs /dev/vda38 A- u+ ^9 D) Q" p* @
meta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks+ l! G. m! h0 u W n+ y, Q
= sectsz=512 attr=2, projid32bit=1
$ I- G3 ~8 D3 Q: y6 g= crc=1 finobt=0 spinodes=01 D1 G; M7 C" |0 c& p
data = bsize=4096 blocks=11828736, imaxpct=25
7 r' z/ b$ x$ K: |) q$ Z= sunit=0 swidth=0 blks
6 z+ i' o6 G$ z8 w- qnaming =version 2 bsize=4096 ascii-ci=0 ftype=1
( {& Y. B0 c" @. Nlog =internal bsize=4096 blocks=5775, version=2/ W& b3 W6 D, A1 c
= sectsz=512 sunit=0 blks, lazy-count=1
: X+ ?7 i6 ?: Y" T3 Brealtime =none extsz=4096 blocks=0, rtextents=0
9 t& W' `2 l1 W' e9 l5 y- @* l; r Wdata blocks changed from 11828736 to 170716110 E3 z ]5 q; G; j' [; j& G. X. P
再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下
4 w, ]$ W4 p- r# j7 J5 P+ t1 B- q. F+ ]* f% H
[root@kvm4 ~]# df -h
, R7 f% m$ J( P5 t6 v) ]: m5 x: HFilesystem Size Used Avail Use% Mounted on
0 k9 ]. x: ~# P y& Ndevtmpfs 1.9G 0 1.9G 0% /dev
5 k& c0 {; z* z! utmpfs 1.9G 0 1.9G 0% /dev/shm, y/ H. X7 r3 q, r0 g
tmpfs 1.9G 8.5M 1.9G 1% /run, b' Y; w" h, H ?& ^
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
4 M6 z* @& c( Z( j' v/dev/vda3 66G 1.4G 64G 3% /
?7 h+ k2 F$ p( c. J$ Y5 ?4 V7 J/dev/vda1 1014M 142M 873M 14% /boot5 r8 @6 Y$ q9 k' t
tmpfs 379M 0 379M 0% /run/user/0
+ h7 g1 \1 K) l3 W( X至此,整个扩容操作已经完成了。
$ f' e5 a# ~& L6 ?* N" L+ z- k, G- M; X: `0 X
此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。
1 }" T4 x+ B- b2 G+ F0 Q+ W: K- |) B, x' A2 L5 X! W& ~
如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区
( [6 G& s! a: ^9 z. ]& ?4 J; U: n* B* l, H4 n
这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。6 D4 z$ k; X0 J- G1 ]; J+ f
但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown
& Y0 h: D2 z6 ]1 m: H3 ]7 _) H; W- b1 m! E1 k* A% O
[root@kvm1 ~]# fdisk -l: D" a. K% K7 d* X& Q+ h4 g1 |* r
4 ~, R" b& H" U" ?+ E1 y* R8 }Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors: C- q* S, s k2 k0 j5 _6 H
Units = sectors of 1 * 512 = 512 bytes4 y. C" b, M1 A% i8 \' \
Sector size (logical/physical): 512 bytes / 512 bytes
; z; _5 F$ G7 k' D# }. a bI/O size (minimum/optimal): 512 bytes / 512 bytes( H# l1 T- m$ H& }' X/ `5 V+ X7 J- s% p- W
Disk label type: dos- z& ^$ f7 a9 @3 o8 l' x
Disk identifier: 0x000ac5a25 k0 w/ E3 Q6 o! H4 r
1 Q( S) p; l0 s* v# y& }/ T
Device Boot Start End Blocks Id System% I2 J* J/ V7 d" q$ h
/dev/vda1 * 2048 2099199 1048576 83 Linux
' F, W9 l: K F# H5 o3 r/dev/vda2 2099200 1044367359 521134080 83 Linux
( ~* v, r W$ S- \$ c/ j/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris; ]1 P# N+ J/ d8 ]! x0 {0 D; z
[root@kvm1 ~]#6 J& m6 W5 N' U2 I
[root@kvm1 ~]#
$ I k0 W9 o/ H, c+ K[root@kvm1 ~]# df -h
7 t2 g8 i2 y1 G6 d* TFilesystem Size Used Avail Use% Mounted on
; Y5 `4 H. l; C+ Odevtmpfs 909M 0 909M 0% /dev
Q' N. w$ O. Ptmpfs 919M 0 919M 0% /dev/shm
* k& K# f0 _% Z9 ptmpfs 919M 8.6M 911M 1% /run
5 K7 \4 ?+ F- L" w Ptmpfs 919M 0 919M 0% /sys/fs/cgroup
1 L1 X9 X& F5 M; w. ~, `, f/dev/vda2 497G 1.3G 496G 1% /( w: ?9 N! e5 }% }* E' O* s
/dev/vda1 1014M 142M 873M 14% /boot9 m' J) |! m O& I- X3 g
tmpfs 184M 0 184M 0% /run/user/01 E: @8 [% O0 ?: M
如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。 |
|