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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-19 17:00:04 | 显示全部楼层 |阅读模式
1.KVM的Qemu与Ceph RBD块存储进行对接6 d3 _4 U" I* J, p8 T3 k
1.1.Qemu与RBD块存储对接的架构图. N6 G3 S5 w  v# o" `; N3 X
Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。! J7 P2 j- @6 O. K6 ^9 b2 U
$ \6 w- T( t' Y# B5 o: O2 p
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。" _4 C- O( {( o& e+ S1 a3 @" I! M' t* s

* F2 Z: ?4 v6 d& K! LQemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。  Y9 L) ]5 b, D- ^4 C. f% _

4 x& c7 K0 _% ?0 v/ U8 m- K; a8 X+ d5 W2 c6 H6 M$ h
3 E7 w8 F! A. R* Y
Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。
4 U9 A8 L1 `, E! B, F5 B  Y6 H0 T9 v) C" P6 s
官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/
6 r  G& J8 W7 ~/ {) M
+ w4 J( _, I0 `' D' U& C7 `1.2.配置KVM服务器连接Ceph集群
+ l# p/ e! @. |7 p, V! VQemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。$ K) b7 O9 {1 i3 J9 K1 e0 [; ~

. [( d) Q, m9 ?* N9 X8 ~) A  w1.安装ceph相关命令& @! ]- f2 `. g
[root@kvm ~]# yum -y install ceph-common6 H8 N0 W0 M5 w
) s( \& r& t8 w7 @! t) r3 I
2.拷贝ceph的配置文件
- y8 H3 L& J- N1 x$ s[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/) X% y6 C4 X+ a
, U' _; Q& s4 y2 P+ F
3.查看集群的状态
3 x4 r' A; O* U% Q# b3 q; U; S( |[root@kvm ~]# ceph -s
6 N: E& w- h& N+ I9 c- ?9 o    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0. @" d4 P/ ]" S; B. q. I( H
     health HEALTH_OK; i8 K. ^: R$ S, l8 W$ S/ g) |$ \
     monmap e3: 3 mons at {compute1=17.24.14.5:6789/0,compute2=17.24.14.6:6789/0,compute3=17.24.14.7:6789/0}
2 @2 u% l: S9 g            election epoch 352, quorum 0,1,2 compute1,compute2,compute3, ?. ~; X; `5 x( p, X
     osdmap e29566: 131 osds: 128 up, 128 in
6 p8 i( r% t1 L; q. p$ h            flags sortbitwise,require_jewel_osds
  {& `  t# O! c5 i/ T% N* |  L      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects9 w  R1 \7 x! _7 m  _7 D
            291 TB used, 174 TB / 465 TB avail7 ?% ]. J4 L- x9 q4 i  t- |
               10234 active+clean) ?; f- I9 V! E& k2 }
                   5 active+clean+scrubbing+deep# z  A/ I/ J" m
                   1 active+clean+scrubbing0 i- Q; u1 M7 J! _3 O  b
9 V8 z. m3 |: s1 z8 n7 f- d! u
1.3.在Ceph集群中为KVM创建一个资源池0 P9 Y9 P$ u3 q& }% f& w" Y
[root@kvm ~]# ceph osd pool create kvm_rbd 32 321 Q/ {  C+ S' Y# [+ ^% M& I
pool 'kvm_rbd' created
% G8 M/ r# ]' ]; G& y, r8 D" \3 p7 N# T
1.4.使用Qemu在RBD块存储中创建卷
4 R9 W1 s7 G) n/ X  L7 H1)在RBD中创建卷2 [1 O# j% w2 H

) P6 Y9 R2 c2 w命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小
2 o1 E" _- `- e2 a: }' Z7 O7 ~$ \
7 S: e1 h! ~! e  k8 z[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G
( G% S( m8 Q: y9 p$ s6 |Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
7 i' l; D- O: c
; A5 i5 z2 F% I/ b' P' P9 y5 E" h/ `$ |  u; @; W) Y: |/ _
2)查看创建的Qemu卷
1 T2 i$ B5 T' T1 I, Z, \0 l
. s: u7 @* X* @+ O2 u8 `, Z4 g[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img
( d+ s. D, I1 ?* ?' N* ~- }image: rbd:kvm_rbd/vs-centos7.img
& y9 p7 w% b& @file format: raw8 ^) z6 X1 A$ H% ^1 L% `# X
virtual size: 500.0G (536870912000 bytes)  ]8 L/ X: \/ d+ J, u! W
disk size: unavailable2 {2 R( [) e# J; j6 d* D# l
$ s, U' C& e$ ?+ z# ?
这个卷其实就是资源池中创建的一个块设备。
+ Q& g/ N( R! S( C# w4 H4 {: P5 t7 O* p1 E2 r" ]/ y
[root@kvm ~]# rbd -p kvm_rbd ls
# y" U1 r) F) M" o2 {( Dvs-centos7.img
+ A# `0 K3 K% W- U
4 @- X1 _4 i" c1 p$ K[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img( X$ s& C4 @2 e! z: F+ }* [6 {; l/ V
rbd image 'vs-centos7.img':7 w$ g* G# j5 r9 d* g# p
        size 500 GiB in 1280 objects
2 C$ e2 j5 }0 K2 p! l( T        order 22 (4 MiB objects)1 P  X8 y! b9 q! F) c
        snapshot_count: 0
4 Z; X9 ~- ^) z! i4 Q* S        id: 19a9415778427
5 m& E$ r  u* J& M  J) m8 Q6 v' g        block_name_prefix: rbd_data.19a9415778427' G5 i8 a& G. N; }# ?4 d2 a6 T0 e
        format: 2
( m2 U0 G3 p0 V% \! R2 [8 O        features: layering7 E- O$ d3 G" ^1 f
        op_features: % A5 `! ^1 ~* {8 H
        flags: * S; s$ V  E1 y) K* f; s( X
        create_timestamp: Wed Apr 20 22:14:33 2022
- T1 [; B% @# y' G        access_timestamp: Wed Apr 20 22:16:43 2022
2 d3 g) ?! P0 L! B- U        modify_timestamp: Wed Apr 20 22:14:33 2022
* ~% F& h' {8 @! T  G* f4 F0 r- K1 f1 X! b: p' L7 O
1.5.扩容卷的空间6 l, P) O+ ]6 h! F: r. U0 I
[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G7 \/ M6 P6 a9 N( ?. N
Image resized
, q% ~! h: I% N8 `, A: m, ~' j
0 T  @) u" h; f, n; ^- j9 d$ e  B2.Libvirt使用Qemu为KVM虚拟机提供存储4 w* K! X) a) p& k( K: {+ p
Qemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。
: Y* W( {. `: t7 y
$ `0 y! \( v2 h6 Z2 m7 t7 x官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/3 v" }' D7 {, N; q3 I% B

* h) O2 Q0 l4 [- }3 h+ m, N
* B' ~- ^2 w  {6 N9 A1 W+ p6 f
" G$ {- C' V7 A7 M6 JKVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。
- o# n# _! v6 R' C
3 v; c8 G* t6 L大致实现步骤:
$ ^, {, g' q# [( y% o7 H& I* h! y7 Z  X6 Y$ P6 Z
1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。
& [* p& {# {4 W; y& K$ o( j+ R$ f
* X) z: P" f" y% @2)创建一个用户用于Libvirt访问Ceph集群的块设备。( m+ c" y4 z  _* J+ U/ i7 L

. |. L- M: r2 o4 S5 G8 L' G6 B4 B3)创建一个Qemu存储卷。( K$ \& ?$ O1 P

8 Z+ `0 C0 r+ ?1 T. J8 B$ n. W, _4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。
* C% n$ _9 z# ^1 _( H
0 _5 B# ]) @4 T, u9 ^5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
8 |+ N. }  n' \2 q+ [4 x
; A. a, C6 I& W3 V3 f5 t其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。
* _" u3 \, G" ]/ t7 U, O2 S# [, b+ ]) o4 W
2.1.在Ceph集群中创建资源池
9 x+ f+ c1 I- J2 M2 A8 c+ [' v1.创建资源池% ]6 x7 F# \& h1 y
[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
/ ^1 h( p# T1 f9 y6 c- v4 {pool 'kvm-libvirt-pool' created
1 X& b7 U" r2 c* y/ B- W8 J
5 l% i* p( i1 ^4 U2.将资源池初始化成RBD类型* F7 u  T7 d; Z; {
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool
0 f3 O. K5 ?5 }  q* t4 \# {. c) A" }3 `) I6 y) Q  Q& C9 T2 {4 T
2.2.创建用于KVM访问RBD块存储的用户  C- v. p7 F- H1 ]
[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'
% c" \0 y9 |: p; w/ H: u[client.kvm-libvirt]$ S! K' |" V! k
        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==; H4 \! k. ?: R5 P/ M

$ o! P* |3 Q0 ~7 j1 [& B5 `2.3.创建Qemu卷
  {) U7 N3 L7 @[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G
4 x, a: c: s; J- M# AFormatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0
0 B# f  t$ _; |, ]& r( F# C  p1 L" _2 h8 k' @- m: M) i
[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img* Y1 M, u8 y" Y* l
image: rbd:kvm-libvirt-pool/vs-centos-1-data.img
0 p! {; ?2 l; {file format: raw
/ e& m: b) ?+ Uvirtual size: 500.0G (536870912000 bytes)& K9 d) z. d9 Q2 {7 q
disk size: unavailable
( R( Q+ a: ?) E; Z/ W' B) @- g  @; D, a2 ^) `
2.4.将Ceph的认证用户写入到KVM的Secret中
+ N6 }" Q6 f* l* N0 q首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。
) O/ E6 \3 ?8 p
# g4 o2 T/ v8 k/ r用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。
3 Z3 `3 R. H: V3 l  k, L- _' Z1 \# Q/ d; p9 D( K
1.编写带有认证用户名称的xml8 V2 c: [5 @( g, H( y
[root@kvm ~]# cat secret.xml) G3 e- R" I; j& f
<secret ephemeral='no' private='no'>
5 m* c$ F" d" O        <usage type='ceph'>
9 ^* A0 a, _/ i. Y7 w                <name>client.kvm-libvirt secret</name>
$ w$ C' P3 h5 |$ _0 S7 M# n. X' M0 Y        </usage>
" ]: W% @) j! {/ @. B6 f' _</secret>) B( c; J; [" N9 }
#name中就是认证用户的名称
# o" x( R6 |. {- h8 h. F% G3 ]8 p0 g# z8 r( k( X7 X
2.将认证用户的xml文件导入到KVM中生成一个Secret
4 f; s) U/ |2 ]/ k8 ^& `0 ][root@kvm ~]# virsh secret-define --file secret.xml * J* A7 w& F8 E0 V* `
生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
* q; P( p5 H0 W, X  Q' d6 _' |: J1 @% F0 u' H
3.将认证用户的Key写入到Secret中
3 O% X0 J: v6 P) |8 W[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==  P6 S" H# Q. v
secret 值设定
9 r1 D, ~/ N0 D0 f; ]#--secret:secret的uuid
9 i) |, C$ m) o; D* }, w: [, q! k#--base64:用户的key
* S* v+ P! @$ G5 c( g; T4 k0 i$ Z! [4 C& I2 q/ i" b! e" D7 W+ R' x. q
4.查看生成的Secret信息
) X0 p! p1 ?$ T5 O: c1 q) c[root@kvm ~]# virsh secret-list & e/ \$ Q' k- |: Z1 [, w3 |
UUID                                  用量. x# J+ W6 H4 @3 n- ]9 \
--------------------------------------------------------------------------------9 A" }2 P" J4 q) G2 k0 H
66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret1 c; H0 _4 M; Q
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e823 _! U! a4 R! G) ?  [
<secret ephemeral='no' private='no'>. ?" B  ?# D& U# e( B
  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>1 ?+ F) c/ h. }  i/ j% E
  <usage type='ceph'>
6 ~# ~1 b  n  ?9 ~6 f4 Y+ l5 ?    <name>client.kvm-libvirt secret</name>: i1 O1 g9 l( w% r
  </usage>, o/ U; u; J; l% _
</secret>( }6 L0 v7 K0 ]. Z9 ?% n5 |: X
% }* f9 X/ T+ a1 _
2.5.在虚拟机中应用RBD块存储中创建的块设备! {7 d; z" F1 n- W8 T$ w
需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。
7 T2 h  A' o9 F
% f7 H, u5 ]  H1 D: I9 X5 Y, B1 D1)先停止运行虚拟机* k1 X9 \; f; D5 B% X
% V5 [7 \% P! F4 ?# c) v0 g' @
虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。
. d% T" `% I: E: s  p# `( c3 w2 }6 ?( `
[root@kvm ~]# virsh destroy vs-centos-1 0 o0 U, k% |7 h" D% k) I. P* b
域 vs-centos-1 被删除+ b& j5 p* I. c- {2 o  w
; f3 j( {- i6 `" o, a
2)调整虚拟机的配置文件增加硬盘
3 g' [* O3 k! \5 q, i! B5 v4 d6 h2 X5 r) Z+ X
在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。- R2 z7 C, q1 ]$ R8 l9 J
$ Y4 ?6 r' X( P9 {: ]) I- H& E0 F
在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。
( R# L4 j+ ]8 \1 T4 Y: p$ ^7 C9 G( d; s
在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。
# r* a/ L" o8 w. s" O+ R0 p9 U) O6 ?$ C3 s
[root@kvm ~]# virsh edit vs-centos-1
2 Z  n: n+ c- ~4 {8 p5 T    <disk type='network' device='disk'>
7 \6 M) `" b+ ?0 \      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
4 r/ \2 V- J4 O  B           <host name='192.18.0.20' port='6789'/>
! o+ h- z  R! W4 A% J. n! ^4 q           <host name='192.18.0.21' port='6789'/>( v$ ?1 _4 l+ k' u. Q# I& \: A8 ?
           <host name='192.18.0.22' port='6789'/>- j6 G& M( F4 S& S( E
      </source>
4 n) L( g/ m9 ~+ k1 I) j' B9 G      <auth username='kvm-libvirt'>
8 ?& b; d. p. B- o/ e1 g& u           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>4 Y! L( B4 @" E, s
      </auth>  a4 l& \. d) Y
      <target dev='vdb' bus='virtio'/>
0 A4 i/ F/ u4 |    </disk>. g9 j+ T7 W% w" b: L' b9 s

: h& f6 }0 r: P0 y( p4 t! h* \( }# F* f9 T9 g

3 n5 L" C: `9 e, w3)启动虚拟机观察硬盘是否添加成功" C* A2 ]3 d  i( E. L

! m8 Z8 \' Y+ ~9 |' N7 t% M# N两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。$ O2 `: A/ @6 B1 V5 ?" Q8 x( R
( l* ?# p; u# n2 M( _1 e1 S- }& T2 Q
[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'$ J( a' `# K# O; L& u
drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/vs-centos-1.img ro=0 drv=qcow2 encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
: z1 C( O8 ], E! E3 X! Z! qdrive-virtio-disk1: removable=0 io-status=ok file=rbd:kvm-libvirt-pool/vs-centos-1-data.img:id=kvm-libvirt:key=AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==:auth_supported=cephx\\;none:mon_host=192.168.20.20\\:6789\\;192.168.20.21\\:6789\\;192.168.20.22\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=00 N* \& U( Z) r6 O6 f
drive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
7 d6 s! X+ B, i  x# P7 g. @2 Z( u% K/ C" p5 \. q0 F! t
[root@kvm ~]# virsh domblklist vs-centos-1
7 r2 B0 S! o7 S: R目标     源
! O; G/ @7 ~! ~: c  \- \------------------------------------------------
) H" U2 ^) V6 [! q/ H4 Xvda        /var/lib/libvirt/images/vs-centos-1.img
# U3 g8 G/ U) d/ u0 Gvdb        kvm-libvirt-pool/vs-centos-1-data.img
- K7 B& |# B2 Z4 ~hda        -
( G# T: q9 O$ n* }
2 E. e# F; W- N& y* J' c2.6.虚拟机使用RBD块存储提供的硬盘
* U1 d$ H6 F5 ~( m  qRBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。
6 i# [; w; l8 I. A; U3 Z8 \- L0 t- Z* t
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。) S. K0 z9 u/ T8 I! H/ x+ f, }
* a/ {( G6 j6 ?1 a. F
lsblk
# o# `7 y5 a: Q8 t, x. T% y* ^: Ymkfs.xfs /dev/vdb
: b! d% G( o9 J* imkdir /data
: \3 P) u) e. S' D% Vmount /dev/vdb /data
5 J  w7 h6 h1 G9 D$ v- wdf -hT, U. k; U' G! d' \
cd /data  T+ q6 ]: z& {3 B! q
touch file{1..5}.txt! m  b9 ?, F' D1 C
ll7 Z/ Z" y/ M: w0 z. b+ B- }5 F3 k

& n) E' U  e* J* L; g  [
2 \8 H  a0 [' h( G, e$ D, {: c- A此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。
; z; b3 T" A) ^: M, J2 W: @
! v( B) A+ S" h- a; t$ M
" k& r/ W$ Q5 z
$ r: y6 u# [7 }0 R! N& A* K$ `2.7.RBD提供给KVM虚拟机的硬盘扩容方法1 H* @, k8 L2 r4 R
1)扩容RBD块存储中块设备的空间. p+ V+ w- S" T* V! m; L

5 o, s  ^/ B; m* k: D7 _将原来的5G扩容到7G。
* ]) i* D* e$ A5 W0 e/ g$ N1 l5 e. W
. D" Q/ L* [7 A[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G1 ~4 P4 `1 \4 v7 B$ u/ `! l
Image resized.
8 U1 E' d( Y2 y" r/ l2 {7 u% ?4 V& P" t3 J5 d, a
2)重启虚拟机
7 j8 b" h. F9 c5 [3 a$ i! V) V5 T
KVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。! r3 l( M9 n3 {6 d# L) k

2 m+ |. |: p; e) [[root@kvm ~]# virsh destroy vs-centos-15 T# W$ I' E" V9 T; t' x
域 vs-centos-1 被删除
9 Y; `! y% Z6 {" S! Q/ Y0 I; V5 P9 k: z- J4 e4 S9 P3 D! X5 V
[root@kvm ~]# virsh start vs-centos-1+ G, i% i: W; o9 ^; I1 _
域 vs-centos-1 已开始
6 H3 @) [- ?2 H& E9 X  e
7 P, z9 x% D  k$ R* `: G/ H
; k& T, b& L7 K) O1 Q3)查看硬盘空间是否生效
" H9 n* t7 `9 ^8 l- S9 K. o: l  J3 P# p
磁盘空间已生效。# z1 w8 c9 M5 X7 L! U

% c; h# A# l- v
, k' C0 _- y/ I0 m4 ]3 a! f0 `4 ~7 n
3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储
: J8 ^- P4 x5 m! Z) l首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。
9 U1 n* i# ]# {( w, E* H6 p; i) s% ~' O, p9 }6 L& A5 m3 U; t
3.1.将本地的系统盘导入到Ceph集群的RBD中! q0 `* l; W5 d9 R: I
命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}9 A7 g2 A9 }* s) Q! W; W* ]
4 y+ M/ [: r( S  f# d3 _" B
[root@kvm ~]# qemu-img convert -f qcow2 /var/lib/libvirt/images/virtual-host.img -O raw rbd:kvm-libvirt-pool/vs-centos-1-sys.img% @9 I3 F% m4 }! m3 _; Z. R3 f
# S) j  {8 O: a7 N
查看导入到RBD块存储的系统盘。
5 J+ k5 K* ]- h! J; x* p
6 x6 t# C% [/ f1 Q7 `$ `. V/ \; }! u[root@kvm ~]# rbd -p kvm-libvirt-pool ls
  \1 T5 Y: f3 l" Y2 i0 `vs-centos-1-data.img
' u$ i+ C3 N* M! B% O8 vvs-centos-1-sys.img
8 Q- O7 _5 N, \( m; l7 [# [3 G# Q8 E' g( p
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img
# T8 U' ^6 g2 K! P  ?/ t) Xrbd image 'vs-centos-1-sys.img':# Q4 J$ I5 b- X4 H: n
        size 10 GiB in 2560 objects6 K# Q' v4 V1 j6 V/ i& Y  u
        order 22 (4 MiB objects)- k* ^8 z( |+ i" ]4 X* B6 W
        snapshot_count: 0
9 F( }9 w" K: L/ L        id: 19a5d559f577b
* q+ Z: H3 M9 `' B        block_name_prefix: rbd_data.19a5d559f577b
' l0 ~/ P3 n9 p6 W0 q        format: 2" O3 n% ^) J/ ]* z  e( D' h5 r' n$ i
        features: layering
& G; S2 s1 N. g# w. t' T9 |& D9 U        op_features: 5 s' X7 A) h& Z: v; ?
        flags: $ j7 D' `9 x- `+ I# ]
        create_timestamp: Thu Apr 21 13:06:56 2022$ U# _# Z0 I& b. ?5 N8 m/ R" h
        access_timestamp: Thu Apr 21 13:06:56 2022
0 o, h: V# g2 f2 ~% F        modify_timestamp: Thu Apr 21 13:08:58 2022
% I% K+ x4 l0 V! t2 C6 L* N/ X) q6 P; Z
3.2.修改虚拟机的配置文件调整系统盘的路径+ m3 c, ~) N3 U( I7 L/ c9 A# i
直接将现有系统盘的配置信息修改成下面的内容。8 L/ W$ k9 `" t* C0 c
# b0 K* E$ i3 n5 X. y) Z  C
[root@kvm ~]# virsh edit vs-centos-1
2 L9 h4 F1 }% m$ P7 K; }0 Q    <disk type='network' device='disk'>) n  G2 @' [; P
      <driver name='qemu'/>0 e( M1 C0 _% V  l3 ^) n0 ^
      <auth username='kvm-libvirt'>
8 Y; ~2 U/ g! E! Q5 x        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>3 z1 X" t  }% G5 r% X
      </auth>9 q' a" c) Q' n1 s# |
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>4 V3 q1 y- C! K2 V- Z8 A
        <host name='192.168.20.20' port='6789'/>& d" d9 a8 L( c9 f! u6 E! x
        <host name='192.168.20.21' port='6789'/>, i- Q2 b: c3 o. ^
        <host name='192.168.20.22' port='6789'/>
" w. q* P! r' L) J$ G' ]5 P      </source>
! _9 W4 h9 z; n, M) j9 H2 k4 V' n      <target dev='vda' bus='virtio'/>
$ y" u( s, u8 P0 j5 ?    </disk>
  O0 |, r3 ~& ~3 b
- s; z/ s; {- F* e# q7 d7 i, h0 ?. T3 M) `1 R1 `
7 o8 [; \) p; Z$ G+ @
3.3.重启虚拟机
/ W9 X6 t* w$ P[root@kvm ~]# virsh destroy vs-centos-18 F8 ^! M( V6 @8 B
域 vs-centos-1 被删除- h2 c* R# C: t+ p( B

/ {# l" y9 d3 b1 s[root@kvm ~]# virsh start vs-centos-1
9 d! F! C. e7 s9 O域 vs-centos-1 已开始* K2 {& d* z. w9 V  v; @$ p" C8 @

3 V& k; {) f' E- J* E1 K1 F* U3.4.验证虚拟机是否可用
  D0 u$ K, ^5 j5 w0 @% E, d安全没问题。9 u$ R) ]7 C6 P9 `4 D, T1 X

, m+ M' X  w- c$ n# Z7 V' |
( r3 g' w: t) o6 p% V( j9 F  ^3 C" a6 y' G7 T; L
4.实现类似云平台秒级部署虚拟机
+ X7 U! B5 ^8 V+ r5 l$ r3 o; Q在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。
, g7 T' X  m) ]& s) n
$ P2 E4 p8 `6 f  o, x" \  L秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。3 I7 ]& f# x& z' t' ]' j

; U, }) }# A- H- Q如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。0 p0 T. B3 D, b
* m, L. s+ M7 g0 I  N$ t
4.1.将现有虚拟机的系统镜像块设备创建一个快照" C2 V# v6 w( s8 l
将系统盘对应的块设备创建一个快照并设置成保护模式。
, [$ S! H# W9 q! a5 q( E# q' h* n' r3 O1 ]& b
[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template9 X0 U0 ~3 @3 k. `
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
; V7 l5 ~1 h0 C* b6 M  N
9 C6 j! _8 K0 m1 S" k% Y9 ^, V4.2.为新虚拟机提供克隆镜像
3 o7 @' e/ C+ U2 d1 i6 W$ w# w为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。
; ], Z7 J# `8 ?: i  I5 m
6 x1 o* S7 b6 U5 X$ U3 r[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img
8 q$ I& Q( T, z2 m/ e* \[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img
% _  k& [1 Y, u' X1 E' m. M( {; u1 p. N4 k  B* c

' @' t3 d  A+ w* L# L4.3.通过虚拟机文件准备多个虚拟机+ h* D0 M3 D* {! ~1 Z& l4 F9 ~7 B. D
KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。
( U, V" r+ i# C$ U2 Q6 I) {7 i% D$ r" U+ f
进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
; V! x. a- ?  D) s) `7 e. D& v! j! {& r4 J# U
[root@kvm qemu]# cd /etc/libvirt/qemu/
! b6 o, B( a; \[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml
6 J3 m, M6 v0 j% }: c8 ]; c) F[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml; B( |& o' s& c8 T
1 r) I$ T, o3 c) t; B- w
1 ]) D, N8 u% L
4.4.编辑虚拟机的配置文件/ [3 u2 C& }5 R; K9 r
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。
" N  @# h2 b1 J; \. Q3 \. J" P) w: C
# l: \7 Y4 d$ s4 C5 E<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>: Z# K/ o  v: O

) f2 Z& u3 s; a' A- l<mac address='52:54:00:eb:f6:97'/>
0 A, j$ u2 F# A6 W! x* X. [
- s" h' c! a  U4 f# n' J( U" V<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/># _# D2 P' o* w7 F: l6 E: L

1 m. r0 C. i2 ?( A# q4.4.1.vs-centos-1虚拟机的配置文件
& ~0 G- F! t( Q% }[root@kvm qemu]# vim clone-vm-1.xml3 ?7 H$ l- e' ^- l( ^0 B! z
<!--& y/ ^3 N4 A7 i; z2 X
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
2 o" F& K1 s4 E. W! o1 K! ^OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
+ Y: y  g3 P: c) M" V. F& V  virsh edit vs-centos-17 z7 W6 ]) m2 j1 B' c
or other application using the libvirt API.
5 e) R1 `& A) R2 U# z2 k-->
; y' l7 z! `! t9 ]
/ d2 Y/ R; t' b) q! o<domain type='kvm'>
4 O$ T/ O6 ]  H/ }$ y7 p+ G" e4 a3 S  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->2 e3 x- B# G/ F3 \/ o. w) T
  <memory unit='KiB'>1048576</memory>- s0 H9 E# Y6 _5 @3 s1 k7 B+ L! l! }
  <currentMemory unit='KiB'>1048576</currentMemory>
. n! T7 K/ H8 k& O7 b  <vcpu placement='static'>1</vcpu>- h7 g5 T+ [8 p  B
  <os>
" Z2 M8 d7 g8 Y6 Q8 X5 ~    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
6 `' C# ?6 R7 L1 B    <boot dev='hd'/>
2 {( a# }. d6 Y+ y; {" K1 ]8 {- y  </os>
) \" O$ b1 F  H! O$ t5 v  <features>5 ], ?/ \% P+ Q, Q
    <acpi/>
* W0 l& K5 K+ ^( g5 U    <apic/>
# B  D0 h" |$ T3 z  </features>: v8 D% x3 d$ I
  <cpu mode='custom' match='exact' check='partial'>
* r/ v5 z9 |( _  G    <model fallback='allow'>Nehalem-IBRS</model>
5 B* D; T4 M( U1 F9 c  </cpu>  |- L6 W+ X: X! U! p' w& q
  <clock offset='utc'>8 i' {7 m5 D4 p1 h& S
    <timer name='rtc' tickpolicy='catchup'/>' g4 t/ L4 Z: S5 V$ i
    <timer name='pit' tickpolicy='delay'/>8 |$ x) |5 N$ U7 _# Y0 D3 X
    <timer name='hpet' present='no'/>. y3 O2 R; N9 a* G6 U9 L
  </clock>. u. c# f0 Z. e; i
  <on_poweroff>destroy</on_poweroff>, T' i0 }( Y+ G1 r
  <on_reboot>restart</on_reboot>
( X$ I- X7 F0 j+ N7 O2 a  <on_crash>destroy</on_crash>
# m  n$ Z/ H9 q  <pm>, V( H& ]; o9 f. `9 w" B8 d( }8 I
    <suspend-to-mem enabled='no'/>4 r7 Y5 @# m7 K: S
    <suspend-to-disk enabled='no'/>
) Q2 l, E) T# _' P  </pm>* l% `$ H" I& \
  <devices>
( F( O4 m( x2 R5 L* s% I9 I    <emulator>/usr/libexec/qemu-kvm</emulator>/ N7 X# h. H- f( d  ?8 j# |+ X
    <disk type='network' device='disk'>- L( ^3 q2 |+ c0 z5 m
      <driver name='qemu'/>3 O7 d6 k. _5 ^* g7 t1 [
      <auth username='kvm-libvirt'>& V6 E4 j# U0 ~5 g$ Q9 O! e
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
0 j; P. E: m3 J% z) q5 n2 N      </auth>$ J7 S; b- v  c9 F& x4 A" q4 F: T
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->
; ~# y- A5 H+ b        <host name='192.168.20.20' port='6789'/>! ^# H& P1 [; R" V4 b9 [( n* z
        <host name='192.168.20.21' port='6789'/>' y6 o# K+ B1 }3 w
        <host name='192.168.20.22' port='6789'/>) w9 A2 P0 p3 p$ h9 H3 B9 b. {
      </source>
. a/ @; ~) x3 ^      <target dev='vda' bus='virtio'/>
& `/ T5 O  H) X6 s$ g* A* o    </disk>
1 z/ v: F: B, O    <disk type='file' device='cdrom'>% C8 _- b3 T8 p
      <driver name='qemu' type='raw'/>
- T6 C. j) _! B      <target dev='hda' bus='ide'/>) K- U7 ^# z4 E/ P" F, V
      <readonly/>0 W8 p/ L6 q' ?$ S6 R, N
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
: u9 [7 K8 G& r/ o, Y" A+ ?2 n    </disk>/ X, A/ D# {, K
    <controller type='usb' index='0' model='ich9-ehci1'>
9 R6 S5 h+ j. {8 U7 P/ y% d# [3 S      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
, L; d0 d, U7 y( Z+ I, o    </controller>6 ~% X  Q5 b+ c% O% [9 D' @6 B
    <controller type='usb' index='0' model='ich9-uhci1'>! Z) I3 ]- D! h: j
      <master startport='0'/>
4 t- v: _7 |  \3 b% S6 i, x      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>8 N% @, S$ t: ]% |
    </controller>
7 n9 m" j2 Y# a5 A    <controller type='usb' index='0' model='ich9-uhci2'>7 k/ g+ L* ~" J9 S5 c/ h' f1 q
      <master startport='2'/>
7 }( i% i/ a  ^& T$ i2 K! i8 d      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
; l; T- E( x6 v$ G    </controller>$ ~" M3 V3 [& c% H* B2 Q
    <controller type='usb' index='0' model='ich9-uhci3'>8 g3 B) J9 D0 {( R' Z; c" n
      <master startport='4'/>5 \  q$ K1 i0 d3 ^8 G
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
* V! A$ p, a* R& ?    </controller>" D/ u$ x# P; d) w6 V/ W5 g
    <controller type='pci' index='0' model='pci-root'/>
) G- p, c, f' J    <controller type='ide' index='0'>
% b0 ^, t/ a1 l0 E. S9 \      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>( A6 l, n6 h9 e3 \1 \. |8 u3 ]
    </controller>1 T5 G9 b6 J4 Y3 B" \& o# v
    <controller type='virtio-serial' index='0'>+ ?9 w& u' w# t/ i- s
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>" o2 y  z, \8 n& s; c/ y+ }/ |
    </controller>' T; y( ]7 l& A) W$ `0 s
    <interface type='network'>/ n( N+ w6 V7 ]2 O" B" m
      <source network='default'/>4 o3 Z5 Z+ N( H6 C. Z) [
      <model type='virtio'/># n7 e9 r9 o8 F: W, ?# Y5 E& j$ D5 X
    </interface>
  U8 _  @* b8 B    <serial type='pty'>
0 Z) _! L( k( L- ^) J& ^+ i- E      <target type='isa-serial' port='0'>5 M  r% a1 i3 z+ c4 x" y  `
        <model name='isa-serial'/>
& `( l2 }8 n9 C4 `      </target>! K1 J- M# @6 V: M" ?. i- \: i
    </serial>
4 e1 ?; I/ {, b    <console type='pty'>1 w0 V$ i6 v' Y6 l& b7 ~0 K2 V' g
      <target type='serial' port='0'/>
. t# n- \. \. A. C    </console>% t- @: i, H4 ^& |0 m, m* e
    <channel type='unix'>3 o9 z6 }' @7 A  z7 s" s: S! b
      <target type='virtio' name='org.qemu.guest_agent.0'/>7 i, k! x( f4 t. u7 F! g
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
! n# @* F& y: }" Y9 M    </channel>4 l5 b' \" z3 a. h  l
    <input type='tablet' bus='usb'>
1 w% n) S! t2 {7 y1 L" f. c) S      <address type='usb' bus='0' port='1'/>% |: |: j) x3 z7 \) x5 b
    </input>
! j# F, r% w# |/ @% s9 C( F    <input type='mouse' bus='ps2'/>
9 ~' K3 }7 S( T8 Y. t% b1 i: I9 K5 Q    <input type='keyboard' bus='ps2'/>  ^! z% T+ j% s* j$ `) _: d
    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->3 w, E6 P7 i. F% ~
      <listen type='address' address='0.0.0.0'/>! p. T/ N+ b- l3 W1 t# `
    </graphics>
: J- o$ \& T1 {' l" A+ R    <video>' B( ]1 d$ t! _8 `! J4 s6 w. e
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>- ~. B9 R4 T% N! v0 v( ]5 x
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
7 K$ e/ G1 f( ^8 ~1 n    </video>7 z8 v1 n+ M0 Y& u" a6 P
    <memballoon model='virtio'>/ J- ]! h4 E5 j7 f
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>( E. T6 H! H' {! ^: R
    </memballoon>
9 N  U0 C* a8 j, }: p6 p7 A  </devices>
- n9 z( ^/ N" H3 G7 ]/ _+ G% P</domain>
' `# q1 Q/ ^, ]
& l2 T2 D* s  G: r$ [. q; R) K4.4.1.vs-centos-2虚拟机的配置文件9 ^* u2 T6 D5 x6 o+ [5 U* K4 b: u
[root@kvm qemu]# vim clone-vm-2.xml$ T$ a( E& u3 ^6 D
<!--# }" F& q: d2 ]/ |' R+ y
     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE( I1 T8 n2 o1 h, |" d  {0 @2 y
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:0 _1 M3 C% S3 ?4 t
  virsh edit vs-centos-1" f/ i& V, H4 e. ~: Q1 q0 F/ A
or other application using the libvirt API.( l2 K  B% B) C- w# {$ |
-->
! a) y3 f9 R9 y; G, g2 c' K* P
. T7 }( N6 g7 B$ f* F<domain type='kvm'>
2 ~( ^1 m8 M) F* L& G1 x$ ]  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->! |+ i! ~! y2 }( T  Z; T( A
  <memory unit='KiB'>1048576</memory>* @" T# x3 E1 ?" Z, i6 F! i7 N$ m
  <currentMemory unit='KiB'>1048576</currentMemory>
- G/ _1 h$ n% ~1 _7 @  <vcpu placement='static'>1</vcpu>5 ]; u0 a' H* }9 x" b2 L: a0 V
  <os>
1 X. |" ?: m" O( z5 j% x    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
  B: J/ e( n* g    <boot dev='hd'/>- Q7 Q  p/ p( f
  </os>) q& q+ U% _' N
  <features>
5 R9 }% E( w* _6 U    <acpi/>
0 s& J8 L6 f7 g    <apic/>) b  F) L, J/ S) ?- m; Y9 I* L
  </features>& Q# Y* i! n! {1 m
  <cpu mode='custom' match='exact' check='partial'>
$ D" E6 R$ e4 u% W4 s0 \# t    <model fallback='allow'>Nehalem-IBRS</model>
- K% [1 e, d8 H! z3 T3 L  </cpu>
" I5 i9 @0 o9 S; h4 `8 Y3 o  <clock offset='utc'>' @: W$ i" f, H3 r2 S5 x
    <timer name='rtc' tickpolicy='catchup'/>& M0 d2 S+ I1 ^
    <timer name='pit' tickpolicy='delay'/>  t0 f: X+ H1 T  Y6 I- [
    <timer name='hpet' present='no'/>$ g2 `  v; O5 {6 s
  </clock>, O4 z+ V0 }  ~7 c' k7 H
  <on_poweroff>destroy</on_poweroff>' J  i2 I  C/ h. l
  <on_reboot>restart</on_reboot>
: D$ G2 m: Q$ i) x  <on_crash>destroy</on_crash>
& C, x# _; E( o" L& u" w7 n2 y  <pm>
  o9 ~9 P4 Z- @    <suspend-to-mem enabled='no'/>
$ ]: L6 P3 A! O+ D* A0 F1 u. O2 b    <suspend-to-disk enabled='no'/>
  s; W1 a1 e* G5 }1 N1 k  </pm>
7 f, y! _4 b5 u- C, d9 F  <devices>
) A& B3 O& {% r1 A- b! s7 A    <emulator>/usr/libexec/qemu-kvm</emulator>
* n& K6 T1 m- Q: O! l6 M2 O    <disk type='network' device='disk'>
, ^4 `& y, ^, P; b, H: t& F$ R7 Q/ D      <driver name='qemu'/>
2 O! U( u3 ]* v6 r4 N! \" K0 q8 ^) [8 T      <auth username='kvm-libvirt'>2 W% X; w  r, g- o
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
( |' U/ r: Y8 A( ]/ ~3 _, s+ t  h      </auth>. Q3 s# O0 g3 k: z, e& q4 s" V
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径--># ~2 `) h2 d) u
        <host name='192.168.20.20' port='6789'/>5 N8 X4 C, ]# q+ ~; q
        <host name='192.168.20.21' port='6789'/>
- P, ^7 {* }' O* u        <host name='192.168.20.22' port='6789'/>
+ X: A1 B- _# a+ i3 l' c6 j; c0 Q) m      </source>
2 i8 h7 ^* w" Z7 \      <target dev='vda' bus='virtio'/>
; H% t5 B& |! F( Z  x" C5 p/ }1 ]3 H! f- Z    </disk>  H% Q  E# g8 q! i# ^* R3 N; C
    <disk type='file' device='cdrom'>
- `( e; |5 }- r3 F2 O7 y7 c. m# v      <driver name='qemu' type='raw'/>7 ?& i( D$ f* ?
      <target dev='hda' bus='ide'/>
% L8 E/ f0 n# s/ w6 d& }      <readonly/>2 ~. t, N, l' Z) }3 v6 n. |5 x
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>0 M1 @) f4 U8 y; _/ N1 ^: P0 q8 y
    </disk>
  _2 \$ y- z3 Y: l    <controller type='usb' index='0' model='ich9-ehci1'>
& n: {8 c. t8 t# `+ Z, k* s9 U      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>9 m/ M* w; ~' N& f6 m
    </controller>. `$ i3 E! y3 D, }# D% [4 M& p% C9 J
    <controller type='usb' index='0' model='ich9-uhci1'>
+ ^5 z1 l  a% E( i5 U% `      <master startport='0'/>9 V/ V* _, f+ t
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>0 c& [+ G5 e! h' @6 ?: r' _( Z
    </controller>) [0 z  r% s) D( k& P6 @
    <controller type='usb' index='0' model='ich9-uhci2'>
6 t  c3 J8 V" H4 q% _# ?: a+ D- ~      <master startport='2'/>
. f% L* r. s: ]4 s+ y      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>" L& f+ m% ~9 {9 N! `) r
    </controller>
& m" D0 t9 l- E2 y" W  J% g    <controller type='usb' index='0' model='ich9-uhci3'>
/ I* X- h$ c# t      <master startport='4'/>3 W" H: J2 ^5 M2 I
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
+ d/ }5 B0 `6 ?( M    </controller>- ^& _3 d* B& E
    <controller type='pci' index='0' model='pci-root'/>
8 V. m, S! v. W7 v1 m9 F- A    <controller type='ide' index='0'>
# o* X6 Q1 O& N8 p$ y( w9 d3 v      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>  [" u9 [- ?- p
    </controller>$ |  a* Z# j% }& d% U7 N( _2 @
    <controller type='virtio-serial' index='0'>
# }- _3 E3 p  P/ U+ S      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
6 g$ p7 X' ?  `7 a' C0 O' @( c    </controller>9 A( y& B6 n/ B! B! S
    <interface type='network'>
6 x- l$ Z* E( i2 v6 ]      <source network='default'/>
2 M$ y1 x8 s2 l& U2 m! W      <model type='virtio'/>
5 g# ^9 l: P2 Z6 I    </interface>; O' H6 e9 U% z1 ?8 C5 n2 h
    <serial type='pty'>* l0 c, \7 ^/ h' Q: @$ ?! i; U
      <target type='isa-serial' port='0'>
# E) j3 D) e$ v' w4 y, x        <model name='isa-serial'/>( R9 d2 k7 k/ v/ E$ z$ q# [/ P( Y) b1 W
      </target>
) R( J$ `" ?4 }: m7 n    </serial>& o/ K8 p+ o  h6 a+ M( Y* v
    <console type='pty'>
# |/ i$ D. W. W: ]  s      <target type='serial' port='0'/>
5 b' ?- w- E, q$ V    </console>% F5 l; w) Q; i( @" _8 \4 n: R7 @* x
    <channel type='unix'>* V0 _1 A3 Z; z( b$ ~
      <target type='virtio' name='org.qemu.guest_agent.0'/>: q8 x6 N8 [# @, T& y5 Z3 p% y
      <address type='virtio-serial' controller='0' bus='0' port='1'/>  _' C9 C, {; l
    </channel>" t/ \; Q7 G& j, }$ F/ }
    <input type='tablet' bus='usb'>: Z9 h+ L( }! J
      <address type='usb' bus='0' port='1'/>
- ]4 P! r) ?& H& y$ X5 d    </input>
; U6 M% G% j- ^! L$ d( N    <input type='mouse' bus='ps2'/>
2 m% q% g$ H7 {+ r( j2 `' H/ K    <input type='keyboard' bus='ps2'/>
" Q1 c" c; G( y0 X    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->; q2 i( w+ s, x
      <listen type='address' address='0.0.0.0'/>
' j9 ]( R( x2 z    </graphics>, E1 R( e+ }9 Y
    <video>) W/ v- Q. N: B% l' D& [2 D% x5 ?
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
2 J# G% y" f7 c/ n. L9 K      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
/ V% t9 i$ R' X    </video>
$ J4 o( j& @5 c8 V2 ?4 n! A    <memballoon model='virtio'>
) A8 I5 A0 U, l/ t% J      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
- {+ H2 b2 u$ H( t4 I8 n9 @    </memballoon>
' m: i3 ~8 k6 m: c" e  </devices>
' Q: L* T0 E9 C* ]6 a* B7 e</domain>
4 k6 G$ e; y: {) M& m, D
! q/ k4 V, j0 X0 U2 }; U8 B
& c' ~1 |3 `1 g/ a* y& m4.5.将虚拟机配置文件导入到虚拟化平台
- k) \$ |9 N: g" [0 c[root@kvm qemu]# virsh define clone-vm-1.xml
  U# B+ D/ A+ s- f- s- B定义域 clone-vm-1(从 clone-vm-1.xml)
! y; d/ U# T- Q( @" ?' r8 K+ |& Y
5 K9 H" {0 K4 y# w( q: b( K[root@kvm qemu]# virsh define clone-vm-2.xml
9 S) ~' ?/ b( C% z定义域 clone-vm-2(从 clone-vm-2.xml)
, w7 O7 ]: [, a- J2 k: x6 b6 M* a
/ |* M: x7 ], A# j5 _& q5 u2 |; Y! x* J- _. D
导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。, ~* q- i' \) ?0 i: b( A3 x# d3 A

  x6 \/ H8 N( j% p+ e; p1 n[root@kvm qemu]# virsh list  --all
/ B: ~' I" Y5 X% B Id    名称                         状态" E, D4 D" e6 a
----------------------------------------------------; j$ N/ Q& c( U3 i
7     vs-centos-1                    running
; p9 u0 N* Y% G! ?1 ~& A+ k3 v: | -     clone-vm-1                     关闭" l" j% G" \1 P. y8 D" R
-     clone-vm-2                     关闭( v1 Q" ?8 y6 y* a

9 W& h+ p7 U3 K0 v4.6.启动虚拟机验证是否能够秒级使用
/ v3 g8 i4 N2 V8 Y[root@kvm qemu]# virsh start  clone-vm-1) C* }+ H+ m! ]6 A2 m
域 clone-vm-1 已开始# s9 j$ ^+ [4 L% k5 |9 O% D
3 T2 B1 @3 T9 [" @
[root@kvm qemu]# virsh start  clone-vm-2
% e6 v0 u& F9 B" |域 clone-vm-2 已开始- m+ J2 Z2 Y" M9 N: _# y
/ T+ }% k# m& q. T+ f: \' N$ [

/ F/ x9 S9 r1 C( y/ @- C! N9 @待后期更新。. T: a) ?/ i# F+ D& J9 b/ [
* Z5 o& S0 Y1 S: ]5 u

1 x( G# M$ n* ^, {$ ~" @9 r# Y

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通
( W. J: `. D% h+ N7 o2 p$ L8 O4 w- P9 j
1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)( A0 M* H# [2 n$ T( ]/ I) k6 O
" T/ P' Z% w: F* P2 P0 _0 f
2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下
/ ?$ }9 i6 }. ~' {& v9 o+ u" O4 b: q5 r0 t0 I* b& ?
3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通
! W5 z6 x( `' G1 K* m5 O- h* O) d+ g( M0 m8 |3 e
二、创建rbd盘并挂载给虚拟机
  _1 j9 T: `$ n5 Q: ~9 B$ h6 Y9 F) m- K9 F. l: D1 [! t; |
1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池
/ P  E; `" z( t9 A6 I' D+ O; |6 `5 g  x- F( [& x
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'9 [+ V* }% T( J' k

  z" d" t2 z, W验证有效:ceph auth ls|grep client.libvirt
1 k. |4 K" h  i. Y. l5 Q; h7 E1 K! h

: x; g2 v; T; E0 L) s7 Y) @9 M5 Z9 ]* `3 n" I1 O
备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行
6 Z% |9 ?6 `6 q0 _9 j
' e1 |( o) H/ |- X9 _  U+ V2.创建secret.xml
2 J4 d7 d* Y5 A& U7 L, `! \- P; O6 _# F, t
cat > secret.xml <<EOF
% q& ~- m" W/ v( b  D9 ^
+ C+ x6 G% b$ j<secret ephemeral='no' private='no'>  x  T8 |* f4 r  z1 v1 K* |; u8 Z

$ S2 I0 D7 y. H1 Q+ u        <usage type='ceph'>% p2 N' B  X0 }7 Y: N: m# ^1 }" b

- t! }$ g9 Z0 J7 k) x                <name>client.libvirt secret</name>
8 W- H: d- I- S* R" M- r  m$ o! n6 j
        </usage>0 j: l6 j/ q9 h* q
* U0 r/ }$ F- F% a9 W
</secret>5 ]4 z5 t. R' r# V8 U- j/ t% H

# ]- M' m9 x/ C3 D$ h, n5 c  Z" JEOF. F- x5 b" [5 k- o' j( R# p; z4 O' P9 t
/ M; v2 w0 A. l% Y+ X  A6 Z
备注:以上命令在宿主机上全部复制并粘贴,最后回车
, E* b2 k! M8 p1 L
! m: |9 W( M5 \3.生成uuid7 L/ ?+ x1 F) z/ s

8 L9 q6 r# _# F% z3 R* \+ S- q6 Q9 ksudo virsh secret-define --file secret.xml
# |  f- ?# D( T, I. W/ P9 {: E$ o9 e4 O
{uuid of secret}  T% ]& i* t7 d8 H' |
6 b1 l0 g) j* O/ g  X8 i& Z
4.获取client.libvirt的key并保存到文件
2 I& P* P, R7 ~8 |' V+ |
& b; d" }( F6 f# S0 ~6 ~( Nceph auth get-key client.libvirt | sudo tee client.libvirt.key* ?/ e( l; B! v! ]; d: `# H/ M
0 V2 {: t2 v9 b& M9 h
5、设置secret的uuid; e* S! W: P8 A7 q; |% ]/ M5 X

% n; [7 g" R( L, W& dsudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
: ?2 A1 a3 I) [* q& Y
8 S+ O1 d1 J$ w2 p1 F* P将变量替换成实际的uuid和key
. @3 Y7 W- t1 M4 }* h$ f. R6 Z7 u0 K! W8 h( N+ O+ ~2 `! P8 v
6、创建池libvirt-pool: [3 J6 M6 }' \4 }
8 N; J9 o9 e( V, m" }  r+ _$ _! ]+ i
ceph osd pool create libvirt-pool 64 64
* x$ Y' J* r7 }9 n* a6 t& R5 G6 g' r; u4 p; }
7、创建rbd盘* k- Z/ w! l* b- |# \( l& y+ N2 L
1 x1 e/ Q4 H2 }' w2 }% z- W# G
rbd create --size 10G libvirt-pool/test1 --image-feature layering, ^8 Y* q0 e6 U. X+ z. `/ ^$ R

/ ^6 s+ y( |" Y6 g7 H' r3 y0 Q. Y查询存储池中的块:rbd ls libvirt-pool' `9 F* x$ _9 ]- u: l
5 i4 S3 S  C; h0 `# N+ M, k
8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息
! z5 J# t2 |1 R0 N4 r* y  j& I) V& g  W. s' A$ n
关闭虚拟机:virsh shutdown vm! O  ~4 a. C; n, P) f0 ^

, l4 |) P: L; R5 T/ J6 t编辑虚拟机:virsh edit vm
) Y' Z& C! x8 j3 s5 y5 a7 `0 u/ I! G. R3 t6 f$ p3 d
在disk标签下增加如下信息:
  U  C1 v/ {8 n  x0 M7 L* ~3 u+ C& }
  D# f% F6 z% p8 ^; s# h8 {) T<disk type='network' device='disk'>
9 u  M4 H+ K. t5 n# U  Z$ `) I" A) P, n7 K9 n
      <driver name='qemu' type='raw'/>
+ |$ i) b/ [4 y( h' N  W! w" Q; y# x0 Q* C. Z+ G
      <auth username='libvirt'>. Y9 |% i( n$ P* t
. {& J. z; \8 {" ?
        <secret type='ceph' uuid='{uuid of secret}'/>* R2 O0 k: M4 t5 o

7 _% ^* c7 @0 q) C; B0 y: O# Z/ _3 a      </auth>
) T' p3 [7 b' f; [" v2 c# T
) z  s2 ^9 W' ], b      <source protocol='rbd' name='libvirt-pool/rbd_name'>+ B& d' b5 M8 R# x$ O

/ Y# V( {. g* B- K! f5 \7 v2 F) d        <host name='10.25.72.142' port='6789'/>/ T* V3 i( I% o, \

5 q: ]9 p- P1 s+ E        <host name='10.25.72.143' port='6789'/>
- m; ~5 s0 D+ r7 Q" H# T9 ^5 ~
* {9 ~2 q/ U; v/ c1 r/ d        <host name='10.25.72.144' port='6789'/>
  d4 H4 @: {! P# f" u1 J# e* w8 `5 T1 F* L
      </source>: [0 m, H7 }% S; I2 H
( A1 T0 A9 u  c% y
      <target dev='vde' bus='virtio'/>& A. o  x% k7 a% `

8 X9 o" [( G7 `2 P% t! ]    </disk>3 y6 k0 x2 i/ b- R( g- g( y1 d* W
- H, z& r3 f/ H
备注:% m) r/ W0 ~/ }/ _* {# m

. j: m9 G$ o( g  b6 C需要修改上面5个参数:
( z) \5 p5 _1 d, l3 [2 p4 Y" t# [; Z
1 g" h( N. w# ^! |/ F1 U( u$ J1)username是建好的用户名:libvirt5 j3 N% U' f0 h2 q1 K
' _, h/ s) r: {- [9 X4 l
2)uuid替换成第3步生成的uuid3 e% G; v. ^9 {/ ]. E3 b

" O$ O& n6 V4 B3)host name后的ip为mon的ip和端口
) @6 @  D2 b) S) m4 n
" D4 v: P# |/ p  }9 G9 C* Emon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip
5 u% j7 a; k% I: H* Y/ d# `8 ]2 X, z$ G* v& Z- @

! I. j4 z, V2 C
. S, D+ s0 E5 i& }0 v9 T* h0 R$ l) j4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde: G1 k4 M) l. z7 r
$ A8 r( Z. l4 [% w
5)libvirt-pool/rbd_name是创建的rbd盘
! M. Y6 J) }+ i2 o( i; Y0 e' v
2 t6 r9 z+ \* p9、查看虚拟机挂载的磁盘% u2 V6 W+ u; ?6 M

1 J/ |) R5 ?" T! U4 H9 @! `virsh domblklist {vm-domain-name} --details- i( l& Q' p0 I1 k& r

$ D( y7 M" m. j$ A/ i- @10、虚机开机,即可使用挂载的rbd盘8 F: P3 w8 R8 {/ O/ R0 q( d

9 ?9 g3 }1 q- J7 y/ Q/ q+ ?5 U3 }9 pvirsh start vm
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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