|
|
1.KVM的Qemu与Ceph RBD块存储进行对接
2 x& V; r, Y1 \- C2 u* ?: X1.1.Qemu与RBD块存储对接的架构图
$ @+ a0 ?; R. E6 d, A0 yQemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。1 x, }- E9 I3 w7 [1 {" e3 y
h$ {7 w, N: b# p' ~0 r
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。
6 ?9 `3 q9 W/ w7 ~& m7 i
; g( U, `1 b1 R% |+ Z4 }) _Qemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。0 T0 j" F) L+ ` V8 K# ]1 P6 @$ R
: Y* k' n `4 P, L
7 O2 Z1 B; H4 }$ V* r) O% O- ]
; h% Q( C/ E. k- n- C
Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。
5 a7 H3 n6 l+ T3 u2 q- @! l. A K, u8 V; u
官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/
; u4 t7 h! N0 n2 `$ k, [" i1 s1 x* i' ]8 }* r
1.2.配置KVM服务器连接Ceph集群# _/ i& e+ R: i6 o7 ^0 h) R
Qemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。
6 Z8 P0 `1 U; r
; D b* n" f( l& i1.安装ceph相关命令
) K9 Q% @/ n$ A7 h' H[root@kvm ~]# yum -y install ceph-common; E+ y" t1 E1 ^
S% w H7 \1 m7 `
2.拷贝ceph的配置文件$ u# A9 n. A( t. [& Q
[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/% \# |6 n) N6 ?+ W- v/ I; Q; G
" y: h/ C+ P3 }' B1 v2 K3 J3.查看集群的状态
1 O# \" L4 [% C- H8 P0 M# L3 m* _[root@kvm ~]# ceph -s
- |8 i; K6 S( D; _' K: s cluster 70d27aec-742e-4a95-b000-cf37ebba35d0
0 ~* a7 C7 U1 ^9 a' }) E5 [: p2 N health HEALTH_OK
% U* C0 p* t( q monmap e3: 3 mons at {compute1=17.24.14.5:6789/0,compute2=17.24.14.6:6789/0,compute3=17.24.14.7:6789/0}$ s4 c+ H) P6 L R' P
election epoch 352, quorum 0,1,2 compute1,compute2,compute3
4 D7 [+ K! _1 _5 {2 n osdmap e29566: 131 osds: 128 up, 128 in! @" ]$ z, Z6 q3 a4 [0 U! H
flags sortbitwise,require_jewel_osds+ g3 G. w/ x+ w1 U5 _
pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects) k E/ ?/ i9 c/ W# C
291 TB used, 174 TB / 465 TB avail3 C( r2 I8 O$ C
10234 active+clean" T4 O5 M( |0 Q: U, `7 [+ r0 C$ s( B* C
5 active+clean+scrubbing+deep4 V S" @3 O- W% m
1 active+clean+scrubbing" d0 \" u6 S! `3 H E1 Q# h
3 s" N* X7 R- U# o: @
1.3.在Ceph集群中为KVM创建一个资源池
' o. q0 K8 V6 c) q% o7 W& I[root@kvm ~]# ceph osd pool create kvm_rbd 32 32' J' O" z6 u$ {5 |9 C; [( ]/ |
pool 'kvm_rbd' created
2 b/ L: r* w; A
( j$ A' V g' [0 {1.4.使用Qemu在RBD块存储中创建卷
% \* s1 j/ z. @3 T; N" e" {: x1)在RBD中创建卷
! j' }' Q: \4 q. I/ Y! v* T% M' ?
, }/ i* d( U) A. q, a命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小
* @/ r+ D9 T% m8 U; ?+ F2 o9 z* F
1 ?9 u2 F D. ~5 @& ?1 n! ?. n& w[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G: j; h3 b) G0 O3 A' {
Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
7 w* ] e/ @$ v9 q+ @6 R9 |
0 H+ M; D5 w2 `3 u4 i
+ k2 c& g& K* v! s! a3 |* R. Y/ [9 l2)查看创建的Qemu卷
' W0 R- u; z9 B' K( R0 k' _5 X$ x$ h* {. V6 }! u
[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img# p0 g8 A2 e& f
image: rbd:kvm_rbd/vs-centos7.img
( A2 D7 Y$ W; s$ k, @file format: raw
( a% q- F, J0 j6 v, Fvirtual size: 500.0G (536870912000 bytes)# @1 f% w! P( ?5 E
disk size: unavailable0 M; Q# ]% F8 `. U0 J, v
8 W- ?" P4 Y) Q% y
这个卷其实就是资源池中创建的一个块设备。0 z% ?% J0 s2 _4 ]
: e- ?! V9 x G, U3 ?4 R4 m[root@kvm ~]# rbd -p kvm_rbd ls. j* r' l' z2 t; ]0 ]1 H
vs-centos7.img& ~; e2 h" D6 A+ n
# J4 E1 ?4 W! B* h% ~[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
7 D; h. b0 O: J2 vrbd image 'vs-centos7.img':
* B) T; V0 ]7 Q' Y! N) l( ~7 J size 500 GiB in 1280 objects
! `& p* ]$ B9 Z) O. E* H order 22 (4 MiB objects)8 f& c) l, k/ ^- a; r$ ?) j1 p
snapshot_count: 0
# F$ K0 p1 k N9 d# D/ z% P id: 19a9415778427- @6 h- I3 u' I& H( t: e6 [
block_name_prefix: rbd_data.19a94157784274 q( @, u( {% b7 q& F4 P
format: 2" y; O5 k. V& L% N$ x6 g
features: layering8 a3 B8 R* G( X. d6 t4 H
op_features:
( w" M& a0 ~! g2 n" ^# F$ } flags:
+ C: S! x* {+ q create_timestamp: Wed Apr 20 22:14:33 2022* K2 S g4 O2 w2 j( c: q* ~0 X+ v
access_timestamp: Wed Apr 20 22:16:43 2022* g9 e( O8 M( a: ?3 x% c. V
modify_timestamp: Wed Apr 20 22:14:33 2022
' e# k; h* v. ~- p8 x! c! b7 U6 a* k) c2 |
1.5.扩容卷的空间
2 B0 [# ]: H; x3 d[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G) k* F6 A0 p$ l% ~0 G) N- t% u4 t
Image resized. P2 J' F$ h5 [/ V' q$ W, @
1 \) P5 |7 i J0 Z2 H7 T
2.Libvirt使用Qemu为KVM虚拟机提供存储; d0 d1 W) r8 G5 Z- r
Qemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。3 w$ x/ M1 ^. I. u% n
) E& Z! R& b4 f官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/
M8 y! w, U' o) \+ i2 m4 N; p3 c, ~% H% J" V. G: m: k
. J0 N0 X$ e" M9 y! J/ y# C+ ]! S, K* A3 O; R9 H4 h
KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。2 |5 J8 N; L( R/ [- Q1 Z
0 ~: O3 `+ _4 I3 l8 ?2 V- ?- ^- x大致实现步骤:
/ T9 x- J0 A f4 v- Q4 j8 I/ P: Y# K9 G+ ]
1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。
3 }9 O- ?; l8 R7 | V' h8 {5 J
7 \$ ]2 e' P' A) j" P& C2)创建一个用户用于Libvirt访问Ceph集群的块设备。
% Q# w ?9 t/ I5 N% m9 V0 `) o0 N( G. d
3)创建一个Qemu存储卷。" c. K. X. I: A4 v/ Z
) T; c4 Q+ X# D) J3 p8 k( Y4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。
4 Z* r/ Z) U+ Y
0 v6 E# r$ d1 k0 [; g$ v; y5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
" _0 C6 {. x4 W% H9 U. g* \' Q7 h9 R) w, g
其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。
0 A3 x( m* @* G8 a- o+ ~3 |' c; t
1 w% |0 Z0 V0 t; w* e2.1.在Ceph集群中创建资源池8 {7 T0 S6 R g r$ z
1.创建资源池
) ?, p$ U9 _8 @( J1 m0 Z# Y[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
6 t+ d5 K- p& }pool 'kvm-libvirt-pool' created: r# S2 A1 L9 @
. V4 b" v/ \$ H$ e, O2.将资源池初始化成RBD类型8 v" d$ Z$ c( e
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool4 M8 u& O2 }/ u) r
) n, L6 a0 e' ]9 ?& u
2.2.创建用于KVM访问RBD块存储的用户
! S9 ]" }; f. X[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'$ I6 x! q0 }3 U) S8 H% J& M, n
[client.kvm-libvirt]
9 B( B( O5 u. z2 C, o: u key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==, Q3 @: Y; \0 C. A/ W# a5 B
! y- ? Y- [+ C2 L1 w3 e2.3.创建Qemu卷
1 D. ]; G8 b' F7 c7 F$ m; \( D$ {[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G' l( x! a+ A& P
Formatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0 ' b- g% A) |3 k3 `
2 X v- v' |. b$ ^( P3 {
[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img' j6 w! b/ W9 g
image: rbd:kvm-libvirt-pool/vs-centos-1-data.img
1 d2 z# ]5 m. V3 F/ D, {file format: raw# T5 k. k7 T5 p8 v% j) n
virtual size: 500.0G (536870912000 bytes)% K, L8 }% L' O# K( R; y& J: K
disk size: unavailable; M: l8 Y3 ^2 x# n, z+ `# b
9 m m9 B' o/ J: y4 n) @9 v2.4.将Ceph的认证用户写入到KVM的Secret中
4 l( ]8 t/ \- t首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。0 @6 D2 v2 D; M) w* Z" B' h
: o! E4 _% E6 P用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。# u7 Q% |: A+ [ j* {" p+ I
6 n, u" M) ~& M; Q1.编写带有认证用户名称的xml# o7 N$ I. d" [# ]. L8 o% r* k1 s4 i
[root@kvm ~]# cat secret.xml: _# r4 i( @7 w3 r6 U: L+ R
<secret ephemeral='no' private='no'>! Y# ?' l; B$ X+ `4 `) h4 W
<usage type='ceph'>3 {4 ]" m9 M9 T( }% |+ v: h8 L4 Z. E
<name>client.kvm-libvirt secret</name> X3 j4 d+ q0 _+ m
</usage>* m. ~3 h& X$ q
</secret>: o" P6 ~" u, z( A1 t
#name中就是认证用户的名称8 K- Z; c# C/ C/ G; f! W: N: l
% I2 c7 y0 X7 o+ i4 U
2.将认证用户的xml文件导入到KVM中生成一个Secret7 Z h; Y" y" [2 }
[root@kvm ~]# virsh secret-define --file secret.xml
( s4 K% x2 b; o; [- R# D2 e: R生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82) I7 c$ Q5 R L) X2 B4 A* B, K
" t5 b. K( c r) Y0 u
3.将认证用户的Key写入到Secret中
3 \3 u3 c4 j* T[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==/ _! e: U3 D T' i4 [4 d! ]1 x
secret 值设定- \7 C- z. N C$ g6 y ^
#--secret:secret的uuid
6 N4 `" s0 V% t9 A0 L#--base64:用户的key. m G& B+ p$ T2 v2 s
2 g3 h: Q; t# x4 v
4.查看生成的Secret信息
$ q/ a+ o* V5 f# H6 f( F[root@kvm ~]# virsh secret-list - W: w' Q, F7 k1 \% C. ]1 F
UUID 用量
% k- a1 C" m9 Z1 v--------------------------------------------------------------------------------
, B$ L% l2 S$ z* G( X: C 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 ceph client.kvm-libvirt secret5 A- j7 T) o5 I8 _9 W
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
" P- G, S# y2 r. P p' x) |& ]7 V$ {<secret ephemeral='no' private='no'>
0 z8 N& `3 l' n8 I* `7 V2 Q. r <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>0 F& i) y2 Q" K' `# q
<usage type='ceph'>
8 P& `" c$ U3 ~: H' J( ~6 H <name>client.kvm-libvirt secret</name>
d8 }) P; k, I </usage>' U, n, @8 x! K7 ~1 h5 I( r
</secret>
% n; P% e9 W& r
: w4 ^) k/ z( Z8 A+ g0 w$ m9 ]2.5.在虚拟机中应用RBD块存储中创建的块设备
* Y9 ^9 J4 b+ ^2 u0 ~1 o需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。
; _' `5 L# b" E3 [0 y6 ]
. K4 M( N) a% }# l T1)先停止运行虚拟机7 L% `# ]6 ^: E+ t2 T
' C* C0 P6 y$ r3 o9 I) g/ X$ A虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。
0 n$ u% p$ u7 L' f& f. c5 U4 l% F6 C" L. ]. O) K2 l F. l! c2 R
[root@kvm ~]# virsh destroy vs-centos-1
) C2 _$ }3 X n# B/ c& d域 vs-centos-1 被删除- |: D7 ?: p0 Y( Z
5 N( P3 V' j+ U# X" L9 R! B) @2)调整虚拟机的配置文件增加硬盘
& W3 e% ]2 ?3 U2 ~) r; w% J
! U: l8 N4 O2 d; z在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。. i2 r# ~( g" A j( N
/ L$ [, k1 E. a3 P! b6 E+ }在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。4 a& v( ~' H% s7 P+ e9 D
9 [+ Z' _* e5 S$ v! i在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。
, M3 u& J$ M# X. U# B8 G Y$ d$ \1 V" @3 k% ^; J) F6 }3 {9 m# K. h
[root@kvm ~]# virsh edit vs-centos-1 8 E% r" R/ A) V, Q: X
<disk type='network' device='disk'>
) [+ C: s, s% p# H, q% s9 i9 i3 f <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>) B, a- i- g4 v
<host name='192.18.0.20' port='6789'/># ^7 e% g; R: m' r/ x+ `% n
<host name='192.18.0.21' port='6789'/>& R; B3 w( C* Q" w
<host name='192.18.0.22' port='6789'/>" s7 s, K L [
</source>
4 ^) J) P K. n) P7 j <auth username='kvm-libvirt'>" k# p; x" n! D
<secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>5 O0 e0 {7 P" p* s, B4 g* x
</auth>
2 t# o/ S7 k G8 g/ D2 x* q <target dev='vdb' bus='virtio'/>
% ], ?5 i: ]2 E' Y </disk>
2 t8 x: H G4 T2 A9 N! x/ c( [) }$ d2 K4 O* ~' e
1 ~) Q) ~( Q+ C' V
! g" D& L+ x1 l9 t3)启动虚拟机观察硬盘是否添加成功3 d/ @1 b9 y, r- }; v$ t9 C6 ?
. r9 Q% |! K+ t3 u1 b- e, Y两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。8 A3 m$ G7 x1 i" N- S# H5 g0 p+ w
8 y. u, |- A! D# p/ T+ g, M[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
- \" Z5 v: O- m$ r4 ?drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/vs-centos-1.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
/ z1 g; S+ x9 V/ d4 {$ R. }- d" ^drive-virtio-disk1: removable=0 io-status=ok file=rbd:kvm-libvirt-pool/vs-centos-1-data.img:id=kvm-libvirt:key=AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==:auth_supported=cephx\\;none:mon_host=192.168.20.20\\:6789\\;192.168.20.21\\:6789\\;192.168.20.22\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
4 @* Y0 i/ P! n3 odrive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
0 n5 M( \/ r$ i* R Q4 r
3 G5 A, {5 `( A4 P[root@kvm ~]# virsh domblklist vs-centos-1
3 |5 F7 A9 m4 B3 ^! U/ o% d目标 源
) m4 R% s* N3 T, \------------------------------------------------: T2 L: X0 ~' Y1 U `# K# L$ B2 V
vda /var/lib/libvirt/images/vs-centos-1.img
, ^5 F {7 v, q) K& Cvdb kvm-libvirt-pool/vs-centos-1-data.img
0 Q; Z& a+ w! Y: y2 Z6 l Y9 qhda -
- ~2 i6 p- b G* n; c( i$ m# R
* H# a o8 Y5 W( Z$ K7 H3 v2.6.虚拟机使用RBD块存储提供的硬盘+ P( e$ ^7 y7 S$ X" Z
RBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。
$ B$ J" W: l4 _4 U2 b+ p) j% L% c/ {4 A, d
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。. Q' G2 B* [" h" P# q( t* d
' b0 T, Q, Y0 i: v# Y9 Q% D+ v; {lsblk
, f2 \' D% q; d: N: x7 Jmkfs.xfs /dev/vdb1 B: p, X$ R- J. X' q' P
mkdir /data% x0 K5 O: e E, Z5 V" l
mount /dev/vdb /data1 x( u: u6 B# ?3 k
df -hT
8 L; D! d% ?4 p7 _% p1 Tcd /data" d& E# C* g' a( t# L) o; m* S
touch file{1..5}.txt
6 z0 @7 S+ l; @% _. V |; _ll) p# H9 N. B5 m5 v2 R5 r
: }8 ^) _- D$ _0 Q3 H$ y+ o
. b/ k: H' a# l( ?& X2 X" F# p6 `
此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。% t5 m& a# R V4 b' j9 j6 x& F; t
( g$ e4 }5 _! C# ]2 y3 l4 _9 U* _0 A
: _8 G+ L4 T3 S; y$ b7 G' o
! F, Z, _7 t8 }$ p5 S" N/ H }2.7.RBD提供给KVM虚拟机的硬盘扩容方法
; E+ d2 L4 G, }3 u' J1)扩容RBD块存储中块设备的空间. X, @9 }; v: Q: \, D6 j
1 l$ d( X0 E; ~/ b% T0 o将原来的5G扩容到7G。
% u, l7 ^5 X" ^- H% b. R7 p, V
) _5 X+ d1 P; [1 _: W5 m[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G, n9 `+ l# q5 a* z
Image resized.
) w5 [; T6 W; m2 n: G$ o4 K5 w2 R& ?) M) I& `
2)重启虚拟机
, D, N0 c; n" x6 q. z6 ~
; w( n: }, j! i7 [4 J* G! qKVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。
" _' [, c, R" @/ C! q9 c3 ]( l, Y# z- C5 [- M5 @8 G* V, R
[root@kvm ~]# virsh destroy vs-centos-19 i' `& M$ @+ f
域 vs-centos-1 被删除
M, h, C2 n% r" t
8 Y# o7 f3 x' R6 C1 |[root@kvm ~]# virsh start vs-centos-1
4 J3 m7 q* k/ _- d" K域 vs-centos-1 已开始! f. R5 x) O6 k+ R
" [0 v0 O# r! e6 W. H1 B. x2 f$ N8 u! N( r$ ^( z
3)查看硬盘空间是否生效4 P8 j5 z. Q- V( F- K
l x5 O# r7 k9 w# E1 M7 L
磁盘空间已生效。& F/ b+ o2 q( O" I
) e1 l \, ]6 Q! y3 H- @, C
; ]2 U4 l( o; v, S, Z" |4 \/ G' H+ i T& }5 [( w
3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储! K8 V. @( `5 C: x* c+ V
首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。
; O/ B1 H2 D" E2 V# V7 N
) M/ A$ N. C/ g) c9 M% F3.1.将本地的系统盘导入到Ceph集群的RBD中
- \% G/ }8 v' @, c' O6 D命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}0 c: M+ I5 ~' I, f/ ?9 T
- z* M) C# u: i4 c' e6 p" M; h
[root@kvm ~]# qemu-img convert -f qcow2 /var/lib/libvirt/images/virtual-host.img -O raw rbd:kvm-libvirt-pool/vs-centos-1-sys.img
# P+ v: k, y- z) y X- @* w7 U4 S( G# c' _, I
查看导入到RBD块存储的系统盘。
* K3 w2 @1 Z: U- q6 I% t# x* t) g5 }/ P" w8 i
[root@kvm ~]# rbd -p kvm-libvirt-pool ls% C' D2 D7 ~2 o! N' o* _9 J
vs-centos-1-data.img
. R8 Q4 a% ]) l( K$ r9 t1 xvs-centos-1-sys.img
7 U- @" I+ M% D3 q+ |$ D% |5 V# P( e2 }2 T& N1 ^
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img; b4 g4 ]) ~- G) X. u: D8 }
rbd image 'vs-centos-1-sys.img':
9 ?/ u, s; P* t& L+ Q size 10 GiB in 2560 objects
2 [' }* y* z3 } order 22 (4 MiB objects)' y+ Q9 _% |1 Z6 J
snapshot_count: 0
2 P) K, \7 Q. V# F/ K. E1 h1 \ id: 19a5d559f577b
5 ^( _4 N3 W! S% y block_name_prefix: rbd_data.19a5d559f577b
# ], O0 o4 N9 H3 H4 ]5 ^ format: 29 d# @3 U7 s. a
features: layering5 k0 O3 w& i8 p
op_features: 0 i# H# Z, f B& G0 n* {7 ]
flags: & c9 d* X! t# V+ g+ W5 Z
create_timestamp: Thu Apr 21 13:06:56 2022
( v9 u v9 h* I' `7 @+ A access_timestamp: Thu Apr 21 13:06:56 2022
1 u# | Z+ s I0 z a9 D. j9 X' `8 t6 H modify_timestamp: Thu Apr 21 13:08:58 2022
- L0 y+ v2 P/ J8 f# X4 S! {) a! T6 w" V) X
3.2.修改虚拟机的配置文件调整系统盘的路径& {: h1 ^$ {2 m( \/ D! J
直接将现有系统盘的配置信息修改成下面的内容。
2 r' v5 ?- m2 l8 w4 M1 ~
2 o7 P: C ?. b8 U* x" ?; R0 d[root@kvm ~]# virsh edit vs-centos-1 * N0 g1 z$ p+ T2 F& O) S n1 X6 A) R
<disk type='network' device='disk'>" D2 L! E5 e( x8 F1 a5 c
<driver name='qemu'/>
1 i2 t5 M5 q8 C; e+ K <auth username='kvm-libvirt'>! \% p1 C4 ]. D, S' s: ]$ S
<secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
# o5 h# s1 w- N, h( \; k: `: Z% N </auth>) q6 v* _" ^) R/ }9 g
<source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>' j9 o& `) |' M2 z c- M s7 u
<host name='192.168.20.20' port='6789'/>6 x6 B* F4 y( `+ |0 N
<host name='192.168.20.21' port='6789'/>$ p5 c4 J3 C- t& o- L' N, R6 V
<host name='192.168.20.22' port='6789'/>5 w# E, |7 l& [- l2 Y
</source>
0 c' b) W e3 D; g8 Z8 M h <target dev='vda' bus='virtio'/>( @- n, W3 E# l f+ ]7 O6 |5 s t1 V7 O
</disk>
+ P$ M: J$ j/ {, C" [6 z5 ]" ~9 N9 @& R% W( S( m3 l2 N
; N! Z# ?( r3 F; Z( D6 ~8 }
. e3 H) S' j) Z3.3.重启虚拟机, {, s/ E+ }4 J$ ~
[root@kvm ~]# virsh destroy vs-centos-1
# A0 p. p' {9 l2 Q域 vs-centos-1 被删除
: V! @$ D& G# ]2 W2 R& ^+ h" z J
* Z; v7 j4 @% w. j; v* P: T[root@kvm ~]# virsh start vs-centos-1
8 U1 H! m: @4 u# r# ?域 vs-centos-1 已开始
" G' M2 @6 t0 x2 L
O2 E7 ?; Q( w/ ^3.4.验证虚拟机是否可用
! U, J7 r( Z5 h; n8 L6 R安全没问题。1 V. F$ J* m5 ^7 N1 j5 Y
|* o* Y% ]# E$ u2 a( r. ?5 Z" g/ D5 Z; m- X8 b4 C3 r/ k
% F" V- L1 d* t( `. w7 b
4.实现类似云平台秒级部署虚拟机
$ c! m4 f& C# m3 m# \) b在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。
, D% V# L$ y+ v( ?+ Z
J7 _- C0 P4 L! D" j! r( {' Z/ C0 s秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。2 w3 g8 O& u0 {* J4 l
6 |/ v0 i' w6 {9 v7 X如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。
4 f' `& c! C; d3 K Z: o! b, i4 P- {% m- {
4.1.将现有虚拟机的系统镜像块设备创建一个快照! A% O6 S% r ~& X
将系统盘对应的块设备创建一个快照并设置成保护模式。+ r3 @; b: d) I7 h' k) l/ p A# Q
3 Q, @9 r0 N# A
[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template2 l6 ^9 [& H. s T; x
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
* l w& S& b$ c9 C3 ~3 F
4 C$ s& p' y, c. _3 R7 I4 b4.2.为新虚拟机提供克隆镜像
% x" l2 ]3 g: s" O' E为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。6 L7 s) m' r4 M7 R, x) |: Q! E
3 m0 P+ H/ N! w: {( N[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img! Y- }9 T' m! J$ `
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img
5 z$ `' }% K) @0 ?7 E
! T# U2 k5 X& l; N# x) p# C% s3 c: _3 E0 r; ?2 z3 u
4.3.通过虚拟机文件准备多个虚拟机
: d. J0 E3 N' m- b! h' s3 }KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。
, J2 g o: N- }7 D. s: d) H, a2 Z9 N, i; `( u1 S
进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
. Q& j& c8 o8 E2 E; T& O' n
/ p7 s( E1 x' N$ v0 w[root@kvm qemu]# cd /etc/libvirt/qemu/4 W0 A" p; v5 H; `; x. q2 p
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml ' H5 k) f7 V) Y2 ?$ t
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml
9 y! i: b% A" m8 N0 `7 Z0 ?* w9 S8 F) b S$ A2 |) l/ g* W$ k9 l
3 W4 @% G8 Y/ _- F6 _& t! u4.4.编辑虚拟机的配置文件. [" f {' t! {* z* H& f
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。
* ~! x* Z7 o! _- c& b& O# d+ f7 s$ F0 r7 w J3 n3 Q6 U
<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>5 [ i) D& y7 _; E0 E
5 S1 c3 _3 y, H+ |1 h/ t
<mac address='52:54:00:eb:f6:97'/>' Q4 @ T- j1 n0 V
; I- N( v! L- C
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>6 x4 g4 T8 F, u5 r* c& @
& C) ^ o- k- I @4.4.1.vs-centos-1虚拟机的配置文件! h% ^' ~4 K: @5 g+ x7 q
[root@kvm qemu]# vim clone-vm-1.xml
+ r- P* b+ A6 I6 U<!--
/ U- g: V# d* L" r" EWARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
" E% [) U, a( [+ u- aOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:/ I3 J7 x% ^0 i/ ^8 \
virsh edit vs-centos-1
8 P; T# w1 ^/ n, |or other application using the libvirt API.& G, s4 ^. H- i5 _* m
-->
( Y- M' s' n1 M* z4 d7 T9 _. I: R* u' ?5 @
<domain type='kvm'>
3 n8 T9 L+ `/ X <name>clone-vm-1</name> <!--虚拟机的名称-->
+ T# z$ t; e5 u5 \9 U& a+ o <memory unit='KiB'>1048576</memory> l8 M, ^# }+ ]: M2 h+ @
<currentMemory unit='KiB'>1048576</currentMemory>
G v5 v4 F& i# E <vcpu placement='static'>1</vcpu>5 [: X" k, p. k
<os>
* Y) g! N- i: E( f <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>& z+ C* s. a! t$ W) Z, v" _! _; d
<boot dev='hd'/>/ T0 l; ]$ }/ @$ D
</os>) `( c% R: f" r# O$ i! }8 d+ d( r
<features>
4 ^9 x, l, V+ i( L7 m <acpi/>
+ T9 e8 M- S! e" ]: e5 \ <apic/>
4 t- Y, i$ W: E; C </features>
" p9 ]( o/ ]6 O6 e o& \ B+ O <cpu mode='custom' match='exact' check='partial'>
+ H$ R+ T! J k& j0 P <model fallback='allow'>Nehalem-IBRS</model>! j" T" K2 k. e, ]: r! B
</cpu>
J+ T: N) l* \ <clock offset='utc'>' ?5 |$ G2 I1 Q: x" J) @6 s* ^
<timer name='rtc' tickpolicy='catchup'/>5 |/ E( b5 L5 G6 l7 P/ n
<timer name='pit' tickpolicy='delay'/>0 v0 U# l' |! g. X! u/ O
<timer name='hpet' present='no'/>6 u- a" n; j. h! d8 }% c% V
</clock>& p6 R# T/ `6 T( _* k: |0 `1 {/ v
<on_poweroff>destroy</on_poweroff>
, H7 c+ m5 Y9 x, B/ ]4 }5 A <on_reboot>restart</on_reboot>* Y' d4 p$ u. k; L9 }( ^
<on_crash>destroy</on_crash>$ X$ v9 A! }! X
<pm>
, f- B( J4 d, [/ T, H0 Y& d, W8 ^ <suspend-to-mem enabled='no'/>
4 J, ?8 ?/ B3 w3 X. g* h1 Q <suspend-to-disk enabled='no'/>- o" j3 f: g' z. L
</pm>* i2 m% ^* d8 C8 S. F
<devices>
5 v* A9 R: U1 N" ]* g4 \1 C <emulator>/usr/libexec/qemu-kvm</emulator>- |0 t1 p1 p( q% \5 m& h
<disk type='network' device='disk'>
" Z, P, X' j6 Y3 f <driver name='qemu'/>
3 A; d4 C* S: h3 Z3 g- t <auth username='kvm-libvirt'>
- u {+ z* ?3 u. j0 I! `) c. ^ <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
/ d7 a) {- e* J0 Y F2 q$ ?" N </auth>% x+ h8 o5 e. y/ c
<source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'> <!--填写克隆的系统镜像块存储路径-->/ E4 j8 E' d3 J0 {
<host name='192.168.20.20' port='6789'/>2 |9 v2 O/ H2 N. }+ b
<host name='192.168.20.21' port='6789'/>" S) P, n0 k4 l
<host name='192.168.20.22' port='6789'/>+ u, E8 M) l) e
</source>
. u* k! U8 b) i2 q e5 @ <target dev='vda' bus='virtio'/>1 d! I6 x2 Y" v& ]
</disk>1 A/ d2 l2 Z& R8 Z P: n
<disk type='file' device='cdrom'>. [( R( S0 r# G0 _. |& {
<driver name='qemu' type='raw'/>$ e4 B% [ j1 S. l! ]3 V+ A! r
<target dev='hda' bus='ide'/>
0 W9 {- }! t. I w <readonly/>
- _; e. D( i- e* b3 }3 [ <address type='drive' controller='0' bus='0' target='0' unit='0'/>- E7 s& R, D2 W$ ?6 [2 [- f
</disk>$ a( I% A; b/ o$ o" `0 ?
<controller type='usb' index='0' model='ich9-ehci1'>
7 z1 E& I* s) `( r' m <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
* z% g4 d+ d+ A, ?' Z </controller>: n9 ~! d S. c0 a$ t5 e/ |
<controller type='usb' index='0' model='ich9-uhci1'>7 J9 f `& ]% D* o2 R4 b
<master startport='0'/>3 \) [8 `/ c6 t" S; c j
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>1 x, E( {8 Y2 Q: t" d
</controller>! P9 e9 b% r3 r/ \
<controller type='usb' index='0' model='ich9-uhci2'>
$ ~/ R* `9 j! C- [ <master startport='2'/>
. u% y( v8 t4 ^' _ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>. F0 a, C4 F" W; I- ~% m" r6 X/ |* z
</controller>
* T' U* C/ r9 H' F! D! m <controller type='usb' index='0' model='ich9-uhci3'>6 s1 e! Q$ m7 v
<master startport='4'/>
6 Q" w. ~3 ^! y/ W5 t <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
. g& f3 y5 N' B3 {; W9 v </controller>) v+ x$ k) p$ d# c; F, T' X
<controller type='pci' index='0' model='pci-root'/>
$ C+ ~; ^1 j6 O+ L7 g# t* P5 }0 s <controller type='ide' index='0'>
, F8 b6 ^, T% ^( S3 z <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
% b; O; X5 J- x' a y </controller>
3 ^1 [' q2 g$ l% @" O: F( A <controller type='virtio-serial' index='0'>- o1 K1 u. Z; M
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
0 l1 T! ~0 F3 a0 t& Q0 S' A# H </controller>
5 h7 c( w5 |" Z- v' T7 Q0 j <interface type='network'>
0 k5 Q! n# O2 C8 O <source network='default'/>- |- N( t. v, t
<model type='virtio'/>1 e; N( e0 t: x5 V5 A) B6 [# X$ J
</interface>
3 r: b2 T ^7 U" m3 Q1 l$ |9 t# s <serial type='pty'>5 ?; p2 A5 b: b, a2 v i( P7 ^" x
<target type='isa-serial' port='0'>: I8 S! }) `; k$ a, ^ `- E) r
<model name='isa-serial'/>+ a- ^. U4 A- P
</target>
6 [! S# U9 q0 D4 y! k9 V* j </serial>- W5 l7 o; F7 ]0 t" q E2 u
<console type='pty'>
6 w9 s1 y1 C3 V4 t! Z <target type='serial' port='0'/>$ y3 B; @! {3 a* c+ ~3 W& ~
</console>4 w5 q6 Q% S5 g' v! M9 g3 z" j
<channel type='unix'>
* y* {/ k1 {, U5 O <target type='virtio' name='org.qemu.guest_agent.0'/>' a' v1 i; N' Q- H
<address type='virtio-serial' controller='0' bus='0' port='1'/>6 D. H T$ A5 u! w$ c$ W3 L! P, {, V
</channel>2 Q. h& `% g0 _5 n
<input type='tablet' bus='usb'>
; z8 R+ d5 _7 l2 q# P <address type='usb' bus='0' port='1'/># E6 T% ~0 P3 O% w
</input>
" Y/ J4 o6 A1 B2 F$ w+ u- [ <input type='mouse' bus='ps2'/>
! Y! Z) a% v& Y. B& @ <input type='keyboard' bus='ps2'/>
! z3 Q% f/ e, ~) g1 s# N <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'> <!--修改VNC的端口号-->; n3 i3 f+ `9 h
<listen type='address' address='0.0.0.0'/>
: u5 q4 o* ?1 u; I </graphics>
* w5 T( O4 }% j( o( b <video>) p8 }0 G9 T3 m) k( V: g
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
0 o1 L7 M% N0 x: J- m <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
" l! Q u# q6 _2 ^5 U </video>
. B0 E2 Z2 p2 D( ?0 [$ y w6 F <memballoon model='virtio'>
: i8 b6 l7 w7 W, V. k <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>8 x' B! |. m+ l# W$ b d
</memballoon>. j' P3 v: G- F
</devices>
0 k' X" T1 @& Q1 B3 K</domain>
) C: V) Q+ k( G2 c+ T1 w4 s- ]8 I, ^1 d3 {3 V
4.4.1.vs-centos-2虚拟机的配置文件
4 Z. p! `. {( D[root@kvm qemu]# vim clone-vm-2.xml
" [/ ~5 @8 Q% H1 k( I; k<!--
) s* Q" s8 H$ @7 [ WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
7 H% i6 c+ p x# w0 j4 _" wOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
! w0 n1 g7 R y8 {% ~$ }) L* R6 w virsh edit vs-centos-17 @- o+ J8 @/ @- g
or other application using the libvirt API./ ?6 D- t9 c) M) O8 s4 d$ d' V: ?
-->9 y* q) k! Y( @( p/ g
7 M* c* E& F8 f; S3 z) }9 {# A) S
<domain type='kvm'>3 A: l2 b* E5 Q/ |
<name>clone-vm-2</name> <!--虚拟机的名称-->
6 Y" D& [; i U r1 C6 Y* S2 N <memory unit='KiB'>1048576</memory>6 b I( ~+ z" H& j- u; p/ r
<currentMemory unit='KiB'>1048576</currentMemory>+ `7 j5 A0 Q) c6 D/ |0 y
<vcpu placement='static'>1</vcpu>
( W# t' d; h4 }- r4 w3 t( U <os>
. @, o1 D& y. i4 p) K <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>8 d+ @0 Y' v$ N7 P5 k
<boot dev='hd'/>" G6 U* x2 L# v6 L" ?% Q
</os>0 j+ E8 d2 k! e4 M/ x% ]# N
<features>$ V+ G: E1 z, R4 V, R" Q
<acpi/>
6 V% c( l+ W8 I <apic/>
5 g6 |' o0 z6 h/ P: g6 q </features>
8 X$ y. u; w( A. T0 G. Q- E. p <cpu mode='custom' match='exact' check='partial'>9 P1 u% s' Q( w' O" S+ i
<model fallback='allow'>Nehalem-IBRS</model>
a% h8 w1 }7 [0 b$ v. x) K </cpu>
1 d+ |/ \, E# T N' ^ <clock offset='utc'>
2 L0 \! U5 O# R3 J <timer name='rtc' tickpolicy='catchup'/>6 Y( B- C0 o$ v% ~/ L" g5 K2 u
<timer name='pit' tickpolicy='delay'/>& g$ ^+ ^8 v4 O) ^( i$ |6 \
<timer name='hpet' present='no'/>
3 k1 J0 `2 g. j3 H$ U </clock>
$ [# q& T! @4 |3 f <on_poweroff>destroy</on_poweroff>/ N* v5 n" W7 l) {! q( Z+ ]
<on_reboot>restart</on_reboot>; o; i& M" i4 W% k5 W
<on_crash>destroy</on_crash>
- R8 ]; |& F2 n3 r9 b <pm>
( Y& i; g1 c6 D, \( u1 ? <suspend-to-mem enabled='no'/>
' b( G! V* C+ M) S <suspend-to-disk enabled='no'/> Q3 U5 \% C* ?% X) T) E
</pm>
* z; w) p0 u6 U5 n2 X- M: { <devices>0 d1 Q0 {9 N; C- W C) G5 N$ d
<emulator>/usr/libexec/qemu-kvm</emulator>6 D8 T, [. l" K
<disk type='network' device='disk'>- A% g$ l0 j% Y$ i" L/ q
<driver name='qemu'/>/ I7 X. P/ ~1 m6 d
<auth username='kvm-libvirt'>+ D8 `. H9 G5 ]' l7 y; ]" x
<secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
" u2 |6 k( v4 V% e. o! G$ }) d </auth>
- `" I' M' E8 i6 G. Z+ F1 J <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'> <!--填写克隆的系统镜像块存储路径-->
$ r( S! }4 `4 y8 S <host name='192.168.20.20' port='6789'/>+ [2 \$ g% m; f c
<host name='192.168.20.21' port='6789'/>
) J# ^6 R! Y7 w/ q <host name='192.168.20.22' port='6789'/>
8 n) q' } d: x5 s </source>6 f6 K( A" l6 X/ t7 z* |
<target dev='vda' bus='virtio'/>
1 q- q# y V$ {& R </disk>
& P. d& @* b2 { B- Z <disk type='file' device='cdrom'>) ?7 U% N/ V& d4 M N6 h6 K1 D
<driver name='qemu' type='raw'/>$ o" X7 V# f. C& V( I. Q6 W
<target dev='hda' bus='ide'/>
. e% D% }7 Y3 d, V w <readonly/>
; w$ U+ Q, m) h* d' t' ~ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
. N; Z+ A* q. G </disk>
. d ]1 p5 T7 q <controller type='usb' index='0' model='ich9-ehci1'>
6 {: C) H/ c9 b, d) T. b, A <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>, U" x* A2 e9 t: `- p9 A7 C
</controller>$ _: N% ^8 ]/ k. N( y. _5 `# E2 k6 a
<controller type='usb' index='0' model='ich9-uhci1'>+ E X0 }* r; n' Y7 d
<master startport='0'/>7 z6 U% f6 c- R; n/ H
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>8 q7 N( R5 r! t" S1 V
</controller>$ C8 B6 O& p9 p# U0 h* z
<controller type='usb' index='0' model='ich9-uhci2'>
0 k3 e0 }7 T3 _* N2 a* R% M <master startport='2'/>
1 ?* ]- \' i; m* L4 D5 ]1 d0 |5 W <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
" }$ F+ M# I x# r! f# V4 z& i </controller>8 \0 G8 u; S4 w$ B9 M2 |* T5 K
<controller type='usb' index='0' model='ich9-uhci3'>7 c/ K$ J, Z0 H- K# H
<master startport='4'/>' w" x$ T0 g( P3 F+ z- R
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>- t* w$ I5 T3 o
</controller>" {0 V9 l2 w) Z9 S2 B
<controller type='pci' index='0' model='pci-root'/>
2 q9 ^3 B8 H" a) r* Q <controller type='ide' index='0'>
, C* ^+ F4 v& q& D4 N( @ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
% r# `1 K5 r: r </controller>3 O) Q5 W% Q/ @( J* k
<controller type='virtio-serial' index='0'>9 o+ s+ u& |1 L1 x' Z! W1 o
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
1 i/ i( ]( {8 l- U1 y </controller>
! w) O. i* A4 N3 u <interface type='network'>) P" o+ z, q7 w) A6 t5 V6 u
<source network='default'/>
4 e0 n0 @; x" r: E( I <model type='virtio'/>( f4 C7 }# `0 j& [
</interface>1 |# T# q$ Q+ x7 \
<serial type='pty'># o6 i0 Y. G6 d/ ]( w' F
<target type='isa-serial' port='0'>
6 o# `0 P) E# H- p. t# X% b; _ <model name='isa-serial'/>
4 }: k+ w+ j. T6 F) @( s; K2 f( x0 [' q </target>0 g0 F+ N. v- K" E- b( I* E
</serial>8 }) f5 E* l4 J! `$ c) i7 u2 V
<console type='pty'>" ]) A: t, v' U# p- @
<target type='serial' port='0'/>
: {) H+ q$ P: Z+ @4 C5 H </console>8 K- z5 f( X7 v6 J# q4 H! d
<channel type='unix'>
7 V( X+ |' e" n: ] <target type='virtio' name='org.qemu.guest_agent.0'/># u! y6 `' R/ Q1 C& J4 q
<address type='virtio-serial' controller='0' bus='0' port='1'/>5 e; p' t+ |% |
</channel>
( d, M& _8 l5 e) v <input type='tablet' bus='usb'>/ k3 Q" y4 | }3 j% P* f* ~" U" g8 I
<address type='usb' bus='0' port='1'/>: x2 M W# ?1 e: G9 L6 a
</input>- k B, x8 \8 ]- M: X- d
<input type='mouse' bus='ps2'/>
0 u1 E. T2 r/ W+ V- r; Y- x; M( K2 p <input type='keyboard' bus='ps2'/> c, g" R$ V. w& s+ z
<graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'> <!--修改VNC的端口号-->
, ] u: E- M& }( w, z <listen type='address' address='0.0.0.0'/>5 ^0 m6 j+ f9 }2 n) N2 v
</graphics>
K$ Z2 Y; i5 n( o' p0 G+ y U <video>
4 k6 g. Y) g# e' I <model type='cirrus' vram='16384' heads='1' primary='yes'/>" P; @! F- `5 J B# J
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
6 p T/ K0 {3 y </video>" g8 F' f+ T7 I. N7 |# a8 C9 G
<memballoon model='virtio'>1 m) i5 e" e: \, Q& L7 ]5 \$ v
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
: b) S; z" X7 o </memballoon>
- {$ P9 N/ @4 r, A, f. x, Y n </devices>5 F9 u! `' {/ X7 w
</domain>- B- K3 ?* s" S( s
/ m- Q. E. r5 P8 F* F- G. ^
8 D# I/ Z4 M0 f+ y: Z3 Y4 |/ ]4.5.将虚拟机配置文件导入到虚拟化平台
# p4 E7 r5 ^! s n[root@kvm qemu]# virsh define clone-vm-1.xml 2 |' Y/ `+ Y1 H2 g
定义域 clone-vm-1(从 clone-vm-1.xml)- L( c4 M0 x4 @
/ s( V( w& n( Y$ |. {0 N[root@kvm qemu]# virsh define clone-vm-2.xml ) h1 y1 [, _" f. C# G9 D( j
定义域 clone-vm-2(从 clone-vm-2.xml)9 D1 h: J6 ?+ q1 @
$ s3 P/ O$ c8 W. ]$ | j+ ~6 n+ }$ {# M5 x Z3 O
导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。- [; e( w5 h$ h% m% a: f
/ W3 a9 \$ t! L9 m
[root@kvm qemu]# virsh list --all
9 g5 M4 a7 ?+ L# W" g' N Id 名称 状态
3 T. c) X; h# J8 j( j----------------------------------------------------
3 S2 A/ p; p/ I8 Q 7 vs-centos-1 running
" } Y" \( o0 R. y+ h; _+ X, [0 N - clone-vm-1 关闭
6 a4 ?; I3 \1 c/ C - clone-vm-2 关闭- c( H$ h7 ]& f3 V
- L' \1 p1 f" T9 o1 ^4.6.启动虚拟机验证是否能够秒级使用
1 K* w. r& Y3 G[root@kvm qemu]# virsh start clone-vm-1
( S5 a/ ^% Y2 y, ?域 clone-vm-1 已开始
/ `0 i6 ~: b0 a, H9 a0 {6 r' h& ]
2 z v+ h8 |' q* E P# h# i8 F[root@kvm qemu]# virsh start clone-vm-25 z+ C |' y! `) x
域 clone-vm-2 已开始$ `* t0 ^0 d: Q; V. m2 T. _* c0 a
+ N' t9 b K; r
" Q' ], u: ]5 f2 b; s3 C待后期更新。
9 A4 _" J* B/ O9 z
; S Y# f% V- q9 `" q0 ~& g. y. E. D; O! z
|
|