凌峰创科服务平台

Linux iSCSI服务器如何配置?

iSCSI (Internet Small Computer System Interface) 是一种基于 TCP/IP 的协议,允许你将存储设备(如硬盘、RAID 阵列)通过网络共享给其他客户端,使其看起来像是本地连接的 SCSI 设备,这对于构建 SAN(存储区域网络)或为虚拟机、集群提供共享存储非常有用。

Linux iSCSI服务器如何配置?-图1
(图片来源网络,侵删)

我们将使用 targetcli 工具,这是目前最主流、最易于使用的 iSCSI 服务器管理工具,它提供了一个类似 shell 的界面,让你可以轻松地配置和管理后端存储、iSCSI 目标和逻辑单元。


整体流程概览

  1. 准备工作:安装必要的软件包,并规划好要共享的存储。
  2. 配置后端存储:创建一个文件或块设备作为 iSCSI 客户端将要看到的“硬盘”。
  3. 配置 iSCSI 目标
    • 创建一个 Target(目标),这是客户端要连接的“入口点”。
    • 创建一个 LUN(逻辑单元号),这是目标提供的具体“硬盘”。
    • 将后端存储文件/设备绑定到 LUN 上。
    • 设置访问控制列表,允许特定的 iSCSI Initiator(客户端)访问。
  4. 启动和配置服务:确保 target 服务开机自启并正在运行。
  5. 客户端连接验证:从 iSCSI 客户端(另一台 Linux 机器或 Windows)连接并使用存储。

第一步:准备工作

环境要求

  • 一台运行 Linux 的服务器(我们以 CentOS/RHEL 7/8 或 Ubuntu 20.04/22.04 为例)。
  • 确保有足够的磁盘空间来创建后端存储文件,也可以使用一个未挂载的物理分区或 LVM 逻辑卷。

安装 targetcli

targetcli 是核心工具。

在 CentOS/RHEL 上:

# 安装
sudo yum install targetcli -y
# 如果是 CentOS/RHEL 8/9, 使用 dnf
sudo dnf install targetcli -y

在 Ubuntu/Debian 上:

Linux iSCSI服务器如何配置?-图2
(图片来源网络,侵删)
# 更新软件包列表
sudo apt update
# 安装
sudo apt install targetcli-fb -y
# 注意:`targetcli` 包可能较旧,推荐 `targetcli-fb` (fb 表示 firebird,是更新的分支)

检查和启动服务

安装完成后,target 服务会自动被安装,我们需要确保它启动并设置为开机自启。

# 启动服务
sudo systemctl start target
# 设置开机自启
sudo systemctl enable target
# 检查服务状态
sudo systemctl status target

第二步:配置后端存储

我们将创建一个 10GB 的文件作为 iSCSI 客户端看到的硬盘,你也可以直接使用 /dev/sdb 这样的物理磁盘。

# 在 /var/lib/iscsi 目录下创建一个 10GB 的文件
# 这个位置是推荐的,因为它通常在根分区之外,或者你有足够的空间
sudo dd if=/dev/zero of=/var/lib/iscsi/disk01.img bs=1M count=10240
  • if=/dev/zero:输入文件是零设备,用来创建一个空文件。
  • of=/var/lib/iscsi/disk01.img:输出文件名。
  • bs=1M:块大小为 1MB。
  • count=10240:创建 10240 个块,总计 10GB (10240 * 1MB = 10GB)。

我们有了一个后端存储文件 /var/lib/iscsi/disk01.img


第三步:使用 targetcli 配置 iSCSI 目标

运行 targetcli 命令进入其交互式 shell。

Linux iSCSI服务器如何配置?-图3
(图片来源网络,侵删)
sudo targetcli

你会看到一个类似这样的提示符:/>

创建后端存储 (Backing Store)

我们将刚刚创建的文件 disk01.img 转换成一个 block 类型的后端存储。

/> /backstores/block create disk01 /var/lib/iscsi/disk01.img
  • /backstores/block:进入 block 后端存储配置目录。
  • create disk01 ...:创建一个名为 disk01 的 block 存储。
  • /var/lib/iscsi/disk01.img:对应的文件路径。

验证一下:

/> /backstores/block/
/o/backstores/block/disk01>

Ctrl+C 可以退出当前目录层级,回到根 />

创建 iSCSI Target (目标)

一个 Target 是一个由 IQN (iSCSI Qualified Name) 标识的实体,IQN 有固定的格式:iqn.yyyy-mm.<reversed domain name>:<identifier>

/> /iscsi create iqn.2025-10.com.example:storage.target01
  • iqn.2025-10:年份和月份。
  • com.example:反转的域名(请替换成你自己的域名,如果没有,可以用 com.exampleorg.lan 等)。
  • storage.target01:一个自定义的、唯一的标识符。

验证:

/> /iscsi/
/o/iscsi/iqn.2025-10.com.example:storage.target01>

将后端存储绑定到 Target

我们将 disk01 这个 LUN 绑定到我们刚刚创建的 Target 上。

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/luns create /backstores/block/disk01
  • /iscsi/iqn.../tpg1/luns:进入目标的默认端口组 (TPG1) 的 LUN 配置目录,每个 Target 默认有一个 TPG1。
  • create ...:创建一个新的 LUN。

验证:

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/luns/
/o/iscsi/iqn.2025-10.com.example:storage.target01/tpg1/luns/lun0>

可以看到 LUN 已经被创建为 lun0

设置访问控制列表 (ACL)

这是至关重要的一步,用于控制哪些 iSCSI 客户端可以连接,你需要知道客户端的 Initiator 名称(IQN)。

假设你的 iSCSI 客户端的 IQN 是 iqn.2025-10.com.client:vmhost.initiator01

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/acls create iqn.2025-10.com.client:vmhost.initiator01
  • /tpg1/acls:进入访问控制列表目录。
  • create iqn.2025-10.com.client:vmhost.initiator01:为这个客户端 IQN 创建一个 ACL 条目。

创建 ACL 后,targetcli 会自动为你生成 CHAP 认证的用户名和密码,你可以查看它们:

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/acls/iqn.2025-10.com.client:vmhost.initiator01

你会看到类似 authchannel 等信息,其中包含了用户名和密码。请务必记下这些信息,后续客户端连接时需要用到!

设置端口 (可选但推荐)

默认情况下,iSCSI 服务在 3260 端口监听,我们可以确认一下。

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/portals/

这里会显示 0.0.0:3260,表示监听服务器的所有 IP 地址的 3260 端口。

如果你想指定只监听某个特定的 IP 地址(168.1.100),可以这样做:

/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/portals delete 0.0.0.0 3260
/> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/portals create 192.168.1.100 3260

第四步:保存配置并退出

targetcli shell 中,你的所有更改都只在内存中,必须保存才能永久生效。

/> saveconfig

你会看到 Configuration saved to /etc/target/saveconfig.json 的提示。

然后退出 targetcli

/> exit

你的 iSCSI 服务器已经配置完成并运行了!


第五步:客户端连接验证 (以 Linux 为例)

我们用另一台 Linux 机器(客户端)来连接这个 iSCSI 服务器。

在客户端安装 iscsiadm

# CentOS/RHEL
sudo yum install iscsi-initiator-utils -y
# 或
sudo dnf install iscsi-initiator-utils -y
# Ubuntu/Debian
sudo apt install open-iscsi -y

发现 iSCSI Target

客户端需要主动去“发现”服务器上有哪些 Target。

sudo iscsiadm -m discovery -t st -p <SERVER_IP>
  • -m discovery:模式为“发现”。
  • -t st:发现类型为“发送目标”。
  • -p <SERVER_IP>:替换为你的 iSCSI 服务器的 IP 地址。

你会看到类似这样的输出,显示我们之前创建的 Target: iqn.2025-10.com.example:storage.target01

登录到 Target

sudo iscsiadm -m node -T iqn.2025-10.com.example:storage.target01 -p <SERVER_IP> --login
  • -m node:模式为“节点管理”。
  • -T <TARGET_IQN>:指定要连接的 Target IQN。
  • -p <SERVER_IP>:服务器 IP。
  • --login:执行登录操作。

如果设置了 CHAP 认证,系统会提示你输入用户名和密码,这些就是在服务器端 targetcli 中自动生成的凭据。注意: iscsiadm 在某些版本中可能不会直接提示输入密码,而是需要预先配置,如果登录失败,请检查 /etc/iscsi/iscsid.conf 文件,确保 node.session.auth.authmethod = CHAP 等配置正确,或者使用 --op=update 命令来设置凭据。

登录成功后,你会看到 [iscsiadm] Login to [iface: default, target: iqn.2025-10.com.example:storage.target01, portal: <SERVER_IP>:3260] successful

验证新磁盘

在客户端上,使用 lsblkfdisk -l 命令,你应该能看到一个新的磁盘。

lsblk

输出中应该会有一个类似 sdbsdc 的设备,大小是 10GB。

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk
sdb      8:16   0   10G  0 disk  <-- 这就是我们的 iSCSI 磁盘
...

你可以像使用普通硬盘一样对这个新磁盘进行分区、格式化、挂载等操作了。


管理命令速查

  • 查看配置:
    sudo targetcli
    /> ls
  • 添加新 Target/LUN: 重复第三步的流程。
  • 禁用/启用 Target:
    sudo targetcli
    /> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/disable
    /> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/enable
  • 删除 Target/LUN:
    sudo targetcli
    /> /iscsi/iqn.2025-10.com.example:storage.target01/tpg1/luns delete lun0
    /> /iscsi delete iqn.2025-10.com.example:storage.target01
  • 从客户端登出:
    sudo iscsiadm -m node -T <TARGET_IQN> -p <SERVER_IP> --logout

安全注意事项

  1. 网络安全:iSCSI 数据未经加密,在不受信任的网络中传输是不安全的,建议在安全的内网环境中使用,或者使用 IPsec 来对 iSCSI 流量进行加密。

  2. 访问控制:始终使用 ACL 来限制只有授权的客户端才能访问你的存储。

  3. 强密码:如果使用 CHAP,确保生成的密码足够复杂,如果可能,手动设置强密码。

  4. 防火墙:确保服务器的防火墙允许来自客户端 IP 的 3260 端口入站流量。

    # CentOS/RHEL (firewalld)
    sudo firewall-cmd --permanent --add-port=3260/tcp
    sudo firewall-cmd --reload
    # Ubuntu (ufw)
    sudo ufw allow from <CLIENT_IP>/32 to any port 3260
分享:
扫描分享到社交APP
上一篇
下一篇