32.12. iSCSI target 和 initiator 的配置 ======================================= iSCSI 是一种通过网络共享存储的方法。与在文件系统级别工作的 NFS 不同,iSCSI 在块设备级别工作。 在 iSCSI 术语中,共享存储的系统称为 *target*\ 。存储可以是物理磁盘,也可以是表示多个磁盘的区域或物理磁盘的一部分。例如,如果磁盘是使用 ZFS 格式化的,则可以创建一个 zvol 以用作 iSCSI 存储。 访问 iSCSI 存储的客户端称为 *initiator*\ 。对于 initiator,通过 iSCSI 提供的存储显示为原始的、未格式化的磁盘,称为 LUN。磁盘的设备节点显示在 **/dev/** 中,并且必须单独格式化和装载设备。 FreeBSD 提供了一个原生的、基于内核的 iSCSI target 和 initiator。本节说明如何将 FreeBSD 系统配置为 target 或 initiator。 32.12.1. 配置 iSCSI target -------------------------- 要配置 iSCSI target,请创建 **/etc/ctl.conf** 配置文件,向 **/etc/rc.conf** 添加一行以确保 `ctld(8) `__ 守护程序在引导时自动启动,然后启动守护程序。 下面是一个简单的 **/etc/ctl.conf** 配置文件的示例。有关此文件可用选项的更完整说明,请参阅 `ctl.conf(5) `__\ 。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session portal-group pg0 { discovery-auth-group no-authentication listen 0.0.0.0 listen [::] } target iqn.2012-06.com.example:target0 { auth-group no-authentication portal-group pg0 lun 0 { path /data/target0-0 size 4G } } 第一个条目定义了 ``pg0`` 门户组。门户组定义了 `ctld(8) `__ 守护程序将监听的网络地址。\ ``discovery-auth-group no-authentication`` 条目表示允许任何 initiator 执行 iSCSI target 发现,而无需验证。第三行和第四行配置 `ctld(8) `__ 在所有 IPv4(\ ``listen 0.0.0.0``\ )和 IPv6(\ ``listen [:]``\ )地址上监听,默认端口为 ``3260``\ 。 没有必要定义一个门户组,因为有一个内置的门户组叫 ``default``\ 。在这种情况下,\ ``default`` 和 ``pg0`` 的区别在于,对于 ``default``\ ,target 发现总是被拒绝,而对于\ ``pg0``\ ,总是被允许。 第二个条目定义了一个单一的 target。target 有两种可能的含义:一台为 iSCSI 服务的机器或一个命名的 LUN 组。这个例子使用了后者的含义,其中 ``iqn.2012-06.com.example:target0`` 是 target 名称。这个 target 名称适合用于测试目的。实际使用时,请将 ``com.example`` 修改为真实域名的倒写。2012-06 代表获得该域名控制权的年份和月份,而 ``target0`` 可以是任何值。在这个配置文件中可以定义任何数量的 target。 ``auth-group no-authentication`` 行允许所有启动程序连接到指定的 target,\ ``portal-group pg0`` 使 target 可以通过 pg0 门户组到达。 下一节定义了 LUN。对启动程序来说,每个 LUN 都将作为一个单独的磁盘设备可见。可以为每个 target 定义多个 LUN。每个 LUN 由一个数字标识,其中 LUN 0 是必须的。\ ``path /data/target0-0`` 行定义了支持 LUN 的文件或 ``Zvol`` 的完整路径。在启动 `ctld(8) `__ 之前,该路径必须存在。第二行是可选的,指定 LUN 的大小。 接下来,要确保 `ctld(8) `__ 守护程序在引导时启动,请将以下行添加到 **/etc/rc.conf**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ctld_enable="YES" 要立即启动 `ctld(8) `__\ ,请运行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service ctld start 当 `ctld(8) `__ 守护程序启动时,它读取 **/etc/ctl.conf**\ 。如果在守护程序启动后编辑此文件,请使用以下命令,以便更改立即生效: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service ctld reload 32.12.1.1. 身份验证 ~~~~~~~~~~~~~~~~~~~ 前面的示例本质上是不安全的,因为它不使用身份验证,而是授予任何人对所有 target 的完全访问权限。要要求用户名和密码才能访问 target,请按如下方式修改配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session auth-group ag0 { chap username1 secretsecret chap username2 anothersecret } portal-group pg0 { discovery-auth-group no-authentication listen 0.0.0.0 listen [::] } target iqn.2012-06.com.example:target0 { auth-group ag0 portal-group pg0 lun 0 { path /data/target0-0 size 4G } } ``auth-group`` 部分定义了用户名和密码对。试图连接到 ``iqn.2012-06.com.example:target0`` 的发起人必须首先指定一个定义的用户名和密码。但是,在没有身份验证的情况下,仍然允许 target 发现。要要求 target 发现身份验证,请将 ``discovery-auth-group`` 设置为已定义的 ``auth-group`` 名称,而不是 ``no-authentication``\ 。 通常为每个 initiator 定义一个导出的 target。作为上述语法的简写,可以直接在 target 条目中指定用户名和密码: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session target iqn.2012-06.com.example:target0 { portal-group pg0 chap username1 secretsecret lun 0 { path /data/target0-0 size 4G } } 32.12.2. 配置 iSCSI 启动程序 ---------------------------- **注意** 本节中说明的 iSCSI 启动程序从 FreeBSD 10.0-RELEASE 开始受支持。要在旧版本中使用可用的 iSCSI initiator,请参阅 `iscontrol(8) `__\ 。 iSCSI 发起程序要求 `iscsid(8) `__ 守护程序正在运行。此守护程序不使用配置文件。要在启动时自动启动它,请将以下行添加到 **/etc/rc.conf**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session iscsid_enable="YES" 要立即启动 `iscsid(8) `__\ ,请运行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service iscsid start 无论是否使用 **/etc/iscsi.conf** 配置文件,都可以连接到 target。本节演示这两种类型的连接。 32.12.2.1. 在没有配置文件的情况下连接到 target ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 要将 initiator 连接到单个 target,请指定门户的 IP 地址和 target 的名称: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 要验证连接是否成功,请运行不带任何参数的 ``iscsictl``\ 。输出应该如下所示: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Connected: da0 在这个例子中,iSCSI 会话被成功建立,\ **/dev/da0** 代表连接的 LUN。如果 ``iqn.2012-06.com.example:target0`` target 导出了一个以上的 LUN,多个设备节点将显示在输出的那个部分。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Connected: da0 da1 da2. 任何错误都将在输出以及系统日志中报告。例如,此消息通常意味着 `iscsid(8) `__ 守护程序未运行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Waiting for iscsid(8) 以下消息提示存在网络问题,例如错误的 IP 地址或端口: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.11 Connection refused 此消息表示指定的 target 名称有误: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Not found 此消息表示 target 需要身份验证: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Target name Target portal State iqn.2012-06.com.example:target0 10.10.10.10 Authentication failed 若要指定 CHAP 用户名和密码,请使用以下语法: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 -u user -s secretsecret 32.12.2.2. 使用配置文件连接到 target ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 要使用配置文件进行连接,请使用如下内容创建 **/etc/iscsi.conf**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session t0 { TargetAddress = 10.10.10.10 TargetName = iqn.2012-06.com.example:target0 AuthMethod = CHAP chapIName = user chapSecret = secretsecret } ``t0`` 指定了配置文件部分的昵称。initiator 将使用它来指定要使用的配置。其他行指定了在连接期间要使用的参数:\ ``TargetAddress`` 和 ``TargetName`` 是必需的,而其他选项是可选的。在此示例中,将显示 CHAP 用户名和密码。 要连接到定义的 target,请指定昵称: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # iscsictl -An t0 或者,要连接到配置文件中定义的所有 target,请使用: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # iscsictl -Aa 要使 initiator 自动连接到 **/etc/iscsi.conf** 中的所有 target,请将以下内容添加到 **/etc/rc.conf**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session iscsictl_enable="YES" iscsictl_flags="-Aa"