关于open-iscsi

open-iscsi是一个实现 RFC3720 iSCSI协议的高性能initiator程序。iSCSI使得访问SAN上的存储不再只能依赖Fibre Channel,也可以通过TCP协议和以太网络。在很多Linux平台都可以方便的下载到open-iscsi包。

有了它就可以在Linux上直接连接远端的block device了,就像使用本地block device一样方便。


目前是open-iscsi包含两个部分:内核部分和用户空间部分

  • Kernel part(内核)

实现了scsi read/write功能,包含3个内核模块 scsi_transport_iscsi.ko, libiscsi.ko and iscsi_tcp.ko,在安装了open-iscsi的Linux上,可以查看到。

$ sudo lsmod | grep iscsi -i
iscsi_trgt
iscsi_tcp
libiscsi_tcp iscsi_tcp
libiscsi libiscsi_tcp,iscsi_tcp,ib_iser
scsi_transport_iscsi iscsi_tcp,ib_iser,libiscsi
scsi_mod sg,scsi_transport_spi,scsi_dh,scsi_transport_iscsi,libata,mptspi,sd_mod,sr_mod,iscsi_tcp,mptscsih,ib_iser,libiscsi
  • User space part(用户空间)

主要完成如:配置管理,iSCSI target的自动发现,登录、登出,错误处理和连接保持等。用户通过 iscsiadm 来管理initiator端与target端的连接。下面是管理工具iscsiadm的使用帮助。

$ sudo iscsiadm --help
iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]
iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]
iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o operation ] [ -n name ] [ -v value ] ]
iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]
iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]
iscsiadm -m fw [ -d debug_level ] [ -l ]
iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] ]
iscsiadm -k priority

安装open-iscsi

  • Debian/Ubuntu

sudo apt-get install open-iscsi
  • Redhat/Centos/Suse

yum install iscsi-initiator-utils

安装完成后,比较重要的配置文件有两个: /etc/iscsi/iscsid.conf  以及 /etc/iscsi/initiatorname.iscsi

iscsi的基本配置文件

  • /etc/iscsi/initiatorname.iscsi

这个文件包含host的initiator IQN,在很多企业级存储上都要用到这个,否则无法访问存储上的资源。

$ sudo cat /etc/iscsi/initiatorname.iscsi
## DO NOT EDIT OR REMOVE THIS FILE!
## If you remove this file, the iSCSI daemon will not start.
## If you change the InitiatorName, existing access control lists
## may reject this initiator. The InitiatorName must be unique
## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.
InitiatorName=iqn.1993-08.org.debian:01:2b22ec4c44d
  • /etc/iscsi/iscsid.conf

这个文件包含open-iscsi的配置,下面会提到一些个人经常遇到的一些设置

node.startup = [automatic | manual ]

# To request that the iscsi initd scripts startup a session set to "automatic".
# node.startup = automatic
#
# To manually startup the session set to "manual". The default is manual.
node.startup = manual

如果node.start = automatic,所有login过的session在下次重启的时候都会再次被login。

node.conn[0].timeo.login_timeout = <以秒记得超时>

node.conn[].timeo.login_timeout = 15

上面是单次登录的超时时间

node.session.initial_login_retry_max = <登录重试次数>

node.session.initial_login_retry_max = 8

登录失败后的最大重试次数

当然/etc/iscsi/iscsid.conf 的配置绝大多数都可以通过  iscsiadm --mode node --op <command>  来对特定的node/session针对性的配置,后面会提到。

iscsiadm的使用

iscsiadm使用基本分3个步骤:发现(discovery),登录(login),扫描(rescan)

在使用iscsiadm的过程中有两个名词要注意下

  • target portal:  格式一般是 <IP>:<PORT>, 比如  192.168.183.129:3260
  • target IQN: 指服务器端的 iqn- 打头的一串字符 iqn.2001-04.com.example:storage.lun2

portal和IQN可以唯一确定一个storage的target。

1. Discovery

discovery只要知道storage上的target portal就可以发现所有暴露的portal和iqn。

$ sudo iscsiadm -m discovery -t sendtargets -p 192.168.183.129
192.168.183.129:3260,1 iqn.2001-04.com.example:storage.lun2
192.168.183.129:3260,1 iqn.2001-04.com.example:storage.lun1

上面发现 绿色 的就是storage上的所有target portals, 红色 就是 IQN

2. login

在第一步中发现的target都会保存在本地的数据库中,可以用 sudo iscsiadm -m node 看到。

  • 登录全部target

如果你要登录第一步中所有的portal,可以直接用下面的命令一键登录:

$ sudo iscsiadm -m node --login
Logging in to [iface: default, target: iqn.-.com.example:storage.lun2, portal: 192.168.183.129,] (multiple)
Logging in to [iface: default, target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,] (multiple)
Login to [iface: default, target: iqn.-.com.example:storage.lun2, portal: 192.168.183.129,] successful.
Login to [iface: default, target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,] successful.
  • 登录特定的target

$ sudo iscsiadm -m node -T iqn.-.com.example:storage.lun1 -p 192.168.183.129: --login
Logging in to [iface: default, target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,] (multiple)
Login to [iface: default, target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,] successful.
  • 查看登录的session

$ sudo iscsiadm -m session
tcp: [] 192.168.183.129:, iqn.-.com.example:storage.lun1 (non-flash)

注意,在默认配置下,登录的session,重启是不会再次登录的,如果要想登录的session自动登录,一种方式是,前面提到的设置 node.start = automatic

  • 设置session自动登录

$ sudo iscsiadm -m node -T iqn.-.com.example:storage.lun2 -p 192.168.183.129: --op update -n node.startup -v automatic

# 查看session的设置
$ sudo iscsiadm -m node -T iqn.-.com.example:storage.lun2 -p 192.168.183.129: | grep node.startup
node.startup = automatic

3. rescan

一旦登录成功,所有分配给当前主机的LUN都可以看到了,但有时,新分配的LUN,LUN的信息发生变化后,主要不能立即看到,这样就需要rescan了  --rescan 。

  • 扫描所有登录的target/session

$ sudo iscsiadm -m session --rescan
Rescanning session [sid: , target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,] 也可以

$ sudo iscsiadm -m node --rescan
  Rescanning session [sid: 3, target: iqn.2001-04.com.example:storage.lun1, portal: 192.168.183.129,3260]

  • 扫描单个session

可以通过session id

$ sudo iscsiadm -m session
tcp: [] 192.168.183.129:, iqn.-.com.example:storage.lun1 (non-flash)
tcp: [] 192.168.183.129:, iqn.-.com.example:storage.lun2 (non-flash)

上面的 [], []都是session id,直接使用即可:

$ sudo iscsiadm -m session --sid  --rescan
Rescanning session [sid: , target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,]

试了下,不可以通过target和iqn登录,不知道是bug还是参数问题:

$ sudo iscsiadm -m node -T iqn.-.com.example:storage.lun1 -p 192.168.183.129: --rescan
Rescanning session [sid: , target: iqn.-.com.example:storage.lun1, portal: 192.168.183.129,]
iscsiadm: invalid error code
iscsiadm: Could not execute operation on all sessions: (null)

4. 找到disk

1. iscsi连接的disk可以通过查询路径  /dev/disk/by-path/ 下的链接

# ls -l /dev/disk/by-path/
total
lrwxrwxrwx root root Jun : ip-192.168.183.129:-iscsi-iqn.-.com.example:storage.lun1-lun- -> ../../sdc
lrwxrwxrwx root root Jun : ip-192.168.183.129:-iscsi-iqn.-.com.example:storage.lun2-lun- -> ../../sdd
lrwxrwxrwx root root Jun : pci-::10.0-scsi-::: -> ../../sda
lrwxrwxrwx root root Jun : pci-::10.0-scsi-:::-part1 -> ../../sda1
lrwxrwxrwx root root Jun : pci-::10.0-scsi-:::-part2 -> ../../sda2
lrwxrwxrwx root root Jun : pci-::10.0-scsi-:::-part5 -> ../../sda5
lrwxrwxrwx root root Jun : pci-::10.0-scsi-::: -> ../../sdb

可以看到,在我的测试中,连接的两个target分别暴露了一个LUN给host,lun1 和 lun2,对应的host上的两个device是 /dev/sdc /dev/sdd

2. 也可以通过 sudo fdisk -l  查看disk:

$ sudo fdisk -l

Disk /dev/sdb:  GiB,  bytes,  sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk /dev/sda: GiB, bytes, sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disklabel type: dos
Disk identifier: 0xcaf795e0 Device Boot Start End Sectors Size Id Type
/dev/sda1 * .3G Linux
/dev/sda2 .7G Extended
/dev/sda5 .7G Linux swap / Solaris Disk /dev/sdc: GiB, bytes, sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk /dev/mapper/149455400000000003592265eae69d00a6e8560cd2833744e: GiB, bytes, sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk /dev/sdd: GiB, bytes, sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk /dev/mapper/149455400000000005277c9d1f32625c43968336de76fc205: GiB, bytes, sectors
Units: sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes

NOTE: /dev/mapper/*** 是我安装了multipath-tools后生成的device

如果disk很多的话,还是推荐第一个方法来确定disk路径,否则搞错了,数据丢失可是来不及哭爹喊娘的哦:)

总结:

总的来说,iscsi的使用还是比较方便,就是一旦长期不用,后面使用的话,一般都只能复制,粘贴了,枯燥不说,还容易出错。

由于我日常的工作中经常跟open-iscsi、multipath、fc等等打交道,经常觉得:要发现一个新的device步骤非常繁琐。

于是我自己决定开发一个方便的tool/API,简化跟stoage打交道的步骤。项目地址是:https://github.com/peter-wangxu/goock

欢迎大家使用和提供宝贵的意见和建议。

参考资料


https://github.com/open-iscsi/open-iscsi

https://tools.ietf.org/html/rfc7143

Linux上open-iscsi 的安装,配置和使用的更多相关文章

  1. linux上hadoop2.4.0安装配置

    1 环境准备 安装java-1.6(jdk) 安装ssh 1.1 安装jdk (1)下载安装jdk 在/usr/lib下创建java文件夹,输入命令: cd /usr/lib mkdir java 输 ...

  2. Linux系统中ElasticSearch搜索引擎安装配置Head插件

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  3. (Linux环境Kafka集群安装配置及常用命令

    Linux环境Kafka集群安装配置及常用命令 Kafka 消息队列内部实现原理 Kafka架构 一.下载Kafka安装包 二.Kafka安装包的解压 三.设置环境变量 四.配置kafka文件 4.1 ...

  4. Linux下apache+phppgadmin+postgresql安装配置

    Linux下apache+phppgadmin+postgresql安装配置 操作系统:CentOS 安装包:httpd(首选yum), php(包括php以及php-pgsql,php-mbstri ...

  5. Linux环境下NodeJS的安装配置(HelloWorld)

    Linux环境下NodeJS的安装配置(HelloWorld) 最简单的环境安装,测试helloworld.给初学者!! 安装脚本,请仔细阅读逐行执行: #!/bin/bash #检查是否已经安装 r ...

  6. Linux平台Zabbix Agent的安装配置

    这里简单总结一下Linux平台Zabbix Agent的安装配置,实验测试的Zabbix版本比较老了(Zabbix 3.0.9),不过版本虽然有点老旧,但是新旧版本的安装步骤.流程基本差别不大.这里的 ...

  7. Linux下xampp集成环境安装配置方法 、部署bugfree及部署禅道

    XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包.XAMPP 是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非 ...

  8. linux上源码编译安装mysql-5.6.28

    在 linux 上编译安装 mysql-.tar.gz http://www.mysql.com/ mysql下载地址: http://www.mysql.com/downloads/mysql/#d ...

  9. Linux上进行常用软件的配置

    当拿到一个新的linux服务器的时候一般要经过以下5个配置    修改HOSTANME        vi /etc/sysconfig/network    修改HOSTNAME和IP的映射     ...

  10. 博客图片上传picgo工具安装配置github图传使用

    摘要 对于每一个写博客的人来说,图片是至关重要.这一路经历了多次图片的烦恼,之前选择了微博个人文章那里粘贴图片的方式上传,感觉也挺方便的.但是由于新浪的图片显示问题,如果header中不设置 标签就不 ...

随机推荐

  1. Robot framework的介绍

    Robot framework是基于Python语言编写的功能自动化测试框架.使用简单,不懂编码的测试人员也能像编程一样写测试用例,支持关键字驱动测试并且可以开发系统关键字.还有丰富的第三方库,比如S ...

  2. Node.js 原理简介

    Node.js 的官方文档中有一段对 Node.js 的简介,如下. Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript ...

  3. 学习vue 20天,我写了点东西

    往昔 最初团队里使用Angularjs进行开发,刚开始还好,到了项目后期越发感觉Angularjs太重了,以至于后来重构项目时,毅然放弃Angularjs,投入了Vue的怀抱.除了组建团队时,是我搭建 ...

  4. 除去ubuntu的grub引导

    除去ubuntu的grub引导 step如下>> 进入ubuntu终端 sudo gedit /etc/defauli/grub 将 #GRUB_HIDDEN_TIMEOUT=0 最前面的 ...

  5. 热爱H5

    我不去想是否能够功成名就既然选择了前端便只顾埋头于无声 我不去想能否赢得掌声既然钟情于IT就勇敢得踏步前行 我不去想前行的路上会不会日暮穷途既然目标是未来留给现在的只能是汗水 我不去想所谓的成功是不是 ...

  6. Mvc Ajax提交多个checkbox,也说绑定和提交select

    Ajax Mvc的 checkbox 后端必须是List<T> ,T是ID类型,一般int 或guid 模型必须初始化List<T> 防止客户端没有提交任何值时空引用的问题,如 ...

  7. WebGIS开源解决方案之开发环境搭建(四)

    续前几篇文章,前面陆续介绍了开源GIS服务器Geoserver,开源数据库Postpresql以及开源前端udig的安装和基本使用. WebGIS前端开发,可以选择arcgis for javascr ...

  8. vector实现最大流EK算法

    序: 在之前的文章中实现了不利用STL实现EK算法,效率也较高.这次我们企图简化代码,减少变量的使用与手写模拟的代码. 注意:vector等STL的container在不开O2优化的时候实现同一个效果 ...

  9. 分针网—IT教育:使用CSS3制作导航条和毛玻璃效果

    导航条对于每一个Web前端攻城狮来说并不陌生,但是毛玻璃可能会相对陌生一些.简单的说,毛玻璃其实就是让图片或者背景使用相应的方法进行模糊处理.这种效果对用户来说是十分具有视觉冲击力的.本次分享的主题: ...

  10. OC中Foundation框架之NSString、NSMutableString

    创建方式 )直接赋值 NSString *str =@"abc"; )创建对象 NSString *str2 = [[NSString alloc]init]; str2 =@&q ...