Linux网络存储:iSCSI

NAS (Network Attached Storage, 网络附加储存服务器) :提供相关的网络文件系统,如NFS
SAN (Storage Area Networks, 储存局域网络):提供磁盘


iSCSI 配置:

yum -y install scsi-target-utils

查看该工具包生成了哪些文件:
rpm -ql scsi-target-utils

/etc/rc.d/init.d/tgtd   #
/etc/sysconfig/tgtd
/etc/tgt/targets.conf   #
/usr/sbin/tgt-admin     #
/usr/sbin/tgt-setup-lun
/usr/sbin/tgtadm        #
/usr/sbin/tgtd
/usr/sbin/tgtimg
/usr/share/doc/scsi-target-utils-1.0.24
/usr/share/doc/scsi-target-utils-1.0.24/README
/usr/share/doc/scsi-target-utils-1.0.24/README.iscsi
/usr/share/doc/scsi-target-utils-1.0.24/README.iser
/usr/share/doc/scsi-target-utils-1.0.24/README.lu_configuration
/usr/share/doc/scsi-target-utils-1.0.24/README.mmc
/usr/share/man/man5/targets.conf.5.gz
/usr/share/man/man8/tgt-admin.8.gz
/usr/share/man/man8/tgt-setup-lun.8.gz
/usr/share/man/man8/tgtadm.8.gz

其中/usr/sbin/tgtadm和/usr/sbin/tgt-admin的都是管理和配置target的工具,它们作用是一样的,只不过tgtadm是命令行下的工具,
而tgt-admin是根据配置文件/etc/tgt/targets.conf调用tgtadm来实现。另外/etc/init.d/tgtd是服务启动脚本。


启动tgtd:
service tgtd start
netstat -tnlp | grep 3260
tcp     0    0 0.0.0.0:3260    0.0.0.0:*   LISTEN    2074/tgtd
tcp     0    0 :::3260         :::*        LISTEN    2074/tgtd

开机自启:
chkconfig tgtd on


tgtadm
是一个高度模式化的命令,他们的模式很相近。有三个模式:target、logicalunit、account。
指定模式时使用--mode选项。再使用--op来指定对应模式下的选项。另外,使用-lld指定driver,有两种driver:iscsi和iser,基本都会使用iscsi。

tgtadm --help
  --lld <driver> --mode target --op new --tid <id> --targetname <name>
                        add a new target with <id> and <name>. <id> 
                        must not be zero.
  --lld <driver> --mode target --op delete [--force] --tid <id>
                        delete the specific target with <id>.
                        With force option, the specific target is 
                        deleted even if there is an activity.
  --lld <driver> --mode target --op show
                        show all the targets.
  --lld <driver> --mode target --op show --tid <id>
                        show the specific target's parameters.
  --lld <driver> --mode target --op update --tid <id> --name <param> --value <value>
                        change the target parameters of the specific
                        target with <id>.
  --lld <driver> --mode target --op bind --tid <id> --initiator-address <address>
  --lld <driver> --mode target --op bind --tid <id> --initiator-name <name>
                        enable the target to accept the specific initiators.
  --lld <driver> --mode target --op unbind --tid <id> --initiator-address <address>
  --lld <driver> --mode target --op unbind --tid <id> --initiator-name <name>
                        disable the specific permitted initiators.
  --lld <driver> --mode logicalunit --op new --tid <id> --lun <lun> 
                        --backing-store <path> --bstype <type> --bsoflags <options>
                        add a new logical unit with <lun> to the specific
                        target with <id>. The logical unit is offered
                        to the initiators. <path> must be block device files
                        (including LVM and RAID devices) or regular files. 
                        bstype option is optional.
                        bsoflags supported options are sync and direct
                        (sync:direct for both).
  --lld <driver> --mode logicalunit --op delete --tid <id> --lun <lun>
                        delete the specific logical unit with <lun> 
                        that the target with <id> has.
  --lld <driver> --mode account --op new --user <name> --password <pass>
                        add a new account with <name> and <pass>.
  --lld <driver> --mode account --op delete --user <name>
                        delete the specific account having <name>.
  --lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing]
                        add the specific account having <name> to 
                        the specific target with <id>.
                        <user> could be <IncomingUser> or <OutgoingUser>.

  --control-port <port> use control port <port>
  
2.2.2 target的命名方式
iqn.YYYY-mm.<reversed domain name>[:identifier]
iqn是iscsi qualified name的缩写,就像fqdn一样。
YYYY-mm描述的是此target是何年何月创建的,如2016-06。
<reversed domain name>是域名的反写,起到了唯一性的作用,如longshuai.com写为com.longshuai。
identifier是可选的,是为了知道此target相关信息而设的描述性选项,如指明此target用到了哪些硬盘。
示例:
  iqn.2016-06.com.longshuai:test.disk1  

2.2.3 创建一个target 
注意:创建target时,tid不能是0,因为0是被系统保留的。
  tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.2017-03.com.longshuai:test.disk1

  tgtadm -L iscsi -m target -o new -t 1 -T iqn.2017-03.com.longshuai:test.disk1
查看:
  tgtadm -L iscsi -m target -o show

向此target添加一个lun,使用新插入的磁盘/dev/sdc1(全新)。
  tgtadm -L iscsi -m logicalunit -o new -t 1 -l 1 -b /dev/sdc1

  tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdc1

限定访问的客户端地址
  tgtadm -L iscsi -m target -o bind -t 1 -I 192.168.100.0/24

2.2.4 tgt-admin和配置文件targets.conf
tgt-admin是读取配置文件的选项然后调用tgtadm来执行的工具。tgt的配置文件为/etc/tgt/targets.conf
列出当前target的信息:
  tgt-admin -s
  
使用--dump选项输出为配置文件的格式,并将其重定向到/tmp/tgt.conf中:
  tgt-admin --dump | tee /tmp/tgt.conf
  
注意,这样导出的配置文件指定的LUN号码可能会在tgt-admin读取并执行的时候更换位置,但这并不会有任何影响  

删除所有target:
  tgt-admin --delete ALL
  
从刚才生成的配置文件中读取并启动
  tgt-admin -e -c /tmp/tgt.conf
  
使用dump出来的配置文件会有default-driver指令行,而这一行在主配置文件中也有,且他们是不能出现多次的,否则将会报错,所以需要将主配置文件中的default-driver指令注释掉。

target端使用tgtadm命令配置的结果都是工作在内核中的,重启tgt服务或重启系统时,内存中的内容都会丢失。所以要永久让配置生效需要写入到配置文件中去。

target的配置文件默认是/etc/tgt/targets.conf,但是可以在/etc/tgt/temp/目录(默认不存在)下建立多个以".conf"为后缀的配置文件,然后启用主配置文件中的include指令即可。

以下给出两个配置的例子,这个配置文件很通俗易懂。

    #include /etc/tgt/temp/*.conf
    default-driver iscsi

    <target iqn.2017-03.com.longshuai:test.disk1>
            backing-store /dev/sdb1
            backing-store /dev/sdc
            incominguser <incoming_username> <PASSWORD>
            outgoinguser <outgoing_username> <PASSWORD> 
            initiator-address 192.168.100.0/24
    </target>
这样的配置,backing-store的顺序决定了lun号码的顺序,上面的配置中/dev/sdb1会是Lun1,/dev/sdc会是lun2

若想要为每个逻辑设备指定想要指定的lun号码,需要将每个backing-store封装在target中并独立指定lun号码。
    #include /etc/tgt/temp/*.conf
    default-driver iscsi

    <target iqn.2017-03.com.longshuai:test.disk1>
            <backing-store /dev/sdb1>
                  lun 5
            </backing-store>
            <backing-store /dev/sdc>
                  lun 6
            </backing-store>
            incominguser <incoming_username> <PASSWORD>
            outgoinguser <outgoing_username> <PASSWORD> 
            initiator-address 192.168.100.0/24
    </target>
    

重新加载配置:service tgtd force-reload

2.3 安装initiator
yum -y install iscsi-initiator-utils

2.3.1 相关文件和目录说明
下面是此安装包生成的一些重要文件和目录(只列出了必要的部分)。

rpm –ql iscsi-initiator-utils
Linux上配置使用iSCSI详细说明第14张

其中:
/etc/iscsi/iscsid.conf:是iscsi发起者的配置文件。
/etc/rc.d/init.d/{iscsi,iscsid}:服务启动脚本,只需要启动iscsi即可,因为它会自动调用iscsid脚本。
/sbin/iscsi-iname:为initiator命名的工具。就像target有自己独特的iqn名称,initiator也有独特的名称标识自己。
/sbin/iscsiadm:initiator的管理工具,在initiator上的绝大部分的命令都是通过它来执行的。
/var/lib/iscsi/ifaces:指定使用哪个网卡接口和target通信。
/var/lib/iscssi/nodes:该目录中保存了发现的target,分别是以target_name命名的目录,在target_name目录下又保存了以"target_ip,port"(如192.168.100.151,3260)的配置文件,这个配置文件是本initiator向对应的target 发起连接时的参数,这些参数继承于/etc/iscsi/iscsid.conf。
/var/lib/iscsi/send_targets:该目录中也存储了一个或多个以"target_IP,port"命名的目录,记录的是discovery的历史记录,对于discovery成功的则在对应的目录会有文件,否则是空目录。失败的也会记录
其中IP,port的记录方式称为protal,是入口、入门的意思。

需要注意的是,建议不要把iscsi和iscsid设置为开机自启动,因为开机时如果它找不到target的时候会一直卡在那里等待。可以将其放在rc.local文件中来启动。

chkconfig iscsi off
chkconfig iscsid off
echo "service iscsi start" >>/etc/rc.d/rc.local
  
2.3.4 发现target(discovery)
即使用discovery模式。

iscsiadm -m discovery [ -d debug_level ] [ -t type -p ip:port -I ifaceN [ -p ip:port ]

-d:输出调试信息,级别从0-8。出现错误的时候用来判断错误来源是很有用处的,可以使用级别2。
-I:指定发现target时通信接口。
-t type:有三种type(sendtargets,SLP,iSNS),一般只会用到sendtargets,可以简写为st。
-p IP:PORT:指定要发现target的IP和端口,不指定端口时使用默认的3260。
如:iscsiadm -m discovery -t st -p 192.168.100.151:3260

在发现了target后,在/var/lib/iscsi中的nodes和send_targets目录中就有了文件。


2.3.5 关联和解除关联target(node)
关联target的作用是initiator和target建立session,建立session后,initiator上就可以查看、访问、操作target上的scsi设备。

有两种关联方法,一是关联所有,一是指定单个target进行关联。

iscsiadm -m node [-d debug_level] [-L all,manual,automatic] [-U all,manual,automatic]
iscsiadm -m node [-d debug_level] [[-T targetname -p ip:port -I ifaceN] [-l | -u ]] [-o operation]

-d:指定debug级别,有0-8个级别。
-L和-U:分别是登录和登出target,可以指定ALL表示所有发现的target,或者manual指定。
-l和-u:分别是登录和登出某一个target。
-T:用于-l或-u时指定要登录和登出的targetname。
-o:对discoverydb做某些操作,可用的操作有new/delete/update/show,一般只会用到delete和show。
例如,使用单个的关联方式关联target。其中target_name可以通过命令iscsiadm -m node查看。

bash> iscsiadm -m node
192.168.100.151:3260,1 iqn.2017-03.com.longshuai:test.disk1

bash> iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l
Logging in to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] (multiple)
Login to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] successful.
实际上,在执行discovery的时候很可能就已经自动执行了关联,所以再次关联很可能什么消息也看不到。如果是这样的话,需要先退出session,再进行关联。当然也可能是直接显示successful,这样就说明原来discovery的时候是没有主动关联的。

iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -u

此时fdisk -l看看是否已经多了硬盘


2.4 CHAP认证
对于iscsi而言,在CHAP认证的机制上有两种方式:initiator authentication和target authentication
initiator authentication认证: 在initiator尝试连接到一个target的时候,initator需要提供一个用户名和密码给target被target进行认证。也就是说initiator需要被target认证,它向target端提供的账号和密码是target端指定的
target authentication认证: 在initiator尝试连接到一个target的时候,target有时也需要被initiator认证,以确保该target是合法而非伪装的target,这就要求target提供一个用户名和密码给initiator被initiator进行认证。

target向initiator提供的账号和密码对于target而言是流出的,所以称之为outgoing。所以outgoing使用的账号和密码在后文称为outgoing账号和outgoing密码。而对于initiator而言是incoming的,所以在initiator配置文件中称为in。
也就是说outgoing账号是target端提供给initiator端,被initiator认证的账号,但尽管如此,这个账号和密码还是在target端创建和绑定的

2.4.2 2 tgtadm命令的account模式用法
以下是tgtadm --help关于account的结果,但是用法给的并不全面。

--lld <driver> --mode account --op new --user <name> --password <pass>
--lld <driver> --mode account --op delete --user <name>
--lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing]
--lld <driver> --mode account --op unbind --tid <id> --user <name>
以下是个人发现的较为全面的用法,为了偷懒,所以使用短选项格式来表示。其中

# 新建一个用户
-L <driver> -m account -o new --u <name> --p <pass>

# 删除一个用户
-L <driver> -m account -o delete --u <name>

# 查看用户列表
-L <driver> -m account -o show

# 绑定用户到target上,outgoing的意义在后文会说明
-L <driver> -m account -o bind -t <tid> -u <name> [--outgoing]

# 从target上解绑用户
-L <driver> -m account -o unbind -t <tid> -u <name> [--outgoing]

一般而言,对于initiator的配置文件/etc/iscsi/iscsid.conf,如果不使用CHAP,则基本可以无视这个配置文件。
如果只要实现单向认证,则开启以下三项即可。
    node.session.auth.authmethod = CHAP
    node.session.auth.username = username
    node.session.auth.password = password

如果要实现双向认证,则需要开启以下5项。
    node.session.auth.authmethod = CHAP
    node.session.auth.username = username
    node.session.auth.password = password
    node.session.auth.username_in = username_in
    node.session.auth.password_in = password_in
且需要注意的是,如果是单向认证,则后两项必须不能开,开了就会进行双向认证。

虽然iscsi-initiator-utils支持discovery认证,但是由于scsi-target-utils不支持discovery认证,所以在认证关联target之前必须先进行discovery,也就是说在target端的访问控制列表ACL项中必须要定义允许initiator进行discovery
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值