Linux-IO Target(LIO SCSI Target)介绍(二)

2023-10-31

使用targetcli创建loop Targetvhost Target

除了常见的SAN Target之外,Linux-IO Target还支持两种特殊Targetloopvhost。其loop Target可以为本机模拟一个完全实现SPC-3SPC-4规范的设备vhost则是专门为虚拟化设计的功能,它在宿主操作系统的内核中实现一个支virtio规范SCSI TargetInitiator户机virtio-scsi控制,使用半虚拟virtio。这样客户操作系统就可以通virtio-scsi驱动和宿主操作系统内核vhost Target直接通不需Hypervisor的干预,减少了切换开销,提高IO吞吐量在客户操作系统virtio-scsi控制virtio-scsi设备和一般SCSI设备一样,在宿主这端,我们则可以很灵活vhost Target与各种各样backstore对象关联。配置,性能也较高

 

Linux-IO Target现有的架构vhost-scsi设备并不复杂。2显示Linux-IO Target的各个组件LIO模拟了通用SCSI设备,并且实现SPC-34接着,通过各种各backstore对象,来导入真正的后端存储,最后连接上各种前Fabric模块,来导出模SCSI设备。无论Fibre ChannelFCoEiSCSIvhostvirtio),都只是一Fabric技术,我们可以将其理解成传输协议,而在这些传输协议中传SCSI命令则总是由核SCSI设备处理的。要支持新Fabric技术,并不需要修改核心SCSI设备和后端存储,只需要按照Fabric技术的规范实现SCSI命令的传输就可iSCSI技术就SCSI命令放TCP/IP中传输vhost技术就SCSI命令放virtio队列中传输

 

2. Linux-IO Target的各逻辑组(摘LIO官网

image

创建loopback Target的指令如清9。创建完毕后,可以运lsscsi,系统发现了新SCSI设备,设备节点/dev/sdb

 

清单9. 创建loopback Target

[root@localhost edward]# targetcli

/> cd loopback

/loopback> create

Created target naa.5001405c81b9d906.

/loopback> cd naa.5001405c81b9d906/

/loopback/naa.5001405c81b9d906> luns/ create /backstores/ramdisk/rd0

Created LUN 0.

/loopback/naa.5001405c81b9d906> cd /

/> ls

o- / ..................................................................... [...]

o- backstores .......................................................... [...]

| o- block .............................................. [Storage Objects: 0]

| o- fileio ............................................. [Storage Objects: 1]

| | o- disk0 ............... [/tmp/disk0.img (10.0MiB) write-back deactivated]

| o- pscsi .............................................. [Storage Objects: 0]

| o- ramdisk ............................................ [Storage Objects: 1]

| o- rd0 ............................................. [(10.0MiB) activated]

o- iscsi ........................................................ [Targets: 0]

o- loopback ..................................................... [Targets: 1]

| o- naa.5001405c81b9d906 ............................. [naa.5001405f01cea298]

| o- luns ........................................................ [LUNs: 1]

| o- lun0 .................................................. [ramdisk/rd0]

o- vhost ........................................................ [Targets: 0]

/> exit

[edward@localhost ~]$ lsscsi

[0:0:0:0] disk ATA HITACHI HTS72755 JF3Z /dev/sda

[1:0:0:0] cd/dvd HL-DT-ST DVDRAM GT50N LT20 /dev/sr0

[7:0:1:0] disk LIO-ORG rd0 4.0 /dev/sdb

 

我们可以使dd命令测试一sdb的读写速度,由sdb的后端实际ramdisk,读写速度应该特别快。在作者的笔记本电脑上,测试的结果如清10所示

 

清单10. 读写loopback SCSI设备

[root@localhost edward]# dd if=/dev/zero of=/dev/sdb bs=1048576 count=10 oflag=dsync,direct

记录了10+0 的读入

记录了10+0 的写出

10485760字节(10 MB)已复制,0.00621256 秒,1.7 GB/

[root@localhost edward]# dd if=/dev/sdb of=/dev/null count=10 bs=1048576 iflag=dsync,direct

记录了10+0 的读入

记录了10+0 的写出

10485760字节(10 MB)已复制,0.00590365 秒,1.8 GB/

 

创建vhost Target的指令如清11所示,创建成功后,可以KVM虚拟机,并在客户操作系统中找到对应LUN

 

清单11. 创建vhost Target并启动KVM虚拟机

[root@localhost edward]# targetcli

targetcli shell version 2.1.fb30

Copyright 2011-2013 by Datera, Inc and others.

For help on commands, type 'help'.

 

/> loopback/ delete naa.5001405c81b9d906

Deleted Target naa.5001405c81b9d906.

/> cd vhost

/vhost> create

Created target naa.5001405162d5cf9d.

Created TPG 1.

/vhost> cd naa.5001405162d5cf9d/tpg1/

/vhost/naa.50...62d5cf9d/tpg1> luns/ create /backstores/ramdisk/rd0

Created LUN 0.

/vhost/naa.50...62d5cf9d/tpg1> cd /

/> ls

o- / ..................................................................... [...]

o- backstores .......................................................... [...]

| o- block .............................................. [Storage Objects: 0]

| o- fileio ............................................. [Storage Objects: 1]

| | o- disk0 ............... [/tmp/disk0.img (10.0MiB) write-back deactivated]

| o- pscsi .............................................. [Storage Objects: 0]

| o- ramdisk ............................................ [Storage Objects: 1]

| o- rd0 ............................................. [(10.0MiB) activated]

o- iscsi ........................................................ [Targets: 0]

o- loopback ..................................................... [Targets: 0]

o- vhost ........................................................ [Targets: 1]

o- naa.5001405162d5cf9d .......................................... [TPGs: 1]

o- tpg1 .............................. [naa.50014059b977cca7, no-gen-acls]

o- acls ...................................................... [ACLs: 0]

o- luns ...................................................... [LUNs: 1]

o- lun0 ................................................ [ramdisk/rd0]

/> exit

[root@localhost edward]# qemu-system-x86_64 -m 1024 -enable-kvm -device \

> vhost-scsi-pci,id=vhost-scsi0,wwpn=naa.5001405162d5cf9d \

> -cdrom iso/Fedora-Live-Xfce-x86_64-20-1.iso \

> -vnc 127.0.0.1:1 -vga qxl

 

使VNC客户端127.0.0.1:1,我们就进入了客户操作系统的图形界面。在客户操作系统中,我们可以运lspci命令,可以看Virtio SCSI控制器,运lsscsi,则可以看/dev/sda设备,这个设备的后端就是我们通vhost在宿主操作系统中导出LUN。命令的输出如12所示

 

清单12. 在客户操作系统中列出Virtio SCSI控制器和设备

[root@localhost liveuser]# lspci

00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)

00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]

00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]

00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)

00:02.0 VGA compatible controller: Red Hat, Inc. Device 0100 (rev 04)

00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 03)

00:04.0 SCSI storage controller: Red Hat, Inc Virtio SCSI

[root@localhost liveuser]# lsscsi

[1:0:0:0] cd/dvd QEMU QEMU DVD-ROM 1.6. /dev/sr0

[2:0:1:0] disk LIO-ORG rd0 4.0 /dev/sda

 

我们可以在客户操作系统中sdasda的真正的后端是宿主操作系统上ramdisk,因此读写速度应该比较dd命令的输出结果如清13

 

清单13. 在客户操作系统中读写Virtio SCSI设备

[root@localhost liveuser]# dd if=/dev/sda of=/dev/null count=10 bs=1048576 iflag=dsync,direct

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.00762005 s, 1.4 GB/s

[root@localhost liveuser]# dd if=/dev/zero of=/dev/sda count=10 bs=1048576 oflag=dsync,direct

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.0144263 s, 727 MB/s

 

小结

targetcli的操作简便,界面友好。用户在熟Linux-IO Target的各个对象的层级关系之后,可以很轻松的创建、修改、删除目录树的各级节点,管理各种各样的后端存储Target。用targetcli之后,估计读者再也不想tgtadmin的时代

rtslib介绍

rtslib是一Python程序库,让用户可以以编程的方式Linux-IO Target的各项功能rtslib中的对象也被组织成树状结构,并且与我们targetcli中熟悉的各种对象也很相似。熟悉targetcli的操作之后,rtslib编程就变得十分容易。首先,我们需要安python-rtslibRPM包。还可以安python-rtslib-docRPM包,里面包含了接口的说明文档。下面iSCSI为例,展示如何rtslibTarget。程序见清14

 

清单14. 使rtslibiSCSIiscsiTest.py

import rtslib

 

def createTarget():

fio = rtslib.FileIOStorageObject(

'disk0', dev='/tmp/disk0.img', size=100 * 1024 * 1024)

iscsiMod = rtslib.FabricModule('iscsi')

tgt = rtslib.Target(iscsiMod, mode='create')

tpg = rtslib.TPG(tgt, tag=None, mode='create')

rtslib.LUN(tpg, lun=None, storage_object=fio)

tpg.set_attribute('generate_node_acls', '1')

tpg.set_attribute('cache_dynamic_acls', '1')

tpg.set_attribute('authentication', '0')

tpg.set_attribute('demo_mode_write_protect', '0')

tpg.enable = True

rtslib.NetworkPortal(tpg, '0.0.0.0', mode='create')

return tgt.wwn

 

print createTarget()

 

以超级用户运iscsiTest.py以创iSCSI Target,为了targetcli ls命令,可以查看结果,输出如清15

 

清单15. 运行iscsiTest.py并验证结果

[root@localhost edward]# python iscsiTest.py

iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.5896eabe652f

[root@localhost edward]# targetcli ls

o- / ..................................................................... [...]

o- backstores .......................................................... [...]

| o- block .............................................. [Storage Objects: 0]

| o- fileio ............................................. [Storage Objects: 1]

| | o- disk0 ................ [/tmp/disk0.img (100.0MiB) write-thru activated]

| o- pscsi .............................................. [Storage Objects: 0]

| o- ramdisk ............................................ [Storage Objects: 0]

o- iscsi ........................................................ [Targets: 1]

| o- iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.5896eabe652f . [TPGs: 1]

| o- tpg1 .............................................. [gen-acls, no-auth]

| o- acls ...................................................... [ACLs: 0]

| o- luns ...................................................... [LUNs: 1]

| | o- lun0 .............................. [fileio/disk0 (/tmp/disk0.img)]

| o- portals ................................................ [Portals: 1]

| o- 0.0.0.0:3260 ................................................. [OK]

o- loopback ..................................................... [Targets: 0]

o- vhost ........................................................ [Targets: 0]

 

iscsiTest.py的核心代码只10来行,就创建了一个文件后端对象,和一iSCSI Target,使rtslib编程很方便要了每个方法调用的意义,读者可以参rtslib的文档,如果装python-rtslib-doc,文档的位置/usr/share/doc/python-rtslib-doc/html/index.html。需要注意的是FedoraRHELCentOS打包rtslib和官方版的编程接口略有不同,示例程序是Fedora发行python-rtslib写的,如果读者UbuntuDebian上使rtslib,需要参考官方接口文档

 

小结

Linux-IO TargetLinux平台上比较先进的内核SCSI Target方案。其功能强大,可以导入各种后端存储,实现了SPC-34模拟,支持多SAN技术,还为虚拟化提供了特别的优targetcli 是其用户态的配置工具,shell的方式在一个配置目录树上运行,界面十分友好rtslibLinux-IO TargetPython编程接口,使用起来很简单,短10来行代码就能创建存储后Target。根Linux-IO Target项目的官方时间2014年将支NPIV,很值得期待

 

参考资源

参考SCSI Target的维基百科页,了SCSI TargetInitiator的功能

参考Linux-IO Target的官方,以了解其具和开发时间表

参考Linux Weekly News,了解LIO的历史。

targetcliWiki,详细targetcli的各个功能

iSCSIWiki,了解如何使Linux-IO Target管理iSCSI Target

loopbackWiki,了解如何使Linux-IO Target管理loopback Target

virtio-scsi的介,了virtio-scsi在虚拟化中的应

virtio-scsi的讨,了解SCSI模拟技术在虚拟化中的应

vhostWiki,了解如何使Linux-IO Target管理vhost Target

rtslib官方接口文,详细rtslib的编程接口

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux-IO Target(LIO SCSI Target)介绍(二) 的相关文章

  • linux 查看及修改字符集

    一 查看当前linux系统的字符集方法 1 1 locale 1 2 echo LANG 1 3 env grep LANG 二 查看当前系统支持的字符集 root localhost locale a 三 修改系统字符集 3 1 临时生效
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • CentOS 7 关闭网络限制

    1 安装CentOS 7 3操作系统mini版本即可 2 设置关闭Selinux 编辑 etc selinux config vi etc selinux config SELINUX disabled 重启机器 查看selinux状态 s
  • Filebench 使用手册

    Filebench 使用手册 介绍 Filebench 是一个文件系统和存储基准 可以生成各种各样的工作负载 与典型的基准测试不同 它非常灵活 允许使用其广泛的工作负载模型语言 WML 指定应用程序的 I O 行为 用户可以从头开始描述所需
  • su命令切换用户输入密码后,提示:鉴定故障

    在终端通过su命令切换用户输入密码后 提示 鉴定故障 这是因为在安装linux系统时未设置root用户密码造成的 需要重新设置密码后再切换用户 具体操作命令如下 设置root用户密码 sudo passwd root 切换用户 su
  • 操作系统PV操作及读者写者问题

    操作系统PV操作及读者写者问题 目录 1 信号量 2 P V操作原语可描述为以下式子 3 解释 4 互斥模式原理 5 同步模式原理 6 读者写者问题 1 信号量 PV操作与信号量的处理有关 信号量是表示资源的实体 是一个与队列有关的整型变量
  • JSON.stringify()

    JSON stringify 将一个JavaScript值 对象或者数组 转换为一个 JSON字符串 如果指定了replacer是一个函数 则可以选择性的替换值 或者如果指定了replacer是一个数组 可选择性的仅包含数组指定的属性 语法
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • 红帽7.9部署telnet服务

    升级ssh 为预防万一提前配置telnet服务 安装软件包 yum install telnet server yum install xinetd xinetd加入开机自启 systemctl enable xinetd service
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • Common块和Bss段的区别

    昨天看 程序员的自我修养 链接 装载与库 发现不是很理解为什么要用common块 然后仔细看了一番 有了自己的理解 common块 用来存放弱符号 而全局未初始化变量是弱符号 但是难道不是应该存放在 bss段吗 为什么要有common块呢
  • 地址映射与共享

    跟踪地址映射过程 1 通过命令 dbg asm启动调试器 在linux 0 11运行test c文件 使其进入死循环 我们的任务就是找到i的地址并将其修改为0使test c程序退出循环 2 在命令行输入crit c使Boch暂停 一般会显示
  • Linux(12):磁盘配额(Quota)与进阶文件系统管理

    磁盘配额 Quota 的应用与实作 Quota 的一般用途 针对 www server 例如 每个人的网页空间的容量限制 针对 mail server 例如 每个人的邮件空间限制 针对 file server 例如 每个人最大的可用网络硬盘
  • Kubernetes pod 无法挂载 iSCSI 卷:无法获取 iSCSI 磁盘的任何路径

    我想将 iSCSI 卷添加到 Pod 如下所示这个例子 https github com kubernetes examples tree master staging volumes iscsi 我已经在 Debian 服务器上准备了 i

随机推荐