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

楼主 |
发表于 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 |
|