RAID实战

Solaris UFS RAID-5:超级块魔数与 SVM 元数据

2026-10-07 · 约 6 分钟

Sun Solaris 的 RAID-5 恢复,核心不是先跑修复命令,而是保护成员盘并在只读镜像上还原阵列与 UFS 文件系统结构。只有先确认 Solaris 切片、磁盘标签、UFS 超级块和柱面组等信息,才有机会重组逻辑卷并提取文件。恢复时必须按 Solaris 与 UFS 的真实结构逐层判断,避免覆盖原始数据。

先看 Solaris 切片与磁盘标签,而不是把成员盘当普通硬盘

Solaris 中的硬盘分区称为切片(Slice)。安装系统时会在硬盘上创建磁盘标签,标签描述该硬盘的切片数量、每个切片的地址和大小;标签中还包含 ASCII 明码标签、卷内容表 VTOC、磁盘参数、切片表、签名和校验和。Sparc 架构下,一块硬盘可以有 8 个切片,编号 0—7;Solaris x86 架构下,一块硬盘最多可以有 16 个切片,编号 0—15。

在 Sparc Solaris 中,磁盘标签位于磁盘第一个扇区,即 LBA 0 扇区;随后的 1—15 号扇区存放系统引导程序,0—15 号这 16 个扇区属于第 1 个切片,是该切片上文件系统的引导块。从 16 号扇区开始是第一个文件系统的超级块。第 1 个切片结束后紧跟着第 2 个切片,依次排列到磁盘末尾。

RAID-5 恢复时,成员盘可能只是阵列的一部分,但每块盘仍可能保留自己的 Solaris 磁盘标签和切片表。应先对所有成员盘做只读镜像,再在镜像上解析这些结构;不要直接在原盘上执行重建、初始化或格式化,否则可能改变切片表和 UFS 元数据位置。

UFS 文件系统在阵列逻辑卷上的柱面组与超级块

Solaris 和 BSD 系列系统大多采用 UFS 作为文件系统。UFS 来源于 BSD 的 FFS,属于 FFS 的演化版本,也是多数 UNIX 类操作系统默认的基于磁盘的文件系统。UFS 文件系统初始化时,会把文件系统的重要数据结构复制到整个磁盘的多个位置,以便在发生硬件损坏时仍有机会读取。这个特性对 RAID-5 恢复很重要。

UFS 将整个磁盘的逻辑柱面平均分配为若干柱面组,每组称为一个柱面组。每个柱面组中都有文件系统关键数据结构的备份,文件在各个柱面组中相对独立存储,又有机地结合在一起。文件系统前部有柱面组概要,用于统计每个柱面组信息;每个柱面组中还有柱面组描述符,用来管理当前柱面组。

UFS 中文件分配和存储的基本单位是块,块又分成更小的段。创建 UFS 时可定义段大小,默认段大小一般为 1KB,下限通常为磁盘扇区大小 512B。恢复阵列时,重组出逻辑卷后,要在逻辑卷中定位 UFS 超级块和柱面组结构;如果主超级块不可用,柱面组中的备份结构就是重要参照。UFS1 与 UFS2 的结构相近,但细节不同,解析时必须先判断版本。

UFS1 与 UFS2:i-节点、目录项和字节序

UFS 文件系统有 UFS1 和 UFS2 两个变种,都起源于 BSD 的 FFS,结构相似。大多数 UNIX 系统默认使用 UFS1;UFS2 主要被 Free BSD 支持,Free BSD 5.0 以前默认 UFS1,5.x 和 6.0 中默认 UFS2,后来也移植到 Net BSD。与 UFS1 相比,UFS2 增加了对大文件、大硬盘的支持,添加了 64 位块指针和扩展文件存储,允许文件系统大于 1TB。

UFS2 的 i-节点表起始地址由超级块 0x10—0x13 偏移处描述,这 4B 描述 i-节点表相对于柱面组参考位置的偏移量。UFS2 的 i-节点数记录在超级块 0xB8—0xBB 偏移处。UFS2 每个 i-节点占用 236B。UFS2 已经取消柱面组的偏转增量和偏转周期,因此计算每个柱面组 i-节点表起始位置时不用再考虑偏转增量。

目录项用于存放文件及目录名字,存储在分配给目录的块中。UFS 目录项包含 i-节点号、目录项长度、文件名等信息。恢复时还要注意字节序:Sparc 架构的 Solaris 使用 Big-Endian,x86 架构的 Free BSD 等系统使用 Little-Endian。选错模板或按错字节序解析,会把超级块、i-节点和目录项读成无意义数据。

RAID-5 恢复顺序:保盘、重组、再解析 UFS

Sun Solaris RAID-5 上的 UFS 数据恢复,应按层次进行,而不是把单块盘直接接到系统上扫描。第一步是保护原始成员盘:停止写入,对每块成员盘做只读镜像,记录原阵列状态、离线盘、控制器信息和成员顺序等现场信息。后续所有分析都在镜像上进行。

整个过程中,任何对原盘的重建、初始化、格式化或写入都可能改变条带和 UFS 元数据,降低恢复条件。

什么情况救得了,什么情况救不了

RAID-5 恢复是否可行,取决于阵列冗余和 UFS 元数据的破坏程度。以下判断是原则性的,具体还要看镜像和结构解析结果。

具备恢复条件的情况:

难以恢复或无法恢复的情况:

如果属于后一种情况,应停止反复上电和写入,先评估镜像可行性,不要在不了解结构的情况下运行自动修复工具。

常见问题

Solaris RAID-5 恢复为什么要先镜像成员盘?

因为重建、初始化或格式化都会写入阵列和文件系统元数据,可能覆盖原始条带。先对每块成员盘做只读镜像,再在镜像上分析 Solaris 磁盘标签、切片表和 UFS 超级块,才能保留恢复条件。

UFS1 和 UFS2 在恢复时主要区别是什么?

UFS2 支持大文件、大硬盘,使用 64 位块指针,i-节点表偏移由超级块描述,单个 i-节点 236B,并取消柱面组偏转增量和周期;UFS1 常见于多数 UNIX 默认。恢复前要确认版本和字节序。

Sparc Solaris 与 x86 Solaris 的磁盘结构有区别吗?

有。Sparc 一块盘可有 8 个切片,编号 0—7;x86 最多 16 个切片,编号 0—15。Sparc 磁盘标签在 0 扇区,1—15 扇区为引导程序,16 号扇区开始第一个文件系统超级块;字节序也不同。

RAID-5 中一块盘离线,是否一定能恢复?

不一定。若其余成员盘可读且原始条带未被覆盖,通常具备恢复条件;若多盘损坏、阵列已重建或 UFS 元数据大面积破坏,则可能无法完整恢复。需要先只读镜像并解析结构。

UFS 超级块损坏还能恢复文件吗?

若柱面组中的关键数据结构备份仍可读,可据此定位和校验文件系统结构,再解析 i-节点与目录项;若备份也损坏或所在区域被覆盖,恢复难度会显著增加,不能保证完整提取。

结构参数速查(可自行核对)

Sun Solaris 上的 RAID-5 有两层:SVM(Solaris Volume Manager)的元数据库, 以及 UFS 文件系统本身。两边都有固定结构,可以先确认文件系统,再反推阵列参数。

项目取值 / 位置说明
UFS 超级块偏移 8192 字节,魔数 0x011954Solaris UFS 的主超级块位置固定
UFS 备份超级块多个柱面组内各有一份主超级块坏了读备份
SVM 元数据库默认 3 份副本,分布在成员盘的不同扇区metadb 丢失后阵列配置需按数据反推
SVM 条带由 metainit 时的 -i 参数决定(交错单元大小)与 UFS 的块大小是两件事
常见文件系统UFS(老系统)、ZFS(新系统)ZFS 走池结构,不能用 UFS 的方式处理

核对方法

# 1) 在成员盘镜像里找 UFS 超级块魔数(偏移 8192)
xxd -s 8192 -l 32 /cases/sun_disk0.img

# 2) 能挂载则只读挂载(Linux 上 ufs 只读支持有限,建议在 Solaris/illumos 环境做)
sudo mount -o ro -t ufs /cases/sun_rebuilt.img /mnt/ufs

# 3) 若原系统还能进,先导出 SVM 配置
metastat
metadb

顺序:先用 UFS 超级块确认"重组后的流是否是有效文件系统",再据此调整条带与顺序。 UFS 的超级块位置固定,比按文本特征猜要可靠得多——这也是老 Solaris 阵列相对好恢复的原因。

技术问题直接问,要报价走服务页

参数判定、镜像方案、固件损坏这类问题,聊清楚不收钱;需要现场检测、书面报价或上门,统一走 项目1 服务页(到店免费检测,出报告后报价,不出结果不收费)。

18620311365

深圳市福田区深南中路2070号电子科技大厦A座35楼D22(华强北地铁站D1口步行320米)

相关阅读

立即咨询 免费检测