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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-19 17:00:04 | 显示全部楼层 |阅读模式
1.KVM的Qemu与Ceph RBD块存储进行对接1 Z/ m9 f5 y& {% p' S) f
1.1.Qemu与RBD块存储对接的架构图* Z# t, q: x" a8 L* h- M" [% ]9 v
Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。# D% p" ?1 P4 X9 L0 M- H  ^! M

  M& F3 j* N' o* w5 V) U7 pQemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。
2 Y" S& [  D: O/ B0 I
. u# }! a/ J* w& `6 y, CQemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。% B- Y8 ^& H0 F7 |1 Y9 e

/ f! }8 m5 N% S5 N, w/ y& l3 w. b9 C

# p# Q& {, E7 M! x. \  D9 hQemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。
* g/ k& [% _& ^# ]  Q5 {3 B7 n
% ^  n8 I. |$ h" I" e( q官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/$ W2 J' j5 _/ ^1 c0 A$ N0 I/ v

4 V# x+ M3 L( d5 n1.2.配置KVM服务器连接Ceph集群; \* p. K# S7 K9 h; s9 i8 J" `
Qemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。* A! i6 A* @# ]' T3 T8 x4 ]% x- s

) B% S( {$ H1 F$ S" e/ F# N/ }# H4 ~1.安装ceph相关命令" \3 p( t* l. R) w; R9 t' A4 G
[root@kvm ~]# yum -y install ceph-common5 y$ H1 x" I' Z2 g8 ?& P: L
. O( Q. d2 _. c* q+ d6 K! _7 O
2.拷贝ceph的配置文件/ Q6 `) M; N3 j" Q' ?* u
[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/
  ]% O$ f0 v* a6 S
8 e2 `7 ]9 n4 v% k3.查看集群的状态2 K# ?5 t: _) @" w& o
[root@kvm ~]# ceph -s) T1 g: w' \8 v
    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0
8 C: f' q' [: n  G     health HEALTH_OK  t& I- i2 @4 B; @7 b) a; a
     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}, `+ `9 J$ z6 D
            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
7 H/ t: g4 Y1 s3 j     osdmap e29566: 131 osds: 128 up, 128 in6 ~7 A7 p5 J; w$ q  J9 t2 d4 [
            flags sortbitwise,require_jewel_osds1 h4 C# b! \; m& H+ e
      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects
5 ^5 q; |, F$ O! T            291 TB used, 174 TB / 465 TB avail- x0 y* ?: A; \! F( Q8 A5 [
               10234 active+clean
+ E% ]  Q) Q( d  u1 q7 c                   5 active+clean+scrubbing+deep
  K, I( [# G5 j8 H7 N; Q+ g                   1 active+clean+scrubbing
3 W% B/ d; D9 @5 P6 [" y& y- V3 A6 _8 O
1.3.在Ceph集群中为KVM创建一个资源池
& J4 z: K( @* ^7 `[root@kvm ~]# ceph osd pool create kvm_rbd 32 32
. }5 X' A/ E) Gpool 'kvm_rbd' created4 T5 c* k2 I5 [) R

$ q! z* `  n; w$ c1.4.使用Qemu在RBD块存储中创建卷* p! w7 g% C6 k0 o# o! ~  t: l
1)在RBD中创建卷
% p. \4 k, [* }/ Y: a$ h
9 v. M+ P, J6 S& U& h命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小
. t  ^- b8 l$ l- b7 e( H1 O, z1 d! V
[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G
1 Q+ G( y  g% hFormatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0
9 V; B& |8 {$ r  c' m6 s; E" H% ^; U4 R5 t+ i

/ |( ]' S7 f0 R9 I2)查看创建的Qemu卷
8 d; D1 _" }4 L8 _* S2 H: e. D+ @) ^& X3 [% i/ @5 N
[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img
. \' |4 p! A& K1 D1 v( x0 b6 a4 ?image: rbd:kvm_rbd/vs-centos7.img1 A. j  F" \" h  s  H- Z
file format: raw
- B) d' |. Q2 E' O3 @virtual size: 500.0G (536870912000 bytes)( \8 s3 z8 F* E& s) {# f. h" t" {
disk size: unavailable
1 C. Z% X3 [3 W  X1 C# w& M! j
, Q2 E: `5 w9 n/ h- L6 u这个卷其实就是资源池中创建的一个块设备。! {! G. i# a" Z( E; B
( R( M4 O" l" g4 n& R% u
[root@kvm ~]# rbd -p kvm_rbd ls
5 s5 a; i( A& F2 p% a* _9 tvs-centos7.img
8 P. B. I- h- r% f3 e; Q& Y0 \" u8 K( w
# r! X& w5 a& B[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
( h* @2 x7 s/ d9 [0 o2 S/ N0 Nrbd image 'vs-centos7.img':
7 J) K* w5 `+ v* W* H. g/ m4 p3 p        size 500 GiB in 1280 objects
  x3 ]" v, b7 O' d: i        order 22 (4 MiB objects)# x" Z8 M! r2 B
        snapshot_count: 0
2 |) F6 Y( g! J8 X7 o/ R        id: 19a9415778427
0 b' H  t. L6 ]/ R8 d* K8 k        block_name_prefix: rbd_data.19a9415778427, C# b& q3 r% f: _. z4 \
        format: 2
, Y) i9 E5 z+ I" w5 F3 x        features: layering+ s  p: Z) ?/ q9 k2 x
        op_features: $ r- ?& [$ l  Y; J: I$ a6 O) o
        flags: 5 _$ a  \2 W; m% g( D( G
        create_timestamp: Wed Apr 20 22:14:33 2022
: a* S6 u. q* _        access_timestamp: Wed Apr 20 22:16:43 2022
  t! h- W$ H1 @- Q        modify_timestamp: Wed Apr 20 22:14:33 2022
: Z1 o8 T8 Z8 ~/ A2 c$ j6 C/ ~3 {* I# ^/ G, d6 M( C) `
1.5.扩容卷的空间4 C2 ~" Y: ]8 E3 |
[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G# H+ g+ ?  u! \% H, S5 ~& v
Image resized
! f% ^$ J& @8 \9 L
, r5 M9 _) v6 ?$ e6 s) z) [/ u' u2.Libvirt使用Qemu为KVM虚拟机提供存储
) O# Q1 i* }* Q7 k* ZQemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。4 W6 U9 R( l" M8 B
7 ?6 c* v& ]! s% }
官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/0 ^; y- t4 m/ r* c3 S9 L

- O1 Y6 [. b4 l7 t
) X3 J+ p- K' I9 v: N! P$ U
  b+ U/ r/ h, _9 _KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。
: o, d. `; p! Q! H6 d8 ?& _" l6 f
大致实现步骤:
3 `1 P) g$ [9 j0 |$ c3 y, _1 }  w
% S  S/ R, t" U1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。* m6 T3 t3 `" d* B) c, {1 w( V

3 }- Z  p4 Z$ E% l  i! W* X2)创建一个用户用于Libvirt访问Ceph集群的块设备。
! W5 K: ]6 n& t5 t( f# @: X4 Y3 z' R5 {$ ]
3)创建一个Qemu存储卷。7 g1 Q1 j. O5 u& D  H+ _; M7 x

) A' W7 `7 I% }$ v4 ?4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。
! Q2 P+ [) o/ l8 X: f1 {9 d- z" X' F4 i: o# t5 n& t
5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
' N3 X9 O! @# Y/ N* w2 T4 t1 K; c. m3 [) E0 b; q% O
其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。# j) G( |* M2 t, P/ K7 X- ]0 d

% S( F: J, g, U- O$ I2.1.在Ceph集群中创建资源池
) \. `3 ^! A: N+ Z1.创建资源池2 Z) x% s) j/ g% x
[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
: m' z2 X' _" o9 k) f) M9 Spool 'kvm-libvirt-pool' created8 t; a$ X0 j( B2 s0 B5 H6 x& b! L
6 K' d6 Z% |; h" t& I3 E" n
2.将资源池初始化成RBD类型, ]! {) Y! O" d, M% O
[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool2 b% z* \, J0 H' l8 z; V3 C& N8 J% N
/ \2 M( d! w  K$ l! x
2.2.创建用于KVM访问RBD块存储的用户) n1 B" _; b/ ]
[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'  N$ O- N! X5 p) [# d+ i2 z
[client.kvm-libvirt]; _7 c( R, g3 R! ^1 [0 s
        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==' @5 A; h4 J  y: d8 S5 o% S
  M; G" q0 o" @! \& ^2 I& }
2.3.创建Qemu卷1 W& E! z3 {7 @; @. g
[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G
  G0 e" D) m5 A$ N0 K0 X' hFormatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0
% J+ J% Y: C5 F- e( X9 j5 O$ Z
, T' x( e1 f4 j' y[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img, L4 f; p) ^) v5 b
image: rbd:kvm-libvirt-pool/vs-centos-1-data.img
9 z0 g, k" I! N: Bfile format: raw; f+ [- c8 t& Z( P' c3 H* O
virtual size: 500.0G (536870912000 bytes)7 y. ]) o4 Y: ^, w, Y' y0 h. D& c3 a- a
disk size: unavailable% E5 c% h! I% {' L: T1 k

, }( W8 h' R& ~" B2.4.将Ceph的认证用户写入到KVM的Secret中  ~- ^$ k7 t+ [, R
首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。+ ]* O7 r! b% D4 A

+ Q( [- p- S$ L9 V" q9 F. l2 u. R用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。
: F2 [" B, R# F! l  }" C8 Z; H7 q) \8 A$ W3 q5 r7 ?
1.编写带有认证用户名称的xml
4 u* b8 O( b1 w* j9 `$ v[root@kvm ~]# cat secret.xml
( V% p9 E! ]# v5 Z; n  Y% B<secret ephemeral='no' private='no'>/ y9 E# o5 P' a% S1 H$ {3 n2 g% D
        <usage type='ceph'>
3 ^$ n: b' e! \                <name>client.kvm-libvirt secret</name>2 {- |! {5 y; V. J4 Y, m
        </usage>' B; `6 h: d( a: i
</secret>
+ I  Z: p2 A+ t8 T8 ]! M#name中就是认证用户的名称
$ Z7 I. T5 {, `
6 {: c( Q$ B9 R3 W8 @0 p2.将认证用户的xml文件导入到KVM中生成一个Secret! {5 U9 d4 A0 M2 j4 \% p* F/ [
[root@kvm ~]# virsh secret-define --file secret.xml , ^( [* P# G( T# H1 n5 Z, t
生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
& F6 D; d: ^* v# |$ P( f; p
: o- y9 a  t* }! E# N3.将认证用户的Key写入到Secret中  M9 W% I' u/ j7 S: S3 x
[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==, ^' z  h) e, g- U- v1 A7 w
secret 值设定
2 t8 d) o6 m3 f; _9 Z/ G; E. ]#--secret:secret的uuid9 @+ G. u& m2 ]7 d) F
#--base64:用户的key5 n% f- K3 Y4 x

1 s7 s7 ]4 f/ S5 C1 N6 @: l4.查看生成的Secret信息
4 A! K% W- M/ l/ Q: G2 D  a[root@kvm ~]# virsh secret-list 6 d. @+ m# K3 F4 |$ V+ X
UUID                                  用量
  A8 Q& J& }8 l# ?# s--------------------------------------------------------------------------------7 p( r2 G/ L0 h, M3 M6 W/ d" x2 @
66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret
+ A8 y5 I1 m" S) K7 _* ]9 h[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82# \: q' I! P' G$ I0 `2 h9 ]
<secret ephemeral='no' private='no'>" f7 p" Q6 }/ |2 ]
  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>
$ i& a- S- _8 {  <usage type='ceph'>
9 L$ m8 i, G& W/ U    <name>client.kvm-libvirt secret</name>
, M7 v& B/ o  O3 `* ]( _  </usage>0 c9 M. T6 A9 A& }9 E/ q! p
</secret>
0 F/ A& j7 \  Z+ u* r4 P
2 W4 m' D& F" F2.5.在虚拟机中应用RBD块存储中创建的块设备
- {; h: b) ^. Z" \# _7 w需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。$ J3 z1 v8 u( [. p3 I) I, X& a6 |

8 S; C4 [8 s8 @1)先停止运行虚拟机  `; H& ?) R! U3 T" B! X- ^$ w

# `  Z+ L# B# [5 _$ Q虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。7 z' C# j2 z  A& K$ }
# {- U. q( v7 r# D) |# G
[root@kvm ~]# virsh destroy vs-centos-1
6 ]8 M5 m# X8 b! V7 }( j, x; E域 vs-centos-1 被删除
! G# N1 Y# X% J- }9 R2 M! z1 Z" q
8 x% F0 {, y/ F  j7 t6 h2)调整虚拟机的配置文件增加硬盘" l! v- U5 c4 j, J2 b

5 ^+ }. E' V4 ?在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。4 \* R6 f; o" x9 c+ I
% L4 `; ^6 R9 S0 t" y9 X8 l" f5 g
在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。
; Y+ p$ o2 F9 e5 K4 i& d9 p7 z/ l0 j9 F8 {4 H
在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。# b( a0 K$ Z( m
" i/ {7 c$ w* T4 P) q& s7 k% A
[root@kvm ~]# virsh edit vs-centos-1 1 O1 |6 T1 H* o; y, ?
    <disk type='network' device='disk'>
+ H# ]/ y& D7 ~      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
7 N; I! p7 A# K, g( X. q0 B           <host name='192.18.0.20' port='6789'/>: I; X' g* p3 E" c+ j
           <host name='192.18.0.21' port='6789'/>' y7 l3 w9 ~; H: ^3 z; K; ~; P
           <host name='192.18.0.22' port='6789'/>( g# [) l. U/ G7 _  f. ?# S
      </source>
( q1 z+ m  H6 I# m1 ^+ L& u      <auth username='kvm-libvirt'>
" |- h8 {' i$ x' @0 p2 D# {; w( b           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
$ l6 B- w7 T1 u      </auth>4 G2 b; N( m* P( Q, e$ ?. e
      <target dev='vdb' bus='virtio'/>
+ J' `4 z. R2 H    </disk>& J  r; F. y  C2 N
9 [4 {: A# n9 b1 j& C- {  A. L

2 }8 e5 k8 s: m
4 g4 W9 W1 Q6 B! [" I3)启动虚拟机观察硬盘是否添加成功2 s! Y% h3 W0 _# L8 |0 Z" P: ^6 T
9 J5 }3 W! f5 v" U% p& j' L
两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。
  @! `( a0 T. S1 o; f! m/ W8 ?. x5 m; s, [  M& G
[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'1 a. j* s4 [+ h1 Z
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" L, P; _6 x, R4 }3 ~
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
  [! j) j; r6 H" jdrive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
% {; \0 ]. \* w. C+ E
# X* `- C' F' G$ _[root@kvm ~]# virsh domblklist vs-centos-1
& r1 `7 m* w4 l; J; i, l; T目标     源
0 i+ v) x+ `& N, v! g! O------------------------------------------------
: m4 ]* M/ H1 R! Q0 m. Dvda        /var/lib/libvirt/images/vs-centos-1.img
; {  w) }0 Y1 X6 Svdb        kvm-libvirt-pool/vs-centos-1-data.img1 N6 s- q2 E# C  g$ L2 P, O6 v5 J
hda        -; g$ X! \2 o- F9 k/ }

  v6 u9 R" W3 ^2 P2.6.虚拟机使用RBD块存储提供的硬盘
/ X1 A/ C5 s' r4 x3 LRBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。
$ z& G/ \0 ]2 a7 q0 v1 z+ ^3 C9 j9 Z1 f( j5 l
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。: R$ d, y' ^3 f0 F! r/ Z$ j8 {# a
& @9 y- B. F- y6 F( ?* m' P3 C; D
lsblk
* s4 e% k0 ?7 L1 s$ I  N& N6 @mkfs.xfs /dev/vdb3 }  q4 s% L! w' Y$ R
mkdir /data: Y: O) b0 R' [4 X1 V5 P
mount /dev/vdb /data: B1 b- O3 T# S! Z8 y
df -hT- ]/ Q6 Y5 @& z& `' o# S
cd /data
6 d( s* @6 Y8 M4 A9 mtouch file{1..5}.txt& L4 s' C6 V4 C% B( y# s3 ]
ll
3 J% b1 P8 N0 g& i! T- d; \8 }- a8 K6 T% q) z

# y: C  Z2 J% p9 I此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。
4 t) z% d7 z0 Q1 ~  |/ Y) q2 ?% S$ W# |" U- h" @
+ P3 i2 {2 X6 T: S4 r

0 m/ b1 q$ p8 f3 a2.7.RBD提供给KVM虚拟机的硬盘扩容方法" I% l( y4 t5 O2 k' g+ Y
1)扩容RBD块存储中块设备的空间: e, y* |( r4 X

" i$ Y( l( h; B8 d将原来的5G扩容到7G。: D; l$ l3 Q2 q0 U# y3 Y

& ]" T0 x( ~$ E[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G* j: M" @) H/ T9 z2 Y) G/ Z& ~
Image resized.
  o. |$ K& N7 h2 z$ M/ K$ Z0 q+ o  p
2)重启虚拟机; h5 g0 U# l8 e1 j

( ?" O# v6 j! D1 `KVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。. |4 F9 q, b( z$ J

! X9 J  F% m! n" w: ?1 k. ]( X[root@kvm ~]# virsh destroy vs-centos-1
3 X; @7 h- g9 @; A! Z: O/ B, f域 vs-centos-1 被删除. ]  o9 V5 F5 Z# }' J8 {1 R
/ }2 F7 o1 g% K" T* J3 T+ x" Y
[root@kvm ~]# virsh start vs-centos-16 I; d8 y3 l2 K( M* |
域 vs-centos-1 已开始
& K1 m: g3 _% k: X" K; o/ h
) \; C* J, H& E- S, N3 E7 m5 j8 S! E5 j, o% k# J9 Q
3)查看硬盘空间是否生效
$ l' i& ^. P; {" Q. @
- l' t& _$ A! s/ h$ `, E: g4 m+ P磁盘空间已生效。0 s6 |" O7 e% _8 e! i
6 o( u+ s1 F7 {7 z7 ~! z8 S( j
! R* x5 j1 {& U+ E
$ \6 X6 K# |: ^2 w& w" F" Y/ _
3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储
, s7 q- Q2 b- T5 Y0 a3 N  z- P首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。
( x/ ?* S: K1 d& H6 K# w3 o" E$ j
9 ^3 H, z! {8 ]& v$ D# h/ A3.1.将本地的系统盘导入到Ceph集群的RBD中
" \. x3 ]* ~9 |; ^) U( S$ _命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}
9 h8 Z8 ?. ~3 \$ D8 L3 r$ ?
9 K. b7 F/ Q- _6 `[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
6 b( s' y5 O# U5 h4 t; x, ~
0 h8 `7 ?9 K& V- m8 y查看导入到RBD块存储的系统盘。
$ z% a! y- `, U4 o1 q7 s! W# E2 K* s. V# ~
[root@kvm ~]# rbd -p kvm-libvirt-pool ls$ J0 M, Z  M3 A! e6 p4 S0 R
vs-centos-1-data.img! ^# C" D  \5 v% z. t7 F
vs-centos-1-sys.img2 t% E. ~! b5 u. [
0 }5 q$ `. j  R2 m% s8 L
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img9 u+ v8 |' f  f7 \/ ?7 W, e
rbd image 'vs-centos-1-sys.img':
; {1 k2 e, _6 O9 y* u        size 10 GiB in 2560 objects
0 q9 C9 F- w& \! q* R( s        order 22 (4 MiB objects)
6 U* [% o; t# S        snapshot_count: 0
# Q- y3 V* g2 G, l& k4 v+ o) i4 E. ^* W        id: 19a5d559f577b
7 S* i1 _5 g& @4 A9 h        block_name_prefix: rbd_data.19a5d559f577b
: K$ a& M# A# x3 ?" U        format: 2
" e6 H2 {' K8 F' q        features: layering
" s$ H' n: U. w! I        op_features: 6 G: O4 r. d. e7 p- ^5 b+ }
        flags:
7 B6 @% Z. B- G+ d" o  x7 o        create_timestamp: Thu Apr 21 13:06:56 2022- z( F4 l( C! s& |% n
        access_timestamp: Thu Apr 21 13:06:56 2022
: ?7 y9 V6 M' |; n5 J) O% U        modify_timestamp: Thu Apr 21 13:08:58 2022) r1 P1 @0 U- T, g

# G/ U9 l9 p7 L$ Y8 l$ B" V' `3.2.修改虚拟机的配置文件调整系统盘的路径
4 u3 R* N& Q( l4 t9 n直接将现有系统盘的配置信息修改成下面的内容。0 n1 K9 A; a5 L: u$ R

1 H" z: Y7 E* }% ?. C4 M[root@kvm ~]# virsh edit vs-centos-1
! h; t. t2 O3 O3 Q    <disk type='network' device='disk'>
) ]; ]2 k9 H/ O% W5 \! p      <driver name='qemu'/>* o4 R, m  a# T' ~
      <auth username='kvm-libvirt'>
, n: }% A6 w, ?        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
% E9 ]  {- H# x* Y      </auth>* j& y2 N& [0 c) Y6 _# n' `
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>0 V6 q# Y+ T; y* Q3 c# Q
        <host name='192.168.20.20' port='6789'/>
, E9 m, M  G/ x( z        <host name='192.168.20.21' port='6789'/>) s+ O9 d2 o; A1 Y
        <host name='192.168.20.22' port='6789'/>, e0 \5 ?2 {( M& @! p
      </source>
: J: R% n9 A8 n$ a" p      <target dev='vda' bus='virtio'/>" k- B1 g4 I1 X8 Q* j8 K4 C
    </disk>6 }# P. c9 |  {; d* s3 c$ X6 m9 z

- H( q) j# s- f. R: k8 r0 b6 [
8 b5 X, B" a$ h* Z6 j# {5 b2 v
: a, `( O7 X" j. N' {8 T/ a3.3.重启虚拟机- q# H) _  c% e6 W5 y
[root@kvm ~]# virsh destroy vs-centos-1
5 F; J# j/ S% y, s域 vs-centos-1 被删除
+ _/ @9 I* i  Z$ ?/ @
. A; A* ^  P$ e[root@kvm ~]# virsh start vs-centos-1
, I- M9 H3 b  X9 \+ ]域 vs-centos-1 已开始
: [( b* E6 U$ |, \/ R! w& I& ]
+ _4 i% \+ |1 b  i9 v3.4.验证虚拟机是否可用+ k2 C, @# `6 }& ~: R' E
安全没问题。
0 e+ I3 V$ D. U3 y( L
( {1 ?$ P) R2 g% |: G1 [- A) @8 W$ {8 Z! A! ]3 c8 V2 Z

& M4 p# D4 u) k: V4.实现类似云平台秒级部署虚拟机9 R' x, q, q/ G5 c  [
在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。: F: H+ o# z) @( X
  t2 e2 l4 W0 n/ ]5 [4 d: N$ Z0 z
秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。
( T7 ^4 E& h" k
: p* B' Q  E6 \$ Q' P! X0 y# a0 `如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。
+ u. f& i8 K" Z+ u3 T1 k2 G8 F& D$ K+ T8 Y5 w+ i$ o* z
4.1.将现有虚拟机的系统镜像块设备创建一个快照5 E8 u+ t2 ]3 n6 c; b& I
将系统盘对应的块设备创建一个快照并设置成保护模式。
5 {+ M& P1 L( y& Z# F  l! O; b/ o1 U( `+ G0 v; [& G' I
[root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template# i  K5 {$ m  {2 h
[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
# Z3 l. e9 k4 [: t& |: z
& I/ B+ C/ W/ n0 R4.2.为新虚拟机提供克隆镜像& U+ o+ g( |/ o- _; f( S
为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。' E. J1 X" `2 B' Y+ N8 T& P
* q6 c9 @" t( t& V% ]
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img% @# x& ~$ H3 D3 L0 E7 ^  N
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img) o  L# q9 h4 Z8 S# V3 _. }
- S8 O. ]0 [! U

8 C. k; c0 w2 s8 i5 Q" G4.3.通过虚拟机文件准备多个虚拟机
3 Q! H. @6 F. b9 H6 a2 k- MKVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。* P1 M2 a1 L% o" Y! j

9 U  m& G3 X9 ~4 b& X8 Z0 `进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。
# ^" |5 w7 D/ v/ l
, ^+ U2 q3 |# ~0 i$ O9 `! @6 i$ \[root@kvm qemu]# cd /etc/libvirt/qemu/
% o: o# e' ?) A3 v[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml
2 N9 l' }* t1 B6 b[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml
0 h) U6 m, W7 ?$ q3 ~$ b3 e" T' d1 @
3 G! m  M9 a6 S$ Q# \' J! ?% b
4.4.编辑虚拟机的配置文件5 p, Z0 E+ c$ q( b) x
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。
; N* S9 J- ?7 X3 I6 X* |5 K
# k2 z! @; s  Y5 }1 L# }9 ^+ q5 v6 S<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>- B2 Z, z& ^( v; I
  w* \5 |5 ?1 F' N9 c
<mac address='52:54:00:eb:f6:97'/>
" y: O% C$ R7 ^; e
& X5 V  }2 ^5 P, e9 d! Z' h<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
* z& M1 y0 ?7 f9 Z& M' f
+ r9 S9 `7 _" d' [' E4.4.1.vs-centos-1虚拟机的配置文件3 |! U. q6 o$ g% r3 t( J# d  a" d
[root@kvm qemu]# vim clone-vm-1.xml
: ^, a$ R1 C+ K( F3 F9 O" x! U<!--/ h( W" \3 T+ t( Y
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
) R; i9 s5 P* O5 ?* lOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:* _' O+ Z: _& ^) Z( K
  virsh edit vs-centos-1
6 C- V( {+ D4 d, O& |( Aor other application using the libvirt API.
! M' i3 Z$ U0 P- L* F, @  r7 a- W-->9 J1 b! H5 I1 y1 W' A  [% X

/ A. |4 X5 {$ P' M<domain type='kvm'>/ z' d- @; \3 p
  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->
5 N) O! R3 b% ~5 W1 T( j  <memory unit='KiB'>1048576</memory>" o- o8 W) ]. A
  <currentMemory unit='KiB'>1048576</currentMemory>
( L$ V. C4 X) i+ o* n" `  <vcpu placement='static'>1</vcpu>* j; O! T& a9 m3 ?$ O2 \
  <os>. _! m6 r9 z: s2 {9 F. R! q) ?
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
6 O0 M  a2 y1 M5 A. ]6 E    <boot dev='hd'/>
6 e% w  v, ~& |  </os>6 Q* X) H- N+ {" e! U
  <features>8 S, @9 K' L8 b/ h# y/ r" n
    <acpi/>
- x+ R- w, h5 q' ~4 J: g    <apic/>2 ?' X7 z/ X0 k, U5 ?/ f
  </features>  a4 c% a# b4 m4 o# P
  <cpu mode='custom' match='exact' check='partial'># x8 x7 _9 e. |. r! k. ]: {, ~
    <model fallback='allow'>Nehalem-IBRS</model>8 e$ |5 S! i; J! v& I
  </cpu>
0 _& k2 z- [. q' j4 e8 S  <clock offset='utc'>0 n1 D7 Z4 ^7 Z
    <timer name='rtc' tickpolicy='catchup'/>, N( ?* E& e" U6 Z5 [5 |6 L1 O& c
    <timer name='pit' tickpolicy='delay'/>0 h; z0 k$ ]3 s! @
    <timer name='hpet' present='no'/>" @6 X9 D# d5 n. ^+ T' q% p: j
  </clock>
$ t+ @- O% l8 m7 W  [  <on_poweroff>destroy</on_poweroff>! E$ \9 J/ _; ~/ W6 o0 O  m# U* \
  <on_reboot>restart</on_reboot>3 g/ o( [- ~- K( C
  <on_crash>destroy</on_crash>1 }" A5 A/ b/ P* C4 d6 a
  <pm>
* a; p0 `( v; ?! r' W- S/ Q    <suspend-to-mem enabled='no'/>: @" P5 O5 ]3 b1 Q9 q& u$ S
    <suspend-to-disk enabled='no'/>
: q( @. c- |1 M& v  </pm>& o. j) D( k) f$ I; S; F
  <devices>( i0 r, g' k8 s% C) w" L; D
    <emulator>/usr/libexec/qemu-kvm</emulator>$ T9 d1 F# n5 }' D" p: u# ~% N
    <disk type='network' device='disk'>% t" W( m* P8 e- g. M' m' K7 |
      <driver name='qemu'/>8 R$ s, d2 B/ P
      <auth username='kvm-libvirt'>
8 U  o; |9 d3 m& b        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>, H" |. M% j+ O# }
      </auth>! f5 M! f, J/ X; n- N1 @
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->8 j+ C4 w4 G7 [1 b
        <host name='192.168.20.20' port='6789'/>0 K/ j6 ~/ w7 X
        <host name='192.168.20.21' port='6789'/>% a* I: v; r* F9 p3 F$ U
        <host name='192.168.20.22' port='6789'/>6 x  k2 F5 ]! k0 z
      </source>
+ u2 k+ z9 N. d      <target dev='vda' bus='virtio'/>' `* L( K6 s! _' F0 T
    </disk>$ `. ]5 ^' B3 a, s  T2 a
    <disk type='file' device='cdrom'>7 r5 ?7 v6 C. o/ i6 t& R/ j
      <driver name='qemu' type='raw'/>' |4 _6 V% @: X
      <target dev='hda' bus='ide'/>$ _0 d0 k8 i) U6 ~/ t
      <readonly/>% B# k, k. T$ ^6 e! Y& X  M- S
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>0 _' U6 X+ E& A
    </disk>
- I9 G, X5 h: s( P" ]. j( P    <controller type='usb' index='0' model='ich9-ehci1'>
. W2 V* P1 \! u6 T/ Q) g      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>+ Z) e3 G# u  u7 s8 k
    </controller>
  r1 }( I8 s4 t- Y% ]    <controller type='usb' index='0' model='ich9-uhci1'>
# N! F' \  h3 r1 Y      <master startport='0'/>
( z6 q; G1 M& c4 e9 }! T      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>4 Z2 b) t# p4 t7 C7 m
    </controller># W# q0 [+ P* A- J( I
    <controller type='usb' index='0' model='ich9-uhci2'>) Q  o# P# K/ S( D
      <master startport='2'/>
" `4 C" a7 a& z! K      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
5 y0 X% l& K3 y    </controller>, n/ z: }3 I  c$ A$ _2 A% I0 z
    <controller type='usb' index='0' model='ich9-uhci3'>6 Q5 q; C  {* [; t- Q4 [- B
      <master startport='4'/>
' ^" f+ |. a5 H6 N1 G$ h      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>7 n; \8 G8 E$ C
    </controller>
' N2 q1 s' c7 f% W    <controller type='pci' index='0' model='pci-root'/>
0 {4 H! B; O0 W2 C    <controller type='ide' index='0'># r& h' [* z/ P, \4 K1 u
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/># w* u/ Z0 k* f9 O7 A9 ^
    </controller>
& d: o( d! M+ F5 }8 q1 n    <controller type='virtio-serial' index='0'>
" S0 M. E) Q5 X) y" c. k      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
$ _, h% z5 N  D! {7 a8 d, ?    </controller>; o, N. O4 U3 U, c
    <interface type='network'>9 L! J- t2 f8 m; z* i) o8 Y7 f
      <source network='default'/>
9 p! a. V8 y8 m% o% w" c$ g* s$ Y      <model type='virtio'/>
, `0 Y$ t( Z' M% M7 c    </interface>, T+ _+ z. ^! r$ f2 p9 b
    <serial type='pty'>
, J$ K6 U$ H( T4 h# f5 D) v      <target type='isa-serial' port='0'>
5 \4 G3 {+ x5 p! r& W% {' \* t$ a) w        <model name='isa-serial'/>
8 V* n9 p4 H6 p      </target>
+ I# u- ]9 ^" m$ [    </serial>0 m3 B' @- p- j" s' E
    <console type='pty'>  X7 l8 v+ Z# q: {/ @8 v5 `
      <target type='serial' port='0'/>+ T) G; P  [  U) Q% U
    </console>6 X" C$ J1 {4 j
    <channel type='unix'>
) X6 J" O2 B9 ~0 P) w  r; |* l      <target type='virtio' name='org.qemu.guest_agent.0'/>
( |# k8 a; Z' G/ C% H      <address type='virtio-serial' controller='0' bus='0' port='1'/>
/ Q. q( ^7 s5 s9 {$ C2 u9 z) J: c    </channel>3 p+ t6 [: h) M  e" E
    <input type='tablet' bus='usb'>. w6 e% }: {2 P$ u0 s) L0 c8 r
      <address type='usb' bus='0' port='1'/>  w0 Q( L. ^3 F4 j) r
    </input>
  L  }; E5 r# M* T' x& s* @    <input type='mouse' bus='ps2'/>
. F7 {7 t9 B" P, o8 {+ C' Y    <input type='keyboard' bus='ps2'/>
! Q% ]1 K! j3 F3 L9 z    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
# n+ p7 l, v9 Y$ O) Q2 a/ H* e) {      <listen type='address' address='0.0.0.0'/>
/ [. S8 q, N6 Z/ s    </graphics>& z; c9 \3 `7 v
    <video>
4 p+ O7 ~8 |8 h$ p# m      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
1 i* g1 h8 h; [7 f5 k! O- h, ]      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>1 O$ [) M& q4 o$ a; A
    </video>
3 t9 b2 E/ A+ D7 ]    <memballoon model='virtio'>
  m( v) E* m) V' u+ \      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
9 C7 ~  b$ H$ P. L    </memballoon>
0 K* F/ U1 ^. a6 P& s3 {+ l  </devices>9 r( F- n0 F+ P1 w+ e  u+ Y
</domain>3 X1 b$ S1 Z- P  Y

. [* ~3 V6 Q" H4.4.1.vs-centos-2虚拟机的配置文件) t5 K" T  y% b* t9 l; t4 z
[root@kvm qemu]# vim clone-vm-2.xml+ ?! n; C7 j. I" ^: W- l, a
<!--
  p3 ^8 Y: j1 v( k" Z     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
1 M5 T3 [& M8 z1 ^& `- S  aOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
# r- ?% F; U% i  Q  virsh edit vs-centos-1+ H3 s) A) @. Q- j& s! k
or other application using the libvirt API.
' Z2 X, V5 I+ s( u; S7 y--># v4 n$ h$ v0 i$ D- ]3 b# o

5 m; E/ D/ S: L( W7 n1 ^( O<domain type='kvm'>
$ c) a- L# H: y  }, i  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->: n; Y' H0 p  x
  <memory unit='KiB'>1048576</memory>5 i" ?) Q3 `) k5 N+ |8 G$ K
  <currentMemory unit='KiB'>1048576</currentMemory>$ I: p+ O$ q, |
  <vcpu placement='static'>1</vcpu>1 {2 \! B, @7 q; ?5 y
  <os>
+ `9 P  j: _: [/ |3 |) L" G# M    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>8 B# c8 U- `! k  `1 V" ~% W
    <boot dev='hd'/>' Q1 `* f6 V$ O$ Q* u
  </os>
+ d( M" J% ~0 h" P& D5 b  <features>. g4 ]/ _3 Y$ y
    <acpi/>2 P8 S6 e, q4 ]
    <apic/>
6 B/ ^6 }2 V- ?8 o- T3 T, N* j8 R  </features>
0 Z- H, c9 Q1 ?, h, M7 Z( ]$ v2 G. \  <cpu mode='custom' match='exact' check='partial'>( S9 C  [8 ^+ s( B1 p
    <model fallback='allow'>Nehalem-IBRS</model>
' c; ~! @! x; v+ R1 @& ^  </cpu>
! r! H" }5 m) x9 R  <clock offset='utc'>
# V% \# {! [  u/ O$ x$ r: l" y    <timer name='rtc' tickpolicy='catchup'/>5 B! K9 t& [! M) A/ y; W
    <timer name='pit' tickpolicy='delay'/>- ~. ]" }: o: [8 A& o
    <timer name='hpet' present='no'/>+ s; }0 r+ l; L3 W; C7 C/ p* p/ y
  </clock>6 [. g. y3 W2 }) r$ S
  <on_poweroff>destroy</on_poweroff>" _: E5 g" Z) k
  <on_reboot>restart</on_reboot>
7 r& o/ V% s- `$ T+ p  <on_crash>destroy</on_crash>
- u8 k/ \) M0 [' p7 T+ V  <pm>0 S9 |, t. p( o9 V/ D6 w
    <suspend-to-mem enabled='no'/>0 p& a, Q6 r1 L
    <suspend-to-disk enabled='no'/>
2 n; E8 A1 c7 X3 j0 c. A1 M8 f1 i  </pm># _" L! r7 T% ~. Y
  <devices>; R6 ^- [  }3 C- C; Y; @' R8 W
    <emulator>/usr/libexec/qemu-kvm</emulator>
# Q' N0 H0 R; R' ]3 H    <disk type='network' device='disk'>' G/ f6 e/ U. \
      <driver name='qemu'/>
5 s" O: k$ h% m! B      <auth username='kvm-libvirt'>
: w3 S0 Q( S' H* l* [1 Q" t6 {        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>) d- D! j% U! [" T0 ]
      </auth>
4 E1 j. j" t2 ^      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径-->
5 u4 E. u1 g. ?$ `6 q        <host name='192.168.20.20' port='6789'/>/ Y6 _5 b3 L( J
        <host name='192.168.20.21' port='6789'/>
; k1 z8 A+ s5 x* r9 |/ ~) S        <host name='192.168.20.22' port='6789'/>
$ y3 K+ p7 x2 i2 t7 S& f9 g      </source>7 A7 h% U9 J* X1 S0 v
      <target dev='vda' bus='virtio'/>
; h% P& e& ^+ \; y9 X    </disk>) H5 W  C# ~# S2 h7 ]- O; e
    <disk type='file' device='cdrom'>  x- R: l: Q" r! R$ b$ R" O# \
      <driver name='qemu' type='raw'/>5 x) T6 f" f- F. r1 }7 J7 T
      <target dev='hda' bus='ide'/>
+ F, ]& r) H) }5 L2 [2 @9 A; ?      <readonly/>, [( u4 m. G3 O! J0 ?9 w
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>) j7 Q$ s. J/ u" D) T
    </disk>! K1 d7 v& b# |6 q9 x
    <controller type='usb' index='0' model='ich9-ehci1'>4 x7 n9 H" o1 n9 c( t5 N+ r
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
  n, H. M$ X$ j4 l! B9 `% H    </controller>+ i2 \/ u9 R7 E/ g$ o
    <controller type='usb' index='0' model='ich9-uhci1'>3 d7 ?* Y. t7 Y* G) q
      <master startport='0'/>
2 n* z$ x( x. J8 b: H7 H! u      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
  \2 E0 b7 j% B4 i    </controller>
; k6 `9 T6 a, ^2 ^/ J  B    <controller type='usb' index='0' model='ich9-uhci2'>  i7 `% v7 |0 `  w
      <master startport='2'/>: l: G$ z- }, B0 S$ X
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>, n5 P7 W4 t( w2 C  e
    </controller>
+ [$ F9 B5 k! v; K, w8 L3 r1 \    <controller type='usb' index='0' model='ich9-uhci3'>1 n5 ?$ x% K( x3 {
      <master startport='4'/>
- t1 R" [2 ?) d$ r5 r      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>2 w% O2 y7 X' I. W; ]9 S1 l* [
    </controller>8 \! O4 s) B1 {, m
    <controller type='pci' index='0' model='pci-root'/>5 v$ B3 P/ D0 `: q9 E# ]& g
    <controller type='ide' index='0'># V$ P* `. q' i0 ~% v
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>  B4 D. E  h) o8 X: J/ S
    </controller>
# F+ P9 V1 u7 x2 y) h& n) O    <controller type='virtio-serial' index='0'>' s: q# A* B# X
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
' k8 j& E0 F; w    </controller>: g0 u; U; d8 n# B/ |- U# B( X  k
    <interface type='network'>
1 D# ~3 [/ U$ L      <source network='default'/>  j) C5 Y1 S- o9 N3 i* l
      <model type='virtio'/>3 i4 l! @7 t/ i8 k
    </interface>
  h, ]0 C- \& X6 D. g6 I( {    <serial type='pty'>
# t2 \4 ~  [  O3 d/ }. d      <target type='isa-serial' port='0'>* b" ?' z3 y" ]5 g
        <model name='isa-serial'/>
8 r, o: L# h+ y% ^0 h      </target>
" f( {/ D) d8 {( B( t    </serial>1 p) b# Y2 i3 ^/ {1 z% V
    <console type='pty'>
! b- \( o/ R; Y4 s9 C  l      <target type='serial' port='0'/>; K: ~0 b& Q( _4 C: @# y( U+ N1 Z
    </console>
' J. u8 v: n! j* A) c- O/ t: j( f    <channel type='unix'>
% G' m) N3 ]/ S, @      <target type='virtio' name='org.qemu.guest_agent.0'/>
2 y; g3 m8 G& @5 F      <address type='virtio-serial' controller='0' bus='0' port='1'/>
; X/ ^3 F4 e; ]3 {    </channel>3 n- _5 W6 N' }# g
    <input type='tablet' bus='usb'>6 h8 T7 |0 e) q  P, l6 {+ Z% y
      <address type='usb' bus='0' port='1'/>/ n1 N* F( K4 B* u, p, v
    </input>
+ l( B& T& c/ y4 |# @+ A5 _    <input type='mouse' bus='ps2'/>; x1 @; @6 {" r& @
    <input type='keyboard' bus='ps2'/>" Z6 i; m$ p1 V) C* e' I+ d
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->: d3 _1 d+ @3 K8 S
      <listen type='address' address='0.0.0.0'/>3 h( B. }7 G# K0 S5 A- R5 ~  J1 ~
    </graphics>
: j  u! o) h8 u    <video>
8 F8 z; H6 {- p& |$ o) R! U! [8 N      <model type='cirrus' vram='16384' heads='1' primary='yes'/>) ~6 S$ n9 S; j8 F
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>% V" W2 v5 n5 |6 I
    </video>, b# I% K( {: {' i4 b
    <memballoon model='virtio'>
  U5 i- L9 O( h. }# t* A      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>, ]2 ^7 i9 b+ D. ?* O! p" f0 I
    </memballoon>
9 f; P( }8 ^' ^5 k, x( _  </devices>* @# g; ?- v2 k& `/ i1 z5 D
</domain>' C5 L) d" g! t' I8 s# n

% x. A2 u4 Y3 O4 \$ t% ^+ L. K0 `8 D( r& c
4.5.将虚拟机配置文件导入到虚拟化平台: r$ m6 T; S9 ^0 ^8 [' h# s
[root@kvm qemu]# virsh define clone-vm-1.xml / ~6 e6 L! S9 P9 Y% w% l8 W$ |
定义域 clone-vm-1(从 clone-vm-1.xml)- m  ?% y% m4 B$ m' W' y

9 }" t% w" B! e% ?; N# ~; g9 }[root@kvm qemu]# virsh define clone-vm-2.xml
" Z1 q; q' U  o: J& H1 W% e定义域 clone-vm-2(从 clone-vm-2.xml)
; v( T; e% j0 |8 ^$ l& ?' {3 e* ?$ I! w; T

% b# c4 @0 I8 R' l7 K! H4 X5 L导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。3 h5 R8 k- y) |+ @3 H7 K* a
' N! S2 p, L, N, C) D! c& H- P9 g
[root@kvm qemu]# virsh list  --all& _' m  e* [, ]/ ~
Id    名称                         状态* j& h* m& f+ ?& @
----------------------------------------------------( @/ X2 E6 K- l5 w, X/ i" L, Y
7     vs-centos-1                    running
( S, g- v; Q  ] -     clone-vm-1                     关闭
7 P8 K/ c6 z( M) E* L& f1 W -     clone-vm-2                     关闭6 A9 h, u- _" o% X' e: b+ d
3 v0 }3 |. Y3 Y
4.6.启动虚拟机验证是否能够秒级使用0 N' _. L& c& E, R1 }9 f
[root@kvm qemu]# virsh start  clone-vm-1
, [2 b0 t4 d7 L/ R: V域 clone-vm-1 已开始
( {$ }# g8 m4 u3 ~$ W( i$ K& D) V- o
[root@kvm qemu]# virsh start  clone-vm-2
0 N( Q( l2 ?4 P, r7 Y域 clone-vm-2 已开始% x* p, s8 f! c7 T. v

" N) `: o4 s2 i+ n. ]9 K. W
- x* @' x, W. ?+ p/ j待后期更新。
$ r, f* z5 x$ t8 u8 m0 A% D: o# ?5 `) Z5 L9 D; R) S

/ N) a7 R' k0 e8 G

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通
' L1 J( F1 }: C1 x8 N) ~' E( a: t
1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)
5 y; Z6 ^1 h4 A  [7 x3 z
7 X: \5 I- A, K1 O1 ?( q5 `0 d7 f2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下
' U4 `$ j2 K& [' ^0 G; h( C6 a% R. I' h$ ]5 c4 q1 p$ ~8 @3 R
3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通+ {( \3 z/ m  }( r7 q% }, |

/ U, h0 O1 s& d. L) C+ J) a: g二、创建rbd盘并挂载给虚拟机8 v2 v3 s( P, c

2 @6 Y. e9 ]4 B; |# V7 B7 a! p1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池
* V0 O$ t+ C" M3 H" P  \/ X( t. J+ `; M7 q6 {! Q+ g
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'6 r* c" y8 I+ H- D8 l1 K- a9 o' {+ T

( C+ `" B  b" ]9 W; X验证有效:ceph auth ls|grep client.libvirt' g# T0 c# q$ F8 q" X& b

8 y  C! R3 x) @6 Z5 ?) O; G. i/ ~, I. ]0 d! x/ t

+ _( [0 ^( k* Z* r* T4 N备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行
& T! p+ k) g) \9 Y0 R
  |# ?' ]5 e) X9 }% f+ N% m% Q: p2.创建secret.xml
5 c7 e- `+ b1 K0 b8 [2 E
* F1 d  X, C: Z! L( xcat > secret.xml <<EOF3 |9 _) m4 u4 j6 ~. Z$ j9 f
* H: W/ z/ t! G. T, ]) d
<secret ephemeral='no' private='no'>
9 ~2 i+ L0 ^9 T
4 w2 D+ K* u* U; Y, S% E        <usage type='ceph'>
# Q; i+ G4 u! r7 G6 L0 U; M4 H6 r8 A
5 L# o  ?8 |& Y9 e6 M                <name>client.libvirt secret</name>* O8 O4 o. I( _* J9 w& o7 k& [

4 q3 [) o/ Y! T6 |4 R" J& i; _        </usage>
; J7 j5 n' M3 x, z% c  K# @8 }% q9 x. s2 S- h9 y
</secret>( K! F* A9 k, \8 u. p

+ V: B8 d6 o( B$ A" ?6 tEOF
& r- C* f: s7 Z/ a5 c6 d8 M0 V0 a4 J# H1 q, h! b+ T. U1 h
备注:以上命令在宿主机上全部复制并粘贴,最后回车+ n! p% t9 {8 F0 s6 t2 m

9 n% y& W$ y$ N# I/ }, [  b3.生成uuid
. t3 z4 p* o* r2 c, X0 a% F' \: G. B( \( W. U7 {; Z( G
sudo virsh secret-define --file secret.xml
+ ?8 Q& _/ i) D" U! z$ C8 L5 Y# C0 y) x9 G
{uuid of secret}
) u/ H3 M+ z3 R9 [- X# X4 R# B! D7 f) u  c; i5 ?; D* v  S
4.获取client.libvirt的key并保存到文件
& `! M/ S* Q: u+ r# }" _  H, i4 G6 k) [3 J+ @! i  h# T: {9 o( Y
ceph auth get-key client.libvirt | sudo tee client.libvirt.key* a# I1 ~) C* G3 [7 \2 ?
, x# C1 m0 g, M& b) p/ M
5、设置secret的uuid- q9 s; r. B% [0 g- Y) m$ W
# s  |% e/ V4 `9 H
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml6 j% y: ?, w! y

& O' C4 o. e" ]8 ]1 N将变量替换成实际的uuid和key9 v/ J- j: |2 {
& q, W" N% {0 f* f
6、创建池libvirt-pool
. B# e6 q- ^5 ^- ?" M2 J9 b/ Z# }% j
ceph osd pool create libvirt-pool 64 64. o- v9 [3 f% _3 D' P' |' ?

0 F* S: Y# d$ `8 N1 u/ c' [" }; a7、创建rbd盘
/ u7 h2 D, n7 M+ b2 Q4 p( l( G& X5 {& X9 }
rbd create --size 10G libvirt-pool/test1 --image-feature layering/ |  m; R- T' X

0 i9 O: ]* `/ [查询存储池中的块:rbd ls libvirt-pool/ P4 s; N1 h( x. S* R
  H7 a5 i8 t7 ~' f
8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息# E) t6 P  |7 S& D+ b7 q9 W9 N

+ ~1 M$ }: A4 S. l( [3 ^/ u关闭虚拟机:virsh shutdown vm! f% _3 `4 ?$ Y; }" m0 T! B
2 n" I  y5 S9 O6 r8 D
编辑虚拟机:virsh edit vm
8 _  w4 B) D4 g2 T& K* I% R3 ]7 R, _5 V* S4 h
在disk标签下增加如下信息:
3 o3 ^5 P" N# X8 |
: I# [" _& R" S& o; J9 Z* p, m5 D<disk type='network' device='disk'>* j- s! H7 c) @( E
$ O' W0 J# Q1 a; u% v
      <driver name='qemu' type='raw'/>
2 H$ C: l5 B# C: f1 B6 w
* p  T) j- A" n8 r" U2 J, l* I      <auth username='libvirt'>
0 ^; y+ n# F$ B' H& l, F& m8 Q; e1 |* C- s' [* {2 l
        <secret type='ceph' uuid='{uuid of secret}'/>
$ ]7 f, _  L2 y3 j. Q. n
5 N% ^6 M! F+ p1 K/ z      </auth>
% l: r3 m5 y0 x- H# D5 N) G* b5 b( W+ n' I! z
      <source protocol='rbd' name='libvirt-pool/rbd_name'>/ @* C- V, b' C& F5 y! V6 e0 L" n
* P; ^' H! t( E' x5 w% {: K2 ?
        <host name='10.25.72.142' port='6789'/>
0 x3 ?7 Y; v2 l/ ~
9 N/ ]( s! R7 O; F7 |& m3 G        <host name='10.25.72.143' port='6789'/>
0 }0 o. ~) P( i# K; S3 R' E% V, j+ ~5 m! F
        <host name='10.25.72.144' port='6789'/>) m) e/ _  G8 B5 k$ g+ Y+ R3 G
& b% o' y% J( B/ J7 R
      </source>
- ?- c5 g2 h8 G6 p$ F, b1 Y; q, L. n# G1 @' g) t1 L" s0 o
      <target dev='vde' bus='virtio'/>0 a9 ]- ~0 |& U0 Y( b
, H  k! V+ K  x$ V4 Q- R
    </disk>5 u# _1 Y0 Z1 J: |# H# p
" C! u7 Y% w5 A% p- w# X5 q7 |
备注:1 }4 }0 ~% q; S1 s6 x

0 k* r+ W7 I8 H1 L: Q- X) l需要修改上面5个参数:
- n! {( L& f. V* @6 |$ h
! r& ^3 y$ [! F8 g9 ~. v5 U1)username是建好的用户名:libvirt
4 m* N4 U- x# l$ `: s6 ?9 N
6 |9 {! Z  U& K" U, H6 ^$ g* l2)uuid替换成第3步生成的uuid
3 X- c) v, i1 q7 c- W) C1 q4 k* M' L  F" d
3)host name后的ip为mon的ip和端口% H4 W/ B( d/ ~0 T

0 ^7 _, m7 _, L7 cmon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip
4 _6 g0 o( m! E- c4 \: G5 [+ R8 Q: n& D" O
7 K/ O0 l$ }; U
9 M5 k; \# A. Y; O
4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde
1 B4 t/ c8 ~- j& k4 u; X
0 _9 D4 Y, @8 c7 R) q8 V+ m/ M+ I5)libvirt-pool/rbd_name是创建的rbd盘
- O( M" v% Q8 p- b  k. q( Y/ {, }( O" [/ Q# W) i9 j
9、查看虚拟机挂载的磁盘
, L+ p6 b4 l; z! [/ N7 C3 a' a
! Y  ]) [+ T- A" ~7 Avirsh domblklist {vm-domain-name} --details& a  R: S9 M8 s1 {/ B9 {

3 N0 x* f/ S' ?, @" [% }10、虚机开机,即可使用挂载的rbd盘( S. {0 Z- N, z

- x( Y) q$ j8 [1 _virsh start vm
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:32 , Processed in 0.018663 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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