第21章 其他文件系统
附录 D. OpenPGP 密钥
30.12.iSCSI 启动器和目标机器配置
iSCSI 是一种通过网络共享存储的方法。与在文件系统级别工作的 NFS 不同,iSCSI 在块设备级别工作。
在 iSCSI 术语中,共享存储的系统称为_目标_。存储可以是物理磁盘,也可以是表示多个磁盘的区域或物理磁盘的一部分。例如,如果磁盘是使用 ZFS 格式化的,则可以创建一个 zvol 以用作 iSCSI 存储。
访问 iSCSI 存储的客户端称为_启动器_。对于启动器,通过 iSCSI 提供的存储显示为原始的、未格式化的磁盘,称为 LUN。磁盘的设备节点显示在 /dev/ 中,并且必须单独格式化和装载设备。
FreeBSD 提供了一个原生的、基于内核的 iSCSI 目标和启动器。本节描述如何将 FreeBSD 系统配置为目标或启动器。

30.12.1. 配置 iSCSI 目标

要配置 iSCSI 目标,请创建 /etc/ctl.conf 配置文件,向 /etc/rc.conf 添加一行以确保 ctld(8) 守护程序在引导时自动启动,然后启动守护程序。
下面是一个简单的 /etc/ctl.conf 配置文件的示例。有关此文件可用选项的更完整描述,请参阅 ctl.conf(5)
1
portal-group pg0 {
2
discovery-auth-group no-authentication
3
listen 0.0.0.0
4
listen [::]
5
}
6
7
target iqn.2012-06.com.example:target0 {
8
auth-group no-authentication
9
portal-group pg0
10
11
lun 0 {
12
path /data/target0-0
13
size 4G
14
}
15
}
Copied!
第一个条目定义了 pg0 门户组。门户组定义了 ctld(8) 守护程序将监听的网络地址。discovery-auth-group no-authentication 条目表示允许任何启动器执行 iSCSI 目标发现,而无需验证。第三行和第四行配置 ctld(8) 在所有 IPv4(listen 0.0.0.0)和 IPv6(listen [:]) 地址上监听,默认端口为 3260
没有必要定义一个门户组,因为有一个内置的门户组叫 default。在这种情况下, defaultpg0 的区别在于,对于 default,目标发现总是被拒绝,而对于pg0,总是被允许。
第二个条目定义了一个单一的目标。目标有两种可能的含义:一台为 iSCSI 服务的机器或一个命名的 LUN 组。这个例子使用了后者的含义,其中 iqn.2012-06.com.example:target0 是目标名称。这个目标名称适合用于测试目的。实际使用时,请将 com.example 修改为真实域名的倒写。2012-06 代表获得该域名控制权的年份和月份,而 target0 可以是任何值。在这个配置文件中可以定义任何数量的目标。
auth-group no-authentication 行允许所有启动程序连接到指定的目标, portal-group pg0 使目标可以通过 pg0 门户组到达。
下一节定义了 LUN。对启动程序来说,每个LUN都将作为一个单独的磁盘设备可见。可以为每个目标定义多个 LUN。每个 LUN 由一个数字标识,其中 LUN 0 是必须的。 path /data/target0-0 行定义了支持 LUN 的文件或 Zvol 的完整路径。在启动 ctld(8) 之前,该路径必须存在。第二行是可选的,指定 LUN 的大小。
接下来,要确保 ctld(8) 守护程序在引导时启动,请将以下行添加到 /etc/rc.conf
1
ctld_enable="YES"
Copied!
要立即启动 ctld(8),请运行以下命令:
1
# service ctld start
Copied!
ctld(8) 守护程序启动时,它读取 /etc/ctl.conf。如果在守护程序启动后编辑此文件,请使用以下命令,以便更改立即生效:
1
# service ctld reload
Copied!

30.12.1.1. 身份验证

前面的示例本质上是不安全的,因为它不使用身份验证,而是授予任何人对所有目标的完全访问权限。要要求用户名和密码才能访问目标,请按如下方式修改配置:
1
auth-group ag0 {
2
chap username1 secretsecret
3
chap username2 anothersecret
4
}
5
6
portal-group pg0 {
7
discovery-auth-group no-authentication
8
listen 0.0.0.0
9
listen [::]
10
}
11
12
target iqn.2012-06.com.example:target0 {
13
auth-group ag0
14
portal-group pg0
15
lun 0 {
16
path /data/target0-0
17
size 4G
18
}
19
}
Copied!
auth-group 部分定义了用户名和密码对。试图连接到 iqn.2012-06.com.example:target0 的发起人必须首先指定一个定义的用户名和密码。但是,在没有身份验证的情况下,仍然允许目标发现。要要求目标发现身份验证,请将 discovery-auth-group 设置为已定义的 auth-group 名称,而不是 no-authentication
通常为每个启动器定义一个导出的目标。作为上述语法的简写,可以直接在目标条目中指定用户名和密码:
1
target iqn.2012-06.com.example:target0 {
2
portal-group pg0
3
chap username1 secretsecret
4
5
lun 0 {
6
path /data/target0-0
7
size 4G
8
}
9
}
Copied!

30.12.2. 配置 iSCSI 启动程序

注意
本节中描述的 iSCSI 启动程序从 FreeBSD 10.0-RELEASE 开始受支持。要使用旧版本中可用的 iSCSI 启动器,请参阅 iscontrol(8)
iSCSI 发起程序要求 iscsid(8) 守护程序正在运行。此守护程序不使用配置文件。要在启动时自动启动它,请将以下行添加到 /etc/rc.conf
1
iscsid_enable="YES"
Copied!
要立即启动 iscsid(8),请运行以下命令:
1
# service iscsid start
Copied!
无论是否使用 /etc/iscsi.conf 配置文件,都可以连接到目标。本节演示这两种类型的连接。

30.12.2.1. 在没有配置文件的情况下连接到目标

要将启动器连接到单个目标,请指定门户的 IP 地址和目标的名称:
1
# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0
Copied!
要验证连接是否成功,请运行不带任何参数的 iscsictl。输出应该如下所示:
1
Target name Target portal State
2
iqn.2012-06.com.example:target0 10.10.10.10 Connected: da0
Copied!
在这个例子中,iSCSI 会话被成功建立,/dev/da0 代表连接的 LUN。如果 iqn.2012-06.com.example:target0 目标导出了一个以上的 LUN,多个设备节点将显示在输出的那个部分。
1
Connected: da0 da1 da2.
Copied!
任何错误都将在输出以及系统日志中报告。例如,此消息通常意味着 iscsid(8) 守护程序未运行:
1
Target name Target portal State
2
iqn.2012-06.com.example:target0 10.10.10.10 Waiting for iscsid(8)
Copied!
以下消息提示存在网络问题,例如错误的 IP 地址或端口:
1
Target name Target portal State
2
iqn.2012-06.com.example:target0 10.10.10.11 Connection refused
Copied!
此消息表示指定的目标名称有误:
1
Target name Target portal State
2
iqn.2012-06.com.example:target0 10.10.10.10 Not found
Copied!
此消息表示目标需要身份验证:
1
Target name Target portal State
2
iqn.2012-06.com.example:target0 10.10.10.10 Authentication failed
Copied!
若要指定 CHAP 用户名和密码,请使用以下语法:
1
# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 -u user -s secretsecret
Copied!

30.12.2.2. 使用配置文件连接到目标

要使用配置文件进行连接,请使用如下内容创建 /etc/iscsi.conf
1
t0 {
2
TargetAddress = 10.10.10.10
3
TargetName = iqn.2012-06.com.example:target0
4
AuthMethod = CHAP
5
chapIName = user
6
chapSecret = secretsecret
7
}
Copied!
t0指定配置文件部分的昵称。启动器将使用它来指定要使用的配置。其他线路指定在连接期间要使用的参数。TargetAddressTargetName 是必需的,而其他选项是可选的。在此示例中,将显示 CHAP 用户名和密码。
要连接到定义的目标,请指定昵称:
1
# iscsictl -An t0
Copied!
或者,要连接到配置文件中定义的所有目标,请使用:
1
# iscsictl -Aa
Copied!
要使启动器自动连接到 /etc/iscsi.conf 中的所有目标,请将以下内容添加到 /etc/rc.conf
1
iscsictl_enable="YES"
2
iscsictl_flags="-Aa"
Copied!