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

我们将使用 targetcli 工具,这是目前最主流、最易于使用的 iSCSI 服务器管理工具,它提供了一个类似 shell 的界面,让你可以轻松地配置和管理后端存储、iSCSI 目标和逻辑单元。
整体流程概览
- 准备工作:安装必要的软件包,并规划好要共享的存储。
- 配置后端存储:创建一个文件或块设备作为 iSCSI 客户端将要看到的“硬盘”。
- 配置 iSCSI 目标:
- 创建一个 Target(目标),这是客户端要连接的“入口点”。
- 创建一个 LUN(逻辑单元号),这是目标提供的具体“硬盘”。
- 将后端存储文件/设备绑定到 LUN 上。
- 设置访问控制列表,允许特定的 iSCSI Initiator(客户端)访问。
- 启动和配置服务:确保
target服务开机自启并正在运行。 - 客户端连接验证:从 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 上:

# 更新软件包列表 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。

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.example或org.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
你会看到类似 auth 和 channel 等信息,其中包含了用户名和密码。请务必记下这些信息,后续客户端连接时需要用到!
设置端口 (可选但推荐)
默认情况下,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。
验证新磁盘
在客户端上,使用 lsblk 或 fdisk -l 命令,你应该能看到一个新的磁盘。
lsblk
输出中应该会有一个类似 sdb 或 sdc 的设备,大小是 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
安全注意事项
-
网络安全:iSCSI 数据未经加密,在不受信任的网络中传输是不安全的,建议在安全的内网环境中使用,或者使用 IPsec 来对 iSCSI 流量进行加密。
-
访问控制:始终使用 ACL 来限制只有授权的客户端才能访问你的存储。
-
强密码:如果使用 CHAP,确保生成的密码足够复杂,如果可能,手动设置强密码。
-
防火墙:确保服务器的防火墙允许来自客户端 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
