linux上iscsi工具部署详解&&分布式文件系统提供iscsi接口的简单方法

来源:互联网 发布:淘宝宝贝视频怎么制作 编辑:程序博客网 时间:2024/05/29 14:00
iscsi协议是一种tunnel(隧道)协议,将scsi的命令封装在tcp/ip的数据包里面。
iscsi的initiator部署有两种方式,一种是纯软件协议栈+普通的以太网卡,成本低性能差些,另外一种是用专有的iscsi的hba卡,当然这个开对外还是接的标准的双绞线,只是hba的硬件实现了iscsi协议栈,性能好价格也高。
linux上的iscsi工具有个开源的社区专门负责:http://linux-iscsi.org/wiki/Main_Page
据说nexenta的创始人就是该社区的核心成员。

下面讲下具体的安装和部署
两个rpm包 iscsi-initiator-utils.*.rpm为initiator端,scsi-target-utils.*.rpm为target端。
我这里只有一个rhel 4和suse 11的环境,操作系统比较老。
scsi-target-utils搜到了rhel 4的rpm包,安装成功。
但是搜到initiator的rpm包,最老的也是centos5或者rhel5了。
没有搜到suse的rpm包。看来suse的社区支持不太理想。不过sles 11上自带了iscsiadm这个命令,应该是有iscsi-initiator功能了。
ok,initiator在suse 11上,target正在rhel 4上。

target部署:
首先启动target的守护进程:
    /etc/rc.d/init.d/tgtd start

后面可以配置本地的块设备或者文件映射为scsi target。

比较郁闷的是rhel 4上的scsi-target的版本太老了,并没有/etc/tgt/targets.conf配置文件。man了下tgtadm,看了下帮助,全部打命令来操作了。还是配置文件方便啊。

tgtadm  --lld iscsi --op new --mode target --tid=111 --targetname test_target
创建一个target controller
tgtadm --lld iscsi --op new --mode=logicalunit --tid=111 --lun=1 --backing-store /root/tmp/iscsi.dat
为上面创建的的target添加一个可用的lun,并为改lun分配后台存储路径,路径可以是一个块设备文件,例如lvm建的卷,也可以是一个普通文件(regular file)。
tgtadm --lld iscsi --op bind --mode=target --tid=111 --initiator-address=ALL
为创建的target设置允许接入的initiator的ip地址列表,ALL代表不做限制。

initiator部署
iscsiadm   -m discovery -t sendtargets  -p 10.0.0.221
发现target,采用iscsi natvie的sendtargets方式
iscsiadm -m node --login
登陆鉴权。可以采用用户名密码方式,配置文件是/etc/iscsi/iscsid.conf。由于target工具版本老,不支持配置用户名密码,这里initiator上也没配置用户名密码。
iscsiadm -m session -o show
查看当前的iscsi会话,ok,cat /proc/partions可以看到新的磁盘分区了。
后面可以用fdisk对这磁盘进行分区,然后mkfs,最后mount到本地。
这里initiator遇到一点小问题,第一步discovery就报错了,
iscsiadm: Could not scan /sys/class/iscsi_transport
后来google了下发现是有个内核模块没启动,输入命令搞定:
modprobe  iscsi_tcp

总结:iscsi工具可以很方便的把一个本地逻辑卷或者普通文件映射为一个iscsi块设备,

          最好使用rhel 5或者centos 5以后的版本。

      理论上说,一个通过fuse挂载的分布式文件系统中的文件,也可以通过scsi-target-utils工具映射为一个块设备,glusterFS、mooseFS都可以这么用。但是效率应该不会高,通过fuse接口就有性能损耗。不清楚ceph中的快接口的iscsi协议栈如何实现的。solaris zfs的iscsi协议栈本身就在内核模块,效率应该有保证。

想法:如果一个分布式文件系统需要对外提供scsi接口,使用linux的scsi-target-utils工具肯定是很方便了。但是不要直接把一个DFS中的文件通过fuse挂载后从scsi-target-utils映射出去。可以考虑在一个本地节点把本地xfs格式化后的一个大文件映射出去,分布式文件系统负责把这个文件同步到另外一个节点。这样每次iscsi读只要定位到其中一个节点即可,不需要额外的网络传输。两个节点之间就文件是一种主备方式,当前节点宕机迁移到另外一个节点。当然如果要实现两个节点的双主或者多主的stripe方式,可能要修改下iscsi-initator才行,或者说就是实现了分布式块存储EBS的功能,很复杂
原创粉丝点击