今天咱们继续聊共享存储,说一个大家不常接触的内容:iSCSI。
这个东西不属于NAS的范畴,属于咱们之前提到的SAN(Storage Area Network,存储区域网络)。说实话,在普通用户家里搞一个SAN没太大必要,而且大多数普通用户往往连网线还玩不明白呢,再弄个光纤通道交换机成本上划不来,维护起来也比较麻烦。

但有的东西你家里可以没有,却需要了解一下,毕竟这些东西都是技术领域的天花板,保不齐哪些爱折腾的用户还会搞那么一搞。
当很多人在讨论万兆网络的时候,现在SAN的FC通道已经达到了256G,即便是走较慢的以太网SAN的通道也可以达到100Gbps,也就是十万兆,在这个领域中只要你投的起设备,你就可以得到几乎逆天的存储速度。
对比大家的NvME SSD只能说这东西是民用产品,毕竟在读取速度过3000,商家就可以标记上“读速高达”多少多少的宣传语

很多人就会认为SSD的速度快到无边。当然了,现在貌似最快的SSD驱动器读速已经破万。似乎给普通用户一个感觉SSD真快。
是这样吗?如果不考虑成本上一个SAN结果是不一样的。在今年最新的SAN上已经可以为每个端口提供49700MB/S的数据流量了这就是SAN的一个带宽优势。
今天咱们来搭一个特别简单的SAN服务器,连计算机上,看一下和NAS的共享到底有什么不同。

用的系统比较小众:ESOS,叫做“企业级存储系统(Enterprise Storage OS)”。2012年由当年的存储巨头昆腾开发。现在也由昆腾的团队维护,最新的更新版本是在2023年5月发布。目前地球上一共也没跑够几百套ESOS系统,这点可以到ESOS站点上的使用状态上去查下,大家也可以图个新鲜来玩玩看。
先说怎么部署:
部署的准备要求你有一个独立的电脑,电脑上有硬盘有网卡即可,当然了,如果想真的玩SAN,那么阵列卡、HBA卡在这套系统上都有支持。虽然ESOS用的人少,但硬件上的支持算是来者不惧。
其次,有一个闲置的4G以上的U盘,ESOS和UNraid一样,都是U盘启动安装部署的。
电脑、硬盘、网卡、U盘,准备好之后,我们就可以开始部署ESOS了。
第一步:下载一套ESOS的安装包。
这里得说一下,似乎ESOS 4.X的windows安装程序是有问题的,iN这边有linux的机器,因此就没过份的去强求非得在Windows上把这个安装包生成了。直接在linux里搞就可以了
在linux中输入命令
wget https://download.esos-project.com/packages/4.x.x/esos-4.2.1_z.zip --content-disposition下载最新的ESOS安装包

下载后unzip 解压到当前目录

第二步:生成ESOS引导u盘
进入ESOS目录后,在目录中有install.sh和install.vbs两个安装命令,可以分别用来在Linux和windows中利用命令行进行安装。
说是安装,其实是利用这个命令生成一个引导U盘。
在此之前我们需要利用lsscsi命令确定一下U盘的路径例如iN的这个机器,没插入U盘时候利用lsscsi命令来看就是两个盘符/dev/sda和/dev/sr0。

插入U盘后再去键入lsscsi命令后,会发现出现了一个/dev/sdb的盘符路径,这就是一个U盘,记住这个路径。在命令行中输入“sudo ./install.sh”

稍等一下,你就可以看到输入U盘路径的提示,这一步按输入“/dev/sdb”,剩下的就是等待引导U盘的建立完成。
第三步:设置ESOS系统
当ESOS的引导U盘生成后,用这个U盘来引导启动一台计算机。
iN的建议是你要有一台闲置的计算机,这台计算机内的资料全部备份完毕,硬盘最好做个初始化。原因是ESOS是一个存储系统,会重置这个系统管理下的所有硬盘信息。

引导成功后利用默认用户名"root",密码"esos"可以登陆进入系统

这是一个基于TUI界面的系统,不同于GUI,所有的系统界面完全是由字符终端生成的用户界面。有点类似于Bios的感觉。但这也就是ESOS的全部了。基本上对于ESOS的设置管理很久也未必会做一次,因此这个界面咱们可以将就。
进入界面的第一步就是做一下系统的网络设置,按s进入系统设置菜单,选择网络设置:
第一项设置一下整体的网络配置:


这里就根据个人的实际情况将ESOS的主机名、子域、网关和DNS地址设置一下,例如:

OK之后系统对网络做一个基本设置:

然后再设置一下网卡的IP地址:还是S进入系统设置,选择网络设置:

这时候在本地的网卡都会列在界面中。选择一块网卡进入:

设置静态地址,这里有一个要说明的点就是广播地址“Broadcast”,在IP网络中广播地址是一个子网主机ID全为1的特殊地址

打个比方,如果你的网络地址是192.168.10.100,子网掩码是255.255.255.0,那么你的网络地址的前三个数字就是网络ID也叫子网ID,因此就是192.168.10.0,如果计算广播地址就可以计算为最后的一个数字0全部为二进制1,也就是11111111,换算成10进制就是255,因此你的广播地址是192.168.10.255.
在这个iN的安装范例里面,由于iN家里的网络设置为了16位子网掩码(255.255.0.0),因此后两个数字都是主机ID,要计算广播地址就成了172.16.255.255。
其次,注意到右上角的MTU了吗?默认值是1500,其实如果要获得更高的性能,并且交换机支持的话,可以在这里设置巨型帧——例如9000。但是这就牵扯到带外管理(用另一套网络来管理设备)的事情了,因此咱们还保留一下1500。这样做性能会打那么一点点折扣。
在设置好网络参数之后,ESOS就可以远端访问和远端管理了。

直接可以SSH登陆,和直接接入键盘显示器没有任何区别。所以,显示器、键盘什么的都可以从这台“存储服务器”上拆掉了。
第四步:设置ESOS存储

当你从远端登陆了ESOS后你会发现——这个系统依旧“空空如也”似乎什么东西都没有的感觉。
目前我们能看到的界面主要有两个区域,第一个Taget(目标)概览,第二个会话(session)概览
Taget是ESOS可以对外提供的存储目标,Session则是接入到ESOS系统中的客户连接。
在顶部菜单中 Hardware RAID 、Software RAID 、LVM 、File Systems对应了一个存储服务器所需要规划的四个大的功能点、硬件的RAID、软件的RAID、逻辑卷管理和文件系统管理。
在这台机器上iN就只挂了一个SSD硬盘,因此更深的东西咱们就在以后找机会再来讲,今天的目标是让这个系统跑起来。
简要说说,如果你打开文件系统的菜单,你可以利用文件系统的功能建立基于磁盘文件的虚拟盘。

这时候在系统中接入的硬盘可以被暴露出来了:

在设置文件系统的时候,ESOS可以支持四种文件系统:

其实还可以下载其他的ESOS子版本对类似于ZFS这样的系统进行支持。在今天的例子里面我们选择Btrfs,这是一种基于二叉树的支持写入复制的高性能块文件系统。
定义完毕文件系统之后,系统挂载的整块硬盘就可以承载虚拟磁盘的文件了
我们还需要建立虚拟磁盘:

选择刚刚建立的文件系统:

定义虚拟磁盘的名称和尺寸

在这个例子里面我们先建立2个40G的虚拟磁盘。

现在在文件系统-虚拟磁盘文件列表中我们可以查看到这两块虚拟磁盘。

这里要注意的是,这是虚拟磁盘文件,虽然已经存在在系统中,但是还不能被外界所直接使用。如果我们在命令行上查看,我们会发现,这两个“磁盘”仅仅是/mnt下的两个文件。

但建立了虚拟磁盘之后,我们就可以开始建立虚拟驱动器了。也就是菜单的第二行Devices部分。

驱动器(Device)是ESOS真正可以作为目标的系统对象,咱们来仔细说一下:
在建立驱动器的过程中,我们可选的项目很多,其中包括
dev_diskdev_disk_perfvcdromvdisk_blockiovdisk_fileiovdisk_nulliodev_changerdev_tapedev_tape_perf其中,dev_disk和dev_disk_perf 是指系统挂载的物理盘直接连接;
vcdrom是以iso文件模拟光盘驱动器,光盘的ISO文件我们可以在ESOS的命令行界面直接拉取:

vdisk_blockio和vdisk_fileio是以“块I/O”或者“文件I/O”挂载虚拟磁盘文件
vdisk_nullio是进行性能测试使用的非存储目标
dev_changer,dev_tape和dev_tape_perf是ESOS挂载备份用磁带库(changer)和磁带机(tape)的设备入口。
刚刚我们建立了两个虚拟磁碟机文件,所以可以选择vdisk_fileio将磁盘文件挂载为虚拟驱动器。

这里面有几个设置项
Block Size,这是文件系统与存储设备交互时使用的基本数据单元的大小。
NV Cache,表示是否使用非易失性缓存
Removable,是否为可移动介质,也就是说是否可以从系统里面像U盘一样弹出
Write Through,直接写入标志,直写入意味着数据将直接写入磁盘,而非直写入可以获得最大的写入性能优化,但如果在写入过程中断电有可能丢失数据。
Read Only,这是只读标记,开启后磁盘数据被保护,不能写入
Rotational,“旋转”,这个选项比较有意思,是定义你的存储介质是否是一个旋转的机械盘。按照诚实的方法来做,固态盘选No,机械盘选Yes。
结合现在演示机器的情况,我们就设置成这样:

设置完毕之后,我们就可以在驱动器信息中看到刚刚设置的两个驱动器。

现在存储器一层的事情做好了。
如果是要做iscsi,我们就要开始定义这个存储服务器上的target。
第五步:设置ESOS存储目标,“目标”这个词汇是咱们IT圈子直接翻译人家原文“Target”的,更贴切的翻译其实是“靶子”

“目标”和“靶子”在英文里面都是一个词汇。咱们就不深究翻译问题了。在一个SAN级别的存储服务器中,所有的存储资源都是以“靶标”的形式暴露出来的,远端的主机(Host)去将数据投射到“靶标”上。
如果不设置“靶标”,那么一个存储服务器中插入再多的硬盘也没有任何意义——只是一堆硬盘而已。
所以在让其他主机能够接入到存储之前需要我们先设置“靶子”。

“靶子”很简单设置,给个名字就可以了,一般的规则是写明这是一个IQN(iSCSI Qualified Name,ISCSI全局名称)。

IQN力求要做到全球唯一,所以基本上大家的规则是以“IQN”开头,后面接年份-月.反向域名:唯一标识符这样的写法。写法是一个非强制标准,如果愿意遵守可以避免很多潜在的撞名问题,在小区域内使用不愿意遵守其实也没太大的事情。

因此我们的IQN写为:iqn.2024-04.esos.esosHost:w25011
靶子立起来了,谁来开枪呢?
第六步,设置发起器
发起器(Initiator)这个概念有点反常识的感觉,不过我们顺着来解释,一般人都可以理解发起器到底是怎么回事。
存储本身是依托于计算机设备的。

按照计算机的架构来说计算机是分为输入设备、输出设备、运算器、控制器和存储器五个部分的。但是这里的“存储器”是指“内存”。当然了计算机的输入设备也不是键盘、鼠标、触摸屏、输出设备也并不是指显示器和音箱。除了这五个设备之外,计算机上所有的设备不论是不是在机箱里面实际上都叫做外设。

各自外设通过总线连接到计算机中完成各自的功能。
虽然一个SAN存储是带有CPU、内存且有操作系统的,但对于计算机而言,存储本身是一个外设,和插在USB接口上的移动硬盘没什么区别。因此我们讲了这么半天的ESOS存储服务器本身对计算机而言是一个辅助设备。虽然它可以立起来“靶子”,但还得让“枪”来打,这就是“发起器”的概念了,主动权在计算机这杆“枪”上而不是在“靶子”上。
所以我们先要建立一个发起器。切换到Windows上,在服务器管理器程序中选择“iscsi发起程序”

windows系统使用iscsi发起程序来建立自己的发起程序。
打开后,可以开启配置窗口:

我们进入到配置选项卡,可以看到发起程序的默认设置:

这里面有一个发起程序的默认名称,建议点击“更改”按钮修改一下:

现在windows界面中的“iqn.2024-04.rihome:win25”就是在存储网络中Windows这杆枪的IQN名字了。
在ESOS中添加一个组:

选择这个组内要包含的target,一个存储组可以容纳大量target。

为组命名:

命名后添加发起器:

选择target:

关联到组:

然后填入刚刚在Windows中设置的发起器IQN:

至此,我们将靶子(Target)立起放在了比赛通道(Group)中,也为这个通道注册了一名比赛的枪手(Initiator)。

枪手举起枪了,你却发现……并没有刚刚的虚拟驱动器什么事情。
嗯,没错,靶子只是一个精神象征而已,我们还需要把驱动器关联到target上。

这里“Map to Host Group”要把磁盘也放在比赛的通道里面去。它才是实质的东西。

先选择已经存在的磁盘

再选择taget

再选择刚刚设置好的组

为这个磁盘在Target中设置一个逻辑单元号,默认是0,但iN一般从1开始设置。同时确定这是不是一个只读盘,这里设置为No。
这时候磁盘就和Target以及主机的访问组进行了关联。
再进入target菜单中将tagert打开:

从列表中选择要打开的target:

选择Enable(允许)后按下OK:

最后确认一下target列表中状态(state)被改变为Enable

这时候,ESOS的设置就已经完毕,回到Windows的ISCSI发起程序,你会发现刚刚在ESOS中设置好的target已经出现在窗口中(这就是最前提到的广播的功效)。

如果没有的话,在目标中输入ESOS服务器的IP地址

然后选择快速连接,我们就可以直接连接到ESOS的目标中

至此,ESOS建立的ISCSI就被成功的接入到Windows系统中。
但是,此刻你如果去看“我的电脑”中是不会包括刚刚接入的磁盘的。

原因是这个磁盘好比你刚买的接入到windows系统中的新驱动器一样。
我们还需要做 最后一步 挂载iscsi驱动器。
打开计算机管理:

在磁盘管理菜单中我们可以看到这块我们规划好的40G磁盘。目前属于脱机状态。

有键点击磁盘,选择联机

联机后,再右键点击初始化磁盘

选择一个分区表格式,点确定。
在磁盘分区上点一下右键选择建立卷,这里建立的是简单卷

然后格式化硬盘,最终这块Iscsi硬盘就以E盘的面目被挂载在了Windows中。
而在Esos端我们也可以看到“会话”(Session)区域已经出现了一个会话。

至此,这块远端的硬盘就可以使用了。
看起来颇费周章的操作,只给Windows 添加了一个来自于远端的虚拟硬盘。这样做有什么好处呢?
其实这就是生产力。我们来做个测试:
现在D盘中有一个Ubuntu的安装包:

如果我们将之拷贝到一个SMB共享目标中:


我们会发现在千兆网络中,文件的传输操作是基本跑满千兆的,90~110MB左右的传输速率。
但是如果我们将文件往iscsi的E盘拷贝呢???
是这样!


原因很简单。SMB是以文件封装的方式进行数据传输。系统传输开销很大效率较低。
而在iscsi下,是通过网络直接发送磁盘的操作命令和磁盘数据块进行文件传输。即便是很小的带宽(1Gbps),在系统级别上仍然可以高速的运作。
这个挂载硬盘是不是比大家想象的速度要快得多呢?做为生产力工具来挂载的iscsi在同等配置水平上基本上速度是可以超过NAS共享文件夹几倍的,NAS是不是弱爆了?
当然了,在一般情况下一个iscsi只可以为一个主机所使用,这是iscsi的硬伤,但是,真正的生产力环境下我们可以通过后台复制的方式让几个不同的iscsi驱动器之间的数据完全同步,这样就可以解决所谓的共享问题。那么问题来了,会不会让存储服务器上的空间需求爆炸性的增长呢?实际上也不会,存储服务器上使用的Btrfs或者ZFS文件系统本身就是块级存储,相同的数据不会二次占用额外的空间。因此即便是有几百个iscsi目标放在一个存储服务器里面,存放了几百份相同的文件,实际上也仅仅占用一份文件的空间。
具体的iscsi同步的事情,我们找时间再详细聊,今天就到这里吧。