第八章:iSCSI

有时你想让主机通过网络访问磁盘。这可以让你超越主机的物理限制。

如果机箱内没有空间容纳另一个磁盘,可以通过网络添加磁盘空间。

也许几个主机需要访问同一个硬盘,这在虚拟化系统中很常见。

或者你的硬件可能根本没有本地磁盘。

以上都是iSCSI发挥作用的地方。

大多数存储设备使用SCSI(Small Computer System Interface——小型计算机系统接口)命令集或这些命令的子集。虽然SCSI硬盘在几年前从新系统中消失了,但SCSI命令在现代SATA和SAS驱动器中仍然存在。

iSCSI(internet SCSI)在TCP内部传输SCSI命令。当NFS和CIFS登协议要求向客户端传授一个全新的文件系统时,iSCSI只需要将标准SCSI命令包装在网络连接中。

客户端将iSCSI驱动器视为正常的本地驱动器,并可以响应地使用它。

但网络有可能出错。

FreeBSD10及更新版本具有集成的高性能iSCSI堆栈,可与所有主要供应商互操作。

存储和网络速度

网络比存储系统慢得多。大多数现代计算机使用千兆网络接口,而SATA或SAS系统的运行速度时千兆网络的6倍。再加上并非所有千兆硬件都能以千兆速度运行,而且大多数主机都有四个或更多的SATA端口,所以常见的磁盘活动可能会使网络接口完全饱和。

如果开始出现性能问题,请将存储网络与其他网络流量分开。建议只在专用网络上部署网络存储。如果只有两台机器通过网络共享存储,在故障转移配置中,我会直接在它们之间连接一根电缆,并将存储流量放在这里。在网速使用iSCSI或其他原始磁盘协议需要仔细注意网络性能。

iSCSI 要素

iSCSI类似于CS(client-server)协议。客户端称为iSCSI initiator(发起者)。iSCSI为客户端使用了一个特殊的名称,因为它的术语来自SCSI。客户端发起或引发所有活动——这就是为什么它被称为发起者。

target接收请求并对其采取行动。它与任何其他存储设备非常相似:操作系统发出请求,驱动器为其提供服务。FreeBSD启动器使用iscsid守护进程连接到目标。

FreeBSD通过CAM Target Layer 守护进程ctld(8)提供服务器端iSCSI服务。iSCSI服务器将存储设备导出到启动器。这些存储设备可能是实际的硬件、ZFS卷或磁盘上的文件。服务器提供的每个存储设备都称为iSCSI target。一台iSCSI服务器可以提供与底层操作系统或硬件支持的目标数量一样多的目标。

iSCSI portal(入口)是iSCSI服务器接收iSCSI目标请求的IP地址和TCP端口(默认为3260)。portals被收集到portal group中,这些组定义了入口可以监听的IP地址。

iSCSI不是公共互联网上使用的协议。始终使用防火墙或数据包过滤器保护你的存储。

iSCSI支持通过CHAP进行身份验证。你可以禁用身份验证,要求启动器进行身份验证,或要求启动器和目标都进行身份验证。你也可以禁止身份验证,将禁止任何人访问目标。

iSCSI设备名称

大多数人在开始使用iSCSI时首先想到的时客户端和启动器的命名方案。

看一个像iqn.1996-03.com.sun:01:3a7b....这样的字符串,后面跟着一串十六进制数字和更多的句点,然后是更多的随机乱码,这可能会让人感到害怕、恼火和头疼。然而,iSCSI设备名并不一定那么困难。

所有iSCSI名称都以字符串iqn开头,表示iSCSI限定名称,然后根句号。

然后是该组织成立的年份和月份,用破折号隔开。

还有一个时期,该组织的域名顺序相反。

最后,一个冒号和iSCSI目标上特定设备的名称。

让我们把这一切放在一起。我使用的是2013年11月注册的域名mwl.io。我的iSCSI设备的名称都将以iqn.2013-11.io.mwl开头。尽管许多存储供应商声称,iSCSI设备不需要一个大而长的唯一标识符。长标识符在大型存储场上是有意义的,但学习时简单的名称效果更好。我将调用我的第一个启动器iqn.2013-11.io.mwl:host1,以及我的第一个子目标iqn.2013-11.io.mwl:target1。我可以使用更有意义的名称,如启动器的主机名或目标驱动器的LUN,但这些名称足以开始使用。

关于所有这些名字,重要的是要记住它们是私人的。组织之外的任何人都不会看到它们。如果你有一个非常长的域名,比如michaelwlucas.com,不要在iSCSI名称中使用它。如果我选择使用一个我不拥有的短域名,或者如果我武断地宣布我的组织成立于2000-01年,没有人会在乎。

我们将首先创建一个目标,然后创建一个发起者。初始配置将使iSCSI工作,但不是非常安全。我们将继续添加安全性和发现功能。

Target 设置

首先创建一个ctld配置文件/etc/ctl.conf。这个文件不应是全球可读的:

然后启用ctld服务:

现在在/etc/ctl.conf中创建iSCSI配置。您必须重新加载或重新启动ctld才能使任何更改生效。与许多其他服务一样,运行service ctld reload会检查配置文件是否有错误。它不会使用无效的ctl.conf重新启动服务。

工作配置至少需要两个部分:门户组和目标。所有目标都是门户组的成员,因此请先创建门户组。

我们从门户组声明开始,然后是此门户组的名称group0。下面的大括号包含门户组的配置。

iSCSI发现发生在门户组级别。发现通常需要身份验证,我们将在本章稍后讨论。在这个例子中,我们故意禁用了发现身份验证。

然后,我们列出此门户组侦听的IPv4和IPv6地址。0.0.0.0表示侦听主机的所有IPv4地址。对于IPv6,[::]表示“所有可用的IPv6地址”

现在您已经有了一个门户组来放置目标,请创建目标。

目标声明以目标关键字和目标名称开头。我使用了本章早些时候在“iSCSI设备命名”中创建的目标名称,iqn.2013-11.io.mwl:target0。下面的大括号包含目标配置。

每个iSCSI目标都需要一个身份验证选项和一个入口组。在此目标中,auth-group关键字设置为no-authentication(无身份验证),这意味着此目标不需要身份验证。任何可以连接到iSCSI网络插座的人都可以连接到目标中的存储设备。portal-group关键字给出了前面定义的门户组的名称group0。

此目标有一个逻辑单元号(Logical Unit Number——LUN)。每个目标都需要一个LUN 0。FreeBSD不会介意您跳过LUN 0,但一些启动器非常关心。目标中可以有任意数量的LUN,但任何向目标进行身份验证的主机都可以访问目标中的每个LUN。

每个LUN都有两条语句:通过iSCSI导出的存储设备的路径和该设备的大小。LUN 0设备正在使用zvol作为后备存储。

这为您提供了一个最小的iSCSI配置,可以将一个设备导出到整个世界,而没有iSCSI级别的安全性。让我们将其扩展为您可能想要实际使用的东西。

iSCSI目标身份验证

你可能不希望任何随机的yahoo连接到你的iSCSI设备,即使你在组织的安全范围内。

即使你信任和你一起工作的每个人,我们都有过这样的时刻,当我们按下回车键,突然意识到我们刚刚毁了一切。

要求进行身份验证已访问访问远程磁盘有助于防止愚蠢的错误。

iSCSI支持质询握手身份验证协议(CHAP——Challenge Handshake Authentication Protocol)。iSCSI协议使用两种类型的CHAP:普通旧CHAP和双方(mutual)CHAP。

使用标准CHAP,访问iSCSI客户端需要用户名和密码。客户端必须提供有效凭据才能访问iSCSI目标。

双方CHAP为iSCSI目标和启动器分配用户和密码。通过双方CHAP,发起方提供自己的用户和密码,并要求目标方提供用户和密码作为回报。

在你的环境中,双方CHAP似乎有些矫枉过正,但对启动器和目标进行身份验证可以减少事故,并有助于检测配置错误和安全事件。如果你通常的iSCSI目标突然忘记了自己的用户名和密码,会出现严重错误。

iSCSI用户的密码称为secret(机密)。机密通常以纯文本形式存储在配置文件中。

有正当理由让许多人访问iSCSI密钥,因此它们不会像密码那样存储为哈希值。与密码不同,你很少会键入iSCSI密钥——通常是复制和粘贴它们。

虽然本书中的示例秘密简短且易于记忆,但CHAP秘密的长度应至少为12个字符,并包含多种不同的字符。

通过身份验证组在ctl.conf中配置身份验证。

身份验证组

连接到单个目标的多个启动器不应都使用相同的用户名和密码。

FreeBSD使用authentication groups(身份验证组)来创建用户名和密码的集合。

你可以将身份验证组分配给目标,有效地表示“这些用户可以连接到此目标”。

虽然你可以在每个目标的基础上分配身份验证信息,但身份验证组允许你在多个门户和目标之间重用身份验证。

身份验证组以字符串auth-group和名称开头。每个身份验证组都需要一个唯一的名称。在这里,我们定义了一个身份验证组db,它有两个有效的用户名:

是的,用户名和密码以纯文本形式存储在文本文件中。这就是为什么/etc/ctl.conf需要对全世界不可读。只有应该有权访问主机iSCSI机密的用户才能读取该文件。

每个目标都需要一个身份验证组,由auth-group关键字设置。同样,门户(portals)需要一个身份验证组来进行发现,该组由discovery-auth-group关键字定义。

每个身份验证组只能包含一种类型的凭据。你不能在一个身份验证组中混合使用CHAP和双方CHAP。

ctld守护进程始终创建但不一定使用no-authentication身份验证组。此组允许任何人在不进行身份验证的情况下连接到目标。同样,defaul身份验证组阻止任何人对目标进行身份验证。自己配置任何其他身份验证组。

CHAP 身份认证

要定义CHAP用户,使用字符串chap、用户名、用户密码。以下定义用户pepe和密码penelope:

CHAP用户定义必须位于身份验证组或目标语句中,如上文"Authentication Groups"所示。

不要在单个身份验证组中组合CHAP和双方CHAP语句。

双方 CHAP 身份验证

配置双方CHAP需要两个用户名,每个用户名都有自己的密码。使用chap-mutual关键字:

下面,发起者由用户名mickey和密码minie,目标的用户名为donald,密码是goofy:

你自己的密码应该是12个字符或更长,比上面例子复杂。

与标准CHAP语句一样,双方CHAP只能在身份验证组或目标内定义。你不能将chap和chap-mutual合并在一个组中。

限制发起人

除了需要用户名和密码才能访问目标外,还可以使用启动器名称和IP地址限制哪些启动器可以连接到哪些目标。

使用initiator-name关键字定义可以在身份验证组中连接的启动器名称。如果你有多个允许的启动器,请在单独的行中列出每个启动器名称。在这里,我要求启动器使用我在本章前面创建的名称,以及几个类似的启动器名称:

大多数启动器软件都可以设置启动名称,因此限制启动器名称不是一种安全措施。

如果有人拥有目标的CHAP用户名和密码,他们可能也可以捕获启动器名称。这更像是一种防止人为错误造成问题的方法。

按IP地址限制启动器可能更有效。使用initiator-portal关键字和允许的IP地址或网络块。

如果你有多个允许的IP块,可在每一行中列出每个IP块及其各自的initiator-portal关键字:

虽然通过IP地址限制连接可能比限制启动器名称更安全,但它仍然不能取代防火墙或数据包过滤器。你真的需要一个网络访问控制设备在你的目标和公共互联网之间。

IP或启动器名称的限制仅可用于其他身份验证方法。您必须使用某种CHAP或明确允许无身份验证的访问。

门户组

protal group是将iSCSI目标连接到IP地址的粘合剂。它还允许你设置发现所需的身份验证。

门户地址

虽然iSCSI服务器可能会监听系统上的所有地址,但有时你可能希望特定目标仅在特定IP地址上可用。使用linsten关键字和IP地址:

这在迁移时有用。想象一下,你的iSCSI负载已经达到需要服务器拆分为两台主机的程度。像主机添加第二个IP地址。将一半的主机配置为使用新IP作为其iSCSI目标。在迁移日,将新IP移动到新主机,并将相关SCSI设备插入新服务器。

发现身份验证

使用discovery-auth-group关键字将一个且仅一个身份验证组附加到门户组。当发起者查询门户以了解哪些资源可用时,门户在发送任何信息之前都需要用户名和密码。

目标

目标是将磁盘存储连接到iSCSI服务的位置。除了后端存储,你还可以分配身份验证凭据、别名和LUNs。

每个目标都以目标关键字和目标的iSCSI名称开头。一个可用的目标必须包含身份验证配置、门户组、和至少一个LUN。缺少任何一项都将无效。

目标身份验证

为目标配置身份验证的最简单也是最好的方法是使用身份验证组,将身份验证从目标本身抽象出来。auth-group关键字告诉目标从以前定义的组中获取身份验证配置:

但是,你可以直接在目标中配置身份验证信息。使用auth-type关键字定义访问此目标所需的身份验证类型。你可以使用chap或chap-mutual,这意味着你可以在此目标中稍后设置用户名和密码。如果设置为deny,则没有人可以对此目标进行身份验证。最后,none告诉目标它不需要身份验证(但它可能有其他限制)。

chap和chap-mutual关键字在目标定义中的工作方式与在身份验证组中完全相同。你只能为每个目标使用一种身份验证类型——也就是说,你不能设置auth-type chap,然后再设置chap-mutual声明。

一个目标只能包含一种类型的用户名和密码身份验证——auth-group、chap、chap-mutual。多个目标可以使用不同的身份验证方法。

auth-type关键字通常是可选的。如果没有明确声明身份验证类型,chap或chap-mutual的存在会让FreeBSD推断出身份验证类型。auth-type关键字存在的主要原因是,你可以显式指定auth-type none。

如果目标不提供任何身份验证方法,则所有使用iSCSI设备的尝试都将被拒绝。要允许无身份验证的访问,请使用内置的CHAP组no-authentication。

也可以在目标中使用initiator-name和initiator-portal选项,就像在身份验证组中一样。以下示例中,允许具有特定启动器名称的特定IP在没有密码的情况下访问目标:

如果将启动器配置为使用身份验证,但目标不需要身份验证,则连接成功。

门户组

每个目标必须附加到一个门户组。使用portal-group关键字和先前定义的门户组的名称:

每一个目标只能属于一个门户组。

别名

使用alias关键字向目标添加人类可读的描述:

别名不能包含空格。

你将在一些iSCSI发现工具中找到别名。FreeBSD的启动器以详细模式显示别名。

逻辑单元号和后备存储

逻辑单元号:Logical Unit Number(LUN)是一种存储设备。它可能是一个ZFS卷、一块磁盘空间,甚至是一个物理设备。

每个iSCSI目标都需要一个或多个LUN。

连接到此目标的任何启动器都可以访问目标中的所有LUN。

在target语句中定义LUN。每个LUN都需要一条到后端存储设备的路径。字节大小是可选的。

下面我定义了一个由三个LUN组成的目标:

LUN 0 是一个1TB ZFS卷,可通过设备节点/dev/zvol/db/disk1访问。为了获得最佳性能,请在创建卷时将volmode属性设置为dev。使用dev的volmode可以让ZFS绕过GEOM,更灵活地管理I/O大小。它还启用了DPO和FUA缓存控制,让ZFS告诉驱动器不要将选定数据放入写缓存。

LUN 1是某文件系统上的一个名为/db/disk2.img的文件。它可能是位于UFS分区或ZFS数据集上的文件。可以是常规文件或稀疏文件。

LUN 2s是一个设备节点为/dev/da0的物理磁盘。

LUN的编号可以是任何正整数,且LUN编号不需要是连续的。

如果你有许多由文件或zol服务的iSCSI设备,请认真考虑在LUN之后为每个LUN命名备份存储。使用zol或名称中带有逗号的文件,例如target1,l,0表示目标1,LUN0。(注意,中间的字符是小写字母l,不是数字1)

任何连接到此目标的启动器都可以访问所有这三个LUN。

LUN大小

每个LUN都有一个size语句,以字节为单位向启动器提供ctld报告的大小。可以使用缩写,如G表示千兆字节、T表示兆兆字节。如果没有指定大小,FreeBSD将探测设备以找出大小。

给出的大小应该与存储设备的实际大小相同,但并非总是如此。

在上面的示例中,我们生成LUN 3后面的磁盘是1TB。这是个物理1TB磁盘,这意味着制造商以基数10测量了其大小。FreeBSD以2为基数测量磁盘大小。运行geom disk list da0,此特定磁盘的实际大小为1000204886016字节,即932GB。记住,并非所有“1TB磁盘”的大小都相同。

除了大小和后备存储外,还可以设置各种其他LUN特性。

块大小

传统物理磁盘使用512字节扇区,较新的磁盘使用4K字节扇区。

对于物理磁盘和ZFS卷,ctld将物理扇区大小传输给启动器。

在基于文件的iSCSI卷上,使用blocksize关键字设置扇区大小:

如果你使用基于文件的iSCSI存储,而不是zol或物理磁盘,设置块大小可以帮助iSCSI启动器正确地为底层存储写入请求。

驱动器信息

SCSI命令公开物理硬盘的型号名称、序列号和其他特定于供应商的数据。你可以在iSCSI LUN定义中设置相同的信息。

ctld守护进程提供device-id和serial关键字。使用device-id提供类似型号名称的内容。serial关键字用于类似序列号的任何东西。这两个条目都不能有空格。

下面示例中,使用device-id让管理启动器主机的人查看目标使用的存储类型。此例中使用了一个无意义的序列号,但你可以使用该序列号将其他数据传递给客户端:

在客户端上,设备ID在geom disk list的lunname和lunid值中可见。序列号在磁盘的ident字符串中可见。下面示例,我登录到启动器主机并查看本地系统上显示的此设备:

前导FREEBSD和空格始终出现在LUN名称和LUN ID中。

ctld(8) 性能

虽然ctld的设计性能很好,但你可以对其行为进行一些调整。

每个传入的TCP连接都会使ctld生成一个子进程。默认情况下,ctld将子进程的数量限制为30。如果你正在运行一个繁忙的iSCSI服务器,其中有许多启动器,你可能需要使用maxproc选项来增加它:

将maxproc设置为0表示允许无限制的子进程。

发起者向目标产生几乎恒定的流量。即使iSCSI磁盘出于空闲状态,目标也会每隔几秒接收一次流量。停止发送流量超过几秒钟的启动器可能已经消失。timeout值允许你告诉ctld在丢弃空闲连接之前要保持多长时间。默认值为60,这是一个合理的平均值,你的设备或环境可能需要不同的超时值:

所有性能和调试选项都位于ctl.conf的顶层,不在任何大括号内。

调试ctld(8)

虽然SCSI命令集变得复杂,但iSCSI本身却非常简单。即便如此,我们系统管理员可以发现许多方法来破坏我们的iSCSI配置。ctld调试功能通常可以很好地洞察问题。

使用debug语句启用调试。默认级别0仅提供基本的操作消息。当iSCSI连接出错时,调试级别3会提供有用的信息:

来自ctld的信息显示在/var/log/messages中。你无法更改日志功能和级别(deamon.debug),因此,如果你想单独记录它们,则需要在syslogd中将其拆分。

每当启动器无法进行身份验证,或者LUN的存储不存在或出现故障时,ctld都会记录错误。大多数ctld错误消息实际上相当容易理解。身份验证错误描述了违反了哪个身份验证约束。LUN错误更为常见,但通常意味着你在ctld.conf中键入了错误的备份存储路径。

在正常的生产机上,推荐使用3级调试级别,以轻松识别和解决问题。日志空间不贵。

配置启动器

iSCSI启动程序共享一个配置文件/etc/iscsi.conf。

这个配置文件在旧版FreeBSD中也在用,因此其文档包含了对过时的iscontrol的引用。然而,配置格式在两套软件之间故意没有改变。

iSCSI启动器的最简单用法不需要配置文件。你可以在主机上发现目标,连接到它们并断开连接,以及在没有配置文件的情况下执行CHAP身份验证。配置文件允许使用更复杂的选项,比如双方CHAP,并允许更具选择性的iSCSI管理。在生产中,始终使用配置文件。

每个iSCSI目标在iscsi.conf中都有一个括号内的部分:

目标的条目以昵称开头。上面示例中目标的昵称为target-nickname。

在花括号内,我们有各种iSCSI设置及其值,如iscsi.conf中所定义。我们将在相关主题中添加更多设置,但这里的三个设置非常有用。

目标定义的右括号必须单独出现在一行上。不要将其附加到最后一个变量设置的末尾。

使用iSCSI磁盘时,请记住设备节点比普通硬件更具有动态性。今天是/dev/da5的磁盘,明天可能是一个完全不同的磁盘节点。始终使用标签而不是按设备节点管理iSCSI磁盘上的文件系统。

启用iSCSI 启动器

FreeBSD通过iscsid和iscsictl提供iSCSI启动器服务。

iscsid守护进程处理连接,iscsictl允许你发出iSCSI命令。

iscsid(8)

iSCSI守护程序iscsid管理启动器的iSCSI登录和发现。

一旦iscsid建立了连接,它就会将连接交给FreeBSD内核。要启用iscsid,请在/etc/rc.conf中将iscsid_enable设置为YES。

如果你在iSCSI登录时遇到问题,可以尝试iscsid调试模式。

-d标志告诉iscsid在前台运行,并将所有调试信息打印到终端。调试模式iscsid在仅处理一个连接后终止。这不会中断现有的连接,因为iscsid只处理登录和发现。

即使没有iscsid,已建立的iSCSI连接也会一直保持连接状态,直到有东西中断它们。iscsid运行时,中断的连接会自动恢复。

虽然iscsid通常从iscsi.conf获取调试级别,但你可以在命令行上使用-l和日志级别覆盖该设置。这使你可以在不编辑配置文件的情况下调试特定问题。日志级别为3将标识大多数问题。

每个iSCSI登录都会生成一个子进程。这些子进程处理身份认证、协商各种iSCSI参数、将连接移交给内核并退出。

通常,同时进行的子进程的最大数量为30。如果必须同时处理30个以上的iSCSI登录,请使用-m标志设置新的最大值。将最大值设置为0可以消除对子进程数量的任何限制。

启动器控制器: iscsictl(8)

通过iscisictl配置和管理你的iSCSI启动器。虽然你可以在命令行执行一些配置,但复杂的设置需要配置文件/etc/iscsi.conf。

iSCSI启动器有三个核心功能:发现目标、连接目标、断开与目标的连接。你还可以列出现有的iSCSI会话。

启动器身份验证

建立iSCSI连接和执行发现通常需要身份验证。你可以在命令行或iscsi.conf中设置身份验证选项。

默认情况下,iscsictl不提供身份验证。如果目标不需要身份验证,则不要包含任何身份验证信息。向不需要身份验证的目标提供身份验证信息可能会导致连接失败。

要在命令行上使用CHAP进行身份验证,请使用-u定义用户,使用-s给出密码。在这里,我使用用户pinky和密码brain运行iSCSI命令:

要在iscsi.conf中设置CHAP身份验证,必须设置AuthMethod、ChapIName、ChapSecret变量。以下示例,我们为昵称为db的目标设置了相同的用户名和密码:

如果目标需要身份验证,请将AuthMethod设置为CHAP,即使目标使用双方CHAP。并特别注意用户名变量。在ChapIName中间有一个大写的字母I。

你无法在命令行上执行双方CHAP。你必须在iscsi.conf中使用tgtChapName和tgtChapSecret值设置远程用户和密钥,如下所示:

这将启动器连接到本章前面构建的双方CHAP目标。

仅在发现和连接时需要身份验证。您可以在不进行身份验证的情况下断开连接。

iSCSI 发现

iSCSI discovery是将启动器连接到门户(portal)的最简单的方法。这是启动器转到目标服务器上的iSCSI门户。如果启动器成功通过身份验证,门户将返回一个目标列表。

-A标志告诉iscsictl添加会话。-d标志触发发现,并接受一个参数:iSCSI门户组的主机名或IP地址。以下示例,我对主机data1.mwl.io执行iSCSI发现:

当启动器获取驱动器信息时,它会自动登录到系统,并将所有发现的LUN连接到本地系统。查看启动器发现内容的唯一方法是查看现有的iSCSI会话。

查看iSCSI 会话和连接

要查看所有活动的iSCSI会话,请运行不带任何参数的iscsictl命令,或使用-L标志。两者会给出相同的结果:

此启动器已连接到此主机上的两个目标。你能看到目标名称、门户和本地主机分配给此目标中驱动器的设备节点。

如果想获得更多细节,可在-L中添加-v标志:

第一项,Session ID,是分配给此特定连接的唯一编号。如果你断开与目标的连接并稍后重新连接,你将获得下一个可用会话ID。重新启动后,ID号从1重新开始。

详细列表包括完整的目录名称和身份验证信息,包括任何密码。你可以使用此信息为此目标构建iscsi.conf条目。你还将看到存储管理员分配的目标别名。

要查看特定磁盘的详细信息,请使用geom disk list和gpart等磁盘管理工具。

连接到目标

发现的一个问题是启动器会自动连接到门户上的所有可用目标。不过,仅仅因为主机可以连接并不意味着它应该连接。一旦你知道你可以访问哪些目标,iscsictl就可以让你更有选择性地附加它们。

使用-A标志重新添加iSCSI会话。

如果主机在/etc/iscsi.conf中没有所需目标的条目,可使用-p标志指定门户主机名或IP,使用-t标志指定所需目标名称。

以下示例,我们附加主机storm上的目标iqn.2013-11.io.mwl:target1:

如果iscsi.conf中有我的目标条目,我可以通过分配的昵称进行连接。昵称是目标描述中的第一项,紧挨着首支括号。使用-n指定昵称。上面的示例iscsi.conf条目使用昵称db,所以我们用以下命令连接它:

主机仅连接到该目标。

使用-a可以连接到iscsi.conf中配置的多有iSCSI磁盘:

每当启动器连接到目标时,它都会获取目标中的所有磁盘。无法连接到目标中的多个磁盘中的一个。

从目标断开

使用-R标志移除连接的目标。加上-a标志可以移除所有连接的目标:

要放弃多个连接中的一个特定连接,可以使用-p指定门户、-t指定目标。这与连接到同一个目标完全一样,除了它是使用-R而不是-A:

最后,对于iscsi.conf中配置的目标,使用-n断开指定昵称的连接:

现在,您可以创建和使用iSCSI磁盘。

启动器调整

FreeBSD iSCSI启动器允许你通过启动时可调参数调整定时、故障、性能和日志记录行为。虽然通过sysctl可以读取这些值,但只能在/boot/loader.conf中更改它们。

iSCSI日志消息通常显示在/var/log/messages中。sysctl kern.iscsi.debug启用这些消息。默认值为1,表示on。要禁用大多数iSCSI日志记录,可以将kern.iscsi.debug设置为0,当你连接或分离启动器时仍然会收到消息,但你的日志会小很多。禁用日志记录会给排查故障带来隐患。

可调的kern.iscsi.maxtags对启动器在任何给定时间未完成的I/O请求数量设置了最大限制。默认255是一个合理的设置。

iSCSI 定时

你可以调整iSCSI客户端等待iSCSI过程各个部分的时间。

可调kern.iscsi.iscsid设置iscsid等待目标响应连接请求并建立会话的秒数。默认是60秒。如果你的iSCSI服务器无法在60秒内建立连接,则表明你的网络或目标服务器有问题。

最后,kern.iscsi.ping_timeout可调参数给出了启动器等待目标响应NOP-Out请求或'iscsi ping'的秒数。默认值为5秒。如果目标无法在5秒内提供请求服务,那么你可能无论如何都不想向它发送任何I/O。但是某些iSCSI堆栈不支持NOP-Out请求,你可能需要为这些堆栈禁用它们。

iSCSI 故障行为

所有系统同时发生故障的情况很少见,你可以告诉发起者当目标消失时如何反应。

默认情况下,FreeBSD启动器会保留丢失驱动器的设备节点。iscsid守护进程不断尝试恢复与目标的连接。

然而,在某些设置中,删除设备节点更有意义。

要使启动器在目标消失时删除设备节点,可将kern.iscsi.fail_on_disconnection设置为1。