|
|
本文所使用宿主机,及kvm版本如下
/ z& u4 A3 S. R, b' |
9 f; l4 p& o- d& v#cat /etc/centos-release; w: c8 K7 B5 j/ l
CentOS Linux release 7.2.1511 (Core)
; g x# c4 S" s2 J
9 ?' l" Q4 r: f; ^#rpm -qa |grep qemu
, a% _. [/ a5 z/ P0 o0 Jqemu-img-1.5.3-105.el7_2.4.x86_64. C. L- }# l1 c9 L
qemu-kvm-common-1.5.3-105.el7_2.4.x86_648 i7 t6 P8 n0 Z. U7 N; R- J. {
qemu-kvm-1.5.3-105.el7_2.4.x86_64
+ m2 m* Y) j! ?4 Ylibvirt-daemon-driver-qemu-1.2.17-13.el7_2.5.x86_64- W$ y. R6 ^0 E; s
几种磁盘格式介绍7 j) S4 X, Z/ V. C6 i) ?$ Q9 X
- D7 K; p' K3 c ]2 T; kqcow2
% \; W% H' {4 u1 Z& o
p4 t2 h& j) R$ W( Gqcow2是qemu模拟器支持的一种磁盘镜像。它可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的raw格式相比,有以下特性
0 t+ m+ g M& O0 F3 Y1 R- H5 F8 @% c7 g9 t2 x
更小的空间占用,即使文件系统不支持空洞(holes)& t% u5 X$ y6 u8 M" C
支持写时拷贝(COW, copy-on-write,镜像文件只反映底层磁盘的变化& [' F7 Y0 P. }+ _9 y& s8 c
支持快照(snapshot),镜像文件能够包含多个快照的历史(快照链,backfile)# S" b5 p8 Q: [. k0 s
可选择基于 zlib 的压缩方式
4 x, I% J. N" s创建qcow2磁盘格式( k7 G! Z/ B( M% | m
1 E6 A" {2 I6 f# z/ v( [! d2 T" m#qemu-img create -f qcow2 disk1.qcow2 40G8 ]3 P; M6 R0 C1 L! r
Formatting 'disk1.qcow2', fmt=qcow2 size=42949672960 encryption=off cluster_size=65536 lazy_refcounts=off # F ]4 ~- j9 y
0 N; C2 `+ u$ n: s: K/ U. G) f
#qemu-img info disk1.qcow2
1 e: p R: g: r% J8 A) ]7 i7 Uimage: disk1.qcow2, J" N8 Q ^3 G5 k: k
file format: qcow2
% n7 p% l: i5 p% s/ Z8 }( @virtual size: 40G (42949672960 bytes)% I( w# D1 i m' n9 ^4 a6 c
...
$ I" `& U2 T( @; h# Z$ ~1 U: D/ Y7 w3 F
#ls -lh disk1.qcow2
# Y0 R4 D% e2 t2 j-rw-r--r-- 1 root root 193K Apr 22 16:13 disk1.qcow2
0 j- ~) o: B1 C' Z5 i# Uraw
6 L) T) y; ~5 b/ u* \1 v. m! h. M% ]
raw格式是最常见的一种磁盘格式,平常所使用的文件,iso镜像等都是raw格式# s, r5 e/ o( C& V1 Z7 [
! f; q5 g3 c8 f
#qemu-img info /etc/passwd) @2 i5 W" R- ]: E
image: /etc/passwd
7 ?) A" T/ o9 H* l* {file format: raw
2 Z) F8 U( U2 d3 [7 k# e7 vvirtual size: 2.0K (2048 bytes)8 v3 P# ?3 R3 ?/ M; L
disk size: 4.0K' Z, b) A* [0 ]( j
/ ^2 g2 d+ [, K c6 N% O
#qemu-img create -f raw disk2.raw 40G
3 h9 J* Z4 S8 B% _: CFormatting 'disk2.raw', fmt=raw size=42949672960 $ v5 f2 \: e2 [ d/ P
, l. T3 u8 Z6 Y3 M0 n- J#qemu-img info disk2.raw
2 r6 k+ S% L% U3 A% g2 eimage: disk2.raw
" M2 M0 T, J9 ^1 {, X, Z+ Zfile format: raw8 Z& ~& Q% F% J; O5 ?
virtual size: 40G (42949672960 bytes): D" Q; Z0 i$ R% ~+ x
disk size: 0
4 J' D( C% r9 Z9 U+ v9 W0 Q6 m
9 C& w' x; C% U0 K( L0 e#ls -lh disk2.raw
" l& I( r4 @+ U-rw-r--r-- 1 root root 40G Apr 22 16:15 disk2.raw5 H3 j: C1 X, ~2 D! a) ?
RBD l' j$ m1 T/ H1 A
( a$ D. t& `. C( erbd是ceph提供的块设备,与物理磁盘,LV卷一样,可以在其上安装系统,或者挂载到实例上作为数据盘. Q8 N& C6 L2 M- b
' |' u. g+ l% ^#centos7下的qemu-img支持创建rbd格式磁盘 ) ^- A8 i) v! J$ v
#qemu-img create rbd:vms/disk3.rbd 40G . e8 X& k& }7 F
Formatting 'rbd:vms/disk3.rbd', fmt=raw size=42949672960 cluster_size=0
3 F7 w" H& R1 ^. e0 T
" z/ V$ T$ r% I* C: I#qemu-img info rbd:vms/disk3.rbd( m; E$ x4 y0 V' x; f
image: rbd:vms/disk3.rbd. f: L8 u3 c, a) x P& `8 g5 D
file format: raw
- X$ b& K9 ^6 z: A% U7 t( k: Lvirtual size: 40G (42949672960 bytes)" o* o' [2 ]/ k/ }$ c1 X* G
disk size: unavailable 5 O7 F8 H6 f& j ]3 k
关于磁盘设备与文件系统
8 o0 J% e1 W0 g7 K5 b) ]% [4 |" m' {7 A L" ?
扩容前,我们先了解下磁盘设备与文件系统,这是了解磁盘扩容的基础
9 _1 `) O% |! V3 ]- r3 T& R$ {4 K+ u. {+ v5 q
假如有一台40G根磁盘的centos6虚拟机需要扩容到80G。首先关机,然后使用qemu-img resize disk +40G扩容系统盘到80G,启动虚拟机,使用fdisk命令可以看到磁盘大小为80G,然而使用df -h查看却仍为40G左右,并没有增大。真正能供我们写数据的大小仍为40G
3 B6 a j( f/ V' J7 H- q, C8 x
文件系统类型很多,ext3/ext4/xfs/btrfs等,文件系统是建立在磁盘分区之上,像UUID,inode这些是文件系统层级的概念,没有经过分区格式化的磁盘设备是不能使用的,我们在系统中使用df -h看到的/dev/vda1,/dev/vda2是挂载到系统中的vda磁盘设备上所建立的两个分区,这两个分区可能使用了vda整块磁盘容量,也可能只占用了部分容量,因此如果要扩容某台虚拟机,首先要扩容磁盘容量,然后使分区上文件系统识别磁盘大小变化并相应扩容inode数量
- l: \- [, m! t' Q d* A7 t# G: j
: G, x+ F6 D1 _! p1 }. I1 a再考虑下我们安装虚拟机的过程,新建一块指定大小的磁盘设备,然后在其上新建分区,安装系统。刚新建磁盘设备时,磁盘上并无任何数据,之后新建分区格式化会向磁盘上写入inode, 一旦分区建立,inode数量就也确定,文件系统就形成了。关于inode,可以参考这里理解inode2 D' r8 u1 u$ j! u l* u6 s
+ S8 m/ X& U" J( X$ p: M: q; d" Kcentos6实例下的扩容4 @, Y; \2 K% q
, G5 u7 g1 e% Q# c7 P
centos6默认磁盘格式为ext4,centos7系列使用的xfs,因此扩容方式也不同
5 l! v8 ~3 P1 b! d3 z* S% V; o4 D9 `8 X7 j7 i A- X
根磁盘扩容
9 |! |: O( y% r4 J1 z
% i Z* e' a) N, c1 F测试用的虚拟机为centos6.3系统,我们准备把根磁盘扩容到80G。扩容磁盘大小可以使用qemu-img工具,扩容文件系统主要是使用growpart等工具在系统启动时检测磁盘大小变化,并自动增大分区文件系统inode数量0 I7 {" S' R/ s7 ^( ?
( P" \7 h9 A$ G. y% \ d3 d
#virsh domblklist centos6
( g0 y% e) w6 U# D2 F( l: yTarget Source8 t' V( C2 I, {7 j+ H& u* C, T* T; H. j
------------------------------------------------3 |0 @3 F0 Z$ S' y5 V1 _4 K
vda /data/test/centos6.qcow2
. P4 E& ]8 m( F/ v7 s2 z2 R
. S) R, I2 ^% t2 N2 ?8 }8 t#qemu-img info /data/test/centos6.qcow2
- f- U0 h6 i: r: G+ Vimage: /data/test/centos6.qcow2& I2 [% |7 D6 M0 Y7 b& o: [
file format: qcow2) O9 P4 C$ D! K4 y% I
virtual size: 40G (85899345920 bytes). W( o) C' A: S+ d0 f6 P, m4 I
disk size: 1.2G' g# n N1 E2 I; K
首先关闭虚拟机,resize磁盘到80G% D2 l* k! }3 g: H
, m0 S; [9 X- ?% [5 `5 lvirsh shutdown centos6
1 _4 P5 t, q% d8 H/ j' K: }- F0 `4 M c
qemu-img resize centos6.qcow2 +40G7 N6 ]" b1 ~8 B6 h3 b `' u5 D
- y2 X! e/ o0 S- c' z#rbd磁盘也可以使用rbd工具
2 P5 k- C: `; r: {$ V& rrbd resize vms/disk.rbd -s 80G
7 K3 q% G6 v4 q# k* N9 k Q( S启动虚拟机,磁盘大小已变为80G,下面扩容其文件系统,需要注意的是,因为根磁盘在虚拟机运行期间处于挂载状态,无法扩容,只能在系统启动期间自动检测并扩容,可以参考openstack官方文档disk-partitions-and-resize-root-partition-on-boot-cloud-init
6 n7 m* Y r: A4 H! i2 D
@: ?+ m0 [- d/ M#安装parted growpart
3 R( |+ p, b8 M, p$ d$ R& |rpm -ivh http://dl.fedoraproject.org/pub/ ... 7-10.el6.x86_64.rpm& b# ^1 H: z" G4 G3 T* r4 j
yum install parted. y7 ?, C( M- |% m2 w
A; _$ [8 h ^" D, z# v1 r8 uwget https://github.com/flegmatik/lin ... /archive/master.zip
+ T# [/ n; @% K4 C# Wunzip master. E9 \8 A' e. f+ d
cd linux-rootfs-resize-master
, }/ Y" u5 D4 H& j% L& a/ L/ r./install
: V" }6 c1 E' T( a3 S$ G" J之后重启虚拟机,启动过程中可以看到inode会自动扩容
B& b- _8 g- j0 f4 D& I- l( |* g) v
resize
" X: n1 j' z! L2 O' _2 z8 |
8 a% N# p( l" V& i3 hcentos7实例下的磁盘扩容
3 d& m, N$ P+ `5 S: u& f' \- _- d. i# V; j# d) ~( z& l2 q
centos7中默认使用xfs格式,下面以xfs磁盘格式为例。
( n k- M5 |7 C0 s' ~8 E2 b! u3 _4 W# S( M
同样,首先关机,扩容虚拟机磁盘! Y6 x) _% I# y2 W+ ]0 A8 _7 x
7 Y0 R+ _( s2 Vqemu-img resize centos7.qcow2 +40G / |% R6 g" r" i
然后启动虚拟机
( F- P |9 @3 z. c! U7 V" P' U9 S& O) i9 m" X4 _
#安装扩容工具
' ?' N6 c& i% J7 {#yum install cloud-utils-growpart
5 C5 Q) c0 A1 D& Q3 i
9 e- j, H- w3 P9 U) o#磁盘已扩为80G
$ {1 i7 M+ a2 @! d4 `" Y/ q7 d. J8 h& c#fdisk -l
. @# R0 ?% p1 i, yDisk /dev/vda: 85.9 GB, 85899345920 bytes, 167772160 sectors
4 ?: m( X. F. W8 P# a0 k9 T4 ZUnits = sectors of 1 * 512 = 512 bytes
- q6 e. d' e# a% _! HSector size (logical/physical): 512 bytes / 512 bytes
# l# T+ F1 m$ _$ Z5 z1 W) U! mI/O size (minimum/optimal): 512 bytes / 512 bytes
4 p- `7 G; d# V# M: n9 UDisk label type: dos* ^1 @- f# Q' m$ h
Disk identifier: 0x000b314e3 t B& s: Y; [3 a: V* X
- B8 i* B! y' q& y6 J$ y Device Boot Start End Blocks Id System9 e% U0 K& ~) u* i
/dev/vda1 2048 33556479 16777216 82 Linux swap / Solaris
" o, e( }+ K4 `# a9 j/dev/vda2 * 33556480 83886079 25164800 83 Linux, g# e5 F5 r. X) A5 n; K" Z
+ w6 J2 x- ]( q9 B
#根分区仍没变 * |( u4 d) b# k
#df -h$ j& T8 S" i; m ~0 Z
Filesystem Size Used Avail Use% Mounted on/ J$ P; z' b$ o3 } m* v
/dev/vda2 24G 1.6G 23G 7% /1 m+ a0 z R/ G( `# Z4 U& ^8 Z/ B
devtmpfs 2.0G 0 2.0G 0% /dev% r0 D! s9 i, ?7 G G) n o1 x/ ?
tmpfs 2.0G 0 2.0G 0% /dev/shm3 r, z9 \4 _6 Y( Y' J
) N, L/ h f/ z4 X$ w1 D' g
#我们把40G加到分区2上
8 }8 L( o2 ^; }( u- L#growpart /dev/vda 21 [4 f& C4 a9 i
CHANGED: partition=2 start=33556480 old: size=50329600 end=83886080 new: size=134210315,end=1677667955 I* F% t7 g# k' a: g, ~* v3 s
+ T' q/ P! W3 W* Y8 G/ l
#然后扩容分区2文件系统
- v! g1 ~% z1 D) F5 W) L) c#xfs_growfs /
+ _$ J. J( f% `9 S! D" Bmeta-data=/dev/vda2 isize=512 agcount=4, agsize=1572800 blks0 i& B6 P9 ]- l, M7 `" Z. a7 k
= sectsz=512 attr=2, projid32bit=1( K3 O, e- w% V2 T& l
= crc=1 finobt=0 spinodes=08 |, v! T1 w. k* h" }! ^
data = bsize=4096 blocks=6291200, imaxpct=25
! y: k1 ~- m* l' ~! C+ Y7 j% Z = sunit=0 swidth=0 blks
7 j. K* B0 y- k: \6 g( I1 Z6 n) cnaming =version 2 bsize=4096 ascii-ci=0 ftype=1* }* s' z6 r8 c+ @! r2 b
log =internal bsize=4096 blocks=3071, version=2- z0 y0 D9 r) J, H1 j/ E
= sectsz=512 sunit=0 blks, lazy-count=10 k* o6 _, C8 T
realtime =none extsz=4096 blocks=0, rtextents=06 b( F1 c& v' G3 z
data blocks changed from 6291200 to 16776289) a6 M& L! S. n5 g5 p: o; {+ y
常见虚拟机磁盘格式间的转换- u5 d' a5 Q& S8 U) e
5 K1 O$ N7 K) d2 c* J P0 K
这里简单记录下不同磁盘格式间的转换,注意centos6的宿主机qemu-img命令不支持rbd格式
" j# `* U/ q4 I, [3 }3 ~/ f
7 g; R' I/ r- Q5 X4 T, |#qcow2磁盘压缩 5 y' s, |8 ?6 s. k
qemu-img convert -c -O qcow2 centos.raw centos.qcow2& Q- G. t9 r0 E, K/ n
& x; c3 X' f8 S-f: 源文件格式,qemu-img会自动检测,可以省略7 Q0 T2 z# ~1 y U% `% A# \, C8 S
-c: 启用压缩,qcow2格式才支持' n7 Z+ k) [! n! H. k1 \0 ]
-O: 目标镜像格式& |$ H, b' C: Q: q6 }" ~
) \# L1 f3 {9 ~' U5 m' I1 a( ^ n#lv卷转qcow2格式 , c0 x6 b* u! @: f/ U
qemu-img convert -O qcow2 /dev/CentOS_kvm/centos6_6_163 centos6_6_163.qcow2
7 R7 J2 u6 W3 v) `" A* A
2 @! Z. M, l7 b) P4 U#qcow2格式转换为lv格式
% d! q! b F' c( _, B5 A! Hqemu-img convert -p -O raw centos6_6_163.qcow2 /dev/CentOS_kvm/centos6_6_163
9 O- b C; J7 L* R$ A1 t6 L3 W3 V$ G/ c7 o( t# k, g2 G
#rbd块转qcow2- x( f/ H! [: R3 G; u
qemu-img convert -O qcow2 rbd:vms/centos7.rbd centos7.qcow2
2 ~7 B9 n$ e% a7 s$ T. t6 p4 u( |1 `" R
#qcow2转为rbd格式8 M/ K, J- k9 W; m9 T/ c5 M4 i
qemu-img convert disk.qcow2 rbd:vms/disk.rbd
) z8 t( ?( k& ^( c- y' Kvirt-resize
8 G m+ P: c1 c
5 m0 e) b, @6 Y7 j当然,virt-resize工具也能够扩容虚拟机磁盘,例如现有一个16G的qcow2格式的centos镜像,需要扩容到50G
: q* \' F6 l3 C" d
) T1 j& l0 `% ~$ z7 Q8 a" o& m8 Z: ~查看分区
|, C* i O. S: Vvirt-filesystems --long --parts --blkdevs -h -a /data/images/centos.qcow2: j. E# h6 n# |& V% o
创建新镜像,大小为50G,要比旧镜像大 A% j8 E+ _$ i* R& \, F
qemu-img create -f qcow2 /data/images/centos-50g.qcw2 50G5 S: e3 x4 Z) ^) d8 {
扩容虚拟机sda2分区! x' \9 Q* }, [# O! _
virt-resize --expand /dev/sda2 /data/images/centos.qcow2 /data/images/centos-50g.qcow2 |
|