阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

用FreeBSD10搭建基于ZFS的iSCSI服务

145次阅读
没有评论

共计 7977 个字符,预计需要花费 20 分钟才能阅读完成。

概述

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

NAS 的方式很简单,我一直在用 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 实现。客户端能过 iSCSI Initiator 模拟一个本地的块设备(可以理解为一个虚拟的 SCSI 硬盘),然后由 iSCSI Initiator 把收到的 SCSI 指令通过 IP 网络传递到服务端,服务端的再将相应的指令转为对实际硬盘的操作。

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

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

FreeBSD 8 上的 Rsync 同步简易教程 http://www.linuxidc.com/Linux/2013-07/86849.htm

FreeBSD8.2 系统安装 Salt http://www.linuxidc.com/Linux/2013-02/80024.htm

制作 FreeBSD 系统定制安装 ISO http://www.linuxidc.com/Linux/2012-12/76350.htm

FreeBSD 搭建 NAT 并在单网卡上配置多个 VLAN http://www.linuxidc.com/Linux/2012-12/75507.htm

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
        }
}

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-06/102743p2.htm

这是最简单的配置,只有一个 target 和一个 portal group。没有使用用户认证。作为测试已经足够了。

然后就可以启动这个 target 了:

chmod 600 /etc/ctl.conf

service ctld start

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

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

tail /var/log/messages

iSCSI initiator

一般不拿 FreeBSD 做客户端,只是有时会需要在服务端测试一下 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 配置是全开放的,整个网段内所有客户端都可以自由连接,为了安全起见,需要加入用户认证。

最简单的方法就是在 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
        }
}

概述

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

NAS 的方式很简单,我一直在用 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 实现。客户端能过 iSCSI Initiator 模拟一个本地的块设备(可以理解为一个虚拟的 SCSI 硬盘),然后由 iSCSI Initiator 把收到的 SCSI 指令通过 IP 网络传递到服务端,服务端的再将相应的指令转为对实际硬盘的操作。

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

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

FreeBSD 8 上的 Rsync 同步简易教程 http://www.linuxidc.com/Linux/2013-07/86849.htm

FreeBSD8.2 系统安装 Salt http://www.linuxidc.com/Linux/2013-02/80024.htm

制作 FreeBSD 系统定制安装 ISO http://www.linuxidc.com/Linux/2012-12/76350.htm

FreeBSD 搭建 NAT 并在单网卡上配置多个 VLAN http://www.linuxidc.com/Linux/2012-12/75507.htm

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
        }
}

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-06/102743p2.htm

现在在 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 的用户名和密码。同理,如果配置了 portal group 的用户认证,也可以在这里配置 discovery 的用户名和密码。

然后重启 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

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

首先在 mount 好的路径里创建一些文件,然后到服务端做个快照:
zfs snapshot tank/testtarget@test1
然后再回到客户端,把相关的文件删除或修改,然后 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/testtarget@test1
再重启服务:
service ctld start
客户端重新连接:
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,之后就可以像普通硬盘一样使用它了。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计7977字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中