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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2024-8-19 17:00:04 | 显示全部楼层 |阅读模式
1.KVM的Qemu与Ceph RBD块存储进行对接
# F% k1 \! |* `, j6 |$ X) }1 n, C# f1.1.Qemu与RBD块存储对接的架构图
& J6 e$ G. h& p4 X. G5 H; bQemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实现的,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟,所以性能相对比较低。而广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改Qemu。KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。; d  O$ D/ t- x8 H1 n- n5 S
/ F9 d4 ?& M: H) I, u; r7 l
Qemu主要是用来虚拟各种资源的,例如网卡、硬盘等等,我们可以将Qemu产生的数据存储在Ceph集群的RBD块存储中。
( L$ F; G9 l! E4 A! B' L* y4 I# q# S. J0 j$ U& U$ p* Z3 T& T$ q
Qemu通过librbd驱动组件与Ceph集群的librados建立连接,将数据通过RBD块存储写入到OSD中。8 B, g3 b! N2 I. b! g
9 _6 Y6 j% I9 _

& i9 W* D" C  e% i1 b+ w: `' P  l' |- }* e
Qemu与Ceph RBD块存储对接,其实就是在Ceph集群的RBD资源池中创建了一块存储卷,属于RBD类型,这块卷创建完后,KVM在创建虚拟机的时候就可以使用这块卷来持久化虚拟机的数据。4 n9 h' C2 k; F! A

5 p# m3 i8 ]( Q2 a5 }9 x  D# b9 o, Y官方文档:https://docs.ceph.com/en/quincy/rbd/qemu-rbd/
. T( j$ F6 K5 M7 f) p. S. M# T0 D0 Z$ j. i
1.2.配置KVM服务器连接Ceph集群4 b4 _( e+ D( x- }
Qemu是在KVM服务器中直接创建的,因此需要配置KVM的服务器连接到Ceph集群,使用Ceph集群的RBD块存储。' V- S. e5 W- P

% Y( m+ `  R3 D$ ~; Z6 C+ O1.安装ceph相关命令( w. J' K* y6 `, x9 @
[root@kvm ~]# yum -y install ceph-common' G: J7 M- b# a! s, y* Z' W  Q

/ p  |+ ~: R% C2.拷贝ceph的配置文件: m9 Y8 d- Q& Q, ]* d" l
[root@kvm ~]# scp -rp root@ip:/etc/ceph /etc/
) x" I5 c- s- o2 |  z+ T# U1 n& v& t; G
3.查看集群的状态! _, I, I) C0 o0 g; a7 Y
[root@kvm ~]# ceph -s
( b6 }  m  C+ H* K" I2 J    cluster 70d27aec-742e-4a95-b000-cf37ebba35d0
$ K- A& _  {- `/ z$ |  |+ M! h- w     health HEALTH_OK0 F2 N' m8 {! Y% k8 c
     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}
6 a* L2 I( n4 z- q) q# e/ a            election epoch 352, quorum 0,1,2 compute1,compute2,compute3
' h! A' T2 r; w     osdmap e29566: 131 osds: 128 up, 128 in, e; F8 V  b  X& X6 n
            flags sortbitwise,require_jewel_osds
% w) L# V/ F% b+ v( h$ r* Y      pgmap v191784797: 10240 pgs, 1 pools, 99538 GB data, 25555 kobjects- ~# G: v+ g: H+ V/ w1 A
            291 TB used, 174 TB / 465 TB avail3 t7 V+ F5 g& g6 N- J
               10234 active+clean
  l1 V2 W8 p. l4 E1 e- C                   5 active+clean+scrubbing+deep
& v* B- Q" W2 n  K                   1 active+clean+scrubbing
7 |' m" l& e2 [
* l7 P# F; v9 b; l1.3.在Ceph集群中为KVM创建一个资源池* _2 ]; P) Y$ f: U1 }) G
[root@kvm ~]# ceph osd pool create kvm_rbd 32 32
0 ]5 s9 _9 \6 Z7 {5 u* T6 Dpool 'kvm_rbd' created! e; D3 p- ~! F2 G: U6 w

$ |" ~3 `. O' \5 b! x8 }* Y- l1.4.使用Qemu在RBD块存储中创建卷
% c3 t. n3 P7 s1)在RBD中创建卷9 T( [$ s+ E2 w5 I+ S' w$ X

$ H! i8 O( M: x% `6 b" [命令:qemu-img create -f raw rbd:{资源池名称}/卷名 大小9 o1 F& P/ Z6 U& I( w/ u
, U& z+ j6 [: D. Q, {# Y8 t( B
[root@kvm ~]# qemu-img create -f raw rbd:kvm_rbd/vs-centos7.img 500G  L5 }# \' \! [( W; I; W
Formatting 'rbd:kvm_rbd/vs-centos7.img', fmt=raw size=5368709120000 cluster_size=0 4 H4 y( J; ~0 X" T
- K7 w: b( W5 H: k  v

% U$ X0 F! ~! _$ g2)查看创建的Qemu卷) o3 v0 q# o3 v+ N0 U* `
  ]6 O7 ^: z. w7 g( [: J
[root@kvm ~]# qemu-img info rbd:kvm_rbd/vs-centos7.img
) g9 R4 `& h2 ^2 @& R0 |$ D8 pimage: rbd:kvm_rbd/vs-centos7.img2 {! _. u, w9 n, Q
file format: raw) C9 J! l" j2 J( K! |9 W4 X+ r
virtual size: 500.0G (536870912000 bytes)2 e. z, G0 l; ?
disk size: unavailable
1 K6 q, Z  Q- c% w# c. l" l  b! W9 f. a% H% u: t: T
这个卷其实就是资源池中创建的一个块设备。
+ p' ]. `, N8 e
7 s( L, r3 e# y* m5 {9 N7 r5 |[root@kvm ~]# rbd -p kvm_rbd ls
' m/ ~$ s; o/ R1 D) J- C* Bvs-centos7.img' h' `7 Y8 y  K" G% c: N" I2 N2 {

, F5 J, v! L4 V* S0 R3 U[root@kvm ~]# rbd info kvm_rbd/vs-centos7.img
: p; F2 f" j0 c0 j% E6 Srbd image 'vs-centos7.img':
) L7 u' H9 k9 U( H7 `! p- b( K        size 500 GiB in 1280 objects
4 I% Y5 u/ F7 C8 f# T* C7 l3 {        order 22 (4 MiB objects). E  l( T7 s/ U
        snapshot_count: 0+ R4 N! V% v$ m* Q- |# I; N
        id: 19a9415778427
- u# T1 v2 g: e" K) \+ \' i8 o        block_name_prefix: rbd_data.19a9415778427
7 R5 z  ?/ W  Y* x( b        format: 2) h0 V/ H' K% c9 `
        features: layering& w1 L$ O0 B# R; Q# \
        op_features:
( _# }; O( R3 k4 g$ \+ t; o0 Z        flags:
  e5 b6 d1 b+ |        create_timestamp: Wed Apr 20 22:14:33 2022
" @# C: h! J, C$ z6 ^1 `4 J+ q        access_timestamp: Wed Apr 20 22:16:43 2022
+ ]8 ?/ r0 ^3 C7 ?- {# |0 s9 N        modify_timestamp: Wed Apr 20 22:14:33 2022
0 E8 X' u) N9 t
) G- L/ k' A3 e9 d  Y( Z3 Q1.5.扩容卷的空间. B/ t1 W- m4 T# B* F
[root@kvm ~]# qemu-img resize rbd:kvm_rbd/vs-centos7.img 6G- Y3 N7 m5 k, I! V& l0 E: P
Image resized$ W3 B; k& O) F" v6 O' l
2 N( I7 q9 m. n% {# ^$ \( r
2.Libvirt使用Qemu为KVM虚拟机提供存储
+ M8 |: p- }2 x' P- jQemu已经通过RBD创建出来一个块存储,现在还无法为虚拟提供使用,想要让虚拟机的数据持久化到RBD块存储中,还需要配置Libvirt驱动,由Libvirt通过Qemu读取到Ceph集群的块存储,从而将Qemu在RBD中创建的块设备添加到虚拟机中,充当虚拟机的硬盘,持久化产生的数据。
, q5 d0 a* T& _' ?! r4 Z  c* v/ ]
) f* B  }% I/ P; |! i2 e, V2 @官方文档:https://docs.ceph.com/en/quincy/rbd/libvirt/
& G/ h3 }* u3 q  m3 X' ?) R- D
' r. N; j/ [6 }2 a2 n+ ~$ E4 z0 h( M$ F' Z8 C7 F1 _! ^
' H8 j/ H4 Q/ ^: J' F7 D
KVM与Ceph对接,其实就是在Ceph的RBD资源池中创建一个KVM虚拟机可以使用的块设备,然后将块设备添加到虚拟机中进行使用,针对虚拟机的系统盘,也可以通过工具导入到Ceph的块存储中。2 m$ u1 C5 T8 U5 Y

5 E9 F( K# J4 m$ A6 q大致实现步骤:
. m) X& g# x) G
: C9 C* O* v# `* |" I& O, ?1)在Ceph集群中创建一个资源池作为Qemu卷存储的块存储资源池。
0 Q/ @! }1 G! M% |, f
1 I5 }+ n6 J( g. e( J7 g2)创建一个用户用于Libvirt访问Ceph集群的块设备。
  R3 f6 ^- k- K4 }4 y2 Y4 f/ P5 b, x+ P6 q; O
3)创建一个Qemu存储卷。
: r- P0 c& U, ]9 u2 f! X$ x1 s. G) j" ~% Y+ C5 j
4)在KVM中创建Secret证书,存放访问Ceph集群的用户认证信息。
! ?4 k3 \6 @, |' T& h1 u
( Z) t3 g; O7 a' Z% t5)编辑虚拟机应用RBD块存储中的Qemu卷,存储虚拟机的数据。
) i6 A9 L: O' l' u/ N. \) f( m3 G9 a0 K
其中1/2/3步骤都可以不做,在前面配置Qemu的到时候已经完成了,这里为了全面实现步骤,会全部都进行操作。8 p" l& Z' d* y
. ?% X7 c5 h/ U1 m# N( p$ s% w, l
2.1.在Ceph集群中创建资源池0 a7 t: z7 F& M0 P3 T) n5 s
1.创建资源池
% z7 U2 N$ j5 H& N7 k[root@ceph-node-1 ~]# ceph osd pool create kvm-libvirt-pool 16 16
/ Q' B5 j$ j5 _, w, d( Jpool 'kvm-libvirt-pool' created
! \- u5 a( \& c$ ^% L3 Q$ i# ?# ?- }4 ~& R+ @$ G: [2 g
2.将资源池初始化成RBD类型
) g/ ^: J" L! M5 Z9 N- g& A) `* x[root@ceph-node-1 ~]# rbd pool init kvm-libvirt-pool
3 p! J  |/ w6 }5 ^0 z: |+ i
- w! o0 c, Y, H+ y# Z2.2.创建用于KVM访问RBD块存储的用户
  |9 ]8 Y$ I' v" v0 T[root@ceph-node-1 ~]# ceph auth get-or-create client.kvm-libvirt mon 'profile rbd' osd 'profile rbd pool=kvm-libvirt-pool'
' z( v. N. @0 }9 B7 l2 A[client.kvm-libvirt]
- r- ?. L/ y0 j, n% Y5 ~+ y        key = AQBaK2BinaBzJxAAO8GmydNxxxxx2BUFhdw==
; F* |0 t9 n" I; n' X# t3 |" c, |  ]2 V! s- L: b' w9 ~5 M, S( h
2.3.创建Qemu卷
7 G7 }! V3 A8 I6 E1 w[root@kvm ~]# qemu-img create -f raw rbd:kvm-libvirt-pool/vs-centos-1-data.img 500G
& t- T( X$ c3 m. ]% l& i5 g: AFormatting 'rbd:kvm-libvirt-pool/vs-centos-1-data.img', fmt=raw size=536870912000 cluster_size=0
( y( W. u3 E& V  k7 z. A" `0 Z% l4 r2 r
[root@kvm ~]# qemu-img info rbd:kvm-libvirt-pool/vs-centos-1-data.img
$ C7 c2 Y2 ?- B- t/ U$ yimage: rbd:kvm-libvirt-pool/vs-centos-1-data.img
( h# r$ w/ R* M! L+ g& cfile format: raw
( d/ k1 c0 e6 w) Ivirtual size: 500.0G (536870912000 bytes)
, ]- ^; _3 B* `4 }6 _$ f) ]" bdisk size: unavailable
! C& j5 h, n( T0 `- @6 S& S2 B, z, S) m1 g6 z1 j% {. V3 N
2.4.将Ceph的认证用户写入到KVM的Secret中: g. f2 b2 C9 R" ~4 T( I
首先将认证用户的名称写入到一个XML文件中,通过virsh命令的secret-define参数将带有用户名称的XML导入到KVM虚拟化中,此时会在KVM中生成一个Secret,每个Secret都有一个UUID,这个UUID可以理解成是Secret的名称,此时Secret中已经有用户名的信息了,最后再通过secret-set-value参数将认证用户的KEY写入到Secret中。6 ]0 ?5 ^2 o9 \) M* F9 C, I
2 A7 Z8 A% [4 I1 G4 E
用户名称和Key都写入到Secret后,虚拟机在连接Ceph集群时,直接指定Secret的UUID即可使用。
6 S% w3 @) _+ |8 _- j8 b
" K, \( C# C7 `) t# K2 J. E+ O1.编写带有认证用户名称的xml
* p1 z3 P4 Q7 R1 [% ?[root@kvm ~]# cat secret.xml* o0 C7 z: j- x$ l6 ^  ~& N
<secret ephemeral='no' private='no'>
& k$ V; Z  ^7 s1 O- e        <usage type='ceph'>, Y- r2 X& b" X! `. K
                <name>client.kvm-libvirt secret</name>
, j0 v$ U$ ]; P$ U2 u1 t# _        </usage>1 l, Y, f4 H6 \/ S. }  J9 T
</secret>* d' H7 R) [8 V2 ~
#name中就是认证用户的名称
; ~& V3 q" K  A8 Z+ h0 ^0 `- [* U8 a% m) ]: ]* l
2.将认证用户的xml文件导入到KVM中生成一个Secret6 Y" K/ z' `" r8 E# `
[root@kvm ~]# virsh secret-define --file secret.xml $ R1 x2 S% O; s' \
生成 secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82/ z- ?  f0 k# A! r+ f

4 R3 H2 J0 }5 r2 P7 i3.将认证用户的Key写入到Secret中
8 A2 r. H0 d# q7 X' R: @4 B[root@kvm ~]# virsh secret-set-value --secret 66d9bec3-cbd7-4161-9614-1d0bc81c5e82 --base64 AQBaK2BinaBzJxAAO8GmydNIxGc2fVn2BUFhdw==
9 C6 R# _6 v- m1 L: d' p& @+ Ksecret 值设定3 c0 z& I6 J8 `9 d- V: j
#--secret:secret的uuid
# e3 G/ I" J1 Z$ u! l#--base64:用户的key
7 U6 s! I2 D# M0 d# p5 n' Z9 O, w$ z% b% G) {- t; h% R- N3 M9 `
4.查看生成的Secret信息
% P7 A2 p* n. x) w[root@kvm ~]# virsh secret-list
+ w  j- N- a( R" N# P9 F UUID                                  用量; \( g+ v+ D3 ]. w( j6 A9 Y/ W
--------------------------------------------------------------------------------
& ^; ~: d# U# Q9 d8 J2 W 66d9bec3-cbd7-4161-9614-1d0bc81c5e82  ceph client.kvm-libvirt secret/ u' N& a" y+ E  a; ^
[root@kvm ~]# virsh secret-dumpxml 66d9bec3-cbd7-4161-9614-1d0bc81c5e82
8 U6 m. k) d0 A4 q& r: W2 H% _<secret ephemeral='no' private='no'>
1 {) t( Q- _4 r& x" Q  <uuid>66d9bec3-cbd7-4161-9614-1d0bc81c5e82</uuid>
$ L9 u7 k3 @! E! d  <usage type='ceph'>
3 v* Y8 @/ F9 O; Q# {2 Y- P& Q    <name>client.kvm-libvirt secret</name>: L" T; G# k  f8 g0 V( @
  </usage>& V: B2 O. N  n
</secret>- X& Y# w9 j. [' O: R" T

/ s6 b0 V4 V: v5 e" E) @% Z& y: ~2.5.在虚拟机中应用RBD块存储中创建的块设备
/ _" b: ~1 Z. v$ u" `需要编辑虚拟机的配置文件,在配置文件中添加新硬盘的信息,添加的硬盘就是Ceph RBD中Qemu创建的卷,也是块设备。
! n. ^  r# m' ~2 f
! t8 a3 D) \! y$ S* F3 @1)先停止运行虚拟机% R1 B" y6 Q/ b( r
& t, @% O* G1 r
虚拟机添加硬盘需要重启才能生效,可以先停止运行,添加完硬盘后再启动虚拟机。
& S8 L, a& J, z+ S4 J1 v
# V2 |" y" j! X  {( H4 D[root@kvm ~]# virsh destroy vs-centos-1 $ u/ j* {" X2 ~" J( n' G; x2 P$ R
域 vs-centos-1 被删除% S8 d+ Z8 r4 R. S- J7 N- S7 w# O
5 d4 F! S- [4 w) W
2)调整虚拟机的配置文件增加硬盘' {" D2 K7 h: H9 \& F9 `
" x* X. M, e; q2 X# d
在<devices>模块中添加一组<disk>,<disk>就是用来配置硬盘的信息。
* H0 ]$ f: t: g# w. k: q
' x& v/ V1 f) I7 q' A, y在<source>中配置硬盘的来源,我们是Ceph集群的RBD块存储提供的硬盘,因此在protocol中要填写rbd,name中填写块设备的名称。
8 A" I0 l# T) S! @$ n2 X" @) d' _) ^9 b. n
在<auth>中配置认证用户的Secret,在username中填写认证用户的名称、uuid填写secret的uuid。+ m% e) J5 E- _2 D- c/ k
0 z" {4 K! M: l5 [
[root@kvm ~]# virsh edit vs-centos-1
, ^; J6 _2 F. W. b3 h( g    <disk type='network' device='disk'>7 X/ z1 V2 Z8 h$ L* X
      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-data.img'>
# Q: x0 a. T7 J) P           <host name='192.18.0.20' port='6789'/># r) P6 e& b- w; _1 k$ T9 e
           <host name='192.18.0.21' port='6789'/>% y7 e  X+ q$ {- N
           <host name='192.18.0.22' port='6789'/>. N4 D8 }5 P/ ?# f: V
      </source>5 i3 q9 i0 T+ x
      <auth username='kvm-libvirt'>
1 N& ~' `) o" P: q% C           <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>- n# Y+ F8 D. @9 t0 Q* ^- e' v9 A
      </auth>% n2 n- a! w/ v( a% b
      <target dev='vdb' bus='virtio'/>
8 M( C& l9 Q1 T) |8 K6 R    </disk>: K9 I+ D& q0 o9 v7 a! f
0 k9 t/ S  Z) g4 e
+ B! N- |+ A9 I, A/ f& t( t; w

2 L- \) [# ^% N) s) e3)启动虚拟机观察硬盘是否添加成功
" z3 J# p" ^& \8 A- F4 X5 l+ U# y" ?
( C! L# a2 E* n5 L4 ?7 C2 }两种方式可以查看虚拟机的硬盘,更倾向于后者,清晰明了。* O5 H5 `. {/ ^% O# Z- m8 O
) [0 i) P' E3 ?6 O  B4 Q7 t
[root@kvm ~]# virsh qemu-monitor-command --hmp vs-centos-1 'info block'
: ~2 x9 o* v1 o) a+ B) Edrive-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
. N. f  K6 I0 ^. w0 Q! ydrive-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
+ ~  t# V6 d6 b# Fdrive-ide0-0-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]4 z) e; w/ w6 I. A0 j; H6 w  D

+ l- S) |! c) K9 w  `1 V0 z: @[root@kvm ~]# virsh domblklist vs-centos-1
  z5 v7 V$ g) J! @/ `- E: g目标     源
% d! U9 h) l3 }" y" i1 {3 J------------------------------------------------( [9 T) g, e0 w1 }
vda        /var/lib/libvirt/images/vs-centos-1.img- k2 a" E! ~8 u; W) X" t8 F
vdb        kvm-libvirt-pool/vs-centos-1-data.img
- S/ J' v7 m" J2 C- B! A5 }% }' G+ ohda        -( z4 d- X0 E9 x

# X% E5 B2 _* o2 M$ S3 o2.6.虚拟机使用RBD块存储提供的硬盘
% ]: k  x* v6 f4 s: S. Q' lRBD块存储提供的硬盘已经挂载到虚拟机中了,下面进入虚拟机中使用该硬盘。5 D  c  _8 l  o- x, y7 X" ~
+ I+ j" ^: f3 F# _" b1 B
由块存储提供的硬盘建议不分区,直接将整个盘进行挂载,后期扩容时非常方便。
; w0 I3 H- O! @; [+ W+ Y9 A7 w+ Y/ r0 z& U9 b8 g/ c; A
lsblk3 O! Y5 }- d! a  F0 ]9 r$ T3 y, Y
mkfs.xfs /dev/vdb& }7 H) ~$ b- |0 ~" `
mkdir /data3 _5 y( j" g& {# M
mount /dev/vdb /data4 [" x; M: l! l0 [, L
df -hT
* c$ _) m9 R! i. R8 g6 Ecd /data2 G7 W3 e1 p/ k+ ~( P, T3 C) E3 M
touch file{1..5}.txt$ v" b0 Q! K) [* K. Z+ A
ll) W, x4 h- R0 U2 }6 N) G1 S# ]

: K1 |9 i! O* _( ?0 m8 h9 P. D0 B, F2 ~0 x
此时KVM虚拟机已经和Ceph集群的RBD块存储对接完成,由RBD块存储为虚拟机提供硬盘存储数据。  R2 m& V/ x2 S; l1 F8 E/ @

* B/ n' T2 F- n9 L- ?; E; E
8 l. i$ L0 z  {& k
" ?& S3 S$ w  a6 @- ~2.7.RBD提供给KVM虚拟机的硬盘扩容方法
6 X7 G4 r9 y, H0 t$ `1)扩容RBD块存储中块设备的空间* l5 D, \* A3 C1 b# z6 N

: V, l# S7 c% A  }/ k2 \( K' S. |8 {) Z* u将原来的5G扩容到7G。5 ^7 n( T# k- `1 _
* ^; q: x+ t: v8 u5 J" x
[root@kvm ~]# qemu-img resize rbd:kvm-libvirt-pool/vs-centos-1-data.img 7G: ]0 J3 x! D8 X4 x1 m
Image resized.
) }0 y3 L5 t5 Q. q. Z
/ i& S( |4 N0 E( r/ M$ l; m2)重启虚拟机. A" e, Y4 N: o  [/ E; z3 p# m
( e/ s: {3 g+ n* v% `0 P: n" \
KVM虚拟机硬盘空间扩容后,需要重启虚拟机才能识别到扩容后的空间大小。$ A5 |" m& c! m1 a
3 ~7 `8 B% |: M) U0 B: r
[root@kvm ~]# virsh destroy vs-centos-1
, |2 o5 ]5 E3 e: a2 L/ m域 vs-centos-1 被删除
% f6 C, m& d0 m, T% L/ k, q* {5 C( I
[root@kvm ~]# virsh start vs-centos-1
/ V5 a6 q; W4 L# I9 w9 w域 vs-centos-1 已开始
5 o8 K+ @% s9 `2 F: Y, p7 g$ ]9 Z0 X1 i$ J  u7 p, S( @. _7 w# w
  K, A' \, o: S! i+ ~9 F- r
3)查看硬盘空间是否生效4 I* v  z+ K6 h5 l/ O7 {
; @4 f: e5 X$ p; u; V% z
磁盘空间已生效。
/ z+ G3 ]+ ?& k" r0 G' q. Z
, i; o8 s% O5 B' z+ N! q" f2 |5 h! ]% L3 P, D8 }4 k- n

' }- q  Y: |$ |, m0 J+ J7 g+ I) z; R( u3.将现有虚拟机本地的系统盘迁移到Ceph集群进行存储  F! H( Q  g/ C2 ^# k5 P) Q: K, {7 U
首先将本地的系统盘导入到Ceph集群的RBD存储资源池中,形成一个新的块设备文件,然后来编辑虚拟机的配置文件,调整系统盘的信息即可完成迁移。
/ R, q8 Z" }) k0 p  ?+ o
4 K6 l$ f8 X' q+ F% G0 f* A3.1.将本地的系统盘导入到Ceph集群的RBD中0 Q3 |7 U; [5 j) J4 \8 v
命令格式:qemu-img convert -f qcow2 {本地数据盘路径} -O raw {rbd存储资源池块设备路径}2 \6 `- \3 O, u! ^3 z+ W: A

# i! ^, a5 h. g9 P1 q' E/ A[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" b  B8 Y% f5 e" X6 o8 d
; Y; D4 M3 l9 Y! c9 [6 e% H
查看导入到RBD块存储的系统盘。2 p) u- T" v& h, I: h, w+ u

0 O& j. [, f0 x# _[root@kvm ~]# rbd -p kvm-libvirt-pool ls
' j. i0 M; P$ Y  cvs-centos-1-data.img" X6 l# A3 u6 c8 n7 z
vs-centos-1-sys.img
) N2 x5 i% R/ W' a+ K6 @! ~) v; z4 V" {) s5 ^  ]- d9 z
[root@kvm ~]# rbd info kvm-libvirt-pool/vs-centos-1-sys.img2 Z/ z' |7 m% ]: r5 k! _5 Z1 K' u
rbd image 'vs-centos-1-sys.img':
* h/ ?5 u6 [6 N! y. A! X* g7 \        size 10 GiB in 2560 objects
$ c3 U. G8 v# R2 W( o% ]' [9 F        order 22 (4 MiB objects)
7 U1 I) O/ }1 m" h+ l! a        snapshot_count: 0+ I. Y8 x0 L  b: d/ N
        id: 19a5d559f577b
6 u" }' p) x/ Y! u+ O        block_name_prefix: rbd_data.19a5d559f577b
9 [2 ^; }% j8 [" D: @        format: 2
: T. W$ |& t! T9 z( g4 p        features: layering" `$ A! U% U3 {' ^2 x; x1 J& z
        op_features:
, e+ e" O) [! e5 c! y        flags:
0 H& W0 S! o/ U4 f2 [        create_timestamp: Thu Apr 21 13:06:56 2022& f# k; i2 Q# X' N; d& C- n
        access_timestamp: Thu Apr 21 13:06:56 2022
. [5 c- d) g& p" l4 O" D        modify_timestamp: Thu Apr 21 13:08:58 20224 F* }$ h0 O, H% N1 M
# ?2 ?& ~" A6 r2 B
3.2.修改虚拟机的配置文件调整系统盘的路径* J# H# y" l# l* v0 g5 [1 R
直接将现有系统盘的配置信息修改成下面的内容。
- [$ [$ g, @; Z8 y; B* j0 ]2 O/ i6 c. [* m- s: X* e6 R
[root@kvm ~]# virsh edit vs-centos-1 - d- ~3 U# g: Z
    <disk type='network' device='disk'>
6 r( m5 T4 @9 s3 c$ S1 M6 @. `      <driver name='qemu'/>. u, [+ n$ u; c5 f" K
      <auth username='kvm-libvirt'>
' C: {; P& l% Y8 M% s; |        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>
3 ?: l( @2 A, A  e% k  x      </auth>
* X% L, k. a6 @: a      <source protocol='rbd' name='kvm-libvirt-pool/vs-centos-1-sys.img'>
- U, T' K2 f& p' l        <host name='192.168.20.20' port='6789'/>$ T- b4 h! m  P
        <host name='192.168.20.21' port='6789'/>
" x( n/ z/ A! n4 n) o        <host name='192.168.20.22' port='6789'/>% Y6 D0 T; r' |1 r0 A+ E
      </source>
7 O2 ^+ j! b% c+ t      <target dev='vda' bus='virtio'/>
  X4 [. j* Y& _; J" K- U    </disk>
) s" N3 a2 E' @6 _8 @! {8 D
4 T. z+ ]% i1 Q5 F0 _  R! W5 {' F: u3 R1 m$ \- T1 T9 t
! D7 Z, q- Y6 b. {& _" ]
3.3.重启虚拟机
+ p  j8 s( ?9 t1 t5 z5 Z[root@kvm ~]# virsh destroy vs-centos-1
: s0 ]$ ~" l; B' C  i4 R域 vs-centos-1 被删除
4 A. l3 K9 O) h  P: B4 P# H% H3 ?5 P1 N$ o. t( I/ R
[root@kvm ~]# virsh start vs-centos-1
* }, E: m" d% D7 i1 I2 B& Q  h! |1 o域 vs-centos-1 已开始
! B/ X$ ~) v6 K# M. }7 u) L! |3 g0 n! ?& R. e9 _7 ?7 i7 |
3.4.验证虚拟机是否可用
6 T' T5 o6 v; g) u安全没问题。
6 i* x/ I- o4 _& x& Q, p2 d$ u2 O1 g, B0 O' }9 m- E6 Z2 z  L; W
9 R" ~: \5 H' T+ G4 W' N
, R: E' g' A8 X5 Y  F% [0 j
4.实现类似云平台秒级部署虚拟机) r9 t8 p- \# g$ R
在很多云平台中,例如阿里云、腾讯云等等,都是秒级就能够购买启动虚拟机,这是如何实现的呢?其实很简单,本章节就来实现如何在云平台秒级部署和启动虚拟机。5 F; m$ ?  J, F0 u( [' v

5 i5 K/ k( {: N8 B& Y7 `  F9 J秒级部署启动虚拟机实现非常简单,其实就是将一个已经存在主机操作系统的块设备创建一个快照,并将快照启用保护模式,每当需要部署启动一个新的虚拟机时,就在快照的基础上创建一个链接镜像,链接镜像也相当是一块块设备,虚拟机会去应用这个块设备文件,从而完成虚拟机的快速部署。
! L5 \" t  ]% V' ^( {- ^) P* o6 q+ u  G' `+ e( U! \
如果快照丢失,就意味着链接镜像无法使用,从而导致虚拟机无法运行。2 Y, ~/ E6 P4 s& P1 y& ~* W1 \" q$ r6 Q7 D
6 c! @( I$ ^! Z" z) R, w
4.1.将现有虚拟机的系统镜像块设备创建一个快照3 L* Q8 l" F# [0 |: _9 l
将系统盘对应的块设备创建一个快照并设置成保护模式。0 Q3 ?0 Z; ]0 V4 w6 m7 A4 e

/ w1 t" K: M. l, L6 q: {- f! D# ][root@ceph-node-1 ~]# rbd snap create kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
# U. n/ m3 I/ K$ e5 z[root@ceph-node-1 ~]# rbd snap protect kvm-libvirt-pool/vs-centos-1-sys.img@centos-template
2 D$ Y' b/ n/ N8 x5 R5 `2 v+ V0 G
& r3 o" F8 r2 a4 v& E4.2.为新虚拟机提供克隆镜像
7 P) \. J/ m3 l5 D6 N$ w  J8 |为即将要创建的虚拟机提供一个可以独立使用的系统镜像,需要在快照的基础上为新的虚拟机创建出克隆镜像,这个克隆的镜像就是一个块设备,可以立即开箱即用,挂载到虚拟机之后就可以运行出一个操作系统。) ~7 L5 r) g& t$ a" I+ B. Z  P

8 I5 ?/ N0 Y4 }* x9 W, G[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-1.img/ R5 w) U  I4 k9 P: t5 H) [3 H8 T( i
[root@ceph-node-1 ~]# rbd clone kvm-libvirt-pool/vs-centos-1-sys.img@centos-template kvm-libvirt-pool/clone-vm-2.img2 E# \1 {# p  ^5 B

# A9 O+ P. b# p: h& C9 O
% k3 e  M2 o* S. R! |/ `) H  o4.3.通过虚拟机文件准备多个虚拟机2 d! c* W: r, d7 |0 K' i8 \; i
KVM的虚拟机配置文件都位于/etc/libvirt/qemu/这个目录中,通过配置文件就可以快速创建出一个全新的虚拟机。0 W& K. Q7 U. f( \: v3 _6 c1 f

# |+ r8 z1 {: X/ j. q2 I( j9 C进入到虚拟机的配置文件目录,将现有的配置文件多拷贝几份,一个配置文件相当于一个虚拟机。9 C& [2 @. k- W6 X7 ]4 N8 v7 E, {

" w7 \" A( x& ~: t  I; l1 v[root@kvm qemu]# cd /etc/libvirt/qemu/- R( U# G2 d  K0 n( n# \& C
[root@kvm qemu]# cp vs-centos-1.xml clone-vm-1.xml
2 @9 X4 J' Q/ U+ }' B[root@kvm qemu]# cp vs-centos-1.xml clone-vm-2.xml! E! s2 A- L; P

; [% ?" |5 ?- C' N* |$ y' X1 y
3 b  U4 R4 `* S& W6 x4.4.编辑虚拟机的配置文件- B; A& l; V1 d; @* t/ X% w
在拷贝的虚拟机配置文件中将以下这些配置删除,否则会有问题。5 ~6 o/ S( ^) ~$ O: f$ M; S) _
/ J. v+ P7 _: t/ Z3 P$ b1 u" i7 ~0 |
<uuid>940a207d-a412-4f34-b1ba-c2ee8898f02b</uuid>/ I/ ^) N& L. }, ~
1 x; n" W! d! w, L4 d/ q
<mac address='52:54:00:eb:f6:97'/>6 f0 ]) g; S6 W; _' H

6 |' R: V6 y5 m<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
8 n1 j/ H7 e7 z& Y" y# E' }8 {! N0 v
; `8 Y9 P( ~, _4.4.1.vs-centos-1虚拟机的配置文件! ^+ ?% J9 K, g& w5 S* @: z% Y
[root@kvm qemu]# vim clone-vm-1.xml
/ ?- k8 D- n% n/ ]<!--
( ]. S% m. W3 I2 \- aWARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
8 N+ d* f+ c$ `% k; a; r% _OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
. m) m1 c6 {; b5 r6 E" ^  virsh edit vs-centos-1
2 h! A8 C1 Z- x7 xor other application using the libvirt API.
$ G! O7 m( m9 k-->: s! M( u( |: u3 {( G$ o2 m

: f+ N; y# F: ?# k: H<domain type='kvm'>
) C0 ?) ^' |0 x, i( x. R1 j% ]" C  <name>clone-vm-1</name>                                                                        <!--虚拟机的名称-->
9 ^$ k+ l% F& w7 J- K2 j  <memory unit='KiB'>1048576</memory>
+ M% X5 v0 \! c% ^4 g4 M  <currentMemory unit='KiB'>1048576</currentMemory>1 n+ i2 t1 o9 G& Y. S
  <vcpu placement='static'>1</vcpu>
9 y% k9 @2 v3 i" k  <os>
4 ?: B# X2 t( S' N$ Q: Y/ P* t6 a    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>2 H) t# h, {6 K# U+ M
    <boot dev='hd'/>
1 ^7 H* K# L; ?/ D( w. S  c  </os>0 k8 L% v! \$ y+ j
  <features>: X2 n- ?. z8 n& ^& v% }
    <acpi/>
& B1 |: G3 M4 `) ~3 a! V& z8 C    <apic/>
1 n7 k5 z, Y  o) a& \3 V% s  </features>
1 y/ y  I2 F, z  <cpu mode='custom' match='exact' check='partial'>
/ g5 z3 _' m0 u8 O    <model fallback='allow'>Nehalem-IBRS</model>5 M9 q& r9 W: W4 X  D* |
  </cpu>. a# [' G9 t, `+ B2 q( j& f
  <clock offset='utc'>, ?% e3 o9 p  N; V6 }; f
    <timer name='rtc' tickpolicy='catchup'/>% @; l5 `& W( @0 S- N2 F
    <timer name='pit' tickpolicy='delay'/>8 |3 `# k- c+ N; x4 H/ N( ~
    <timer name='hpet' present='no'/>' {8 Y' }# M; i) j) L
  </clock>% }# t$ z% G8 Z& D
  <on_poweroff>destroy</on_poweroff>
- m0 Y. N/ r, ^+ h, H" W2 ]  <on_reboot>restart</on_reboot>
% o  D* S, |7 t6 y- b0 r6 b; j  <on_crash>destroy</on_crash>
4 \5 T2 f+ z5 H8 }  <pm>7 u: f( D- o$ R; v/ B3 v
    <suspend-to-mem enabled='no'/>
# S( W% C5 I. h" m/ Y. g+ C    <suspend-to-disk enabled='no'/>
4 U, H6 N: y" w* J9 [0 j  </pm>
! A6 S& Q4 j& _, \0 _3 y  <devices>5 N- M" u# |* |" o, p$ ~
    <emulator>/usr/libexec/qemu-kvm</emulator>
4 h" V& {8 E$ {6 u2 P0 c( @    <disk type='network' device='disk'>2 y7 g6 g9 }6 k
      <driver name='qemu'/>! ~) Q/ O. r  e# M$ _
      <auth username='kvm-libvirt'>
: O' a- I) e7 {$ i1 g7 B        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>) {( I& e& H* F6 X
      </auth>( P! E9 ~- m0 ^9 I& G$ }6 L
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-1.img'>                        <!--填写克隆的系统镜像块存储路径-->+ {$ `) c9 S8 `# [: g# T; D/ t
        <host name='192.168.20.20' port='6789'/>
7 h/ G* u* P) G3 h0 |0 n1 p        <host name='192.168.20.21' port='6789'/>
+ l( R8 t3 l& j3 u7 Q( R        <host name='192.168.20.22' port='6789'/>( F+ v" e1 n- D9 i
      </source>
2 g) E$ n6 r% G! h  S8 o! r' G      <target dev='vda' bus='virtio'/>) @( {/ g6 O" f2 Q" _% O+ K
    </disk>
. M. D2 |/ G% \2 t" t3 O+ q) X    <disk type='file' device='cdrom'>
9 f3 j' W3 ?2 @: D  E* i      <driver name='qemu' type='raw'/>. r; y2 @- N" A
      <target dev='hda' bus='ide'/>4 F4 a, N! ~5 x3 u% E$ X8 i; z
      <readonly/>
: N* c# L- ]" S5 v: _      <address type='drive' controller='0' bus='0' target='0' unit='0'/>  |2 @9 u9 A: f2 k7 V* y
    </disk>
3 v. J1 G" ]2 H1 D$ W6 E    <controller type='usb' index='0' model='ich9-ehci1'>
/ ~- R7 G* L# F      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/># Q  W- Z/ S8 U
    </controller>
/ W2 G' s# w  R. n    <controller type='usb' index='0' model='ich9-uhci1'>8 I  F: [) r/ e( z  L  t. J4 V# \
      <master startport='0'/>& j  N( L! s8 K$ D6 z, d0 V
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
8 G  v- `# g5 Y: I) Q    </controller>$ Q: ]$ r9 O1 z& V9 A: q
    <controller type='usb' index='0' model='ich9-uhci2'># |* ?; J7 ?; {/ K. n2 L
      <master startport='2'/># f. b4 N3 ]: }7 M( p# a0 R
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
6 D  N9 G5 x$ ?; O    </controller>
" o3 o# B+ B+ b, Q    <controller type='usb' index='0' model='ich9-uhci3'>7 l4 U" p! ]2 B# W7 N. A
      <master startport='4'/>
8 x7 P% N9 ?5 Y+ U/ \      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
  @, O: z% e! ?2 {$ r+ ~+ Q    </controller>
. c  x: a! J+ h) Z- [    <controller type='pci' index='0' model='pci-root'/>
* W/ p. {! z' ?! x+ {, s    <controller type='ide' index='0'>
# l6 L4 u# X1 l3 `$ w      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
& [* [4 a6 {9 `8 t0 R( w    </controller>
9 e- |- |! g- L3 m5 N0 I6 S8 q    <controller type='virtio-serial' index='0'>
& P8 W" g! N/ s* ]8 U9 @- Q: L      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>$ h% O/ r0 a- J: |6 l4 y# z( ]& v9 O
    </controller>1 F# C! [  ?5 x4 J5 F& c) o
    <interface type='network'>) e( r; }/ \0 p' A/ O1 U! F$ m
      <source network='default'/>
5 g3 S3 M" T. j3 G      <model type='virtio'/>" V# ?) Z* g' c8 H" l
    </interface>
* K- J+ I$ U$ h+ @. k! G0 `    <serial type='pty'>/ ?. ]1 e5 \5 e3 p' h  v5 e' y
      <target type='isa-serial' port='0'>
  Y, H% ]5 G5 m        <model name='isa-serial'/>
: w* i9 H2 h5 k- l$ O8 ^% E3 q      </target>+ F6 `* T* r: X/ r/ }$ B+ r* R
    </serial>8 D' H. r3 K$ R' m
    <console type='pty'>  N: N/ C& X' C5 z6 t
      <target type='serial' port='0'/>
+ @3 N) _* @- b# M0 T- A' L  S8 o    </console>
) O6 ~7 F. z' L1 v( a8 J( }    <channel type='unix'>
+ a: G4 W: ~# K  _      <target type='virtio' name='org.qemu.guest_agent.0'/>0 h7 S; t) H9 S$ y3 [
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
2 _) v; v! A  G$ o% O2 Q+ J; [    </channel>8 Q/ Z- ?3 ~: D; S0 W
    <input type='tablet' bus='usb'>
* W4 l( v" u( ?6 x! _. Z      <address type='usb' bus='0' port='1'/>' |9 @5 c, }9 O2 i* |  {# I: J
    </input>
# F% L. a8 q, }& t& B9 X; T    <input type='mouse' bus='ps2'/>
' k) R, Z$ {) k4 B1 O: J    <input type='keyboard' bus='ps2'/>
9 {$ \5 h- ^0 |1 Y3 ]/ m/ V& N    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
" e. X2 P7 O  Y, V$ A      <listen type='address' address='0.0.0.0'/>
4 P5 g$ q6 T$ p4 q% X8 @    </graphics>
: Z1 ]5 T5 j$ b! I& m    <video>
, ?8 y% l% K1 S* Z% R0 _      <model type='cirrus' vram='16384' heads='1' primary='yes'/>: _! U9 h! j1 e. g' @
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>1 D  |( I/ y0 t* O2 l% y* o
    </video>
: k6 y: U' z. E+ F: S& Z# H" X7 }' ^    <memballoon model='virtio'>
4 Y. u$ k1 n( Q! v+ A% M" Y      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>) M" t/ _: E0 r
    </memballoon>/ y8 t( Y0 X$ v3 ]3 z
  </devices>/ G3 Y# D0 K* T7 b" ?- v- o
</domain>
1 g$ A$ n+ p2 @/ J
2 ?3 E6 S: ]" Y5 n8 \- L4.4.1.vs-centos-2虚拟机的配置文件7 O; ?6 T8 h9 w# e. O
[root@kvm qemu]# vim clone-vm-2.xml
  \; p# D" M0 j. H<!--2 v5 A3 ?/ b# @% h6 ~/ B  }  F
     WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
: |% o9 v9 b, xOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:) \6 u) Q' J3 U& v" O9 d
  virsh edit vs-centos-1
6 p7 [+ D4 r3 g  E% Ror other application using the libvirt API.
7 i. s9 a! z$ \8 [& W-->
: W: o  x8 R: `- m. T* l8 f, p5 u1 x% g9 d; @4 [
<domain type='kvm'>
; ~3 b5 v# L* Y6 p& ]0 e  <name>clone-vm-2</name>                                                                        <!--虚拟机的名称-->
0 a1 v! g, g0 u3 l7 t" M  <memory unit='KiB'>1048576</memory>
) l0 z7 Q# l3 G/ t3 S; @1 W) ]* H  <currentMemory unit='KiB'>1048576</currentMemory>
, f- b4 @1 c5 K# e% o& x4 j7 K2 w  <vcpu placement='static'>1</vcpu># P# ?, a# \! E; C
  <os>
* G7 I2 P9 C$ |( U+ Y6 b* H    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>* i: s, n. ]- j0 n& I0 d
    <boot dev='hd'/>
# y# H2 F- P2 [, [9 m. w2 `  </os>
( V& N! W4 W% [" ?: I3 ]  <features>0 x4 E" P, S% t
    <acpi/>
9 S4 {5 Y. L$ H4 b    <apic/>
" ]+ {5 N( M4 n, d/ `0 T4 O) g  </features>
/ d5 C( S- A& x' f4 j  <cpu mode='custom' match='exact' check='partial'>
; U: U. j# k' r6 i/ \! P    <model fallback='allow'>Nehalem-IBRS</model>, V: J! N/ ~" c4 G" C6 e
  </cpu>
1 d* F4 |2 O+ V  <clock offset='utc'>
0 a) Y8 D% m' `* i$ ?3 ^% c4 B    <timer name='rtc' tickpolicy='catchup'/>
- [. e8 V1 x6 T) Z; ?# U# E    <timer name='pit' tickpolicy='delay'/>( L# s* s! a* m- r
    <timer name='hpet' present='no'/>( X/ e4 j  G9 b; i* a) u
  </clock>
/ e' E/ J) v! g# a  <on_poweroff>destroy</on_poweroff>$ d% m' F& T+ K' @  b
  <on_reboot>restart</on_reboot>8 _% J8 ?- t( u0 @) g: x! _2 z
  <on_crash>destroy</on_crash>9 |) |) [3 F+ x  {: s5 L
  <pm>
# X* B; [' x8 g8 F: y1 N+ B$ B    <suspend-to-mem enabled='no'/>! ]' @6 G: X# {( e. y
    <suspend-to-disk enabled='no'/>  c% }& a) B; R4 l  \
  </pm>) E2 z" @5 ~9 D/ V
  <devices>. {$ z8 M) }4 @. w
    <emulator>/usr/libexec/qemu-kvm</emulator>
6 t6 A) l/ b4 p4 A' j0 `* u    <disk type='network' device='disk'>
4 i3 o7 G+ B) ?$ b, f! H3 E      <driver name='qemu'/>
" g  F, `4 K- K; `/ @      <auth username='kvm-libvirt'>( W8 e9 Z% J2 F6 D+ g; F7 ]
        <secret type='ceph' uuid='66d9bec3-cbd7-4161-9614-1d0bc81c5e82'/>8 W7 L( d1 W2 U, h* |
      </auth>8 d- w' O9 ?) u
      <source protocol='rbd' name='kvm-libvirt-pool/clone-vm-2.img'>                        <!--填写克隆的系统镜像块存储路径-->0 ~% v$ P3 T; O
        <host name='192.168.20.20' port='6789'/>5 j1 X' t( }/ a' f% u! f7 Q
        <host name='192.168.20.21' port='6789'/>- G1 I' z9 `% ~, s/ c
        <host name='192.168.20.22' port='6789'/>
1 U  P0 W5 x- [4 h5 c5 R6 f6 C      </source>
/ p. Q) }( e- u( y) c/ q      <target dev='vda' bus='virtio'/>
% Y5 C7 A5 Z4 F- x# ]5 _% q. y    </disk>* O( n1 m$ r. l
    <disk type='file' device='cdrom'>
5 S0 N8 y8 |" k" \! y      <driver name='qemu' type='raw'/>
$ [4 y  H3 n* q5 t7 M9 C3 e      <target dev='hda' bus='ide'/>1 R- \  e. I2 r% s
      <readonly/>$ c& v6 C2 p4 u1 e5 f9 s
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
4 x7 |/ H& Y% d* l9 H    </disk>; A7 d6 f6 q" U. Y. r
    <controller type='usb' index='0' model='ich9-ehci1'>
/ l1 ^5 A' E$ X' A: @9 ^+ F; {      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
8 u/ H  j5 Y4 D3 K* c( H    </controller>: ]+ t9 E  m2 N* c
    <controller type='usb' index='0' model='ich9-uhci1'>
, ]; P' j9 H( e, Y3 U      <master startport='0'/>
1 x* S6 _# d) H      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>' q2 L6 S0 N4 v. y; {
    </controller>( A5 c$ Z- ?% K' f
    <controller type='usb' index='0' model='ich9-uhci2'>
+ }2 k) C/ e" c# K1 r      <master startport='2'/>
* K+ ?# r0 C* R+ }! K) u      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
9 h8 g  c) |# q/ g, H    </controller>
" ~; ?# g! |' R8 J6 n5 E3 o% |$ B    <controller type='usb' index='0' model='ich9-uhci3'>" I$ t- X2 X0 v9 r$ a8 T/ x; T
      <master startport='4'/>, x' c' i  F) f) l& V3 a8 `  W7 x
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>' j  G& n1 y7 l& J
    </controller>
  ^1 O- d$ h& q, z& k; G2 ?    <controller type='pci' index='0' model='pci-root'/>; F% y) `7 j$ f& N
    <controller type='ide' index='0'>
+ ^9 [9 G$ y- b: u$ E      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
9 `9 f. Y0 w1 F5 M; @7 ~    </controller>
9 n' L0 ?2 q5 b0 n: J  w% Z# Z; Z    <controller type='virtio-serial' index='0'>) u5 Q/ _, i  u4 p
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
8 c. d) n2 [) h1 U: J2 o    </controller>$ W1 M  v7 @/ `! B
    <interface type='network'>9 O8 r" Y# o: m% O( N
      <source network='default'/>
2 l8 ]; _& G! k# |1 `+ y      <model type='virtio'/>4 d0 M: d9 k$ c. H' h; `
    </interface>
& b! V2 N3 Q" l& {! e+ J; V4 E    <serial type='pty'>+ s! I" G1 L5 L
      <target type='isa-serial' port='0'>( ]& S5 F/ ^+ E! G' j. N4 r3 F
        <model name='isa-serial'/>
' u+ n$ B: o! V3 R      </target>8 |3 c$ N( }8 x2 \: g
    </serial>
0 Y2 Q- f+ i5 X+ ?7 v+ f( R    <console type='pty'>1 a- d0 v9 z/ z  P8 q9 t+ `
      <target type='serial' port='0'/>
4 Y; V, k8 R, V0 z    </console>+ H7 k0 _/ f) M$ {' K5 F
    <channel type='unix'>; ~, M. }  U, U
      <target type='virtio' name='org.qemu.guest_agent.0'/>. s0 a  s1 ]/ r( I6 @# f4 N
      <address type='virtio-serial' controller='0' bus='0' port='1'/>1 G/ ~" d* d8 s. c
    </channel>3 ]0 \( _$ c* H8 c. N( o
    <input type='tablet' bus='usb'>
2 N$ e( i: A$ n6 ^. }9 ]) y      <address type='usb' bus='0' port='1'/>
3 z! e1 D/ C3 N( }* _    </input>  x! Z6 N  {& h' T! x6 j' B
    <input type='mouse' bus='ps2'/>
5 H4 R) h9 P6 a* @' I    <input type='keyboard' bus='ps2'/>2 U; _2 Z( s8 }9 c4 Z- j
    <graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0' passwd='123456'>                <!--修改VNC的端口号-->
) A: u; m$ A  C3 u/ z: r      <listen type='address' address='0.0.0.0'/>
4 n& y& i% W8 r# }! u1 L! Y& {% R    </graphics>8 F5 ?1 \$ q' E0 g( r
    <video>4 T" n6 ]# p6 \2 J' }/ E
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>' S  H% v2 W% D. [
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
( B& e6 x" l8 R. E, q6 F    </video>
* s7 S; ^4 b; m2 F    <memballoon model='virtio'>
& }  V/ ?9 o) H9 h9 k2 V      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
. i' C: }; ]  k+ [- ~+ h3 k4 [+ d% r    </memballoon>
- u- D  t2 s/ {; d, n  </devices>
% X; ^& f" J* b) ]* c0 `# }; f7 U. W</domain>8 t6 {- \3 F: V' I" x

4 T( I6 C# _! O/ S" S" X+ ]' H' A! q$ D! Q, u% m8 n% q
4.5.将虚拟机配置文件导入到虚拟化平台' ~4 Q1 u' N: W1 a% M
[root@kvm qemu]# virsh define clone-vm-1.xml , k( N2 Q% o$ a7 D3 v
定义域 clone-vm-1(从 clone-vm-1.xml)
# h" F+ s( X# d9 j# V) @# R$ ?* V  j# k7 `& \
[root@kvm qemu]# virsh define clone-vm-2.xml 2 ?' W  A4 `7 @' a
定义域 clone-vm-2(从 clone-vm-2.xml)
" l) M4 n6 e# q& ~  Y* ~% e- n+ `, X  x: J' e# e0 U. ]
2 c( E7 k1 Q0 c! A; @. a
导入虚拟机后,虚拟机并不会运行,而是出于挂起状态,等待管理员手动启动。
, j8 _& T2 ]% ?  M0 ^+ R0 ~3 p( h0 A, p6 Y9 o7 k8 P
[root@kvm qemu]# virsh list  --all# U% X9 D) B3 _( j6 Y. S
Id    名称                         状态
% N( u2 M* f5 r* b) J0 B8 J----------------------------------------------------5 `& ?7 s9 S3 R2 s
7     vs-centos-1                    running
. Q, i$ v; U* C4 @, P* j/ ^/ J' h0 i -     clone-vm-1                     关闭
) o: n0 t9 ?5 |- g3 J2 r -     clone-vm-2                     关闭
( i) ]+ c& ~, v$ n# v, L* s0 }9 b
% e6 m' _5 `+ P2 t% ]; O" Q' D& I4.6.启动虚拟机验证是否能够秒级使用
/ m6 b- O( f/ g0 m- k# ~7 \1 |[root@kvm qemu]# virsh start  clone-vm-1
6 ^8 v2 e0 [  a- K* v域 clone-vm-1 已开始' G, I8 K# {) P3 k: y2 x3 m
* J+ N0 T2 O( d8 O9 |+ L# U9 u- m
[root@kvm qemu]# virsh start  clone-vm-2
  I" q9 a9 E, P& e/ y6 V/ C域 clone-vm-2 已开始
2 T$ E0 f. G6 q. n6 F+ m+ {, r  o6 b, C3 c: w

8 O" Y& U+ D- S0 N3 |* O: U/ d5 j待后期更新。1 C* z) `5 K5 j1 {

4 g  A0 n; n, q- K# d/ ?* d  B9 Y% a4 a2 b! }6 r6 h5 J  \4 j

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2024-8-19 17:00:05 | 显示全部楼层
一、将客户端(宿主机或kvm虚拟机)和ceph存储进行连通" ?% i' h8 ]: _. c. `) m
+ g3 ~# R1 v! P( P# m
1.客户端安装ceph包:yum install ceph  或 yum install ceph-common.x86_64(yum search ceph查询包名)' Q1 X4 Y2 L. G' t) O7 l' e$ r
- ]. L" x: ~6 n) E. l, W3 r* _6 B
2.将ceph存储节点/etc/ceph目录下ceph.conf和ceph.client.admin.keyring拷贝到客户端的/etc/ceph目录下
4 F7 j& J/ ^8 K- b+ W( G3 ~
7 s. n3 o( V- \9 q$ `0 W, [5 ~$ Y3.检查连通性:在客户端执行ceph命令,如ceph -s,能看到ceph集群信息,说明客户端和ceph存储已连通/ W* ^4 X6 d" L! I

- w1 R, t& V8 ]( g二、创建rbd盘并挂载给虚拟机
2 v! K* m' H( w& C; |" ^3 ~
, Q) T! z0 K* q; C1、创建一个ceph user,下面的例子中使用client.libvirt用户和libvirt-pool池( m) S; G3 _+ P, p# q/ Y8 A
% J, E  p' v6 t5 Z$ u
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'0 J. S2 k- k0 I& e: e* n2 g3 d) E% H
' U; g0 V6 b4 o" Q+ {1 f
验证有效:ceph auth ls|grep client.libvirt
( R! `/ w. `" L# T( g' F, e6 X2 B& @, |+ K; O* e
3 E0 u5 G* v2 S  X; J
  I% Z5 R; Z0 r9 {# B$ ~
备注:以上命令,如果宿主机和ceph存储已连通,以上命令可在宿主机上执行,否则需在ceph存储上执行" A8 U* Y4 D. ^; O  s0 }, N
  |* y: M" _6 s! w9 W5 j
2.创建secret.xml3 e5 `. A4 `0 G  R3 x+ H0 i

- ~* ]( ^9 }; H" Y- F' n. Rcat > secret.xml <<EOF
1 u; F! x' L/ s5 Z6 Q* B) E
" a8 O6 \( v! A<secret ephemeral='no' private='no'>
& c6 F! G0 S3 O+ `/ F
+ I. a0 @4 w3 @! `* P7 Q! H5 N! i        <usage type='ceph'>) A! l: b8 R" {5 {, v! X
8 ~, ]+ ~+ U1 O0 ^) h8 Q$ b% F( T2 [
                <name>client.libvirt secret</name>
9 }# y% m) A, j# i, t$ X7 Y2 X5 i# C5 k  J( @2 C
        </usage>, Y& a/ D! s; l# M. m

6 J, B/ _% l2 q( N% z. E9 w/ p</secret>
) Y" K! {2 T+ I9 G& _8 {
1 n- a/ V3 b7 y! W5 P5 C$ a+ kEOF7 T" O( G& o# g: p2 t

* K) w! d- @/ C7 N9 d$ c备注:以上命令在宿主机上全部复制并粘贴,最后回车
9 e/ \5 L0 g6 Y2 M3 |
1 G3 |1 z3 Y' K3.生成uuid8 S3 _  y8 i5 h8 a

/ |( s3 ]' ]: }: X( s) ?- E- h2 U2 X/ hsudo virsh secret-define --file secret.xml
  r" p# \4 ?  b9 L$ p. v5 l' d! j2 k0 ]; {* ~# l6 ]- V
{uuid of secret}4 k+ B7 w0 K$ z1 m  t  N3 M" e

2 x0 g' {! k2 Z$ [7 C4.获取client.libvirt的key并保存到文件
: ~6 O) G# P& `0 P7 g* e. p4 i8 R0 [
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
- M( _( b- V9 j, y5 Z! W; A: r% P* l# T1 _2 b# h6 P2 M
5、设置secret的uuid- q3 g' `; T0 D' k# k/ S% p3 z9 G5 o

( p3 e- b+ O) Y) p  Qsudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
, r3 F& N$ ]# _' \# Z
! a! l5 h7 C  g+ i将变量替换成实际的uuid和key/ u, ^  c% c6 U. ?
5 [) e7 g' E6 p  ?) n
6、创建池libvirt-pool
. Y' z5 w( n% G3 u* w1 a4 b2 \! j- s
+ I8 d% u+ [. M/ t1 h, hceph osd pool create libvirt-pool 64 64
6 C0 e5 k! [' |1 a2 {+ b3 J/ h( L5 a2 n2 c: q- T7 y
7、创建rbd盘
3 K  L# Q. E; {8 S( x  c' C1 V2 y0 d! h. i
rbd create --size 10G libvirt-pool/test1 --image-feature layering
3 j+ [/ F$ N" O) _2 p& o( S0 x+ [- F/ {1 J& c3 V
查询存储池中的块:rbd ls libvirt-pool
, m* Y: `( R: P+ U( O4 h
5 \9 @* c: U4 g# ~" k1 B, W8、关闭虚拟机,编辑虚拟机配置文件,并添加磁盘信息7 f4 N0 K: p- j( x% D
# U( r' l7 C( ]4 \  Z
关闭虚拟机:virsh shutdown vm
+ c& }0 c- r9 e' @8 m/ n, w0 c
* L/ U  M, ^  j: m. E5 M* ?1 p编辑虚拟机:virsh edit vm
& {0 \/ f  ?4 c2 J' u2 b* H3 {' r/ J$ u
在disk标签下增加如下信息:
" w+ u$ V2 l& ^$ A
, t3 a( X4 M: M" _<disk type='network' device='disk'>
/ J+ q( _# q/ y, ]  K  I' ^. g4 o& I! ^
      <driver name='qemu' type='raw'/>
6 }9 A* T. L, n
9 m5 y  q  k7 ^# @/ \$ o      <auth username='libvirt'>
$ O( j2 H6 r! W6 J+ @8 ^
( z/ t" ]3 b1 C9 j        <secret type='ceph' uuid='{uuid of secret}'/>
3 B1 _( Q4 F1 e# ^9 s$ ]
) k# k& F. V. }8 A      </auth>% u* O3 h. ~" G% {$ c3 ]

% s% ?- @6 X0 A- |      <source protocol='rbd' name='libvirt-pool/rbd_name'>
3 P7 P+ l5 n7 f. ?
; c# C& w8 `/ _  e! z6 R        <host name='10.25.72.142' port='6789'/>, H/ |; Q# _8 p

" i8 v# E+ O5 H. l3 z4 Z, o2 p        <host name='10.25.72.143' port='6789'/>
' o3 J0 |, k: e  B# |. i% ^7 H
: s( k% @/ V! T+ c1 J- D8 v        <host name='10.25.72.144' port='6789'/>4 B) ~0 c0 x0 _: g' b) j/ M, K" V

7 x  h2 Y( `3 w' R      </source>$ B5 \2 X) m+ m( ?3 k

9 k  r1 T% G0 N0 ~0 A) ]; R      <target dev='vde' bus='virtio'/>: P( u# L5 H8 [* h7 D: _

, C3 l2 e5 _% r4 R    </disk>' X. e  s, {- R" r2 H3 \: D

5 l+ a5 |# J( G$ k- h5 b备注:2 I6 @/ [4 a- x9 }! p

( O7 ~& O! Z( G+ u+ \/ I# m需要修改上面5个参数:3 e9 B2 Z; a1 a' n6 Q
/ r; f$ W1 ]% e4 f
1)username是建好的用户名:libvirt
. m7 H: r. n9 H
4 _  g8 Z5 o( z2)uuid替换成第3步生成的uuid0 U/ c, x, G; D/ T1 q; F6 x

- G5 m% e& N7 Q2 C3 ^3)host name后的ip为mon的ip和端口7 ~+ \  N2 ~5 ?) Z7 R
% B+ r7 ?; o" O! }$ |: Y+ ]" J
mon的ip和端口,可以在/etc/ceph/ceph.conf中查看,可添加多个mon的ip
0 N( M8 z& z: A6 m
+ W3 e. ?+ l3 g+ E+ G7 T/ x
& w4 q7 _4 {5 F) B# z
3 n7 H' @) {; [4)target dev为挂载后显示的盘符,例子中是vde,挂载后显示的盘符是/dev/vde
8 m+ w. h: a4 y* O6 U' v) ?8 b$ I' X2 ]) P3 K( b2 z+ J. n
5)libvirt-pool/rbd_name是创建的rbd盘
7 G- `" |" z$ C* Q7 R1 B/ M4 \
  n) r. K: v: ], ], ?9、查看虚拟机挂载的磁盘2 ?& J3 p1 v; b. h, I% b" F

% Z; s- p, t+ W) o$ a7 ^virsh domblklist {vm-domain-name} --details
+ ]2 O  B3 j9 D4 X; f
0 O* f8 N0 o( Z) _10、虚机开机,即可使用挂载的rbd盘& N1 q, |) p8 B: J" r" |
$ p9 ~5 b9 J! T4 ]5 u
virsh start vm
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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