|
|
楼主 |
发表于 2024-11-1 10:21:20
|
显示全部楼层
libvirt 库是管理程序和软件应用间的一个虚拟机抽象层。通过 libvirt ,开发者和系统管理员只需要关注这些管理器的一个通用管理框架、通用 API 、和通用 shell 接口(即 virsh )即可,包括:6 [' t. M( i4 a
, r& p+ L3 \2 b- U. Z
QEMU/KVM# a6 Y- J! ?/ G0 I9 f
XEN9 T. c- ~; `6 d
LXC
$ ] R& U6 Y9 Z0 EVirtualBox
" O# \' r2 T2 ]. }4 \等等7 Q. e, ]8 L5 g- A2 f) m. p# d
Ceph 块设备支持 QEMU/KVM ,所以你可以通过能与 libvirt 交互的软件来使用 Ceph 块设备。下面的堆栈图解释了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。
0 }: o8 I$ n8 \3 A& S) z
% |0 z- ]# f2 b) f$ }% W) f# X" s# F* m3 O
. B4 T+ z0 d, {: L
libvirt 常见于为云解决方案提供 Ceph 块设备,像 OpenStack 、 ClouldStack 。它们用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再通过 librbd 与 Ceph 块设备交互。详情见块设备与 OpenStack 和块设备与 CloudStack 。关于如何安装见安装。
2 y1 @' V( I& [0 O7 I. ~9 y
2 G5 P$ a1 G% E9 K- w1 x, a你也可以通过 libvirt 、 virsh 和 libvirt API 使用 Ceph 块设备,详情见 libvirt 虚拟化 API 。5 ^, D$ ~+ ^$ I# K' ?$ \3 R4 l$ J
2 w- E' @. d& Q
要创建使用 Ceph 块设备的虚拟机,请参照下文中的步骤。在示范性实施例中,我们用 libvirt-pool 作为存储池名、 client.libvirt 作为用户名、 new-libvirt-image 作为映像名。你可以任意命名,但请确保在后续过程中用自己的名字替换掉对应名字。
8 ?' C5 f# h! p+ D9 S. D; t# N( I+ Y& n& F- n7 \$ P
配置 Ceph
r4 k7 C4 b3 u配置 Ceph 用于 libvirt ,执行下列步骤:2 C' s$ R/ T' S
" c% W) }# e$ K* S创建——存储池(或者用默认的)。本例用 libvirt-pool 作存储池名,设定了 128 个归置组。# G% z8 v/ E( E. c8 \
3 Z' [* t1 S( r, a. q3 |
ceph osd pool create libvirt-pool 128 1289 i+ ^8 `3 P0 v: q
验证存储池是否存在。
8 |: G' x5 k+ R) u2 [& I9 M/ g8 b
) z# e; \5 F: }' vceph osd lspools
$ f3 c% o! o6 b# h创建—— Ceph 用户( 0.9.7 及之前的版本用 client.admin ),本例用 client.libvirt 、且权限限制到 libvirt-pool 。
. y7 t( x9 ?. y, |
: {9 U6 ?# [3 pceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'% W+ k5 e% E4 l* p
验证名字是否存在。" |* }5 `& R. V& C U4 a. B* Z3 k1 `; t* j
9 U; M! i) `* E/ A fceph auth list
2 m8 f' y9 d4 L8 H注: libvirt 访问 Ceph 时将用 libvirt 作为 ID ,而不是 client.libvirt 。关于 ID 和名字不同之处的详细解释请参考用户管理——用户和用户管理——命令行界面。4 z m+ p7 B+ E7 k' R y
6 O* e: h, v4 G y4 T
用 QEMU 在 RBD 存储池中创建映像。本例中映像名为 new-libvirt-image 、存储池为 libvirt-pool 。
( r8 v' H& q' H9 S* E8 Z2 }: `" j, ` H7 O, O, f/ g1 P3 `( I
qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G4 L3 Q1 G8 j3 g: Q
验证映像是否存在。7 C4 {: [4 h3 j& B1 u' f
; g4 X7 t& b! e5 X8 F7 H: arbd -p libvirt-pool ls! P( S$ y2 \: h1 O
注:你也可以用 rbd create 创建映像,但我们建议使用示例中的命令,来顺便确认 QEMU 可正常运行。
5 }% ?& q$ w" _5 }4 f; Z
; b* j* ^, S8 X, l) |! T准备虚拟机管理器, q B n- N8 _
即使没 VM 管理器你也可以用 libvirt ,但是用 virt-manager 创建域更简单。
2 F9 u9 w7 E' t6 v7 @, U
( E" }( T' I$ @, t: V安装虚拟机管理器,详情见 KVM/VirtManager 。$ U+ L+ ~: Q) {& [" @
v Q* Z# \( o# F2 H. G6 d1 i) |sudo apt-get install virt-manager
~* O$ k1 D/ t/ c下载一个 OS 映像(如有必要)。+ T4 l6 k: C+ n0 H$ m- ~
" T+ y6 e6 m' P3 {+ c启动虚拟机管理器。
- Y' A9 K6 |3 t( `; J$ D1 V
' D- ]3 F. S6 }+ c8 x( h: {' t8 Tsudo virt-manager3 X& j& \0 ?; B4 j" Z
新建虚拟机
. C1 [2 ^3 q$ f; X5 a6 p8 O4 v要用 virt-manager 创建 VM ,请按下列步骤:
# r- _" ]3 l0 A+ ^0 r& K3 p2 q+ ]8 b/ g# b. u
点击 Create New Virtual Machine 按钮。
9 y5 ^% \- s! P4 d7 v! D. a& U7 f q* X0 M' v: A# ~+ c8 j1 |+ o2 n
命名新虚拟机的域,本例中我们用 libvirt-virtual-machine 。你可以任意命名,但请在后续命令行和配置实例中替换 libvirt-virtual-machine 为你自己选择的名字。
! A/ I( V$ L2 Z6 o9 [# a
: v9 R1 [* b7 Z2 J' r g+ Jlibvirt-virtual-machine! }$ z4 o# p+ Q4 F7 X
导入映像。
8 b- K$ H1 u6 V" Z& b; y
7 x; B5 U+ v0 k1 `/path/to/image/recent-linux.img
Z9 Y6 L# y8 n! \. X" G注:请导入一个较新的映像。一些较老的映像未必能正确地重扫虚拟设备。. q4 \7 }1 D9 D! z2 A F
3 q5 U3 t* A1 S5 J' I- j配置并启动 VM 。1 ?* r! a# ~7 O/ O3 C5 D
) h/ \! N* Z" R- l6 p" q% m可以用 virsh list 验证 VM 域是否存在。
2 j& c1 s; P# w, a" n0 k' G% y# p$ @$ d. U' T
sudo virsh list; y6 `7 R9 {" O5 l: Y
登入 VM ( root/root )& T6 b1 z4 H, V+ d
' P7 I$ T. X2 q9 j; |, L, s" N, j G
在修改配置让它使用 Ceph 前,请先停止 VM 。) q) n, q: U1 N6 N. w, z) p; P
: i* \, k* `) {& M配置 VM
2 x6 H+ y+ o% f7 e; s+ q9 U配置 VM 使用 Ceph 时,切记尽量用 virsh 。另外, virsh 命令通常需要 root 权限(如 sudo ),否则不会返回正确结果或提示你需要 root 权限。 virsh 命令参考见 Virsh 命令参考。7 f& h$ z& H9 o) \! w& J+ Y
" o+ c3 J/ ]: v- p# P! K用 virsh edit 打开配置文件。2 D6 w- o$ M; z& O m! _
" f. W: V5 L- {5 v4 I
sudo virsh edit {vm-domain-name}% k! [, a9 ?, X) p) a
<devices> 下应该有 <disk> 条目。! A8 x" e" T" l; [; j
}- [2 }- Y' M) m1 Y
<devices>! j: N$ T; R0 \2 p; y0 S
<emulator>/usr/bin/kvm</emulator>8 x- R7 A6 P& o U u
<disk type='file' device='disk'>
5 V& X4 _% y" n- O* e) j! S <driver name='qemu' type='raw'/>
% H% \2 W5 `# W! u& M <source file='/path/to/image/recent-linux.img'/>
9 f7 w- C1 d# m$ l, N <target dev='vda' bus='virtio'/>
2 L, X" D% D4 r/ n! A+ H- p# H- X <address type='drive' controller='0' bus='0' unit='0'/>' G4 L# f* d4 d0 Y4 S
</disk>
% K; [/ p6 q+ n( O, H! H用你的 OS 映像路径替换 /path/to/image/recent-linux.img 。使用较快的 virtio 总线的最低内核版本是 2.6.25 ,参见 Virtio 。0 _( ` I* c* m: y
( |( h2 W; }% Z/ e重要:要用 sudo virsh edit 而非文本编辑器,如果你用文本编辑器编辑了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能识别出这些更改。如果 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 输出结果内容不同, VM 可能会运行异常。7 n9 p* J# y9 U& L8 F2 _6 n0 B
/ ^/ p, F, P7 Y3 N D( Q1 \# F把你创建的 Ceph RBD 映像创建为 <disk> 条目。
* P4 r2 o, u; K2 n; ~' j; ?( F, T# Q. p' E0 G0 v% M! P8 U" j+ d+ o
<disk type='network' device='disk'>
, t3 V( M3 H N3 Z* P+ l <source protocol='rbd' name='libvirt-pool/new-libvirt-image'>- U9 c ? R9 w2 U1 h
<host name='{monitor-host}' port='6789'/>) Z* P" V( M) C: Z* {: `+ j
</source>
) ]* ?; \( I* r: C <target dev='vda' bus='virtio'/>. g1 \; D3 }/ |2 V
</disk>
( W8 X; Q: A, q. a/ C" J& h& [用你的主机名替换 {monitor-host} ,可能还要替换存储池和/或映像名。你可以为 Ceph monitor 添加多条 <host> , dev 属性是将出现在 VM /dev 目录下的逻辑设备名。可选的 bus 属性是要模拟的磁盘类型,有效的设定值是驱动类型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。9 C$ F0 i$ ?/ E1 @/ K6 N
7 @ m# `) ]: m0 @关于 <disk> 标签及其子标签和属性,详见硬盘。 o3 b6 u6 v2 f0 Q9 G
7 A4 L6 v- G3 e3 q+ }& E: `, N保存文件。* B; ^& I4 t, X2 J: _* s" H, g
0 a3 h- {5 Q) G3 t" L( X6 W如果你的 Ceph 存储集群启用了 Ceph 认证(默认已启用),那么必须生成一个 secret。
: {: I* q ~2 o% H% i, L! A" h$ q! a5 j; g0 x! G' s( f9 o8 _5 J
cat > secret.xml <<EOF6 T2 V+ ~% h) m$ ^( ]
<secret ephemeral='no' private='no'>
7 @3 B: ?, }' H9 y0 g <usage type='ceph'>7 r0 a0 ]9 U: {; J5 N
<name>client.libvirt secret</name>+ Q+ L- T5 x' ^* n8 _
</usage>6 e$ m A& }' ^, M4 e5 _/ _0 o
</secret>% `0 e1 N) K0 a1 Y9 n) m
EOF
6 }0 p) Y8 y! s定义 secret。/ c. N/ s7 E4 M( Q
! A+ N, H) V% N0 Fsudo virsh secret-define --file secret.xml
) N: s, @4 l" O( l3 _, f<uuid of secret is output here>
$ _$ h& c9 c( P* U3 u获取 client.libvirt 密钥并把字符串保存于文件。
* k7 e9 k! j/ I" R( Q
% M t: K/ |0 [* ?ceph auth get-key client.libvirt | sudo tee client.libvirt.key
: S X, }7 ]9 |6 o% w1 v# B, z设置 secret 的 UUID 。1 `7 q ~' v2 C5 l4 P, l
0 w' M* X- y( ]/ osudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
' g% b( `2 R8 v+ T还必须手动设置 secret,把下面的 <auth> 条目添加到前面的 <disk> 标签内(用上一命令的输出结果替换掉 uuid 值)。
P2 B/ x$ m* K
( ~: G s& R6 I, f. P% Nsudo virsh edit {vm-domain-name}& f/ }% J$ M/ h' _
然后,把 <auth></auth> 标签加进域配置文件:" r H" W3 J6 W6 n- H# O& w
5 M6 [1 F% z' Q$ }5 i...8 U l" j; d2 m( r
</source>* z' D$ C, u+ A) J
<auth username='libvirt'>- R: X' J. {9 N; C' _ f: j2 U
<secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>
/ u' Q6 A/ ?/ R1 v8 o( W</auth>
2 Z9 B/ |' Q4 v<target ...- {& h! @& e1 }. |! s X
注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。确保你用的是 Ceph 名的 ID 部分。如果出于某些原因你需要更换 secret,必须先执行 sudo virsh secret-undefine {uuid} ,然后再执行 sudo virsh secret-set-value 。
2 t9 H+ h. s1 X5 B8 O5 ]
' r0 W- b9 s; r6 q, [总结
! G# Q9 n" \; c9 l }一旦完成上面的配置,你就可以启动 VM 了。为确认 VM 和 Ceph 在通信,你可以执行如下过程。2 O+ E' E$ E' V1 Y1 [. `
. H1 b% Y* r" Z2 i$ n" j
检查 Ceph 是否在运行:
1 ?( l( x- Q# N2 B6 j! \3 t g- P: U0 C" J; w* M
ceph health, ~5 H; [) B+ f/ t7 k0 e
检查 VM 是否在运行。
4 Q+ H/ I: l; S: L5 _( Y. o# o* I# j) y/ R& a. M$ l3 `
sudo virsh list* ~( \5 {/ i6 i! t2 k
检查 VM 是否在和 Ceph 通信,用你的 VM 域名字替换 {vm-domain-name} :6 X! V) b6 T+ p6 k7 T
" ~/ C Y$ `. m
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'+ F8 E7 P; x$ G! j, ?
检查一下 <target dev='hdb' bus='ide'/> 定义的设备是否出现在 /dev 或 /proc/partitions 里。
, w/ l% i8 P9 W4 f, p; Q% J1 X% d3 d: w
ls dev0 t! V8 Y3 Y, [6 c3 m
cat proc/partitions$ T9 S/ I/ e" I8 q
如果看起来一切正常,你就可以在虚拟机内使用 Ceph 块设备了。
1 p, E4 d$ u" W5 V" n
& i7 d7 \/ [9 d) p: H |
|