用FreeBSD10搭建基于ZFS的iSCSI服务

Posted jzdwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用FreeBSD10搭建基于ZFS的iSCSI服务相关的知识,希望对你有一定的参考价值。

概述

对于ZFS我是一直在强烈推荐的,由于实在太好用了。可是直到如今。它还是仅仅能执行于Oracle的Solaris和FreeBSD两个系统上,为了将它分享给别的系统仅仅能通过NAS或SAN的方式。

NAS的方式非常easy。我一直在用Samba实现。当然NFS也是能够的,SAN的话之前还没试过。

使用上当然是SAN更好一些。并且如今网速也够快。尽管对于存储来说,NAS和SAN都是外部存储,但对于客户机来说,它知道NAS是网络设备,而SAN则会被视同本地设备,这是二者的主要差别。之所以会这样,是由于NAS走的是网络层的协议,SAN走的是更底层的块设备协议。

传统上SAN都是比較高大上的,由于都是走光纤通道(FC),直到后来有了iSCSI这个大救星——使用iSCSI的SAN又被称为IP-SAN。并且有了iSCSI以后,NAS和SAN的差别已经不那么明显了,由于如今有一些NAS设备也提供iSCSI支持。

只是要注意一点:正由于NAS是走网络协议,所以对客户机来说。是以通用的网络文件系统方式訪问,不须要关注服务端是用什么详细的文件系统,这也就意味着在不同系统中能够共享NAS中的文件。比方我如今就是在服务端用ZFS格式存放文件。通过SAMBA共享给Linux、Mac和Windows,在四个全然不同的系统中訪问共享文件都没有问题。可是SAN是走底层块设备协议,所以是客户机独用的,Linux用的target不能与Windows共用(格式化后的文件系统不同),相同在服务端也无法直接看到对应target里的详细内容(能够通过服务端的本地Initiator连接后mount为指定文件系统操作,但也仅限于服务端本身支持的文件系统格式)。


之前版本号的FreeBSD尽管也支持iSCSI,可是是一个用户级的应用。个人感觉不好。所以没试过。在最新的FreeBSD 10中,iSCSI被集成到系统中去了,这真是个喜大普奔的好消息。近期试了一下感觉还不错。

关于iSCSI的基本原理大致是这样:iSCSI本身是一个协议。是一个在IP网络上的虚拟SCSI实现。client能过iSCSI Initiator模拟一个本地的块设备(能够理解为一个虚拟的SCSI硬盘),然后由iSCSI Initiator把收到的SCSI指令通过IP网络传递到服务端,服务端的再将对应的指令转为对实际硬盘的操作。

在服务端(即存储端)有一些物理或逻辑硬盘,被组织成所谓的LUN(逻辑单元号),能够理解为一种逻辑卷。比方一块硬盘,一个分区。一组RAID。或是一个ZFS。当这个存储端把这些LUN通过iSCSI对外提供存储服务的时候,我们叫它iSCSI target。同一时候,在存储端上能够通过多种途径对外提供服务。比方通过不同的IP。不同的网卡,不同的身份认证方式等。每一种途径叫做一个portal group。portal group和target能够自由组合。以满足client的各种存储需求。

在client。则是通过前面所说的iSCSI Initiator实现,它在本地表现为一个虚拟硬盘(在/dev下有设备名。但没有实际的物理设备),对它的全部操作都会被通过iSCSI传递到对应的iSCSI target上去。

iSCSI target

首先在服务端创建一个ZFS供target之用:

zfs create -s -V 4G -b 4k tank/testtarget

注意须要-V參数才干在/dev/zvol下创建对应的块设备供iSCSI之用。-V表示创建ZFS卷,-s表示不在创建时分配空间,不加此參数则会创建一个实际占用指定容量的卷。-b指定块大小(即传统意义上的扇区大小,一般用4096或512)。

然后在 /etc/rc.conf 里增加下面一行启用ctld(iSCSI服务):

ctld_enable="YES"

接着是配置ctld。创建 /etc/ctl.conf 文件,内容为:

portal-group san {
        discovery-auth-group no-authentication
        listen 192.168.x.x
}

target iqn.2014-05.com.example:target0 {
        auth-group no-authentication
        portal-group san
        lun 0 {
                path /dev/zvol/tank/testtarget
                blocksize 4096
                size 4G
        }
}

这是最简单的配置,仅仅有一个target和一个portal group。没有使用用户认证。

作为測试已经足够了。

然后就能够启动这个target了:

chmod 600 /etc/ctl.conf
service ctld start

注意那个chmod的步骤是必须的。否则服务无法启动。由于一个全局可读的配置文件是不安全的。

启动完能够看一下日志,以确定没有出错。

tail /var/log/messages

iSCSI initiator

一般不拿FreeBSD做client,仅仅是有时会须要在服务端測试一下target的配置。所以可能还是会用到FreeBSD下的Initiator的。所以记录了一下配置方法附后供參考。本节以实际的桌面环境配置为例。

我的桌面是Linux Mint 16,下面供參考。只是不同的Linux发行版应该都几乎相同。

Mac貌似须要商业软件支持。没法介绍。微软有为Windows免费提供相关的Initiator软件(高版本号Windows已内置),配置方法附后。

首先须要安装软件:

sudo apt-get install open-iscsi open-iscsi-utils

然后启动服务:

sudo service open-iscsi start

然后搜索一下target :

sudo iscsiadm -m discovery -t sendtargets -p 192.168.x.x

在结果中能够看到之前配置好的target。

登录连接target:

sudo iscsiadm -m node -T iqn.2014-05.com.example:target0 -p 192.168.x.x -l

如今打开系统首选项-磁盘(或你的发行版上的相关工具,或者你习惯用命令行也行),就可以看到一个新增的磁盘(在我的电脑上,它的设备名叫/dev/sdc),磁盘名叫做FREEBSD CTLDISK,处于未格式化状态。用EXT4格式化,再mount就可以像本地盘一样直接使用了。

至此一个主要的基于ZFS的iSCSI服务就算搭建完毕。

更复杂的应用

前面说的target配置是全开放的,整个网段内全部client都能够自由连接,为了安全起见,须要增加用户认证。

最简单的方法就是在target配置里增加用户名密码:

target iqn.2014-05.com.example:target0 {
        portal-group san
        chap user password1234
        lun 0 {
                path /dev/zvol/tank/testtarget
                blocksize 4096
                size 4G
        }
}

注意,当中密码默认须要不少于12位。

可是假设有多个用户须要使用的话。这样就不方便了。这时就须要使用auth-group:

auth-group ag0 {
        chap user1 password1234
        chap user2 password1234
}

target iqn.2014-05.com.example:target0 {
        auth-group ag0
        portal-group san
        lun 0 {
                path /dev/zvol/tank/testtarget
                blocksize 4096
                size 4G
        }
}

如今在initiator端相同须要指定用户名密码才干连接了。可是用户名密码并非在命令行里输入,而是须要配置给open-iscsi服务。改动/etc/iscsi/iscsid.conf,增加:

node.startup = automatic
node.session.auth.authmethod = CHAP
node.session.auth.username = user
node.session.auth.password = password1234

当中node.startup设置为automatic是为了让initiator自己主动连接。这项并非必须的,它的默认值是manual,即须要手动连接target,设置为automatic就可以在系统重新启动后自己主动连接target,而不须要再手工执行iscsiadm去连接。

node.session.auth的username和password就是前面配置的target的username与password。同理,假设配置了portal group的用户认证,也能够在这里配置discovery的username与password。

然后重新启动open-iscsi服务:

sudo service open-iscsi restart

如今再执行:

sudo iscsiadm -m node -T iqn.2014-05.com.example:target0 -p 192.168.x.x -l

就可以登录连接target。

连接后就可以mount使用。

假设像前面那样把node.startup配置为automatic。则启动后会自己主动连接,仅仅须要直接mount或例如以下配置成自己主动mount:

先取得UUID:

sudo blkid /dev/sdc

或者用/dev/disk/py-path/方式的路径,然后把它配置到fstab里(以by-path路径为例,以UUID方式參见fstab中的默认配置):

/dev/disk/by-path/ip-192.168.x.x:3260-iscsi-iqn.2014-05.com.example:target0-lun-0 /mnt/iscsi      ext4    _netdev,errors=remount-ro 0       1

注意,选项里必须有_netdev一项否则在启动时会等待非常长时间后mount失败。

试试ZFS

能够注意到,前面有一个步骤是client须要对target进行格式化,我是格式化为EXT4格式的,那么服务端的ZFS还有效吗?能够来试试。

首先在mount好的路径里创建一些文件。然后到服务端做个快照:

zfs snapshot tank/[email protected]

然后再回到client,把相关的文件删除或改动,然后umount并断开(否则不能对服务端ZFS作改动操作):

sudo umount /dev/sdc
sudo iscsiadm -m node -T iqn.2014-05.com.example:target0 -p 192.168.x.x -u

然后在服务端把iSCSI服务给停了:

service ctld stop

如今能够试试回滚快照——当然也能够做一个克隆。然后把target指向克隆,这里以简单的回滚操作为例:

zfs rollbak tank/[email protected]

再重新启动服务:

service ctld start

client又一次连接:

sudo iscsiadm -m node -T iqn.2014-05.com.example:target0 -l
sudo mount /dev/sdc /mnt/iscsi

如今再看之前改动过或删除掉的文件又恢复原状了。可见ZFS卷相同能够实现ZFS的功能,并不会由于它被格式化为EXT4而失效。

附:FreeBSD下的Initiator配置

首先启动 iscsid 服 务。由于通常情况下仅仅是測试一下,能够直接用iscsid命令启动服务。由于用service命令启动的话还须要配置rc.conf,并且即使是直接启动也能够用service命令停止它。


然后用连接target:

iscsictl -A -p 192.168.x.x -t iqn.2014-05.com.example:target0

然后用不带參数的iscsictl看一下连接状态和设备名。注意:假设状态显示为Waiting for iscsid(8)。则说明iscsid服务未启动。


没问题的话就:

mount -t fstype /dev/da0 /mnt/iscsi

当中fstype为文件系统名,da0为连接后的设备名。

附:Windows的Initiator配置

由于Mac不能用,郁闷之余看了一下Windows的配置,发现还是挺简单的。连重新启动都不用。

首先在微软官网下载:Microsoft iSCSI initiator

然后安装之。

注意。须要开启MS DTC服务。

安装后执行之,在[Discovery]页的[Target Portals]一栏里点[Add],输入Portal的IP地址或DNS名称,比方:192.168.x.x。

确定后在[Targets]页里就可以看到服务端配置的targets,选择之,然后点[Log On]。其状态会从Inactive变成Connected。

注意这时有个选项叫“Automatically restore this connection when the system boots”。选中之能够在系统启动时自己主动连接。

如今打开系统管理中的磁盘管理。就会弹出提示说系统中多了一块硬盘,选择之并格式化为你想要的文件系统格式,比方FAT32或NTFS,之后就能够像普通硬盘一样使用它了。

以上是关于用FreeBSD10搭建基于ZFS的iSCSI服务的主要内容,如果未能解决你的问题,请参考以下文章

FreeBSD_11-系统管理——{Part_5-ZFS}

freenas支持硬raid么?

freenas和openfiler存储软件哪个更好?

win下如何连接NAS存储 我创建了两个虚拟机WIN2008R2,创建了一个SUN ZFS 7000的虚拟存储

iSCSI的配置笔记

iSCSI的配置笔记