一、那条撑爆磁盘的备份,只在需要它的那天没跑
去年冬天,我给自己的一台归档机换硬盘。那台机器上存着七年来的站点快照、原始图片、以及一批从旧服务器搬过来的数据库逻辑备份。换盘之前我做了一件自认为很稳妥的事:把整机数据复制到一块 4TB 的移动硬盘上,然后用那块盘在另一台机器上完整跑了一遍 rsync 回写,确认文件数量和总字节数都对得上。整个过程花了十一个小时,中间断了两次,一次是 USB 接口过热掉线,一次是我自己手滑把盘拔了。
三个月后,我需要从这批归档里取回 2019 年的几张原始图片。打开移动硬盘,目录结构完好,文件名齐全,但点开任意一张,都是零字节。用 du 一看,整个目录占用了不到 200MB。再去查当时的日志,才发现那次「完整跑了一遍」的说法是我记错了——我只验证了文件列表,没有验证文件内容,而断电的那次中断让 rsync 在索引上写完了目录项、数据却没落盘,后来的续传因为用了 --size-only 加时间戳判断,把这些零字节文件当成了「已经同步过了」。
这件事之后我才认真动手搭第二份离线备份。这篇文章写的就是那套东西:为什么我需要它、为什么最后选了磁带、LTO 这套硬件到底怎么选、磁带机上的两个「设备文件」分别干什么、tar 和 mt 怎么配合着用、以及磁带这个介质最坑人的几个地方。全部是我自己用下来的细节,不是厂商文档的转述。
二、先分清三份数据:热、温、冷
在选介质之前必须先把数据分类,否则很容易陷入「所有东西都要最好的备份」这种不切实际的目标。我最后分了三层,判断依据不是数据重不重要,而是「恢复它的紧迫程度」。
热数据是线上正在跑的那一份:数据库、站点程序、配置文件。这层的目标是分钟级的恢复时间,所以要的是本地副本加快照,不可能是磁带。磁带找到一条数据要顺序读几十秒到几分钟,用来做热备等于自找麻烦。
温数据是过去几个月里还在被查询的历史数据:日志归档、已下线项目的代码、老用户上传的附件。这层容忍小时级恢复,用对象存储或者另一台机器上的磁盘副本就够,主力方案可以是 rclone 同步到异地。
冷数据是「一年可能翻一次,但一旦丢了就永久损失」的那种:原始素材、旧站点完整快照、合同与票据的扫描件。这层的特点是访问频率极低、单次恢复可以等一整天、但对完整性的要求极高。磁带正好落在这个位置——介质便宜、离线存放、不怕勒索软件、不占机位和电费。
我把自己的数据量摆出来做参考:热数据不到 40GB,温数据约 600GB,需要进磁带的那部分加起来 3.2TB,且每年增长大约 400GB。这个量级决定了后面的硬件选择。
三、为什么是磁带,而不是又一块硬盘
「再买一块硬盘不就完了」是最常见的反驳,我也认真算过这笔账。一块 8TB 企业盘当时大约一千二百块,一盒 LTO-7 磁带标称 6TB 原生容量、压缩后 15TB,价格大约三百块。单看每 TB 单价,磁带大概是硬盘的四分之一。但这笔账不是最关键的,真正的差别在三条上,按我自己的排序:
第一是不在同一套信任边界里。硬盘备份只要接在机器上、或者放在同一个房间的抽屉里,勒索软件一旦拿到主机权限,挂载着的盘就是下一个目标。我见过最惨的一次是攻击者先删本地备份、再加密线上数据。磁带平时不在机器上、不在网络里,写完就拔下来放进柜子,这是它的核心价值,比容量和价格都重要。
第二是「写一次就不变」。硬盘上的备份会被人误操作:清理磁盘时删掉、同步脚本把源目录的删除动作传到备份目录、甚至手滑 rm -rf 打错路径。磁带一旦写完,除非你显式覆盖,否则它就是那个样子。这条对长期归档的价值远大于性能。
第三是寿命。LTO 磁带在合适温湿度下厂商标称保存 30 年,机械硬盘的实践经验是通电五年、不通电三年左右就开始出现坏道。归档场景里「三年后还能读出来」比「读写快十倍」重要得多。
当然代价也很明确,必须提前接受:写 3TB 数据大约要三到五个小时;任何一次恢复都是顺序扫描,找到一个文件可能要半小时以上;磁带机是机械结构,会卡带、会脏磁头、需要定期清洗;还有最要命的一条——磁带机本身有代际限制,LTO 的读兼容性通常只往回两代,也就是说你的磁带机型号决定了你未来十年能不能读出今天写的带子。
四、硬件怎么选:先定代际,再定接口
LTO 的代际与容量对照,是我在采购前必须查清的第一张表。下面这些数字是原生容量(未压缩),压缩比按 2.5 倍估算,但实际取决于数据类型——数据库导出和文本能压到三四倍,已经压过的图片和视频基本压不动,这时候标签上的最大容量就是骗人的。
LTO-6 2.5TB 读取约 160MB/s 单卷写满约 4.5 小时
LTO-7 6.0TB 读取约 300MB/s 单卷写满约 5.5 小时
LTO-8 12.0TB 读取约 360MB/s 单卷写满约 9 小时
LTO-9 18.0TB 读取约 400MB/s 单卷写满约 12 小时兼容性上,LTO-7 与 LTO-8 之间有个著名的例外:LTO-7 磁带在 LTO-8 驱动器上可以被初始化成「M8」格式、容量提到 9TB,但这会让这盒带子再也无法在 LTO-7 驱动器上读取。这是 Type M 磁带,用之前想清楚,别为了多 3TB 把兼容性搭进去。
接口上只有两种现实选择:SAS 和 Thunderbolt。SAS 卡(常见的是 LSI 9207-8e 这类 HBA,注意要用 HBA 不是 RAID 卡,磁带机必须直通)配外置机箱,整套便宜、稳定,缺点是必须插在台式机或服务器的 PCIe 槽里。Thunderbolt 版本贵一倍以上,但对只有笔记本电脑的人来说是唯一选择。我最终选的是 SAS 外置半高机箱,因为归档机本来就是一台退役的塔式服务器。
还有一件容易被忽略的:磁带要按「三代原则」备足份数。一份在线(磁带在机箱里)、一份离线(磁带在柜子里)、一份异地(磁带在另一个城市)。3.2TB 的数据按 LTO-7 算,一轮备份是 1 盒(压缩后勉强),三代原则意味着每轮至少要三盒,加上每月全量保留的副本,我第一批买了 12 盒。磁带的成本优势要在这个规模上才体现出来。
五、磁带机上的两个设备文件,是最容易搞错的地方
Linux 下接上磁带机,lsscsi -g 会给出两个设备节点,长这样:
[2:0:0:0] tape IBM ULT3580-TD7 /dev/st0 /dev/sg2左边那个 /dev/st0 是 rewind 设备:每次打开它、关闭它,磁带都会自动倒回到开头。这意味着你用 tar 写一盒带子、想接着往里追加第二份数据时,如果还用 /dev/st0,第二次写入会把第一份直接覆盖。很多人第一次用磁带就栽在这里,以为自己在追加,实际上在覆盖。
右边那个 /dev/nst0 是 no-rewind 设备:关闭时不倒带,磁带停在当前位置,下一份数据接着往后写。只要涉及多份数据写在同一盒带上,一律用 /dev/nst0,只有「只写一份、写完就走」的场景才用 /dev/st0。
第三个节点 /dev/sg2 是 SCSI generic 设备,走的是另一条路径,linux 下 mt 命令和某些工具需要它来发磁带控制命令。有些系统权限上只放开了 st 设备没放开 sg 设备,表现是 tar 能写但 mt status 报权限错误,这时候查一下 /dev/sg* 的属组。
用 mt -f /dev/nst0 status 可以看到当前磁带的位置信息,输出里有两行最关键:
File number=1 Block number=12
General status bits on (05000000):
DR_OPEN IM_REP_ENFile number 是「文件标记的序号」,等同于「这盒带子上已经写了几份独立数据」;Block number 是当前文件内的块位置。理解了这两个数字,后面的所有操作都不难了。
六、用 tar 和 mt 做出一盒可分卷、可校验的归档带
我的归档路径是:先把要备份的目录整理成一份清单,然后用 tar 直接写到 /dev/nst0,全程不分卷(单份数据小于单卷容量),最后用 mt 写入文件标记并把磁带倒回开头。
# 1) 写之前先把带子倒到开头并确认状态
mt -f /dev/nst0 rewind
mt -f /dev/nst0 status
# 2) 写入第一份归档(注意是 nst0,不是 st0)
tar -cf /dev/nst0 -C /archive/2026-11 --totals \
cold-copy sites-snapshot assets-original
# 3) 写文件标记(当前文件结束),再倒回开头
mt -f /dev/nst0 weof
mt -f /dev/nst0 rewind
# 4) 校验:直接比 tar 的目录清单
mt -f /dev/nst0 fsf 1 # 跳过第一个文件标记,回到第 0 个文件开头
tar -tf /dev/nst0 > /tmp/tape_index.txt
wc -l /tmp/tape_index.txt这里有几个必须记住的点。mt weof 是在当前位置写一个文件标记,相当于「这一份写完了」,是磁带能做「分卷管理」的基础;如果写完不写标记,某些驱动器在卸载时会自己补,但不要赌这个行为。mt fsf 1 是「向前跳过 1 个文件标记」,正好把读磁头定位到第一个文件的开头;如果带子上有三份数据,要读第三份就是 mt fsf 2。
另一个关键参数是 --totals,它会打印一共写了多少字节。这个数字必须和源目录的 du -sb 对得上,对不上就是写的过程中出错了。我后来把这个值写进每盒带子的标签纸,恢复的时候第一件事就是先比这个数字。
如果单份数据超过单卷容量,就必须用多卷模式:
tar -cMf /dev/nst0 -L 5000G --totals /archive/2026-11/cold-copy-M 表示多卷,-L 是每卷的容量上限(单位可以带 G)。写到上限时 tar 会提示你换带,此时 mt -f /dev/nst0 offline 卸载当前卷,换上新的一盒,mt -f /dev/nst0 rewind 后回车继续,tar 会接着写。恢复时同样加 -M,tar 会提示插入下一卷。多卷模式对运维专注度要求很高,我一般只在对单份数据必须整体归档时才用,其余情况宁可拆成多份。
压缩方面,磁带机硬件压缩默认是开的,tar -z 再压一层通常没有意义,反而让 tar 内部增加一次编解码开销。真正想省带子的时候用 tar --xz 或 zstd,前提是数据本身压得动——已经压过的媒体文件上去只会更慢。可以用一个小实验判断:拿 1GB 典型数据试压,如果压缩后不到 0.8GB,说明这类数据值得压。
七、磁带最难缠的四个地方:块大小、卡带、清洗、温湿度
块大小(block size)是第一个坑。磁带写入时是按块为单位写的,如果同一个驱动器写的时候用 512KB 块、读的时候用 64KB 块,会有两种情况:写入数据可以被任意块大小读出来(多数现代驱动器能自适应),或者直接报 I/O error。稳妥的做法是给整条链路固定一个块大小:写入前用 mt -f /dev/nst0 setblk 0 让它用可变块,读之前同样设置;或者反过来,两边都用 mt -f /dev/nst0 setblk 524288 固定 512KB。我的经验是归档场景一律用可变块(setblk 0),兼容性最好。
卡带(tape jam)比想象中更常见。表现是 tar 写到一半报 Cannot write to /dev/nst0: Input/output error,之后 mt status 也卡住不动。这时候第一件事是不要反复重试,反复重试只会把磁带拉得更紧。正确处置是:mt -f /dev/nst0 offline 尝试卸载,如果没反应就断电再上电让驱动器自检卷带,然后 mt -f /dev/nst0 rewind 看能不能倒回去。如果磁带已经物理损坏,这盒带子上所有数据都无法读取——这正是「三代原则」存在的理由,不要指望一盒带子扛住所有风险。
磁头清洗是被低估的日常动作。驱动器有清洗需求时会点亮 Clean 指示灯,或者 mt status 输出的 General status 里出现 CLEAN。此时插入清洗带(Cleaning Cartridge,专门的清洗带,不是普通数据带)跑一次即可,一次清洗只算一次使用次数,同一盒清洗带用完就换。不要因为「看起来还能用」就反复清洗,过度清洗反而磨损磁头。我的节奏大概是每写满 20 到 30 盒带子清一次,具体以驱动器指示灯为准。
温湿度对磁带的影响是长期的。厂商建议的保存环境是 16~25 摄氏度、相对湿度 20%~50%,并且要求温湿度变化平缓。把磁带放在没有空调的杂物间,两年后拿出来报 Medium error 的概率明显更高。我的做法是把磁带上柜子,柜子放在有空调的主卧,并且在柜子里放一包干燥剂,每季度换一次。
八、把「能恢复」这件事变成定期动作
磁带备份最容易犯的错,是把它当成了「写完就完事」的一次性工程。事实上磁带比硬盘更需要定期验证,因为它的失败是静默的:文件写进去了、目录也在、但某一段磁介质坏了,只有读的时候才发现。
我现在固化的节奏是三件事。每写完一盒,立刻做一次目录校验,也就是上面那段 mt fsf 加 tar -tf,再随机抽一个文件真读出来,用 sha256sum 和源文件比对一次。这一步每个季度只花十几分钟,但能立刻发现写坏的带子。
每季度随机抽一盒老带子做完整恢复演练,把其中一个目录恢复到一个空目录,比对文件数量、字节总量,再抽三个文件做哈希比对。目标是让「磁带机坏了」「带子读不出来」「半年后忘了怎么恢复」这三种失败,在你真的需要它之前就暴露出来。
每年做一次带子轮换决策,检查每盒带子上次写入时间、写入次数以及驱动器报告的 Medium Error 计数。LTO 磁带可以重复写入几百次,但归档场景下我的原则是只写一次、只追加、从不覆盖——一盒带子写满就归档,不会为了省三百块去擦掉旧数据。这样做的代价是带子消耗快一些,换来的是「任何一盒带子的历史都不被改写」。
最后还有一条是给未来的自己留线索:每盒带子外面贴标签,写清写入日期、包含哪几个目录、总字节数、校验方式;柜子里放一张总表,记录每盒带子在哪一格。我上一次出问题,很大程度上是因为三个月后完全记不清哪盒带子是什么内容,最后只能一盒一盒插进去看 mt status 猜。这件事的技术含量为零,但它决定了你下次恢复时是十分钟还是十个小时。
九、小结
磁带备份的价值不在于快,而在于它离线、不可改、寿命长,正好补上硬盘和对象存储都补不了的那一环。真正决定它有没有用的,是三件很小的事:认清 /dev/st0 与 /dev/nst0 的区别、每盒写完立刻校验、每季度真的从带子上恢复一次。硬件选型反而没那么难——先算清自己需要进磁带的数据量,按 LTO 代际和读兼容窗口往前推十年,再考虑接口。如果这三件事都做不到,那么买再贵的磁带机,结果也只是把「没有备份」换成了「有一堆没人验证过的磁带」。