- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 2024-11-1 10:21:20
|
显示全部楼层
libvirt 库是管理程序和软件应用间的一个虚拟机抽象层。通过 libvirt ,开发者和系统管理员只需要关注这些管理器的一个通用管理框架、通用 API 、和通用 shell 接口(即 virsh )即可,包括:# K* ?9 X& w! _/ j& Q" e, h
" R. L; m9 G# q" Q1 U! w) [QEMU/KVM( e( k7 O9 J2 h3 J, J
XEN
: e' s4 M5 `# Q7 ]$ O# I2 p, fLXC3 V" W3 j: E3 x+ |5 `5 n
VirtualBox( R$ B- n% S" I
等等$ O! X1 F9 f) K! _. D" R
Ceph 块设备支持 QEMU/KVM ,所以你可以通过能与 libvirt 交互的软件来使用 Ceph 块设备。下面的堆栈图解释了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。 y% s# C$ W% M+ d
+ x r4 i7 O$ E- W7 ]" @9 s6 _6 B u" T2 f7 t$ s
$ G. j' v. ~! e3 r {& p. W2 I
libvirt 常见于为云解决方案提供 Ceph 块设备,像 OpenStack 、 ClouldStack 。它们用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再通过 librbd 与 Ceph 块设备交互。详情见块设备与 OpenStack 和块设备与 CloudStack 。关于如何安装见安装。
8 U2 Q4 J. p! l
# T o, o5 p" J8 @& p+ Q. u- c9 Z你也可以通过 libvirt 、 virsh 和 libvirt API 使用 Ceph 块设备,详情见 libvirt 虚拟化 API 。
, ]5 ?. f0 L% O$ d7 Z* n) I- ~. ~- P- X/ r# M
要创建使用 Ceph 块设备的虚拟机,请参照下文中的步骤。在示范性实施例中,我们用 libvirt-pool 作为存储池名、 client.libvirt 作为用户名、 new-libvirt-image 作为映像名。你可以任意命名,但请确保在后续过程中用自己的名字替换掉对应名字。/ H3 [: D/ q4 k
L% M1 x! C/ i9 n配置 Ceph
( V; H3 b$ @9 h( W" N配置 Ceph 用于 libvirt ,执行下列步骤:
3 `8 c' F/ O+ P9 T
1 w# [. Q- ~" ?% B* M! R( `) H创建——存储池(或者用默认的)。本例用 libvirt-pool 作存储池名,设定了 128 个归置组。7 N* S$ c' h* U% X6 Q
, u, P4 d# B$ y' V5 ~
ceph osd pool create libvirt-pool 128 1288 F6 C1 Y9 F; _
验证存储池是否存在。! G( ]- J8 T: N2 w
- Z- O2 J2 M- [9 e+ ?
ceph osd lspools
2 X$ o' z2 }3 _) U$ F创建—— Ceph 用户( 0.9.7 及之前的版本用 client.admin ),本例用 client.libvirt 、且权限限制到 libvirt-pool 。6 o! v+ H6 B O/ i& y v+ L! H
) M: F& X0 p& I. i8 z
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'0 e1 `. Z; t) _5 v0 c: t
验证名字是否存在。1 d+ X* |8 x. [/ _6 e
" h4 s# c& L4 U( e3 U! d& Vceph auth list1 S3 Y: D$ g/ k8 \6 i7 l7 |. [
注: libvirt 访问 Ceph 时将用 libvirt 作为 ID ,而不是 client.libvirt 。关于 ID 和名字不同之处的详细解释请参考用户管理——用户和用户管理——命令行界面。5 ]0 q8 t' ~+ a5 ~
% n+ |5 _8 V* W& U5 E3 Z7 q2 E用 QEMU 在 RBD 存储池中创建映像。本例中映像名为 new-libvirt-image 、存储池为 libvirt-pool 。
2 W& E1 k1 i8 i: l0 d! L1 M, T1 G
5 e: L$ g' U! v2 xqemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
$ N- o/ {3 k0 t/ i7 O5 r验证映像是否存在。
; M! _ m2 B+ I* O* v! N; I+ N4 X5 s8 a
rbd -p libvirt-pool ls! W* M9 k" N; t7 ~; j! g
注:你也可以用 rbd create 创建映像,但我们建议使用示例中的命令,来顺便确认 QEMU 可正常运行。
0 N M) L% V( w0 e/ }. [7 ?% ^' V7 h+ k5 h$ Q( \$ c
准备虚拟机管理器9 f' P6 H5 E) s0 B! Q
即使没 VM 管理器你也可以用 libvirt ,但是用 virt-manager 创建域更简单。
8 h! a, m7 D6 R- ?2 z2 v# i+ m
( e% O" l6 O- N3 E0 }' q安装虚拟机管理器,详情见 KVM/VirtManager 。
+ {% r1 V# e- x- d% a# |, O" b1 w2 Z! T' Z. Z5 N+ L6 n" _" h' k" z2 j
sudo apt-get install virt-manager5 C* L) P. N* C0 Z4 m9 ?
下载一个 OS 映像(如有必要)。+ N: p: n+ Z' F& U d9 l8 e
$ w, p- r; _3 _启动虚拟机管理器。
7 [$ O7 W* X! ~ @- F
' L! l4 _' X$ s/ d: ~. Tsudo virt-manager! V$ B" X; _* M: @% E. E9 q
新建虚拟机
4 h" c9 k; z( T0 v2 M$ B P6 ]. v要用 virt-manager 创建 VM ,请按下列步骤:) N/ B: ~6 u1 i: M
: |- @, z* B! X7 M& O
点击 Create New Virtual Machine 按钮。& V5 \$ g2 _7 Y/ E4 E/ E; \; p
+ E2 T- {, X" u. E6 M- D( |0 u命名新虚拟机的域,本例中我们用 libvirt-virtual-machine 。你可以任意命名,但请在后续命令行和配置实例中替换 libvirt-virtual-machine 为你自己选择的名字。
$ f+ i5 i, f3 W y( J0 }
' c6 _& K8 B7 T6 b; y# W( Glibvirt-virtual-machine- L' C+ d; U4 W5 I. g/ [
导入映像。
% s8 F q& w0 }' n. S4 S# i$ ^: q' D
/path/to/image/recent-linux.img
2 G" T0 s, _4 Y4 H' t. n g7 g* }注:请导入一个较新的映像。一些较老的映像未必能正确地重扫虚拟设备。
( D4 p: N6 w5 Y+ b: r( l0 Z' f; p4 b
配置并启动 VM 。
8 S" H% N- {& r, A5 i4 l/ N6 s, R% _1 E( M+ D
可以用 virsh list 验证 VM 域是否存在。
' ]. _# p. ?3 w( ?0 _
% Z5 T2 j3 N8 X( e" |0 a, asudo virsh list3 U4 V( d1 \2 f; q. h9 F
登入 VM ( root/root )
5 A& D5 ]! ^8 w8 V" H: e+ e- i3 j1 Z& @ N; g
在修改配置让它使用 Ceph 前,请先停止 VM 。+ C m# z7 a1 M. N+ Q
9 k, p- x, v- T* z& T- s配置 VM9 j0 ?; ]+ F9 K- s1 c
配置 VM 使用 Ceph 时,切记尽量用 virsh 。另外, virsh 命令通常需要 root 权限(如 sudo ),否则不会返回正确结果或提示你需要 root 权限。 virsh 命令参考见 Virsh 命令参考。
. l7 R/ o3 \9 V0 o# L7 J, q4 Q( \) F9 S7 {5 G1 I
用 virsh edit 打开配置文件。8 g- h0 \" x$ r0 K1 O) f
, ^9 o4 }, V3 k# d
sudo virsh edit {vm-domain-name}
& N; T- s- N* U. o/ ~9 X<devices> 下应该有 <disk> 条目。
" u, ?# a" U* I; ] b
; }$ J( F; ?: }( _! r) N3 h<devices>
D% _, K/ z# ^! \ <emulator>/usr/bin/kvm</emulator>+ U2 }, ^& r5 S# p" d7 o! E
<disk type='file' device='disk'>6 E5 X) j: I, K1 y$ t/ R. O$ W
<driver name='qemu' type='raw'/>1 k, [' |. r$ @3 j
<source file='/path/to/image/recent-linux.img'/>' i3 h/ t; U- H. @& q& e, E' l
<target dev='vda' bus='virtio'/>
: M' m8 e) s6 k0 M% B <address type='drive' controller='0' bus='0' unit='0'/>
i+ c7 \8 t% w0 f, p p </disk>
% q( `* U! d9 c7 O$ p用你的 OS 映像路径替换 /path/to/image/recent-linux.img 。使用较快的 virtio 总线的最低内核版本是 2.6.25 ,参见 Virtio 。
- D# R) Z3 {# y( U+ e
0 |- ?) G2 ]# M% {) f5 Y% Z重要:要用 sudo virsh edit 而非文本编辑器,如果你用文本编辑器编辑了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能识别出这些更改。如果 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 输出结果内容不同, VM 可能会运行异常。
1 h' B% c. _" z9 j
3 n( \5 M" T1 d: o9 R9 ]把你创建的 Ceph RBD 映像创建为 <disk> 条目。' O Y( C2 B( d4 w8 b, {
: q% {. u; @: R" b8 z" m& T1 R
<disk type='network' device='disk'>
0 Y& ?; `& _, @# L2 [$ E$ G <source protocol='rbd' name='libvirt-pool/new-libvirt-image'> U, a% }$ c) w U
<host name='{monitor-host}' port='6789'/>
" C$ Q1 ~" y8 i& @ </source>9 [" ^# k# r( l8 R0 ~; }2 z
<target dev='vda' bus='virtio'/>6 F& ~* e7 L: a" \1 Z N
</disk>
# A% n& @( q) _9 F9 R! }0 N* c用你的主机名替换 {monitor-host} ,可能还要替换存储池和/或映像名。你可以为 Ceph monitor 添加多条 <host> , dev 属性是将出现在 VM /dev 目录下的逻辑设备名。可选的 bus 属性是要模拟的磁盘类型,有效的设定值是驱动类型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。
# @5 G" p% t& g1 a+ O" k( U6 l; |3 u) d* L" S* V, ~
关于 <disk> 标签及其子标签和属性,详见硬盘。, z3 a$ U3 Y- M1 m, G# O2 N
4 S: k' H8 K E+ ^( c. D保存文件。
b8 _5 ]4 }9 \6 G7 V
) Q$ H. X( m+ | O# e7 O$ q/ E如果你的 Ceph 存储集群启用了 Ceph 认证(默认已启用),那么必须生成一个 secret。
6 }' S& Y* T9 O1 {" e
u% t2 D+ X' T& e6 J& E. {; `# W9 Icat > secret.xml <<EOF
, p/ B7 f4 U( C+ H s& k& N<secret ephemeral='no' private='no'>. n/ d& M9 O. H5 g4 t3 @
<usage type='ceph'>
7 [1 R7 E" e0 t <name>client.libvirt secret</name>
- m* F1 f0 C$ Y7 G) G, u </usage>
" @: ?9 O# U4 a6 F4 W( }1 s</secret>: D" i1 j5 q, Y1 W8 ~1 I- t
EOF! g* Y4 |0 E3 `( m. B
定义 secret。
6 r1 ]9 ?( t$ D1 U* x$ V
: E3 C/ [8 P8 N/ M3 e* @sudo virsh secret-define --file secret.xml
6 R' l0 `3 M3 l; Q2 X6 W/ M<uuid of secret is output here>
! R8 H$ x) ~) M% L8 c! j获取 client.libvirt 密钥并把字符串保存于文件。 J7 G0 d0 w* f7 c
+ A/ ~+ N4 S% ?/ V1 b
ceph auth get-key client.libvirt | sudo tee client.libvirt.key4 b( g8 m! b4 D
设置 secret 的 UUID 。
; V/ ?0 H( ^2 J g
8 M% i& `* w/ _* Msudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
# }) y- z$ r' l! ]; }$ y/ Z还必须手动设置 secret,把下面的 <auth> 条目添加到前面的 <disk> 标签内(用上一命令的输出结果替换掉 uuid 值)。, n" W3 p h! ~8 f. t
- T4 u5 s8 T) {" C( hsudo virsh edit {vm-domain-name}- d' w& {/ @- p0 z7 m& D) E G
然后,把 <auth></auth> 标签加进域配置文件:5 Y/ e8 t' l2 L
9 L: c0 D0 [5 V
... ^% ]5 @( b; _* f% C. N) U, z
</source>3 B7 {; v* `2 z0 v! z0 z4 {1 z
<auth username='libvirt'>( \ U9 _1 H! A
<secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>! J( ]- [, o( ]8 ]: d* X
</auth>) Z, z9 b4 y! v/ G
<target ..." a/ m& i8 \9 I* U
注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。确保你用的是 Ceph 名的 ID 部分。如果出于某些原因你需要更换 secret,必须先执行 sudo virsh secret-undefine {uuid} ,然后再执行 sudo virsh secret-set-value 。6 B# f2 E( v X( Q4 O3 S0 G
* a; l9 h7 {) t% l' Q总结
* g. p; N2 t* Q& i; p一旦完成上面的配置,你就可以启动 VM 了。为确认 VM 和 Ceph 在通信,你可以执行如下过程。; q* k1 M0 r# j
" j. X- W1 ^+ l4 l3 Y& b2 A& B检查 Ceph 是否在运行:# v) A% R, w3 B; l" p8 m0 O5 n
' Y4 j4 f0 u: a( q0 Aceph health' ~ L3 H5 n+ Z: {
检查 VM 是否在运行。4 G3 E/ A& {8 k1 d5 p* `6 T
$ f7 [! p! x$ A' ^4 O- rsudo virsh list
5 s0 }! X- D9 |/ P$ T1 S. ? U检查 VM 是否在和 Ceph 通信,用你的 VM 域名字替换 {vm-domain-name} :
& T2 ~2 e+ w3 X. Z8 [) z7 c7 T! w$ t6 Y( ~# L! P$ D
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
" _, L. U; u; j/ p$ c' ?检查一下 <target dev='hdb' bus='ide'/> 定义的设备是否出现在 /dev 或 /proc/partitions 里。 J: P1 i9 T2 M
: Q, h) e4 J; {' G8 Z' v" Mls dev
B8 }: q% {2 |* X0 Wcat proc/partitions* }! H9 H, n2 _: \% q0 ?
如果看起来一切正常,你就可以在虚拟机内使用 Ceph 块设备了。
& a A3 k& p) ^; k, G0 U! g- Q
9 N2 \# f7 Q U; S; G o) e |
|