找回密码
 注册
查看: 42|回复: 1

kvm虚机使用ceph rbd块设备作为后端存储

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-19 17:00:04 | 显示全部楼层 |阅读模式
1.KVM的Qemu与Ceph RBD块存储进行对接
2 x& V; r, Y1 \- C2 u* ?: X1.1.Qemu与RBD块存储对接的架构图
$ @+ a0 ?; R. E6 d, A0 yQemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。1 x, }- E9 I3 w7 [1 {" e3 y
  h$ {7 w, N: b# p' ~0 r
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。
6 ?9 `3 q9 W/ w7 ~& m7 i
; g( U, `1 b1 R% |+ Z4 }) _Qemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。0 T0 j" F) L+ `  V8 K# ]1 P6 @$ R
: Y* k' n  `4 P, L
7 O2 Z1 B; H4 }$ V* r) O% O- ]
; h% Q( C/ E. k- n- C
Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。
5 a7 H3 n6 l+ T3 u2 q- @! l. A  K, u8 V; u
官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/
; u4 t7 h! N0 n2 `$ k, [" i1 s1 x* i' ]8 }* r
1.2.配置KVM服务器连接Ceph集群# _/ i& e+ R: i6 o7 ^0 h) R
Qemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。
6 Z8 P0 `1 U; r
; D  b* n" f( l& i1.安装ceph相关命令
) K9 Q% @/ n$ A7 h' H[root@kvm ~]# yum -y install ceph-common; E+ y" t1 E1 ^
  S% w  H7 \1 m7 `
2.拷贝ceph的配置文件$ u# A9 n. A( t. [& Q
[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/% \# |6 n) N6 ?+ W- v/ I; Q; G

" y: h/ C+ P3 }' B1 v2 K3 J3.查看集群的状态
1 O# \" L4 [% C- H8 P0 M# L3 m* _[root@kvm ~]# ceph -s
- |8 i; K6 S( D; _' K: s    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0
0 ~* a7 C7 U1 ^9 a' }) E5 [: p2 N     health HEALTH_OK
% U* C0 p* t( q     monmap e3: 3 mons at {compute1=17.24.14.5:6789/0,compute2=17.24.14.6:6789/0,compute3=17.24.14.7:6789/0}$ s4 c+ H) P6 L  R' P
            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
4 D7 [+ K! _1 _5 {2 n     osdmap e29566: 131 osds: 128 up, 128 in! @" ]$ z, Z6 q3 a4 [0 U! H
            flags sortbitwise,require_jewel_osds+ g3 G. w/ x+ w1 U5 _
      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects) k  E/ ?/ i9 c/ W# C
            291 TB used, 174 TB / 465 TB avail3 C( r2 I8 O$ C
               10234 active+clean" T4 O5 M( |0 Q: U, `7 [+ r0 C$ s( B* C
                   5 active+clean+scrubbing+deep4 V  S" @3 O- W% m
                   1 active+clean+scrubbing" d0 \" u6 S! `3 H  E1 Q# h
3 s" N* X7 R- U# o: @
1.3.在Ceph集群中为KVM创建一个资源池
' o. q0 K8 V6 c) q% o7 W& I[root@kvm ~]# ceph osd pool create kvm_rbd 32 32' J' O" z6 u$ {5 |9 C; [( ]/ |
pool 'kvm_rbd' created
2 b/ L: r* w; A
( j$ A' V  g' [0 {1.4.使用Qemu在RBD块存储中创建卷
% \* s1 j/ z. @3 T; N" e" {: x1)在RBD中创建卷
! j' }' Q: \4 q. I/ Y! v* T% M' ?
, }/ i* d( U) A. q, a命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小
* @/ r+ D9 T% m8 U; ?+ F2 o9 z* F
1 ?9 u2 F  D. ~5 @& ?1 n! ?. n& w[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G: j; h3 b) G0 O3 A' {
Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
7 w* ]  e/ @$ v9 q+ @6 R9 |
0 H+ M; D5 w2 `3 u4 i
+ k2 c& g& K* v! s! a3 |* R. Y/ [9 l2)查看创建的Qemu卷
' W0 R- u; z9 B' K( R0 k' _5 X$ x$ h* {. V6 }! u
[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img# p0 g8 A2 e& f
image: rbd:kvm_rbd/vs-centos7.img
( A2 D7 Y$ W; s$ k, @file format: raw
( a% q- F, J0 j6 v, Fvirtual size: 500.0G (536870912000 bytes)# @1 f% w! P( ?5 E
disk size: unavailable0 M; Q# ]% F8 `. U0 J, v
8 W- ?" P4 Y) Q% y
这个卷其实就是资源池中创建的一个块设备。0 z% ?% J0 s2 _4 ]

: e- ?! V9 x  G, U3 ?4 R4 m[root@kvm ~]# rbd -p kvm_rbd ls. j* r' l' z2 t; ]0 ]1 H
vs-centos7.img& ~; e2 h" D6 A+ n

# J4 E1 ?4 W! B* h% ~[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
7 D; h. b0 O: J2 vrbd image 'vs-centos7.img':
* B) T; V0 ]7 Q' Y! N) l( ~7 J        size 500 GiB in 1280 objects
! `& p* ]$ B9 Z) O. E* H        order 22 (4 MiB objects)8 f& c) l, k/ ^- a; r$ ?) j1 p
        snapshot_count: 0
# F$ K0 p1 k  N9 d# D/ z% P        id: 19a9415778427- @6 h- I3 u' I& H( t: e6 [
        block_name_prefix: rbd_data.19a94157784274 q( @, u( {% b7 q& F4 P
        format: 2" y; O5 k. V& L% N$ x6 g
        features: layering8 a3 B8 R* G( X. d6 t4 H
        op_features:
( w" M& a0 ~! g2 n" ^# F$ }        flags:
+ C: S! x* {+ q        create_timestamp: Wed Apr 20 22:14:33 2022* K2 S  g4 O2 w2 j( c: q* ~0 X+ v
        access_timestamp: Wed Apr 20 22:16:43 2022* g9 e( O8 M( a: ?3 x% c. V
        modify_timestamp: Wed Apr 20 22:14:33 2022
' e# k; h* v. ~- p8 x! c! b7 U6 a* k) c2 |
1.5.扩容卷的空间
2 B0 [# ]: H; x3 d[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G) k* F6 A0 p$ l% ~0 G) N- t% u4 t
Image resized. P2 J' F$ h5 [/ V' q$ W, @
1 \) P5 |7 i  J0 Z2 H7 T
2.Libvirt使用Qemu为KVM虚拟机提供存储; d0 d1 W) r8 G5 Z- r
Qemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。3 w$ x/ M1 ^. I. u% n

) E& Z! R& b4 f官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/
  M8 y! w, U' o) \+ i2 m4 N; p3 c, ~% H% J" V. G: m: k

. J0 N0 X$ e" M9 y! J/ y# C+ ]! S, K* A3 O; R9 H4 h
KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。2 |5 J8 N; L( R/ [- Q1 Z

0 ~: O3 `+ _4 I3 l8 ?2 V- ?- ^- x大致实现步骤:
/ T9 x- J0 A  f4 v- Q4 j8 I/ P: Y# K9 G+ ]
1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。
3 }9 O- ?; l8 R7 |  V' h8 {5 J
7 \$ ]2 e' P' A) j" P& C2)创建一个用户用于Libvirt访问Ceph集群的块设备。
% Q# w  ?9 t/ I5 N% m9 V0 `) o0 N( G. d
3)创建一个Qemu存储卷。" c. K. X. I: A4 v/ Z

) T; c4 Q+ X# D) J3 p8 k( Y4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。
4 Z* r/ Z) U+ Y
0 v6 E# r$ d1 k0 [; g$ v; y5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
" _0 C6 {. x4 W% H9 U. g* \' Q7 h9 R) w, g
其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。
0 A3 x( m* @* G8 a- o+ ~3 |' c; t
1 w% |0 Z0 V0 t; w* e2.1.在Ceph集群中创建资源池8 {7 T0 S6 R  g  r$ z
1.创建资源池
) ?, p$ U9 _8 @( J1 m0 Z# Y[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
6 t+ d5 K- p& }pool 'kvm-libvirt-pool' created: r# S2 A1 L9 @

. V4 b" v/ \$ H$ e, O2.将资源池初始化成RBD类型8 v" d$ Z$ c( e
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool4 M8 u& O2 }/ u) r
) n, L6 a0 e' ]9 ?& u
2.2.创建用于KVM访问RBD块存储的用户
! S9 ]" }; f. X[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'$ I6 x! q0 }3 U) S8 H% J& M, n
[client.kvm-libvirt]
9 B( B( O5 u. z2 C, o: u        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==, Q3 @: Y; \0 C. A/ W# a5 B

! y- ?  Y- [+ C2 L1 w3 e2.3.创建Qemu卷
1 D. ]; G8 b' F7 c7 F$ m; \( D$ {[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G' l( x! a+ A& P
Formatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0 ' b- g% A) |3 k3 `
2 X  v- v' |. b$ ^( P3 {
[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img' j6 w! b/ W9 g
image: rbd:kvm-libvirt-pool/vs-centos-1-data.img
1 d2 z# ]5 m. V3 F/ D, {file format: raw# T5 k. k7 T5 p8 v% j) n
virtual size: 500.0G (536870912000 bytes)% K, L8 }% L' O# K( R; y& J: K
disk size: unavailable; M: l8 Y3 ^2 x# n, z+ `# b

9 m  m9 B' o/ J: y4 n) @9 v2.4.将Ceph的认证用户写入到KVM的Secret中
4 l( ]8 t/ \- t首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。0 @6 D2 v2 D; M) w* Z" B' h

: o! E4 _% E6 P用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。# u7 Q% |: A+ [  j* {" p+ I

6 n, u" M) ~& M; Q1.编写带有认证用户名称的xml# o7 N$ I. d" [# ]. L8 o% r* k1 s4 i
[root@kvm ~]# cat secret.xml: _# r4 i( @7 w3 r6 U: L+ R
<secret ephemeral='no' private='no'>! Y# ?' l; B$ X+ `4 `) h4 W
        <usage type='ceph'>3 {4 ]" m9 M9 T( }% |+ v: h8 L4 Z. E
                <name>client.kvm-libvirt secret</name>  X3 j4 d+ q0 _+ m
        </usage>* m. ~3 h& X$ q
</secret>: o" P6 ~" u, z( A1 t
#name中就是认证用户的名称8 K- Z; c# C/ C/ G; f! W: N: l
% I2 c7 y0 X7 o+ i4 U
2.将认证用户的xml文件导入到KVM中生成一个Secret7 Z  h; Y" y" [2 }
[root@kvm ~]# virsh secret-define --file secret.xml
( s4 K% x2 b; o; [- R# D2 e: R生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82) I7 c$ Q5 R  L) X2 B4 A* B, K
" t5 b. K( c  r) Y0 u
3.将认证用户的Key写入到Secret中
3 \3 u3 c4 j* T[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==/ _! e: U3 D  T' i4 [4 d! ]1 x
secret 值设定- \7 C- z. N  C$ g6 y  ^
#--secret:secret的uuid
6 N4 `" s0 V% t9 A0 L#--base64:用户的key. m  G& B+ p$ T2 v2 s
2 g3 h: Q; t# x4 v
4.查看生成的Secret信息
$ q/ a+ o* V5 f# H6 f( F[root@kvm ~]# virsh secret-list - W: w' Q, F7 k1 \% C. ]1 F
UUID                                  用量
% k- a1 C" m9 Z1 v--------------------------------------------------------------------------------
, B$ L% l2 S$ z* G( X: C 66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret5 A- j7 T) o5 I8 _9 W
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
" P- G, S# y2 r. P  p' x) |& ]7 V$ {<secret ephemeral='no' private='no'>
0 z8 N& `3 l' n8 I* `7 V2 Q. r  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>0 F& i) y2 Q" K' `# q
  <usage type='ceph'>
8 P& `" c$ U3 ~: H' J( ~6 H    <name>client.kvm-libvirt secret</name>
  d8 }) P; k, I  </usage>' U, n, @8 x! K7 ~1 h5 I( r
</secret>
% n; P% e9 W& r
: w4 ^) k/ z( Z8 A+ g0 w$ m9 ]2.5.在虚拟机中应用RBD块存储中创建的块设备
* Y9 ^9 J4 b+ ^2 u0 ~1 o需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。
; _' `5 L# b" E3 [0 y6 ]
. K4 M( N) a% }# l  T1)先停止运行虚拟机7 L% `# ]6 ^: E+ t2 T

' C* C0 P6 y$ r3 o9 I) g/ X$ A虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。
0 n$ u% p$ u7 L' f& f. c5 U4 l% F6 C" L. ]. O) K2 l  F. l! c2 R
[root@kvm ~]# virsh destroy vs-centos-1
) C2 _$ }3 X  n# B/ c& d域 vs-centos-1 被删除- |: D7 ?: p0 Y( Z

5 N( P3 V' j+ U# X" L9 R! B) @2)调整虚拟机的配置文件增加硬盘
& W3 e% ]2 ?3 U2 ~) r; w% J
! U: l8 N4 O2 d; z在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。. i2 r# ~( g" A  j( N

/ L$ [, k1 E. a3 P! b6 E+ }在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。4 a& v( ~' H% s7 P+ e9 D

9 [+ Z' _* e5 S$ v! i在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。
, M3 u& J$ M# X. U# B8 G  Y$ d$ \1 V" @3 k% ^; J) F6 }3 {9 m# K. h
[root@kvm ~]# virsh edit vs-centos-1 8 E% r" R/ A) V, Q: X
    <disk type='network' device='disk'>
) [+ C: s, s% p# H, q% s9 i9 i3 f      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>) B, a- i- g4 v
           <host name='192.18.0.20' port='6789'/># ^7 e% g; R: m' r/ x+ `% n
           <host name='192.18.0.21' port='6789'/>& R; B3 w( C* Q" w
           <host name='192.18.0.22' port='6789'/>" s7 s, K  L  [
      </source>
4 ^) J) P  K. n) P7 j      <auth username='kvm-libvirt'>" k# p; x" n! D
           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>5 O0 e0 {7 P" p* s, B4 g* x
      </auth>
2 t# o/ S7 k  G8 g/ D2 x* q      <target dev='vdb' bus='virtio'/>
% ], ?5 i: ]2 E' Y    </disk>
2 t8 x: H  G4 T2 A9 N! x/ c( [) }$ d2 K4 O* ~' e

1 ~) Q) ~( Q+ C' V
! g" D& L+ x1 l9 t3)启动虚拟机观察硬盘是否添加成功3 d/ @1 b9 y, r- }; v$ t9 C6 ?

. r9 Q% |! K+ t3 u1 b- e, Y两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。8 A3 m$ G7 x1 i" N- S# H5 g0 p+ w

8 y. u, |- A! D# p/ T+ g, M[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
- \" Z5 v: O- m$ r4 ?drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/vs-centos-1.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
/ z1 g; S+ x9 V/ d4 {$ R. }- d" ^drive-virtio-disk1: removable=0 io-status=ok file=rbd:kvm-libvirt-pool/vs-centos-1-data.img:id=kvm-libvirt:key=AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==:auth_supported=cephx\\;none:mon_host=192.168.20.20\\:6789\\;192.168.20.21\\:6789\\;192.168.20.22\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
4 @* Y0 i/ P! n3 odrive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
0 n5 M( \/ r$ i* R  Q4 r
3 G5 A, {5 `( A4 P[root@kvm ~]# virsh domblklist vs-centos-1
3 |5 F7 A9 m4 B3 ^! U/ o% d目标     源
) m4 R% s* N3 T, \------------------------------------------------: T2 L: X0 ~' Y1 U  `# K# L$ B2 V
vda        /var/lib/libvirt/images/vs-centos-1.img
, ^5 F  {7 v, q) K& Cvdb        kvm-libvirt-pool/vs-centos-1-data.img
0 Q; Z& a+ w! Y: y2 Z6 l  Y9 qhda        -
- ~2 i6 p- b  G* n; c( i$ m# R
* H# a  o8 Y5 W( Z$ K7 H3 v2.6.虚拟机使用RBD块存储提供的硬盘+ P( e$ ^7 y7 S$ X" Z
RBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。
$ B$ J" W: l4 _4 U2 b+ p) j% L% c/ {4 A, d
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。. Q' G2 B* [" h" P# q( t* d

' b0 T, Q, Y0 i: v# Y9 Q% D+ v; {lsblk
, f2 \' D% q; d: N: x7 Jmkfs.xfs /dev/vdb1 B: p, X$ R- J. X' q' P
mkdir /data% x0 K5 O: e  E, Z5 V" l
mount /dev/vdb /data1 x( u: u6 B# ?3 k
df -hT
8 L; D! d% ?4 p7 _% p1 Tcd /data" d& E# C* g' a( t# L) o; m* S
touch file{1..5}.txt
6 z0 @7 S+ l; @% _. V  |; _ll) p# H9 N. B5 m5 v2 R5 r
: }8 ^) _- D$ _0 Q3 H$ y+ o
. b/ k: H' a# l( ?& X2 X" F# p6 `
此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。% t5 m& a# R  V4 b' j9 j6 x& F; t

( g$ e4 }5 _! C# ]2 y3 l4 _9 U* _0 A
: _8 G+ L4 T3 S; y$ b7 G' o
! F, Z, _7 t8 }$ p5 S" N/ H  }2.7.RBD提供给KVM虚拟机的硬盘扩容方法
; E+ d2 L4 G, }3 u' J1)扩容RBD块存储中块设备的空间. X, @9 }; v: Q: \, D6 j

1 l$ d( X0 E; ~/ b% T0 o将原来的5G扩容到7G。
% u, l7 ^5 X" ^- H% b. R7 p, V
) _5 X+ d1 P; [1 _: W5 m[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G, n9 `+ l# q5 a* z
Image resized.
) w5 [; T6 W; m2 n: G$ o4 K5 w2 R& ?) M) I& `
2)重启虚拟机
, D, N0 c; n" x6 q. z6 ~
; w( n: }, j! i7 [4 J* G! qKVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。
" _' [, c, R" @/ C! q9 c3 ]( l, Y# z- C5 [- M5 @8 G* V, R
[root@kvm ~]# virsh destroy vs-centos-19 i' `& M$ @+ f
域 vs-centos-1 被删除
  M, h, C2 n% r" t
8 Y# o7 f3 x' R6 C1 |[root@kvm ~]# virsh start vs-centos-1
4 J3 m7 q* k/ _- d" K域 vs-centos-1 已开始! f. R5 x) O6 k+ R

" [0 v0 O# r! e6 W. H1 B. x2 f$ N8 u! N( r$ ^( z
3)查看硬盘空间是否生效4 P8 j5 z. Q- V( F- K
  l  x5 O# r7 k9 w# E1 M7 L
磁盘空间已生效。& F/ b+ o2 q( O" I

) e1 l  \, ]6 Q! y3 H- @, C
; ]2 U4 l( o; v, S, Z" |4 \/ G' H+ i  T& }5 [( w
3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储! K8 V. @( `5 C: x* c+ V
首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。
; O/ B1 H2 D" E2 V# V7 N
) M/ A$ N. C/ g) c9 M% F3.1.将本地的系统盘导入到Ceph集群的RBD中
- \% G/ }8 v' @, c' O6 D命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}0 c: M+ I5 ~' I, f/ ?9 T
- z* M) C# u: i4 c' e6 p" M; h
[root@kvm ~]# qemu-img convert -f qcow2 /var/lib/libvirt/images/virtual-host.img -O raw rbd:kvm-libvirt-pool/vs-centos-1-sys.img
# P+ v: k, y- z) y  X- @* w7 U4 S( G# c' _, I
查看导入到RBD块存储的系统盘。
* K3 w2 @1 Z: U- q6 I% t# x* t) g5 }/ P" w8 i
[root@kvm ~]# rbd -p kvm-libvirt-pool ls% C' D2 D7 ~2 o! N' o* _9 J
vs-centos-1-data.img
. R8 Q4 a% ]) l( K$ r9 t1 xvs-centos-1-sys.img
7 U- @" I+ M% D3 q+ |$ D% |5 V# P( e2 }2 T& N1 ^
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img; b4 g4 ]) ~- G) X. u: D8 }
rbd image 'vs-centos-1-sys.img':
9 ?/ u, s; P* t& L+ Q        size 10 GiB in 2560 objects
2 [' }* y* z3 }        order 22 (4 MiB objects)' y+ Q9 _% |1 Z6 J
        snapshot_count: 0
2 P) K, \7 Q. V# F/ K. E1 h1 \        id: 19a5d559f577b
5 ^( _4 N3 W! S% y        block_name_prefix: rbd_data.19a5d559f577b
# ], O0 o4 N9 H3 H4 ]5 ^        format: 29 d# @3 U7 s. a
        features: layering5 k0 O3 w& i8 p
        op_features: 0 i# H# Z, f  B& G0 n* {7 ]
        flags: & c9 d* X! t# V+ g+ W5 Z
        create_timestamp: Thu Apr 21 13:06:56 2022
( v9 u  v9 h* I' `7 @+ A        access_timestamp: Thu Apr 21 13:06:56 2022
1 u# |  Z+ s  I0 z  a9 D. j9 X' `8 t6 H        modify_timestamp: Thu Apr 21 13:08:58 2022
- L0 y+ v2 P/ J8 f# X4 S! {) a! T6 w" V) X
3.2.修改虚拟机的配置文件调整系统盘的路径& {: h1 ^$ {2 m( \/ D! J
直接将现有系统盘的配置信息修改成下面的内容。
2 r' v5 ?- m2 l8 w4 M1 ~
2 o7 P: C  ?. b8 U* x" ?; R0 d[root@kvm ~]# virsh edit vs-centos-1 * N0 g1 z$ p+ T2 F& O) S  n1 X6 A) R
    <disk type='network' device='disk'>" D2 L! E5 e( x8 F1 a5 c
      <driver name='qemu'/>
1 i2 t5 M5 q8 C; e+ K      <auth username='kvm-libvirt'>! \% p1 C4 ]. D, S' s: ]$ S
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
# o5 h# s1 w- N, h( \; k: `: Z% N      </auth>) q6 v* _" ^) R/ }9 g
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>' j9 o& `) |' M2 z  c- M  s7 u
        <host name='192.168.20.20' port='6789'/>6 x6 B* F4 y( `+ |0 N
        <host name='192.168.20.21' port='6789'/>$ p5 c4 J3 C- t& o- L' N, R6 V
        <host name='192.168.20.22' port='6789'/>5 w# E, |7 l& [- l2 Y
      </source>
0 c' b) W  e3 D; g8 Z8 M  h      <target dev='vda' bus='virtio'/>( @- n, W3 E# l  f+ ]7 O6 |5 s  t1 V7 O
    </disk>
+ P$ M: J$ j/ {, C" [6 z5 ]" ~9 N9 @& R% W( S( m3 l2 N

; N! Z# ?( r3 F; Z( D6 ~8 }
. e3 H) S' j) Z3.3.重启虚拟机, {, s/ E+ }4 J$ ~
[root@kvm ~]# virsh destroy vs-centos-1
# A0 p. p' {9 l2 Q域 vs-centos-1 被删除
: V! @$ D& G# ]2 W2 R& ^+ h" z  J
* Z; v7 j4 @% w. j; v* P: T[root@kvm ~]# virsh start vs-centos-1
8 U1 H! m: @4 u# r# ?域 vs-centos-1 已开始
" G' M2 @6 t0 x2 L
  O2 E7 ?; Q( w/ ^3.4.验证虚拟机是否可用
! U, J7 r( Z5 h; n8 L6 R安全没问题。1 V. F$ J* m5 ^7 N1 j5 Y

  |* o* Y% ]# E$ u2 a( r. ?5 Z" g/ D5 Z; m- X8 b4 C3 r/ k
% F" V- L1 d* t( `. w7 b
4.实现类似云平台秒级部署虚拟机
$ c! m4 f& C# m3 m# \) b在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。
, D% V# L$ y+ v( ?+ Z
  J7 _- C0 P4 L! D" j! r( {' Z/ C0 s秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。2 w3 g8 O& u0 {* J4 l

6 |/ v0 i' w6 {9 v7 X如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。
4 f' `& c! C; d3 K  Z: o! b, i4 P- {% m- {
4.1.将现有虚拟机的系统镜像块设备创建一个快照! A% O6 S% r  ~& X
将系统盘对应的块设备创建一个快照并设置成保护模式。+ r3 @; b: d) I7 h' k) l/ p  A# Q
3 Q, @9 r0 N# A
[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template2 l6 ^9 [& H. s  T; x
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
* l  w& S& b$ c9 C3 ~3 F
4 C$ s& p' y, c. _3 R7 I4 b4.2.为新虚拟机提供克隆镜像
% x" l2 ]3 g: s" O' E为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。6 L7 s) m' r4 M7 R, x) |: Q! E

3 m0 P+ H/ N! w: {( N[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img! Y- }9 T' m! J$ `
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img
5 z$ `' }% K) @0 ?7 E
! T# U2 k5 X& l; N# x) p# C% s3 c: _3 E0 r; ?2 z3 u
4.3.通过虚拟机文件准备多个虚拟机
: d. J0 E3 N' m- b! h' s3 }KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。
, J2 g  o: N- }7 D. s: d) H, a2 Z9 N, i; `( u1 S
进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
. Q& j& c8 o8 E2 E; T& O' n
/ p7 s( E1 x' N$ v0 w[root@kvm qemu]# cd /etc/libvirt/qemu/4 W0 A" p; v5 H; `; x. q2 p
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml ' H5 k) f7 V) Y2 ?$ t
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml
9 y! i: b% A" m8 N0 `7 Z0 ?* w9 S8 F) b  S$ A2 |) l/ g* W$ k9 l

3 W4 @% G8 Y/ _- F6 _& t! u4.4.编辑虚拟机的配置文件. [" f  {' t! {* z* H& f
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。
* ~! x* Z7 o! _- c& b& O# d+ f7 s$ F0 r7 w  J3 n3 Q6 U
<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>5 [  i) D& y7 _; E0 E
5 S1 c3 _3 y, H+ |1 h/ t
<mac address='52:54:00:eb:f6:97'/>' Q4 @  T- j1 n0 V
; I- N( v! L- C
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>6 x4 g4 T8 F, u5 r* c& @

& C) ^  o- k- I  @4.4.1.vs-centos-1虚拟机的配置文件! h% ^' ~4 K: @5 g+ x7 q
[root@kvm qemu]# vim clone-vm-1.xml
+ r- P* b+ A6 I6 U<!--
/ U- g: V# d* L" r" EWARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
" E% [) U, a( [+ u- aOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:/ I3 J7 x% ^0 i/ ^8 \
  virsh edit vs-centos-1
8 P; T# w1 ^/ n, |or other application using the libvirt API.& G, s4 ^. H- i5 _* m
-->
( Y- M' s' n1 M* z4 d7 T9 _. I: R* u' ?5 @
<domain type='kvm'>
3 n8 T9 L+ `/ X  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->
+ T# z$ t; e5 u5 \9 U& a+ o  <memory unit='KiB'>1048576</memory>  l8 M, ^# }+ ]: M2 h+ @
  <currentMemory unit='KiB'>1048576</currentMemory>
  G  v5 v4 F& i# E  <vcpu placement='static'>1</vcpu>5 [: X" k, p. k
  <os>
* Y) g! N- i: E( f    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>& z+ C* s. a! t$ W) Z, v" _! _; d
    <boot dev='hd'/>/ T0 l; ]$ }/ @$ D
  </os>) `( c% R: f" r# O$ i! }8 d+ d( r
  <features>
4 ^9 x, l, V+ i( L7 m    <acpi/>
+ T9 e8 M- S! e" ]: e5 \    <apic/>
4 t- Y, i$ W: E; C  </features>
" p9 ]( o/ ]6 O6 e  o& \  B+ O  <cpu mode='custom' match='exact' check='partial'>
+ H$ R+ T! J  k& j0 P    <model fallback='allow'>Nehalem-IBRS</model>! j" T" K2 k. e, ]: r! B
  </cpu>
  J+ T: N) l* \  <clock offset='utc'>' ?5 |$ G2 I1 Q: x" J) @6 s* ^
    <timer name='rtc' tickpolicy='catchup'/>5 |/ E( b5 L5 G6 l7 P/ n
    <timer name='pit' tickpolicy='delay'/>0 v0 U# l' |! g. X! u/ O
    <timer name='hpet' present='no'/>6 u- a" n; j. h! d8 }% c% V
  </clock>& p6 R# T/ `6 T( _* k: |0 `1 {/ v
  <on_poweroff>destroy</on_poweroff>
, H7 c+ m5 Y9 x, B/ ]4 }5 A  <on_reboot>restart</on_reboot>* Y' d4 p$ u. k; L9 }( ^
  <on_crash>destroy</on_crash>$ X$ v9 A! }! X
  <pm>
, f- B( J4 d, [/ T, H0 Y& d, W8 ^    <suspend-to-mem enabled='no'/>
4 J, ?8 ?/ B3 w3 X. g* h1 Q    <suspend-to-disk enabled='no'/>- o" j3 f: g' z. L
  </pm>* i2 m% ^* d8 C8 S. F
  <devices>
5 v* A9 R: U1 N" ]* g4 \1 C    <emulator>/usr/libexec/qemu-kvm</emulator>- |0 t1 p1 p( q% \5 m& h
    <disk type='network' device='disk'>
" Z, P, X' j6 Y3 f      <driver name='qemu'/>
3 A; d4 C* S: h3 Z3 g- t      <auth username='kvm-libvirt'>
- u  {+ z* ?3 u. j0 I! `) c. ^        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
/ d7 a) {- e* J0 Y  F2 q$ ?" N      </auth>% x+ h8 o5 e. y/ c
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->/ E4 j8 E' d3 J0 {
        <host name='192.168.20.20' port='6789'/>2 |9 v2 O/ H2 N. }+ b
        <host name='192.168.20.21' port='6789'/>" S) P, n0 k4 l
        <host name='192.168.20.22' port='6789'/>+ u, E8 M) l) e
      </source>
. u* k! U8 b) i2 q  e5 @      <target dev='vda' bus='virtio'/>1 d! I6 x2 Y" v& ]
    </disk>1 A/ d2 l2 Z& R8 Z  P: n
    <disk type='file' device='cdrom'>. [( R( S0 r# G0 _. |& {
      <driver name='qemu' type='raw'/>$ e4 B% [  j1 S. l! ]3 V+ A! r
      <target dev='hda' bus='ide'/>
0 W9 {- }! t. I  w      <readonly/>
- _; e. D( i- e* b3 }3 [      <address type='drive' controller='0' bus='0' target='0' unit='0'/>- E7 s& R, D2 W$ ?6 [2 [- f
    </disk>$ a( I% A; b/ o$ o" `0 ?
    <controller type='usb' index='0' model='ich9-ehci1'>
7 z1 E& I* s) `( r' m      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
* z% g4 d+ d+ A, ?' Z    </controller>: n9 ~! d  S. c0 a$ t5 e/ |
    <controller type='usb' index='0' model='ich9-uhci1'>7 J9 f  `& ]% D* o2 R4 b
      <master startport='0'/>3 \) [8 `/ c6 t" S; c  j
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>1 x, E( {8 Y2 Q: t" d
    </controller>! P9 e9 b% r3 r/ \
    <controller type='usb' index='0' model='ich9-uhci2'>
$ ~/ R* `9 j! C- [      <master startport='2'/>
. u% y( v8 t4 ^' _      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>. F0 a, C4 F" W; I- ~% m" r6 X/ |* z
    </controller>
* T' U* C/ r9 H' F! D! m    <controller type='usb' index='0' model='ich9-uhci3'>6 s1 e! Q$ m7 v
      <master startport='4'/>
6 Q" w. ~3 ^! y/ W5 t      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
. g& f3 y5 N' B3 {; W9 v    </controller>) v+ x$ k) p$ d# c; F, T' X
    <controller type='pci' index='0' model='pci-root'/>
$ C+ ~; ^1 j6 O+ L7 g# t* P5 }0 s    <controller type='ide' index='0'>
, F8 b6 ^, T% ^( S3 z      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
% b; O; X5 J- x' a  y    </controller>
3 ^1 [' q2 g$ l% @" O: F( A    <controller type='virtio-serial' index='0'>- o1 K1 u. Z; M
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
0 l1 T! ~0 F3 a0 t& Q0 S' A# H    </controller>
5 h7 c( w5 |" Z- v' T7 Q0 j    <interface type='network'>
0 k5 Q! n# O2 C8 O      <source network='default'/>- |- N( t. v, t
      <model type='virtio'/>1 e; N( e0 t: x5 V5 A) B6 [# X$ J
    </interface>
3 r: b2 T  ^7 U" m3 Q1 l$ |9 t# s    <serial type='pty'>5 ?; p2 A5 b: b, a2 v  i( P7 ^" x
      <target type='isa-serial' port='0'>: I8 S! }) `; k$ a, ^  `- E) r
        <model name='isa-serial'/>+ a- ^. U4 A- P
      </target>
6 [! S# U9 q0 D4 y! k9 V* j    </serial>- W5 l7 o; F7 ]0 t" q  E2 u
    <console type='pty'>
6 w9 s1 y1 C3 V4 t! Z      <target type='serial' port='0'/>$ y3 B; @! {3 a* c+ ~3 W& ~
    </console>4 w5 q6 Q% S5 g' v! M9 g3 z" j
    <channel type='unix'>
* y* {/ k1 {, U5 O      <target type='virtio' name='org.qemu.guest_agent.0'/>' a' v1 i; N' Q- H
      <address type='virtio-serial' controller='0' bus='0' port='1'/>6 D. H  T$ A5 u! w$ c$ W3 L! P, {, V
    </channel>2 Q. h& `% g0 _5 n
    <input type='tablet' bus='usb'>
; z8 R+ d5 _7 l2 q# P      <address type='usb' bus='0' port='1'/># E6 T% ~0 P3 O% w
    </input>
" Y/ J4 o6 A1 B2 F$ w+ u- [    <input type='mouse' bus='ps2'/>
! Y! Z) a% v& Y. B& @    <input type='keyboard' bus='ps2'/>
! z3 Q% f/ e, ~) g1 s# N    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->; n3 i3 f+ `9 h
      <listen type='address' address='0.0.0.0'/>
: u5 q4 o* ?1 u; I    </graphics>
* w5 T( O4 }% j( o( b    <video>) p8 }0 G9 T3 m) k( V: g
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
0 o1 L7 M% N0 x: J- m      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
" l! Q  u# q6 _2 ^5 U    </video>
. B0 E2 Z2 p2 D( ?0 [$ y  w6 F    <memballoon model='virtio'>
: i8 b6 l7 w7 W, V. k      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>8 x' B! |. m+ l# W$ b  d
    </memballoon>. j' P3 v: G- F
  </devices>
0 k' X" T1 @& Q1 B3 K</domain>
) C: V) Q+ k( G2 c+ T1 w4 s- ]8 I, ^1 d3 {3 V
4.4.1.vs-centos-2虚拟机的配置文件
4 Z. p! `. {( D[root@kvm qemu]# vim clone-vm-2.xml
" [/ ~5 @8 Q% H1 k( I; k<!--
) s* Q" s8 H$ @7 [     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
7 H% i6 c+ p  x# w0 j4 _" wOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
! w0 n1 g7 R  y8 {% ~$ }) L* R6 w  virsh edit vs-centos-17 @- o+ J8 @/ @- g
or other application using the libvirt API./ ?6 D- t9 c) M) O8 s4 d$ d' V: ?
-->9 y* q) k! Y( @( p/ g
7 M* c* E& F8 f; S3 z) }9 {# A) S
<domain type='kvm'>3 A: l2 b* E5 Q/ |
  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->
6 Y" D& [; i  U  r1 C6 Y* S2 N  <memory unit='KiB'>1048576</memory>6 b  I( ~+ z" H& j- u; p/ r
  <currentMemory unit='KiB'>1048576</currentMemory>+ `7 j5 A0 Q) c6 D/ |0 y
  <vcpu placement='static'>1</vcpu>
( W# t' d; h4 }- r4 w3 t( U  <os>
. @, o1 D& y. i4 p) K    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>8 d+ @0 Y' v$ N7 P5 k
    <boot dev='hd'/>" G6 U* x2 L# v6 L" ?% Q
  </os>0 j+ E8 d2 k! e4 M/ x% ]# N
  <features>$ V+ G: E1 z, R4 V, R" Q
    <acpi/>
6 V% c( l+ W8 I    <apic/>
5 g6 |' o0 z6 h/ P: g6 q  </features>
8 X$ y. u; w( A. T0 G. Q- E. p  <cpu mode='custom' match='exact' check='partial'>9 P1 u% s' Q( w' O" S+ i
    <model fallback='allow'>Nehalem-IBRS</model>
  a% h8 w1 }7 [0 b$ v. x) K  </cpu>
1 d+ |/ \, E# T  N' ^  <clock offset='utc'>
2 L0 \! U5 O# R3 J    <timer name='rtc' tickpolicy='catchup'/>6 Y( B- C0 o$ v% ~/ L" g5 K2 u
    <timer name='pit' tickpolicy='delay'/>& g$ ^+ ^8 v4 O) ^( i$ |6 \
    <timer name='hpet' present='no'/>
3 k1 J0 `2 g. j3 H$ U  </clock>
$ [# q& T! @4 |3 f  <on_poweroff>destroy</on_poweroff>/ N* v5 n" W7 l) {! q( Z+ ]
  <on_reboot>restart</on_reboot>; o; i& M" i4 W% k5 W
  <on_crash>destroy</on_crash>
- R8 ]; |& F2 n3 r9 b  <pm>
( Y& i; g1 c6 D, \( u1 ?    <suspend-to-mem enabled='no'/>
' b( G! V* C+ M) S    <suspend-to-disk enabled='no'/>  Q3 U5 \% C* ?% X) T) E
  </pm>
* z; w) p0 u6 U5 n2 X- M: {  <devices>0 d1 Q0 {9 N; C- W  C) G5 N$ d
    <emulator>/usr/libexec/qemu-kvm</emulator>6 D8 T, [. l" K
    <disk type='network' device='disk'>- A% g$ l0 j% Y$ i" L/ q
      <driver name='qemu'/>/ I7 X. P/ ~1 m6 d
      <auth username='kvm-libvirt'>+ D8 `. H9 G5 ]' l7 y; ]" x
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
" u2 |6 k( v4 V% e. o! G$ }) d      </auth>
- `" I' M' E8 i6 G. Z+ F1 J      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径-->
$ r( S! }4 `4 y8 S        <host name='192.168.20.20' port='6789'/>+ [2 \$ g% m; f  c
        <host name='192.168.20.21' port='6789'/>
) J# ^6 R! Y7 w/ q        <host name='192.168.20.22' port='6789'/>
8 n) q' }  d: x5 s      </source>6 f6 K( A" l6 X/ t7 z* |
      <target dev='vda' bus='virtio'/>
1 q- q# y  V$ {& R    </disk>
& P. d& @* b2 {  B- Z    <disk type='file' device='cdrom'>) ?7 U% N/ V& d4 M  N6 h6 K1 D
      <driver name='qemu' type='raw'/>$ o" X7 V# f. C& V( I. Q6 W
      <target dev='hda' bus='ide'/>
. e% D% }7 Y3 d, V  w      <readonly/>
; w$ U+ Q, m) h* d' t' ~      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
. N; Z+ A* q. G    </disk>
. d  ]1 p5 T7 q    <controller type='usb' index='0' model='ich9-ehci1'>
6 {: C) H/ c9 b, d) T. b, A      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>, U" x* A2 e9 t: `- p9 A7 C
    </controller>$ _: N% ^8 ]/ k. N( y. _5 `# E2 k6 a
    <controller type='usb' index='0' model='ich9-uhci1'>+ E  X0 }* r; n' Y7 d
      <master startport='0'/>7 z6 U% f6 c- R; n/ H
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>8 q7 N( R5 r! t" S1 V
    </controller>$ C8 B6 O& p9 p# U0 h* z
    <controller type='usb' index='0' model='ich9-uhci2'>
0 k3 e0 }7 T3 _* N2 a* R% M      <master startport='2'/>
1 ?* ]- \' i; m* L4 D5 ]1 d0 |5 W      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
" }$ F+ M# I  x# r! f# V4 z& i    </controller>8 \0 G8 u; S4 w$ B9 M2 |* T5 K
    <controller type='usb' index='0' model='ich9-uhci3'>7 c/ K$ J, Z0 H- K# H
      <master startport='4'/>' w" x$ T0 g( P3 F+ z- R
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>- t* w$ I5 T3 o
    </controller>" {0 V9 l2 w) Z9 S2 B
    <controller type='pci' index='0' model='pci-root'/>
2 q9 ^3 B8 H" a) r* Q    <controller type='ide' index='0'>
, C* ^+ F4 v& q& D4 N( @      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
% r# `1 K5 r: r    </controller>3 O) Q5 W% Q/ @( J* k
    <controller type='virtio-serial' index='0'>9 o+ s+ u& |1 L1 x' Z! W1 o
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
1 i/ i( ]( {8 l- U1 y    </controller>
! w) O. i* A4 N3 u    <interface type='network'>) P" o+ z, q7 w) A6 t5 V6 u
      <source network='default'/>
4 e0 n0 @; x" r: E( I      <model type='virtio'/>( f4 C7 }# `0 j& [
    </interface>1 |# T# q$ Q+ x7 \
    <serial type='pty'># o6 i0 Y. G6 d/ ]( w' F
      <target type='isa-serial' port='0'>
6 o# `0 P) E# H- p. t# X% b; _        <model name='isa-serial'/>
4 }: k+ w+ j. T6 F) @( s; K2 f( x0 [' q      </target>0 g0 F+ N. v- K" E- b( I* E
    </serial>8 }) f5 E* l4 J! `$ c) i7 u2 V
    <console type='pty'>" ]) A: t, v' U# p- @
      <target type='serial' port='0'/>
: {) H+ q$ P: Z+ @4 C5 H    </console>8 K- z5 f( X7 v6 J# q4 H! d
    <channel type='unix'>
7 V( X+ |' e" n: ]      <target type='virtio' name='org.qemu.guest_agent.0'/># u! y6 `' R/ Q1 C& J4 q
      <address type='virtio-serial' controller='0' bus='0' port='1'/>5 e; p' t+ |% |
    </channel>
( d, M& _8 l5 e) v    <input type='tablet' bus='usb'>/ k3 Q" y4 |  }3 j% P* f* ~" U" g8 I
      <address type='usb' bus='0' port='1'/>: x2 M  W# ?1 e: G9 L6 a
    </input>- k  B, x8 \8 ]- M: X- d
    <input type='mouse' bus='ps2'/>
0 u1 E. T2 r/ W+ V- r; Y- x; M( K2 p    <input type='keyboard' bus='ps2'/>  c, g" R$ V. w& s+ z
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
, ]  u: E- M& }( w, z      <listen type='address' address='0.0.0.0'/>5 ^0 m6 j+ f9 }2 n) N2 v
    </graphics>
  K$ Z2 Y; i5 n( o' p0 G+ y  U    <video>
4 k6 g. Y) g# e' I      <model type='cirrus' vram='16384' heads='1' primary='yes'/>" P; @! F- `5 J  B# J
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
6 p  T/ K0 {3 y    </video>" g8 F' f+ T7 I. N7 |# a8 C9 G
    <memballoon model='virtio'>1 m) i5 e" e: \, Q& L7 ]5 \$ v
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
: b) S; z" X7 o    </memballoon>
- {$ P9 N/ @4 r, A, f. x, Y  n  </devices>5 F9 u! `' {/ X7 w
</domain>- B- K3 ?* s" S( s
/ m- Q. E. r5 P8 F* F- G. ^

8 D# I/ Z4 M0 f+ y: Z3 Y4 |/ ]4.5.将虚拟机配置文件导入到虚拟化平台
# p4 E7 r5 ^! s  n[root@kvm qemu]# virsh define clone-vm-1.xml 2 |' Y/ `+ Y1 H2 g
定义域 clone-vm-1(从 clone-vm-1.xml)- L( c4 M0 x4 @

/ s( V( w& n( Y$ |. {0 N[root@kvm qemu]# virsh define clone-vm-2.xml ) h1 y1 [, _" f. C# G9 D( j
定义域 clone-vm-2(从 clone-vm-2.xml)9 D1 h: J6 ?+ q1 @

$ s3 P/ O$ c8 W. ]$ |  j+ ~6 n+ }$ {# M5 x  Z3 O
导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。- [; e( w5 h$ h% m% a: f
/ W3 a9 \$ t! L9 m
[root@kvm qemu]# virsh list  --all
9 g5 M4 a7 ?+ L# W" g' N Id    名称                         状态
3 T. c) X; h# J8 j( j----------------------------------------------------
3 S2 A/ p; p/ I8 Q 7     vs-centos-1                    running
" }  Y" \( o0 R. y+ h; _+ X, [0 N -     clone-vm-1                     关闭
6 a4 ?; I3 \1 c/ C -     clone-vm-2                     关闭- c( H$ h7 ]& f3 V

- L' \1 p1 f" T9 o1 ^4.6.启动虚拟机验证是否能够秒级使用
1 K* w. r& Y3 G[root@kvm qemu]# virsh start  clone-vm-1
( S5 a/ ^% Y2 y, ?域 clone-vm-1 已开始
/ `0 i6 ~: b0 a, H9 a0 {6 r' h& ]
2 z  v+ h8 |' q* E  P# h# i8 F[root@kvm qemu]# virsh start  clone-vm-25 z+ C  |' y! `) x
域 clone-vm-2 已开始$ `* t0 ^0 d: Q; V. m2 T. _* c0 a
+ N' t9 b  K; r

" Q' ], u: ]5 f2 b; s3 C待后期更新。
9 A4 _" J* B/ O9 z
; S  Y# f% V- q9 `" q0 ~& g. y. E. D; O! z

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通
) [- H6 q9 Y- C6 p$ w. K. g3 M3 [' N2 y7 `2 Q* D
1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)" {$ B0 m" S" P& z& q
$ P( o, V7 w6 I$ T' h/ d" s
2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下
, H2 b6 v# S. A5 c) D
. o; S) |' t% `; l4 F( }* _3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通
# g- U+ U: K$ E8 C" l. n: a) G$ p/ M9 G5 t
二、创建rbd盘并挂载给虚拟机5 \" A$ }! z- r

/ D& o+ N. n& I2 P  I! T5 p. k1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池6 K! U1 R! b0 z) m/ E
9 t( \6 a: r% ], v+ G/ i- g5 p$ c9 g
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'  w- A' q6 r1 r% ~" P
! R' h4 Q1 n2 Y
验证有效:ceph auth ls|grep client.libvirt
4 k# O4 w/ u6 ]0 {3 h4 D+ N# |

7 ^" R( G3 n: S1 }, a0 M: k! _5 K9 h0 H6 f$ k4 S3 \
备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行2 E" F: {" B$ r

* Q5 R- s# i6 ?4 l2.创建secret.xml
% a9 R6 X  M. B# b% q( K4 z1 J- h' q& T
cat > secret.xml <<EOF
, m" [7 w% b# v7 _0 M1 a! L+ z& N  S/ J  g! I
<secret ephemeral='no' private='no'>2 R1 ~* i6 k! M+ ~5 g3 b" {
, k' s+ d$ h+ r4 m4 H
        <usage type='ceph'>0 T8 r$ W1 |& W! ^

# ~+ w# J' V8 `$ X) |                <name>client.libvirt secret</name>
) w. Q0 H3 A* x6 R1 r/ T; c) {! P' K4 }0 n, `
        </usage>
7 m2 W( I6 Z9 F. c7 V- F5 n+ s3 m) W
</secret>
: K, e8 X! S$ F( d8 U3 Z# k
0 ]' k4 c  E5 C8 |4 ?4 d( m4 o2 yEOF
- _$ V) m& x$ o% K( }) y- Q9 d0 j& A5 D9 x: u
备注:以上命令在宿主机上全部复制并粘贴,最后回车$ s+ B" p# J6 p7 Q8 p) c  z- y9 \' ~

. V2 X& W+ x: c& s4 Q# P0 O3.生成uuid) _  L% ?+ C6 \. I# t1 S
8 r: K& p3 B. z& ^+ d
sudo virsh secret-define --file secret.xml$ V6 X6 R3 T0 u7 y' @

' I. F2 L6 c, O2 f{uuid of secret}
4 w. K. x: i$ [+ E) E
* F6 t' r$ R8 T$ Q, c8 V' x  Q" F4 x0 A4.获取client.libvirt的key并保存到文件
$ v- n% |4 Y2 j+ p2 y# f
+ g& \' f7 Z8 o: bceph auth get-key client.libvirt | sudo tee client.libvirt.key" V$ l$ s* s9 ?1 X/ t

; o+ o% G3 I+ ?3 I5、设置secret的uuid
# ^4 Q8 [! R: [' }
# A6 G, E" U" R( vsudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
1 ?$ o3 p1 v  B( t: [6 b" p
( Q& H$ F8 E) \2 @2 l/ H7 U6 M# Q9 c3 p将变量替换成实际的uuid和key
; U% O% {1 h0 Y0 [9 k5 m/ V
% }$ \0 H' T  Y% ]/ i$ Y0 U: j7 I6、创建池libvirt-pool( T8 u- Q1 |- A7 m
" y. V, s8 t4 S8 X* i" k* G! t. P
ceph osd pool create libvirt-pool 64 64
$ e; E0 f% J; `; \# y) X# P( b6 h3 k2 j# K4 e! J) \. X! ~
7、创建rbd盘1 ]' y1 U  h* ?! W: |6 Y' |
  c: C$ Y1 u" s' X
rbd create --size 10G libvirt-pool/test1 --image-feature layering
, S3 T8 @/ [0 z2 }1 }
4 d0 t; Q8 ]2 X& \& K& T' I查询存储池中的块:rbd ls libvirt-pool- U+ T  U8 K  o( B! B% G

+ v" q! }8 I* [( R/ h; |8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息
/ p2 g& N- W6 K' b4 N, e4 {  B- h0 d
6 T; [2 m9 P! H7 e7 l) Y关闭虚拟机:virsh shutdown vm; }1 o7 ~' @- b3 N9 n  I: s+ V

% X0 V; O& `. y$ N) ~. H编辑虚拟机:virsh edit vm
! O5 ~- y& Q* v
  u+ a9 n1 ]* q) K3 ?# b在disk标签下增加如下信息:( T8 c# y3 v: h5 i4 L' J' ?
& Y' x4 k8 c9 m3 f; ?4 S  d
<disk type='network' device='disk'>1 [+ e, G: m, `( B% J

, |/ d/ e2 o; M3 n  |- \      <driver name='qemu' type='raw'/>! K6 U7 n% u5 D* e4 u

: X8 S- G- e# H' f5 E$ l      <auth username='libvirt'>
6 s4 O+ m/ `0 N. h5 }7 ?) z; C
5 O' m% y- V6 u# ~# C        <secret type='ceph' uuid='{uuid of secret}'/>' C4 i# T+ G$ c' G3 P! O. j) G9 c+ c
; W! p5 S' ^3 J- B0 o4 U( R5 t
      </auth>
8 d! u; v& P! _8 [* D4 m
3 e8 U* J3 R' F  G! Y" r8 A      <source protocol='rbd' name='libvirt-pool/rbd_name'>
+ z6 C/ o2 c0 f/ L9 J6 T4 \+ }& h8 I. c% u; O
        <host name='10.25.72.142' port='6789'/>
, [4 r) I1 P  ?2 b
& R6 M( @# w# @        <host name='10.25.72.143' port='6789'/>) r" s: f9 I* L  P+ @- j

# H& w) t9 r& S% ?+ C        <host name='10.25.72.144' port='6789'/>% X1 V$ r% c0 o
0 R, H2 ~8 q$ O/ W+ Y
      </source>
! b( |0 N: k5 T( ?0 {7 e( v- L( Z
  U1 o; \: D+ S5 b% H      <target dev='vde' bus='virtio'/>% ]) ~+ b, Z; m% z* o- C
5 _2 T$ x+ f* ~7 I7 u4 j1 E
    </disk>$ `# Z6 M; X: Z
6 D+ C0 x" i6 _/ F; Y
备注:
4 I2 e3 r* Q7 g/ I8 ?6 o! Q+ u/ E( _: j# u0 j/ s5 f! i
需要修改上面5个参数:
( s( p- c' x( p
( \! m" s1 c8 p8 V1)username是建好的用户名:libvirt
4 A) x# |) s4 S# ^7 `
) B/ _7 A; t+ {/ T2)uuid替换成第3步生成的uuid2 w. \! y# U+ m
! j; M+ f5 p1 ~$ S  F% o% o* m+ o
3)host name后的ip为mon的ip和端口
. g  j2 z5 V; e, [0 O; Y: T! N  |$ B+ k$ s
mon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip3 z3 S* Z& x* I' m9 Y& T
- u8 Q8 Y* M& T& A% E! X5 Y% @

: O! }1 }$ B8 r( C* f2 ?5 b5 W: F. {, e+ M
4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde
$ J* A5 ?4 z2 I) M
" W# k* z. G  D4 |5)libvirt-pool/rbd_name是创建的rbd盘) X4 F& p9 T: I: N& U
1 m1 ~8 K) K3 ^* \
9、查看虚拟机挂载的磁盘. R4 [0 t5 F  Q8 Z
5 R( A" G1 i$ B
virsh domblklist {vm-domain-name} --details
' p8 X" ^' c2 x0 G* y- [7 L( C5 ?2 y0 M( I& T* \; ?
10、虚机开机,即可使用挂载的rbd盘
( w) z, L8 [( D* g' h
& x* H' f; ?! b8 n" {  a, _: Svirsh start vm
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:39 , Processed in 0.019790 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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