|
|
楼主 |
发表于 2022-4-11 17:33:21
|
显示全部楼层
以使用如下命令, A4 T9 d1 p8 p4 v. B/ s( E5 W5 y
2 b, X7 h% O8 R" V
qemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2
( \ W$ V+ F8 G磁盘镜像如果有快照,无法进行扩容- S8 I9 A) A4 N% Y
. Q2 a( N& k8 L8 ?" I
再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动; z1 c! I# a7 _( [
+ p. I; X% ~. ?
[root@cos7 ~]# virsh list --all
! x) u& I4 D" C1 a/ N/ z$ v- XId Name State) n9 `+ N# s7 u9 p! h' |- i
----------------------------------------------------
6 f4 G" A) \" a& b" L5 d9 c4 kvm4 running t4 B0 e: L) v$ [
- kvm1 shut off
8 G$ F8 H0 K2 }- kvm2 shut off4 Z) r( A( z/ L4 ?( Z
- kvm3 shut off) [. `4 D, G- x. O8 l
- kvm5 shut off7 q/ B: L0 y& [" C* ^& {; B. U
- kvm6 shut off' H' v) C. j0 m% j0 J1 Z6 {" Z
登录kvm4,查看虚拟机磁盘状态,如下
% M# u4 K8 V1 f% K5 U& ?0 ]9 M- C( g5 I7 u" ?1 w5 c
[root@kvm4 ~]# fdisk -l$ {- S ]7 t1 M8 L
7 J2 L+ }. D8 ^7 Q) x
Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors" u7 [) p. U/ D9 b; R2 r( ~
Units = sectors of 1 * 512 = 512 bytes
3 h# l, B6 H) j2 l% d0 vSector size (logical/physical): 512 bytes / 512 bytes
/ _0 J' M( }0 o8 t1 BI/O size (minimum/optimal): 512 bytes / 512 bytes8 j [, D& W& E( R( E
Disk label type: dos
) R0 Y- ~0 A* L7 m* V% e) QDisk identifier: 0x000b94178 t+ i" s6 m' i, R! w5 ]
" g$ D" M3 @* J8 b# w: D6 @
Device Boot Start End Blocks Id System6 M% y" x( `" t, l2 w
/dev/vda1 * 2048 2099199 1048576 83 Linux
8 e2 \! D {' }3 C5 U' a5 _/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris- g1 X t3 b* p8 Q! g) W1 r
/dev/vda3 10227712 104857599 47314944 83 Linux
; E3 R8 |7 ]0 O6 w[root@kvm4 ~]#
3 o6 Z: [+ u9 s+ r0 T[root@kvm4 ~]#2 p" ~+ ~& u% f- ~
[root@kvm4 ~]#! [! [$ j* d( v( ^
[root@kvm4 ~]# df -h
' U% W0 D# c, _7 L$ l! b3 hFilesystem Size Used Avail Use% Mounted on
1 O M) O) E1 b& Hdevtmpfs 1.9G 0 1.9G 0% /dev. ?: ~. W5 h* ?- w& _
tmpfs 1.9G 0 1.9G 0% /dev/shm7 m) S2 j5 Q/ s* M6 x6 H; Q! e
tmpfs 1.9G 8.5M 1.9G 1% /run
, Y# Y @1 ?- Qtmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
J( w: j& B* M1 ?0 `/dev/vda3 46G 1.3G 44G 3% /
3 j. _. B0 U6 g/ P3 w: i2 U3 r/dev/vda1 1014M 142M 873M 14% /boot, E! A @: F' G0 B2 ~
tmpfs 379M 0 379M 0% /run/user/08 G' U; }1 u" @
从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。
* H# J: n# V9 K% Z在宿主机上确认kvm4的磁盘镜像路径,如下:
: M$ G, \3 U* R1 j
- ^0 i) k& M: Y" \[root@cos7 ~]# virsh domblklist kvm4* @& W$ W' y" z$ W9 X" \6 V. x
Target Source# q" o' d$ k9 D! [
------------------------------------------------0 V9 X% M+ y) ?0 J: |: z: Y
vda /var/lib/libvirt/images/kvm4.qcow2( I# r8 d5 K$ ^* l7 }
hda -. `2 l3 w# L+ ~: G) h* F: ]* ^# q
可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小
, P8 X* G. d& g
2 g0 e, z+ q0 H; [7 @& B[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
9 |. N! s: G6 z* O1 u2 q2 wimage: /var/lib/libvirt/images/kvm4.qcow2; J" V4 h5 ^% {) _8 P6 @3 [7 j
file format: qcow2) }' H" C9 o4 o" \
virtual size: 50G (53687091200 bytes)7 _0 v" v- l$ R! {3 P$ E9 e
disk size: 1.5G
5 ]% P0 w: x5 \' t8 s+ w; |cluster_size: 65536- u6 ^* c3 X& |5 V
Format specific information:* b, W$ u8 W4 h& x
compat: 1.1
7 J$ q* f/ S$ X8 u% Olazy refcounts: true5 Z+ ?+ k% T6 C! A6 j
如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。8 p, Y3 t$ h( x* u$ I
现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。9 ?0 G y. o" Z/ @! D
停止虚拟机后,执行如下命令
* b2 S/ {7 ] T1 o
) }( h. R$ z9 \# L# t: Z2 s4 @' X* ?% o8 P[root@cos7 ~]# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G
, g6 T* M+ r! m4 `6 G) k3 x* MImage resized.7 y0 W! f+ h8 ~4 ]3 F7 Y1 R
增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G
4 `+ }& V" S# @) K! Y
+ e: P% D! ?+ Q1 u3 u1 X3 t* G5 m[root@cos7 ~]# qemu-img info /var/lib/libvirt/images/kvm4.qcow26 P0 F( ^/ x. N( i* Q7 e
image: /var/lib/libvirt/images/kvm4.qcow2
, G+ y5 a, h8 f! K3 [. kfile format: qcow2& }4 |* P$ H8 \3 h; V$ G* X8 r
virtual size: 70G (75161927680 bytes)
$ A1 f+ a2 H. s5 R! j; n( f) rdisk size: 2.5G& r- G6 k9 L0 Z0 Y ^
cluster_size: 655367 D: h# U5 L8 Q& z
Format specific information:
~6 n* f& x2 f8 ~compat: 1.1
) R) c( e- {" ]% G& ~( b( Blazy refcounts: true
8 p4 z$ O, z5 }. w! f磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G' ~3 x2 U& u p/ U' e- w& z( s
" W4 V, ~* V% W% x% j9 s0 F r
[root@kvm4 ~]# fdisk -l; M3 L0 z% s9 d3 K
1 P5 e+ G+ F6 U) m; `! T
Disk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors5 k& h, m3 s A6 _6 w. r L0 S6 D4 E
Units = sectors of 1 * 512 = 512 bytes1 K$ a$ N, P7 w6 H* e
Sector size (logical/physical): 512 bytes / 512 bytes
G: X: ?- c1 Q3 NI/O size (minimum/optimal): 512 bytes / 512 bytes
8 D9 ~( c J5 {) }$ Y h+ DDisk label type: dos; |! k' g# q) k2 H
Disk identifier: 0x000b9417* _7 M4 n$ Y2 H9 E4 f" _% H
3 Q' N8 Q3 [# P8 F# Z% l: R
Device Boot Start End Blocks Id System. y0 N+ l% Q Y9 w9 }: o
/dev/vda1 * 2048 2099199 1048576 83 Linux
3 C& b2 ~$ m5 T/ I2 k5 E4 s0 ]/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris
. v: c4 Q6 C9 H9 a/dev/vda3 10227712 104857599 47314944 83 Linux2 I1 T6 ~2 U0 u0 X$ B
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。
4 H; _( x( T4 B. m% |
" U% { D- J o3 B[root@kvm4 ~]# fdisk -lu /dev/vda3
# H) a* E) M3 N$ } 0 o4 U" G, j0 j7 `& z# j
Disk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors" z/ u/ w! O$ K! |6 P ]9 r
Units = sectors of 1 * 512 = 512 bytes! F5 b: K) { r* F
Sector size (logical/physical): 512 bytes / 512 bytes$ e [8 b" k! b. c9 q# \! b" j7 a
I/O size (minimum/optimal): 512 bytes / 512 bytes) D+ O7 M1 ~2 r3 P+ K) G/ p
! \- x! G2 f6 a1 ?& C9 J! j# _+ D[root@kvm4 ~]#- V6 H5 z! _- H! ? Z7 E9 l: U1 c
[root@kvm4 ~]#+ D+ t+ k$ `* \2 x; R/ D3 K
[root@kvm4 ~]#2 G, M' V& D0 Q3 [
[root@kvm4 ~]# df -h
$ C7 S% Q4 C7 l, w3 ]0 fFilesystem Size Used Avail Use% Mounted on
: F7 s0 z+ q: \. U( B* Udevtmpfs 1.9G 0 1.9G 0% /dev
! L. q4 g; K) t Ltmpfs 1.9G 0 1.9G 0% /dev/shm2 l# d; `8 ^: ~% F
tmpfs 1.9G 8.5M 1.9G 1% /run
% ?2 [3 T& y4 H& m; p% Stmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
. M6 T0 U8 U- m) `% ~* t: y) O; a/dev/vda3 46G 1.3G 44G 3% /
) U+ U+ x/ B/ z; j; o/dev/vda1 1014M 142M 873M 14% /boot4 X: `/ _3 W3 s$ n: Y& M
tmpfs 379M 0 379M 0% /run/user/0& Y/ r" @4 X/ z+ Z4 F. M- ]
我们现在的目标就是扩容根分区和文件系统。
9 t% C5 ~, l' p: Q此处可以参考阿里云的文档进行扩容操作,链接如下:. }+ g+ _+ T# N" {' l& \1 H
https://help.aliyun.com/document ... scm=20140722.S_help
' N7 w8 l! G: y) D' E( y: f3 O6 R
& {$ {. p$ F& @+ M* e我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。% z Q2 x; O) @/ U
3 m1 j x1 J! r( n0 O
首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下
+ g$ @1 {7 j$ l& @" |) L5 X1 f5 v! e' x7 s
yum install -y cloud-utils-growpart5 c0 c- e2 s' Z* m) F
安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格
+ W- O# O3 [+ ` L5 L6 F2 s) u! p' p) C( _& f$ I
[root@kvm4 ~]# growpart /dev/vda 3
; R; {, \3 w* Y: V7 S, K: vCHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
0 Y, g5 s7 k6 t! Q3 T- Z) l ?: j可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G6 A0 [- q; p# j
& e4 g) `# L% J# D8 b- {
[root@kvm4 ~]# fdisk -lu /dev/vda32 p6 v. w5 o! ]* r: Z8 Q- X- N; A! S
. G* ]3 g1 h; `; ^" _& M
Disk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors6 ~, J) ~5 [% T( i9 ]( ~2 m
Units = sectors of 1 * 512 = 512 bytes' J$ Z) N1 J2 L1 c
Sector size (logical/physical): 512 bytes / 512 bytes
, L2 O, j U1 b) kI/O size (minimum/optimal): 512 bytes / 512 bytes& A! u" c" a7 p1 w7 |* t
如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。* r: b. m# C' f! e! T8 }; `3 o
+ @6 R" o( t) `- g5 G% |+ J
[root@kvm4 ~]# growpart /dev/vda 38 Z% p+ m' h0 D& T+ l4 n
NOCHANGE: partition 3 is size 136572895. it cannot be grown
( [( e$ i5 S& Z: |vda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3
! K: n/ @# a1 l ?如下:
- a$ T6 M) q8 R) O7 V) j% q1 f
[root@kvm4 ~]# xfs_growfs /dev/vda3
1 }# `, ]# k6 `" z1 cmeta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks
# M( U2 b' ^( |+ T4 c= sectsz=512 attr=2, projid32bit=1% h! s6 k$ U4 L- U. q
= crc=1 finobt=0 spinodes=0& b/ z& Z# U+ h' D H, |
data = bsize=4096 blocks=11828736, imaxpct=25
0 ^0 s! d. J% O) y= sunit=0 swidth=0 blks0 t/ _2 f1 B7 E
naming =version 2 bsize=4096 ascii-ci=0 ftype=11 U4 m! P- U/ |) k+ d
log =internal bsize=4096 blocks=5775, version=27 f- m) q$ C* ]
= sectsz=512 sunit=0 blks, lazy-count=15 r3 G. p7 e7 v0 c3 i/ t+ ~( g
realtime =none extsz=4096 blocks=0, rtextents=0
2 D0 v6 Y0 C! {+ i5 Ddata blocks changed from 11828736 to 17071611
/ L( i1 z: D+ O2 n( o6 L6 L, N/ N8 z9 z再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下
$ l3 o8 E5 U6 y% P. U
+ q+ q" j$ b# [) P5 D[root@kvm4 ~]# df -h- Y W8 S. @- b
Filesystem Size Used Avail Use% Mounted on
+ q D$ W% N! F. r; W, J( qdevtmpfs 1.9G 0 1.9G 0% /dev
6 Z$ R5 O0 ^0 Q' \/ e4 Jtmpfs 1.9G 0 1.9G 0% /dev/shm
0 g1 |2 S( P0 S: U3 y# j/ n0 Ltmpfs 1.9G 8.5M 1.9G 1% /run* x* E. r5 u; m$ U1 j% D" @+ U8 c
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
+ Q# u0 U, \" t7 }# D# ]/dev/vda3 66G 1.4G 64G 3% // ]7 S) [- _4 K3 E9 g4 {. ?
/dev/vda1 1014M 142M 873M 14% /boot
& V6 R I+ Q; r0 y% O, ]' z! Stmpfs 379M 0 379M 0% /run/user/09 z6 o+ I* Q7 E6 F: `; b
至此,整个扩容操作已经完成了。
* D$ h& g6 t$ p2 a2 ]0 K# K. s4 f+ I& V9 k
此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。- H7 t$ ]& w7 ~2 T
- ~6 f# M9 {, n7 N) Q: w5 b" ?
如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区" |5 q) Q7 t1 x$ n4 ?5 ~
6 l c/ t& `; q/ y9 }! k3 I5 @8 X
这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。
3 |% D1 K! h- c. n+ M( b1 C% [但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown
' n* Y) ~, H) `0 Z/ |1 l* U
& B0 ` F: n* w[root@kvm1 ~]# fdisk -l+ U9 q3 R. U/ F3 z! j
& X3 g5 _1 z8 Q# {
Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors
3 }/ D% S* H7 M$ |9 t0 rUnits = sectors of 1 * 512 = 512 bytes
+ V- s5 q4 x7 E3 ~6 P$ w! x4 TSector size (logical/physical): 512 bytes / 512 bytes$ P+ Y8 w; o( v/ t4 U% f
I/O size (minimum/optimal): 512 bytes / 512 bytes7 k* C1 W* r& y1 F3 z$ H- F* G
Disk label type: dos
! Z& b [* V8 s" ]9 Y6 XDisk identifier: 0x000ac5a2
: C, }* [/ `3 h) M8 k* ~ . z9 B' u$ X; a- M% `9 v
Device Boot Start End Blocks Id System
) u8 z6 q- [3 |7 h8 w/dev/vda1 * 2048 2099199 1048576 83 Linux
5 X- ?! Y( K, U* i/dev/vda2 2099200 1044367359 521134080 83 Linux
* r$ U$ o1 \! V" w/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris
' a9 g2 p n8 c# e8 a F! i[root@kvm1 ~]#' ?1 R. C+ t% x% b/ ~/ H
[root@kvm1 ~]#5 M. L* Q) m4 |: `" c! ?8 l
[root@kvm1 ~]# df -h8 X0 x/ i% |3 ~: Z6 y
Filesystem Size Used Avail Use% Mounted on, h u, l3 `! F+ F) n. w
devtmpfs 909M 0 909M 0% /dev3 q% i5 w7 o3 v, P2 l1 c
tmpfs 919M 0 919M 0% /dev/shm3 N' o2 ^9 ~5 y; R
tmpfs 919M 8.6M 911M 1% /run' ]6 H9 K4 d& X& {6 x
tmpfs 919M 0 919M 0% /sys/fs/cgroup
% ]# `8 A3 O6 N% T/dev/vda2 497G 1.3G 496G 1% /
) l0 I3 m4 \2 v {( g/dev/vda1 1014M 142M 873M 14% /boot4 Z) ^+ H/ D0 l) \% H6 _
tmpfs 184M 0 184M 0% /run/user/0/ k* h% j) ~: \ L5 s
如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。 |
|