在 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