|
|
本文所使用宿主机,及kvm版本如下
7 T4 {7 k6 W" f$ `
/ J3 Q# P) f! U+ [! o/ e#cat /etc/centos-release
9 G4 I$ I+ b7 m% i, h6 HCentOS Linux release 7.2.1511 (Core) ( |* `+ m0 J- l: L/ U
6 y" m$ A8 a2 ^
#rpm -qa |grep qemu( ^) {' _' R! e' ]7 [. t* [
qemu-img-1.5.3-105.el7_2.4.x86_64) ]2 B) L& ?& ]; z/ U7 X. l. i* L+ W
qemu-kvm-common-1.5.3-105.el7_2.4.x86_64
% |6 {: s8 Q3 x/ V' {7 e6 Uqemu-kvm-1.5.3-105.el7_2.4.x86_64# W" k; _ {9 @- ?* ~0 c+ w' X
libvirt-daemon-driver-qemu-1.2.17-13.el7_2.5.x86_64
1 i3 I' [1 @) s0 P' N: b- f几种磁盘格式介绍4 s" W, k& C* G1 V6 E5 ^% Q. ~
0 E! y9 v, W8 \/ B" B/ l3 h# ~. x1 {
qcow2
3 n6 H0 i4 ~' Y- B) z2 e
* ?8 c! O% G' F+ w/ ]" v( z0 O" oqcow2是qemu模拟器支持的一种磁盘镜像。它可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的raw格式相比,有以下特性
0 a9 s w1 R* B- ^9 o1 A- y3 o
2 c, r+ @- U$ g; b更小的空间占用,即使文件系统不支持空洞(holes)
# c! m' e, D8 n- N4 b& y支持写时拷贝(COW, copy-on-write,镜像文件只反映底层磁盘的变化' Q' @ k! d: ?- P* v; R7 \3 i
支持快照(snapshot),镜像文件能够包含多个快照的历史(快照链,backfile)
: Y& n3 W+ R3 Y/ d9 e2 \" Y可选择基于 zlib 的压缩方式2 w* ]: c) D: e; n$ B4 S
创建qcow2磁盘格式
# p& A" |9 F6 Y. i2 y
9 |& e S6 r/ u2 t) I2 |#qemu-img create -f qcow2 disk1.qcow2 40G: ~* Y' {/ ~: a; ]* @8 o
Formatting 'disk1.qcow2', fmt=qcow2 size=42949672960 encryption=off cluster_size=65536 lazy_refcounts=off
" G- I6 R- R' F& j+ Z( \9 h4 @" N% ]1 R7 y4 Q7 \" y
#qemu-img info disk1.qcow2 9 F; X. \. }/ H, l8 }/ y6 N
image: disk1.qcow26 q4 B+ h/ p0 S1 R. @1 c
file format: qcow2/ G1 a( x/ s! p" j: o" ?
virtual size: 40G (42949672960 bytes)
8 ~; h6 a5 B |& \& D+ g* x...
7 U- |$ r) s# V$ e8 j/ \: U! b3 v
/ H1 \/ _+ |8 ~& |; c4 W0 ^5 M#ls -lh disk1.qcow2 , q3 Q3 y$ d2 M/ w: t
-rw-r--r-- 1 root root 193K Apr 22 16:13 disk1.qcow28 Y8 z" a% ]& z3 f4 T( Y5 ]
raw
; S! |3 A; ~! N" {4 x; o8 u$ o
4 B5 Z2 k$ y, c }7 A) m& U' Braw格式是最常见的一种磁盘格式,平常所使用的文件,iso镜像等都是raw格式
4 l* a3 e. v* ~; c6 K: X. J& H; M3 E8 a* M( C; ~' t" ?
#qemu-img info /etc/passwd' _0 W& S9 \0 O1 _ w y
image: /etc/passwd3 G: }, a% N/ O. m0 X3 N/ w) F
file format: raw
( b4 Z% u: ^7 |8 D0 f: Pvirtual size: 2.0K (2048 bytes)2 T1 O9 W* `9 Y/ [
disk size: 4.0K" K8 O& J) l& s) F3 N' D8 i d8 \
. m" h, R7 c, D#qemu-img create -f raw disk2.raw 40G' B& ~; l( u) m8 Y# r
Formatting 'disk2.raw', fmt=raw size=42949672960
, T$ y+ u7 f; W2 G7 J5 W5 {$ R
9 q5 X. d0 H: Z% p* d+ L, V#qemu-img info disk2.raw * s0 y* k; y7 f5 `, N F% i3 {2 O5 w: B
image: disk2.raw
( \4 @, a- t5 s& E: a! @file format: raw
& {$ j& R, Z8 K- T. l( Wvirtual size: 40G (42949672960 bytes)3 E6 }7 k" e1 _" a# H9 s; f
disk size: 0
. B- i- r! C! z5 G
) F( c! r2 l1 Y( h ^" U/ c: p1 L#ls -lh disk2.raw . H& v: e* C0 O. Z x
-rw-r--r-- 1 root root 40G Apr 22 16:15 disk2.raw& t! d g* v0 q' ~' X
RBD0 ~0 x$ }3 {! c9 q$ D3 s6 u# s
, F5 j& r4 l8 n. C0 L' @# ]' y
rbd是ceph提供的块设备,与物理磁盘,LV卷一样,可以在其上安装系统,或者挂载到实例上作为数据盘
5 Z! ^( P( u/ K( H, K3 A) t" p9 k4 ~3 G6 G# H8 r5 f
#centos7下的qemu-img支持创建rbd格式磁盘
: v F+ y% T2 x2 C. j0 [ x+ P#qemu-img create rbd:vms/disk3.rbd 40G
~4 E W4 {' [: RFormatting 'rbd:vms/disk3.rbd', fmt=raw size=42949672960 cluster_size=0
! v4 @ c, x, ?4 [$ x# q; P$ P
2 k- E5 {3 \4 y# ]& k' M#qemu-img info rbd:vms/disk3.rbd
* M3 p, }( g, x( K4 o( Zimage: rbd:vms/disk3.rbd- N: C, l6 f7 q: ~
file format: raw
( s8 s! v4 b" E: uvirtual size: 40G (42949672960 bytes)8 q. f9 q0 x4 \! p6 N7 I
disk size: unavailable
# C& Z. y8 ~* N% C关于磁盘设备与文件系统
# ^9 D, A! M% D( S6 x5 W# t" @. G2 I7 O# j7 X
扩容前,我们先了解下磁盘设备与文件系统,这是了解磁盘扩容的基础
3 y, n* E' z1 G' O1 K- b4 M
1 v: I5 m( z0 I. M假如有一台40G根磁盘的centos6虚拟机需要扩容到80G。首先关机,然后使用qemu-img resize disk +40G扩容系统盘到80G,启动虚拟机,使用fdisk命令可以看到磁盘大小为80G,然而使用df -h查看却仍为40G左右,并没有增大。真正能供我们写数据的大小仍为40G
9 c, }3 i# H& [! H j; r
0 I ]6 s0 w: x+ v文件系统类型很多,ext3/ext4/xfs/btrfs等,文件系统是建立在磁盘分区之上,像UUID,inode这些是文件系统层级的概念,没有经过分区格式化的磁盘设备是不能使用的,我们在系统中使用df -h看到的/dev/vda1,/dev/vda2是挂载到系统中的vda磁盘设备上所建立的两个分区,这两个分区可能使用了vda整块磁盘容量,也可能只占用了部分容量,因此如果要扩容某台虚拟机,首先要扩容磁盘容量,然后使分区上文件系统识别磁盘大小变化并相应扩容inode数量
+ P- k9 O4 x! I0 K- g4 B6 k7 {7 _7 T' K: N% r7 f& D
再考虑下我们安装虚拟机的过程,新建一块指定大小的磁盘设备,然后在其上新建分区,安装系统。刚新建磁盘设备时,磁盘上并无任何数据,之后新建分区格式化会向磁盘上写入inode, 一旦分区建立,inode数量就也确定,文件系统就形成了。关于inode,可以参考这里理解inode
0 s2 O: y* ^' V. f9 o* y x
* B4 j, a. W# y, y4 Bcentos6实例下的扩容
3 ~. G0 _! `6 v: w4 l2 D2 N3 {0 d+ r. E+ a4 M6 W+ ~# p- [+ @
centos6默认磁盘格式为ext4,centos7系列使用的xfs,因此扩容方式也不同
, l; @0 Z3 r5 R2 W* N; {0 S' v9 t& E+ O
根磁盘扩容
! {) A2 k* k; }/ J+ u+ B* c* i0 u7 f: ]
测试用的虚拟机为centos6.3系统,我们准备把根磁盘扩容到80G。扩容磁盘大小可以使用qemu-img工具,扩容文件系统主要是使用growpart等工具在系统启动时检测磁盘大小变化,并自动增大分区文件系统inode数量/ j+ N, J& K E3 P2 u0 Y
3 W5 k' F9 N' ]1 W; Z$ ~#virsh domblklist centos6
7 Y/ B$ L7 [5 o/ a/ b& n7 STarget Source
5 ?: R" x/ a; e" U------------------------------------------------
! H( l1 i8 g4 `" Z( i- Q* ivda /data/test/centos6.qcow26 O9 w8 }" b1 U& j8 O9 M( ]/ v5 O
9 G0 E( T* O v& B; F7 N% w
#qemu-img info /data/test/centos6.qcow2
3 |, b. ?+ H/ v1 @, {" v5 d1 Nimage: /data/test/centos6.qcow2
/ f! d" h- b7 I ]- `* vfile format: qcow2
: {3 u9 F$ D3 B! {+ ovirtual size: 40G (85899345920 bytes)
+ O. k5 ~; L2 K5 U. q; o( m6 B4 Qdisk size: 1.2G
$ e1 V, B. ?7 H# _ W首先关闭虚拟机,resize磁盘到80G
3 S/ V9 F H+ {& e
! t- D; F: G$ Q3 j# e. L8 s5 {% Hvirsh shutdown centos6
: C& W% ?* E+ Z
+ q: d3 f8 |) @5 Hqemu-img resize centos6.qcow2 +40G
4 n7 r. N, {9 m
' p7 F0 g/ @* c- ]#rbd磁盘也可以使用rbd工具 1 z% B' i9 B2 U0 I( R
rbd resize vms/disk.rbd -s 80G
' t. Q/ Q6 v5 n/ g$ |0 j G7 {启动虚拟机,磁盘大小已变为80G,下面扩容其文件系统,需要注意的是,因为根磁盘在虚拟机运行期间处于挂载状态,无法扩容,只能在系统启动期间自动检测并扩容,可以参考openstack官方文档disk-partitions-and-resize-root-partition-on-boot-cloud-init
L3 f, I# S. m" ~, ~& l1 g: M6 I) H4 L: U3 ~# H# ]' h' {
#安装parted growpart/ v; @7 P- u" h4 ~" \4 p
rpm -ivh http://dl.fedoraproject.org/pub/ ... 7-10.el6.x86_64.rpm% V& B; I+ }4 d* @
yum install parted
$ w* t4 w s: F- A T5 u( S
! B/ h! O" g5 p; j0 twget https://github.com/flegmatik/lin ... /archive/master.zip
8 f( I1 {" i( P5 D; ~unzip master( D$ Q7 K C( }7 _4 x4 q! {
cd linux-rootfs-resize-master" P( T/ E3 }8 l9 t6 Y: E* o! u1 v! S
./install
0 L; v4 E5 N+ |; M5 v, m之后重启虚拟机,启动过程中可以看到inode会自动扩容+ p7 ?% y+ Y. u" f1 Y! D1 [
/ _& j. R! L0 `
resize4 a, c, f& B0 U2 o7 s& \
( o* v$ A# ]* ~) f6 mcentos7实例下的磁盘扩容
( p+ @8 n2 r. U0 J0 L3 }5 L" Y }- s1 p6 n. h
centos7中默认使用xfs格式,下面以xfs磁盘格式为例。4 c3 x5 Y7 e, ^$ Q# }+ Z
/ J% @: R1 ~5 G" C; K
同样,首先关机,扩容虚拟机磁盘
( E# t6 S% }7 h& C2 z8 s
5 y9 ]; R6 m, Z6 a yqemu-img resize centos7.qcow2 +40G
, ^8 M- A: e5 G( o% A a然后启动虚拟机7 M5 S0 G" V3 h, s' u
0 }+ S# c+ T+ N& V5 U) l5 `. o! o#安装扩容工具
! s" d9 L( X3 B+ n9 R* p: \& R- g- ?#yum install cloud-utils-growpart
* K, t! S+ B* u! w; n
( N& R, ~2 x" h0 d" B4 U#磁盘已扩为80G
/ G& {! s6 m' s$ Q- ^+ n: e#fdisk -l4 e! q0 s* T: r. c& `6 x- k* l. v
Disk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors
8 Z% J! m, g% B+ [Units = sectors of 1 * 512 = 512 bytes1 v7 ^8 a( k" r( L- k E: o3 H P
Sector size (logical/physical): 512 bytes / 512 bytes9 N" k6 H8 A0 _7 D8 Q' J8 F. F3 w
I/O size (minimum/optimal): 512 bytes / 512 bytes! ~2 e) Y" O3 L9 u; Q n
Disk label type: dos
M" q$ }& \& {5 }Disk identifier: 0x000b314e
0 a: [8 ~9 L% c& S5 d0 s$ R2 @$ N9 _
Device Boot Start End Blocks Id System" Z6 X* U& U; p: p
/dev/vda1 2048 33556479 16777216 82 Linux swap / Solaris8 K8 r H+ w5 W$ t8 F
/dev/vda2 * 33556480 83886079 25164800 83 Linux
: |/ e5 a2 _" o6 r6 p) j: I- ?# k6 U3 x% w( K
#根分区仍没变
2 }+ q" A' C% m#df -h
' l) z! b4 A1 R; IFilesystem Size Used Avail Use% Mounted on1 m7 g; S* F/ x* G9 t
/dev/vda2 24G 1.6G 23G 7% /$ Q9 [7 X* K; l4 U- i
devtmpfs 2.0G 0 2.0G 0% /dev
, ?2 P" _" U/ f- N8 G# `tmpfs 2.0G 0 2.0G 0% /dev/shm
/ I0 S) r8 `; C' `) j
- |8 n: F7 n' O1 r5 y- q; S#我们把40G加到分区2上
8 e+ y! j5 X$ @/ @8 X#growpart /dev/vda 2
( U3 c& w, L) H3 b9 j4 V2 W# DCHANGED: partition=2 start=33556480 old: size=50329600 end=83886080 new: size=134210315,end=167766795
# E7 B) [* S. @: K/ g) V9 M# a" u" i/ L) ]! \! z0 U
#然后扩容分区2文件系统 + F5 h/ [; `! e! z- L4 r
#xfs_growfs /& ~8 g. J% A; O( D
meta-data=/dev/vda2 isize=512 agcount=4, agsize=1572800 blks: L) C: d6 j5 s
= sectsz=512 attr=2, projid32bit=11 U4 i0 g- v$ {
= crc=1 finobt=0 spinodes=0
+ S: z! B; T, g7 A6 Y& D; Z9 Ddata = bsize=4096 blocks=6291200, imaxpct=25
2 z" V7 _& D% t- P# P! I7 u = sunit=0 swidth=0 blks
$ n" b6 _2 ~! @3 p3 m/ Dnaming =version 2 bsize=4096 ascii-ci=0 ftype=1; P$ @; }2 E; s4 z# @9 X
log =internal bsize=4096 blocks=3071, version=2" C% x7 z5 Y. s5 A1 Y5 @ D" J
= sectsz=512 sunit=0 blks, lazy-count=1
* i" s8 b( E5 U' urealtime =none extsz=4096 blocks=0, rtextents=0
& f* X$ o0 f2 H( Edata blocks changed from 6291200 to 16776289, I3 s1 a p+ U& w$ q/ \2 Y7 H w. P- _
常见虚拟机磁盘格式间的转换
3 i/ [1 z6 o E: _ T* @6 {2 q" l o8 }
5 X" Z& Q, o( C: i& r7 R" d" w这里简单记录下不同磁盘格式间的转换,注意centos6的宿主机qemu-img命令不支持rbd格式
3 g( |' M' p0 Z) N5 x, ]1 P. c$ K7 @' @6 L4 ^; J
#qcow2磁盘压缩 $ o; k R; H7 B, N/ e
qemu-img convert -c -O qcow2 centos.raw centos.qcow2
$ c1 Z7 j% `) m& u4 T) r& c0 G' n, d' \; ` A/ f0 `$ A& v
-f: 源文件格式,qemu-img会自动检测,可以省略( v& H1 ~9 ]! M* j: X3 s
-c: 启用压缩,qcow2格式才支持: `$ n2 C' `& M
-O: 目标镜像格式1 M! D. m, ]: c7 ?+ x
$ o( `0 u& z0 I# k
#lv卷转qcow2格式 4 U. D& y$ v! x6 D. q1 g
qemu-img convert -O qcow2 /dev/CentOS_kvm/centos6_6_163 centos6_6_163.qcow2! \4 S% n1 S7 t) h/ Q* P
) Y6 y; l% L" R4 _- @8 p8 P6 h5 M
#qcow2格式转换为lv格式
2 n! a% h9 y# ]qemu-img convert -p -O raw centos6_6_163.qcow2 /dev/CentOS_kvm/centos6_6_163 ) G1 K5 ]# s. g) F
; j& d; _+ R4 Y- L( ^/ e6 e#rbd块转qcow2
: g2 y, ^( W% e! gqemu-img convert -O qcow2 rbd:vms/centos7.rbd centos7.qcow2* s- V0 y1 h1 [" c8 t
: i8 @7 X- G8 j) K, C+ v/ V4 H#qcow2转为rbd格式
6 E5 I4 Q$ |2 @0 kqemu-img convert disk.qcow2 rbd:vms/disk.rbd4 K; u7 |5 m/ _! |9 ?& ~! g8 Q0 K
virt-resize
6 u( R: M3 d, @$ b' T9 B e- L K5 C' o7 M: W1 A0 {
当然,virt-resize工具也能够扩容虚拟机磁盘,例如现有一个16G的qcow2格式的centos镜像,需要扩容到50G- o% J# e2 p1 K% U% {2 Q
( {$ U, a# B$ G! r- S5 M5 i* G8 E查看分区
2 O, j% F2 }% B9 n5 j; uvirt-filesystems --long --parts --blkdevs -h -a /data/images/centos.qcow2% R6 Y3 r/ p4 i+ ^6 r/ U' I
创建新镜像,大小为50G,要比旧镜像大
1 c W2 V |$ ~# Vqemu-img create -f qcow2 /data/images/centos-50g.qcw2 50G1 i( [! n1 ~% \. Q% x* e; m
扩容虚拟机sda2分区
. x8 V' m3 g2 p& N5 q- u7 fvirt-resize --expand /dev/sda2 /data/images/centos.qcow2 /data/images/centos-50g.qcow2 |
|