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