delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

15 Aug 2013

从 gmirror 迁移到 graid

谷奥 的服务器硬盘坏了,而且托管商很奇怪地用了 gmirror 而不是 BIOS 直接支持的 graid(我厂 Alexander Motin 实现的与 BIOS 兼容的软件 RAID,支持 Intel、Adaptec、JMicron、nVidia、Promise和SiL等多家厂商的软RAID格式),所以趁这个机会给它换掉。记一下迁移的过程。

启动的时候, gmirror 已经 degraded 了(有一个硬盘已经换掉):


% gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)

检查分区(gpart show),确认磁盘的最后部分没被占用:


% gpart show
=>        63  1953525104  mirror/gm0  MBR  (931G)
          63  1953520002           1  freebsd  [active]  (931G)
  1953520065        5102              - free -  (2.5M)

=>         0  1953520002  mirror/gm0s1  BSD  (931G)
           0    20971520             1  freebsd-ufs  (10G)
    20971520     1048576             2  freebsd-swap  (512M)
    22020096  1931499906             4  freebsd-ufs  (921G)

Intel的元数据格式需要占用磁盘的最后4K。(如果是GPT格式的,处理起来就复杂得多了,但MBR在磁盘最后并不放任何内容,因此可以直接来用)。

修改 fstab 将所有内容指向第一块磁盘: sed -e s,mirror/gm0s1,ada0s1,g /etc/fstab,没问题的话就 sed -i '' 来将修改写回。去掉 loader.conf 中关于 gmirror 的部分,重启系统。

用 gmirror clear 清除掉 ada0 上的元数据信息。由于 / 在 ada0 上面,因此需要先用 sysctl kern.geom.debugflags=16 去掉防护。


# gmirror clear ada0
Can't clear metadata on ada0: Operation not permitted.
gmirror: Not fully done.
# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
# gmirror clear ada0
#

下面是在 ada0 上建立 mirror。


# graid label Intel gm0 RAID1 ada0 NONE
Intel-9b7e50e1 created

修改 fstab: sed -i '' -e s,ada0s1,raid/r0s1,g /etc/fstab,重启(这里 r0 是因为是第一个设备)。这步做完之后,gpart 输出变为:


% graid status
   Name    Status  Components
raid/r0  DEGRADED  ada0 (ACTIVE (ACTIVE))
                   ada1 (ACTIVE (REBUILD 56%))
delphij@messenger:/home/delphij % gpart show
=>        63  1953525097  raid/r0  MBR  (931G)
          63  1953520002        1  freebsd  [active]  (931G)
  1953520065        5095           - free -  (2.5M)

=>         0  1953520002  raid/r0s1  BSD  (931G)
           0    20971520          1  freebsd-ufs  (10G)
    20971520     1048576          2  freebsd-swap  (512M)
    22020096  1931499906          4  freebsd-ufs  (921G)

将换上的新硬盘加入到 mirror 阵列中:


# graid insert raid/r0 ada1
(9.1-RELEASE 不能这样用;9.2 经过改进已经可以了。9.1上用: graid insert Intel-9b7e50e1 ada1)

剩下的事情就是等 graid 重建 mirror。如果机器不太忙的话这个过程不会需要太久(因为是顺序读写)。如果这个过程被打断,下次启动会从断点恢复。


Archived: 3 Comments

gkp | August 15, 2013 11:17 PM

不明觉厉。。。

zmoon | August 20, 2013 1:39 AM

graid 对比gmirror实际上有什么优点值得去更换?

Xin LI replied to comment from zmoon | August 23, 2013 3:08 PM

最大的优点是BIOS支持。如果是gmirror的话实际上你还是从一块盘(通常是第一块盘)启动的,而graid由于BIOS支持,在遇到坏块时可以直接处理而不需要人工干预。

在运行的时候区别不大。不过,因为graid是我厂的人做的,而且代码比较新,所以更放心一些。


Archived: trackbacks

如何:远程刷 Seagate 硬盘固件 from delphij’s Chaos on August 18, 2013 11:24 PM

警告 刷写硬盘固件时的不当操作可能会导致硬盘无法使用。 上回 说到 谷奥 的一块硬盘坏了,但是忘记说实际上两块硬盘的固件都有已知问题(ST1000DM003-9YN162 固件版本 CC4D,目前的最新版本是 CC4H)。虽然在 ticket 里提到了这件事,但是 remote hand 没做升级,想想之后决定还是自己把它远程刷掉好了。 由于刷写不当会导致硬盘无法使用(实际上还是有办法恢复的,但是比较麻烦而且没法在远程做),因此为了以防万一,在执行任何操作之前应备份硬盘上全部数据。由于使用的是 gr… Read More