找回密码
 注册
查看: 4478|回复: 0

openstack底层技术-磁盘扩容及格式转换

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-11-8 10:10:30 | 显示全部楼层 |阅读模式
本文所使用宿主机,及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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:21 , Processed in 0.016176 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表