

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 Linux 配置 iSCSI
<a name="mount-iscsi-luns-linux"></a>

FSx for ONTAP 支持 iSCSI 协议。您需要在 Linux 客户端和文件系统上配置 iSCSI，才能使用 iSCSI 协议在客户端和文件系统之间传输数据。iSCSI 协议适用于所有拥有 6 个或更少的[高可用性（HA）对](HA-pairs.md)的文件系统。

在适用于 NetApp ONTAP 的 Amazon FSx 上配置 iSCSI 有三个主要步骤，这些步骤将在以下过程中进行介绍：

1. 在 Linux 主机上安装和配置 iSCSI 客户端。

1. 在文件系统的 SVM 上配置 iSCSI。
   + 创建 iSCSI 启动器组。
   + 将启动器组映射到 LUN。

1. 在 Linux 客户端上挂载 iSCSI LUN。

## 开始前的准备工作
<a name="iscsi-linux-byb"></a>

在开始为 iSCSI 配置文件系统之前，需要完成以下各项。
+ 创建 FSx for ONTAP 文件系统。有关更多信息，请参阅 [创建文件系统](creating-file-systems.md)。
+ 在文件系统上创建 iSCSI LUN。有关更多信息，请参阅 [创建 iSCSI LUN](create-iscsi-lun.md)。
+ 在与文件系统相同的 VPC 中创建一个运行 Amazon Linux 2 亚马逊机器映像（AMI）的 Amazon EC2 实例。这是您配置 iSCSI 和访问文件数据所在的 Linux 主机。

  在这些过程的范围之外，如果主机位于其他 VPC 中，则可以使用 VPC 对等连接或 Amazon Transit Gateway 来授予其他 VPC 访问该卷的 iSCSI 端点的权限。有关更多信息，请参阅 [从部署 VPC 外部访问数据](supported-fsx-clients.md#access-from-outside-deployment-vpc)。
+ 配置 Linux 主机的 VPC 安全组，允许入站和出站流量，如 [使用 Amazon VPC 进行文件系统访问控制](limit-access-security-groups.md) 中所述。
+ 获取具有 `fsxadmin` 权限的 ONTAP 用户的凭证，此权限用于访问 ONTAP CLI。有关更多信息，请参阅 [ONTAP 用户和角色](roles-and-users.md)。
+ 您将要为 iSCSI 配置并用于访问 FSx for ONTAP 文件系统的 Linux 主机位于同一 VPC 和 Amazon Web Services 账户 中。
+ 我们建议您将 EC2 实例与文件系统的首选子网放入同一个可用区，如下图所示。  
![该图所示为配备 iSCSI LUN 和 Amazon EC2 实例的适用于 NetApp ONTAP 的 Amazon FSx 文件系统与文件系统的首选子网位于同一个可用区。](http://docs.amazonaws.cn/fsx/latest/ONTAPGuide/images/fsx-ontap-iscsi-mnt-client.png)

如果 EC2 实例运行的 Linux AMI 与 Amazon Linux 2 不同，则这些过程和示例中使用的某些实用程序可能已安装，并且您可能会使用不同的命令来安装所需的软件包。除了安装软件包外，本节中使用的命令还适用于其他 EC2 Linux AMI。

**Topics**
+ [开始前的准备工作](#iscsi-linux-byb)
+ [在 Linux 主机上安装和配置 iSCSI](#configure-iscsi-on-linux-client)
+ [在 FSx for ONTAP 文件系统上配置 iSCSI](#configure-iscsi-on-fsx-ontap)
+ [在 Linux 客户端上挂载 iSCSI LUN](#mount-iscsi-lun-on-linux-client)

## 在 Linux 主机上安装和配置 iSCSI
<a name="configure-iscsi-on-linux-client"></a>

**安装 iSCSI 客户端**

1. 确认 `iscsi-initiator-utils` 和 `device-mapper-multipath` 并已安装在您的 Linux 设备上。使用 SSH 客户端连接到 Linux 实例。有关更多信息，请参阅[使用 SSH 连接到 Linux 实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)。

1. 使用以下命令安装 `multipath` 和 iSCSI 客户端。如果您希望在文件服务器之间自动失效转移，则必须安装 `multipath`。

   ```
   ~$ sudo yum install -y device-mapper-multipath iscsi-initiator-utils
   ```

1. 使用 `multipath` 期间，为了便于在进行文件服务器之间的自动失效转移时更快做出响应，请将 `/etc/iscsi/iscsid.conf` 文件中的替换超时值设置为值 `5`，而不是使用默认值 `120`。

   ```
   ~$ sudo sed -i 's/node.session.timeo.replacement_timeout = .*/node.session.timeo.replacement_timeout = 5/' /etc/iscsi/iscsid.conf; sudo cat /etc/iscsi/iscsid.conf | grep node.session.timeo.replacement_timeout
   ```

1. 启动 iSCSI 服务。

   ```
   ~$ sudo service iscsid start
   ```

   请注意，根据您的 Linux 版本，您可能需要改为使用以下命令：

   ```
   ~$ sudo systemctl start iscsid
   ```

1. 使用以下命令确认正在运行服务：

   ```
   ~$ sudo systemctl status iscsid.service
   ```

   系统将使用以下输出做出响应：

   ```
   iscsid.service - Open-iSCSI 
       Loaded: loaded (/usr/lib/systemd/system/iscsid.service; disabled; vendor preset: disabled) 
       Active: active (running) since Fri 2021-09-02 00:00:00 UTC; 1min ago
       Docs: man:iscsid(8)
       man:iscsiadm(8)
       Process: 14658 ExecStart=/usr/sbin/iscsid (code=exited, status=0/SUCCESS)
       Main PID: 14660 (iscsid)
       CGroup: /system.slice/iscsid.service
       ├─14659 /usr/sbin/iscsid
       └─14660 /usr/sbin/iscsid
   ```

**在您的 Linux 客户端上配置 iSCSI**

1. 您须要配置多路径来使客户端能够在文件服务器之间自动进行失效转移。使用以下命令：

   ```
   ~$ sudo mpathconf --enable --with_multipathd y
   ```

1. 使用以下命令确定 Linux 主机的启动程序名称。启动程序名称的位置取决于您的 iSCSI 实用程序。如果您正在使用 `iscsi-initiator-utils`，则启动程序名称位于文件 `/etc/iscsi/initiatorname.iscsi` 中。

   ```
   ~$ sudo cat /etc/iscsi/initiatorname.iscsi
   ```

   系统使用启动程序名称做出响应。

   ```
   InitiatorName=iqn.1994-05.com.redhat:abcdef12345
   ```

## 在 FSx for ONTAP 文件系统上配置 iSCSI
<a name="configure-iscsi-on-fsx-ontap"></a>

1. 在 FSx for ONTAP 文件系统上，使用以下命令连接到您在其中创建了 iSCSI LUN 的 NetApp ONTAP CLI。有关更多信息，请参阅 [使用 NetApp ONTAP CLI](managing-resources-ontap-apps.md#netapp-ontap-cli)。

   ```
   ~$ ssh fsxadmin@{{your_management_endpoint_ip}}
   ```

1. 使用 NetApp ONTAP CLI 命令 [https://docs.netapp.com/us-en/ontap-cli-9111/lun-igroup-create.html](https://docs.netapp.com/us-en/ontap-cli-9111/lun-igroup-create.html) 创建启动程序组（`igroup`）。启动程序组会映射到 iSCSI LUN，并控制哪些启动程序（客户端）可以访问 LUN。将 `host_initiator_name` 替换为在上一过程中从 Linux 主机中检索到的启动程序名称。

   ```
   ::> lun igroup create -vserver {{{{svm_name}}}} -igroup {{igroup_name}} -initiator {{host_initiator_name}} -protocol iscsi -ostype linux 
   ```

   如果要使映射到此 igroup 的 LUN 可供多个主机使用，您可以指定多个启动程序名称，以逗号分隔。有关更多信息，请参阅 *NetApp ONTAP 文档中心*中的[创建 LUN igroup](https://docs.netapp.com/us-en/ontap-cli-9111/lun-igroup-create.html)。

1. 使用命令 [https://docs.netapp.com/us-en/ontap-cli-9111/lun-igroup-show.html](https://docs.netapp.com/us-en/ontap-cli-9111/lun-igroup-show.html) 确认存在 `igroup`：

   ```
   ::> lun igroup show
   ```

   系统将使用以下输出做出响应：

   ```
   Vserver   Igroup       Protocol OS Type  Initiators
   --------- ------------ -------- -------- ------------------------------------
   {{svm_name}}  {{igroup_name}}  iscsi    linux    iqn.1994-05.com.redhat:abcdef12345
   ```

1. 此步骤假定您已创建了 iSCSI LUN。如果您尚未创建，请参阅 [创建 iSCSI LUN](create-iscsi-lun.md) 的分步说明来创建。

   使用 [https://docs.netapp.com/us-en/ontap-cli-9111/lun-mapping-create.html](https://docs.netapp.com/us-en/ontap-cli-9111/lun-mapping-create.html) 来创建从已创建的 LUN 到已创建的 igroup 的映射，并指定以下属性：
   + `{{svm_name}}` – 提供 iSCSI 目标的存储虚拟机的名称。主机使用此值来连接 LUN。
   + `{{vol_name}}` – 托管 LUN 的卷的名称。
   + `{{lun_name}}` – 已分配给 LUN 的名称。
   + `{{igroup_name}}` – 启动程序组的名称。
   + `{{lun_id}}` – LUN ID 整数是特定于映射的，而不是 LUN 本身。igroup 中的启动程序将其用作逻辑单元号，并在访问存储器时为启动程序使用此值。

   ```
   ::> lun mapping create -vserver {{svm_name}} -path /vol/{{vol_name}}/{{lun_name}} -igroup {{igroup_name}} -lun-id {{lun_id}}
   ```

1. 使用 [https://docs.netapp.com/us-en/ontap-cli-9111/lun-show.html](https://docs.netapp.com/us-en/ontap-cli-9111/lun-show.html) 命令确认 LUN 已创建、已联机且已映射。

   ```
   ::> lun show -path /vol/{{vol_name}}/{{lun_name}} -fields state,mapped,serial-hex
   ```

   系统将使用以下输出做出响应：

   ```
    Vserver    Path                           serial-hex               state    mapped
    --------- ------------------------------- ------------------------ -------- --------
    {{svm_name}}  /vol/{{vol_name}}/{{lun_name}}          6c5742314e5d52766e796150 online   mapped
   ```

   保存 `serial_hex` 值（在本例中为 `6c5742314e5d52766e796150`），您将在之后的步骤中使用该值为块设备创建易记名称。

1. 使用 [https://docs.netapp.com/us-en/ontap-cli-9111/network-interface-show.html](https://docs.netapp.com/us-en/ontap-cli-9111/network-interface-show.html) 命令检索您在其中创建 iSCSI LUN 的 SVM 的 `iscsi_1` 和 `iscsi_2` 接口的地址。

   ```
   ::> network interface show -vserver {{{{svm_name}}}}
   ```

   系统将使用以下输出做出响应：

   ```
               Logical               Status     Network            Current                    Current Is 
   Vserver     Interface             Admin/Oper Address/Mask       Node                       Port    Home
   ----------- ----------            ---------- ------------------ -------------              ------- ----
   {{svm_name}}
               iscsi_1               up/up      172.31.0.143/20    FSxId0123456789abcdef8-01  e0e     true
               iscsi_2               up/up      172.31.21.81/20    FSxId0123456789abcdef8-02  e0e     true
               nfs_smb_management_1 
                                     up/up      198.19.250.177/20  FSxId0123456789abcdef8-01  e0e     true
   3 entries were displayed.
   ```

   在此示例中，`iscsi_1` 的 IP 地址是 `172.31.0.143`，`iscsi_2` 的IP 地址是 `172.31.21.81`。

## 在 Linux 客户端上挂载 iSCSI LUN
<a name="mount-iscsi-lun-on-linux-client"></a>

在 Linux 客户端上挂载 iSCSI LUN 的过程包括三个步骤：

1. 发现目标 iSCSI 节点

1. 对 iSCSI LUN 进行分区

1. 在客户端上挂载 iSCSI LUN

以下过程将详述这些步骤。

**发现目标 iSCSI 节点**

1. 在 Linux 客户端上，使用以下命令来发现使用 `iscsi_1` 的 IP 地址 {{iSCSI\_1\_IP}} 的目标 iSCSI 节点。

   ```
   ~$ sudo iscsiadm --mode discovery --op update --type sendtargets --portal {{iscsi_1_IP}}
   ```

   ```
   172.31.0.143:3260,1029 iqn.1992-08.com.netapp:sn.9cfa2c41207a11ecac390182c38bc256:vs.3
   172.31.21.81:3260,1028 iqn.1992-08.com.netapp:sn.9cfa2c41207a11ecac390182c38bc256:vs.3
   ```

   在此示例中，`iqn.1992-08.com.netapp:sn.9cfa2c41207a11ecac390182c38bc256:vs.3` 对应于首选可用区中的 iSCSI LUN 的`target_initiator`。

1. （可选）要为 iSCSI LUN 带来高于 Amazon EC2 单一客户端最大 5Gbps（约 625MBps）的吞吐量，请按照《适用于 Linux 实例的 Amazon Elastic Compute Cloud 用户指南》中的 [Amazon EC2 实例网络带宽](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html)描述的过程，为提高吞吐量建立更多的会话。

   以下命令会在每个可用区中为每个 ONTAP 节点的每个启动程序建立 8 个会话，使客户端能够向 iSCSI LUN 提供高达 40Gbps（5000MBps）的聚合吞吐量。

   ```
   ~$ sudo iscsiadm --mode node -T {{target_initiator}} --op update -n node.session.nr_sessions -v 8
   ```

1. 登录到目标启动程序。您的 iSCSI LUN 显示为可用磁盘。

   ```
   ~$ sudo iscsiadm --mode node -T {{target_initiator}} --login
   ```

   ```
   Logging in to [iface: default, target: iqn.1992-08.com.netapp:sn.9cfa2c41207a11ecac390182c38bc256:vs.3, portal: 172.31.14.66,3260] (multiple)
   Login to [iface: default, target: iqn.1992-08.com.netapp:sn.9cfa2c41207a11ecac390182c38bc256:vs.3, portal: 172.31.14.66,3260] successful.
   ```

   上述输出已被截断；您应该会在每个文件服务器上看到针对每个会话的一个 `Logging in` 和一个 `Login successful` 响应。如果每个节点有 4 个会话，则会有 8 个 `Logging in` 和 8 个 `Login successful` 响应。

1. 使用以下命令，通过显示具有多个策略的单个 LUN 来验证 `dm-multipath` 是否已识别并合并 iSCSI。列为 `active` 和列为 `enabled` 的设备数量应相等。

   ```
   ~$ sudo multipath -ll
   ```

   在输出中，磁盘名称的格式为`dm-xyz`，其中 `xyz` 为整数。如果不存在其他多路径磁盘，则此值为 `dm-0`。

   ```
   3600a09806c5742314e5d52766e79614f {{dm-xyz}} NETAPP  ,LUN C-Mode      
   size=10G features='4 queue_if_no_path pg_init_retries 50 retain_attached_hw_handle' hwhandler='0' wp=rw
   |-+- policy='service-time 0' prio=50 status=active
   | |- 0:0:0:1 sda     8:0   active ready running
   | |- 1:0:0:1 sdc     8:32  active ready running
   | |- 3:0:0:1 sdg     8:96  active ready running
   | `- 4:0:0:1 sdh     8:112 active ready running
   `-+- policy='service-time 0' prio=10 status=enabled
     |- 2:0:0:1 sdb     8:16  active ready running
     |- 7:0:0:1 sdf     8:80  active ready running
     |- 6:0:0:1 sde     8:64  active ready running
     `- 5:0:0:1 sdd     8:48  active ready running
   ```

   您的块设备现已连接到 Linux 客户端。其位于 `/dev/{{dm-xyz}}` 路径之下。您不应将此路径用于管理目的；而应使用 `/dev/mapper/{{wwid}}` 路径下的符号链接，其中 `{{wwid}}` 是适用于 LUN 的唯一标识符，在不同设备之间保持一致。在下一步中，您需要为 `{{wwid}}` 提供一个易记名称，以使其能够其区别于其他多路径磁盘。

**为块设备分配一个易记名称**

1. 要为您的设备提供易记名称，请在 `/etc/multipath.conf` 文件中创建别名。为此，请使用首选文本编辑器将以下条目添加到文件中，替换以下占位符：
   + 使用您在 [在 FSx for ONTAP 文件系统上配置 iSCSI](#configure-iscsi-on-fsx-ontap) 过程中保存的值来替换 `serial_hex`。
   + 如示例所示，将前缀 `3600a0980` 添加到值 `serial_hex` 中。这是用于适用于 NetApp ONTAP 的 Amazon FSx 的 NetApp ONTAP 发行版的唯一序言。
   + 将 `device_name` 替换为您要在设备上使用的易记名称。

   ```
   multipaths {
       multipath {
           wwid 3600a0980{{serial_hex}}
           alias {{device_name}}
       }
   }
   ```

   或者，您可以复制以下脚本并保存为 bash 文件，例如 `multipath_alias.sh`。您可以使用 sudo 权限运行脚本，使用相应的序列号和期望的易记名称来替换 `{{serial_hex}}`（不带 3600a0980 前缀）和 `{{device_name}}`。此脚本会在 `/etc/multipath.conf` 文件中搜索未取消注释的 `multipaths` 部分。如果存在，它会在该部分中附加一个 `multipath` 条目；否则，它将创建一个新的 `multipaths` 部分，其中包含适用于您的块设备的 `multipath` 条目的。

   ```
   #!/bin/bash
   SN=serial_hex
   ALIAS=device_name
   CONF=/etc/multipath.conf
   grep -q '^multipaths {' $CONF
   UNCOMMENTED=$?
   if [ $UNCOMMENTED -eq 0 ]
   then
           sed -i '/^multipaths {/a\\tmultipath {\n\t\twwid 3600a0980'"${SN}"'\n\t\talias '"${ALIAS}"'\n\t}\n' $CONF
   else
           printf "multipaths {\n\tmultipath {\n\t\twwid 3600a0980$SN\n\t\talias $ALIAS\n\t}\n}" >> $CONF
   fi
   ```

1. 重新启动 `multipathd` 服务以使对 `/etc/multipathd.conf` 的更改生效。

   ```
   ~$ systemctl restart multipathd.service
   ```

**对 LUN 进行分区**

下一步是使用 `fdisk` 格式化您的 LUN 并对其进行分区。

1. 使用以下命令验证您的 `device_name` 路径是否存在。

   ```
   ~$ ls /dev/mapper/{{device_name}}
   ```

   ```
   /dev/{{device_name}}
   ```

1. 使用 `fdisk` 对磁盘进行分区。您需要输入交互式提示。按显示的顺序输入选项。您可以使用小于最后一个扇区的值来创建多个分区（在本例中为 `20971519`）。
**注意**  
`Last sector` 值将根据 iSCSI LUN 的大小（在本例中为 10 GB）而改变。

   ```
   ~$ sudo fdisk /dev/mapper/{{device_name}}
   ```

   开始进行 `fsdisk` 交互式提示。

   ```
   Welcome to fdisk (util-linux 2.30.2). 
   
   Changes will remain in memory only, until you decide to write them. 
   Be careful before using the write command. 
   
   Device does not contain a recognized partition table. 
   Created a new DOS disklabel with disk identifier 0x66595cb0. 
   
   Command (m for help): n 
   Partition type 
      p primary (0 primary, 0 extended, 4 free) 
      e extended (container for logical partitions) 
   Select (default p): p 
   Partition number (1-4, default 1): 1 
   First sector (2048-20971519, default 2048): 2048 
   Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): 20971519
                                       
   Created a new partition 1 of type 'Linux' and of size 512 B.
   Command (m for help): w
   The partition table has been altered.
   Calling ioctl() to re-read partition table. 
   Syncing disks.
   ```

   输入 `w` 后，您的新分区 `/dev/mapper/{{partition_name}}` 即变为可用。{{partition\_name}} 的格式为{{<device\_name>}}{{<partition\_number>}}。`1` 已用作在上一步 `fdisk` 命令中使用的分区编号。

1. 使用 `/dev/mapper/{{partition_name}}` 作为创建文件系统的路径。

   ```
   ~$ sudo mkfs.ext4 /dev/mapper/{{partition_name}}
   ```

   系统将使用以下输出做出响应：

   ```
   mke2fs 1.42.9 (28-Dec-2013)
   Discarding device blocks: done 
   Filesystem label=
   OS type: Linux
   Block size=4096 (log=2)
   Fragment size=4096 (log=2)
   Stride=0 blocks, Stripe width=16 blocks
   655360 inodes, 2621184 blocks
   131059 blocks (5.00%) reserved for the super user
   First data block=0
   Maximum filesystem blocks=2151677952
   80 block groups
   32768 blocks per group, 32768 fragments per group
   8192 inodes per group
   Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
   Allocating group tables: done 
   Writing inode tables: done 
   Creating journal (32768 blocks): done
   Writing superblocks and filesystem accounting information: done
   ```

**在 Linux 客户端上挂载 LUN**

1. 创建一个目录 {{directory\_path}} 作为文件系统的挂载点。

   ```
   ~$ sudo mkdir /{{directory_path}}/{{mount_point}}
   ```

1. 使用以下命令挂载文件系统。

   ```
   ~$ sudo mount -t ext4 /dev/mapper/{{partition_name}} /{{directory_path}}/{{mount_point}}
   ```

1. （可选）如果要向特定用户授予挂载目录的所有权，请将 {{`username`}} 替换为拥有者的用户名。

   ```
   ~$ sudo chown {{username}}:{{username}} /{{directory_path}}/{{mount_point}}
   ```

1. （可选）验证您是否可以从文件系统读取数据和将数据写入文件系统。

   ```
   ~$ echo "Hello world!" > /{{directory_path}}/{{mount_point}}/HelloWorld.txt
   ~$ cat {{directory_path}}/HelloWorld.txt
   Hello world!
   ```

   您已在 Linux 客户端上成功创建并挂载了 iSCSI LUN。