跳转到内容

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(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 可分区/格式化/挂载
安装目标端工具
$ sudo dnf install targetcli

targetcli 是一个交互式 shell,进入后用类似文件系统的路径来组织配置。下面用一块空闲磁盘 /dev/sdb 作为后端存储。

  1. 进入 targetcli 交互式 shell:

    启动 targetcli
    $ sudo targetcli
  2. 创建 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
  3. 创建 iSCSI target,会自动生成一个 IQN:

    targetcli:创建 target
    /> iscsi/ create iqn.2026-06.com.example:target1
  4. 把 backstore 作为 LUN 关联到 target:

    targetcli:创建 LUN
    /> iscsi/iqn.2026-06.com.example:target1/tpg1/luns create /backstores/block/disk1

    LUN 路径要对应你上一步创建的 backstore 类型:用 block 就是 /backstores/block/disk1,用 fileio 则改成 /backstores/fileio/disk1

  5. 配置 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
  6. 退出。退出时配置会自动保存到 /etc/target/saveconfig.json

    targetcli:退出并保存
    /> exit

target 服务负责在开机时加载 /etc/target/saveconfig.json 中的配置。务必启用它,否则重启后所有配置都会丢失:

启用并启动 target 服务
$ sudo systemctl enable --now target

iSCSI 使用 3260/tcp,需要在目标端放行:

放行 iSCSI 端口
$ sudo firewall-cmd --permanent --add-port=3260/tcp
$ sudo firewall-cmd --reload

Stratis 是 RHEL 及兼容发行版提供的本地存储管理方案。它在底层用 XFS 文件系统和 device-mapper 自动完成繁琐的配置,对外提供一个简单的命令行界面,让你像管理对象一样管理存储池、文件系统和快照,并天然支持精简置备(thin provisioning)。

它由两部分组成:后台服务 stratisd 负责实际的存储管理,命令行工具 stratis(来自 stratis-cli)负责接收你的指令。

安装 Stratis
$ sudo dnf install stratisd stratis-cli
启用并启动 stratisd
$ sudo systemctl enable --now stratisd
  1. 用一块空闲磁盘创建一个名为 pool1 的存储池:

    创建池
    $ sudo stratis pool create pool1 /dev/sdb
  2. 在池中创建一个名为 data1 的文件系统:

    创建文件系统
    $ sudo stratis filesystem create pool1 data1
  3. 文件系统的设备路径为 /dev/stratis/<池名>/<文件系统名>。查看列表确认:

    查看池与文件系统
    $ stratis pool list
    $ stratis filesystem list

可以先临时挂载测试一下:

临时挂载
$ sudo mkdir -p /mnt/data
$ sudo mount /dev/stratis/pool1/data1 /mnt/data

要做开机自动挂载,必须用 UUID 并加上 systemd 依赖。先查出文件系统的 UUID:

查看文件系统 UUID
$ sudo lsblk --output=UUID /dev/stratis/pool1/data1

然后在 /etc/fstab 中添加(注意 x-systemd.requires=stratisd.service):

/etc/fstab
UUID=<上一步得到的 UUID> /mnt/data xfs defaults,x-systemd.requires=stratisd.service 0 0

验证 fstab 配置无误(不重启就能发现错误):

验证 fstab
$ sudo umount /mnt/data
$ sudo systemctl daemon-reload
$ sudo mount -a
$ df -hT /mnt/data

Stratis 的快照基于精简置备,创建很快且初期几乎不占空间:

创建快照
$ 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/sdc

最常见的原因是退出 targetcli 时配置没保存,或者没启用 target 服务。确认两件事:在 targetcli 内执行过 saveconfig(或正常 exit),并且 sudo systemctl enable --now target 已启用。

手动保存当前配置
$ sudo targetcli saveconfig

按顺序排查:

  • 发起端 /etc/iscsi/initiatorname.iscsi 中的 IQN 是否和目标端 ACL 里配置的完全一致(拼写、大小写都要对)。
  • 目标端防火墙是否放行了 3260/tcp
  • 网络是否互通(ping 目标端 IP),发现命令 iscsiadm -m discovery 能否返回 target 列表。

几乎都是 fstab 条目漏了 x-systemd.requires=stratisd.service。补上这个选项,让挂载等待 stratisd 就绪后再进行。同时确认使用的是 UUID 而不是 /dev/stratis/... 路径。

能不能用 fdisk/LVM 直接动 Stratis 池里的盘

Section titled “能不能用 fdisk/LVM 直接动 Stratis 池里的盘”

不能。池内的物理设备由 Stratis 独占管理,所有操作必须通过 stratis 命令完成。直接用其它工具操作会破坏元数据。