iSCSI 与 Stratis
适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x
这一页讲两种企业级 Linux 上常用的块存储方案。iSCSI 让你把一台服务器上的磁盘通过网络共享给另一台服务器,对方挂载后就像本地磁盘一样使用;Stratis 则是 RHEL 提供的本地存储管理工具,在 XFS 与 device-mapper 之上提供池化、精简置备和快照,用法比传统 LVM + 文件系统更简单。
- iSCSI 中 target(目标端)与 initiator(发起端)各自的角色
- 用
targetcli搭建一个 iSCSI 目标端,并持久化配置 - 在发起端发现、登录远程块设备,并设置开机自动登录
- 用 Stratis 创建存储池、文件系统与快照
- 如何让 Stratis 文件系统在开机时可靠地自动挂载
- 两台运行 EL 9.x 或 EL 10.x 的系统(iSCSI 部分需要目标端和发起端各一台)
- sudo 权限
- 目标端有一块可供使用的空闲磁盘或分区(如
/dev/sdb) - 两台主机之间网络互通
第一部分:iSCSI 网络块存储
Section titled “第一部分:iSCSI 网络块存储”iSCSI(Internet SCSI)通过普通的 TCP/IP 网络传输 SCSI 命令,把远程磁盘以块设备的形式提供给客户端。它涉及两个角色:
- target(目标端):服务端,提供块设备。每个 target 用一个 IQN(iSCSI Qualified Name)标识。
- initiator(发起端):客户端,连接 target 并把远程块设备挂载到本地,登录后会出现一个新的块设备(如
/dev/sdb)。
iSCSI 目标端 (192.168.1.10) iSCSI 发起端 (192.168.1.20)/dev/sdb ──> backstore ──> LUN ──网络──> /dev/sdb(登录后出现) IQN + ACL 可分区/格式化/挂载安装 targetcli
Section titled “安装 targetcli”$ sudo dnf install targetcli配置 iSCSI 目标端
Section titled “配置 iSCSI 目标端”targetcli 是一个交互式 shell,进入后用类似文件系统的路径来组织配置。下面用一块空闲磁盘 /dev/sdb 作为后端存储。
-
进入 targetcli 交互式 shell:
启动 targetcli $ sudo targetcli -
创建 backstore(后端存储)。可以用整块设备(block),也可以用一个普通文件(fileio):
targetcli:创建 block backstore /> backstores/block create disk1 /dev/sdb如果没有空闲磁盘,可以改用文件作为后端:
targetcli:创建 fileio backstore(可选) /> backstores/fileio create disk1 /var/lib/iscsi_disks/disk1.img 5G -
创建 iSCSI target,会自动生成一个 IQN:
targetcli:创建 target /> iscsi/ create iqn.2026-06.com.example:target1 -
把 backstore 作为 LUN 关联到 target:
targetcli:创建 LUN /> iscsi/iqn.2026-06.com.example:target1/tpg1/luns create /backstores/block/disk1LUN 路径要对应你上一步创建的 backstore 类型:用 block 就是
/backstores/block/disk1,用 fileio 则改成/backstores/fileio/disk1。 -
配置 ACL,只允许指定的发起端 IQN 连接。发起端的 IQN 来自其
/etc/iscsi/initiatorname.iscsi:targetcli:创建 ACL /> iscsi/iqn.2026-06.com.example:target1/tpg1/acls create iqn.2026-06.com.example:client1 -
退出。退出时配置会自动保存到
/etc/target/saveconfig.json:targetcli:退出并保存 /> exit
持久化与开机自启
Section titled “持久化与开机自启”target 服务负责在开机时加载 /etc/target/saveconfig.json 中的配置。务必启用它,否则重启后所有配置都会丢失:
$ sudo systemctl enable --now targetiSCSI 使用 3260/tcp,需要在目标端放行:
$ sudo firewall-cmd --permanent --add-port=3260/tcp$ sudo firewall-cmd --reload安装 initiator 工具
Section titled “安装 initiator 工具”$ sudo dnf install iscsi-initiator-utils设置发起端 IQN
Section titled “设置发起端 IQN”发起端的 IQN 写在 /etc/iscsi/initiatorname.iscsi 中,它必须和目标端 ACL 里配置的 IQN 完全一致:
$ sudo vi /etc/iscsi/initiatorname.iscsiInitiatorName=iqn.2026-06.com.example:client1修改后重启 iscsid 使其生效:
$ sudo systemctl restart iscsid发现并登录目标端
Section titled “发现并登录目标端”-
向目标端发起发现(discovery),列出它提供的所有 target:
发现目标端 $ sudo iscsiadm -m discovery -t st -p 192.168.1.10输出 192.168.1.10:3260,1 iqn.2026-06.com.example:target1 -
登录到目标端:
登录目标端 $ sudo iscsiadm -m node -T iqn.2026-06.com.example:target1 -p 192.168.1.10 --login -
登录成功后会出现一个新的块设备。用
lsblk确认:查看新块设备 $ lsblk输出(节选) NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsdb 8:16 0 5G 0 disk
使用远程块设备
Section titled “使用远程块设备”这个新块设备(如 /dev/sdb)和本地磁盘没有区别,可以正常分区、格式化、挂载:
$ sudo mkfs.xfs /dev/sdb$ sudo mkdir -p /mnt/iscsi$ sudo mount /dev/sdb /mnt/iscsi设置开机自动登录
Section titled “设置开机自动登录”默认情况下登录关系不会在重启后保留。把节点的 node.startup 设为 automatic,开机时就会自动登录:
$ sudo iscsiadm -m node -T iqn.2026-06.com.example:target1 -p 192.168.1.10 -o update -n node.startup -v automatic不再需要时,先卸载文件系统再注销:
$ sudo umount /mnt/iscsi$ sudo iscsiadm -m node -T iqn.2026-06.com.example:target1 -p 192.168.1.10 --logout第二部分:Stratis 本地存储管理
Section titled “第二部分:Stratis 本地存储管理”Stratis 是 RHEL 及兼容发行版提供的本地存储管理方案。它在底层用 XFS 文件系统和 device-mapper 自动完成繁琐的配置,对外提供一个简单的命令行界面,让你像管理对象一样管理存储池、文件系统和快照,并天然支持精简置备(thin provisioning)。
它由两部分组成:后台服务 stratisd 负责实际的存储管理,命令行工具 stratis(来自 stratis-cli)负责接收你的指令。
$ sudo dnf install stratisd stratis-cli$ sudo systemctl enable --now stratisd创建池与文件系统
Section titled “创建池与文件系统”-
用一块空闲磁盘创建一个名为
pool1的存储池:创建池 $ sudo stratis pool create pool1 /dev/sdb -
在池中创建一个名为
data1的文件系统:创建文件系统 $ sudo stratis filesystem create pool1 data1 -
文件系统的设备路径为
/dev/stratis/<池名>/<文件系统名>。查看列表确认:查看池与文件系统 $ stratis pool list$ stratis filesystem list
挂载与开机自动挂载
Section titled “挂载与开机自动挂载”可以先临时挂载测试一下:
$ sudo mkdir -p /mnt/data$ sudo mount /dev/stratis/pool1/data1 /mnt/data要做开机自动挂载,必须用 UUID 并加上 systemd 依赖。先查出文件系统的 UUID:
$ sudo lsblk --output=UUID /dev/stratis/pool1/data1然后在 /etc/fstab 中添加(注意 x-systemd.requires=stratisd.service):
UUID=<上一步得到的 UUID> /mnt/data xfs defaults,x-systemd.requires=stratisd.service 0 0验证 fstab 配置无误(不重启就能发现错误):
$ sudo umount /mnt/data$ sudo systemctl daemon-reload$ sudo mount -a$ df -hT /mnt/dataStratis 的快照基于精简置备,创建很快且初期几乎不占空间:
$ sudo stratis filesystem snapshot pool1 data1 data1-snap快照本身也是一个独立的文件系统,可以单独挂载来取回数据:
$ sudo mkdir -p /mnt/snap$ sudo mount /dev/stratis/pool1/data1-snap /mnt/snap池空间不够时,可以再加一块磁盘进去,无需迁移数据:
$ sudo stratis pool add-data pool1 /dev/sdctargetcli 配置重启后丢失
Section titled “targetcli 配置重启后丢失”最常见的原因是退出 targetcli 时配置没保存,或者没启用 target 服务。确认两件事:在 targetcli 内执行过 saveconfig(或正常 exit),并且 sudo systemctl enable --now target 已启用。
$ sudo targetcli saveconfigiSCSI 登录失败
Section titled “iSCSI 登录失败”按顺序排查:
- 发起端
/etc/iscsi/initiatorname.iscsi中的 IQN 是否和目标端 ACL 里配置的完全一致(拼写、大小写都要对)。 - 目标端防火墙是否放行了
3260/tcp。 - 网络是否互通(
ping目标端 IP),发现命令iscsiadm -m discovery能否返回 target 列表。
Stratis 文件系统开机挂载失败
Section titled “Stratis 文件系统开机挂载失败”几乎都是 fstab 条目漏了 x-systemd.requires=stratisd.service。补上这个选项,让挂载等待 stratisd 就绪后再进行。同时确认使用的是 UUID 而不是 /dev/stratis/... 路径。
能不能用 fdisk/LVM 直接动 Stratis 池里的盘
Section titled “能不能用 fdisk/LVM 直接动 Stratis 池里的盘”不能。池内的物理设备由 Stratis 独占管理,所有操作必须通过 stratis 命令完成。直接用其它工具操作会破坏元数据。
- LVM 管理
- 文件系统 (XFS/EXT4)
- 磁盘与分区
man targetcli/man iscsiadm/man stratis