ZFS永久性错误; 恢复选项

背景:小型个人服务器,电子邮件,networking,shell等,为家人和朋友。 SunOS 5.11,snv_113从2008年11月。服务器build于2009年。我相信是opensolaris或Solaris早期的访问版本。 AMD 64位处理器,4GB RAM。

Root zpool三向镜像,最初由三个笔记本电脑大小的320gb旋转磁盘组成。 三年后,每个旋转盘都一个接一个地死了, 每一个在制造商的保修下更换。 在过去的几个月里,又一个磁盘又变得愚蠢起来。 目前,我决定只是运行一个双向镜子。 在上周,出现了一个永久性的错误,列出了三个文件。 擦洗后,这些错误消失,除了一个元数据错误。 随着第二张光盘也开始出现故障,我扔了一个备用的桌面驱动器,并重新安装。 相同的校验和和元数据错误仍然存​​在。 在绝望中,我购买了几个固态硬盘(我来真的讨厌旋转磁盘)。 我已经添加了一个游泳池作为第三个,当然,在韧性,我仍然与以下几点:

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 

configuration:

  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本身也会有两个。 清除“zpool clear”对于清除校验和错误计数非常有效,但是错误的元数据文件仍然存在,并且每个重新刷新/清除只会带来相同的校验和错误。 请注意,我已经删除了所有的快照,因为我已经读过,有时候这是错误的数据存在的地方 – 但没有喜悦。

我有备份 – 但他们通过CrashPlan,并在云 – 所以恢复整个事情将需要几天,我维持服务器的有限连接,这意味着服务器的几天不可用,这是不可能的。

Soooo – 所有这些说。 除了从备份还原以外,我的恢复选项是什么(因为元数据“文件”显然是我不能删除的东西)。

如果我要在新磁盘上创build一个新的zfs池 – 会执行一个zfs发送/接收“清除”错误吗? 或者,build立新池,然后rsync旧池数据,然后将新池重命名为原始,在镜像磁盘上安装启动块,然后尝试启动? 我读过,有caching位的数据与实际的池名相关,可能会干扰实际的启动。

我知道要做的“合乎逻辑的”事情就是在OmniOS或OpenIndiana等最新的操作系统上构build一个新的服务器,或者使用这个服务器上的所有自定义编译代码(最初是一个Sparc 20)在二零零零年初期),我认为把所有的东西都拼凑起来是行不通的。

谢谢你的帮助。

哦 – 我应该加上 – 服务器运行得很好。 没有崩溃,没有locking,什么都没有。

我从这个事件中'恢复'了zfs发送和接收腐败池到一个新池。

#创build新的单个磁盘池(如果你愿意,可以预先创build一个镜像)
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维护的;在这种情况下,我select了直接运行)

#duplicate第一个bootset,编辑副本,更改find​​root从
findroot (pool_rpool,0,a)
# 至
findroot (pool_tpool,0,a)

现在在单用户中创build第二个快照
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)。

另外 – 当我试图解决这个问题的时候,我提到可能有超过一百个不同的网站和网页,上面的“配方”主要来自Joe Mocker的“如何缩小镜像的ZFS rpool” 。