本文的主题是通过 SAS、光纤通道 (FC)、eSATA 接口将外部设备连接到 Mac。 我们立即说,要解决访问此类设备的问题,有一个健康人的方法:构建一台便宜的PC,插入HBA SAS或FC控制卡(例如,简单的LSI适配器),将您的设备连接到此控制器,在 PC 上安装任何 Linux 并通过网络在 Mac 上工作。 但这是平庸且无趣的。 我们将走硬核路线并连接我们的设备 直 到麦克。
为此我们需要什么:
– 足够的钱购买新装备,或者在 eBay 拍卖中祝你好运(只需付出一点努力,你就可以以比标价便宜 10 倍的价格买到前几代所需的装备);
- 本文。
要使用磁带(现在几乎普遍以 LTO 格式表示),您必须拥有 LTO 磁带驱动器(流媒体)或磁带库。 对于初次购买来说,这是一个相当昂贵的设备(数十万卢布起),但在购买二手设备时物有所值。 由于 LTO 代大约每两年更换一次,并且兼容性仅限于两代,因此二级市场已经相当饱和,可用四年或更长时间的设备,即上一代及以后的一代。 如果您出于商业目的购买新设备,那么您自己就会明白为什么需要它。 如果您想为您的家庭和家人购买,您可以考虑此选项作为存档信息的一种方式(因为介质本身每 1 GB 非常便宜)。
从 LTO-5 代(以及部分 LTO-4)开始,使用磁带的设备通过 SAS 或 FC 接口在硬件中连接到计算机(通常每个设备有两个版本)
另一方面,Apple 在 Mac 中为我们提供了 USB-C 接口(使用 USB、Thunderbolt 3 或 DisplayPort 协议工作),有时还有以太网接口,以及专有的 Thunderbolt 3 - Thunderbolt 2 和 Thunderbolt - FireWire 800适配器。
僵局? 并不真地。 幸运的是,Thunderbolt 可以在 PCIe 模式下运行,并允许 PCIe 卡以与直接安装在计算机机箱内相同的方式连接。 因此,只要有适当的适配器和驱动程序,Mac 硬件配置的任何扩展都是可能的。
从概念上讲,解决该问题的最简单方法是使用带有 Thunderbolt 接口的 PCIe 适配器外接盒(PCIe 卡扩展系统),您可以在其中安装 SAS 或 FC 主机总线适配器 (HBA)。 例如,这样的盒子是由该公司生产的 还有一些其他的。这里需要注意:并非所有控制器都适用于我们,只有那些带有驱动程序的控制器才能使用。 macOS这类电路板非常少,最便宜、最受欢迎的电路板(例如,采用相同LSI芯片的电路板)都不在其中。幸运的是,Sonnet公司费心整理了相关资料。 通过 Thunderbolt 接口支持各种操作系统的 PCIe 卡。
另一种解决方案是购买现成的Thunderbolt-SAS或Thunderbolt-FC接口转换器,它实际上是一个盒子和控制器的现成组件。 该地区最著名的公司 ,但也有其他公司的产品。
请注意,并非所有 SAS 和 FC 控制器都经过认证符合 LTO 标准,因为这本身就需要花钱。 一些制造商直接写道,他们的控制器不适用于磁带机。
为了完成这幅图,我们注意到 mLogic 产生 ,这是一个装在外部机箱中的 IBM LTO-8 驱动器,其中立即集成了 SAS 到 Thunderbolt 3 转换器。然而,这比上述所有内容更加奇特,尤其是按照我们地区的标准。 我怀疑这款设备是否可以合法进口到俄罗斯(LTO 驱动器包含加密功能,IBM 和 HP 等制造商因此获得了每种型号的 FSB 进口许可)。
接下来,我们将以一套特定的设备为例,作者通过多次成功收购而成为该设备的所有者,但所有选项都应保留一般原则。
因此,我们有以下用于处理胶带的设备:
– 2018 年款 Apple Mac mini 电脑 macOS 10.15 Catalina,配备支持 Thunderbolt 3 的 USB-C 端口;
– Apple Thunderbolt 3 / Thunderbolt 2 适配器;
- Apple Thunderbolt 2 电缆;
– ATTO ThunderLink SH 1068 接口转换器 (2*Thunderbolt / 2*SAS-2);
– SAS 电缆 SFF-8088 – SFF-8088;
– 磁带机 LTO-5 IBM TS2350;
– LTO-5 磁带、清洁磁带。
现在,正如他们所说,有了所有这些东西,我们将尝试起飞。
我们从 ATTO 网站下载最新版本的 ThunderLink SH 1068 驱动程序(显然,为了方便起见,它与 SH 2068 驱动程序结合在一起,位于 2068 部分,该部分仅写入驱动程序的存档内)和ATTO 配置实用程序。

当然,驱动程序需要安装。 在执行此类操作之前,作者建议始终使用以下命令拍摄启动磁盘的 APFS 文件系统的快照
tmutil localsnapshot或启动磁盘的备份副本(如果具有 HFS+)。 你永远不会知道。 然后从快照回滚就很容易了。
接下来,没有经验但尽职尽责的头脑无疑会倾向于仔细阅读 ATTO 驱动程序安装说明并遵循它们。 结果——塔达姆! – 我们得到一个在加载阶段挂起的操作系统。 这里我们可能需要一个快照,我们可以通过从恢复分区调用Time machine来恢复,或者从同一个恢复分区我们可以手动从内核扩展目录中删除有病的kext(作者通常不建议这样做)。
为什么会发生这种情况?因为苹果公司照顾了我们。在最新版本中。 macOS 你不能直接将外部代码注入到启动过程中。苹果程序员已经阻止了这种破坏性行为。更准确地说,他们阻止了一半:当驱动程序等待代码被注入,但驱动程序本身没有被注入时,整个过程就会卡住。
在安装驱动程序之前,一个精明的头脑应该做什么? 首先,给出命令:
csrutil status如果我们收到以下响应:
系统完整性保护状态:已启用。
那么这意味着优秀的苹果程序员关心我们,所以除非我们禁用他们出色的保护,否则任何事情都不会为我们带来好处。 为此,请重新启动到恢复分区 (⌘R),调用终端并发出命令:
csrutil disable之后,我们重新启动进入工作系统,然后安装驱动程序,同时安装 ATTO 配置实用程序(原则上,配置实用程序仅用于诊断,正常操作期间不需要)。 一路上,当询问时,我们在系统设置中确认 ATTO 授权。 安装后,您可以再次重新启动到恢复分区并给出命令
csrutil enable苹果又照顾我们了。
现在,我们有一个驱动程序支持的接口来连接外部 SAS 设备(或 FC,如果使用 FC 转换器)。 但如何在逻辑层面上使用磁带呢?
缺乏经验但博学多才的人都知道,任何 Unix 兼容系统都在内核和基本系统实用程序级别支持磁带驱动器,其中主要包括 mt(磁带管理)和 tar(支持在磁带上处理存档的存档器)。 然而,一个成熟的头脑能对此说些什么呢? 任何 Unix 兼容系统, 除了 macOS。 苹果为了照顾我们,从代码中删除了对磁带设备的支持。
但是,真的无法通过将标准的开源 Unix 工具移植到其他平台来恢复这段代码吗? macOS好消息是,Tolis(我就不提供链接了)已经在其 Tolis Tape Tools 产品中实现了这个功能。坏消息是,该公司对其成果的使用收费 399 美元。这个价格可能会有所不同,但作者个人并不打算为一段大部分由他人编写、且自 20 世纪 70 年代以来就已开源的代码支付 400 美元,因此作者认为这个问题已经解决。(顺便一提,GitHub 上有一个已经停止维护、勉强维持的开源项目。) 关于同一主题)。
幸运的是,还有IBM这家公司,它的商业野心远超其他公司,因此不会在琐事上有所作为。具体来说,它开发了开源的LTFS磁带文件系统,该系统被广泛用于各种用途。 macOS.
这里需要注意的是,不同的磁带设备制造商会发布自己的 LTFS 版本来支持他们的设备。 由于作者使用IBM磁带机,因此安装了IBM的LTFS。 第三方驱动器可能需要自己的 LTFS 端口。 Github 和 Homebrew 上有 openLTFS 的通用实现。
对我们来说重要的是,LTFS 使用介质分区功能,因此可以与从 LTO-5 代开始的设备和盒式磁带一起使用。
因此,在我们的例子中,我们从 IBM 网站下载 IBM Spectrum Archive 单盘版产品。 macOS其中包括 LTFS 实现。我们使用其自带的安装程序顺利安装了该产品。安装过程中,它还会安装 FUSE 软件包,不过您需要在系统设置中确认一位名叫 Anatol Pomozov 的优秀程序员的权限,在这个例子中,整个 IBM 系统都依赖于他。向这位先生致敬!
建议立即在文件 /Library/Frameworks/LTFS.framework/Versions/Current/etc/ltfs.conf.local 中写入该行:
选项单驱动器sync_type=time@1
它指定默认安装磁带,并在 1 分钟不活动(默认为 5 分钟)后重置记录缓冲区。

最后,一切准备就绪,可以连接了。 我们连接链:Mac – T3/T2适配器 – Thunderbolt电缆 – ATTO转换器 – SAS电缆 – 磁带驱动器(Mac上的几个端口、转换器和驱动器的选择并不重要)。 打开转换器的电源。 打开磁带机的电源。 我们等待驱动器根据其指示完成初始化。
我们给出命令:
ltfs -o device_list万岁! 我们得到(以通常的 IBM 诊断方式):
307 LTFS14000I LTFS 正在启动,LTFS 版本 2.4.2.0 (10418),日志级别 2。
307 LTFS14058I LTFS 格式规范版本 2.4.0。
307 LTFS14104I 由“ltfs -o device_list”启动。
307 LTFS14105I 该二进制文件是为 Mac OS X 构建的。
307 LTFS14106I GCC 版本为 4.2.1 兼容 Apple Clang 4.1 ((tags/Apple/clang-421.11.66))。
307 LTFS17087I 内核版本:Darwin 内核版本 19.4.0:4 年 22 月 28 日星期三 40:2020:6153.101.6 PST 15; 根:xnu-86~64/RELEASE_XXNUMX_XNUMX。
307 LTFS17085I 插件:正在加载“iokit”磁带后端。
磁带设备列表:。
设备名称 = 0,供应商 ID = IBM,产品 ID = ULT3580-TD5,序列号 = **********,产品名称 = [ULT3580-TD5]。
插入磁带,等待其加载并格式化:
mkltfs -d 0 -nTest -r "size=10M/name=.DS_Store"这里的-d参数指定驱动器号(如果是唯一的则始终为零,但在此命令中不能省略),-n是磁带名称(可以省略),-r参数要求放置内容大小不超过 10 MB 的 .DS_Store 文件位于磁带的索引(即用于目录)部分而不是数据部分。
神秘的生命从磁带机开始。 我们等待几分钟并收到以下响应:
LTFS15000I 正在启动 mkltfs,LTFS 版本 2.4.2.0 (10418),日志级别 2。
LTFS15041I 由“mkltfs -d 0 -nTest -r size=10M/name=.DS_Store”启动。
LTFS15042I 该二进制文件是为 Mac OS X 构建的。
LTFS15043I GCC 版本为 4.2.1 兼容 Apple Clang 4.1 ((tags/Apple/clang-421.11.66))。
LTFS17087I 内核版本:Darwin 内核版本 19.4.0:4 年 22 月 28 日星期三 40:2020:6153.101.6 PST 15; 根:xnu-86~64/RELEASE_XXNUMX_XNUMX。
LTFS15003I 正在格式化设备“0”。
LTFS15004I LTFS 卷块大小:524288。
LTFS15005I 索引分区放置策略:大小=10M/名称=.DS_Store。LTFS11337I 更新索引脏标志 (1) - NO_BARCODE (0x0x1021081e0)。
LTFS17085I 插件:正在加载“iokit”磁带后端。
LTFS30810I 正在通过 iokit 驱动程序打开设备 (0)。
LTFS30814I 供应商 ID 是 IBM。
LTFS30815I 产品 ID 为“ULT3580-TD5”。
LTFS30816I 固件版本为 H976。
LTFS30817I 驱动器序列号为 **********。
LTFS17160I 最大设备块大小为 1048576。
LTFS11330I 正在装入磁带。
LTFS30854I 逻辑块保护已禁用。
LTFS11332I 装入成功。
LTFS17157I 正在将驱动器设置更改为随处写入模式。
LTFS15049I 正在检查介质(装入)。
LTFS30854I 逻辑块保护已禁用。
LTFS15010I 正在 SCSI 分区 1 上创建数据分区 b。
LTFS15011I 正在 SCSI 分区 0 上创建索引分区 a。
LTFS17165I 正在重置介质的容量比例。
LTFS11097I 正在对介质进行分区。
LTFS11100I 正在将标签写入分区 b。
LTFS11278I 正在将索引写入分区 b。
LTFS30808I READ_ATTR (0x8c) 返回 -20501。
LTFS30865I READ_ATTR 返回 CDB 中的无效字段 (-20501) 0。
LTFS30836I 无法读取属性 (-20501)。
LTFS11336I 该属性不存在。 忽略预期的错误。
LTFS17235I 正在将 NO_BARCODE 的索引写入 b(原因:格式,0 个文件)************。
LTFS17236I 已写入 NO_BARCODE 的索引 (b, **********)。
LTFS11337I 更新索引脏标志 (0) - NO_BARCODE (0x0x1021081e0)。
LTFS11100I 正在将标签写入分区 a。
LTFS11278I 正在将索引写入分区 a。
LTFS30808I READ_ATTR (0x8c) 返回 -20501。
LTFS30865I READ_ATTR 返回 CDB 中的无效字段 (-20501) 0。
LTFS30836I 无法读取属性 (-20501)。
LTFS11336I 该属性不存在。 忽略预期的错误。
LTFS17235I 正在将 NO_BARCODE 的索引写入(原因:格式,0 个文件)9068025555。
LTFS17236I 已写入 NO_BARCODE 的索引 (a, **********)。
LTFS15013I Volume UUID is: 3802a70d-bd9f-47a6-a999-eb74ffa67fc1.LTFS15019I 卷容量为 1425 GB。
LTFS30854I 逻辑块保护已禁用。
LTFS15024I 介质格式化成功。
安装格式化的磁带:
sudo mkdir /Volumes/LTFS
sudo chmod 777 /Volumes/LTFS/
sudo ltfs /Volumes/LTFS我们再花几分钟进行驱动器操作和诊断:
307 LTFS14000I LTFS 正在启动,LTFS 版本 2.4.2.0 (10418),日志级别 2。
307 LTFS14058I LTFS 格式规范版本 2.4.0。
307 LTFS14104I 由“ltfs /Volumes/LTFS/”启动。
307 LTFS14105I 该二进制文件是为 Mac OS X 构建的。
307 LTFS14106I GCC 版本为 4.2.1 兼容 Apple Clang 4.1 ((tags/Apple/clang-421.11.66))。
307 LTFS17087I 内核版本:Darwin 内核版本 19.4.0:4 年 22 月 28 日星期三 40:2020:6153.101.6 PST 15; 根:xnu-86~64/RELEASE_XXNUMX_XNUMX。
307 LTFS14063I 同步类型为“时间”,同步时间为 60 秒。
307 LTFS17085I 插件:正在加载“iokit”磁带后端。
307 LTFS17085I 插件:正在加载“统一”iosched 后端。
307 LTFS14095I 设置磁带设备随处写入模式以避免磁带弹出。
307 LTFS30810I 通过 iokit 驱动程序打开设备 (0)。
307 LTFS30814I 供应商 ID 是 IBM。
307 LTFS30815I 产品 ID 为“ULT3580-TD5”。
307 LTFS30816I 固件版本为 H976。
307 LTFS30817I 驱动器序列号为 **********。
307 LTFS17160I 最大设备块大小为 1048576。
307 LTFS11330I 正在加载磁带。
307 LTFS30854I 逻辑块保护已禁用。
307 LTFS11332I 加载成功。
307 LTFS17157I 将驱动器设置更改为随处写入模式。
307 LTFS11005I 正在装入卷。
307 LTFS30854I 逻辑块保护已禁用。
307 LTFS17227I 磁带属性:供应商 = IBM。
307 LTFS17227I 磁带属性:应用程序名称 = LTFS。
307 LTFS17227I 磁带属性:应用程序版本 = 2.4.2.0。
307 LTFS17227I 磁带属性:介质标签 =。
307 LTFS17228I 磁带属性:文本本地化 ID = 0x81。
307 LTFS17227I 磁带属性:条形码 =。
307 LTFS17227I 磁带属性:应用程序格式版本 = 2.4.0。
307 LTFS17228I 磁带属性:卷锁定状态 = 0x00。
307 LTFS17227I 磁带属性:媒体池名称 =。
307 LTFS14111I 初始设置已成功完成。
307 LTFS14112I 调用“mount”命令来检查最终设置的结果。
307 LTFS14113I 如果成功,则会列出指定的装入点。
这就是桌面上的功能区,名为 Test(ltfs)! 未命名的磁带将被命名为 OSXFUSE Volume 0 (ltfs)。
现在您可以使用它了。

一般来说,您需要记住,建议不要过度使用在查找器窗口中查看磁带目录的内容,因为这对于 LTFS 来说是一个非常昂贵的操作,但最好使用终端命令,或者简单地重置将备份目录批量复制到磁带上,如上窗口所示。
顺便说一句,有一个专门编写的 IBM 实用程序 ltfs_copy 及其克隆,旨在提高磁带和磁盘之间的复制效率,但到目前为止,作者还无法通过肤浅的搜索在公共领域找到它们。
您可以使用以下命令卸载磁带:
umount /Volumes/LTFS或者直接把它扔进垃圾桶。
实际上,自然界中存在一些图形化的外壳。 macOS 为了方便这些操作,但是经历了这样的变态行为之后,我们是否应该害怕在终端输入几行代码呢?
副作用是,我们有机会通过 SAS/4*eSATA 电缆连接外部 eSATA 驱动器。

来源: habr.com
