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