本教程适用于以下操作系统版本

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 20.04 (Focal Fossa)
  • Ubuntu 18.04 (Bionic Beaver)

本页内容

  • 环境要求
  • 更新系统
  • 安装 iSCSI Target
  • 配置 iSCSI Target
  • 安装并配置 iSCSI Initiator
  • 在共享设备上创建文件系统
  • 常见问题 iSCSI 是什么?iSCSI Target 和 Initiator 分别是什么?我可以在广域网(WAN)上使用 iSCSI 吗?iSCSI 与 NFS 或 SMB 有何不同?iSCSI 安全吗?iSCSI 有哪些性能考量?使用 iSCSI 需要特殊硬件吗?如何在 Ubuntu 上排查 iSCSI 连接问题?
  • 结论
  • iSCSI 是什么?
  • iSCSI Target 和 Initiator 分别是什么?
  • 我可以在广域网(WAN)上使用 iSCSI 吗?
  • iSCSI 与 NFS 或 SMB 有何不同?
  • iSCSI 安全吗?
  • iSCSI 有哪些性能考量?
  • 使用 iSCSI 需要特殊硬件吗?
  • 如何在 Ubuntu 上排查 iSCSI 连接问题?

Internet 小型计算机系统接口(iSCSI)是一种用于存储区域网络(SAN)的协议,用于通过网络共享块级存储资源,例如硬盘驱动器(HDD)或固态硬盘(SSD)的分区、逻辑卷管理(LVM)分区或块文件。iSCSI 采用客户端-服务器架构,通过 TCP/IP 网络在两个主要组件之间传输 SCSI 命令:发起端(initiator)和目标端(target)。iSCSI Target 是托管在 iSCSI 服务器上的一个服务,负责授予对共享存储的访问权限。相反,iSCSI Initiator 充当客户端,连接到 target 以使用共享的存储资源。

本教程是在运行 Ubuntu 22.04 的服务器上同时搭建 iSCSI target 和 initiator 的完整指南。它将介绍如何在你的网络内设置安全的存储共享。

环境要求

  • 一台运行 Ubuntu 22.04 的 iSCSI target 机器,配备 1 GB 外接硬盘(HDD)。
  • 一台全新安装 Ubuntu 22.04 的 iSCSI initiator 机器。
  • 在 iSCSI target 上配置静态 IP 地址 192.168.1.10,在 iSCSI initiator 上配置 192.168.1.20。
  • 两台服务器均已配置 root 密码。

更新系统

在开始之前,建议先用最新的软件包更新你的系统。你可以使用以下命令进行更新:

apt update -y
apt upgrade -y

所有软件包更新完成后,重启你的系统以使更改生效。

安装 iSCSI Target

iSCSI Target 软件包默认已包含在 Ubuntu 22.04 的默认软件仓库中。你可以在 iSCSI Target 服务器上运行以下命令进行安装:

apt install tgt -y

安装 iSCSI Target 后,使用以下命令验证服务器状态:

systemctl status tgt

你应该会看到类似下面的输出:

? tgt.service - (i)SCSI target daemon
     Loaded: loaded (/lib/systemd/system/tgt.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-01-03 11:13:04 UTC; 23s ago
       Docs: man:tgtd(8)
   Main PID: 7770 (tgtd)
     Status: "Starting event loop..."
      Tasks: 1
     Memory: 1.1M
     CGroup: /system.slice/tgt.service
             ??7770 /usr/sbin/tgtd -f

Jan 03 11:13:04 ubuntu2204 systemd[1]: Starting (i)SCSI target daemon...
Jan 03 11:13:04 ubuntu2204 tgtd[7770]: tgtd: iser_ib_init(3431) Failed to initialize RDMA; load kernel modules?
Jan 03 11:13:04 ubuntu2204 tgtd[7770]: tgtd: work_timer_start(146) use timer_fd based scheduler
Jan 03 11:13:04 ubuntu2204 tgtd[7770]: tgtd: bs_init(387) use signalfd notification
Jan 03 11:13:04 ubuntu2204 systemd[1]: Started (i)SCSI target daemon.

至此,iSCSI Target 已安装在你的服务器上。现在可以进入下一步。

配置 iSCSI Target

首先,在你的 iSCSI 服务器上创建一个 LUN(逻辑单元号)设备。LUN 是物理 SCSI 设备的一部分,属于后端存储设备。所有映射到 iSCSI Target 的 LUN 都会虚拟地附加到客户端的操作系统上。因此,Initiator 可以在 iSCSI LUN 上建立并管理文件系统。

你可以通过创建一个新的配置文件来进行配置:

nano /etc/tgt/conf.d/iscsi.conf

添加以下行:

<target iqn.2024-01.example.com:lun1>
     backing-store /dev/sdb
     initiator-address 192.168.1.20
    incominguser iscsi-user password
     outgoinguser iscsi-target secretpass
</target>

完成后保存并关闭文件。

其中:

  • 第一行定义了 LUN 的名称。
  • 第二行定义了 iSCSI Target 服务器上存储设备的位置和名称。
  • 第三行定义了 iSCSI initiator 的 IP 地址。
  • 第四行定义了入站用户名/密码。
  • 第五行定义了 target 将提供给 initiator 的用户名/密码,用于实现双向 CHAP 认证。

接下来,重启 iSCSI 服务以使更改生效:

systemctl restart tgt

接下来,使用以下命令验证 iSCSI Target 服务器:

tgtadm --mode target --op show

你应该会看到类似下面的输出:

Target 1: iqn.2024-01.example.com:lun1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
    Account information:
        iscsi-user
        iscsi-target (outgoing)
    ACL information:
        192.168.1.10

至此,iSCSI target 服务器已完成安装和配置。现在可以进入下一步。

安装并配置 iSCSI Initiator

接下来,前往 iSCSI initiator 机器,使用以下命令安装 iSCSI initiator 软件包:

apt install open-iscsi -y

安装完成后,使用以下命令发现 iSCSI target 服务器,以查找共享的 target:

iscsiadm -m discovery -t st -p 192.168.1.10

你应该会看到类似下面的输出:

192.168.1.10:3260,1 iqn.2024-01.example.com:lun1

接下来,你需要在 initiatorname.iscsi 文件中定义 LUN 设备的名称:

nano /etc/iscsi/initiatorname.iscsi

如下所示,添加你的 iSCSI Target LUN 名称:

InitiatorName=iqn.2024-01.example.com:lun1

完成后保存并关闭文件。

接下来,你需要定义在 iSCSI target 上配置的 CHAP 信息,以便从 iSCSI initiator 访问 iSCSI target。节点配置文件位于 ‘/etc/iscsi/nodes/‘ 目录中,每个可用的 LUN 都会有一个对应的子目录。

你可以通过编辑以下文件来定义相关配置:

nano /etc/iscsi/nodes/iqn.2024-01.example.com\:lun1/192.168.1.10\,3260\,1/default

添加 / 修改以下行:

node.session.auth.authmethod = CHAP  
node.session.auth.username = iscsi-user
node.session.auth.password = password          
node.session.auth.username_in = iscsi-target
node.session.auth.password_in = secretpass         
node.startup = automatic

保存并关闭文件,然后使用以下命令重启 iSCSI initiator 服务:

systemctl restart open-iscsi iscsid

你也可以使用该命令验证服务状态:

systemctl status open-iscsi

你应该会看到类似下面的输出:

? open-iscsi.service - Login to default iSCSI targets
     Loaded: loaded (/lib/systemd/system/open-iscsi.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sat 2024-01-03 11:33:13 UTC; 10s ago
       Docs: man:iscsiadm(8)
             man:iscsid(8)
    Process: 2861 ExecStart=/sbin/iscsiadm -m node --loginall=automatic (code=exited, status=0/SUCCESS)
    Process: 2867 ExecStart=/lib/open-iscsi/activate-storage.sh (code=exited, status=0/SUCCESS)
   Main PID: 2867 (code=exited, status=0/SUCCESS)

Jan 03 11:33:14 initiator systemd[1]: Starting Login to default iSCSI targets...
Jan 03 11:33:14 initiator iscsiadm[2861]: Logging in to [iface: default, target: iqn.2024-01.example.com:lun1, portal: 104.245.33.142,3260] (m>
Jan 03 11:33:14 initiator iscsiadm[2861]: Login to [iface: default, target: iqn.2024-01.example.com:lun1, portal: 104.245.33.142,3260] success>
Jan 03 11:33:14 initiator systemd[1]: Finished Login to default iSCSI targets.

你也可以使用以下命令验证 iSCSI 连接:

iscsiadm -m session -o show

你应该会看到类似下面的输出:

tcp: [2] 192.168.1.10:3260,1 iqn.2024-01.example.com:lun1 (non-flash)

你也可以使用以下命令验证从 iSCSI target 共享的存储设备:

lsblk

你应该在下面的输出中看到共享设备 sdb:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   80G  0 disk 
??sda1   8:1    0   80G  0 part /
sdb      8:16   0 1000M  0 disk

在共享设备上创建文件系统

为了在 iSCSI initiator 上使用共享设备,你需要在共享设备(sdb)上创建文件系统并将其挂载,以使该设备可用。

首先,使用以下命令在共享设备(sdb)上创建文件系统:

fdisk /dev/sdb

如下所示回答所有问题以创建文件系统:

Welcome to fdisk (util-linux 2.34).
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 0x9743ddcf.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-2047999, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2047999, default 2047999): 

Created a new partition 1 of type 'Linux' and of size 999 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

接下来,使用以下命令格式化该分区:

mkfs.ext4 /dev/sdb1

你应该会看到类似下面的输出:

mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 255744 4k blocks and 64000 inodes
Filesystem UUID: e7f06605-a0f5-41e1-b1b2-e85bd7a2d6a3
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

接下来,使用以下命令将该分区挂载到 /mnt 目录:

mount /dev/sdb1 /mnt

现在你可以使用以下命令验证已挂载的分区:

df -h

你应该会看到类似下面的输出:

Filesystem      Size  Used Avail Use% Mounted on
udev            972M     0  981M   0% /dev
tmpfs           199M  528K  199M   1% /run
/dev/sda1        79G  1.8G   74G   3% /
tmpfs           994M     0  994M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           994M     0  994M   0% /sys/fs/cgroup
tmpfs           199M     0  199M   0% /run/user/0
/dev/sdb1       968M  2.5M  899M   1% /mnt

常见问题

以下是对一些关于 iSCSI initiator 和 target 的常见问题的解答。

iSCSI 是什么?

iSCSI(Internet 小型计算机系统接口)是一种网络协议,允许通过内联网传输数据,并支持远距离的存储管理。它实现了服务器上的 iSCSI initiator 与存储硬件上的 iSCSI target 之间的块级数据传输。

iSCSI Target 和 Initiator 分别是什么?

iSCSI Target 充当存储单元(例如硬盘),可通过网络访问。iSCSI Initiator 则是连接到 Target 并与其上的存储进行交互的客户端。

我可以在广域网(WAN)上使用 iSCSI 吗?

可以,iSCSI 可以在广域网(WAN)上使用,但它需要稳定且高速的网络连接以保证性能和可靠性。在 WAN 上使用 iSCSI 时,VPN 或专线等安全措施也同样重要。

iSCSI 与 NFS 或 SMB 有何不同?

与 NFS(网络文件系统)或 SMB(服务器消息块)这类文件级存储协议不同,iSCSI 工作在块级。这意味着它允许系统像使用本地硬盘一样与远程存储进行交互,从而在存储管理上提供更高的灵活性。

iSCSI 安全吗?

iSCSI 本身不包含高级安全特性。不过,你可以通过 IPsec(网络层安全)或配置 CHAP(挑战握手认证协议)进行身份认证等方式来保护你的 iSCSI 连接。

iSCSI 有哪些性能考量?

iSCSI 的性能受网络速度、延迟、存储设备的性能以及网络配置的影响。确保高速的网络连接和最小的延迟对获得最佳性能至关重要。

使用 iSCSI 需要特殊硬件吗?

iSCSI 不需要特殊硬件。它可以运行在标准的网络设备上。不过,也可以使用专用的 iSCSI HBA(主机总线适配器)来提升性能。

如何在 Ubuntu 上排查 iSCSI 连接问题?

排查过程可以包括检查网络连通性、核对 initiator 和 target 双方的配置文件、查看系统日志,以及确保 target 正确导出了存储设备。此外,使用 `iscsiadm` 等工具有助于诊断和管理 iSCSI 连接。

结论

以上指南向你介绍了如何在 Ubuntu 22.04 服务器上搭建 iSCSI target 和 initiator。你还学习了如何在 Target 服务器上共享设备,并从 initiator 端进行访问。