|
|
楼主 |
发表于 2024-11-1 10:21:20
|
显示全部楼层
libvirt 库是管理程序和软件应用间的一个虚拟机抽象层。通过 libvirt ,开发者和系统管理员只需要关注这些管理器的一个通用管理框架、通用 API 、和通用 shell 接口(即 virsh )即可,包括:
' | F: C( n" z% L$ o' k k- i& [, Y) ~- e
QEMU/KVM( K" ^: K8 O# m( F; x
XEN( s5 W" ?" S, \* }* }" a0 Z- b
LXC- W5 X! k. z) @5 ~. N9 e, G v/ g
VirtualBox
- B4 z1 ?& C; W. q( {等等6 k0 f; `2 |1 Z/ W& ~+ o5 c
Ceph 块设备支持 QEMU/KVM ,所以你可以通过能与 libvirt 交互的软件来使用 Ceph 块设备。下面的堆栈图解释了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。
( u1 A. [7 i: w* w# p
6 t1 {2 k' v: }
- q% z$ Y7 `/ k% E
! ?' z) W5 `+ n0 |$ klibvirt 常见于为云解决方案提供 Ceph 块设备,像 OpenStack 、 ClouldStack 。它们用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再通过 librbd 与 Ceph 块设备交互。详情见块设备与 OpenStack 和块设备与 CloudStack 。关于如何安装见安装。: M9 Z5 j4 B$ ]3 S' j0 Q: ~- Z
% b! H6 X4 k' F. h2 S
你也可以通过 libvirt 、 virsh 和 libvirt API 使用 Ceph 块设备,详情见 libvirt 虚拟化 API 。: ^) i# y G3 I) e. ?8 @& k# x
: F \- `. c% W; o. V要创建使用 Ceph 块设备的虚拟机,请参照下文中的步骤。在示范性实施例中,我们用 libvirt-pool 作为存储池名、 client.libvirt 作为用户名、 new-libvirt-image 作为映像名。你可以任意命名,但请确保在后续过程中用自己的名字替换掉对应名字。+ V, V- v t1 e, q7 I/ l& Q0 p
4 x. W( Y! k. [* p* L+ g
配置 Ceph
5 y- E. @2 V8 E! s/ U4 x% r/ h配置 Ceph 用于 libvirt ,执行下列步骤:2 d5 v/ J5 N. A7 \7 X; S
5 M5 w5 ]( Y& l, H2 Y7 e7 H3 O
创建——存储池(或者用默认的)。本例用 libvirt-pool 作存储池名,设定了 128 个归置组。0 _: c7 [! {; j7 [+ z' `2 Z
" r- I$ ~ F: B) l; S$ u! `& B$ Jceph osd pool create libvirt-pool 128 128
" \+ y3 q* A) u7 i5 {验证存储池是否存在。1 r4 t0 l; x# T5 W ~; P# {& u. a
) O7 ^% b0 g# d5 s/ fceph osd lspools
3 w, P* w7 I9 y" M5 I创建—— Ceph 用户( 0.9.7 及之前的版本用 client.admin ),本例用 client.libvirt 、且权限限制到 libvirt-pool 。1 T( V( N6 J+ z6 X) M0 O
+ D, j4 J+ O2 t m. ^ kceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
4 z/ E) B& l! D K }$ E% U验证名字是否存在。
* V0 [* G+ `5 x8 A3 n
7 f, @' A+ G$ {3 d% b. ~; _- N" ~ceph auth list. G3 B5 R% U, r1 X
注: libvirt 访问 Ceph 时将用 libvirt 作为 ID ,而不是 client.libvirt 。关于 ID 和名字不同之处的详细解释请参考用户管理——用户和用户管理——命令行界面。3 y3 I4 y# i c7 k# K# ?* E; R& B
& o1 N1 o1 `; F* l- `
用 QEMU 在 RBD 存储池中创建映像。本例中映像名为 new-libvirt-image 、存储池为 libvirt-pool 。* j1 o3 ^: A& a0 w, h/ A
* [3 z/ _% W# n$ O b4 F
qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
3 Z5 n+ e5 R! e8 T* }验证映像是否存在。0 s; s0 B& R3 C9 ?# L, Z
! |/ Q# ~# t% X$ P7 A$ Lrbd -p libvirt-pool ls
) ?3 s% H0 i$ h/ c" [! Q8 o H注:你也可以用 rbd create 创建映像,但我们建议使用示例中的命令,来顺便确认 QEMU 可正常运行。5 ?3 t( R, U- g
1 d; l5 B* B* n1 G3 f: E1 g+ @准备虚拟机管理器+ C; R3 W0 t- v( R: D" L
即使没 VM 管理器你也可以用 libvirt ,但是用 virt-manager 创建域更简单。
( T8 j0 d# }; ]. g
! N! X4 J3 Y# n1 t安装虚拟机管理器,详情见 KVM/VirtManager 。
' E- d3 _3 v" N% O
6 L! X0 d! a3 c. J5 P. Hsudo apt-get install virt-manager
1 W; @8 w( `2 Y7 p下载一个 OS 映像(如有必要)。
; W1 d* o p4 \: ~" E' b) _! k. g: a+ M J) U& V; D4 `. Z: v
启动虚拟机管理器。0 F2 Q/ F9 J0 N4 ?( h
1 c; K) b& }- C2 c0 L y3 csudo virt-manager& ]8 o! c% U7 F8 K G- ~: x; o& \
新建虚拟机5 O. l) ^4 R, W
要用 virt-manager 创建 VM ,请按下列步骤:
, r# G8 v7 u a$ `& \: S& J- J( Q5 j% R7 Q, @9 n
点击 Create New Virtual Machine 按钮。
! w' e6 Q/ |2 E2 z% z& O4 Z9 H3 d) V$ S9 Z& R _& h; r7 \- `
命名新虚拟机的域,本例中我们用 libvirt-virtual-machine 。你可以任意命名,但请在后续命令行和配置实例中替换 libvirt-virtual-machine 为你自己选择的名字。5 {. D5 _& k! k, ?. g' W$ U3 b
, x0 J- ?1 j: ]3 M% rlibvirt-virtual-machine
* K0 T9 N: B0 l5 g5 t7 m导入映像。5 }4 ^/ @$ W! l& \( z* n& ]2 O5 h
0 o, d$ Q( C; @. o- e
/path/to/image/recent-linux.img
@% }/ L; s; F' T0 U8 Z1 S注:请导入一个较新的映像。一些较老的映像未必能正确地重扫虚拟设备。
9 o4 N: a; |! n% S% p4 {+ X
. a. @' o3 w* m2 x! W, S配置并启动 VM 。
+ ]& i6 k, u7 N$ O4 S8 [7 u: s* m* Q
可以用 virsh list 验证 VM 域是否存在。
3 M5 P7 h z7 |, X$ l8 Y+ h5 M+ f0 O
sudo virsh list. y6 F i l. N* ^
登入 VM ( root/root )
; N `3 Q& L7 L6 l
8 e9 E/ {( T$ D5 z1 {! A8 i+ y在修改配置让它使用 Ceph 前,请先停止 VM 。1 D: |2 l7 Q. }; _- D
$ V2 \1 L& p9 f2 O, \5 g配置 VM3 S- d! o/ c/ h( f& o! P
配置 VM 使用 Ceph 时,切记尽量用 virsh 。另外, virsh 命令通常需要 root 权限(如 sudo ),否则不会返回正确结果或提示你需要 root 权限。 virsh 命令参考见 Virsh 命令参考。
. v* Q. r$ m3 Y5 H; D6 |1 q7 c- j! A, u2 S* n
用 virsh edit 打开配置文件。9 G+ d6 ^; A% Q) [ H
( Z: e$ i) H; }2 ?; h. N* isudo virsh edit {vm-domain-name}7 B/ U. M3 A! c
<devices> 下应该有 <disk> 条目。8 }; S. d5 o4 e' f7 s! g
2 |7 P& H' n6 g8 I<devices>+ V7 \) ]) H, E( f7 V
<emulator>/usr/bin/kvm</emulator>% Q: b* E' _( j6 t
<disk type='file' device='disk'># o! Z6 n1 H/ b# k) e
<driver name='qemu' type='raw'/>
# }- D; ?) H# }/ q <source file='/path/to/image/recent-linux.img'/>
, p6 L. b, H( {! Z. E C9 z <target dev='vda' bus='virtio'/>9 y' c) T. \, f, g! M; [
<address type='drive' controller='0' bus='0' unit='0'/>
% U' Z; ^ t& P1 X </disk>
; {0 q+ c/ n; ~) f1 _0 f* q2 ]4 w用你的 OS 映像路径替换 /path/to/image/recent-linux.img 。使用较快的 virtio 总线的最低内核版本是 2.6.25 ,参见 Virtio 。1 R5 |1 ^6 G5 m( ]# \
1 h1 S1 A2 H9 d! T: ]9 b2 ]重要:要用 sudo virsh edit 而非文本编辑器,如果你用文本编辑器编辑了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能识别出这些更改。如果 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 输出结果内容不同, VM 可能会运行异常。# {( P( E2 K4 n
4 q v9 l. v; \/ z% ^9 S0 ^9 ~
把你创建的 Ceph RBD 映像创建为 <disk> 条目。9 ?8 a1 Y3 R$ [
3 J. I" H$ C' ?, k6 u1 c: y
<disk type='network' device='disk'>2 O. y' ?9 ^- W( G5 v/ X* }
<source protocol='rbd' name='libvirt-pool/new-libvirt-image'>
[ s/ }& E8 k$ p, t& q" S/ d) p <host name='{monitor-host}' port='6789'/>
0 V/ k, \" }- N; [' t </source>
`4 Q' [% a! F( c# g9 M <target dev='vda' bus='virtio'/>
* C" C; R8 T4 o# @$ O</disk>
0 D7 Y" }' ]! }) `/ b7 R$ q用你的主机名替换 {monitor-host} ,可能还要替换存储池和/或映像名。你可以为 Ceph monitor 添加多条 <host> , dev 属性是将出现在 VM /dev 目录下的逻辑设备名。可选的 bus 属性是要模拟的磁盘类型,有效的设定值是驱动类型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。
; r3 m9 ]9 C; b7 v# r* {% U6 K5 Z5 X4 _5 S' [3 |# }. k
关于 <disk> 标签及其子标签和属性,详见硬盘。& H3 [6 i' h$ {. j& ?2 `) _
) f$ k: p/ s K
保存文件。
5 C( o' \6 s! T6 L- ~4 R
1 `" q, R* S! U; E: w如果你的 Ceph 存储集群启用了 Ceph 认证(默认已启用),那么必须生成一个 secret。# I1 M& C* ]: r- ~
0 T6 q% \( f/ U% w/ \+ g0 [) }
cat > secret.xml <<EOF
4 ^8 D V% q6 f" y3 P$ T- T- B<secret ephemeral='no' private='no'>
0 U/ z+ H- _. H$ c! W# _ <usage type='ceph'>
; ~& S( E$ ^, W1 T- t( U5 V <name>client.libvirt secret</name>
# u4 Y; S" I! N, }& z1 O! L </usage>& w' @( s7 c. l% f
</secret>) Y# x3 S2 W& x
EOF
8 ~9 }7 Q7 z' n o% `定义 secret。
8 B5 n+ p& H I* W6 W( @* C
/ H, _1 @7 t$ x3 H" Rsudo virsh secret-define --file secret.xml& V2 j) _" c! O& i
<uuid of secret is output here> m; W6 R, H/ t [6 }
获取 client.libvirt 密钥并把字符串保存于文件。2 k h% K, p$ u% ~/ _) F" X% E
2 V% m! Z9 |6 a. ]ceph auth get-key client.libvirt | sudo tee client.libvirt.key
- I" _2 g _$ U6 I* F y设置 secret 的 UUID 。- q6 D+ p$ u) q2 G/ @
0 j, O/ C( s* h; p( Q: d9 U) Hsudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
( i% b& M; K, `9 i/ m; B/ L/ Z/ t5 o还必须手动设置 secret,把下面的 <auth> 条目添加到前面的 <disk> 标签内(用上一命令的输出结果替换掉 uuid 值)。7 |3 ~5 I8 x. E' j( o
2 B- H! S u. m5 T" s# z1 ssudo virsh edit {vm-domain-name}: `1 K, f) u. }7 g9 h* C
然后,把 <auth></auth> 标签加进域配置文件:
2 y: [- Z, G# u' V3 T: i+ M& N% F' |. K6 K6 o# W4 V) _
...+ n* V5 B4 J* Y5 `% d# j1 E
</source>
6 ]8 \2 V4 o, S, M t: a<auth username='libvirt'>
& I# c: }# |: u# m <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>; x* `, l2 p3 C! P
</auth>6 [. [% X7 @' _( Y0 `" K Z2 T
<target ...
* D6 R2 o1 o/ C# B* @+ G( z' c注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。确保你用的是 Ceph 名的 ID 部分。如果出于某些原因你需要更换 secret,必须先执行 sudo virsh secret-undefine {uuid} ,然后再执行 sudo virsh secret-set-value 。
' J, A0 B w/ C* v! M5 w+ {' Q% d; [% \- G, l, e. ?
总结1 K. `5 h$ C+ S) g; m, o
一旦完成上面的配置,你就可以启动 VM 了。为确认 VM 和 Ceph 在通信,你可以执行如下过程。
; }' a; L+ m7 `: h* Z3 F" ~8 A8 }9 j* u7 o5 F
检查 Ceph 是否在运行:
' n+ d- f: ]+ p7 |) s: n0 B8 H* Q. K, `0 J- m* ~3 x
ceph health- l) G% x* ]2 m* v- k( f) h2 f
检查 VM 是否在运行。+ a% {6 \7 d$ g- P% C
; G8 ` n% `7 B& Q( O: Y( @; e
sudo virsh list
* W% [6 U/ u$ c检查 VM 是否在和 Ceph 通信,用你的 VM 域名字替换 {vm-domain-name} :
/ X0 f$ V2 b( n" \) k X) k% x8 `% o2 u4 B5 E7 s& P
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
( S: {# e M0 b. o$ D/ `) I检查一下 <target dev='hdb' bus='ide'/> 定义的设备是否出现在 /dev 或 /proc/partitions 里。
0 \; W- _" K/ U2 g; i0 E# P
# v9 c! a, v. I, X* \ kls dev$ N$ X/ K' x" c& Z. r
cat proc/partitions
/ o$ Q! [8 a8 K, q. K如果看起来一切正常,你就可以在虚拟机内使用 Ceph 块设备了。. C) }4 e9 X g/ U4 ]
3 H! U$ o* _) x$ W; _: O |
|