|
|
本文所使用宿主机,及kvm版本如下3 a5 d' \; s4 J. l6 v% v- A) F
1 Z" y3 w7 v- D# U. `#cat /etc/centos-release$ r% I) S, U6 K! ]
CentOS Linux release 7.2.1511 (Core) ' i& t3 h- x* D( I/ b
) N0 r+ p/ \7 c& G7 U+ q) z
#rpm -qa |grep qemu
; p! _) u- Y0 q3 v8 R* lqemu-img-1.5.3-105.el7_2.4.x86_64. m3 m6 {' l' L) {1 H! @
qemu-kvm-common-1.5.3-105.el7_2.4.x86_64( i* ~9 \1 s0 B
qemu-kvm-1.5.3-105.el7_2.4.x86_64
! P4 z" q; V3 i: R. e* t. x. Nlibvirt-daemon-driver-qemu-1.2.17-13.el7_2.5.x86_64
7 [6 l6 L& o0 b" U7 s8 j几种磁盘格式介绍
: x0 X4 L6 F: u- g9 \ Y! m/ V$ i
qcow2
$ A* \# @9 b8 S
8 n) f, Z: Q1 E: V4 X2 |4 i. ~qcow2是qemu模拟器支持的一种磁盘镜像。它可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的raw格式相比,有以下特性1 w% \1 i9 T4 j0 c' Q
" o2 d- I0 r+ Q更小的空间占用,即使文件系统不支持空洞(holes)5 j" L" b0 K. X- h" R1 z/ }5 v9 v
支持写时拷贝(COW, copy-on-write,镜像文件只反映底层磁盘的变化
/ p4 O$ l$ D$ H4 f5 F; l% P支持快照(snapshot),镜像文件能够包含多个快照的历史(快照链,backfile)0 [+ a7 k, |$ {4 A) u
可选择基于 zlib 的压缩方式
* w8 s8 ]" b! ~: L3 F创建qcow2磁盘格式3 W6 s: K' p* A s% b
: z" ^; k) U; m+ T#qemu-img create -f qcow2 disk1.qcow2 40G
9 _; Q- `% F) Q7 o i7 }Formatting 'disk1.qcow2', fmt=qcow2 size=42949672960 encryption=off cluster_size=65536 lazy_refcounts=off
) f( p) ~& |- s1 ~) {
; k4 R, Q) M; f6 y% w#qemu-img info disk1.qcow2 . I" e7 i( t; U. C
image: disk1.qcow29 w9 L$ K1 J: z1 y6 ?. C
file format: qcow2
7 z0 d( W1 d5 b5 p# @virtual size: 40G (42949672960 bytes)
8 J- j# l, F" t4 p...' B8 a) D) d( w4 J8 m- n7 c4 s
4 i8 r1 y2 z, \: I/ ~2 E#ls -lh disk1.qcow2
. S7 u; f; }. w( |-rw-r--r-- 1 root root 193K Apr 22 16:13 disk1.qcow2
. I2 ~4 R J" }/ J$ D. L2 eraw
8 u! Q; G* z: O0 I! H& o+ Q. W) D: [8 O5 K4 ~( i# O/ t
raw格式是最常见的一种磁盘格式,平常所使用的文件,iso镜像等都是raw格式
* a P; U$ [& n6 x3 e4 Z( M2 @' @# c! u/ T U. r" v5 c9 C: s4 ~% u
#qemu-img info /etc/passwd5 B, y( r+ P H3 x1 d7 [
image: /etc/passwd
6 S% U; A. x0 {file format: raw
0 H$ o9 t0 |+ d: _- T0 \5 Pvirtual size: 2.0K (2048 bytes)* e' w9 g4 L; p3 Z; k; G& b1 g; {6 d+ A
disk size: 4.0K
4 _# X# h7 d5 {$ V O
+ u$ z) j M% R! y4 D#qemu-img create -f raw disk2.raw 40G
3 y. i! H% K6 ^0 t) YFormatting 'disk2.raw', fmt=raw size=42949672960 4 Z6 D2 j, |) _% W4 [
) v u4 b) E+ e8 D# S7 T$ g$ G
#qemu-img info disk2.raw ! C9 i8 r1 s5 p; s! J q
image: disk2.raw" `* O+ f" a5 k' ]# S Z6 W# F
file format: raw
, W" |9 {8 a+ ]. i9 ~virtual size: 40G (42949672960 bytes)6 E% k6 {* @8 d" |& j
disk size: 0
+ \" ]) J' ]6 A# g5 Q' o' V; g8 J" v6 F$ v& [/ y6 y
#ls -lh disk2.raw 6 X& D! v0 k4 A1 J4 Y/ t$ o
-rw-r--r-- 1 root root 40G Apr 22 16:15 disk2.raw' |/ p8 B+ z4 A' X% A$ T
RBD
! ?) O/ Q- @. r1 V- H# R/ z% H o+ E6 l, ] B; D8 i) l7 o: U
rbd是ceph提供的块设备,与物理磁盘,LV卷一样,可以在其上安装系统,或者挂载到实例上作为数据盘
3 Z% L! y2 j" U7 p# j2 l0 |' D8 O( r7 y" O4 ?/ C: \1 C
#centos7下的qemu-img支持创建rbd格式磁盘 0 T4 [' R: c/ p) H! Y$ y0 X
#qemu-img create rbd:vms/disk3.rbd 40G 9 i) y E3 ~' D2 D( I9 f
Formatting 'rbd:vms/disk3.rbd', fmt=raw size=42949672960 cluster_size=0 9 Z' q+ ?4 t$ Q7 z, x
{7 u8 {# U! z- i. H/ y
#qemu-img info rbd:vms/disk3.rbd
, [' k% r( M. x l) M3 K5 \7 jimage: rbd:vms/disk3.rbd
9 b% p) i! `9 a" B2 u% zfile format: raw9 z" ^. E# I+ n. O1 V# Q
virtual size: 40G (42949672960 bytes). G* ^! V) ?& {- T. ~7 ~4 B+ W
disk size: unavailable : B: T/ y1 k7 g- h
关于磁盘设备与文件系统$ M8 r2 L4 F8 q1 y
; \: j0 Y* M% f; o* D/ ?) M扩容前,我们先了解下磁盘设备与文件系统,这是了解磁盘扩容的基础1 K; d# o$ {) B
5 O* h* G; ^- l7 b' A$ y# R假如有一台40G根磁盘的centos6虚拟机需要扩容到80G。首先关机,然后使用qemu-img resize disk +40G扩容系统盘到80G,启动虚拟机,使用fdisk命令可以看到磁盘大小为80G,然而使用df -h查看却仍为40G左右,并没有增大。真正能供我们写数据的大小仍为40G. R7 v, k. E- _- k
9 W l+ d6 `7 [5 t% }, e文件系统类型很多,ext3/ext4/xfs/btrfs等,文件系统是建立在磁盘分区之上,像UUID,inode这些是文件系统层级的概念,没有经过分区格式化的磁盘设备是不能使用的,我们在系统中使用df -h看到的/dev/vda1,/dev/vda2是挂载到系统中的vda磁盘设备上所建立的两个分区,这两个分区可能使用了vda整块磁盘容量,也可能只占用了部分容量,因此如果要扩容某台虚拟机,首先要扩容磁盘容量,然后使分区上文件系统识别磁盘大小变化并相应扩容inode数量1 V: l! d8 [! ^
6 u: t$ ]" I9 s! G2 f: t4 ?
再考虑下我们安装虚拟机的过程,新建一块指定大小的磁盘设备,然后在其上新建分区,安装系统。刚新建磁盘设备时,磁盘上并无任何数据,之后新建分区格式化会向磁盘上写入inode, 一旦分区建立,inode数量就也确定,文件系统就形成了。关于inode,可以参考这里理解inode
, D, M; P% L: ]9 z ]" g% U4 y5 ?- ?2 L2 t5 }4 S- |
centos6实例下的扩容) V% j: t3 k# ^7 x% f6 f* x" X& Y' w
7 ^9 W; i- u5 C- Ecentos6默认磁盘格式为ext4,centos7系列使用的xfs,因此扩容方式也不同
+ D4 \% N' U) a6 `8 ?' g: Q+ P! t/ W; Y. i( x Y+ L7 K5 \
根磁盘扩容2 C4 u7 {6 ]+ |* ^
% T2 m: u/ v8 ~7 N: i
测试用的虚拟机为centos6.3系统,我们准备把根磁盘扩容到80G。扩容磁盘大小可以使用qemu-img工具,扩容文件系统主要是使用growpart等工具在系统启动时检测磁盘大小变化,并自动增大分区文件系统inode数量
+ C9 |8 Q4 \# P6 _1 ~) K) o& z
( ]4 S- z5 Y( x* s) A9 z. m/ n#virsh domblklist centos6
9 B1 O! |& I) r) F3 L, S2 j$ vTarget Source
0 T% p% X$ i& k& {------------------------------------------------
( R, g! R' _5 a! I0 vvda /data/test/centos6.qcow2# J5 J; i" e: l
3 z% z D& g9 l5 K. k, `#qemu-img info /data/test/centos6.qcow2
2 N& m" B# o: ~9 ~; t- i# pimage: /data/test/centos6.qcow2
, f) T3 f4 a' r- O; bfile format: qcow2$ h5 ~1 G S! U8 U* H2 @+ u3 C* {
virtual size: 40G (85899345920 bytes)
# D: Y: `6 Y+ N. @/ A- K& edisk size: 1.2G1 X9 w0 D3 b7 \; H( _' p
首先关闭虚拟机,resize磁盘到80G
4 B$ }" L7 G R( L0 u( P/ l
5 D! S5 \4 D. }virsh shutdown centos6# w6 I/ [ l+ F. n
( [6 r, M8 k- w/ {$ K2 F# L; zqemu-img resize centos6.qcow2 +40G
: v/ y9 d5 n* i; J5 n7 l2 x. X2 x+ V) q
#rbd磁盘也可以使用rbd工具 - n: u V# X. D- Q
rbd resize vms/disk.rbd -s 80G6 I1 _6 Y; b" J( u+ P! ^
启动虚拟机,磁盘大小已变为80G,下面扩容其文件系统,需要注意的是,因为根磁盘在虚拟机运行期间处于挂载状态,无法扩容,只能在系统启动期间自动检测并扩容,可以参考openstack官方文档disk-partitions-and-resize-root-partition-on-boot-cloud-init
! ~: a7 G2 }5 C. q
8 F. |$ |& ~9 P3 u- k6 d6 }#安装parted growpart
2 i* m7 U, |8 Urpm -ivh http://dl.fedoraproject.org/pub/ ... 7-10.el6.x86_64.rpm
( G5 j3 v0 G# Q: G# F8 Z0 uyum install parted3 j9 T# ]' m' q3 |) b7 G
* [5 T& p% o2 Z2 p" X2 ?+ [$ Z. Wwget https://github.com/flegmatik/lin ... /archive/master.zip
( K$ a5 q; Z$ x J# y% U6 i* tunzip master
! f, u2 Q4 [% f% M) \2 f( {cd linux-rootfs-resize-master' a3 b9 G7 P5 r- s, H1 T
./install
6 l3 S: s8 N* ]* z- F6 m _, q) n4 y+ E之后重启虚拟机,启动过程中可以看到inode会自动扩容6 `! v5 R4 c3 K+ w/ o4 o4 D) W
. }4 F2 M4 y' L, H6 [- Z" K" b
resize
& ~7 D" v. t6 S/ |4 n; Y6 s% R$ S6 z
- q# L: D6 t2 K8 d% J2 y+ a7 gcentos7实例下的磁盘扩容4 f5 z) [, f' U+ v
3 u" X" {: W( t& M- tcentos7中默认使用xfs格式,下面以xfs磁盘格式为例。* j8 L) g9 u; q& O1 y, X1 [5 [+ D
+ e2 P4 K2 u7 M! e8 \# l
同样,首先关机,扩容虚拟机磁盘, p$ ~8 w! r# j& n B
7 L+ i7 g, h7 R" L0 F& d- c
qemu-img resize centos7.qcow2 +40G 3 Z) p$ Z) P( J* l( ?; C6 v
然后启动虚拟机: v5 K3 W* p3 p* A4 V& B% i. I4 h8 G: D
* f8 Y* Y! B4 ~ i#安装扩容工具
* J8 t y# O# a, m: O7 S1 F6 b#yum install cloud-utils-growpart& v. X) _% s! J, [/ w
) L9 G+ I; W$ o2 c#磁盘已扩为80G
; w; s' x" N& M# {#fdisk -l
' w# h, m1 m: i7 n. r9 O7 P. {+ mDisk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors# e: X% ]6 N0 F7 F
Units = sectors of 1 * 512 = 512 bytes
. w3 m3 @( u8 a6 X. qSector size (logical/physical): 512 bytes / 512 bytes) f; u/ A% \" \- Z
I/O size (minimum/optimal): 512 bytes / 512 bytes* s/ k- j( x& y4 |" W2 H1 \9 p
Disk label type: dos
! c5 S, Q" ~# g! _" ^/ yDisk identifier: 0x000b314e
7 M! a3 F$ G1 U7 @: }9 d }( o9 R: v9 n
Device Boot Start End Blocks Id System* i0 C+ M5 a. X5 X& m
/dev/vda1 2048 33556479 16777216 82 Linux swap / Solaris
6 c- I D |4 ~2 ]/dev/vda2 * 33556480 83886079 25164800 83 Linux
4 g/ u/ T/ y& Z$ C. m
+ Y2 x# C; w* k n% l#根分区仍没变 2 ?7 S- G+ k' S% T; [- M
#df -h
: p8 K" M. N% y' m, MFilesystem Size Used Avail Use% Mounted on
9 a ]( k% H- I# m/dev/vda2 24G 1.6G 23G 7% /
: i" Y' T3 f% n+ W8 J( Kdevtmpfs 2.0G 0 2.0G 0% /dev
: E4 |% a7 A/ W9 e4 k: F e4 P) ^, K5 Ltmpfs 2.0G 0 2.0G 0% /dev/shm$ j2 L4 G7 y& K9 N+ u
5 ~/ y- d" g/ s' {3 q9 q/ v#我们把40G加到分区2上
$ H+ T- K: ]+ p#growpart /dev/vda 2" w1 W7 N$ f U( p1 s5 }4 m
CHANGED: partition=2 start=33556480 old: size=50329600 end=83886080 new: size=134210315,end=167766795
n) Q V$ C& J# j& Z7 x- z0 X, }) x. V. k& f9 N+ k2 x
#然后扩容分区2文件系统 % G4 X8 K* ]7 c4 Z
#xfs_growfs /
8 O' U3 P& W' Y5 B7 u; A- w8 |meta-data=/dev/vda2 isize=512 agcount=4, agsize=1572800 blks
1 s0 s9 K- D, E0 a: U = sectsz=512 attr=2, projid32bit=1
$ U2 ^3 c5 w, s o' |: W. \6 A = crc=1 finobt=0 spinodes=0$ W0 S! u+ l! p# I# h
data = bsize=4096 blocks=6291200, imaxpct=25! f1 c: a* v3 M9 \4 T' ?
= sunit=0 swidth=0 blks5 P7 K) n+ E) p' [5 z
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
. G" c/ U; O, T: a( klog =internal bsize=4096 blocks=3071, version=2
& U& j! S# q6 ^! y( ` = sectsz=512 sunit=0 blks, lazy-count=1% m9 w, X; W R3 V, F% T N+ M
realtime =none extsz=4096 blocks=0, rtextents=0
' ?! C, d; j6 Udata blocks changed from 6291200 to 167762890 e% [( B: ]. b1 q
常见虚拟机磁盘格式间的转换, j# \' w9 v: r* }& Y
9 o3 J9 Y. @8 Q& ~5 @; e5 G: U这里简单记录下不同磁盘格式间的转换,注意centos6的宿主机qemu-img命令不支持rbd格式
: F1 X+ U0 c" U2 u% G) T4 n
/ N4 q+ M1 S' c/ N/ T9 S* m#qcow2磁盘压缩 + e0 f! H1 m2 Z8 C
qemu-img convert -c -O qcow2 centos.raw centos.qcow2
7 L% A. G) g1 {8 A+ Q T6 }7 G% u; G- L
-f: 源文件格式,qemu-img会自动检测,可以省略' ~1 F3 |6 u7 @ j, r( v
-c: 启用压缩,qcow2格式才支持
9 l6 @5 R2 ~* q2 G& ~# }) q-O: 目标镜像格式
$ Z8 m' T0 c! a7 y8 L* b E/ Z- y, A6 f( Q' c" R* i
#lv卷转qcow2格式 / o" [) X& p" M' |) O
qemu-img convert -O qcow2 /dev/CentOS_kvm/centos6_6_163 centos6_6_163.qcow20 p+ p, y8 k1 O: o8 g. z% A
6 z* `' k' Y! o3 S" R#qcow2格式转换为lv格式) }, l2 p8 n# Y
qemu-img convert -p -O raw centos6_6_163.qcow2 /dev/CentOS_kvm/centos6_6_163 . E1 ]5 T$ j3 w# i+ P# W+ T
3 X% x% l* Z8 G& v! J#rbd块转qcow2. _/ G9 X r$ d0 O& m$ a' C
qemu-img convert -O qcow2 rbd:vms/centos7.rbd centos7.qcow2/ n* U, m: M/ ]7 x3 t0 a
) Y* U- s$ S+ N2 B. X
#qcow2转为rbd格式$ c0 i. u. ^0 W R" z3 ^
qemu-img convert disk.qcow2 rbd:vms/disk.rbd7 [, ~( Y- N J" o4 P6 k$ q$ v$ M
virt-resize
1 \& W. l8 X- [7 n
; Y8 [% p: e$ o7 ?) h当然,virt-resize工具也能够扩容虚拟机磁盘,例如现有一个16G的qcow2格式的centos镜像,需要扩容到50G7 f% Q* M" P0 k1 o
( @9 T( j* a) z7 ~
查看分区
8 Q& m# c: F: k, p% ^virt-filesystems --long --parts --blkdevs -h -a /data/images/centos.qcow23 p, c2 k7 H- s d- O- G, B- R
创建新镜像,大小为50G,要比旧镜像大
2 E5 f3 C1 [" ]) [7 W! Kqemu-img create -f qcow2 /data/images/centos-50g.qcw2 50G
$ N2 q$ U5 O V) d* M9 |9 Q扩容虚拟机sda2分区
3 y! O, M. t5 dvirt-resize --expand /dev/sda2 /data/images/centos.qcow2 /data/images/centos-50g.qcow2 |
|