背景:小型个人服务器、电子邮件、网络、shell 等,供家人和朋友使用。SunOS 5.11,snv_113,2008 年 11 月。服务器建于 2009 年。我相信那是 opensolaris 或 Solaris 早期访问版本。AMD 64 位处理器,4GB RAM。
Root zpool 三向镜像,最初由三个笔记本电脑大小的 320gb 旋转磁盘组成。三年后,每个旋转磁盘都相继坏了;每个磁盘都在制造商保修范围内更换。在过去的几个月里,另一个磁盘又坏了。暂时,我决定只运行双向镜像。上周,出现了一个永久性错误,列出了三个文件。清理后,除了一个元数据错误外,这些错误都消失了。由于第二个磁盘也开始出现故障,我扔了一个备用桌面驱动器并重新同步到该驱动器。同样的校验和和元数据错误仍然存在。无奈之下,我购买了几个 SSD(我真的讨厌旋转磁盘)。我已将一个作为第三个添加到池中,当然在重新同步期间,我仍然保持以下状态:
root-klaatu /root% zpool status -v
pool: rpool
state: ONLINE
status: One or more devices has experienced an error resulting in data
corruption. Applications may be affected.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
see: http://www.sun.com/msg/ZFS-8000-8A
scrub: resilver in progress for 1h47m, 84.53% done, 0h19m to go
配置:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 1
mirror ONLINE 0 0 6
c1d0s0 ONLINE 0 0 6
c1d1s0 ONLINE 0 0 6 55.0G resilvered
c0d1s0 ONLINE 0 0 6 55.3G resilvered
错误:
Permanent errors have been detected in the following files:
<metadata>:<0x172>
到它完成时,每个磁盘将报告 10 个校验和错误,rpool 本身将报告 2 个校验和错误。'zpool clear' 对于清除校验和错误计数“非常有效”,但错误的元数据文件仍然存在,并且每次重新镀银/清理只会带来相同的校验和错误。请注意,我已删除所有快照,因为我读到有时错误数据就存在那里 - 但没有什么好高兴的。
我有备份 - 但它们是通过 CrashPlan 并在云端进行的 - 因此恢复整个内容需要几天时间,而我为服务器维护的连接有限,这意味着服务器将几天不可用,这根本无法忍受。
好了,说了这么多。除了从备份中恢复之外,我还有什么恢复选项吗(因为元数据“文件”显然是我无法删除的)。
如果我在新磁盘上创建新的 zfs 池 - 执行 zfs 发送/接收会“清除”错误吗?或者最好先设置新池,然后将旧池数据 rsync 到新池,然后将新池重命名为原始池,在镜像磁盘上安装启动块,然后尝试从该池启动?我读到过,与实际池名称相关的缓存数据位可能会干扰实际启动。
我知道“合乎逻辑”的做法是在最新的操作系统(如 OmniOS 或 OpenIndiana 或诸如此类)上构建一个新的、全新的服务器 - 但由于这台服务器上有所有的自定义编译代码(最初是 2000 年代初期的 Sparc 20),我推测对所有内容进行 rsync 不会很好地发挥作用。
谢谢你的帮助。
哦,我应该补充一下,服务器运行正常。没有崩溃,没有死机,什么都没有。
答案1
我可以通过将损坏的池“发送”并接收到新池中来从此事件中“恢复”。
# 创建新的单磁盘池(或者如果您愿意,可以提前创建一个镜像)
zpool create -f tpool c0d0s0
# 制作旧池的基线快照
zfs snapshot -r rpool@now
# zfs 将其发送到新的 tpool
zfs send -vR rpool@now | zfs receive -Fduv tpool
# 请注意,这会将 tpool 的挂载点重置为 rpool - 因此请务必更新它
zfs set mountpoint=/tpool tpool
# 转到单用户;如何取决于你的系统
# 编辑:
/rpool/boot/grub/menu.lst
#(请注意,此文件应该由 bootadm 维护;在这种情况下,我选择直接使用)
#复制第一个引导集,编辑副本,将 findroot 从
findroot (pool_rpool,0,a)
# 更改为
findroot (pool_tpool,0,a)
# 现在在单个用户中创建第二个快照
zfs snapshot -r rpool@now2
# 将增量快照发送到新的 tpool
zfs send -vR -i rpool@now rpool@now2 | zfs receive -Fduv tpool
# mount tpool - 再次记住,挂载点需要更新
zfs mount=/tpool tpool
# rm 'bootsign' 文件并替换为新的:
rm /tpool/boot/grub/bootsign/pool_rpool
touch /tpool/boot/grub/bootsign/pool_tpool
# 正式确定从哪里启动
zpool set bootfs=tpool/ROOT/snv_113 tpool
# 添加启动块
installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0d0s0
# 关闭电源,分离 rpool 磁盘 - 或将其保留以供进一步调查
# 如果要镜像,则物理连接第二个磁盘
# 启动
# 将 tpool 变成镜像
zpool attach tpool c0d0s0 c1d0s0
# 完毕
请注意,如果一切都令人满意,您可以编辑 grub 菜单,将新的 tpool 启动项移动为第一个,或者将“默认”声明更改为指向列表中的任何一个(或者,如果没有其他启动声明,则只需删除 rpool 的启动声明)。
另外 - 虽然我在尝试解决这个问题时参考了可能超过一百个不同的网站和网页,但上述“秘诀”主要来自如何缩小镜像 ZFS rpool,作者:Joe Mocker。