|
|
本文所使用宿主机,及kvm版本如下
( z3 f4 v# H' z* @+ I
) h5 @0 ?. ]8 E( i0 U#cat /etc/centos-release
6 K1 D H# x+ QCentOS Linux release 7.2.1511 (Core) " f& o G( A6 c' b
7 u* O. } V7 s+ D+ p: o9 P
#rpm -qa |grep qemu
: n& d; g' Z) R: a7 b( Eqemu-img-1.5.3-105.el7_2.4.x86_645 B$ G& O- |# P6 p
qemu-kvm-common-1.5.3-105.el7_2.4.x86_648 H5 }, Q7 f6 n2 e: K+ O! `2 f3 a8 q
qemu-kvm-1.5.3-105.el7_2.4.x86_64
2 h( K8 H3 A5 L) X/ o- ]libvirt-daemon-driver-qemu-1.2.17-13.el7_2.5.x86_64$ N. z& b _8 u
几种磁盘格式介绍
9 w Y" K. {( j0 ?- \% {+ L4 {# t
qcow2
: F5 E& O# z x/ i" n! z9 C5 S5 X- L' ]! ]% ~ c/ h# ~
qcow2是qemu模拟器支持的一种磁盘镜像。它可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的raw格式相比,有以下特性
# Q3 L3 w1 Z4 ^1 s# d1 b2 h" O. E& H& Z5 d# U0 `
更小的空间占用,即使文件系统不支持空洞(holes)! u, Y% J" B( e& N* }# g9 p
支持写时拷贝(COW, copy-on-write,镜像文件只反映底层磁盘的变化
1 {' s/ c! Q: P支持快照(snapshot),镜像文件能够包含多个快照的历史(快照链,backfile)
2 n( ^+ r8 v K, b可选择基于 zlib 的压缩方式( n% e n( i& t7 X2 J6 m: l* A
创建qcow2磁盘格式
: k" T" o3 U5 Y8 z5 c( _4 [, A+ w7 S& Z0 O7 k3 o/ Z n" G
#qemu-img create -f qcow2 disk1.qcow2 40G9 t+ B! X7 Y" I& v* _
Formatting 'disk1.qcow2', fmt=qcow2 size=42949672960 encryption=off cluster_size=65536 lazy_refcounts=off ! A8 |) ?5 z) {* Q* f
2 @1 R. t* K2 W4 d
#qemu-img info disk1.qcow2
' |+ o }$ _/ d/ V4 c( _5 p4 r( vimage: disk1.qcow2
0 h# I$ ~& G; p6 k* i& T* W+ |file format: qcow2
( B' ^7 S: G( m- Ivirtual size: 40G (42949672960 bytes)
& F9 `4 R. d5 L0 `( [...
4 H: t5 ]9 t7 W& H8 Q9 S9 w, N: w# N% N: Q" p5 \
#ls -lh disk1.qcow2 ) C6 d! f3 s2 v- ~( S- C
-rw-r--r-- 1 root root 193K Apr 22 16:13 disk1.qcow2
: r+ W+ O/ r5 M; Z9 U: L" praw
& g6 x$ U; }6 ~1 x' o# a# |% ?1 S! H
raw格式是最常见的一种磁盘格式,平常所使用的文件,iso镜像等都是raw格式
- |! Y- M+ |5 @ i! B7 Q- I3 ~% T* `& n! }* C, [: `4 W2 v
#qemu-img info /etc/passwd, e4 p$ v1 I7 u+ E( ^
image: /etc/passwd. [$ Z; A$ t: f
file format: raw9 X4 v9 |6 R% `
virtual size: 2.0K (2048 bytes)
, D) [) N. J Ydisk size: 4.0K
9 F h2 p+ V1 t
8 l/ K( o. h, E9 n7 P; a: Y9 }#qemu-img create -f raw disk2.raw 40G
) |; A& l! s2 h3 h0 j/ e5 IFormatting 'disk2.raw', fmt=raw size=42949672960 + G' T. v, M% r/ `2 p3 m' p
N" z g3 ^9 Q/ R. Z6 E9 e4 ~
#qemu-img info disk2.raw % g7 Z, Q; v5 ?
image: disk2.raw
3 @; s( R0 p; T+ ^: }file format: raw) l" ]$ w! a3 M1 Z
virtual size: 40G (42949672960 bytes)& C; j, W) u8 N' M4 \
disk size: 0
' m0 H, q1 M) J7 z1 e8 W6 _) R& a/ V
#ls -lh disk2.raw % j6 F! X* y! g7 l2 x/ o
-rw-r--r-- 1 root root 40G Apr 22 16:15 disk2.raw6 z& f6 M+ |: S) L$ r0 _
RBD; c/ I$ T* V0 C& p$ k- Z
7 E; u- \5 T9 Y R3 ^# |rbd是ceph提供的块设备,与物理磁盘,LV卷一样,可以在其上安装系统,或者挂载到实例上作为数据盘6 ?/ u; x4 F8 i h5 H( x
7 Q) a) K% J5 V9 } G5 X- c#centos7下的qemu-img支持创建rbd格式磁盘 $ r% q0 {+ h1 N, ]
#qemu-img create rbd:vms/disk3.rbd 40G
# t \' T7 o$ s; H DFormatting 'rbd:vms/disk3.rbd', fmt=raw size=42949672960 cluster_size=0 $ X* L6 ?* Y% d. l V1 W
& J# ]% i* ~* _8 W4 g% }% z#qemu-img info rbd:vms/disk3.rbd
/ n' a" z, A- X2 Rimage: rbd:vms/disk3.rbd, ?' @- `1 `/ X: ]* [( O
file format: raw
% C, M2 H: ^; Y" `" q- ~virtual size: 40G (42949672960 bytes)
# h" A1 L$ t8 m. @' ~disk size: unavailable
9 a& h C3 T! |8 s" n2 u关于磁盘设备与文件系统
+ d" o; ]) h% c9 N2 x4 M E6 H2 r5 C! {( t
扩容前,我们先了解下磁盘设备与文件系统,这是了解磁盘扩容的基础
0 ]2 @5 N0 U1 Z" z5 u* l) m! o; Y( r' S1 J/ P
假如有一台40G根磁盘的centos6虚拟机需要扩容到80G。首先关机,然后使用qemu-img resize disk +40G扩容系统盘到80G,启动虚拟机,使用fdisk命令可以看到磁盘大小为80G,然而使用df -h查看却仍为40G左右,并没有增大。真正能供我们写数据的大小仍为40G' p) u7 `/ R S. R1 J1 {3 E- D! `
: y( u( j% t7 k文件系统类型很多,ext3/ext4/xfs/btrfs等,文件系统是建立在磁盘分区之上,像UUID,inode这些是文件系统层级的概念,没有经过分区格式化的磁盘设备是不能使用的,我们在系统中使用df -h看到的/dev/vda1,/dev/vda2是挂载到系统中的vda磁盘设备上所建立的两个分区,这两个分区可能使用了vda整块磁盘容量,也可能只占用了部分容量,因此如果要扩容某台虚拟机,首先要扩容磁盘容量,然后使分区上文件系统识别磁盘大小变化并相应扩容inode数量
4 m- r) p& w$ ?7 I' p4 z; G ~# M% Y% a+ o- J
再考虑下我们安装虚拟机的过程,新建一块指定大小的磁盘设备,然后在其上新建分区,安装系统。刚新建磁盘设备时,磁盘上并无任何数据,之后新建分区格式化会向磁盘上写入inode, 一旦分区建立,inode数量就也确定,文件系统就形成了。关于inode,可以参考这里理解inode
! g7 S) T6 G* m+ }1 p! L7 R! k( F: \% w' `
centos6实例下的扩容
2 y# Z( {8 V6 G
! u5 o3 _+ ]3 f; R" n6 o$ tcentos6默认磁盘格式为ext4,centos7系列使用的xfs,因此扩容方式也不同; q8 ~/ E) p; x# n
. \6 `: f$ W% X
根磁盘扩容& Z7 ~ r9 m# Y
7 A3 p' i% N' a4 z( R! b2 `# {测试用的虚拟机为centos6.3系统,我们准备把根磁盘扩容到80G。扩容磁盘大小可以使用qemu-img工具,扩容文件系统主要是使用growpart等工具在系统启动时检测磁盘大小变化,并自动增大分区文件系统inode数量
+ R" d* t! A' u+ R* A
; j& V: }3 G p. @3 D2 Z- z#virsh domblklist centos68 m5 ?, t. v5 ~7 _! a8 m% K9 s
Target Source) B. F% `" o* `7 I9 ^0 p
------------------------------------------------
/ n0 c3 ~9 P5 K% V' \" K8 D: Uvda /data/test/centos6.qcow2
9 v( S$ G" O, |
1 I) R% }$ q) V2 h! n. T#qemu-img info /data/test/centos6.qcow2
; Q9 v; K, N1 L3 fimage: /data/test/centos6.qcow2/ }* \' r1 {+ a! |1 Z; L# ^
file format: qcow2
8 R- B( K" z) {2 P8 r1 {6 B( K7 Tvirtual size: 40G (85899345920 bytes)
0 h9 r) t5 ~9 }disk size: 1.2G ^' \* R" ~# z) d4 X" V/ |3 J
首先关闭虚拟机,resize磁盘到80G
H3 h8 v% ]# V
) ?4 U1 h' K# H6 Mvirsh shutdown centos6
# y" H/ A$ R$ P+ P6 j6 H, h6 g4 X$ F$ s7 K( ]4 D
qemu-img resize centos6.qcow2 +40G
7 ^1 O. N7 l: @% r/ j- u0 N$ o: N/ w% x6 {- b0 c* b
#rbd磁盘也可以使用rbd工具 ( e7 M% ]. s3 P! a. J: u
rbd resize vms/disk.rbd -s 80G
% a; J. h1 U4 h5 Y启动虚拟机,磁盘大小已变为80G,下面扩容其文件系统,需要注意的是,因为根磁盘在虚拟机运行期间处于挂载状态,无法扩容,只能在系统启动期间自动检测并扩容,可以参考openstack官方文档disk-partitions-and-resize-root-partition-on-boot-cloud-init+ B* `7 X) d/ ^6 ^
5 r$ G4 B+ F) K; y" G. ~* M4 s
#安装parted growpart, t, B$ U$ X# b3 ^, w
rpm -ivh http://dl.fedoraproject.org/pub/ ... 7-10.el6.x86_64.rpm
2 e, v, S) F" K! X3 Y" X5 ?yum install parted
7 A- |4 z3 \' ~0 c5 W
9 A- D D6 T" h( L* S8 y P: nwget https://github.com/flegmatik/lin ... /archive/master.zip
; f: ?7 c/ M" N+ eunzip master
) k! g/ ]% N5 S7 x6 P) [. s$ _) ~cd linux-rootfs-resize-master
3 O, D3 @" }2 D7 O./install# g- S% [. @+ Y& P5 l) w& R) B2 B: _
之后重启虚拟机,启动过程中可以看到inode会自动扩容- J- q9 K( R2 O' r' i" c
S& i1 c9 v6 Y( I2 C7 W
resize) f% n2 ~) w/ B8 q2 q
6 i$ F0 }9 K% ocentos7实例下的磁盘扩容
: X. o0 g5 O! C0 o
7 \* n% U. Y! k" x, n; v+ h" Xcentos7中默认使用xfs格式,下面以xfs磁盘格式为例。8 I4 K# V6 S! d+ L; t$ B$ M" n
- I- A0 X8 P B& U3 N2 ^同样,首先关机,扩容虚拟机磁盘5 V8 y4 o4 h8 n; ]5 ]9 B% [
: F2 D: H( U8 o: B2 dqemu-img resize centos7.qcow2 +40G
- N. d" m; a# F3 |* V然后启动虚拟机
/ D1 M. G( X# I2 F8 y8 P( X) O" G9 i6 @
#安装扩容工具 ; F( k$ `9 y; s7 w, P/ j J
#yum install cloud-utils-growpart" |& v: E0 R/ S
# p; L4 s$ w6 i! d5 G# Z2 B) V7 s
#磁盘已扩为80G
( V+ z0 ]: r; a#fdisk -l+ K0 y+ N& S- a7 X# I( G
Disk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors0 s% Q. E( a3 c) q
Units = sectors of 1 * 512 = 512 bytes
7 h `. a" o/ _, f1 s$ TSector size (logical/physical): 512 bytes / 512 bytes
0 Q3 I" ]3 a: @4 j5 _: ^( zI/O size (minimum/optimal): 512 bytes / 512 bytes% n# p8 _6 v7 b4 ~6 Z& Q5 A# k6 {
Disk label type: dos, d$ `* u! H/ u3 `
Disk identifier: 0x000b314e
3 u9 a! T4 J( u- O7 }' @5 y& n) E0 \3 `5 p( P
Device Boot Start End Blocks Id System
/ |: h: k6 U p0 h s/dev/vda1 2048 33556479 16777216 82 Linux swap / Solaris1 q# n* ?( @/ `
/dev/vda2 * 33556480 83886079 25164800 83 Linux
n: e' B3 Y# X& H' D) Z
1 S8 v! E" b; ^$ O. V#根分区仍没变
" `- v6 ` G8 o5 L" o#df -h6 U: L8 E- U# L2 O; [9 e
Filesystem Size Used Avail Use% Mounted on
) J8 ?* X) N' {" T* K( W/dev/vda2 24G 1.6G 23G 7% /
: }# M- S" L/ ~$ @" }+ ^2 tdevtmpfs 2.0G 0 2.0G 0% /dev
/ R) d9 A9 L/ u( H7 Itmpfs 2.0G 0 2.0G 0% /dev/shm* q% J' |5 K% {7 E
( e1 }( x5 G$ m: w#我们把40G加到分区2上 ! V+ D, ]$ H; I1 u( C; {8 Q+ x
#growpart /dev/vda 2
3 e* ~4 O% b( M( qCHANGED: partition=2 start=33556480 old: size=50329600 end=83886080 new: size=134210315,end=167766795
3 ~+ M+ [% k- \0 Z8 n/ b
, S4 j- K: P0 i. c" Z3 T6 K#然后扩容分区2文件系统 * Q% N6 {% b: o1 m- g
#xfs_growfs /. n* ]4 J6 {4 w) M( {% J# O+ y
meta-data=/dev/vda2 isize=512 agcount=4, agsize=1572800 blks
$ M/ h- L1 j& X& j' y B1 H! h2 V = sectsz=512 attr=2, projid32bit=1
6 o/ ~+ F9 q, _5 m$ C$ x( ^ = crc=1 finobt=0 spinodes=07 D+ E* v- v2 X( l7 {
data = bsize=4096 blocks=6291200, imaxpct=25
& W. c9 X4 {6 G# a5 o2 ]% D' V = sunit=0 swidth=0 blks
* I2 f9 i! h3 hnaming =version 2 bsize=4096 ascii-ci=0 ftype=12 j0 p9 t% }2 g) m0 {* s
log =internal bsize=4096 blocks=3071, version=2
. f2 i; Q% [9 V X/ u0 J = sectsz=512 sunit=0 blks, lazy-count=1
' A; ?$ |1 ]8 r. mrealtime =none extsz=4096 blocks=0, rtextents=0
8 N' I- d6 i. M' G4 ~data blocks changed from 6291200 to 167762896 d9 P5 k1 E5 V/ ^' }5 ?0 o
常见虚拟机磁盘格式间的转换* u* X# H" D1 n% s
7 f+ E) l4 \$ k+ n3 [& M. @0 ~+ x这里简单记录下不同磁盘格式间的转换,注意centos6的宿主机qemu-img命令不支持rbd格式
0 o9 B. y4 r; o! j% X( h8 x+ o
! @4 d+ l/ h0 n% I7 N% G2 E6 `#qcow2磁盘压缩 2 P# O- h' M/ ~. S
qemu-img convert -c -O qcow2 centos.raw centos.qcow2
. b7 e2 c# Z) r, @* g# t8 ~
$ @+ r; l8 z- R& `-f: 源文件格式,qemu-img会自动检测,可以省略
" K a* O5 ]1 T9 p-c: 启用压缩,qcow2格式才支持$ m; m& V6 X/ H, ?" r3 |3 E
-O: 目标镜像格式
' ~' L, f# i( U! J% K0 x$ ~
# s( s. [8 V' [2 X3 b7 _4 e$ Y#lv卷转qcow2格式
+ D( N, V2 I/ m* \8 gqemu-img convert -O qcow2 /dev/CentOS_kvm/centos6_6_163 centos6_6_163.qcow2
, ?! j3 w6 V& @5 z0 Y# u [
3 G0 ~! N6 l" A#qcow2格式转换为lv格式- I& U& t$ ^: `7 `4 T# ~, ^2 e
qemu-img convert -p -O raw centos6_6_163.qcow2 /dev/CentOS_kvm/centos6_6_163
% ^/ C X. Q2 \ G7 g- u# g4 b4 C/ |
& A7 r9 x0 N. s# y7 G#rbd块转qcow2
* n4 P' E2 j) tqemu-img convert -O qcow2 rbd:vms/centos7.rbd centos7.qcow2
7 z& I9 L5 D0 @( K
) }: s8 k( o5 w3 }+ w6 Q#qcow2转为rbd格式0 E6 \) V4 G" ^9 \% a! ^
qemu-img convert disk.qcow2 rbd:vms/disk.rbd& n% f5 [4 ], ~& u% K2 d
virt-resize. `8 `" X+ Q& e/ s4 s0 t$ B' Q
* M6 g) O, C( ~9 S9 j1 h) P
当然,virt-resize工具也能够扩容虚拟机磁盘,例如现有一个16G的qcow2格式的centos镜像,需要扩容到50G, G( T% `: V8 G
; v$ X6 \" M y% T0 y查看分区' [, z+ V5 c2 x; K, |, z! g, M
virt-filesystems --long --parts --blkdevs -h -a /data/images/centos.qcow2 q. S5 H b. x% E6 Y4 t/ J2 y
创建新镜像,大小为50G,要比旧镜像大8 N' W% I2 z! e- k" F* W; {
qemu-img create -f qcow2 /data/images/centos-50g.qcw2 50G
7 l4 e) h: q6 M2 |6 t: I7 F+ D8 }扩容虚拟机sda2分区- p# ]2 Q/ B7 b2 {. G2 N, m
virt-resize --expand /dev/sda2 /data/images/centos.qcow2 /data/images/centos-50g.qcow2 |
|