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