FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. 2024-0708 存储与文件系统

FreeBSD iSCSI 入门

上一页FreeBSD 中的 NVMe-oF下一页使用 ZFS 原生加密保护数据

最后更新于24天前

  • 原文链接:

  • 作者:Jason Tubnor

我们经常听说网络附属存储(NAS)能够为网络上的设备提供额外的存储空间。然而,这种存储的协议可能并不适用于所有的使用场景。

欢迎来到存储区域网络(SAN)的世界。一般来说,这些存储系统较多地出现在企业环境中,而不是家庭和小型企业,但这并不意味着它们不能在这种情况下使用。实际上,如果你进行了大量虚拟化,且需要将中央存储接入到多个计算设备,或者需要为用于工程和图形设计的 Windows 工作站提供块存储,这些工作站的存储需求超过了桌面 PC 的物理存储空间,那么你可能会发现 SAN 极为有用。

一般来说,在企业领域我们听到的 SAN 供应商是戴尔 EMC、IBM、日立和 NetApp 等。然而,我们在 FreeBSD 环境中可以得到一款内置于基本系统的高性能 iSCSI SAN 解决方案,实在是让我们倍感幸运。通过与强大的 ZFS 卷管理器和文件系统相结合,我们能得到灵活、可靠且快速的存储解决方案,并将其提供给网络客户端。iSCSI 子系统实现于 FreeBSD 10.0-RELEASE,并在 10.1-RELEASE 中有了诸多性能改进。

iSCSI(Internet Small Computer Systems Interface,互联网小型计算机系统接口)是一种基于 IP 的协议,用于通过 TCP/IP 以太网网络传输 SCSI 命令。它能将块设备存储呈现给分布在网络上的计算机。它足够灵活,还可以通过互联网进行路由(如需要),但安全性的问题和需要考虑的预防措施超出了本文的讨论范围。

在理想情况下,iSCSI 应该存在于一个独立的二层物理网络中,在这个网络中,计算主机通过专用存储接口与存储目标进行通信。这个网络段上不应有其他普通的网络流量,以避免存储与其他计算节点之间的带宽争用。在较简单的环境中,使用带 VLAN 的分段交换机是一种可选的替代方案,但需要明白,普通网络流量将和存储流量争用接口带宽。

iSCSI 的高层术语相当简单。它有发起方(客户端)和目标方(主机)。发起方是连接的主动端,而目标方是被动端——它永远不会主动连接到发起方。

在接下来的操作中,我们将准备一个简单的 iSCSI 配置,在 FreeBSD 主机上使用它作为目标方,并为 FreeBSD 发起方和 MS Windows 发起方提供 ZFS zvol 块设备。

我们的网络主机如下:

2001:db8:1::a/64 – FreeBSD ZFS 存储主机(目标方) 
2001:db8:1::1/64 – FreeBSD 客户端(发起方)
2001:db8:1::2/64 – Windows Server 2022(发起方)

首先,我们将在存储主机上配置 ZFS 卷作为 iSCSI 目标方,提供给每个发起方。这也可以是简单的 ZFS 数据集和 UFS 分区上的文件,但 ZFS 卷提供了更多对存储方面的控制,尤其是在数据需求变化和与快照和复制要求相关的持续管理方面。

zfs create -o volmode=dev -V 50G tank/fblock0
zfs create -o volmode=dev -V 50G tank/wblock0

在创建卷时,可以根据工作负载的需求调整属性 volblocksize。自 14.1-RELEASE 以降,volblocksize 默认为 16K,这对大多数工作负载来说是一个合理的平衡。

接下来,创建一个仅允许 root 读/写的文件 /etc/ctl.conf。此文件包含密钥,因此必须确保其他用户和组没有读/写该文件的权限。下面是我们将添加的内容,用于提供发起方的存储位置:

auth-group ag0 {
    chap-mutual “inituser1” “secretpassw0rd” “targetuser1” “topspassw0rd”
initiator-portal [2001:db8:1::1]
}

auth-group ag1 {
    chap-mutual “inituser2” “hiddenpassw0rd” “targetuser2” “freepassw0rd”
    initiator-portal [2001:db8:1::2]
}

portal-group pg0        {
    discovery-auth-group no-authentication
    listen [2001:db8:1::a]
}

target iqn.2012-06.org.example.iscsi:target1 {
    alias “Target for FreeBSD”
    auth-group ag0
    portal-group pg0
    lun 0 {
        path /dev/zvol/tank/fblock0
        #blocksize 4096
        option naa 0x4ee0ebaf06a1acee
        option pblocksize 4096
        option ublocksize 4096
    }
}

target iqn.2012-06.org.example.iscsi:target2 {
    alias “Target for Windows”
    auth-group ag1
    portal-group pg0
    lun 1 {
        path /dev/zvol/tank/wblock0
        blocksize 4096
        option naa 0x4ee0ebaf06a1acbb
    }
}

我们来分解一下这个文件,理解每个组件的作用及原因:

auth-group ag0 {
    chap-mutual “inituser1” “secretpassw0rd” “targetuser1” “topspassw0rd”
initiator-portal [2001:db8:1::1]
}

这是一个授权组,可以跨多个目标使用。这个例子将 auth-group 绑定到一个具有地址 2001:db8:1::1 的唯一发起方,并要求进行相互身份验证。你可以简单地使用 CHAP 身份验证作为“单向”认证;但建议若支持,请使用相互身份验证,以确保发起方和目标方双方都能正确地进行相互认证。

这种身份验证可能足够用于发起方和目标方位于同一物理网络的情况,但不应将其作为唯一的安全控制手段。此类身份验证应被视为确保仅分配正确存储给发起方的方法。配置松散的 iSCSI 目标可能会使错误的存储可用,可能会造成数据、分区表或其他元数据被覆盖,因此,限制访问特定目标数据集至关重要。

portal-group pg0        {
    discovery-auth-group no-authentication
    listen [2001:db8:1::a]
}

门户组设置了提供给发起方的目标环境。在这里,我们定义了一个门户组,允许发起方通过 2001:db8:1::a 连接到目标方,这样它们可以在无需先进行身份验证的情况下发现包括此门户组的目标数据集。通常在受控环境中,可以这样做,以确保发起方能够找到它们需要连接的目标,但在更加敌对和不受信任的环境中,这种做法则是不理想的。

target iqn.2012-06.org.example.iscsi:target1 {
    alias “Target for FreeBSD”
    auth-group ag0
    portal-group pg0
    lun 0 {
        path /dev/zvol/tank/fblock0
        #blocksize 4096
        option naa 0x4ee0ebaf06a1acee
        option pblocksize 4096
        option ublocksize 4096
    }
}

配置的核心部分是目标。这将包括 auth-group 和 portal-group,用来构建之前介绍的各个组件,并呈现给发起方。它们可以在每个目标的基础上进行覆盖,并且可以在没有适用的 group 定义的情况下定义。

iSCSI 合格名称(IQN)的格式为 iqn.yyyy-mm.namingauthority:uniquename。每个目标方定义都需要这个。

别名定义只是一个用于目标的可读简介。

每个目标可以有多个 LUN,但这里每个目标只有一个 LUN。

LUN 上下文允许你定义 LUN 的特征。对于在发起方内使用 ZFS 存储的情况,这一点非常重要。尽管目标上的 ZFS 卷的块大小为 16KB,但当在发起方上创建 ZFS 池时,它会报错存储的块大小不是 4KB 及更小。它不会阻止你使用它,但当你在发起方执行 zpool status 时,它会不断提醒你此问题。调整块大小属性为 4096 并不足以解决此问题。需要专门为 ZFS 使用案例添加参数 pblocksize 和 ublocksize 。

参数 naa 应为 LUN 明确定义。这是一个 64 位或 128 位的唯一十六进制标识符。在将 VMware 计算备份到 iSCSI 目标时,确保没有混淆 LUN 分配,这是非常重要的。

现在,你已经具备了启动,展示目标存储的基本配置。接下来,启用 ctld,再启动守护进程:

service ctld enable
service ctld start

为了验证存储是否已出现,你可以检查守护进程是否在监听:

# netstat -na | grep 3260
tcp6    0      0 2001:db8:1::a.3260     *.*     

然后,使用 CAM 目标层控制实用程序验证 LUN 是否已出现:

# ctladm lunlist
(7:1:0/0):<FREEBSD CTLDISK 0001> Fixed Direct Access SPC-5 SCSI device
(7:1:1/1):<FREEBSD CTLDISK 0001> Fixed Direct Access SPC-5 SCSI device
# ctladm devlist
LUN Backend     Size (Blocks)   BS Serial Number     Device ID
  0 block           104857600   512 MYSERIAL0000   MYDEVID0000
  1 block            13107200  4096 MYSERIAL0001   MYDEVID0001

接下来,配置你的 FreeBSD 发起方。你需要创建配置文件 /etc/iscsi.conf。由于此文件包含机密信息,因此也需要显式设置为仅 root 可读写:

fblock0         {
targetaddress   = [2001:db8:1::a];
targetname      = iqn.2012-06.org.example.iscsi:target1;
initiatorname   = iqn.2012-06.org.example.freebsd:nobody;
authmethod      = CHAP;
chapiname       = “inituser1”;
chapsecret      = “secretpassw0rd”;
tgtChapName     = “targetuser1”;
tgtChapSecret   = “topspassw0rd”;
}

每个属性的含义如下:

  • fblock0:这是一个人类可读的标识符,与东西无涉,仅用于将以下配置项分组。

  • targetaddress:存储目标的网络地址。也可以是一个完全合格的域名。

  • targetname:这将与在 ctl.conf 文件中定义的相应目标名称对齐。

  • initiatorname:定义发起方的 IQN。

  • authmethod:在 FreeBSD 中可以简单地定义为 CHAP。如果 ChapName 和 ChapSecret 以 tgt 为前缀,则会假定使用相互身份验证。

  • chapiname/chapsecret:如前所述,在 ctl.conf 文件中定义的身份验证。

  • tgtChap[Name,Secret]:目标需要完成身份验证握手的身份验证。

要启用使用,只需执行以下命令:

service iscsid enable
service iscsictl enable
service iscsid start
service iscsictl start

这将使目标存储呈现连接到发起方:

# iscsictl -L
Target name                           Target portal    State
iqn.2012-06.org.example.iscsi:target1 [2001:db8:1::a]  Connected: da0

在此,我们来看一下 iscsictl 命令中最常用的简单参数:

  • L 列出已挂载到发起方的目标及其连接状态。

  • Aa 附加在 iscsi.conf 文件中定义的所有目标。

  • Ra 移除所有已连接到发起方的目标。

接下来,执行以下操作:

# gpart create -s GPT da0
da0 created
# gpart add -t freebsd-zfs -a 1M da0
da0p1 added
# zpool create tank da0p1
# zpool list tank
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  49.5G   360K  49.5G        -         -     0%     0%  1.00x    ONLINE        -
# zpool status tank
  pool: tank
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          da0p1     ONLINE       0     0     0

errors: No known data errors

配置、守护进程和控制工具的手册页写得非常详细,可以参考这些手册来更好地了解可用的其他功能。

这仅触及了 FreeBSD 中 iSCSI 实现的全部功能的一部分,但它为你提供了一个概念和实际示例,展示了如何利用它为你的计算基础设施提供灵活的远程存储选择。


Jason Tubnor 拥有逾 28 年的 IT 行业经验,广泛涉猎,目前是 Latrobe Community Health Service(澳大利亚维多利亚州)的 ICT 高级安全主管。在 1990 年代中期,Jason 接触到 Linux 和开源技术,2000 年开始使用 OpenBSD,他利用这些工具在各个行业的组织中解决了各种问题。Jason 还是 BSDNow 播客的联合主持人。

FreeBSD iSCSI Primer