|
|
楼主 |
发表于 2024-11-1 10:21:20
|
显示全部楼层
libvirt 库是管理程序和软件应用间的一个虚拟机抽象层。通过 libvirt ,开发者和系统管理员只需要关注这些管理器的一个通用管理框架、通用 API 、和通用 shell 接口(即 virsh )即可,包括:: D& {: G b1 D$ s. D6 b3 C9 L* V
: N1 d; h3 Y2 [1 F5 yQEMU/KVM
7 R9 s! i! i& h5 D; wXEN
5 r1 k: D: s, B$ S; y ~ PLXC8 R) `* d# r/ I0 q3 H0 W
VirtualBox5 W% M( N9 t8 a( q- w9 b
等等
$ G% e) F" ^7 M' F/ x" YCeph 块设备支持 QEMU/KVM ,所以你可以通过能与 libvirt 交互的软件来使用 Ceph 块设备。下面的堆栈图解释了 libvirt 和 QEMU 如何通过 librbd 使用 Ceph 块设备。
2 C3 Z2 s- ?4 r8 y/ h4 i
( |# u6 t1 t' j+ {/ z+ p6 b9 M! o' e6 R
1 p: n" G7 b$ u) F( Mlibvirt 常见于为云解决方案提供 Ceph 块设备,像 OpenStack 、 ClouldStack 。它们用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再通过 librbd 与 Ceph 块设备交互。详情见块设备与 OpenStack 和块设备与 CloudStack 。关于如何安装见安装。
6 O- t# r2 ^6 `* b2 J, U( z& q. P$ R% {
你也可以通过 libvirt 、 virsh 和 libvirt API 使用 Ceph 块设备,详情见 libvirt 虚拟化 API 。9 D7 j- v5 X! s5 B2 X6 x
8 V: Z( C5 W2 F# y要创建使用 Ceph 块设备的虚拟机,请参照下文中的步骤。在示范性实施例中,我们用 libvirt-pool 作为存储池名、 client.libvirt 作为用户名、 new-libvirt-image 作为映像名。你可以任意命名,但请确保在后续过程中用自己的名字替换掉对应名字。, G7 `, }/ [3 E' i. Y
, m+ c. N: z! I- f! A( N0 ?
配置 Ceph
6 y$ z! _! B' u+ [! p配置 Ceph 用于 libvirt ,执行下列步骤:) d" k9 x% D; p. Q) {
1 j. Z; q6 v9 n! a. Y) [
创建——存储池(或者用默认的)。本例用 libvirt-pool 作存储池名,设定了 128 个归置组。/ W) a* h' ]$ T/ x
" u, h& d7 e( N9 F
ceph osd pool create libvirt-pool 128 128. R- E7 l$ ~- i# u5 ~5 b D
验证存储池是否存在。
. l! L; S, O0 y( i" I# q
. a a* Q% Z" o- l$ rceph osd lspools
$ R0 d1 j) b9 z0 d/ W! d; B3 B5 h创建—— Ceph 用户( 0.9.7 及之前的版本用 client.admin ),本例用 client.libvirt 、且权限限制到 libvirt-pool 。6 ~- M6 P; W; _) b$ r
* y% {; L5 m# ?1 ~6 M9 t8 q
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'' ~0 w6 z7 s% \, x1 w1 Z& q0 F
验证名字是否存在。
9 Z& }, u8 R2 b, d+ M) H
8 C3 d5 m+ ~7 Y% j- F* Rceph auth list
3 O6 p: I) v: C9 k注: libvirt 访问 Ceph 时将用 libvirt 作为 ID ,而不是 client.libvirt 。关于 ID 和名字不同之处的详细解释请参考用户管理——用户和用户管理——命令行界面。7 I1 h& C& `) ]9 X4 a
+ D' H: O$ T/ C4 r( N* O& S: t用 QEMU 在 RBD 存储池中创建映像。本例中映像名为 new-libvirt-image 、存储池为 libvirt-pool 。. b6 o4 {2 ^+ r. g. T- _( i
3 K/ U+ X2 \+ s5 Xqemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
: G& b' G' t# G" Z: Y验证映像是否存在。% C& l! ^- p/ h# G; c8 e, ^
+ ?1 a8 K( {$ J) M0 Nrbd -p libvirt-pool ls
2 `( R) G1 S/ k4 I7 ? g/ a9 h注:你也可以用 rbd create 创建映像,但我们建议使用示例中的命令,来顺便确认 QEMU 可正常运行。
& t' _, i: Y% E! w
5 J/ S( L# h# C4 B& M准备虚拟机管理器' c' i+ N& L- s$ O1 x+ ~
即使没 VM 管理器你也可以用 libvirt ,但是用 virt-manager 创建域更简单。
: h \$ Q* e/ I8 K q- s/ y& F
6 h0 j O) a* i3 {! \安装虚拟机管理器,详情见 KVM/VirtManager 。/ ?7 a& Q: |5 o' M% t9 E$ J4 g
0 A: B0 g3 r5 E" X, X" w
sudo apt-get install virt-manager
$ g V3 O' E' w. x下载一个 OS 映像(如有必要)。! ~* m( P7 k8 ?/ i8 ^( F, X( {
4 X% `+ h# W3 D( o0 w! E" Z: |6 G
启动虚拟机管理器。
2 Q* }; R+ o6 d1 p7 F$ o0 H6 A- X z
sudo virt-manager/ i4 d' b2 |8 M; {3 Y
新建虚拟机0 q& |1 f: e/ S
要用 virt-manager 创建 VM ,请按下列步骤:
; _5 {2 C- i4 q, r6 p; t8 ?3 I+ O& h7 h: T) F9 R
点击 Create New Virtual Machine 按钮。) N/ d# u. y5 K7 X1 J
7 h* B. C3 c' e- K命名新虚拟机的域,本例中我们用 libvirt-virtual-machine 。你可以任意命名,但请在后续命令行和配置实例中替换 libvirt-virtual-machine 为你自己选择的名字。
! Q( y0 J0 k1 _- f* x; G4 D
4 v& v: e7 w9 z9 S0 y2 E5 elibvirt-virtual-machine0 |7 }' B3 m, {/ D; U# N/ ~
导入映像。: k$ ~; Q0 u( B- N6 M
4 j; F- H! n9 }% |
/path/to/image/recent-linux.img( a7 Y4 `9 ?5 d9 v+ |8 H9 [9 t
注:请导入一个较新的映像。一些较老的映像未必能正确地重扫虚拟设备。3 m7 l* C, C+ \4 `1 l
. Y& Y8 {4 g- B9 n配置并启动 VM 。- q% }8 A: }3 q, ]
3 @. L8 b8 j0 @+ I; Y/ p( s可以用 virsh list 验证 VM 域是否存在。' M1 t$ @$ V5 ^5 n, i
5 C! N. [( A$ c7 ?$ Z- |% psudo virsh list5 k8 }" s: k# R6 i' X
登入 VM ( root/root ) Y% A: V7 @1 N0 ^- E6 ~2 A$ @
8 q) [9 {3 z2 _ M7 G在修改配置让它使用 Ceph 前,请先停止 VM 。
( _# k3 p4 b7 J
# }9 \" x1 h. R4 p q) `1 J( T/ m配置 VM! W# G# w, R- z/ \3 c
配置 VM 使用 Ceph 时,切记尽量用 virsh 。另外, virsh 命令通常需要 root 权限(如 sudo ),否则不会返回正确结果或提示你需要 root 权限。 virsh 命令参考见 Virsh 命令参考。6 [) U# [5 V% K( J4 t9 T; M8 Q
- w5 }* K( U0 P$ S0 W3 g8 k用 virsh edit 打开配置文件。
5 S0 x2 o& r: ]) {5 N) M) L3 v& V! R" p8 x# L- _
sudo virsh edit {vm-domain-name}
+ E/ d: q" t$ \) `( R2 O<devices> 下应该有 <disk> 条目。
' t' K. U, k+ e" {. r2 W2 @
, B6 @/ j5 {3 M# A; s k+ U9 d<devices>
5 n& k4 V% h, s4 o. B <emulator>/usr/bin/kvm</emulator>6 j( K) z9 e6 O$ x# \" o* h
<disk type='file' device='disk'>7 \4 X" y; n, t3 p: W3 x
<driver name='qemu' type='raw'/>0 G6 f4 ^" T9 ~4 F9 c0 P
<source file='/path/to/image/recent-linux.img'/>
$ y# V+ q- A% N! M, x' U <target dev='vda' bus='virtio'/>5 c; a& |6 Y7 l
<address type='drive' controller='0' bus='0' unit='0'/>
; _# E0 ?$ ]3 v# j4 b y </disk>
, D/ t. _4 x' @$ @2 x用你的 OS 映像路径替换 /path/to/image/recent-linux.img 。使用较快的 virtio 总线的最低内核版本是 2.6.25 ,参见 Virtio 。
* N1 c) ?$ `' Z4 ~9 x" W+ ]" V8 m) T% ]' \5 r
重要:要用 sudo virsh edit 而非文本编辑器,如果你用文本编辑器编辑了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能识别出这些更改。如果 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 输出结果内容不同, VM 可能会运行异常。
) W- f4 ]8 O7 v7 f7 j/ e8 K7 s ~' A% r- B6 J3 V7 Z6 ]" H; P/ K6 K
把你创建的 Ceph RBD 映像创建为 <disk> 条目。
0 b: [1 H% l% b# T n8 b
3 f" H& b$ ~# O<disk type='network' device='disk'>
{2 I) [. R8 s3 f, z <source protocol='rbd' name='libvirt-pool/new-libvirt-image'>
) }* v! K4 o5 F% w <host name='{monitor-host}' port='6789'/>
. N8 n# g& K9 ~' E; b </source>5 y5 P. ?! Z% H% N: M' ^3 c
<target dev='vda' bus='virtio'/>
- x/ L3 g* _* Z5 p9 e</disk>
% }2 ~. M! n [) i" [* x/ \, ~用你的主机名替换 {monitor-host} ,可能还要替换存储池和/或映像名。你可以为 Ceph monitor 添加多条 <host> , dev 属性是将出现在 VM /dev 目录下的逻辑设备名。可选的 bus 属性是要模拟的磁盘类型,有效的设定值是驱动类型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。
! T8 O+ @ M% G& j
8 F# {8 E8 u( A关于 <disk> 标签及其子标签和属性,详见硬盘。2 R$ _( W$ F" B/ \( w
: F0 [0 H, C4 W
保存文件。9 c: |+ \! W. h! t
, X: v; d: K3 ?0 z2 q+ ]. ]8 O如果你的 Ceph 存储集群启用了 Ceph 认证(默认已启用),那么必须生成一个 secret。" `) a3 w$ r0 q* l$ Z
( Y) n" W% f) _1 ^& v
cat > secret.xml <<EOF
# K. |4 w. L' X8 i# \<secret ephemeral='no' private='no'>7 J6 |$ c7 X9 u9 s" S( p8 x
<usage type='ceph'>" A4 p/ U f, ?
<name>client.libvirt secret</name>
$ b% `' E0 L5 t, K0 q9 W2 d6 m </usage>
( d, ~4 Q9 S; U</secret>" J9 d$ r" E2 s. S3 p) Q. f
EOF; B* t& y* {+ X# X: x; h8 P
定义 secret。( m4 B1 _! q3 Q7 y
% D) c: p8 l5 |" n" h; |
sudo virsh secret-define --file secret.xml; I4 Z/ v+ x% g x: {, j9 S
<uuid of secret is output here>
- U# [0 I1 k& d) m0 L" N4 R5 R* ~, i获取 client.libvirt 密钥并把字符串保存于文件。! S. _2 P' A2 @4 o/ c4 d
- ^2 u; m |" g3 u7 n4 S& P1 w! M
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
# F. h0 j8 h* ]5 c$ z& _) a设置 secret 的 UUID 。1 L# ?) F( ^9 f1 l' l8 g7 D, n
; i: I( s$ U1 z# C4 C5 j% z
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
& }6 Z' H( J- ~8 k$ Y8 j还必须手动设置 secret,把下面的 <auth> 条目添加到前面的 <disk> 标签内(用上一命令的输出结果替换掉 uuid 值)。
, C6 `& o7 {: T, k4 L" x; u/ z# e2 T+ F9 s; w, y
sudo virsh edit {vm-domain-name}! s+ d% ~- w; Q# ^
然后,把 <auth></auth> 标签加进域配置文件:) w$ R! r+ n5 K4 Z; o) M) p
f* h. g! r* w* M- h3 p
...
" |- Y( J# V0 `0 F1 P</source>! W6 S0 x/ l; K# e1 i
<auth username='libvirt'>, b Y. m/ c2 M: J+ ~
<secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>- k$ D8 h A# v
</auth>$ `4 K& r- L! G8 S4 [) S# `
<target ...
, Y5 L- T. e. G6 _; `注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。确保你用的是 Ceph 名的 ID 部分。如果出于某些原因你需要更换 secret,必须先执行 sudo virsh secret-undefine {uuid} ,然后再执行 sudo virsh secret-set-value 。
0 _2 j0 Y: \4 `) o( B
. d; i4 t* d( s) g. [* E9 n3 Q: @总结
/ _8 H; p4 x4 j一旦完成上面的配置,你就可以启动 VM 了。为确认 VM 和 Ceph 在通信,你可以执行如下过程。* R, ~ d: R8 v% B: b3 i, K# L
4 {( N* t1 x* q+ B- Z; N4 H/ A
检查 Ceph 是否在运行:) \2 @9 L: w7 \4 z( X+ _$ f$ L0 h
5 c8 @& z: X1 w+ e V' S
ceph health( D6 }6 g5 x- v+ t2 G8 [
检查 VM 是否在运行。# g1 Y3 p& q+ d, f0 c( A6 W
' M9 K' q/ i+ C9 c" @sudo virsh list( N$ y/ n4 s8 ^" C
检查 VM 是否在和 Ceph 通信,用你的 VM 域名字替换 {vm-domain-name} :' }+ n# u) g4 O2 {% ?$ D: K; u
# N V- u5 ?) I3 v, [, u
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'; z- ~0 s5 @6 c) J ^
检查一下 <target dev='hdb' bus='ide'/> 定义的设备是否出现在 /dev 或 /proc/partitions 里。9 B, d+ ^( `, U* g
+ W; K T0 b2 ]3 H" D9 f% b
ls dev4 S3 ~% u% h0 j' Q+ R
cat proc/partitions3 F( ]( O5 X8 P7 z3 T1 W8 h. B
如果看起来一切正常,你就可以在虚拟机内使用 Ceph 块设备了。
/ x3 Q* S& {7 x
/ o: D+ h% Q. c- V. U8 x |
|