易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 29|回复: 1
收起左侧

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

[复制链接]
发表于 2024-8-19 17:00:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
1.KVM的Qemu与Ceph RBD块存储进行对接0 y# u7 C6 V" X7 }" V) Z  [
1.1.Qemu与RBD块存储对接的架构图" ]" S4 I: ]* A" q$ [. o) O
Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。
2 n  C% ?4 E- f# [' n3 I* |# m/ h% L- o' G3 F
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。. x1 {, o4 ^2 t4 V9 W1 s
) m5 F  M0 ?. i
Qemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。
: S5 ~# E6 e3 s2 k/ u. S& L2 N; r
# z0 |7 a5 |/ u+ u1 n; `% [: I
# q/ A1 z% @5 s, k: M. r4 x8 v4 w; t9 E) L# O$ m8 D% j
Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。
. Z  [7 J( V0 ?0 f& A8 b
4 T5 W* R8 N( ~官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/7 ]$ }' V% {) M/ g( R/ s& v4 I
) {" `$ e* Q! p
1.2.配置KVM服务器连接Ceph集群
/ x* ^; A3 C; K7 H( y8 l$ L. dQemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。5 M# d* d* d; C

. \& i& v+ q0 X; o' {1.安装ceph相关命令, C5 s% y( s* |5 t& r
[root@kvm ~]# yum -y install ceph-common
: V- K9 b9 ]3 c# W: x( C( k/ f6 O" q/ J0 ~
2.拷贝ceph的配置文件
3 s6 _( G) I, X2 E8 A6 T[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/
1 ]+ s9 Q# G; U. i( {
. v* E' }- I1 u/ y! E& C3.查看集群的状态! W, Y+ j# C! O
[root@kvm ~]# ceph -s- t$ X8 E' G2 I8 T# }& g7 |- ~
    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0( v& _! F8 J/ V5 Y" G9 O6 q+ U
     health HEALTH_OK
: i! f2 A; g& H, d' P     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}
* E4 }& S" E4 x            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
$ v+ g, a# V: P% l0 C6 b9 L* R     osdmap e29566: 131 osds: 128 up, 128 in
7 B7 n) R/ N& X7 Z* h9 e            flags sortbitwise,require_jewel_osds" [6 M# Y$ z2 W9 A  w2 s: k) ~* A
      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects; m  y: D& I4 ~5 \
            291 TB used, 174 TB / 465 TB avail* h: I) B3 w$ n5 z) ^0 O/ M
               10234 active+clean& N6 W+ i2 q/ x  ?9 ~* [' M
                   5 active+clean+scrubbing+deep7 S# e. X% I! B/ q0 m4 G: z
                   1 active+clean+scrubbing
. K3 o7 ?; l' `! q3 B) T9 K
5 a3 H1 I2 V! K$ t$ N, `1.3.在Ceph集群中为KVM创建一个资源池
# z+ `* y& n" U$ W( Y% _. m; {! O[root@kvm ~]# ceph osd pool create kvm_rbd 32 32
$ W  L6 ^5 v2 L9 Y; @pool 'kvm_rbd' created, b; K( r; {( Z2 D6 q2 l
- u8 }% C: P$ d3 t
1.4.使用Qemu在RBD块存储中创建卷
0 V% G) e! e! d& D1)在RBD中创建卷( c9 J- e& s/ y- d
6 X' T' h0 P; c# T6 P+ I
命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小
/ D7 {) h/ N5 a5 n+ G
' z& y; Q. S* _1 M/ s) j+ r[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G
9 D3 V# Y: l/ S$ F  n) r& W  DFormatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
! H; `& P5 d, T
5 L$ i' h; e  w# z+ u' F) l7 e8 a5 G% _0 \" U5 p6 q
2)查看创建的Qemu卷
9 N/ M+ y5 ?$ @" p) X- O
0 v/ I3 ~" y# U[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img3 l0 ], P; n3 O
image: rbd:kvm_rbd/vs-centos7.img
3 i  B( s; Z9 \0 y5 l  A8 Tfile format: raw, [6 v' v4 `6 x5 y- I* v
virtual size: 500.0G (536870912000 bytes)- {- S/ y% S  F
disk size: unavailable
4 x7 y' @' s8 u. Q
2 c6 s; x! e. h; U这个卷其实就是资源池中创建的一个块设备。5 n% z- v: E/ s
  p  L" L; n5 {
[root@kvm ~]# rbd -p kvm_rbd ls3 w$ P- N/ E/ o$ Z( s! g3 e% a# S
vs-centos7.img* W* D+ [0 I5 i. q1 v' Q
/ Q  G- Q7 n' u1 E% B. I
[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
7 u0 `+ a# z1 m: yrbd image 'vs-centos7.img':
% \$ F1 X8 _, d' Y) |        size 500 GiB in 1280 objects+ e; M! X+ q7 C8 Q8 F4 J% z5 S
        order 22 (4 MiB objects)$ t- x6 D! k4 N( ^( u/ H- G
        snapshot_count: 0
9 U& W  B5 S+ S- r) t6 w; Z6 c        id: 19a9415778427) I7 R" C' J! e# Q; T# s
        block_name_prefix: rbd_data.19a9415778427% ~4 r$ S4 G; m
        format: 27 N9 R7 e9 @, T) a
        features: layering- D  G7 p& S; \' ?+ O
        op_features: : g3 X% c: g5 F  ^# P* O
        flags:
" I8 o( x1 T# ?5 S+ x8 }        create_timestamp: Wed Apr 20 22:14:33 2022
. {% Q$ A# S7 l        access_timestamp: Wed Apr 20 22:16:43 2022
5 s8 ?& p2 C2 |8 S- Q  y        modify_timestamp: Wed Apr 20 22:14:33 2022" w$ M$ O( o5 R# u6 C

. r/ l+ ?$ b* p+ [0 ?, o; {1.5.扩容卷的空间+ R. T3 E+ K6 ^6 j4 d6 H; d9 A" v; I
[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G
0 J" ~6 D. a- l: B& G/ ~Image resized
! _3 \$ o& p3 \( \# b9 N% G+ {4 D+ p; G' o! K& O
2.Libvirt使用Qemu为KVM虚拟机提供存储
: S- B' c0 ^; t: u5 `% e, ?4 SQemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。
) {& A" \( W' J# }' g7 z. o! d0 Y7 X
官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/0 s6 Z# [! W0 J
4 r$ s( q1 s" }$ ~  h. t

1 P0 Q% ]) U! r1 X! S1 M$ |6 E) l+ C7 L' y4 Z
KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。) n6 `, v) U% p) n) e. `
6 P: Y3 o: q+ v# R) m3 t+ R5 e
大致实现步骤:1 M. a* i6 J8 G* D4 G

2 l2 C( p7 u% g) {8 x2 ^1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。5 A- t' ?# `8 r( s
4 J( ]; G+ a1 f" x8 _* O6 y
2)创建一个用户用于Libvirt访问Ceph集群的块设备。( }1 d2 L. N+ R5 z) |

8 j0 K1 u8 f# t3)创建一个Qemu存储卷。
/ {" j' R% p! p! [
" [  \1 A& Z3 i5 L4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。0 u0 X, Z* g4 G
' N) x7 q/ B" `$ x5 a
5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
9 c" u. T  x0 F  M! j/ }* X1 a' a
7 u3 V/ O  Z; F% H其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。
9 ~) U5 ?$ H( T9 i8 A: h
3 T" ?3 w5 G1 m9 Q) X4 F( k2.1.在Ceph集群中创建资源池
2 K8 H! {' }9 Y" @! k' d1.创建资源池
9 ]. ]# m: b; }- P" ~[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16! k  O/ q, Q  d) s6 H2 _+ \
pool 'kvm-libvirt-pool' created( R; i2 ?2 }  ~% \* p
3 _1 f$ G7 a2 \6 g+ J
2.将资源池初始化成RBD类型
# m3 b+ Z1 f- V7 W# w4 `[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool% R2 R2 M! L3 ^* r) k( l$ q. p
' `( u8 D7 r& J. c5 T9 k$ `' s
2.2.创建用于KVM访问RBD块存储的用户( K1 W7 p+ v8 h+ O& P0 F7 R
[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'
& P: S3 @5 ?0 R5 |[client.kvm-libvirt]. ?9 Z) P. v/ E" h! Y
        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==
% }+ a, c; ?& I: O  a5 j% D$ K0 l5 o4 R4 Y. l" }; Y$ [' m, @
2.3.创建Qemu卷
+ w3 G' B3 ~% K4 Y[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G, Z# r1 {$ _/ {/ O
Formatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0 0 F6 l+ A4 u9 |" N, s% H9 v
8 s) W' _( Z& X/ Z9 F
[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img
' \' o$ l* m: Ximage: rbd:kvm-libvirt-pool/vs-centos-1-data.img0 y/ J; D: R0 ~; s8 I  v7 W: g
file format: raw
' i6 x# S3 I' cvirtual size: 500.0G (536870912000 bytes)9 V7 g  m7 M1 w( ~& O
disk size: unavailable
3 d; @2 C, N( G' P& r7 Y/ t2 \" a  p: Y2 [" _2 F3 ^
2.4.将Ceph的认证用户写入到KVM的Secret中. s" o) H5 n8 F, O
首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。# d0 A3 k2 z( }) {# r, G, ^

' _! z: T5 ^: T, g2 F$ x用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。4 e, @+ Y- T7 i' G$ i. r
' k# Z) W& T9 }) \
1.编写带有认证用户名称的xml$ Q4 J& l7 p2 q
[root@kvm ~]# cat secret.xml- `; {" N3 S* k9 V. w' C* r
<secret ephemeral='no' private='no'>
! D9 h% I: r: M8 `; ~        <usage type='ceph'>( R" F* r) b/ G/ \9 m+ [' I
                <name>client.kvm-libvirt secret</name>2 s- B* K- b0 H' T. ]
        </usage>
0 n1 X3 I& U  L& c* g0 ]</secret>
, F/ V) g/ z3 V$ A1 j% M* b#name中就是认证用户的名称
) [. g1 H5 ~6 N% V2 j
  S8 c: E' s' ]+ G! L) x2.将认证用户的xml文件导入到KVM中生成一个Secret
2 }" |6 ^: b8 K  N( S[root@kvm ~]# virsh secret-define --file secret.xml 2 {0 i$ M3 p- @1 O0 `# b. v  f
生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82& T! y+ i  F5 v
: m; U2 }( X, T/ M
3.将认证用户的Key写入到Secret中( W. _2 t5 S9 _' X! h1 I* g: e9 L
[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==3 Y" H0 h  Q6 o0 u6 D, x% H
secret 值设定0 L* w* b% V5 u  g( l0 A
#--secret:secret的uuid0 l3 N2 j6 d0 Y1 G' x# y5 ?6 G
#--base64:用户的key# O' w! {+ m+ ^) e

7 h1 d; n4 W# e4 ?4.查看生成的Secret信息
: T3 t. ]! R8 u1 e[root@kvm ~]# virsh secret-list # g, A8 J) X7 `' W) k7 ~3 Q
UUID                                  用量1 N# o, B$ }  X0 Y* q
--------------------------------------------------------------------------------
; g2 F" s+ P0 X5 C' F1 \2 B+ Q 66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret# Y4 r' @* B5 y+ ~, G
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
* f# n; r% A8 O8 L3 \1 C<secret ephemeral='no' private='no'>
5 b9 G8 P- B- T, \6 i  s0 b  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>
9 _' K, t8 {) }" w" d) T  <usage type='ceph'>3 x# @6 ~# D3 ^5 @9 l. V1 M
    <name>client.kvm-libvirt secret</name>  n9 P& L3 d, F! }
  </usage>$ e  f0 I% {' f! c. t; g4 E5 V
</secret>' h$ T% K. r. P" i! B# E7 q

, d& V& p& U6 S& D: k2.5.在虚拟机中应用RBD块存储中创建的块设备
+ L" m4 |7 q+ n. d  p需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。3 {; Y1 [, m: |

( m3 G8 ?* I1 a1 H' R  O# Z1)先停止运行虚拟机* L5 o3 h$ M$ D
8 K6 [4 }- Y8 Z0 {% f3 @
虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。  r# M4 t/ }- B1 D8 `9 L) [6 o
' t" Q7 R$ t4 y" D6 L2 O
[root@kvm ~]# virsh destroy vs-centos-1 2 e  S1 {( e. y& a) m: Z
域 vs-centos-1 被删除
* o& P  x  q2 ^& H' ~7 V! }8 \& K8 F5 _+ z% f
2)调整虚拟机的配置文件增加硬盘
8 y0 b, F; h9 P' \7 M- j8 W" f. E
在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。
$ U0 s8 f6 e  x+ W! v: ~" G1 `/ q
7 Z3 [) P: x: g* f在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。
1 `: E* s& l0 ?% O' s2 j2 `+ B& u9 q; h& Z
在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。: {2 ?& M. p6 G4 A' T4 W

' M( X  |# ?, r5 Q[root@kvm ~]# virsh edit vs-centos-1 , m7 d7 P( ~0 P  Q9 U. @6 w& ]) ?
    <disk type='network' device='disk'>7 ]+ A/ f; R/ `; L
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
+ v- u$ A  O* n1 V0 j/ k           <host name='192.18.0.20' port='6789'/>
6 @, d  x8 ^5 r2 _           <host name='192.18.0.21' port='6789'/>) ^, h) d* e0 }: H* z# D, }( h. I' ]; G
           <host name='192.18.0.22' port='6789'/>* v$ I, n/ i. r3 H( ]
      </source>
/ h- q# i1 V( ^/ X2 R, w      <auth username='kvm-libvirt'>0 N; R! a. @/ }& G# _5 \. I* `
           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>$ M9 J' K$ U; b+ ~( e5 M
      </auth>% W# ]) `$ G0 ^- F0 g
      <target dev='vdb' bus='virtio'/>/ N5 s: W5 C+ Z9 O7 P
    </disk>
6 q( l# Y8 ]$ |! P+ G+ t( D/ i

1 V( o# f9 ?; H1 C
2 ]2 ]5 B6 }0 X0 o5 t3 T3)启动虚拟机观察硬盘是否添加成功* \2 E) @  X0 u8 w- M: p8 ^% f
2 x% C) z# d* d# c
两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。
& Y- {* B5 J. N+ J% @6 P( D0 d2 T6 ]: R7 `* W2 t, |$ Z3 P% A3 K
[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
  X6 q3 G/ j9 r& i7 k4 Kdrive-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
0 h4 _. ^" R% j1 s; ^+ S! Vdrive-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
+ }: M- L& X3 F9 X8 edrive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
  \) I: l' G# w9 n
* t$ o% v" d$ F# O[root@kvm ~]# virsh domblklist vs-centos-1 & m+ P" N  V+ m
目标     源
. P4 M3 x4 Q0 [9 s# z/ Q- B------------------------------------------------
# y8 N! o" F6 N% @2 o# T$ fvda        /var/lib/libvirt/images/vs-centos-1.img
% r! B' t& Z, N2 x8 g4 F; R% |8 ~vdb        kvm-libvirt-pool/vs-centos-1-data.img
/ ~! V3 V5 d5 F: ~- c, Thda        -
& s" f3 D* ?9 k3 g1 g! v) z; o% d4 _6 R2 i9 D" [
2.6.虚拟机使用RBD块存储提供的硬盘
% {/ H( e* q' ]% L# J* k' M+ T0 FRBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。; _: q) O" K% l& r) p, ^
$ t2 ]3 l) K& ^9 U
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。6 W2 J$ r  V' ~5 Q+ S8 i
7 Z- v9 K- k( r6 A, C, x: |
lsblk, b# s1 i! g: ?9 Q9 e
mkfs.xfs /dev/vdb
& g9 L+ y+ Y$ G2 u" x4 Bmkdir /data* y, D3 W( C" [7 @# Q# k# A
mount /dev/vdb /data  T4 \, C0 S7 T# F5 {# g
df -hT
! Z/ c5 s' \! _; y$ pcd /data
5 N# J9 @9 H/ s; c: U# r1 _# d. {* P$ ]touch file{1..5}.txt
2 e0 J! P3 k& `6 G/ G* A1 |ll5 x; O. }/ R! e
5 D$ x6 g& g6 r9 E" O: e- x
+ S8 Z0 k' ~3 g% N
此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。
! g/ Q" x/ e' D$ `/ e  F! m! |- N$ v( b+ i: c: o
" u; ]/ l' O; ]4 s! A  o+ J$ {4 a; v
  {) c/ C, @  L8 k. W+ \
2.7.RBD提供给KVM虚拟机的硬盘扩容方法
' E2 {3 @% c6 ?1)扩容RBD块存储中块设备的空间
1 v$ O! L5 \- @( M
: M7 X2 Q! w+ }将原来的5G扩容到7G。
% o% v4 {5 {6 T5 S+ w% N, u9 @8 l3 b2 U6 G+ d1 ]3 ^
[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G( w2 b( S7 H4 _- G0 B6 ^% A* P
Image resized.
* g9 N% Y. n$ B4 N  r
; _) i* Z: M+ G; p/ D/ {: m2)重启虚拟机# m( P  d8 s+ H  G8 x- ~9 ^" e6 a
6 p, z; `! b# u, G, p$ O+ O
KVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。( O8 J) u9 d, S1 j/ [& K
1 _0 W0 z! n5 ^3 V2 F* q7 @
[root@kvm ~]# virsh destroy vs-centos-1
6 v9 _; x9 r' l# G$ A域 vs-centos-1 被删除) ~( G2 z, y; Q/ }
" F+ h2 x. U, @( }- V
[root@kvm ~]# virsh start vs-centos-1
; k) R' P4 ^, }' T域 vs-centos-1 已开始/ V) S& Q7 b% o) K4 w2 ~

2 Y: [) ^7 h) |7 W6 I6 S$ Q7 t! Z( L
3)查看硬盘空间是否生效
7 _: x6 p, z/ a- H1 Z. D8 y* T! R4 Z
& O, u+ r! g# e+ R: \磁盘空间已生效。
  [: g9 Z  Y" c! |; w
$ J  e. S7 N6 f- o: ]- N4 e; s* R( D, K; f  N& ~- ]

  z% j5 v( _/ g( d$ _* e- \; z8 e2 B3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储
5 A& O+ _! r7 q: P6 n) A首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。8 G1 t$ n( W3 W) y* z7 Z* L
1 [  }4 _2 Y5 X) ~
3.1.将本地的系统盘导入到Ceph集群的RBD中
8 O& R! m$ A4 M5 @命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}+ d. [, g. b% b, Y! o, e" x  h1 z

+ K$ N, }' e2 f. c2 t[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, l+ L! a: ~* o7 m2 _
5 O# v- j3 O0 s" Q& w8 D0 I
查看导入到RBD块存储的系统盘。
0 |9 W! B9 x8 t: P$ m& e, l$ t! ^3 n2 y5 A. |5 B# W
[root@kvm ~]# rbd -p kvm-libvirt-pool ls
) h* H' t+ q1 h3 Ivs-centos-1-data.img
/ q9 u8 n& I& ~+ N) mvs-centos-1-sys.img
  g) v- ^  ~* s9 l% L" r! _4 l& c; Z! L, a1 M) Z  h  Z, ?
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img
$ z9 c* O. F2 r) i9 ~! U' b( Frbd image 'vs-centos-1-sys.img':8 B4 b5 `. v3 H/ `( N: t$ O! V# z
        size 10 GiB in 2560 objects
; W& j4 o  I0 u/ S* X        order 22 (4 MiB objects)
- t0 G' F; \9 A        snapshot_count: 0
$ U6 r- J( U+ V/ K2 @        id: 19a5d559f577b: B2 M! X+ L, W1 `/ z( ^$ b- i: v
        block_name_prefix: rbd_data.19a5d559f577b
6 x! A9 r+ c9 d5 p4 E        format: 2) j8 [/ X6 u# g; A
        features: layering: o; M0 a7 D; \: s" I9 G
        op_features:
' T  Z- @( m0 N* Z        flags: 8 I5 F2 `& t$ c0 `
        create_timestamp: Thu Apr 21 13:06:56 2022& X  p8 i, O& X8 E3 |9 V0 k
        access_timestamp: Thu Apr 21 13:06:56 2022
! V' w& U2 w  ~        modify_timestamp: Thu Apr 21 13:08:58 20224 i. n0 ?* f$ c% J1 W
: D6 [' h( V+ U' t+ i6 y
3.2.修改虚拟机的配置文件调整系统盘的路径3 }$ m; o  h+ [+ p/ M6 L) w- \
直接将现有系统盘的配置信息修改成下面的内容。4 c, C9 Y) B# ^6 R/ M; z% e
# C( _+ j' a, |4 H3 L
[root@kvm ~]# virsh edit vs-centos-1
- d- s5 i$ P* q1 e$ T    <disk type='network' device='disk'>
8 S/ \$ g& j) f2 E! c      <driver name='qemu'/>
; R5 K6 v0 T2 t. s      <auth username='kvm-libvirt'>+ E6 `; ^8 \1 B+ j2 Q8 T- t
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>: B* [* g2 ?! O) s: h( X6 g
      </auth>) a) ]$ _. ]  k2 R) f) y2 A: T
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>
5 o# c9 v' @0 z2 f) A+ B' K        <host name='192.168.20.20' port='6789'/>
  _; R% c: C; _0 d+ t9 ?        <host name='192.168.20.21' port='6789'/>
" r  s, }3 o: z# h& _+ r. k0 b7 U        <host name='192.168.20.22' port='6789'/>, I! h# C" g9 a% m0 v1 A
      </source>
3 u% K1 U" \4 I7 d! @      <target dev='vda' bus='virtio'/>
8 O3 B5 X" g, ^; T7 ^! X, @" h    </disk>' }/ k# N# J  I% D
. x% R' C* m  @/ x! {
& S, v  S# H$ a$ z1 v' i
  l1 \* c3 A+ g3 @  G- V( Z+ ]
3.3.重启虚拟机7 G% F! c+ f) x7 [* j
[root@kvm ~]# virsh destroy vs-centos-1& K- `/ W7 Z/ M5 v4 A. U: c
域 vs-centos-1 被删除& ]: D2 f! u7 b  ^
& Z% i4 Z9 W  K" m% C" l
[root@kvm ~]# virsh start vs-centos-1
8 T$ v7 C5 ?2 ~* R& b  E域 vs-centos-1 已开始
4 L3 ^  R, S4 g5 A1 G( F
$ S! s" c7 N9 x) n; H# ~$ `, z5 C6 n  V3.4.验证虚拟机是否可用
9 N2 W3 x: z( G  h安全没问题。
- A' l1 l& d8 P1 B% H
4 E; R& L# d% b$ J3 t6 {3 ^) r  S" |' ^, T2 D+ S! E" X

6 E/ M/ b: M7 c* u' O. ], F5 |1 `- C, `4.实现类似云平台秒级部署虚拟机
/ {+ S, y; c  Z/ H在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。- K. x9 A( T- c2 Q* X
; u5 x6 \; a, w% R/ y
秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。. Q1 ]! `6 [: ~# B7 `
& R( D9 n* I- `* V* S
如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。3 w6 H! G& J( J
% s, ?% D6 ]3 R6 U  o+ I
4.1.将现有虚拟机的系统镜像块设备创建一个快照4 A( G) Q/ O" s- N' d
将系统盘对应的块设备创建一个快照并设置成保护模式。' ?2 G9 E8 {7 x& L2 X

- A+ t$ K5 Y) z5 c% c7 ~[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template' N$ `5 ?9 l4 A8 O4 |1 K+ d( U3 O
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template7 Y4 i& k5 G& y0 m: v

7 H- N% F' D  W5 V% N4 Q4.2.为新虚拟机提供克隆镜像
" d$ O/ D/ l+ C8 r4 }9 u* U/ s7 K为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。
: i4 T1 v/ l9 x' Y, a! D9 l" `7 S( E: L- W
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img4 B% Y, e9 ^, q" J) P' D2 L3 h
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img
* O' T1 r4 _, M2 E0 l7 j1 ?8 l0 n4 w, E0 m. J: H/ ?5 N
& w8 ]1 \5 O# p# z8 K) V7 q& s1 F
4.3.通过虚拟机文件准备多个虚拟机
- f( M4 J+ n; M; r+ _KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。6 `8 o. Z& {0 G$ m

  Y8 v) a  }% H3 C: W+ N进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
; ?9 n0 U5 y0 C) l# k6 h3 m
, N8 ?: U3 \  ^, ?# e/ n/ L, K[root@kvm qemu]# cd /etc/libvirt/qemu/" J# v4 A/ C9 Y+ F! r$ J
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml 1 g1 I* M+ J- @& U" [
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml. T& D' z. G: G3 m) X  w
; `& \! R6 G) ^* P0 l
1 I4 T. T" f8 `5 D
4.4.编辑虚拟机的配置文件
8 a4 B7 Z- x$ H7 Q. }' V, k' K4 y# D) }在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。/ F+ J; ]8 t- v7 t' k7 b& s2 W$ V

4 ^3 ^9 m! c# c7 j+ ?<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>5 W3 T% M1 I0 I! k- j; [/ @" K
6 ~' o5 G) b) W: ?
<mac address='52:54:00:eb:f6:97'/>0 Q+ ]3 n+ b7 \
0 S2 J* n- j: _4 j
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
" b! j' n. j9 E4 `# _- V6 P3 ~0 S* f, O: T$ _& {& N% I' Q$ \/ k
4.4.1.vs-centos-1虚拟机的配置文件
: v! w4 l- g# V0 L) o, \  _6 D[root@kvm qemu]# vim clone-vm-1.xml
. e4 }( o: J0 z<!--
: V! _  A5 f5 f- P& x7 x+ i! rWARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
2 l- b/ D  {6 ]3 |' t7 oOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
; l: b! ?. l+ q) q5 F  virsh edit vs-centos-11 k$ S5 \" x6 ?  R; @, X
or other application using the libvirt API.
, L1 Q1 m% |% H-->! j( B/ C2 O$ f, D1 U7 ^

: `+ P5 j2 }8 D4 H& f* S$ f' r<domain type='kvm'>9 A$ Q% G, C: x# }+ U5 M+ l/ Y
  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->
* s5 Z' B# p+ n6 j6 W! g: B  <memory unit='KiB'>1048576</memory>
0 Y- D: L4 T* Z: C5 U# I3 M  <currentMemory unit='KiB'>1048576</currentMemory>
7 ~' I  J2 T7 Q0 J: ]- ~" y  <vcpu placement='static'>1</vcpu>; a' u( `+ `/ r
  <os>9 t/ x/ }, a! B" |  |
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
$ ]# Z" Z& X& K9 X! d. y- J8 Z    <boot dev='hd'/>
8 Z- x% W/ h: U) P* z& Z  </os>0 X1 u* [& A$ w$ a
  <features>( A0 k* i  |. k, q2 O! t( b9 O
    <acpi/>* J1 o! b/ n4 Y- K4 u9 l
    <apic/>% D; K/ |; L! `/ T
  </features>/ F$ ?6 Y3 [7 d* t+ z
  <cpu mode='custom' match='exact' check='partial'>
' ]3 y- s) |: K* M) H5 W& Q    <model fallback='allow'>Nehalem-IBRS</model>
+ P4 [9 d  S/ Y( e  </cpu>) ^% Q! Y  _5 X  \* h
  <clock offset='utc'>
5 i, u( V* m, l/ F+ j2 S7 i' X3 g    <timer name='rtc' tickpolicy='catchup'/>7 [2 j# y4 I2 k+ j
    <timer name='pit' tickpolicy='delay'/>6 L- a7 E3 T' k+ W
    <timer name='hpet' present='no'/>4 Y  a0 W2 V% z. z/ o* @
  </clock>
7 N# g% q1 e" F/ C% E  <on_poweroff>destroy</on_poweroff>$ r0 I5 U% a3 ]
  <on_reboot>restart</on_reboot>
) v9 t8 f6 R) _  @$ v  <on_crash>destroy</on_crash>
. w7 p& R$ @+ s+ O0 K  <pm>, N' U/ B# ^- x# x* x' ], ]
    <suspend-to-mem enabled='no'/>
( I( B9 q7 _; K( N( L9 H9 R/ q& s    <suspend-to-disk enabled='no'/>: t2 X( p' k3 O# P" s5 Z
  </pm>6 E# k9 \: H* I; e7 `
  <devices>
0 c7 T" `, L, r; B    <emulator>/usr/libexec/qemu-kvm</emulator>
: `$ o' L- l0 q' T/ V# A1 `    <disk type='network' device='disk'>
) a* x6 g! ]. x      <driver name='qemu'/>
, O6 v2 J1 @& ?) h1 l' b      <auth username='kvm-libvirt'>
" y' w$ n( b7 J1 `5 i/ @# G/ R2 [        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>! i) o! e' T7 G& a( U4 B3 }
      </auth>, m3 V$ X' W0 i/ w
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->
- L" Z- z% h9 N5 N        <host name='192.168.20.20' port='6789'/>
' h$ O/ _% W. h3 |# y1 ]! ]        <host name='192.168.20.21' port='6789'/>
" ?3 d4 O7 l: o        <host name='192.168.20.22' port='6789'/>+ o/ x8 C7 `7 N2 D
      </source>% P; C* A$ i- a0 x8 q4 y& t4 g
      <target dev='vda' bus='virtio'/>- [  [9 z3 a( ?. ?- S7 A
    </disk>
  k# K) w# U/ x. _) e    <disk type='file' device='cdrom'>% I* ?  b! o: H8 f5 H$ b* H
      <driver name='qemu' type='raw'/>' G0 c$ l, _+ Y7 w) O, x
      <target dev='hda' bus='ide'/>  J+ E! |7 z" O! V4 p/ b
      <readonly/>
! l8 A+ [+ v  C0 Y+ ]      <address type='drive' controller='0' bus='0' target='0' unit='0'/>; y( h) k8 T6 c7 W5 \; t, e
    </disk>0 h$ V4 H7 e9 K( u0 P
    <controller type='usb' index='0' model='ich9-ehci1'>
, C& N: u! y9 k( G- c/ ]6 }9 t      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>0 }( L( g  X1 o2 _- |
    </controller>
9 m! q6 g  ^5 G# B    <controller type='usb' index='0' model='ich9-uhci1'>
9 D! f1 @! b* g9 H$ [      <master startport='0'/>
+ N7 j7 I3 l% L) F6 G( ?      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>/ W* R: A. u3 m4 P& }8 ]& ?
    </controller>8 R1 I9 P  u! }/ E
    <controller type='usb' index='0' model='ich9-uhci2'>
9 ~1 V  g! ~. d" g: ~* |9 V      <master startport='2'/>0 N8 m. q  I% T# [
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
4 @; H. ?3 P1 X& ^# T    </controller>
- p+ p' `6 A1 U, ~; d* k; I    <controller type='usb' index='0' model='ich9-uhci3'>
# }9 A1 c6 `7 H) }* {3 H4 u- Y      <master startport='4'/>, c# Q, }/ B, \; e- a& \
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>" I5 A; w  K# {: F
    </controller>: l3 Z: C4 t! H, h* p
    <controller type='pci' index='0' model='pci-root'/>& z' N% h& ]' B9 T9 C
    <controller type='ide' index='0'>! |9 R$ V2 E9 Q7 l( {, M
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>* ~* k! @5 B) @
    </controller>- j9 b. x4 G: S" l, \3 e
    <controller type='virtio-serial' index='0'>
" ?! a8 `( s' m: v      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>8 P$ ^7 L0 t& g9 S. h
    </controller>
( ?' U/ q9 Z+ }5 a; J3 C    <interface type='network'>
1 u' U3 M/ n8 \5 {* ]7 {      <source network='default'/>4 u) L  |( `2 S7 F; C
      <model type='virtio'/># |+ V+ z9 h) U/ s0 m4 C( e
    </interface>- B0 r8 a, R9 `5 g
    <serial type='pty'>0 F0 J% W  ?# {( Y9 S
      <target type='isa-serial' port='0'>8 b9 P3 @- S7 K8 G$ X
        <model name='isa-serial'/>2 s9 c. X- q$ j
      </target>$ K( f, ]1 K1 A# r
    </serial>5 D7 O8 B7 {/ [) o9 h+ E
    <console type='pty'>; W" R) ~  ?/ M" t+ N5 z
      <target type='serial' port='0'/>
; C2 p4 ~& v- S& ]5 p$ S2 k8 e0 H    </console>
6 J( _/ c! \% f1 Q; }8 `    <channel type='unix'>) j3 e8 _" R6 u1 j9 ?5 f
      <target type='virtio' name='org.qemu.guest_agent.0'/>1 U( K2 ^/ @! J% W% j) @6 N
      <address type='virtio-serial' controller='0' bus='0' port='1'/>  R% P: B- n1 Q5 _6 n0 {/ G* l4 ?
    </channel>: R- E& L) m- w
    <input type='tablet' bus='usb'>
! M0 |% @- N! ^6 l% ^      <address type='usb' bus='0' port='1'/>
. [8 c. f3 A' \    </input>
3 \* k: b' m" k    <input type='mouse' bus='ps2'/>! B# H' ~7 _, [; Y  K% D1 r7 k
    <input type='keyboard' bus='ps2'/>
; c. g6 ]9 X/ P' M    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
: E2 H5 }/ I3 M0 q0 g) O% E3 d      <listen type='address' address='0.0.0.0'/>
7 A0 @/ Q5 Z) e; O/ s! K    </graphics>
; @* V& ~4 ^( [2 C4 f    <video>
+ I/ c$ K- D+ i      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
8 l- |9 g; W! X4 u3 j1 @      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
4 C3 b7 h' X6 R! U    </video>
) z  v# |) R' m" D) F    <memballoon model='virtio'>& \* _# Z' J( ?3 ?& K7 F3 I/ i( B
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>, D( F, r- n2 M
    </memballoon>
  x0 s7 o; O% x6 y7 I( r  </devices>
7 ?  n5 Q8 s4 c0 o" A; b# i</domain>+ ?0 a0 a, ^9 O3 ]
8 ?  V- j9 r! d" T& k
4.4.1.vs-centos-2虚拟机的配置文件
% B+ L+ B- ?# r& B[root@kvm qemu]# vim clone-vm-2.xml& x8 }1 B! ~0 `; j6 ~2 z0 L
<!--, V, ^6 l5 t; A2 r0 I* M0 @8 K
     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
. l; L- f+ X" Q+ i4 [OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
% B* C, Q+ Y/ [5 l. |# C' [" Q  Y  virsh edit vs-centos-1
' z3 Q6 t( q1 t' k; h) _/ eor other application using the libvirt API.: d+ |& a! m' B( N1 L$ k$ l
-->$ ]) W$ p. l8 ^7 t- v
3 I' u2 N' `% `: o3 T: ]- S3 Z
<domain type='kvm'>% V% n5 f" _( P; V% E
  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->5 E# p8 B! J8 t  P3 p! p( }
  <memory unit='KiB'>1048576</memory>3 R! [, U2 q+ K' s7 _3 ]
  <currentMemory unit='KiB'>1048576</currentMemory>
" K8 l& F2 f" p1 @  <vcpu placement='static'>1</vcpu>& P7 }: F# }3 K" t; }
  <os>7 D8 _" L" F+ J8 |" k8 x
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>4 I) \/ F, P: o( V9 }$ k9 I( I
    <boot dev='hd'/>
& h& F# M. s' E9 n) M  j  </os>
  I5 d; R9 W5 M! U+ z  <features>% \, b; y1 g' ~8 b; b5 h
    <acpi/>5 W* i( u" e0 M: v5 s
    <apic/>
+ R! ?0 A! F8 e3 h  </features>1 T9 c4 z& I! n6 p1 F1 {# }  q
  <cpu mode='custom' match='exact' check='partial'>
0 s3 C: s2 |* e) m* a. F( P1 C, |    <model fallback='allow'>Nehalem-IBRS</model>
& }2 Q, }  H8 L' L% Z' G  </cpu>
! O1 Z0 |' G3 Z; y! t# a, c) [  <clock offset='utc'>
/ J$ [7 W9 Q. b* o" Q4 ^    <timer name='rtc' tickpolicy='catchup'/>
  ^5 g8 n/ ]/ B9 ]    <timer name='pit' tickpolicy='delay'/>
- a) C: B- n6 m* G& f4 u    <timer name='hpet' present='no'/>6 L( e2 A+ f  G* x: H
  </clock>
9 E5 K7 Q) t9 Z  <on_poweroff>destroy</on_poweroff>" ?( m  q  [$ O8 ^6 ]! j
  <on_reboot>restart</on_reboot>
& I' a- s9 C6 d0 m3 y  <on_crash>destroy</on_crash>
) I3 T2 w7 x% C8 K  <pm>6 m9 ?' c# x: w5 ~2 c
    <suspend-to-mem enabled='no'/>
- Q1 K2 c# a0 p. r1 j2 q8 p    <suspend-to-disk enabled='no'/>
4 }& z. c9 b9 G  </pm>
4 P3 b' }; Z0 N0 K* y* S  <devices>$ k/ }) m- y, J# t7 N) q
    <emulator>/usr/libexec/qemu-kvm</emulator>4 Q6 B; m3 I* n  V  P* E1 L; m
    <disk type='network' device='disk'># w; T, T1 ?& n. b, r
      <driver name='qemu'/>5 q, M( N5 a/ k
      <auth username='kvm-libvirt'>! n5 J7 c" Q7 A
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
/ a: l, o! C0 I. ]& V+ ?5 b0 f5 O      </auth>
2 {! x0 n% ]; F6 I      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径-->  \. o) n% m! _9 N1 L: M& G7 a- `
        <host name='192.168.20.20' port='6789'/>+ E6 j* E( o! e: t9 Z6 }5 M
        <host name='192.168.20.21' port='6789'/>, K8 k& W* w- w% W* G' v1 S( \
        <host name='192.168.20.22' port='6789'/>& J6 r, \5 ^, u
      </source>
; z0 _, ?# C8 e& T! C' b      <target dev='vda' bus='virtio'/>5 C6 k! |; v3 c% z4 V
    </disk>6 b  s1 r6 n" p0 H7 T
    <disk type='file' device='cdrom'>
8 t# ~, @$ c- T- H! n& y      <driver name='qemu' type='raw'/>
+ Q9 @) t4 Z. v      <target dev='hda' bus='ide'/>8 T3 v& v2 b- ?* ^- U+ I1 Z/ b
      <readonly/>
! j+ `& \7 p; U! O* t      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
9 N- d/ J4 r; f# Q8 ]    </disk>
1 M7 m3 V$ g& `2 Y1 |, [$ r0 ]9 I    <controller type='usb' index='0' model='ich9-ehci1'>  C4 f/ b0 f& F5 n) W; `
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
. C1 x' S; n# B: R) z; W5 X6 p    </controller>! z6 i4 o; v- ~& J. |6 h6 j
    <controller type='usb' index='0' model='ich9-uhci1'>
# s$ A0 N: n1 x      <master startport='0'/>
" w/ S6 a; G) T/ R- j5 g: ]      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>$ L6 K/ r+ m# o7 P5 X( a# O
    </controller>6 T7 u8 D0 o" C
    <controller type='usb' index='0' model='ich9-uhci2'>) |: C" p7 o2 _+ T. ]3 ^6 m
      <master startport='2'/>1 D/ r4 K7 u9 k- N8 V
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
; |3 D: d* l" ^, P8 n6 p    </controller>3 N) g; W( g& X9 y" j. M
    <controller type='usb' index='0' model='ich9-uhci3'>
: D7 b) U7 e; i2 s0 q/ |1 M      <master startport='4'/>
9 v" l8 Q/ X" p  v" H- I- z      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>7 D' t$ n- T3 J
    </controller>
* \8 f/ u& m3 D+ Q6 Z    <controller type='pci' index='0' model='pci-root'/>
: r4 }4 E' |9 @    <controller type='ide' index='0'>! d& ^) j+ N# }1 A! ~0 x
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
9 ?: {+ p1 I; N7 N/ F, }4 t    </controller>
$ S% [2 @( @( f$ m; ]    <controller type='virtio-serial' index='0'>
7 s# z# v3 Z8 w" i2 ~& r4 S0 @      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>, f& a7 P8 o6 {& w% u3 m; _% T
    </controller>1 c7 ?0 }/ E8 ^+ t/ n: a
    <interface type='network'>
( @. ~9 E% I# K( i* f+ m. q      <source network='default'/>4 c5 {- f; g/ C% ?( w9 }' {
      <model type='virtio'/>4 ]& W9 c9 d& K5 H. \; M! q5 N/ f, S
    </interface>
0 P7 P1 s) I+ m5 S0 P' l4 Z  _4 |    <serial type='pty'>6 s' ]9 X3 k% w8 [1 Z* B
      <target type='isa-serial' port='0'>% {  o" M% H: N% M
        <model name='isa-serial'/>
) m! E1 E& y: u# k# F      </target>0 L" t( E; c  z: T2 v
    </serial>
! }2 y. n6 e* k1 k0 O6 o    <console type='pty'>
3 s3 p' Y0 W4 S4 L% N7 M" F      <target type='serial' port='0'/>8 [/ H  Z& N% P8 z/ V' e
    </console>/ Y5 \( x5 T+ B8 [2 W* Q
    <channel type='unix'>2 b% {$ K! [% X  L
      <target type='virtio' name='org.qemu.guest_agent.0'/>" b4 m- ~$ E: J# N- N5 \
      <address type='virtio-serial' controller='0' bus='0' port='1'/>6 {5 t$ C' I: s
    </channel>6 Y  S7 i1 n, C7 E9 t2 T( w& }
    <input type='tablet' bus='usb'>( z7 y( _  S# c0 Q0 y
      <address type='usb' bus='0' port='1'/>
4 s& _% Q2 p' Q) y; R3 h9 Q; D    </input>
# t- n+ T# J# r2 u6 K5 ]0 G    <input type='mouse' bus='ps2'/>
9 ?0 {0 x7 m1 ?# k/ J' ^" m: B3 n5 ]    <input type='keyboard' bus='ps2'/>9 m( @1 C7 ]2 k# \
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
% m6 v+ ^2 O# B. P3 n+ g" r- ]# e      <listen type='address' address='0.0.0.0'/>( V, X- u4 B% P: s% E
    </graphics>- ?7 ~# l$ j0 g8 ?# k& ^# ~# ^* l
    <video>) Z2 N* O/ M" t6 f1 ~
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
3 v  m; r1 e! _& {; u; g      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>( ~) w. t: |6 j9 r7 D: K
    </video>9 @& U: m4 o) u* P' x& R9 d4 L
    <memballoon model='virtio'>; h# C; U: Z( a! \6 V6 Q" w  e- j
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
! M& Y( m: r$ V# B: v$ c, k    </memballoon>* Q- B3 k# `! o1 Y6 x8 b
  </devices>' A6 l+ j5 \3 F" O( r: ~; ^
</domain>
+ c: G3 E( w' }6 d+ M
9 [) f9 r8 _% Y7 M% O$ g8 L8 p1 Y& j7 N. ]. f# P7 ?
4.5.将虚拟机配置文件导入到虚拟化平台
3 F& U. x2 `/ n" j* Y[root@kvm qemu]# virsh define clone-vm-1.xml   t* @$ {& |: L
定义域 clone-vm-1(从 clone-vm-1.xml)
9 y7 U% h. d! q, t! J1 q8 g* M8 d: {: r5 O( L: F; ~3 R) \9 p
[root@kvm qemu]# virsh define clone-vm-2.xml
* c- M; o# F/ v. T& Q定义域 clone-vm-2(从 clone-vm-2.xml)
2 P% o5 ]7 P, N  C& `( ~1 u- A

; F+ R" X7 W8 k2 D导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。* n+ A4 P9 E: z: @" F+ c: S
8 Q3 `$ Z: }4 R/ I4 c
[root@kvm qemu]# virsh list  --all4 z5 X5 E: P  ]. h) X: p
Id    名称                         状态
# i9 d: R" p3 u, C# N----------------------------------------------------, R& I3 s9 j/ q
7     vs-centos-1                    running5 W* ?. q, E3 E2 n
-     clone-vm-1                     关闭1 r( `) D0 T* y
-     clone-vm-2                     关闭2 W6 O! T2 y5 D7 X
6 y: W/ M0 H  X+ V0 j" [8 u4 O
4.6.启动虚拟机验证是否能够秒级使用: y; x/ H: n6 A2 o: A3 z( U4 h
[root@kvm qemu]# virsh start  clone-vm-1
! u( x2 m1 u* A1 l/ y5 a5 h9 |域 clone-vm-1 已开始2 X8 D, U* g1 d% S- V/ y6 @' y( G

) N9 j4 I0 a9 B8 z7 V0 b  _, I" J[root@kvm qemu]# virsh start  clone-vm-24 V% G2 q. b6 H# T$ j0 p) ^- H
域 clone-vm-2 已开始
" c! W0 O4 o. T- E2 A8 p& d# m# x- h* F9 {

! [1 K+ W' ?0 Z/ I9 k4 A* p待后期更新。( M+ J* q% ^0 J% w$ M9 p, {

0 @; q1 q' H; u9 ~7 L! w1 A8 z% k5 T' J) W: ]% t
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通% r/ n5 q4 w, T$ u6 H# `

7 f+ A# d+ F2 j8 v) r; |0 x1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)# m  O& _& m/ d) X' D
5 e3 s$ P: @6 q% Q' u
2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下
$ a7 z8 _: X( V/ V& u1 C; ]$ s1 o) }5 N( X
3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通
/ O) Q9 T8 i+ F6 c6 ]1 o/ ^) B0 l: A
二、创建rbd盘并挂载给虚拟机
& m8 D& t: _+ Y/ T
( W* H, f$ ]7 x1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池# f: N7 S# Z) t' u. J  b* e  n* D
7 f- m3 W0 r/ E" d7 m/ T* _( z9 F
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'
# m5 k0 n' d" u* g* L2 Z
) h( M; H! o2 [( j7 l+ Y验证有效:ceph auth ls|grep client.libvirt: h. S7 A9 e6 ?  U% R" R; @  z

; F: P. O; G/ x( I. F7 r
; o4 ~" ]1 R$ W7 Q$ L6 A$ U$ X" b
备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行
# _0 }. @4 w$ Z2 b
9 ~0 `+ p8 g% S3 x9 B2.创建secret.xml3 |) o7 t% W- [4 u* c0 x
- T3 \1 P5 A$ p
cat > secret.xml <<EOF
# c6 d9 U4 s. h! J* q. S, _  t
  |) c  M8 W6 b7 Z; ]<secret ephemeral='no' private='no'>
2 {1 T$ c8 l3 }  ~# Y0 h- @" L8 q2 H8 t; v1 ?3 p" G
        <usage type='ceph'>
3 c2 X% |, ]' E- O
+ Y& y, S, I0 `' x$ f                <name>client.libvirt secret</name>
$ _$ [# J3 g5 h+ \, q
+ ?8 H7 D( w: ]& l1 B        </usage>; ^, i6 Q0 k( i5 G5 f% g
* U: m, L# O% ~. L( U2 i  h. C
</secret>" k& W8 D' ?7 M9 z, k8 Q$ ~  F
5 d% U' \6 e1 h
EOF
! ~9 _& L# Y* r
1 ^) }0 t; B; d% H) L备注:以上命令在宿主机上全部复制并粘贴,最后回车. D8 R6 ^4 o& y
! M+ r3 Y2 U2 N: a- R
3.生成uuid+ }6 M( S, t+ c
- H9 P1 f3 c" m& g4 r6 b# d9 W+ h
sudo virsh secret-define --file secret.xml
% @/ }# ^, \  W7 {: F$ R+ \. v
7 c$ \  f+ k. e# n{uuid of secret}
7 A2 I2 G, J; [8 q2 H/ O6 k8 {5 p8 E& x" Z* \) F+ u( F% t2 D
4.获取client.libvirt的key并保存到文件' d* E% q+ a0 Y
2 @$ T! t' L  b; S  p
ceph auth get-key client.libvirt | sudo tee client.libvirt.key  a4 q# Q) v# Y0 C, H
/ p' _' z+ ?" k( o: \
5、设置secret的uuid
# a+ I) {' H7 F% U3 f2 ~3 i( k+ C3 w; e4 g0 ?, O  v
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
6 Y, b0 q6 r' U# \( o! y
9 \; [0 l1 L+ T& `, v$ L将变量替换成实际的uuid和key
2 q* y0 h+ Z7 g. y; X, V$ u, R
$ f7 T1 s# z% Y* U# Z6、创建池libvirt-pool8 t6 D7 @( q# v6 Y* x
( v: `8 |3 t! J$ X0 V* o' T3 X2 H6 s
ceph osd pool create libvirt-pool 64 645 }- M- h" ~* R8 z/ z- N* Z  p

2 J% K2 B( Y0 ^* L7、创建rbd盘; z( O9 {! h! v4 X3 |: j
: u% D0 Z9 z1 ~, d: e9 @5 W; p
rbd create --size 10G libvirt-pool/test1 --image-feature layering7 x5 [( T( v; X3 f+ p0 ]
/ B6 I& N. J" i" n, D2 x1 ^$ Q" c
查询存储池中的块:rbd ls libvirt-pool9 @' c% Y+ V3 z  R" ?/ S( V" l% A# f
7 m) ^" m  D; E8 ^. p& p7 v% z$ a
8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息
( j% `8 g: |, A* f$ w; d2 l1 V5 t7 c0 I$ `! N1 d) j  d* c
关闭虚拟机:virsh shutdown vm" a) L+ t7 i+ I' G( A
3 S& J0 \# A9 R, Z
编辑虚拟机:virsh edit vm0 ?7 Y2 _( K& M) B( w

3 i5 [1 s8 \3 _" H6 i1 }2 h  }在disk标签下增加如下信息:9 o1 G" s4 T$ a

' a# v0 W+ c% y5 u& H<disk type='network' device='disk'>
3 q; P  G2 y8 q& G  n& {
. b9 t3 n& J. i. B2 P9 K      <driver name='qemu' type='raw'/>
- [8 O; R: r  d0 l6 d. j5 h8 B3 c% t
      <auth username='libvirt'>
3 Y) V, l# w4 s7 E5 J+ z! c3 M: U0 w9 X  y% |7 ~$ O& R9 f; B- U2 F! A
        <secret type='ceph' uuid='{uuid of secret}'/>
- e/ w3 H; {6 n- t
7 w" G, Y3 S4 h( ?1 v      </auth>! f8 t, `: s3 D: @! Q1 b

' y6 L5 x6 X( E3 I0 d      <source protocol='rbd' name='libvirt-pool/rbd_name'>
$ l/ ^( Y1 r8 n5 r5 U; v  r4 z% v  f3 I9 _* D8 W: K4 H
        <host name='10.25.72.142' port='6789'/>8 S& W0 t" W5 C- U5 l

/ O; A6 t: ~1 S        <host name='10.25.72.143' port='6789'/>
1 T' Y" S* @) j8 p! b8 y4 o/ L/ I& J
        <host name='10.25.72.144' port='6789'/># `2 s/ ?+ ^5 h0 O) d% q; P/ l
$ q0 J8 s* C; a$ [8 g! W3 \0 P
      </source>( D3 l- q6 j) k3 N

" L7 O1 F8 V% ?      <target dev='vde' bus='virtio'/>
( S, e! {% Y; l4 @7 r3 o5 P
5 c8 p  A9 |& Y4 p$ x/ ]* q    </disk>" N, ~$ D$ P8 x) _

% U4 f. K! e# s: O& H! Y备注:
2 q/ c' o& @" v) D
6 ~+ ~4 r) V/ R  C需要修改上面5个参数:# @1 x8 s. ]- x5 B6 e. M* u4 `
5 k, w8 b4 t  q  M- K" t; X8 V8 M
1)username是建好的用户名:libvirt& E, \4 u' X9 J2 @8 N) `

4 I2 u" V0 j9 R$ S8 ^# Z7 ?" [- Q2)uuid替换成第3步生成的uuid
# P* f5 g3 L1 N, e9 {, }, p! D$ _8 L7 A. k' F
3)host name后的ip为mon的ip和端口- T. f9 k' R7 \" j- i9 r

, N  k( A) h8 kmon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip% l: J" {* e' q5 W6 U( \# u
/ g# l* f5 g. l2 ~  ?7 d

- Y0 c) C' {1 ]  i, m& n9 o0 e, y( X: z
4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde
5 s% q  `# Y) r
6 z3 S3 j3 T. C+ H5)libvirt-pool/rbd_name是创建的rbd盘
: n( i: t; t; T# ]1 {4 A# A2 t
, [) n6 x/ Y  `  X/ O! @9、查看虚拟机挂载的磁盘, i4 c" m$ i% u, ^

6 h  @0 {2 S' G8 R* L& B4 Jvirsh domblklist {vm-domain-name} --details
- J# v/ R, `3 `; r7 w3 D: J1 I$ l" O, h! `
10、虚机开机,即可使用挂载的rbd盘' Y; Z. |6 b# T0 Y' n
1 ], {* A7 t0 x, @5 c6 G0 n
virsh start vm
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:27 , Processed in 0.056852 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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