易陆发现互联网技术论坛

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

使用virsh的kvm虚机加载ceph分布式存储

[复制链接]
发表于 2024-10-31 23:23:02 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 3 金钱 才能浏览
 楼主| 发表于 2024-11-1 10:21:20 | 显示全部楼层
libvirt 库是管理程序和软件应用间的一个虚拟机抽象层。通过 libvirt ,开发者和系统管理员只需要关注这些管理器的一个通用管理框架、通用 API 、和通用 shell 接口(即 virsh )即可,包括:
( w) r" l4 s* G1 O6 l3 `- I8 }6 \' ~
QEMU/KVM% O/ h6 s$ A- B2 k7 L) i& r! Z) O3 E
XEN
$ v/ N& ^( C( ?* Y/ ELXC2 |+ y$ j9 I  b& A9 W6 ~3 M
VirtualBox  r+ ^5 x% \2 \3 n
等等: }8 w3 \3 N0 z# p: X! Q; ~  x/ B% L
Ceph 块设备支持 QEMU/KVM ,所以你可以通过能与 libvirt 交互的软件来使用 Ceph 块设备。下面的堆栈图解释了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。, V3 G( R/ f4 A; f$ v

* T; Q6 w9 i; N* ~" ^) `% l. k& s" d0 ~/ e' g3 _* |! r
5 w# Q( ~/ v) \* L4 k
libvirt 常见于为云解决方案提供 Ceph 块设备,像 OpenStack 、 ClouldStack 。它们用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再通过 librbd 与 Ceph 块设备交互。详情见块设备与 OpenStack 和块设备与 CloudStack 。关于如何安装见安装。
7 F$ V& L6 [  k
& Z/ M! |) U4 }) s! ?8 r/ D你也可以通过 libvirt 、 virsh 和 libvirt API 使用 Ceph 块设备,详情见 libvirt 虚拟化 API 。
- b: t- F  C- ^9 l
4 @0 g4 a( [) I4 r7 s! M' D要创建使用 Ceph 块设备的虚拟机,请参照下文中的步骤。在示范性实施例中,我们用 libvirt-pool 作为存储池名、 client.libvirt 作为用户名、 new-libvirt-image 作为映像名。你可以任意命名,但请确保在后续过程中用自己的名字替换掉对应名字。
2 \' n( d* E  t4 O, i6 c* v, q6 d
配置 Ceph
$ `' I, a/ r% g4 K配置 Ceph 用于 libvirt ,执行下列步骤:0 ]( t+ S6 c1 m" a( b7 o7 g4 n
8 S# f6 R( z2 z5 |! T4 M
创建——存储池(或者用默认的)。本例用 libvirt-pool 作存储池名,设定了 128 个归置组。! ^1 ~( o; a  o( K* A+ B  G. f
3 H( |: h+ K' ~3 A1 n0 z9 w
ceph osd pool create libvirt-pool 128 128
8 b1 q1 z0 s1 V& m验证存储池是否存在。; E5 Y  D4 ?' h6 t& S$ D

% y* o2 R" `/ f( ^' x9 ?; Xceph osd lspools
  z1 D+ X+ _" E9 J* s$ X1 v创建—— Ceph 用户( 0.9.7 及之前的版本用 client.admin ),本例用 client.libvirt 、且权限限制到 libvirt-pool 。
: ^& t9 X9 M$ p; s& I% @" j0 b7 n  n, z/ R; v1 L
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
3 \0 Q0 X0 R2 \1 X验证名字是否存在。
! d6 @: R% V! ^8 M. r. i. W6 P" y# K/ k
ceph auth list
4 K. o* ~/ `; x注: libvirt 访问 Ceph 时将用 libvirt 作为 ID ,而不是 client.libvirt 。关于 ID 和名字不同之处的详细解释请参考用户管理——用户和用户管理——命令行界面。
' H& p0 I* W  z4 G4 c4 H
; {3 u4 X2 y- V$ e  F% z用 QEMU 在 RBD 存储池中创建映像。本例中映像名为 new-libvirt-image 、存储池为 libvirt-pool 。
# h- S) r) k+ I) m. q: c: ]0 W, x# P0 f3 _! a' S* Y8 z
qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
" Y( _1 a  X8 `+ P! l2 n. t- b验证映像是否存在。+ }+ q. }* w1 q% ~

. g6 Z5 z' J2 X) s% {) p/ nrbd -p libvirt-pool ls) F8 ^/ C. s& k3 K
注:你也可以用 rbd create 创建映像,但我们建议使用示例中的命令,来顺便确认 QEMU 可正常运行。& @6 k6 y% R8 U# @6 w8 n
/ J& x' x4 m4 n' r# v, p1 Z
准备虚拟机管理器
" M7 k+ u9 l" ~$ |3 z+ p; ^$ v! i即使没 VM 管理器你也可以用 libvirt ,但是用 virt-manager 创建域更简单。, V9 u8 x7 ?; E
$ m) N& ~7 {1 R+ m
安装虚拟机管理器,详情见 KVM/VirtManager 。
- i1 {' e0 \% b# b1 v7 _! E( `% t$ Z: x
1 V: u. a, l5 k3 S3 g! msudo apt-get install virt-manager4 w' s4 [# U) \3 T9 Q
下载一个 OS 映像(如有必要)。( ~1 _/ p3 Q' T
/ C" k) v# L% F! E+ @: R
启动虚拟机管理器。
" p; y# B' E* W$ Q/ p" z5 x3 z" L9 d& J* f/ w
sudo virt-manager& N8 c9 d1 }$ J& t
新建虚拟机& _5 o% A. V8 I* Q
要用 virt-manager 创建 VM ,请按下列步骤:
% t3 W8 D! k* l0 w( u0 Y( \% o/ {% y
点击 Create New Virtual Machine 按钮。/ M: C9 q$ E8 B" l" l: ]
, C& Z, c" i, m3 G# T; T5 Z
命名新虚拟机的域,本例中我们用 libvirt-virtual-machine 。你可以任意命名,但请在后续命令行和配置实例中替换 libvirt-virtual-machine 为你自己选择的名字。* L6 ~; E7 V6 B5 k

0 t% B7 X; \. ^0 G; _! H( Xlibvirt-virtual-machine5 I6 S7 x/ `; I8 @1 Q
导入映像。
; i3 ?. ?  b2 Z8 P$ U/ r7 c0 Z) e! X, `# ]2 d5 S
/path/to/image/recent-linux.img$ ~3 h( L( E7 k2 c
注:请导入一个较新的映像。一些较老的映像未必能正确地重扫虚拟设备。
5 E2 ^) C5 w3 z; W0 v1 P
  q- ?" f6 j5 @4 p配置并启动 VM 。
# k+ x  q0 _- w+ X8 T
1 k3 T) R7 o! Z" `1 M- t/ i可以用 virsh list 验证 VM 域是否存在。
7 H; I+ C( }  c4 R# n1 o! a- n! g* C; b+ n
sudo virsh list! E4 \+ d  M; {  U
登入 VM ( root/root )
* u; v' T2 I/ ^
7 N2 B; @& X0 d! t! p在修改配置让它使用 Ceph 前,请先停止 VM 。
6 L% X$ R! [8 P, `0 i/ o8 E8 c: v5 M8 Z  Z( H
配置 VM5 ]+ p: _  G4 K1 Q; T
配置 VM 使用 Ceph 时,切记尽量用 virsh 。另外, virsh 命令通常需要 root 权限(如 sudo ),否则不会返回正确结果或提示你需要 root 权限。 virsh 命令参考见 Virsh 命令参考。
# a+ t+ K# B! y# {9 v+ s) y6 i& d$ M: e; G
用 virsh edit 打开配置文件。. T3 \% e: V4 [

$ i; ?; u% [. u3 u! u% |8 zsudo virsh edit {vm-domain-name}& d5 j3 f  U/ F. R8 C
<devices> 下应该有 <disk> 条目。
" Y- |7 [! x; X: y! S2 }: b1 _3 x1 ~( l- c, e
<devices>
5 I. ^1 v# I& n8 [' q4 [* E        <emulator>/usr/bin/kvm</emulator>7 |# q$ e/ s& U# j: u$ l
        <disk type='file' device='disk'># u& x, ~9 W! c1 K: n; u8 }
                    <driver name='qemu' type='raw'/>
3 Q* k* W3 t) W$ K. Z, u                    <source file='/path/to/image/recent-linux.img'/>1 s3 p, p( R$ x% k
                    <target dev='vda' bus='virtio'/>
) C3 V+ V5 U+ h# J' ~# R                    <address type='drive' controller='0' bus='0' unit='0'/>
7 B! \% Q& w$ o/ n8 Y0 }) l# C        </disk>+ ]- T$ s- P% d
用你的 OS 映像路径替换 /path/to/image/recent-linux.img 。使用较快的 virtio 总线的最低内核版本是 2.6.25 ,参见 Virtio 。% ~# I5 q& E. s6 P7 J& `7 m' M2 B* L

* n: u1 q9 C8 B* B0 `, I重要:要用 sudo virsh edit 而非文本编辑器,如果你用文本编辑器编辑了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能识别出这些更改。如果 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 输出结果内容不同, VM 可能会运行异常。
+ K& x+ Y& h3 U+ D
3 @; P/ s  v+ v' x/ k把你创建的 Ceph RBD 映像创建为 <disk> 条目。
% k. x, j% _9 ^
5 M6 p0 G' O! l4 z<disk type='network' device='disk'>
9 e9 q1 d8 p8 s        <source protocol='rbd' name='libvirt-pool/new-libvirt-image'>! L& e* x# q! _, j- J9 f% G
                    <host name='{monitor-host}' port='6789'/>
# E; J9 j5 C. L) D1 ~        </source>5 Q& G2 M8 I+ _0 s
        <target dev='vda' bus='virtio'/>
/ e1 d3 H3 V$ F4 x9 _</disk>  w1 @1 F8 Q" Q0 x( ^( m1 i* B
用你的主机名替换 {monitor-host} ,可能还要替换存储池和/或映像名。你可以为 Ceph monitor 添加多条 <host> , dev 属性是将出现在 VM /dev 目录下的逻辑设备名。可选的 bus 属性是要模拟的磁盘类型,有效的设定值是驱动类型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。
4 A! ]9 ^5 _1 A( Y3 V5 v
9 h% D' X8 q) Y+ u7 m4 i关于 <disk> 标签及其子标签和属性,详见硬盘。
! w; e: {: w! G$ M# s$ w6 `8 Z4 X" L$ x
保存文件。
% F! R. j% K! a0 G1 |2 s) M
/ u3 v- \' s9 r) F) w! N( [如果你的 Ceph 存储集群启用了 Ceph 认证(默认已启用),那么必须生成一个 secret。
# e% P8 }/ s$ M7 y3 b7 P9 D2 {7 k# ~# x  t9 y! A( y
cat > secret.xml <<EOF
" n. J: b9 g  L' H1 J5 X+ |0 a  N& u<secret ephemeral='no' private='no'>
0 u8 R4 G" w9 v2 G        <usage type='ceph'>* `9 q, C, C2 J9 q5 L
                <name>client.libvirt secret</name>/ D6 c: Q- r9 g- \9 I, O9 p
        </usage>( n. z* u' A/ t0 u: `; p
</secret>% o% e3 A. o! ?/ H* }
EOF
& X# a* r& A# a6 k1 @定义 secret。- C  F* k7 g) ~/ W

% o* |! R. x. R  w# P4 H3 gsudo virsh secret-define --file secret.xml/ d( I) [/ Q( l% W6 t) r- V2 W* X+ i
<uuid of secret is output here>
7 `7 U8 Q6 s3 P- D获取 client.libvirt 密钥并把字符串保存于文件。
2 R% ^" Z( j1 F0 t- y# e7 p
# C4 @' A. [% k$ Oceph auth get-key client.libvirt | sudo tee client.libvirt.key3 Q! U; X; }# E$ ^2 A
设置 secret 的 UUID 。
) n1 V2 V: F! E" N
5 b3 U" z# K8 n0 |* Y$ e. O+ z( H+ Gsudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
9 [# X+ I, l3 r( ?5 R" W还必须手动设置 secret,把下面的 <auth> 条目添加到前面的 <disk> 标签内(用上一命令的输出结果替换掉 uuid 值)。
& j9 h/ p0 z( U1 K6 u3 Z* R
8 |; d7 \: P) K1 Z1 s% z+ Osudo virsh edit {vm-domain-name}- `4 ~  |% L# ]: z
然后,把 <auth></auth> 标签加进域配置文件:
1 p; v) F' O- _0 {
& s7 c1 y) M3 Z/ u. ?4 L- g...- X- `0 D9 f- m- a% D5 \
</source>) @) j5 J8 S% W- S3 {! s; X
<auth username='libvirt'>3 Q8 f1 i* l" e" A5 u! _
        <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>% S1 A6 L1 |4 d" [
</auth>
  Q: z) o: p0 x2 c' `; w7 A1 M' b<target ...# T1 {8 W9 _+ ~* K: G0 C$ D
注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。确保你用的是 Ceph 名的 ID 部分。如果出于某些原因你需要更换 secret,必须先执行 sudo virsh secret-undefine {uuid} ,然后再执行 sudo virsh secret-set-value 。
, J1 {5 x) O, C* H: T1 H7 I% t$ T: t5 ~; {) n% k
总结2 G! P/ X% Z) u( Q+ J6 n
一旦完成上面的配置,你就可以启动 VM 了。为确认 VM 和 Ceph 在通信,你可以执行如下过程。1 C* f5 l! y0 Y5 p3 p
. {: M5 ?6 j% [( k# y. L
检查 Ceph 是否在运行:  ]1 B9 s; Y. t8 z, u
, c" I+ j$ u. |: V6 s
ceph health4 I3 V8 I! C( V1 w" _( W" S
检查 VM 是否在运行。
' }4 c" j& R( ?$ Q$ g3 J0 }6 Z2 r) Z; e3 m9 E. ~. [
sudo virsh list1 b; x* H# g1 _0 V; ~9 h! [5 Y
检查 VM 是否在和 Ceph 通信,用你的 VM 域名字替换 {vm-domain-name} :, |, t0 h, j( L  D  d

5 ^9 k6 ?& t3 r* ?5 Isudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'( ^2 {  V0 [% G) p! j3 _
检查一下 <target dev='hdb' bus='ide'/> 定义的设备是否出现在 /dev 或 /proc/partitions 里。  Y9 n. d' K3 I! ^. f# r$ Y! U& i
6 Q7 ]! [1 x+ v. M5 W
ls dev/ N5 s+ p- w" H$ D! C" p/ ]$ T
cat proc/partitions; G7 q9 R/ p! j& ?7 S$ \
如果看起来一切正常,你就可以在虚拟机内使用 Ceph 块设备了。
1 o6 O" F2 Y9 v  h
6 }8 r4 u. ]0 y" \, x7 `4 r
 楼主| 发表于 2024-11-15 23:25:35 | 显示全部楼层
$ virsh secret-define --file secret.xml
3 {1 ~' W7 ~3 p# V5 fSecret 3d5f35f2-7fd8-4b3c-8c86-7b40ec8f5c5b created
, f1 u! u5 e, G: l3 S1 g+ _* z) |/ A$ \7 _
root@gm268-1 23:21:04 ~
1 q/ @# L( P( ]+ M' C6 b( `7 M8 u$ virsh secret-list ( D$ O1 Y8 E" z, Q, \/ k
UUID                                   Usage( m" ]) {7 D/ i( w
-------------------------------------------------------------------) l, J$ F7 y  S2 t3 E  c( z
3d5f35f2-7fd8-4b3c-8c86-7b40ec8f5c5b   ceph client.cinder secret
6 O) e5 x  [/ r  [& `7 C' W# `; r# K8 A9 ~( U8 |
root@gm268-1 23:21:10 ~* Q3 K: V+ r5 O3 |. A9 D
$ ceph auth get-key client.cinder |sudo tee client.cinder,key
& K+ j( P" [: u; C6 ~: kAQDMgQ9nOz4CIhAAcwnv8rvNYNe5oE5hnU2Y9A==8 A% N8 q- L# e) G; N  t
root@gm268-1 23:22:03 ~% M. ?# p, N# J+ }
$
# T' D; z2 S6 w6 Y. f' r
2 c* v6 r" H9 L5 x$ {- I
( h2 J9 C8 Z2 @4 D1 U: P
- U3 Z# r  a4 C8 D$ cat client.cinder,key 4 z' t  h( L9 `% ?
AQDMgQ9nOz4CIhAAcwnv8rvNYNe5oE5hnU2Y9A==root@gm268-1 23:22:12 ~
# n5 Y  s1 a2 K+ g% [  T5 y$ W$ virsh secret-set-value --secret 3d5f35f2-7fd8-4b3c-8c86-7b40ec8f5c5b --base64 $(cat client.cinder,key)   B) y4 u3 O# Z/ l4 x: H
Secret value set
. B% R3 u3 d' q7 Z* z
+ P5 O# t1 z. V% m4 k' ^
% g1 y2 f/ A. n6 k- u" t9 u/ f, x, g( q6 Z8 j8 G
root@gm268-1 23:23:58 ~# P' p: t& \# ~+ E7 Q
$ virsh secret-get-value
  K3 \2 }, s! S4 a6 @error: command 'secret-get-value' requires <secret> option
# k- b  D3 n" Proot@gm268-1 23:24:10 ~& J; _* ]' I5 Y* G+ r. D* a7 @
$ virsh secret-get-value 3d5f35f2-7fd8-4b3c-8c86-7b40ec8f5c5b # w7 Q; X. `1 _! u
AQDMgQ9nOz4CIhAAcwnv8rvNYNe5oE5hnU2Y9A==
2 U' H5 ^+ I! ^1 M/ Z3 j1 y% Qroot@gm268-1 23:24:24 ~
8 P. W; I. l2 V: Y
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-9 01:06 , Processed in 0.058932 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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