易陆发现互联网技术论坛

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

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

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

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

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

x
1.KVM的Qemu与Ceph RBD块存储进行对接/ l( f/ j2 i5 d4 }% ^& R$ z6 R
1.1.Qemu与RBD块存储对接的架构图; A+ t3 i7 l0 M* z$ \3 A7 `
Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。/ j) F# D+ j" k1 p
2 Y6 y0 R1 l/ P% r0 [6 _
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。
, ^! T4 a( z: C  [% j+ ?
  Y' F+ W' ^# _* T+ y0 HQemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。4 \+ X3 V7 y5 ~- h. Q+ p
. d# |6 F( \2 _: u! Y( P
3 _% O3 b" e8 ]. U6 D7 `

9 g. U# B9 O- J  i. o- ?Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。  b6 ^6 F( q$ K# N  A

  C0 F; c3 F( R官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/  [+ \3 y, k, V) s! G; u9 _$ P) ^
# m$ ~- S2 q) Z$ X/ Z: j9 K
1.2.配置KVM服务器连接Ceph集群
9 u4 C( D+ y$ b2 wQemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。- w$ i) p) m: ~  {% q

4 }  h) Z, K5 C( b/ z1 r1.安装ceph相关命令
& r5 {: V% j% q8 T/ Z( i[root@kvm ~]# yum -y install ceph-common
3 v+ g" _! _0 ?  f/ P# o5 D- Z0 I+ x; K( O) ?3 z: e
2.拷贝ceph的配置文件' O$ m2 H; U. |1 ^' s
[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/
3 h9 M* d8 V6 T; z$ o7 @2 k8 |: c
3.查看集群的状态2 `$ z4 T4 a4 l+ ]* L7 f
[root@kvm ~]# ceph -s9 j; J, S( `5 _5 c8 @
    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0  D/ m9 |; O. h1 d3 X2 ^$ b
     health HEALTH_OK% `/ z2 g* n3 G# u$ b
     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}
" G$ j5 F( o0 u% d            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
, k) Q" q$ c' t' Z     osdmap e29566: 131 osds: 128 up, 128 in
# `- Z! P( m* n& ~            flags sortbitwise,require_jewel_osds
: ]$ q4 [& P8 I0 V& x      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects. O; Q1 G# P- Z! H6 R
            291 TB used, 174 TB / 465 TB avail) C1 u8 j9 ]- ]) C7 K% B
               10234 active+clean
0 V0 Y; l0 c/ D0 m4 B0 a" d: w                   5 active+clean+scrubbing+deep
; W2 G5 Z8 V! U  v/ E6 O% I/ U                   1 active+clean+scrubbing
' O$ o2 _  g& O$ E. L
3 _) }3 M6 o( Y* V' Y! [1.3.在Ceph集群中为KVM创建一个资源池
0 H- X0 O% t: a. w4 v[root@kvm ~]# ceph osd pool create kvm_rbd 32 32
& a$ Q- v$ d, J. jpool 'kvm_rbd' created
8 s. q6 {/ f- ?* v& f
+ I# b6 |- ]' ^1.4.使用Qemu在RBD块存储中创建卷
$ \7 G5 I  v( R" F1 K8 x7 U1)在RBD中创建卷2 Z1 M* }0 ?5 Y& a0 g& Q

  h" N. Z* S% K5 K# V% _/ F1 q$ A命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小( `5 [) ?7 ^+ I; }

/ ?) U3 i  t0 q4 `4 l1 x[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G
1 C* `) O6 H) MFormatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
2 \: Y, L1 {: B( `0 a9 R2 `. P0 G" ~6 l- Q. p6 d( q

1 G, c' S  s" \) f& c5 E2)查看创建的Qemu卷* Z1 `7 e. Z8 Z3 I3 T& h

% |1 `4 c+ e1 r4 W$ b' ?[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img6 O5 E/ e: e* U6 M+ q* |+ w7 c
image: rbd:kvm_rbd/vs-centos7.img2 h9 S' U! |' ?
file format: raw
, e" Z7 }' F& fvirtual size: 500.0G (536870912000 bytes)# T0 Z( T/ j6 g3 G; W1 n7 q: h+ q
disk size: unavailable
/ e  \& r0 P& G8 p+ ~' G0 \+ c4 N! i" ^8 k$ d! s
这个卷其实就是资源池中创建的一个块设备。
' P4 D4 q  |  B; X  x
' ^4 ^5 C! l/ q/ z[root@kvm ~]# rbd -p kvm_rbd ls
% v7 a8 o' ?# u) r: tvs-centos7.img! P% {, A2 \7 v5 g* r

( T6 h( v: M. T- S& h[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img! ?& P7 x  Y3 P8 ?, ?6 a
rbd image 'vs-centos7.img':
* S# b8 L& ?$ E7 f' P        size 500 GiB in 1280 objects4 T) J: ~2 T- H  p  X$ ?
        order 22 (4 MiB objects)
3 R2 c7 G# R6 M( Y+ T% [! n        snapshot_count: 07 y2 \8 B. P# E* r( e7 G# A
        id: 19a9415778427
0 e$ P8 L0 j1 m3 i  }" l: D) K        block_name_prefix: rbd_data.19a9415778427
' I& x0 _; d/ I) v- q        format: 26 k0 G4 z) Q" ^- ?3 V
        features: layering
# d4 ]1 i0 D2 }# a# i        op_features:
. T+ [4 `6 J# Y8 v        flags:
% [9 R+ T- e8 x" C8 _) M        create_timestamp: Wed Apr 20 22:14:33 2022+ K) Y! R% r* z3 d9 d* c2 Y, [
        access_timestamp: Wed Apr 20 22:16:43 2022
+ f/ D3 I! {9 V: y1 D2 _        modify_timestamp: Wed Apr 20 22:14:33 2022
( ^. U6 I* F0 {
% \7 J! C' U% D, L1.5.扩容卷的空间
' ~# j) J$ @$ o+ T3 |3 r8 [! X[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G4 f6 a. v5 K3 h" b" E1 C
Image resized; }7 |0 J& j, r2 b+ s4 Z
5 u( ^" A8 u+ @4 R
2.Libvirt使用Qemu为KVM虚拟机提供存储3 d% Y  }2 u# T' q3 H* e
Qemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。# @' r7 h+ i  ?& R: I1 c
% Q6 o) u4 W& j: A* N4 ]+ {( M
官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/  D6 `( ^& T' V$ G
1 S8 S0 P, n  v

6 Q5 B' p3 t1 D) a/ T  E$ ~6 V( M
/ ]  W% h( r! o" ^- q8 SKVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。
' A2 f8 e' W( f6 X) C
7 G% f/ }- d1 [' U6 l* ~大致实现步骤:9 l1 l0 Q5 H, D# D6 h# p1 _
* g9 ~  a! F9 A- B
1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。0 o* N: B+ O1 \3 U" l  m! z
8 k& ~. l0 `9 v2 v& d& {
2)创建一个用户用于Libvirt访问Ceph集群的块设备。
8 a0 f1 B0 r* J# C# M3 V  W: v, x& `* N2 w9 h" _8 \
3)创建一个Qemu存储卷。- P1 Y: s: e6 i  L' U

$ ?% y4 q0 D) B3 P% i4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。! {6 v: Q5 f" c+ |0 [+ b: F9 F
5 o' j7 _" R! _9 h/ D9 Y* @
5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
! m6 H# o& B3 \
  ?9 U7 ~9 i' \其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。
/ M& O, O) h8 P8 x( d  \& y' d' z: C
2.1.在Ceph集群中创建资源池, b% a! O- L3 u$ o9 b2 E1 X
1.创建资源池
6 z( V* J& y$ c; h- @[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 166 k% U# w5 o; U# A) x
pool 'kvm-libvirt-pool' created
; [9 E. l* A+ k
" y# a5 q# n% a9 n! b  b2.将资源池初始化成RBD类型+ {$ I$ b3 `3 p1 O: m* d
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool
1 i- x9 l1 [8 h9 {; V# K  M) Z' K$ z. _: h- g$ Z
2.2.创建用于KVM访问RBD块存储的用户
5 Z, R5 }) E  K* ~% d[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'  ~: f) J8 |$ \4 H
[client.kvm-libvirt]0 f6 }( C$ V! t+ ~
        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==
2 n, |+ i5 f$ I. N1 G
. i' f' Q: V1 F# M2.3.创建Qemu卷  O& x& _" Y" Z5 `) Z$ Z; Z
[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G
3 G. j( u, V' z7 i$ K5 b* r6 rFormatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0 & D1 a" L1 F$ K$ D

( D2 \5 n8 ]) q( u$ _* r[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img
+ H- ^7 P! Q" F2 u: Dimage: rbd:kvm-libvirt-pool/vs-centos-1-data.img' J3 V' z% K# x, U2 W% u1 K" v
file format: raw
$ n4 i6 F( v3 d3 Yvirtual size: 500.0G (536870912000 bytes)
  o  Y* f# \9 }7 e/ V) gdisk size: unavailable# J1 L! v) G/ M$ a% ?
0 c4 \3 \- u' v3 M6 W# `3 v& ~
2.4.将Ceph的认证用户写入到KVM的Secret中
9 y. z/ F  o0 q9 u1 P首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。; r# c6 o- y) J  H! Q9 ~
' o$ t% h5 Z8 Z" T) D- b
用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。
5 b: F9 S* J# h  E  n1 C/ R
6 E; x" ~1 ^! c6 P# T1.编写带有认证用户名称的xml
3 m( e; e+ \" I, r1 F+ W8 B, g: ^[root@kvm ~]# cat secret.xml: m& ~1 b5 A4 s  M. C8 C! o
<secret ephemeral='no' private='no'>: z* ]& c. O* O. k6 @! ?
        <usage type='ceph'>
! W. }; d. z& @- P/ ^                <name>client.kvm-libvirt secret</name>/ [9 \* I# V6 K1 n! k
        </usage>. L) t& o( B7 ^5 L+ b. j$ z
</secret>
  g7 }) m# r6 Z#name中就是认证用户的名称- k3 L+ v( [2 Z0 }

5 a$ P; F6 ^+ w) Q2.将认证用户的xml文件导入到KVM中生成一个Secret8 t% W& u" w: _5 T1 s! o2 n6 \
[root@kvm ~]# virsh secret-define --file secret.xml
5 g; v) }# E; R生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
: O# r% R  a- h) I$ r' |% O2 T% y( Y/ r9 D% s* m
3.将认证用户的Key写入到Secret中
' i6 K; p1 {. K) {3 S: g+ l- c[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==, Y7 d9 y: L. y: B3 d+ W% d
secret 值设定5 L9 o0 T3 t! f" M1 {+ `  U* f5 H
#--secret:secret的uuid
8 o# T/ w0 M0 T# O#--base64:用户的key6 R. w2 v: l0 E; \, t. ]. n

5 _( j& q( l8 w: A" c' j# z4.查看生成的Secret信息
# a1 f7 N- c: w( v[root@kvm ~]# virsh secret-list
8 {- w7 |# i% L" P UUID                                  用量
8 Q  i, G) C# ?  I--------------------------------------------------------------------------------+ v: n, r7 |+ \
66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret
- ^; h  u$ [, F5 m  _[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
1 k7 M; R6 o' P0 h& a1 b0 N, E<secret ephemeral='no' private='no'>+ _$ }) A4 l, ^: N3 ?1 X2 o
  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>1 L4 E; [1 W" T$ y/ ~/ f* k
  <usage type='ceph'>% o- l2 }! W& S7 K4 \# S0 w. B
    <name>client.kvm-libvirt secret</name>
7 F) L$ ~) w. E- O  </usage>
9 \( b. T) d# e& u7 f( C3 w</secret>
& B% H2 I0 _7 m$ |
# V3 }; c4 c+ H' T0 Y; k( `4 u2.5.在虚拟机中应用RBD块存储中创建的块设备1 Q3 I  O# J( g8 L  Y
需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。; U! O5 T- B7 U* |
. U" s3 G" Q% d9 E3 j
1)先停止运行虚拟机+ j  o3 M8 E$ Y5 }/ C7 a
- c& S4 t% j/ l9 t! a. Q* e
虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。3 l. O" U7 T& C2 `) i

% N- }% @& G# d[root@kvm ~]# virsh destroy vs-centos-1
/ K$ U0 J$ T( y, F! c1 y3 ?域 vs-centos-1 被删除7 ?  ?! V* ?2 a' G
$ a# A* Q: C3 X) y3 e* a2 n% q6 F. P
2)调整虚拟机的配置文件增加硬盘
. G: k( l( s. I/ Q8 N  f. u& G
* J' n6 F8 g% z( T. q在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。
9 X& r2 X' P7 n' |3 X3 D. q
( p6 H3 k  O. ?  {在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。
. \, A# z4 |$ x5 o/ m& N
: ^/ J6 ?: P& M/ i# m6 Q在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。0 V8 b! N3 F# p& f
4 C: [- I0 i: h, f
[root@kvm ~]# virsh edit vs-centos-1
1 c4 D7 P) S' X- v0 S' b* I* }9 V/ s    <disk type='network' device='disk'>  ]5 X% m4 [1 u! b) G5 w: s0 O7 l( Y
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
( L6 e, |$ a; o9 r" C) L/ Z$ G% ^           <host name='192.18.0.20' port='6789'/>: s8 P3 C+ `& G! G* Z
           <host name='192.18.0.21' port='6789'/>
6 R. i2 H/ ^. \9 b% A           <host name='192.18.0.22' port='6789'/>
' ~! \& o" z' ?6 P      </source>  ^9 v9 J7 Q* F1 v* g) m
      <auth username='kvm-libvirt'>
! J! j! C( p$ Y: W8 p3 ^, H) S# g           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
/ e2 W  a0 d  W, a      </auth>
- O5 q3 q. a: d5 g7 V      <target dev='vdb' bus='virtio'/>) p* n3 j/ i& f* j6 C
    </disk>, U1 @' h1 }0 i( W) S' o$ m
1 K" \2 ?: O' E8 G) k6 E

# e& p& j( \; B6 N3 q  n2 P# |6 L" O' G- B. V
3)启动虚拟机观察硬盘是否添加成功) B& a# w; A- u8 ^; s
  K7 \1 h3 ^, p& H3 U! r
两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。
, O, f# J2 ]1 s4 N9 n9 v( K2 _+ T. |% r$ E6 s
[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
' W& V; c1 t  B! R; B5 _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=01 g8 [. w5 P) _1 a4 _4 T
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
& H' C8 o+ w" h$ \5 \drive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]2 R; l: I: V4 u2 S$ h% l5 r* E8 ]

$ R2 {8 C4 I0 z& v# Q* O[root@kvm ~]# virsh domblklist vs-centos-1 # \  J& V5 ]5 g$ c+ j( B
目标     源& u1 O4 ~8 F) H& `8 X$ x
------------------------------------------------
  n( _3 J# U6 _4 R$ M, Svda        /var/lib/libvirt/images/vs-centos-1.img9 j& J3 i6 a8 g
vdb        kvm-libvirt-pool/vs-centos-1-data.img8 d$ G6 c# ?, G7 z2 e
hda        -! F* I; ~" d$ y1 [7 p8 L! w! M0 I

! Z* t. Q; F& o5 S7 Y  L+ v2.6.虚拟机使用RBD块存储提供的硬盘
( R) h: `7 q; D3 ARBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。
+ J' S9 k2 [( n3 G0 {1 j
  O3 F) F1 r9 u' @+ f  `由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。0 w2 _9 i9 F: V; G0 Z, v
2 N5 e) p+ S0 H) [; n) i1 N
lsblk% f- a" `. P4 ]
mkfs.xfs /dev/vdb/ D8 b% G7 k& t4 s6 k6 O/ v/ I
mkdir /data
6 h2 ~" q! P1 E( Y( m+ Emount /dev/vdb /data7 n/ ~* U0 k/ G
df -hT
7 G, m  }& O* K7 H1 ^' Rcd /data
& |5 m# {8 |9 ]9 o  g5 _4 I, gtouch file{1..5}.txt
3 `5 ?, P2 P! W2 e4 Z2 E* U1 v$ Kll
2 w' e5 Q8 C# N% p
, D1 K8 o0 \* h/ z
- l! @6 u$ ]' ~% F8 I7 o此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。
, `+ X& b/ K1 R9 C8 F3 t; {2 S" J( O) l9 D" ~

5 V8 _2 [+ B" _5 J/ }4 p; G/ k7 `2 a" {' v# Q, R% h
2.7.RBD提供给KVM虚拟机的硬盘扩容方法: Z1 `1 w/ `9 }% a
1)扩容RBD块存储中块设备的空间
# }! S4 u8 h4 a; s/ M- W
- @. p; r7 z! r5 A1 u+ g" }将原来的5G扩容到7G。
7 H7 [" w! M! ^$ N! [  R- h* ^: {5 h4 ~+ ~4 l
[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G- {. }7 j  j2 f% k% H
Image resized.0 \) t! p* s# x8 z9 ]( \
' \7 }1 Y$ C8 {0 h$ ]1 M
2)重启虚拟机
: S2 i3 o) w3 {7 V) d) z
( V; Z& q& R' L6 ?& WKVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。
$ t, H4 W# q6 v7 {' X
7 O, @" j+ n$ d' `* U. L  Z[root@kvm ~]# virsh destroy vs-centos-17 n- S) x& h) L! G# @, n
域 vs-centos-1 被删除4 L" d1 l* L( ^4 I
7 {& q. W+ Z( D. c0 W% f
[root@kvm ~]# virsh start vs-centos-1; c% Q# |& ~( k& ^
域 vs-centos-1 已开始' K5 ?3 \9 V4 e# {) o/ D
* M$ U8 A8 s& a: [: o4 r

7 z/ |5 ^7 z; z; h# y8 n* `$ V3)查看硬盘空间是否生效
: n- I9 k( L/ B7 F  z9 S1 j4 i7 |4 X, e& J$ J( v; i- g* y7 w
磁盘空间已生效。0 o! {) j1 z. `$ _7 @& c( @8 I/ |
& [" ?0 G7 H% Q! M0 u1 G

! C" o' I! T, L2 n& \
; g* U. k% i% {" }, |0 v3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储! f& I" B. y0 S& b7 V  Z
首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。( r2 f" ^. v6 c

9 M4 l5 S7 V  [4 j3.1.将本地的系统盘导入到Ceph集群的RBD中
4 e  I" D. M6 V1 Q  J/ N+ C) }7 }命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}* ^+ f# Z% \$ p$ v6 M! m

  ]' ]& M- h3 s* E[root@kvm ~]# qemu-img convert -f qcow2 /var/lib/libvirt/images/virtual-host.img -O raw rbd:kvm-libvirt-pool/vs-centos-1-sys.img0 p3 L. d1 g( a) q4 n% \; o  c! |
6 q( a& b8 s- f& i: k# H* z
查看导入到RBD块存储的系统盘。
( t) \6 s7 l. z( I% m7 F/ G$ U# @  e
[root@kvm ~]# rbd -p kvm-libvirt-pool ls/ k1 t& ?" M4 G0 P! N  {
vs-centos-1-data.img/ ]+ t% f6 i: B) O
vs-centos-1-sys.img
$ e3 _8 j4 ~% a& o; l# g7 H( \6 u! i! y* U6 w5 l( h! Q
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img  c4 [8 _6 Z3 h1 T# ?6 H
rbd image 'vs-centos-1-sys.img':% ~1 Z, t0 \, K5 P$ ?# e$ ]
        size 10 GiB in 2560 objects
" ~6 p# s* c$ Q/ Z  x        order 22 (4 MiB objects)
5 S+ X8 _& j3 e: d8 b        snapshot_count: 0
. N" \9 p1 `) n        id: 19a5d559f577b' n& v7 o! u. U: p
        block_name_prefix: rbd_data.19a5d559f577b9 A' C. x0 f4 [; C9 C) p/ Q
        format: 2
2 J) O3 w# w3 y* f( L* y        features: layering! A# a0 p6 a; f1 g) t* I  c
        op_features:
( ], _3 x6 p) K+ }/ H% w        flags:
3 x+ W1 m$ O: \8 D6 Q7 e        create_timestamp: Thu Apr 21 13:06:56 2022
: ^) E9 c& B  ^& f2 ?4 k$ S9 N        access_timestamp: Thu Apr 21 13:06:56 2022
( P7 S: g8 |; E) ?) w        modify_timestamp: Thu Apr 21 13:08:58 2022. N1 O4 `% S& X+ ?( u5 \

2 P# [( }2 z% F4 P/ L3.2.修改虚拟机的配置文件调整系统盘的路径* e1 |- ]" e  m: M, z
直接将现有系统盘的配置信息修改成下面的内容。
1 s. `6 H2 Q+ m! c/ ^
+ O+ E6 n  p. @2 g# a5 R: o[root@kvm ~]# virsh edit vs-centos-1
' ^4 U1 H9 o) B# ]/ M    <disk type='network' device='disk'>. H3 P4 L# P+ |9 v& P9 }% B! @# b0 i
      <driver name='qemu'/>9 a$ G2 i: S; O8 `& H' F
      <auth username='kvm-libvirt'>0 D0 O0 n/ w: s9 s
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
9 `8 d$ I* ~* w8 Z      </auth>
# J3 \' _# i* f0 P6 {% U4 g0 Z      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>$ M. r. [% @8 Z8 m& P7 E, v# y
        <host name='192.168.20.20' port='6789'/>: \; ?( n  F, V& T& E3 H8 g& q
        <host name='192.168.20.21' port='6789'/>+ r& h# n) I9 s
        <host name='192.168.20.22' port='6789'/>9 Z& l/ b) ?! Q& B; a4 |$ O
      </source>: c+ G8 C. y$ h* \( H% _* X. L$ t5 |
      <target dev='vda' bus='virtio'/>
5 H* w" V& N% P9 V) R    </disk>
) s9 P2 \  I2 X; K/ U& _8 @$ S8 M: w: B; e- q" l* F$ `* X" H
! \: I1 b/ \# A1 a* M
6 h6 E8 k# \2 c% @7 j3 R+ f1 b
3.3.重启虚拟机+ B9 r* G* @" r5 Z' L' A
[root@kvm ~]# virsh destroy vs-centos-1- Z1 o) t- h  ^, g4 v1 X/ z+ }4 d
域 vs-centos-1 被删除2 S; I  p# v) D; |2 ]7 w

; e0 F; H/ L' j* o; Z5 ~9 f1 e# d[root@kvm ~]# virsh start vs-centos-1
. E/ x  V5 t# g# p域 vs-centos-1 已开始
: \2 i  Z) E4 R) I9 ~7 r- Z. E4 _9 V! S
3.4.验证虚拟机是否可用
. L. Q3 S7 V) O# h1 v. K安全没问题。& w! z5 r* r- m3 G

* t9 b$ J6 j8 s2 j# y+ [
7 K% |1 y" a1 p$ R/ _+ B7 L* _4 z
4.实现类似云平台秒级部署虚拟机  R! s/ Q+ Q8 d$ \& L4 X, q$ @
在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。
" K2 U6 P% u/ M8 i& i" z( J8 R" g: _. }- x- W
秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。: c' J, n- B# s5 i' B) \9 I
5 p) j' \& A, j/ U9 _! S7 i6 j7 Z
如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。& K  Q2 w2 V1 g5 G! q7 S7 _% p
, v& M, P  t! x: a' {
4.1.将现有虚拟机的系统镜像块设备创建一个快照
9 I+ z; X" M  e" j4 W$ {' [4 C将系统盘对应的块设备创建一个快照并设置成保护模式。: Z/ V7 `" N* K$ G# j

( R' ]* _/ |" j& t1 x[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template  n( h  m. d" U0 R+ L& C1 t
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template; Q7 C3 M: R6 }, A: U# s

  p0 g; o5 S) u. A" p3 d/ V4.2.为新虚拟机提供克隆镜像
: n8 q7 Y4 o6 Q; u为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。
( }1 y( r7 H. R! q
; G2 P9 ~2 D- S[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img8 [1 W6 a9 m' \1 d- s
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img
( r: v" m7 ?+ f6 B5 z
4 A  i  G; T1 z1 ~4 E/ C" K3 y6 M% ]2 `0 N; f9 e
4.3.通过虚拟机文件准备多个虚拟机% u! l# B2 }4 `+ b* N( N
KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。
/ [! S8 u% G+ T5 A2 e7 X
8 t7 I, [2 i: O# d: P进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
0 W/ W# z9 x- N- \0 Q* M/ m) K  L+ L. k2 x5 Q1 D: {8 {& f2 O
[root@kvm qemu]# cd /etc/libvirt/qemu/
5 L( d* n6 s( v$ H& C2 _4 s[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml , Y; c2 q6 {1 g3 E4 f) t
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml
; Y& n6 V+ N( f, H: h
1 e  K9 @$ ^$ Z3 t3 l$ U- e) G9 F5 S: z% e
4.4.编辑虚拟机的配置文件- o( C; V- d1 ^) C: S0 o  Y
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。
( r7 p* \  o# X2 c/ u; h; j7 O
; U2 f, z- E  k0 Y6 h7 V" h8 z% r<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>
! }# `4 Q8 s6 k9 g$ \4 y) C) W; H$ P+ p3 [* l
<mac address='52:54:00:eb:f6:97'/>
' H7 e5 Y3 K1 i+ ~
( l) }, d7 R& ]$ \, L1 T2 X# a" i. r<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
0 T# y6 i9 u% z# h8 l3 @1 N2 M( J$ P9 ^/ p2 m) {
4.4.1.vs-centos-1虚拟机的配置文件
3 J8 t; ^9 p7 I. M8 m[root@kvm qemu]# vim clone-vm-1.xml
2 v  I& s: U- ]# T  V. m' x<!--% X) J0 A  d% j* Z9 t
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
' h4 `5 ^) M2 l* N- `8 x( eOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:; @2 ^9 ^1 E9 _& D8 W" h
  virsh edit vs-centos-1
) A& `  l" w! s9 m  hor other application using the libvirt API.
& b/ H: t0 ^7 O-->: Q# j" c9 R0 T, i

* u. j- d  p1 @, F" `% u<domain type='kvm'>
% Q. y$ A6 @. b( m1 p  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->
  K) J: q7 N, |: D. W/ s  <memory unit='KiB'>1048576</memory>
. O3 M- k+ J& ?# o. m  <currentMemory unit='KiB'>1048576</currentMemory>
1 N$ h, c- P* h/ E; b; Z  I  <vcpu placement='static'>1</vcpu>0 H$ W2 B& B/ c0 c4 R: N
  <os>
1 d/ u. b5 X+ M9 p+ A    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>0 Y( a: f. z+ Z4 b1 D, \, q( Z* \
    <boot dev='hd'/>
' I0 Y2 D; [) L+ r$ |, `6 O8 w) `  </os>% E9 ^8 ]! m" j
  <features>
- r! F$ L& w8 s/ w. M- h5 `! X  ^    <acpi/>
, V4 W( C7 i& ~  V) S/ v" z7 A    <apic/>( g$ A  o! C5 h. O$ A$ r
  </features>
0 w8 d) K! p' p9 n& ]  <cpu mode='custom' match='exact' check='partial'>
: V6 f8 y: J/ H/ n  Z    <model fallback='allow'>Nehalem-IBRS</model>1 Q/ J/ Q5 Q5 ^( N2 a
  </cpu>. p9 k( d, O* {2 R; k$ B
  <clock offset='utc'>
; M- }; b; O+ W1 M    <timer name='rtc' tickpolicy='catchup'/>1 z( a" ?6 j3 P/ d% h
    <timer name='pit' tickpolicy='delay'/>4 `* F1 d9 y# u+ C0 x% v& a0 ], \
    <timer name='hpet' present='no'/>: t8 b! @8 t) R8 b" Z( c- [
  </clock>/ C; E) X- o2 Q& Z, Y
  <on_poweroff>destroy</on_poweroff>1 a3 R$ K% e+ z* X
  <on_reboot>restart</on_reboot>9 c7 X2 T1 N3 b7 M
  <on_crash>destroy</on_crash>. V  h/ ?  c3 W
  <pm>8 S. q# n' C* c* O, Y2 O
    <suspend-to-mem enabled='no'/>! v0 w9 C8 a9 j0 g: \; @
    <suspend-to-disk enabled='no'/>, e) Z! s$ N* Q8 h( r8 D
  </pm>" v7 c7 P7 P+ a, B% q" g6 `; P
  <devices>& X" o* a' i5 a  F8 P( u! R8 r9 g  h# V
    <emulator>/usr/libexec/qemu-kvm</emulator>2 a- m* r+ {7 B; `9 ]
    <disk type='network' device='disk'>" F/ i! P' G# V  \  V
      <driver name='qemu'/>
6 g7 f$ u* E, }, {9 o1 O* N- b      <auth username='kvm-libvirt'>- o) S0 J& x) D3 K! e( T
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
9 i; C2 w7 U% p* {      </auth>2 M' c$ J0 K/ F) C) ?
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->
( k" K4 `( Y0 `+ f% t. d        <host name='192.168.20.20' port='6789'/>9 {$ Y2 Q7 q, F% x2 \" o) R
        <host name='192.168.20.21' port='6789'/>
6 @+ J5 r! }& z" o7 q        <host name='192.168.20.22' port='6789'/>
5 I1 A7 e: G( P% l* _' p2 W      </source>
) d& @/ j; G1 t  B% K' u      <target dev='vda' bus='virtio'/>
7 K: P  E, e! t    </disk>
4 E  o. k1 B# @8 }6 F    <disk type='file' device='cdrom'>+ Q* d0 L  }( z
      <driver name='qemu' type='raw'/>1 \8 M2 Z0 l8 g
      <target dev='hda' bus='ide'/>
7 Z1 F( y6 E' l% T/ N2 P      <readonly/>! w/ d8 p9 o( y* F' Y
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>  R# u2 \# f7 P% k
    </disk>
8 q8 p. u( x2 l    <controller type='usb' index='0' model='ich9-ehci1'>6 `% X  A# t  V+ x
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>- a4 G" b% q: r3 ~4 F& `4 Q  r
    </controller>
; J9 P0 O- y& e! L: ^& d/ ^    <controller type='usb' index='0' model='ich9-uhci1'>
8 j1 e; d% @3 d0 T! t+ F$ b. d( N      <master startport='0'/>' k& X& _+ w0 q0 B+ q) V7 a
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>% d4 _7 x% S6 k0 P0 I- S
    </controller>
. l/ A, W# |+ [: p. \6 l; f. Y3 y    <controller type='usb' index='0' model='ich9-uhci2'>7 C8 g; {2 P$ K
      <master startport='2'/>9 K) ~* R! z  L! |7 y
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
/ v) H+ o8 k5 ^    </controller>
7 E. J$ ?& [* i7 {( `) m    <controller type='usb' index='0' model='ich9-uhci3'>
  }( v" r+ @6 p. ~- M0 ]. w      <master startport='4'/>
. Q/ M& \. b9 B- h) B& P6 a      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
0 g2 ^8 x+ h5 z1 o0 N5 s: R/ X    </controller>
& f( l9 p" M" `' z! i5 k5 X    <controller type='pci' index='0' model='pci-root'/>! J* l/ N+ [8 Y2 l
    <controller type='ide' index='0'>; k9 c+ I* `5 `
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>9 w) C) H- c) N1 \3 n4 ?
    </controller>
) ~, a& C1 J! R( ]3 \( |    <controller type='virtio-serial' index='0'>
1 p$ A5 _& Z7 ^. h# O  |* I6 ?' E      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>0 j! t# ?) a2 g. }/ L3 z
    </controller>5 T6 U( {& E+ h8 N  V
    <interface type='network'>
' d: k2 n3 Q  K      <source network='default'/>2 c& i" }$ v, d4 {
      <model type='virtio'/>
* l2 C$ V5 F5 A& F( D: l- o$ D    </interface>
5 X" s: e8 t* j    <serial type='pty'>
- y( q: R9 Y1 T5 _/ L1 _% Q      <target type='isa-serial' port='0'>8 `; w1 G& G8 d7 c) J
        <model name='isa-serial'/>% @% v/ D- n" i
      </target>( I- F' s% I# R
    </serial>4 R* Z' M, [: ?+ h
    <console type='pty'>
; Q% Q1 p& r2 D& Q: B" U1 l      <target type='serial' port='0'/>
4 t2 F+ ~/ W. J& J, H+ u. K: S    </console>; G$ ^! J; ^0 e, w% ~) ~
    <channel type='unix'>% I# x. Y8 \0 c3 g' a0 c5 m
      <target type='virtio' name='org.qemu.guest_agent.0'/>
! g0 _2 R/ b; o" k; C! j* V      <address type='virtio-serial' controller='0' bus='0' port='1'/># ^/ \0 L7 c- e* Z. v; q& s$ L
    </channel># e; O- \2 v3 a& ^, R  u  }
    <input type='tablet' bus='usb'>
/ C, m8 r5 f5 j, l      <address type='usb' bus='0' port='1'/>3 g; X  S1 K" N. [$ ^* e& E
    </input>
1 K' v2 ^( N7 @& R1 ]    <input type='mouse' bus='ps2'/>; u& b- Z& D% |0 B" l1 f. I
    <input type='keyboard' bus='ps2'/>% z' q& L, {: a) K- L
    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->( B, `* D- P; ], O: ?1 h3 S) e# v' q
      <listen type='address' address='0.0.0.0'/>
8 ^) ?* w' n  c! S8 ]" q    </graphics>: K9 Z$ Q! V5 u. m9 F
    <video>
* \; b6 F: U6 G9 ]6 D2 _      <model type='cirrus' vram='16384' heads='1' primary='yes'/># m5 ]/ g# U$ I
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
. k1 c6 P- D; b9 ]    </video>
6 x* p& y/ p2 j. J' Q  \    <memballoon model='virtio'>5 V5 E9 }, Z. ]* s
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/># x: B% }+ ^$ k/ ]  e2 O6 t( i4 m1 u- k/ A
    </memballoon>" a) ^) c# U& D' X1 X6 }
  </devices>9 o$ Z+ Z; z: Y1 F0 n3 d
</domain>$ }% o  k0 b6 v/ Y& h0 ~* T

6 B, p( E4 t' G) F" f7 Y4.4.1.vs-centos-2虚拟机的配置文件
" c' W/ y5 `  [* E! t[root@kvm qemu]# vim clone-vm-2.xml
. f7 I7 J. @3 n  s<!--
! B$ A$ @' f- h' i+ j     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
2 P- E1 R8 F4 k1 l  N5 FOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
' o+ a( q# d* `- F. W; `  virsh edit vs-centos-1
$ `# z, C- {/ m+ {; cor other application using the libvirt API.& ~) }5 r) H$ e
-->
! {" L4 V; Z8 w7 Z9 I+ R
% A) w. M' [. ~3 \0 _6 O<domain type='kvm'>+ S" D' {- r3 T( K8 P
  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->
5 t% {+ Q& U- E" ?  <memory unit='KiB'>1048576</memory>3 \# e  L$ ?* s* D
  <currentMemory unit='KiB'>1048576</currentMemory>3 i( D9 L: g5 ?! C  T2 L/ m
  <vcpu placement='static'>1</vcpu>2 y) ^+ L% `8 A( I8 Z
  <os>
  n& O6 [0 m: i$ D    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>6 Z- h% l2 t0 {' t- k8 P
    <boot dev='hd'/>
, A& i& |, J$ B$ Z6 ~) W  </os>
: Y$ s: Y: @3 h' \  <features>! N# o$ \& v& \
    <acpi/>
9 f, V7 [/ C- R( p7 T$ V" n% o    <apic/>! ?9 ?% P: T, j* ?
  </features>6 d+ q: u$ b& q0 [
  <cpu mode='custom' match='exact' check='partial'>% m. x/ a& C& H* M  Y
    <model fallback='allow'>Nehalem-IBRS</model>) T; I! b# ~' f( W: t+ x
  </cpu>7 n7 g! F1 @2 j' u. j3 x$ c* y+ X
  <clock offset='utc'>
! a- Y( ?2 o# x) _- ?5 Z    <timer name='rtc' tickpolicy='catchup'/>* l1 L9 j# i) ?7 u8 Z0 }
    <timer name='pit' tickpolicy='delay'/>
; ]( f( C3 r% N* S1 Z# g    <timer name='hpet' present='no'/>& @! Z# }: x& f
  </clock>. J% H$ W4 @$ y
  <on_poweroff>destroy</on_poweroff>1 S( c" `. b+ x, x" r& S, F
  <on_reboot>restart</on_reboot>+ U; q0 k( y9 s/ e9 ?2 }
  <on_crash>destroy</on_crash>* ^) G$ ?/ G, q) ~
  <pm>
/ M0 w7 D. D% ?" ^! M    <suspend-to-mem enabled='no'/>
) \  A8 d3 o* |+ S3 v% i% q! R    <suspend-to-disk enabled='no'/>, d& K1 B0 Y9 I
  </pm>
3 Z" V+ w; O1 B2 D  \  <devices>
! Q+ n: v0 b6 F    <emulator>/usr/libexec/qemu-kvm</emulator>
& d( R& _; }2 U0 \$ [: z6 I  q% M    <disk type='network' device='disk'>
# I, A) [/ E$ b1 f& `      <driver name='qemu'/>2 P% N& J3 Q# ?6 o( C" W
      <auth username='kvm-libvirt'>3 d3 r2 F9 r: M6 Y
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>- |# q1 f7 X# c4 `5 {1 y" N
      </auth>
" e7 i1 }4 A3 @0 Q0 h      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径-->
! N$ n+ S& p6 m; Z6 a        <host name='192.168.20.20' port='6789'/>
$ a  Z# A% j" y0 D, \0 L- @        <host name='192.168.20.21' port='6789'/>- i6 B5 ^: a3 C1 I% Y( S
        <host name='192.168.20.22' port='6789'/>7 N( @6 J+ ~$ y$ `6 I
      </source>
, R4 L, m( [2 E  l' C2 @      <target dev='vda' bus='virtio'/>
& s* }0 N& S  b: o6 u8 G# D* r    </disk>& c7 T" @/ F8 p6 D0 b& E
    <disk type='file' device='cdrom'>
7 y* k# m/ J# b( a6 u      <driver name='qemu' type='raw'/>' F, k( R3 ~  C* c( d$ [0 L
      <target dev='hda' bus='ide'/>7 }/ S& g5 Q# Z4 {
      <readonly/># z+ x+ `; T4 [7 K- r* f9 }
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>( I4 l+ Z: _5 U0 O2 G+ \2 [; y3 z; [
    </disk>8 W9 x: W9 k2 }. `) O- E. M3 b0 S; F1 ~
    <controller type='usb' index='0' model='ich9-ehci1'>
+ X. t' b/ b/ |      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
1 Q& @1 |9 Z, J2 E: ~    </controller>
2 s. V2 l. t1 u5 j    <controller type='usb' index='0' model='ich9-uhci1'>; Q* ?$ C% j4 `& n
      <master startport='0'/>
, a% |* I9 I: S* ~      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
0 P, S" u, C) J. G    </controller>
7 W' {5 ~; o, g1 N- Z9 p( S    <controller type='usb' index='0' model='ich9-uhci2'>
8 s! h8 {7 U- M$ b/ ~2 R      <master startport='2'/>3 K1 W4 i' ^7 d1 L- k- Z
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>" ~; \! H: `! K: @* X/ E* L
    </controller>
, F- p. d5 \4 L4 ^! r    <controller type='usb' index='0' model='ich9-uhci3'>2 Z- M" ]1 k5 b2 {" A& u
      <master startport='4'/>) }) j1 f* z* D& s+ _  R! N6 l
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/># ]" t4 K3 c) P9 {# [0 R1 s5 s
    </controller>) j+ c" B9 c; A: f
    <controller type='pci' index='0' model='pci-root'/>7 I7 h/ y* Y0 _: P, x3 L& w
    <controller type='ide' index='0'>! r/ {- v# M6 @: A# t0 T3 |. U
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
' E" {4 b7 i/ T: @    </controller>; u: p$ ^* O$ S
    <controller type='virtio-serial' index='0'>
9 Z% C; c) L* z2 m  r2 ^8 G      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>! X) o: E+ m6 _
    </controller>" s0 L9 U( `) L; U) B1 l
    <interface type='network'>& Q) M+ W/ S& D* ?
      <source network='default'/>
6 m! P3 R" {; `* U+ z7 B' j2 M      <model type='virtio'/>7 D# }1 G+ }2 a3 j; {
    </interface>" D' J3 w9 {: W* z- s
    <serial type='pty'>
% R% B! C% {# X2 E      <target type='isa-serial' port='0'>
, ^8 \" b# L' E. T: I7 R$ i, k' t        <model name='isa-serial'/>9 e3 B2 N5 ^' \& d' o
      </target>
) H+ x0 v. e$ C" o. K6 G  {3 X    </serial>% ~& x0 G! Q) h! x4 d7 C( j' ^
    <console type='pty'>
" ~4 Q7 }" M# F1 c4 V9 y      <target type='serial' port='0'/>
8 h# v' e0 {9 }2 c. \- o    </console>
  V1 |( c/ J. o, A    <channel type='unix'>, L$ W! H7 y7 `" x
      <target type='virtio' name='org.qemu.guest_agent.0'/>
4 N) T# n# d0 w. P+ m. f      <address type='virtio-serial' controller='0' bus='0' port='1'/>
2 V4 ~8 |$ ^& z    </channel>1 X& C- l& }9 k" Z- k
    <input type='tablet' bus='usb'>/ |$ k) P$ `: Y0 V+ H  k) W
      <address type='usb' bus='0' port='1'/>
& M. E- g0 ~8 f" h    </input>
! s2 W1 K- k2 b+ q4 y  q    <input type='mouse' bus='ps2'/># c4 H& W2 t  r
    <input type='keyboard' bus='ps2'/>' }: k' d; j5 e; U9 }; U
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号--># [2 }- x. v$ B( s6 D6 J' D5 L
      <listen type='address' address='0.0.0.0'/>! g1 g1 i% @6 }7 m
    </graphics>
  v6 z/ Z( k) g1 W  q0 j    <video>
$ h7 q0 Y/ R2 z$ N: ]7 I      <model type='cirrus' vram='16384' heads='1' primary='yes'/>' A( E) m7 x3 U
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
7 O; X) S4 [( l1 Y6 X$ l( I* T: O    </video>
  m/ b' A4 ?% v9 \/ f8 s, u6 I    <memballoon model='virtio'>3 m/ b4 Y& Y7 E( C$ h: S
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>1 t, p+ f1 j9 W& I( A
    </memballoon>$ J2 L* g" m- v% D) j! \; c( S
  </devices>
' r" j9 {. K! q+ Z& H</domain>& |8 M9 ]( ^3 m0 ^/ A! g; R3 @! i

9 N. s0 l$ w( V' m7 \$ G0 k3 p
! z7 ?$ k- B  p/ L0 m8 L  \. {1 K. A4.5.将虚拟机配置文件导入到虚拟化平台
3 _4 t7 W- V) [0 l$ P' ?( t. q[root@kvm qemu]# virsh define clone-vm-1.xml $ f. J% T# A- i4 T: w4 s
定义域 clone-vm-1(从 clone-vm-1.xml)
: N% `6 O1 C) s! T! F2 K* Y' [+ Z" ?( Z, K, }2 \8 l
[root@kvm qemu]# virsh define clone-vm-2.xml
( [( h6 L: M8 J5 ]定义域 clone-vm-2(从 clone-vm-2.xml), ^) b# M  S" `6 L: p% n6 \

- q7 k! U5 f. m1 i, R/ G$ M7 z: e3 C- }: z  i0 ^, z1 L* Q' \
导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。
. V) U* b& G' e+ n2 Y+ ]# D/ e7 E- v5 w
[root@kvm qemu]# virsh list  --all/ l  T# g2 E9 I
Id    名称                         状态- g3 a  }9 C3 _
----------------------------------------------------' o) B+ U. o/ p- N. z
7     vs-centos-1                    running& X2 K/ T; s- O2 n' w2 O, Z0 K
-     clone-vm-1                     关闭; M3 k4 @+ z$ v& g: A2 g" Q
-     clone-vm-2                     关闭
, }9 p2 ^4 D- R: N1 a( s
/ a) s) z) r* L: p' k4.6.启动虚拟机验证是否能够秒级使用
6 k0 T" O; y( B$ H& A[root@kvm qemu]# virsh start  clone-vm-1/ h: i3 O/ X. D1 f. Q5 N  w
域 clone-vm-1 已开始- S: P7 z* i2 B3 R4 q6 j
0 L2 e' ~$ f: U4 p" L# B+ ^
[root@kvm qemu]# virsh start  clone-vm-2
! D8 K5 `) J: P/ j3 k& Y8 N; G域 clone-vm-2 已开始
2 G' V3 ?* D7 }/ G6 b4 U
  P2 m$ C+ v8 u  W# s
5 E1 r7 T* F$ {9 O7 ^( a待后期更新。% [3 s8 ^9 C2 {+ z3 B7 v' `" j6 y
  J. g3 w4 m# X
! ?8 N: o* N. l4 J9 k
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通
3 B  C% ^# F- ^  ~# K% ^2 a8 }
; U! N8 |, \7 a, z1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)
: _. X: k/ Q/ M% ?6 O& s/ @* s* @8 a) r# i2 z* }
2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下+ Q) o1 T/ @4 t/ e

1 O. T7 W( c& N2 [* A( ?7 S; C9 N3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通1 c8 F5 [! b/ b, t; X2 ?% ]
3 P% f5 X; j" }, Q; [- T
二、创建rbd盘并挂载给虚拟机7 s  j% Q8 x% l5 i1 p* e
! _/ p' H% U+ e
1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池) j9 O( G5 g6 R' n* t# U

0 n( L* z. h. Z* O4 a, j6 Wceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'
  \! I, P7 p1 C2 k* h& o8 t  r3 v* }9 x- F' V
验证有效:ceph auth ls|grep client.libvirt
' |2 @1 E9 ?& K6 T1 R! i' d! i# c1 ]  T' W, d9 S2 N

2 F# a! N5 J. {6 E- v# [& p5 C/ ^* A( r8 ~+ g
备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行
1 K3 S0 B' J/ j( a  M  b7 Q
3 p" _6 Q7 r/ n/ X2.创建secret.xml
( c4 S# n$ v% {0 C7 U- v# B5 {, F/ @8 n6 ]  c
cat > secret.xml <<EOF
# D0 ^) O- \: x( ?- f6 Y3 `$ @, W6 O
<secret ephemeral='no' private='no'>" M& s/ ?# J; W
4 J) @- G# I: E, j: D  D; q
        <usage type='ceph'>
% D4 v. g; p2 @6 w
* x4 s7 u; J( M( w9 j# A% e                <name>client.libvirt secret</name>
% t$ X3 n  m& ?2 F# ]2 A/ p# B5 E: D6 f+ b7 D" n+ H
        </usage>* Y- p, b9 k. z- `0 ^- y9 W3 s  D# ?! d# o

+ @1 I& r, m! W2 g" O) [& a</secret>
) }- B- l1 X7 x: s  y- i8 b
" t+ z) H$ s7 l; A  xEOF5 }- s" {2 g0 D7 I9 K8 N2 N! `
! g1 ~2 K+ {  Q1 a/ r
备注:以上命令在宿主机上全部复制并粘贴,最后回车4 o% x) J# Z5 F( F
) J8 N2 ]) B; W8 ]8 ~5 B
3.生成uuid2 L/ B7 c% l3 W& _( |
+ P: Z( W9 V- @
sudo virsh secret-define --file secret.xml
' p/ b4 K) V# I" L
: u) q$ @2 }& b% n. ~6 Z. ~9 Y{uuid of secret}
; t8 f4 N6 {4 ?0 \  [$ c0 C# q" O5 q: Y1 U( d( p0 J7 c1 v. N
4.获取client.libvirt的key并保存到文件
) }0 N4 S. x; a6 ~! p5 O! \: Q
+ Y0 |- y) X7 cceph auth get-key client.libvirt | sudo tee client.libvirt.key
2 M2 P3 ^6 Y, `9 g$ {) R1 C+ _! N+ u  E' J7 r3 y9 y
5、设置secret的uuid
( ]' z6 H0 s: n3 A) b) X6 |$ J( n7 H( C. j+ d3 t, g, \/ |+ i7 c/ ~; P
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml; ]2 s% i4 ?; V( |$ I
, \. T5 B4 d' f2 U+ `2 E
将变量替换成实际的uuid和key- }( |* F, h9 h4 V

" v0 j5 Y' J8 X# s. |# K+ |8 p" G6、创建池libvirt-pool- t; O* D, L/ c# u

- @9 ]+ l0 _( e4 f! Qceph osd pool create libvirt-pool 64 64
8 r1 v5 d8 d3 h# a8 o' l( T1 \& g3 ^# J$ K8 D4 {, i% E
7、创建rbd盘6 n& o2 B& d5 [+ }
. C7 q. |( K* q3 \; ]. u" R" l5 y
rbd create --size 10G libvirt-pool/test1 --image-feature layering
% J& _7 W2 }: O' J4 a9 B
- b# n: g+ l. T6 W- _! J: i7 p查询存储池中的块:rbd ls libvirt-pool
7 V. g) v% G( X& I8 _
2 s3 N7 o! s# F: K& D7 t0 t9 A8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息7 [: X( L8 V; E+ H/ O( F+ z

7 ^+ X: C1 X2 _* r% b1 H* O, m. h% [关闭虚拟机:virsh shutdown vm
$ ?6 c8 c1 J% r' ]( ]# c7 S6 T' x! [( Q& Y( j0 G6 P
编辑虚拟机:virsh edit vm) L' h! e$ V5 i$ ?, b) T

/ [+ s- F% l9 f, e; V+ T在disk标签下增加如下信息:
8 l3 g5 F$ d$ P% P. S/ R
8 D; y" y; r1 h<disk type='network' device='disk'>
% B& d5 d+ Q6 z" [# H8 G; `3 _3 ~0 t8 b6 \" O1 j
      <driver name='qemu' type='raw'/>
# V5 B, D; X" o( e4 j' h, ?  T6 x0 t. Y; h8 L; Z7 k
      <auth username='libvirt'>
, ~) B* Z: `2 }, P
) e( X) n7 i# e5 M        <secret type='ceph' uuid='{uuid of secret}'/>- ?' w- q! m) n' U
5 m! G: K0 u  e( x6 U& s
      </auth>
9 f% G6 H1 N1 Z5 D9 \( B8 m
& _# c, c" @1 `3 @& h  m6 @0 S      <source protocol='rbd' name='libvirt-pool/rbd_name'>
: [+ c0 Z7 _, l9 _
# q6 j) }; i7 }/ ~( L1 l7 K        <host name='10.25.72.142' port='6789'/>3 q: {& G0 f. H* ?4 V5 f; ]
6 b: k! u6 m7 Y7 D" D; ~' k( P  x
        <host name='10.25.72.143' port='6789'/>
8 y! c+ b& Y" r5 s% G+ ^- |7 C0 N* r' B. x+ l7 J" O3 x
        <host name='10.25.72.144' port='6789'/>
. Q, R- g) i' c( U" U$ ]+ U; h8 u0 r) w) h1 H! V% }
      </source>4 q- y- H2 ^; p) i4 Z9 R  B

, d* l4 S$ R7 F3 Q. K) F  F8 ], t' N      <target dev='vde' bus='virtio'/>+ B  u3 T" _: f/ |

4 d3 |3 ?% x: s1 e    </disk>3 I* h9 M. t/ n9 X$ `; d

* B1 _3 y! s! ]/ h% F备注:
9 W0 Y: Z+ p( L1 B' U; ^
  j( D) f4 [4 t9 u1 d需要修改上面5个参数:+ V2 I4 j3 ^7 b7 ^& q, w! \+ p

: z; i0 W; T* i/ T$ ^1)username是建好的用户名:libvirt
2 n! _- C" t" @- @' Y9 U6 m5 y& @9 [4 H' C
2)uuid替换成第3步生成的uuid
7 ~+ p+ U) F4 V$ G( [5 q  q
" b, U% e  {7 r- M, G3)host name后的ip为mon的ip和端口
0 W1 ^9 U, m' t. t' F: x/ l  ^( e, `* L
2 @. C. i) c2 h# r: W0 }9 d! Vmon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip8 |! B: |& j) Z3 \# o7 C* Z! `

$ V6 e( L1 \! v& S( t& F6 I/ y; r1 y: T, Y; u3 f

5 h, Y# n) i4 S: H5 \9 ?/ G9 B4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde
0 m% q9 K" U/ R4 Q: J7 _. ~' J* Z. T! v/ P$ [* n
5)libvirt-pool/rbd_name是创建的rbd盘
2 ?" C( e' i/ A6 W6 H( A7 u" Y, _: |/ N
9、查看虚拟机挂载的磁盘
" G$ d) _, N! j( v. o3 [' Z* g6 w3 a. x/ e& e4 X
virsh domblklist {vm-domain-name} --details+ H; k- A/ L  ?! f4 G; b& P
3 a! [( |  G7 I0 S) F- Z0 B2 _
10、虚机开机,即可使用挂载的rbd盘3 v! M9 D1 V3 h. g* c! I

$ `2 p5 T* \- L. K  nvirsh start vm
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-9 01:11 , Processed in 0.068203 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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