flymeteor@Blog



在 FreeBSD 上使用软 RAID-1

在 FreeBSD 上使用软 RAID-1

Dru Lavigne

  有没有想过为低端æœ?务器å?šè½¯ RAID?你或许想过在ä¸?购置硬 RAID 控制å?¡çš„å‰?æ??下,通过ç£?盘镜åƒ?为你的工作站带æ?¥å†—ä½™ä¿?护。你是å?¦æœ‰è¿‡ç—›è‹¦çš„é…?ç½®ç»?历,使你对 Unix 系统上的软 RAID å?´æ­¥ï¼Ÿ

  FreeBSD 5.3 �更高的版本加入了 gmirror(8);它让你轻易地�置使用软 RAID 1。尽管 gmirror 已有�少教程,但我�现它们�是�求用 bsdlabel �手动计算分区的大�就是�用到一张用以修正现有系统的软盘。

  我以为在安装�作系统的过程中�置 RAID 更为��。我也希望�置步骤能�到易于�解并且�造�诸如计算出错的人为错误。通过拼凑现有的说明文字,自己进行多方�置实验�,我找到了在数个��系统 上都适用的�置步骤。我也从 gmirror 的编写者 Pawel Jakub Dawidek 那里得到了很有价值的回馈;他�露了 gmirror 一些尚未公开的特性。

GEOM 背景知识

  在介��置步骤之�,先了解一下 GEOM 是很有用的。GEOM 是 FreeBSD 5.0 引入的模��盘构架。该模�构架�许通过编写程���控�盘。FreeBSD 5.3 引入的软 RAID 程�就是最好的例�。

  gstripe(8) �� RAID 0
  gmirror(8) �� RAID 1
  graid3(8) �� RAID 3

  以上的首字符 g 表示这些程�都利用到了 GEOM。

  注:若你�知� RAID 为何物,则��阅 Webopedia 有关定义�� RAID 的链接 http://www.webopedia.com/TERM/R/RAID.html。

  man 4 geom 述说了 geom 所用到的�盘术语;在设置 gmirror 的过程中,我们将会看到一些。它们包括:

  provider — 该 GEOM 实体在 /dev 下出现。本文将介ç»?如何创建 /dev/mirror/gm0 这个 provider,它代表ç£?盘镜åƒ?或å?Œå·¥ã€‚

  consumer — 该实体接收 I/O 请求。在镜åƒ?/å?Œå·¥çš„例å­?中,这指的就是两å?—硬盘。我用两根数æ?®çº¿åˆ†åˆ«è¿žæŽ¥ä¸¤å?— IDE 硬盘,得到 /dev/ad0 å’Œ /dev/ad2。

  metadata (元数æ?®) — 在ä¸?å?Œçš„ RAID 中,它包括阵列æˆ?员å?Šå…¶å°ºå¯¸ã€?ä½?置,逻辑ç£?盘å?Šåˆ†åŒºçš„æ??è¿°å’Œç£?盘阵列的当å‰?状æ€?。

  镜åƒ?/å?Œå·¥ — RAID 1 ä¿?æŒ?两å?—硬盘的数æ?®ä¸€è‡´ã€‚æ?¢å?¥è¯?说,它将一å?—硬盘的数æ?®é•œå°„到å?¦ä¸€å?—硬盘。若两å?—硬盘å?ŒæŽ¥åœ¨ä¸€æ ¹ IDE æ•°æ?®çº¿ä¸Šï¼Œåˆ™ç§°ä¸ºé•œåƒ?;若两å?—硬盘接在ä¸?å?Œçš„æ•°æ?®çº¿ä¸Šï¼Œåˆ™ç§°ä¸ºå?Œå·¥ã€‚因为å?•一数æ?®çº¿æ˜“造æˆ?å?•点故障,所以采用å?Œå·¥çš„å? å¤§å¤šæ•°ã€‚

在安装�作系统的过程中�置镜�/�工

  若你打算用 RAID 1,为��节外生�,购置两�一模一样的硬盘(相�的型�和尺寸)。若型�或尺寸�一致,事情将会�得很��;就算�过艰辛的�置�事了,到头�,你�能 以浪费较大硬盘多出�的空间收场。将一个作为第一主盘,�一个作为第二主盘,接好两�一样的硬盘。在安装�作系统之�,�次检查 CMOS 是�已认出两�硬盘。

  按自己喜欢的安装方�开始安装 FreeBSD 任一版本(5.3 或以上)。到了 Select Drives (选定硬盘)��时,将会显示 ad0 和 ad2。选 ad0,因为你将把�作系统安装于该主盘上。

  进入 fdisk 界é?¢å?Žï¼Œåˆ é™¤æ‰€æœ‰çŽ°å­˜çš„åˆ†åŒºï¼Œç„¶å?Žé€‰ Use entire disk (使用整个ç£?盘)。当æ??示å?¯åЍè?œå?•时,选 Standard MBR (标准 MBR)。

  �到 disklabel 界�时,根�自己的需�将 ad0 分区。若�知�该怎么�,选 a 让系统自动分区。然�选择预设的安装套件和安装媒体�,让�作系统如常安装。

  安装完毕�,�览到 postinstall configurations (�安装�置)设置你的时区,创建用户��,设定 root 的密�等。

  ä¸?过,当回到 sysinstall 主è?œå?•时,ä¸?è¦?急于é‡?å?¯ç³»ç»Ÿã€‚按下 Alt-F4,进入命令æ??示行。我们首先键入 csh 命令,这样就得到一个带历å?²è®°å½•çš„ shell (默认的 shell 是 Bourne)。

  创建镜�/�工很简�,��键入:

  # gmirror label -v -b round-robin gm0 /dev/ad0

  其中,gmirror label 创建镜åƒ?ï¼›-v å¼€å?¯å†—长模å¼?ï¼›-b round-robin 选用平衡算法(ç›®å‰? round-robin 算法性能最佳)ï¼›gm0 å?³é•œåƒ?/å?Œå·¥çš„å??ç§°(该å??称代表第一个 GEOM 镜åƒ?)ï¼›/dev/ad0 代表用以镜射的æº?盘。

  然而,若现在便键入命令会使你失望。

  # gmirror label -v -b round-robin gm0 /dev/ad0
  Can’t store metadata on /dev/ad0: Operation not permitted
  (无法将元数��存于 /dev/ad0 上:�止�作)

  这是一�安全特性,表示�盘已被加载以便写入;因此��用。�过,你�通过 sysctl MIB,暂时让 gmirror 绕过这个特性,从而创建镜�/�工。

  # sysctl kern.geom.debugflags=16
  kern.geom.debugflags: 0 -> 16

  �用担心,系统���(数分钟�的事),该 MIB 将��为 0。��一次:

  # gmirror label -v -b round-robin gm0 /dev/ad0
  Metadata value stored on /dev/ad0

  就这样,RAID 1 �置告�。

  我们有必�让�作系统�次��时自动装载 RAID。这需�修改两个文件。第一个文件当�是空的,用 echo 创建��:

  # echo geom_mirror_load=”YES” > /boot/loader.conf

  第二个文件 /etc/fstab �是空的,所以我建议在修改��个备份:

  # cp /etc/fstab /etc/fstab.orig
  # vi /etc/fstab

  将所有 ad 改为 gm,在 /dev ��入 mirror。比如将 /dev/ad0s1a 改为 /dev/mirror/gm0s1a。如果没有创建别的分区,你会看到以 a, b, d, e 和 f 结尾的五个 ad0s1 分区;你需��一修改。

  修改完毕�,�仔细检查对 /etc/fstab � /boot/loader.conf 作出的更改。虽说事��以修正,但是因敲错一个字而�能�动新的系统是很烦的事。

  注:有些教程说过需�在 /etc/rc.conf 中加入 swapoff 选项。现已没必�。�样地,没必�将 shutdown -r now 当� reboot �用。

  确定没有错误之�,�出安装盘�,按下 Alt+F1 退出安装��。

�用镜�/�工

  若你注�看�动信�,在系统读出�盘信��,你应看到以白色粗体字显示的信�:

  GEOM_MIRROR: Device gm0 created (id=2125638583).
  GEOM_MIRROR: Device gm0: provider ad0 detected.
  GEOM_MIRROR: Device gm0: provider ad0 activated.
  GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
  GEOM_MIRROR: Device gm0 already configured.
  Mounting root from ufs:/dev/mirror/gm0s1a

  系统�动还在继续。�过,若在 /etc/fstab 敲错了一个字,�动过程将就此�止并等待你输入正确的信�。在下�例�中,我在修改 /etc/fstab 时忘了�入 mirror 一�,�将本应为 /dev/mirror/gm0s1a 的误作 /dev/gm0s1a,这样,FreeBSD 便�能找到我的根文件系统。

  Mounting root from ufs:/dev/gm0s1a
  setrootbyname failed
  ffs_mountroot: can’t find rootvp
  Root mount failed: 6
  
  Manual root filesystem specification:
    <fstype>:<device>  Mount <device> using filesystem <fstype>
              e.g. ufs:da0s1a
    ?             List valid disk boot devices
    <empty line>       Abort manual input
  
  mountroot>

  所幸的是,它并�是看起�那么�怕。�以从列出有效的�动分区入手处�故障:

  mountroot> ?
  
  List of GEOM managed disk devices:
    mirror/gm0s1f mirror/gm0s1e mirror/gm0s1d mirror/gm0s1c mirror/gm0s1b
  mirror/gm0s1a mirror/gm0s1 ad2s1 mirror/gm0 ad0s1 ad2 acd0 ad0 fd0

  若你正确输入 / 文件系统的�置,它将继续�动(boot,原文误作 reboot)下去。

  mountroot> ufs:/dev/mirror/gm0s1a
  Mounting root from /dev/mirror/gm0s1a
  
  登入之�,先更正 /etc/fstab 的误处并�新�动。正常�动且�功登入�,键入以下命令确定镜�的�个分区已被�功加载。

  % df -h
  Filesystem            Size    Used    Avail    Capacity    Mounted on
  /dev/mirror/gm0s1a    248M     35M     193M       15%        /
  devfs                 1.0K    1.0K       0B      100%        /dev
  /dev/mirror/gm0s1e    248M     12K     228M        0%        /tmp
  /dev/mirror/gm0s1f    7.3G     99M     6.7G        1%        /usr
  /dev/mirror/gm0s1d    248M    196K     228M        0%        /var

  df �显示交�分区的信�,�以用以下命令核实:

  % swapinfo
  Device                1K-blocks    Used    Avail    Capacity
  /dev/mirror/gm0s1b       629544       0   629544        0%

�步镜�/�工

  剩下的事就是�步两�硬盘的数�了。��键入�镜��入第二�硬盘的命令,数��步将自动进行。

  # gmirror insert gm0 /dev/ad2
  GEOM_MIRROR: Device gm0: provider ad2 detected.
  GEOM_MIRROR: Device gm0: rebuilding provider ad2.

  看看进展如何:

  # gmirror list | more
  Geom name: gm0
  State: DEGRADED
  Components: 2
  Balance: round-robin
  Slice: 4096
  Flags: NONE
  GenID: 0
  SyncID: 1
  ID: 2125638583
  Providers:
  1. Name: mirror/gm0
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r6w5e2
  Consumers:
  1. Name: ad0
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r1w1e1
     State: ACTIVE
     Priority: 0
     Flags: DIRTY
     GenID: 0
     SyncID: 1
     ID: 3986018406
  2. Name: ad2
     Mediasize: 10262568448 (9.6G)
     Sectorsize: 512
     Mode: r1w1e1
     State: SYNCHRONIZING
     Priority: 0
     Flags: DIRTY, SYNCHRONIZING
     GenID: 0
     SyncID: 1
     Synchronized: 1%
     ID: 1946262342

  注�看 Flags 行上的 SYNCHRONIZING 字眼。这两�硬盘的数���步需�一些时间,如当�所示�一个百分点。�我所知,10GB 的硬盘大约需时 30 分钟,75GB 的约需两个��时。若你觉得好奇,查查进度:

  # gmirror status
  Name    Status    Components
  mirror/gm0    DEGRADED    ad0
              ad2 (2%)

  数��步完毕�,你将看到以白色粗体字显示的系统信�:

  GEOM_MIRROR: Device gm0: rebuilding provider ad2 finished.
  GEOM_MIRROR: Device gm0: provider ad2 activated.

  若�次输入 gmirror list,你会看到 State (状�) 已从 DEGRADED (已�级) �� COMPLETE (完毕),Synchronized (已�步) 一行已��了。若在 Flags 行上看到 DIRTY (�干净) 字眼,�用担心;那仅表示系统已写入新的数�但尚未完�镜射。若你在�盘平�下��等数秒钟,则你将会看到 Flags 行��了 NONE (无)。

  ��系统,最�检查一下。

  这回�动信�应包�以下这些:

  GEOM_MIRROR: Device gm0 created (id=2125638583).
  GEOM_MIRROR: Device gm0: provider ad0 detected.
  GEOM_MIRROR: Device gm0: provider ad2 detected.
  GEOM_MIRROR: Device gm0: provider ad0 activated.
  GEOM_MIRROR: Device gm0: provider ad2 activated.
  GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
  Mounting root from ufs:/dev/mirror/gm0s1a
  
结语

  GEOM 实用程�在日益进步,它的开�者�断地将新特性�更新上传到网页去。利用 cvsup 更新你手上的 FreeBSD 版本或在决定安装 FreeBSD 时选用最新的版本是很��的。

  若你想å?–得镜åƒ?/å?Œå·¥çš„æ€§èƒ½æ•°æ?®ï¼Œç”¨ gstat(8)。通读 gmirror(8) 的说明文字也是值得倡议的,特别是在你想了解如何更æ?¢ä¸€å?—å??硬盘的情况下。


Leave a Comment

(required)

(required)



Formatting your comment
Back to Top | Textarea: Larger | Smaller