我很想知道你对我博客的看法!方便请到 关于 页面留下评论!

作为一个业余摄影和摄像,我逐渐意识到这是一个数据量只会增加不会减少的场景,虽然目前我的磁盘阵列还有充足的空间,但是总有一天会被视频填满。这种危机感在我购买了新的运动相机之后更加严峻,因为运动相机是一种无感录像的设备,不知不觉间,就会录下几十 GB 的录像。

如果你是个先天或后天的杠精,你可能会问为什么不把不重要的视频删掉,次要的原因是你永远不知道哪些记录是重要的,照片或者视频这种东西往往在当时并没觉得有什么不同,但过了几年再看到才会唤醒你当初的记忆。但主要的原因是,如果要筛选出不重要的视频,势必要把全部的视频都看一眼才能决定,但是把我积攒的视频全部看一遍所花的时间按照时薪换算的话,足够我买更多的存储设备来一股脑把视频丢进去了。因此寻求一些冷存储方案用作归档势在必行。

不考虑成本的话,最简单的方案是买机械硬盘,插在电脑上,把冷数据复制进去,然后拔下来妥善存放,但是拜 AI 所赐,当初我 1500 一块购入的 HC550,现在已经涨价到 5000 一块了,我其实并不是心疼钱,但是我觉得这个价格还买的话有点冒傻气。既然这样,那只能考虑购入磁带机。长话短说,磁带机是个给企业用户设计的玩意,因此价格也不便宜,想买新的磁带机需要准备五位数以上的预算,但是像很多企业级设备一样,企业是会定期更新换代硬件的,而且通常这些设备只是到期了而不是出现了故障或者寿命用尽,那么购买企业淘汰下来的前几代磁带机价格只要几千块。目前能买到最新的企业淘汰下来的磁带机是第六代 LTO-6,价格则根据型号的不同有所区别。

首先磁带机分为内置和外置两种,内置的就如同光驱,没有自己的散热和电源,需要使用你的电脑机箱光驱位和电源的大 4D 接口,但是一般来说现在的个人电脑都没有光驱位,外置磁带机本质上是给内置磁带机搭配了风扇电源之后套了个壳,因此可以使用电饭锅线供电,外置磁带机一般会比内置磁带机贵一点。然后数据接口又分为 SAS 接口和 FC 光纤接口,对于家用电脑,一般需要一张 HBA 直通卡,把 PCI-E 转换成 SAS 或者 FC 光纤,SAS 磁带机一般会比 FC 磁带机贵一点。但是考虑到我的目的是数据,而非 DIY,所以我直接选择了方便的外置 SAS 磁带机,我购买的是 HP 生产的 LTO-6,花费 3200 元。还有一种叫做磁带库的设备,就是包含磁带机、磁带架和机械臂,可以直接远程控制机械臂替你选择和加载磁带,我相信大部分个人用户是不需要这个的。顺带一提,磁带机不管是风扇还是磁带的噪音都很明显,因此不建议放在卧室。

一张 LTO-6 的磁带容量是 2.5 TB,全新的磁带大概 300 一张,当然也有非常便宜的二手货,不过磁带是个怕灰尘怕发霉的东西,所以我建议不要图便宜选状况特别差的磁带。

到手以后的第一个坑是华硕的主板给的,我的 NAS 的 PCI-E x16 插槽刚好空着,我就把 HBA 卡插在上面,然后连接磁带机,开机。我的 NAS 是放在外屋的,需要接显示器 debug 的时候我得把它搬到屋子里面。我一开始心想加个外设而已不需要接显示器测试吧,结果按了电源之后,等了很久,通过 SSH 一直连不上去,显然是没能进系统。于是我不得不把这两个铁疙瘩搬进屋里接上显示器,但是接上显示器就正常的启动进系统了。我以为是偶发现象,就又把它们搬回去,结果累的气喘吁吁不说,搬回去又启动不了了。我又重新把它们搬进来,思考会不会是当核显输出没有接显示器的时候,BIOS 就傻乎乎的认为 PCI-E x16 插槽的设备一定是独立显卡?但是我在 BIOS 里设置了 IGFX 优先,我又尝试打开 IGFX Multi-Monitor,但是不接显示器还是启动不了。我又想那我把 PCI-E 拆分打开好了,反正 HBA 卡是 x8 的,打开拆分的时候,BIOS 就会预设这个插槽不是显卡。然后果然这样就能启动了!但是玄学的事情还在继续发生,我又尝试把 PCI-E 拆分关掉,我以为这样肯定起不来,结果居然还是正常启动了!甚至我把视频输出设备设置为 PCI-E 优先,还是没有任何问题。所以华硕你告诉我为什么我刚插上 HBA 卡的时候启动不了?我只能认为是 BIOS 现在认识了这张卡所以不会把它当作显卡了。

以下的内容都是软件相关的,如果你是 Windows 用户,看到这里可以不用继续看了,因为我只打算在 Linux 下使用磁带机,后续内容对 Windows 用户应该是没什么帮助。由于现在 AI 实在是太方便了,我只打算简单记录一下遇到的坑和解决方案,不打算记录具体的命令和使用方法,毕竟这些我也是直接问 AI 的……

然后就是关于如何在磁带上存储数据的问题了,我们要时刻牢记磁带是一个顺序存储的设备,和硬盘不一样,磁带是需要一点一点卷到位置才可以操作,因此是没有什么随机读写性能的,相比之下即使是机械硬盘,寻道的速度也要快很多。(翻译成人话就是假如你看电影,从头看到尾对于磁带来说问题不大,但你想拖进度条,那就相当麻烦了。)由于同样的原因,磁带只适合追加内容,如果你说你想删除某个内容,然后用新的内容填写空白部分,那问题就相当复杂了。好在我的需求是把以前的视频归档到磁带上,没有删除的情况。

传统的方案就是使用 tar,或者不如说 tar 本身就是给磁带设计的。使用 tar 的情况下磁带是个没有文件系统的裸设备,而 tar 也是个没有索引的格式,文件在 tar 包里面是以 文件头/文件内容/文件头/文件内容 的方式顺序存放的,也就是说你要查找一个文件,必须从头开始读一遍 tar 包才能找到。稍微好一点的是磁带支持一个叫做 file mark 的功能,对于 tar 来说,可以理解为每次向磁带里追加都是写一个新的 tar 包,tar 包之间以 file mark 分割,然后可以直接让磁带机卷到某个 tar 包的位置,再开始读取,虽然定位 tar 包里的某个文件还是要读一遍这个 tar 包,但比起从头开始读要好太多了。但这个方案的问题就是你需要自己维护一个索引,记录某些文件存在某个磁带的某个 tar 包里,但是我为了从相机导出时候方便,我的不同相机的照片视频都是以相机的组织方式存的,也就是说结构各不相同,我实在是觉得设计一个合适的归档和索引方案的难度太大,所以没有采用这种方式。

另一种方案是使用 LTFS,这是一种给 LTO-4 之后的磁带设计的文件系统,因此支持索引和目录,使用的时候可以像其他文件系统一样挂载之后操作(其实就是 FUSE),因为有索引和目录,就不需要自己维护索引了。不过虽然是文件系统,还是受到磁带顺序存储的限制,连续读取文件时,最好按照写入的顺序进行,以避免花费大量时间在卷磁带上。

LTFS 是一个开放标准,因此有开源实现以及各家磁带制造商的实现,本着对各家制造商的不信任,我选择了 GitHub 上的开源实现。顺便提一嘴,看来磁带机在 Arch Linux 的用户群里也是个相当小众的设备,ltfs 只有 AUR 包,如果你不用 ltfs 而是使用 tar,那么用来直接操纵裸的磁带的 mt-st 也在 AUR 里面(比如卷带或者擦除)。使用 LTFS 的时候我遇到的坑也不少,首先就是这个开源实现需要支持各个厂家的磁带机,虽然 LTO 是个公开标准,但经常会有 IBM 机器的某个指令在 HP 的机器上表现有差别的情况,然后偶尔 LTFS 就会出现搞了这家坏了那家的情况。我尝试打包了 git 版和稳定版,结果每一个对于 HP 的机器都有一些适配问题,好在社区发现问题并修复的速度相当迅速,只是这样就得在打包时手动 backport 补丁了。好吧,这对于我来说也算是老本行了。然后我插入一张新磁带进去,打算格式化成 LTFS,解决了前面说的 HP 机器的适配问题之后,又遇到一个问题是 mkltfs 因为在磁带上找不到 End-of-Data 标记而拒绝格式化,拜托,我这是新磁带,没有 Data,当然也就没有 End-of-Data 了。我查了一下 issue,说可以通过加 --force,或者 erase 一遍磁带来解决。我的经验是一般不要给命令加 --force,于是我直接执行了 erase,没想到这个擦除真的是给整个磁带物理过一遍……而且还不能取消。我问 GPT 通常要多久,它告诉我一般要几个小时,只能等它结束了。不过好在结束之后就可以顺利格式化和顺利挂载了。

我以 eject 参数挂载了 LTFS,这个的作用是当你卸载 LTFS 的时候,LTFS 会在完成回写之后自动弹出磁带。这还是很有必要的,因为 LTFS 作为一个文件系统需要更新元数据,而磁带这种介质,更新起来显然需要花费更多时间。因此即使你已经卸载了 LTFS,有可能磁带还没写完,此时弹出磁带的话,就会破坏掉文件系统。因此最好的办法是等 LTFS 给你弹出磁带。

GPT 建议我在弹出磁带之后,重新装载磁带,并检查一遍磁带和硬盘上的数据的校验和是否一致。它建议我使用 b3sum,因为这个算法比 sha256sum 更快,并且有多线程优化。一开始我还没有意识到这是个坑,直到我开始检查复制进磁带的文件的校验和时觉得不对劲:我出门买菜之前就在计算的视频文件,买菜回来还没有计算完同一个文件!LTO-6 的顺序读写速度能达到 150 M/s,不应该花这么长时间的!在我做饭的时候,我突然意识到磁带机的声音不对:既然是顺序读取,那应该一直响,但是我听到的声音却是一阵一阵的。我突然想到刚才 GPT 说的多线程优化这几个字,不会是因为 b3sum 对文件进行了多线程分块读取,结果磁带机被迫开始左右横跳吧!查了一下果然,b3sum 默认使用 mmap 加载文件,然后多线程分块处理。哎呀!不是说你把文件映射成内存它就真的会变成内存了!于是我添加了 --no-mmap 参数让它单线程处理文件,结果速度反而正常了!真是哭笑不得!

既然看了喵写的文章,不打算投喂一下再走吗?哼!
微信支付 微信支付
支付宝 支付宝