searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

qemu虚拟机iSCSI盘pr-helper配置

2023-05-24 03:33:35
163
0

一 功能简介

SCSI 类型共享云硬盘是一种支持多台云主机并发读写操作的数据块级存储设备。通过 Lun 卷的 SCSI 锁机制,即 SCSI Reservation 命令来进行 SCSI 锁的操作。如果某台主机给磁盘传输了一条SCSI Reservation 命令,则这个磁盘对于其他的主机就处于锁定状态。该机制有效避免了多台云主机同时操作磁盘时对磁盘数据造成破坏。

SCSI-3 Reservation(Persistent Reservation)是使用 PR Key 来对设备进行加锁。一台 Host 会有唯一的 PR Key,不同的 host,PR Key 也不同。所以使用该机制,需要将多台云主机分散到不同的物理计算节点上,否则 SCSI 锁无法生效。

虚拟机可以通过指令透传将PR等特权指令透传至宿主机执行,也可以使用libvirt的reservations实现共享云硬盘,本文介绍后者,该方案需要满足以下前提条件。

 

- 1. libvirt version >= 4.4.0。
- 2. 虚拟机磁盘使用 virtio-scsi 驱动,且磁盘格式为真实的整块 raw 格式磁盘。
- 3. 使用同一块共享盘的多个虚拟机所在的宿主机,具有反亲和性。
 

二  方案说明

libvirt 从 4.4.0 版本开始支持配置 reservations。配置该 element 可以为基于 SCSI 类型的磁盘开启 persistent reservations。该 element 必须配置 managed 属性,这个属性可选值为 `yes `和` no`。当配置为 yes 时,由 libvirt 来准备并管理需要的资源。配置为 no 时,由 hypervisor 充当客户端,并提供服务的 unix socket 路径。
 
qemu 提供 persistent reservation manager,它将通过 Unix 套接字将命令转发到外部特权帮助程序。帮助程序仅允许将 persistent reservations 命令发送到 QEMU 具有文件描述符的设备,因此QEMU除非可以访问套接字和设备,否则将无法进行持久保留。
 

2.1 配置managed=yes(不推荐)

<disk type='block' device='lun'>
    <driver name='qemu' type='raw' cache='none'/>
    <source dev='/dev/mapper/mpatha'>
        <reservations managed='yes'/>
    </source>
    <target dev='sda' bus='scsi'/>
</disk>
 
这种配置方式是将PR的权限管理全部交给libvirt来管理,此配置参数在iSCSI盘使用多路径管理时会出现io error问题,故不推荐
 

2.2 配置managed=no(推荐)

配置为no需要启动qemu-pr-helper服务,并进行相应的unix domain socket配置。qemu 2.12.0版本及以上已提供了此功能。
1.首先安装qemu相关服务
 
yum install -y qemu-kvm-ev qemu-kvm-common qemu-kvm-tools-ev qemu-img-ev libvirt-daemon-driver-qemu
2.启动qemu-pr-helper服务
qemu-pr-helper -d --socket=/var/run/qemu-pr-helper.sock      # /var/run/qemu-pr-helper.sock 为自行指定的路径
3.配置虚拟机
<disk type='block' device='lun'>
    <driver name='qemu' type='raw' cache='none'/>
    <source dev='/dev/mapper/mpatha'>
        <reservations managed='no'>
            <source type='unix' path='/var/run/qemu-pr-helper.sock' mode='client'/>
        </reservations>
    </source>
    <target dev='sda' bus='scsi'/>
    <address type='drive' controller='0' bus='0' target='0' unit='1'/>

</disk>
 

 

三 验证

测试环境
 一台Centos7.0服务器作为发起端,同时作为宿主机,安装了libvirt4.5以及qemu2.12.0 ;centos虚机作为iSCSI网关提供target1(3260/3261端口)
 
操作步骤
1.发起端登录target1,盘符为sda,sda,生成路径mpatha(failover模式,sda是Active状态)
2. 将mpatha映射给虚拟机V1使用,作为虚机的sda
3. 在虚机内对sda进行mkfs,然后挂载至mnt目录
4. cp一个文件到mnt目录,然后在拷贝过程中关闭sda的端口(3260,40001)
现象
宿主机上可观察到`Active`的路径sda`failed`,但是并不会虚拟机拷贝文件;并且在虚拟机执行PR等特权指令也都正常
0条评论
0 / 1000