内核模块
MAP A BLOCK DEVICE
用于rbd将映像名称映射到内核模块。您必须指定映像名称,池名称和用户名。rbd如果尚未加载,则将代表您加载RBD内核模块。
#语法:
sudo rbd device map {pool-name}/{image-name} --id {user-name}
#举例:
sudo rbd device map images/foo --id admin
如果使用cephx身份验证,则还必须指定一个密码。它可能来自密钥环或包含机密的文件。
sudo rbd device map rbd/myimage --id admin --keyring /path/to/keyring
sudo rbd device map rbd/myimage --id admin --keyfile /path/to/file
显示映射的块设备
rbd device list
取消映射块设备
sudo rbd device unmap /dev/rbd/{poolname}/{imagename}
qemu
最常见的Ceph块设备用例涉及向虚拟机提供块设备映像。例如,用户可以在理想配置中使用OS和任何相关软件来创建“黄金”映像。然后,用户拍摄图像的快照。最后,用户克隆快照(通常多次)。有关详细信息,请参见快照。制作快照的写时复制副本的能力意味着Ceph可以快速将块设备映像配置到虚拟机,因为客户端不必在每次启动新虚拟机时都下载整个映像。
用法
QEMU命令行要求您指定池名称和映像名称。您也可以指定快照名称。
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
例如,指定id和conf选项可能类似于以下内容:
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
创建镜像
从QEMU创建块设备映像。您必须指定rbd,池名称和要创建的映像的名称。您还必须指定图像的尺寸。
#语法
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
#举例:
[ceph@ceph06 ~]$ qemu-img create -f raw rbd:images/os7 10G
Formatting 'rbd:images/os7', fmt=raw size=10737418240 cluster_size=0
注: 该raw数据格式是真正的唯一明智 format与RBD使用选项。从技术上讲,您可以使用其他QEMU支持的格式(例如qcow2或vmdk),但是这样做会增加额外的开销,并且在启用缓存(请参阅下文)时,对于虚拟机实时迁移,也将使该卷不安全。
调整镜像大小
#语法:
qemu-img resize rbd:{pool-name}/{image-name} {size}
#举例:
[ceph@ceph06 ~]$ qemu-img resize rbd:images/os7 8G
Image resized.
检索镜像信息
#语法:
qemu-img info rbd:{pool-name}/{image-name}
#举例:
[ceph@ceph06 ~]$ rbd info images/os7
rbd image 'os7':
size 8 GiB in 2048 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 2d6c313e37da0
block_name_prefix: rbd_data.2d6c313e37da0
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed May 13 05:45:00 2020
access_timestamp: Wed May 13 05:52:14 2020
modify_timestamp: Wed May 13 05:45:00 2020
运行QEMU与RBD
QEMU可以将块设备从主机传递到来宾,但是由于QEMU 0.15,因此无需将映像映射为主机上的块设备。相反,QEMU可以直接通过访问作为虚拟块设备的映像librbd。这会更好,因为它避免了额外的上下文切换,并且可以利用RBD缓存。
您可以qemu-img用来将现有的虚拟机映像转换为Ceph块设备映像。例如,如果您有一个qcow2图像,则可以运行:
qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze
要运行从该映像启动的虚拟机,可以运行:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze
RBD缓存可以显着提高性能。从QEMU 1.2开始,QEMU的缓存选项控制librbd缓存:
qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback
如果您使用的是较旧版本的QEMU,则可以将librbd缓存配置(如任何Ceph配置选项一样)设置为“文件”参数的一部分:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
注:如果设置rbd_cache = true,则必须设置cache = writeback或冒数据丢失的风险。如果不使用cache = writeback,则QEMU不会将刷新请求发送到librbd。如果QEMU在此配置中异常退出,则位于rbd之上的文件系统可能已损坏。
libvirt
该libvirt库在虚拟机管理程序接口和使用它们的软件应用程序之间创建虚拟机抽象层。使用 libvirt,开发人员和系统管理员可以专注于virsh针对许多不同虚拟机管理程序的通用管理框架,通用API和通用外壳程序接口。
Ceph块设备支持QEMU / KVM。您可以将Ceph块设备与与进行交互的软件一起使用libvirt。以下堆栈图说明了libvirt QEMU和QEMU 如何通过来使用Ceph块设备librbd。
示例,使用ceph的块设备作为kvm虚拟机的系统硬盘:
1、创建一个pools池,这里我还是用images池,没有这个池的按照下面命令创建(我的前面已经创建好了)
ceph osd pool create images 32 32
rbd pool init images
2、创建一个Ceph用户
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=images'
3、使用QEMU 在RBD池中创建映像
qemu-img create -f raw rbd:images/os7 8G
4、准备虚拟机环境
yum install qemu-kvm qemu-kvm-tools -y
yum install virt-install.noarch virt-manager python-virtinst -y
yum install libvirt libvirt-python -y
5、创建一个虚拟,先不添加硬盘
virt-install --virt-type kvm --name os7 --ram 1024 --cdrom=/tmp/os7.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=liunx --os-variant=rhel7 --disk none
6、先停止运行虚拟机
virsh shutdown os7 #这个停止不了的就用virsh destroy os7强制停止
7、配置虚拟机
$ virsh edit os7
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/tmp/os7.iso'/> #这行os7.xml开始是没有的,这里给加上系统iso镜像所在的位置
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
#在os7的xml文件上会有上面的条目,在</disk>下添加rbd硬盘的配置:
<disk type='network' device='disk'>
<source protocol='rbd' name='images/os7'> #这里填写的是上面步骤3在rbd块上建的镜像
<host name='ceph01' port='6789'/> #mon的地址和端口,这里更改成你自己的
<host name='ceph02' port='6789'/>
<host name='ceph03' port='6789'/>
</source>
<target dev='vdb' bus='virtio'/>
</disk>
#添加cdrom的引导,要不启动虚拟机就找硬盘引导,还没装上系统会提示找不到引导的。
<boot dev='cdrom'/> #在<boot dev='hd'/>上面加上这一行,注意安装完系统后一定删除这行,要不启动系统就进行光盘引导
<boot dev='hd'/>
//添加上面内容后,保存文件
//如果您的Ceph Storage Cluster 启用了Ceph身份验证(默认情况下会启用),则必须生成一个密码。进行如下操作
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
//创建secret.xml文件后,定义secret
$ sudo virsh secret-define --file secret.xml
$ sudo cat /etc/libvirt/secrets/c24c4c80-538d-4d4e-9091-49e8d09a99d5.xml #在/etc/libvirt/secrets下生成一个文件
<secret ephemeral='no' private='no'>
<uuid>c24c4c80-538d-4d4e-9091-49e8d09a99d5</uuid> #记住这个这uuid,后面用的上
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
//获取client.libvirt密钥并将密钥字符串保存到文件中。如下操作
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
//设置secret的UUID
sudo virsh secret-set-value --secret c24c4c80-538d-4d4e-9091-49e8d09a99d5 --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
#再编辑kvm虚拟机的xml文件,在disk里的</source>后面添加下面内容
$ virsh edit os7
<auth username='libvirt'>
<secret type='ceph' uuid='c24c4c80-538d-4d4e-9091-49e8d09a99d5'/>
</auth>
8、启动虚拟机
virsh start os7
9、检查设备是否正与ceph通信
[ceph@download ~]$ sudo virsh qemu-monitor-command --hmp os7 'info block'
drive-ide0-0-0: removable=1 locked=1 tray-open=0 io-status=ok file=/tmp/os7.iso ro=1 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
drive-virtio-disk1: removable=0 io-status=ok file=rbd:images/os7:id=libvirt:key=AQDRLr5ekMcfJxAAiIa6WZ4CzV4VWOreAfDOkw==:auth_supported=cephx\\;none:mon_host=ceph01\\:6789\\;ceph02\\:6789\\;ceph03\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
10、检查设备是否存在上面添加的vdb磁盘
[ceph@download ~]$ sudo virsh domblklist os7 --details
类型 Device 目标 源
------------------------------------------------
file cdrom hda /tmp/os7.iso
network disk vdb images/os7