aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.UTF-8/books/handbook/geom/chapter.xml
blob: cdd820d498925c4ed2473976a350754e46128ff1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
<?xml version="1.0" encoding="utf-8"?>
<!--
     The FreeBSD Documentation Project
     The FreeBSD Simplified Chinese Project

     Original Revision: f95372cee1 (r38401)
     $FreeBSD$
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="GEOM">
  <info><title>GEOM: 模块化磁盘变换框架</title>
    <authorgroup>
      <author><personname><firstname>Tom</firstname><surname>Rhodes</surname></personname><contrib>原作 </contrib></author>
    </authorgroup>
  </info>

  

  <sect1 xml:id="GEOM-synopsis">
    <title>概述</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>GEOM 磁盘框架</primary>
      <see>GEOM</see>
    </indexterm>

    <para>本章将介绍以 &os; GEOM 框架来使用磁盘。
      这包括了使用这一框架来配置的主要的 <acronym role="Redundant Array of Inexpensive Disks">RAID</acronym>
      控制工具。 这一章不会深入讨论 GEOM
      如何处理或控制 I/O、 其下层的子系统或代码。
      您可以从 &man.geom.4; 联机手册及其众多 SEE ALSO 参考文献中得到这些信息。
      这一章也不是对 <acronym>RAID</acronym> 配置的权威介绍,
      它只介绍由 支持GEOM 的 <acronym>RAID</acronym>
      级别。</para>

    <para>读完这章, 您将了解:</para>

    <itemizedlist>
      <listitem>
	<para>通过 GEOM 支持的 <acronym>RAID</acronym> 类型。</para>
      </listitem>

      <listitem>
	<para>如何使用基本工具来配置和管理不同的 <acronym>RAID</acronym>
	  级别。</para>
      </listitem>

      <listitem>
        <para>如何通过 GEOM 使用镜像、 条带、 加密和挂接在远程的磁盘设备。</para>
      </listitem>

      <listitem>
	<para>如何排除挂接在 GEOM 框架上的磁盘设备的问题。</para>
      </listitem>
    </itemizedlist>

    <para>阅读这章之前, 您应:</para>

    <itemizedlist>
      <listitem>
	<para>理解 &os; 如何处理磁盘设备
	  (<xref linkend="disks"/>)。</para>
      </listitem>

      <listitem>
	<para>了解如何配置和安装新的 &os; 内核
	  (<xref linkend="kernelconfig"/>)。</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 xml:id="GEOM-intro">
    <title>GEOM 介绍</title>

    <para>GEOM 允许访问和控制类 (classes) &mdash; 主引导记录、
      <acronym>BSD</acronym> 标签 (label), 等等 &mdash; 通过使用
      provider, 或在
      <filename>/dev</filename> 中的特殊文件。
      它支持许多软件 <acronym>RAID</acronym> 配置, GEOM 能够向操作系统,
      以及在其上运行的工具提供透明的访问方式。</para>
  </sect1>

  <sect1 xml:id="GEOM-striping">
  <info><title>RAID0 - 条带</title>
    <authorgroup>
      <author><personname><firstname>Tom</firstname><surname>Rhodes</surname></personname><contrib>原作 </contrib></author>
      <author><personname><firstname>Murray</firstname><surname>Stokely</surname></personname></author>
    </authorgroup>
  </info>

    

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>条带</primary>
    </indexterm>

    <para>条带是一种将多个磁盘驱动器合并为一个卷的方法。
      许多情况下, 这是通过硬件控制器来完成的。 GEOM
      磁盘子系统提供了 <acronym>RAID</acronym>0 的软件支持,
      它也成为磁盘条带。</para>

    <para><acronym>RAID</acronym>0 系统中, 数据被分为多个块,
      这些块将分别写入阵列的所有磁盘。 与先前需要等待系统将 256k
      数据写到一块磁盘上不同, <acronym>RAID</acronym>0 系统,
      能够同时分别将打碎的 64k 写到四块磁盘上, 从而提供更好的 I/O
      性能。 这一性能提升还能够通过使用多个磁盘控制器来进一步改进。</para>

    <para><acronym>RAID</acronym>0 条带中的每一个盘的尺寸必须一样,
      因为 I/O 请求是分散到多个盘上的, 以便让这些盘上的读写并行完成。</para>

      <mediaobject>
        <imageobject>
          <imagedata fileref="geom/striping" align="center"/>
        </imageobject>

        <textobject>
          <phrase>磁盘条带图</phrase>
        </textobject>
      </mediaobject>

    <procedure>
      <title>在未格式化的 ATA 磁盘上建立条带</title>

      <step><para>加载 <filename>geom_stripe.ko</filename>
        模块:</para>

    <screen>&prompt.root; <userinput>kldload geom_stripe</userinput></screen>
	</step>

      <step><para>确信存在合适的挂接点 (mount point)。 如果这个卷将成为根分区,
        那么暂时把它挂接到其他位置i, 如 <filename>/mnt</filename></para>

        <screen>&prompt.root; <userinput>mkdir /mnt</userinput></screen>
      </step>

      <step>
	<para>确定将被做成条带卷的磁盘的设备名,
	  并创建新的条带设备。 举例而言,
	  要将两个未用的、 尚未分区的 <acronym>ATA</acronym> 磁盘
	  <filename>/dev/ad2</filename><filename>/dev/ad3</filename> 做成一个条带设备:</para>

        <screen>&prompt.root; <userinput>gstripe label -v st0 /dev/ad2 /dev/ad3</userinput>
Metadata value stored on /dev/ad2.
Metadata value stored on /dev/ad3.
Done.</screen>

      </step>

      <step>
	<para>接着需要写标准的 label, 也就是通常所说的分区表到新卷上,
	  并安装标准的引导代码:</para>

        <screen>&prompt.root; <userinput>bsdlabel -wB /dev/stripe/st0</userinput></screen>
      </step>

      <step>
	<para>上述过程将在
	  <filename>/dev/stripe</filename>
	  目录中的 <filename>st0</filename> 设备基础上建立两个新设备。
	  这包括 <filename>st0a</filename><filename>st0c</filename>。 这时, 就可以在
	  <filename>st0a</filename> 设备上用下述
	  <command>newfs</command> 命令来建立文件系统了:</para>

	<screen>&prompt.root; <userinput>newfs -U /dev/stripe/st0a</userinput></screen>

	<para>在屏幕上将滚过一些数字, 整个操作应该能在数秒内完成。
	  现在可以挂接刚刚做好的卷了。</para>
      </step>

  </procedure>

  <para>要挂接刚创建的条带盘:</para>

  <screen>&prompt.root; <userinput>mount /dev/stripe/st0a /mnt</userinput></screen>

    <para>要在启动过程中自动挂接这个条带上的文件系统,
      需要把关于卷的信息放到
      <filename>/etc/fstab</filename> 文件中。为达到此目的,
      需要创建一个叫
      <filename>stripe</filename>
      的永久的挂载点:</para>

  <screen>&prompt.root; <userinput>mkdir /stripe</userinput>
&prompt.root; <userinput>echo "/dev/stripe/st0a /stripe ufs rw 2 2" \</userinput>
    <userinput>&gt;&gt; /etc/fstab</userinput></screen>

    <para>此外, <filename>geom_stripe.ko</filename> 模块也必须通过在
      <filename>/boot/loader.conf</filename> 中增加下述设置,
      以便在系统初始化过程中自动加载:</para>

  <screen>&prompt.root; <userinput>echo 'geom_stripe_load="YES"' &gt;&gt; /boot/loader.conf</userinput></screen>

  </sect1>

  <sect1 xml:id="GEOM-mirror">
    <title>RAID1 - 镜像</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>磁盘镜像</primary>
    </indexterm>

    <para>镜像是许多公司和家庭用户使用的一种无须中断的备份技术。
      简单地说, 镜像的概念就是 磁盘B 是同步复制 (replicate) 的 磁盘A 的副本,
      或者 磁盘C+D 是 diskA+B 的同步复制副本, 等等。 无论磁盘配置如何,
      这种技术的共同特点都是一块磁盘或分区的内容会同步复制到另外的地方。
      这样, 除了能够很容易地恢复信息之外,
      还能够在无须中断服务或访问的情况下进行备份,
      甚至直接将副本送到数据保安公司异地储存。</para>

    <para>在开始做这件事之前, 首先请准备两个容量相同的磁盘驱动器,
      下面的例子假定它们都是使用直接访问方式 (Direct Access, &man.da.4;) 的
      <acronym>SCSI</acronym> 磁盘。</para>

    <sect2>
      <title>对主磁盘进行镜像</title>

      <para>假定您现有系统中的 &os; 安装到了第一个, 也就是
	<filename>da0</filename> 盘上, 则应告诉 &man.gmirror.8;
	将主要数据保存在这里。</para>

      <para>在开始构建镜像卷之前, 可以启用更多的调试信息,
	并应开放对设备的完全访问。 这可以通过将 &man.sysctl.8; 变量
	<varname>kern.geom.debugflags</varname>
	设置为下面的值来实现:</para>

      <screen>&prompt.root; <userinput>sysctl kern.geom.debugflags=17</userinput></screen>

      <para>接下来需要创建镜像。 这个过程的第一步是在主磁盘上保存元数据信息,
	也就是用下面的命令来创建
	<filename>/dev/mirror/gm</filename> 设备:</para>

      <warning>
	<para>在引导用的设备基础上新建镜像时,
	  有可能会导致保存在磁盘上最后一个扇区的数据丢失。
	  在新安装 &os; 之后立即创建镜像可以减低此风险。
	  下面的操作与默认的 &os;&nbsp;9.<replaceable>X</replaceable>
	  安装过程不兼容, 因为它采用了新的 <acronym>GPT</acronym>
	  分区格式。 GEOM 会覆盖 <acronym>GPT</acronym> 元数据,
	  这会导致数据丢失, 并有可能导致系统无法引导。</para>
      </warning>

      <screen>&prompt.root; <userinput>gmirror label -vb round-robin gm0 /dev/da0</userinput></screen>

      <para>系统应给出下面的回应:</para>

      <screen>Metadata value stored on /dev/da0.
Done.</screen>

      <para>初始化 GEOM, 这步操作会加载内核模块
	<filename>/boot/kernel/geom_mirror.ko</filename></para>

      <screen>&prompt.root; <userinput>gmirror load</userinput></screen>

      <note>
	<para>当这个命令运行完之后, 系统会在
	  <filename>/dev/mirror</filename>
	  目录中创建设备节点
	  <filename>gm0</filename></para>
      </note>

      <para>配置在系统初始化过程中自动加载 <filename>geom_mirror.ko</filename></para>

      <screen>&prompt.root; <userinput>echo 'geom_mirror_load="YES"' &gt;&gt; /boot/loader.conf</userinput></screen>

      <para>编辑 <filename>/etc/fstab</filename> 文件,
	将其中先前的 <filename>da0</filename> 改为新的镜像设备
	<filename>gm0</filename></para>

      <note>
        <para>如果 &man.vi.1; 是你喜欢的编辑器,
          以下则是完成此项任务的一个简便方法:</para>

        <screen>&prompt.root; <userinput>vi /etc/fstab</userinput></screen>

	<para>在 &man.vi.1; 中备份现有的
	  <filename>fstab</filename> 内容, 具体操作是
	  <userinput>:w /etc/fstab.bak</userinput>。 接着,
	  把所有旧的 <filename>da0</filename>
	  替换成 <filename>gm0</filename>, 也就是输入命令
	  <userinput>:%s/da/mirror\/gm/g</userinput></para>
      </note>

      <para>修改完后的 <filename>fstab</filename> 文件应该是下面的样子。
	磁盘驱动器是 <acronym>SCSI</acronym><acronym>ATA</acronym>
	甚至 <acronym>RAID</acronym> 都没有关系, 最终的结果都是
	<filename>gm</filename></para>

      <programlisting># Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/mirror/gm0s1b	none		swap	sw		0	0
/dev/mirror/gm0s1a	/		ufs	rw		1	1
/dev/mirror/gm0s1d	/usr		ufs	rw		0	0
/dev/mirror/gm0s1f	/home		ufs	rw		2	2
#/dev/mirror/gm0s2d	/store		ufs	rw		2	2
/dev/mirror/gm0s1e	/var		ufs	rw		2       2
/dev/acd0		/cdrom		cd9660	ro,noauto	0	0</programlisting>

      <para>重启系统:</para>

      <screen>&prompt.root; <userinput>shutdown -r now</userinput></screen>

      <para>在系统初始化过程中, 新建的
	<filename>gm0</filename> 会代替
	<filename>da0</filename> 设备工作。 系统完成初始化之后,
	可以通过检查 <command>mount</command> 命令的输出来查看效果:</para>

      <screen>&prompt.root; <userinput>mount</userinput>
Filesystem         1K-blocks    Used    Avail Capacity  Mounted on
/dev/mirror/gm0s1a   1012974  224604   707334    24%    /
devfs                      1       1        0   100%    /dev
/dev/mirror/gm0s1f  45970182   28596 42263972     0%    /home
/dev/mirror/gm0s1d   6090094 1348356  4254532    24%    /usr
/dev/mirror/gm0s1e   3045006 2241420   559986    80%    /var
devfs                      1       1        0   100%    /var/named/dev</screen>

      <para>这个输出是正常的。 最后, 使用下面的命令将 <filename>da1</filename>
	磁盘加到镜像卷中, 以开始同步过程:</para>

      <screen>&prompt.root; <userinput>gmirror insert gm0 /dev/da1</userinput></screen>

      <para>在构建镜像卷的过程中, 可以用下面的命令查看状态:</para>

      <screen>&prompt.root; <userinput>gmirror status</userinput></screen>

      <para>一旦镜像卷的构建操作完成, 这个命令的输出就会变成这样:</para>

      <screen>      Name    Status  Components
mirror/gm0  COMPLETE  da0
                      da1</screen>

      <para>如果有问题或者构建仍在进行, 输出中的
	<literal>COMPLETE</literal> 就会是
	<literal>DEGRADED</literal></para>
    </sect2>

    <sect2>
      <title>故障排除</title>
      <sect3>
	<title>系统拒绝引导</title>

	<para>如果系统引导时出现类似下面的提示:</para>

	<programlisting>ffs_mountroot: can't find rootvp
Root mount failed: 6
mountroot&gt;</programlisting>

	<para>这种情况应使用电源或复位按钮重启机器。
	  在引导菜单中, 选择第六 (6) 个选项。
	  这将让系统进入 &man.loader.8; 提示符。
	  在此处手工加载内核模块:</para>

	<screen>OK? <userinput>load geom_mirror</userinput>
OK? <userinput>boot</userinput></screen>

	<para>如果这样做能解决问题, 则说明由于某种原因模块没有被正确加载。
	  检查 <filename>/boot/loader.conf</filename> 中相关条目是否正确。
	  如果问题仍然存在,可以在内核配置文件中加入:</para>

	<programlisting>options	GEOM_MIRROR</programlisting>

	<para>然后重新编译和安装内核来解决这个问题。</para>
      </sect3>
    </sect2>

    <sect2>
      <title>从磁盘故障中恢复</title>

      <para>磁盘镜像的一大好处是在当其中一个磁盘出现故障时,
	可以很容易地将其替换掉, 并且通常不会丢失数据。</para>

      <para>考虑前面的 <acronym>RAID</acronym>1
	配置, 假设 <filename>da1</filename>
	出现了故障并需要替换, 要替换它,
	首先确定哪个磁盘出现了故障, 并关闭系统。
	此时, 可以用换上新的磁盘, 并重新启动系统。
	这之后可以用下面的命令来完成磁盘的替换操作:</para>

      <screen>&prompt.root; <userinput>gmirror forget gm0</userinput></screen>

      <screen>&prompt.root; <userinput>gmirror insert gm0 /dev/da1</userinput></screen>

      <para>在重建过程中可以用 <command>gmirror</command> <option>status</option>
	命令来监看进度。 就是这样简单。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="GEOM-raid3">
    <info><title><acronym>RAID</acronym>3 - 使用专用校验设备的字节级条带</title>
      <authorgroup>
	<author><personname><firstname>Mark</firstname><surname>Gladman</surname></personname><contrib>Written by </contrib></author>
	<author><personname><firstname>Daniel</firstname><surname>Gerzo</surname></personname></author>
      </authorgroup>
      <authorgroup>
	<author><personname><firstname>Tom</firstname><surname>Rhodes</surname></personname><contrib>Based on documentation by </contrib></author>
	<author><personname><firstname>Murray</firstname><surname>Stokely</surname></personname></author>
      </authorgroup>
    </info>

    

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>RAID3</primary>
    </indexterm>

    <para><acronym>RAID</acronym>3 是一种将多个磁盘组成一个卷的技术,
      在这个配置中包含一个专用于校验的盘。
      在 <acronym>RAID</acronym>3 系统中,
      数据会以字节为单位拆分并写入除校验盘之外的全部驱动器中。 这意味着从
      <acronym>RAID</acronym>3 中读取数据时将会访问所有的驱动器。
      采用多个磁盘控制器可以进一步改善性能。 <acronym>RAID</acronym>3
      阵列最多可以容忍其中的 1 个驱动器出现故障,
      它可以提供全部驱动器总容量的 1 - 1/n,
      此处 n 是阵列中的磁盘数量。 这类配置比较适合保存大容量的数据,
      例如多媒体文件。</para>

    <para>在建立
      <acronym>RAID</acronym>3 阵列时, 至少需要 3 块磁盘。
      所有的盘的尺寸必须一致, 因为 I/O 请求会并发分派到不同的盘上。
      另外, 由于
      <acronym>RAID</acronym>3 本身的设计,
      盘的数量必须恰好是 3, 5, 9, 17, 等等 (2^n + 1)。</para>

    <sect2>
      <title>建立专用的 <acronym>RAID</acronym>3 阵列</title>

      <para>&os; 中, <acronym>RAID</acronym>3
	是通过 &man.graid3.8; <acronym>GEOM</acronym>
	class 实现的。 在 &os; 中建立专用的
	<acronym>RAID</acronym>3 阵列需要下述步骤。</para>

      <note>
	<para>虽然理论上从
	  <acronym>RAID</acronym>3 阵列启动 &os; 是可行的,
	  但这并不常见, 也不推荐您这样做。</para>
      </note>

      <procedure>
	<step>
	  <para>首先, 在引导加载器中用下面的命令加载 <filename>geom_raid3.ko</filename>
	    内核模块:</para>

	  <screen>&prompt.root; <userinput>graid3 load</userinput></screen>

	  <para>此外, 也可以通过命令行手工加载
	    <filename>geom_raid3.ko</filename> 模块:</para>

	  <screen>&prompt.root; <userinput>kldload geom_raid3.ko</userinput></screen>
	</step>

	<step>
	  <para>创建用于挂载卷的挂点目录:</para>

	  <screen>&prompt.root; <userinput>mkdir /multimedia/</userinput></screen>
	</step>

	<step>
	  <para>确定将要加入阵列的磁盘设备名, 并创建新的
	    <acronym>RAID</acronym>3 设备。 最终, 这个设备将代表整个阵列。
	    下面的例子使用三个未经分区的
	    <acronym>ATA</acronym> 磁盘:
	    <filename>ada1</filename><filename>ada2</filename>
	    保存数据, 而
	    <filename>ada3</filename>
	    用于校验。</para>

	  <screen>&prompt.root; <userinput>graid3 label -v gr0 /dev/ada1 /dev/ada2 /dev/ada3</userinput>
Metadata value stored on /dev/ada1.
Metadata value stored on /dev/ada2.
Metadata value stored on /dev/ada3.
Done.</screen>
	</step>

	<step>
	  <para>为新建的
	    <filename>gr0</filename> 设备分区,
	    并在其上创建 UFS 文件系统:</para>

	  <screen>&prompt.root; <userinput>gpart create -s GPT /dev/raid3/gr0</userinput>
&prompt.root; <userinput>gpart add -t freebsd-ufs /dev/raid3/gr0</userinput>
&prompt.root; <userinput>newfs -j /dev/raid3/gr0p1</userinput></screen>

	  <para>屏幕上会滚过许多数字, 这个过程需要一段时间才能完成。
	    此后, 您就完成了创建卷的全部操作,
	    可以挂载它了。</para>
	</step>

	<step>
	  <para>最后一步是挂载文件系统:</para>

	  <screen>&prompt.root; <userinput>mount /dev/raid3/gr0p1 /multimedia/</userinput></screen>

	  <para>现在可以使用 <acronym>RAID</acronym>3 阵列了。</para>
	</step>
      </procedure>

      <para>为了让上述配置在系统重启后继续可用, 还需要进行一些额外的配置操作。</para>

      <procedure>
	<step>
	  <para>在挂载卷之前必须首先加载 <filename>geom_raid3.ko</filename> 模块。
	    将下面的配置添加到
	    <filename>/boot/loader.conf</filename> 文件中,
	    可以让系统在引导过程中自动加载这个模块:</para>

	  <programlisting>geom_raid3_load="YES"</programlisting>
	</step>

	<step>
	  <para>您需要在
	    <filename>/etc/fstab</filename> 文件中加入下列配置,
	    以便让系统引导时自动挂载阵列上的文件系统:</para>

	  <programlisting>/dev/raid3/gr0p1	/multimedia	ufs	rw	2	2</programlisting>
	</step>
      </procedure>
    </sect2>
  </sect1>

  <sect1 xml:id="geom-ggate">
    <title>GEOM Gate 网络设备</title>

    <para>通过 gate 工具, GEOM 支持以远程方式使用设备, 例如磁盘、
      CD-ROM、 文件等等。 这和 <acronym>NFS</acronym> 类似。</para>

    <para>在开始工作之前, 首先要创建一个导出文件。
      这个文件的作用是指定谁可以访问导出的资源,
      以及提供何种级别的访问授权。 例如,
      要把第一块 <acronym>SCSI</acronym> 盘的第四个 slice 导出,
      对应的 <filename>/etc/gg.exports</filename> 会是类似下面的样子:</para>

    <programlisting>192.168.1.0/24 RW /dev/da0s4d</programlisting>

    <para>这表示允许同属私有子网的所有机器访问
      <filename>da0s4d</filename> 分区上的文件系统。</para>

    <para>要导出这个设备, 首先请确认它没有被挂接,
      然后是启动 &man.ggated.8; 服务:</para>

    <screen>&prompt.root; <userinput>ggated</userinput></screen>

    <para>现在我们将在客户机上 <command>mount</command> 该设备,
      使用下面的命令:</para>

    <screen>&prompt.root; <userinput>ggatec create -o rw 192.168.1.1 /dev/da0s4d</userinput>
ggate0
&prompt.root; <userinput>mount /dev/ggate0 /mnt</userinput></screen>

    <para>到此为止, 设备应该已经可以通过挂接点
      <filename>/mnt</filename> 访问了。</para>

    <note>
      <para>请注意, 如果设备已经被服务器或网络上的任何其他机器挂接,
	则前述操作将会失败。</para>
    </note>

    <para>如果不再需要使用这个设备,
      就可以使用 &man.umount.8; 命令来安全地将其卸下了,
      这一点和其他磁盘设备类似。</para>
  </sect1>

  <sect1 xml:id="geom-glabel">
    <title>为磁盘设备添加卷标</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>磁盘卷标</primary>
    </indexterm>

    <para>在系统初始化的过程中, &os; 内核会为检测到的设备创建设备节点。
      这种检测方式存在一些问题, 例如,
      在通过 <acronym>USB</acronym> 添加设备时应如何处理?
      很可能有闪存盘设备最初被识别为
      <filename>da0</filename> 而在这之后, 则由
      <filename>da0</filename> 变成了
      <filename>da1</filename>。 而这则会在挂接
      <filename>/etc/fstab</filename> 中的文件系统时造成问题,
      这些问题, 还可能在系统引导时导致无法正常启动。</para>

    <para>解决这个问题的一个方法是以连接拓扑方式链式地进行
      <acronym>SCSI</acronym> 设备命名, 这样,
      当在 <acronym>SCSI</acronym> 卡上增加新设备时, 这些设备将使用一个未用的编号。
      但如果 <acronym>USB</acronym> 设备取代了主 <acronym>SCSI</acronym> 磁盘的位置呢?
      由于 <acronym>USB</acronym> 通常会在 <acronym>SCSI</acronym> 卡之前检测到,
      因此很可能出现这种现象。 当然, 可以通过在系统引导之后再插入这些设备来绕过这个问题。
      另一种绕过这个问题的方法, 则是只使用
      <acronym>ATA</acronym> 驱动器, 并避免在
      <filename>/etc/fstab</filename> 中列出
      <acronym>SCSI</acronym> 设备。</para>

    <para>还有一种更好的解决方法。 通过使用
      <command>glabel</command> 工具, 管理员或用户可以为磁盘设备打上标签, 并在
      <filename>/etc/fstab</filename> 中使用这些标签。 由于
      <command>glabel</command> 会将标签保存在对应 provider 的最后一个扇区,
      在系统重启之后, 它仍会持续存在。 因此, 通过将具体的设备替换为使用标签表示,
      无论设备节点变成什么, 文件系统都能够顺利地完成挂接。</para>

    <note>
      <para>这并不是说标签一定是永久性的。
	<command>glabel</command> 工具既可以创建永久性标签, 也可以创建临时性标签。
	在重启时, 只有永久性标签会保持。 请参见联机手册 &man.glabel.8;
	以了解两者之间的差异。</para>
    </note>

    <sect2>
      <title>标签类型和使用示范</title>

      <para>有两种类型的标签, 一种是普通标签, 另一种是文件系统标签。
	标签可以是永久性的或暂时性的。永久性的标签可以通过 
	&man.tunefs.8; 或 &man.newfs.8; 命令创键。根据文件系统的类型,
	它们将在 <filename>/dev</filename>
	下的一个子目录中被创建。例如,
	<acronym>UFS</acronym>2 文件系统的标签会创建到
	<filename>/dev/ufs</filename>
	目录中。永久性的标签还可以使用 <command>glabel label</command>
	创建。它们不再是文件系统特定的,而是会在
	<filename>/dev/label</filename>
	目录中被创建。</para>

      <para>暂时性的标签在系统下次重启时会消失, 这些标签会创建到
	<filename>/dev/label</filename> 目录中,
	很适合测试之用。可以使用 <command>glabel create</command>
	创建暂时性的标签。请参阅 &man.glabel.8;
	手册页以获取更多详细信息。</para>

<!-- XXXTR: How do you create a file system label without running newfs
	    or when there is no newfs (e.g.: cd9660)? -->

      <para>要为一个 <acronym>UFS</acronym>2 文件系统创建永久性标签,
        而不破坏其上的数据,可以使用下面的命令:</para>

      <screen>&prompt.root; <userinput>tunefs -L home /dev/da3</userinput></screen>

      <warning>
	<para>如果文件系统满了, 这可能会导致数据损坏; 不过, 如果文件系统快满了,
	  此时应首先删除一些无用的文件, 而不是增加标签。</para>
      </warning>

      <para>现在, 您应可以在
	<filename>/dev/ufs</filename> 目录中看到标签,
	并将其加入 <filename>/etc/fstab</filename></para>

      <programlisting>/dev/ufs/home		/home            ufs     rw              2      2</programlisting>

      <note>
	<para>当运行 <command>tunefs</command> 时, 应首先卸下文件系统。</para>
      </note>

      <para>现在可以像平时一样挂接文件系统了:</para>

      <screen>&prompt.root; <userinput>mount /home</userinput></screen>

      <para>现在, 只要在系统引导时通过 <filename>/boot/loader.conf</filename> 配置加载了内核模块
	<filename>geom_label.ko</filename>, 或在联编内核时指定了
	<literal>GEOM_LABEL</literal> 选项,
	设备节点由于增删设备而顺序发生变化时, 就不会影响文件系统的挂接了。</para>

      <para>通过使用 <command>newfs</command> 命令的
	<option>-L</option> 参数, 可以在创建文件系统时为其添加默认的标签。
	请参见联机手册 &man.newfs.8; 以了解进一步的详情。</para>

      <para>下列命令可以清除标签:</para>

      <screen>&prompt.root; <userinput>glabel destroy home</userinput></screen>

      <para>以下的例子展示了如何为一个启动磁盘打上标签。</para>

      <example>
        <title>为启动磁盘打上标签</title>

	<para>为启动磁盘打上永久性标签, 系统应该能够正常启动,
	  即使磁盘被移动到了另外一个控制器或者转移到了一个不同的系统上。
	  此例中我们假设使用了一个 <acronym>ATA</acronym> 磁盘,
	  当前这个设备被系统识别为 <filename>ad0</filename>。
	  还假设使用了标准的 &os; 分区划分方案,
	  <filename>/</filename>,
	  <filename>/var</filename>,
	  <filename>/usr</filename><filename>/tmp</filename> 文件系统,
	  还有一个 swap 分区。</para>

	<para>重启系统,在 &man.loader.8; 提示符下键入
	  <keycap>4</keycap> 启动到单用户模式。
	  然后输入以下的命令:</para>

	<screen>&prompt.root; <userinput>glabel label rootfs /dev/ad0s1a</userinput>
GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
&prompt.root; <userinput>glabel label var /dev/ad0s1d</userinput>
GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
&prompt.root; <userinput>glabel label usr /dev/ad0s1f</userinput>
GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
&prompt.root; <userinput>glabel label tmp /dev/ad0s1e</userinput>
GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
&prompt.root; <userinput>glabel label swap /dev/ad0s1b</userinput>
GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
&prompt.root; <userinput>exit</userinput></screen>

	<para>系统加继续启动进入多用户模式。 在启动完毕后, 编辑
	  <filename>/etc/fstab</filename> 用各自的标签替换下常规的设备名。
	  最终 <filename>/etc/fstab</filename> 看起来差不多是这样的:</para>

	<programlisting># Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap         none            swap    sw              0       0
/dev/label/rootfs       /               ufs     rw              1       1
/dev/label/tmp          /tmp            ufs     rw              2       2
/dev/label/usr          /usr            ufs     rw              2       2
/dev/label/var          /var            ufs     rw              2       2</programlisting>

	<para>现在可以重启系统了。 如果一切顺利的话,
	  系统可以正常启动并且 <command>mount</command> 命令显示:</para>

	<screen>&prompt.root; <userinput>mount</userinput>
/dev/label/rootfs on / (ufs, local)
devfs on /dev (devfs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)</screen>
      </example>

      <para>&os;&nbsp;7.2 开始, &man.glabel.8; class
	新增了一种用于 <acronym>UFS</acronym> 文件系统唯一标识符,
	<literal>ufsid</literal> 的标签支持。
	这些标签可以在 <filename>/dev/ufsid</filename>
	目录中找到, 它们会在系统引导时自动创建。
	在 <filename>/etc/fstab</filename> 机制中,
	也可以使用 <literal>ufsid</literal> 标签。 您可以使用
	<command>glabel status</command> 命令来获得与文件系统对应的
	<literal>ufsid</literal> 标签列表:</para>

      <screen>&prompt.user; <userinput>glabel status</userinput>
                  Name  Status  Components
ufsid/486b6fc38d330916     N/A  ad4s1d
ufsid/486b6fc16926168e     N/A  ad4s1f</screen>

      <para>在上面的例子中 <filename>ad4s1d</filename>
	代表了 <filename>/var</filename>
	文件系统, 而 <filename>ad4s1f</filename> 则代表了
	<filename>/usr</filename> 文件系统。 您可以使用这些
	<literal>ufsid</literal> 值来挂载它们, 在
	<filename>/etc/fstab</filename> 中配置类似这样:</para>

      <programlisting>/dev/ufsid/486b6fc38d330916        /var        ufs        rw        2      2
/dev/ufsid/486b6fc16926168e        /usr        ufs        rw        2      2</programlisting>

      <para>所有包含了 <literal>ufsid</literal> 的标签都可以用这种方式挂载,
	从而消除了需要手工创建永久性标签的麻烦,
	而又能够提供提供与设备名无关的挂载方式的便利。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="geom-gjournal">
    <title>通过 GEOM 实现 UFS 日志</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>日志</primary>
    </indexterm>

    <para>随着 &os;&nbsp;7.0 的发布,
      提供了长期为人们所期待的日志功能的实现。 这个实现采用了
      <acronym>GEOM</acronym> 子系统, 可以很容易地使用 &man.gjournal.8; 工具来进行配置。</para>

    <para>日志是什么? 日志的作用是保存文件系统事务的记录, 换言之,
      完成一次完整的磁盘写入操作所需的变动, 这些记录会在元数据以及文件数据写盘之前,
      写入到磁盘中。 这种事务日志可以在随后用于重放并完成文件系统事务,
      以避免文件系统出现不一致的问题。</para>

    <para>这种方法是另一种阻止文件系统丢失数据并发生不一致的方法。 与 Soft Updates
      追踪并确保元数据更新顺序这种方法不同,
      它会实际地将日志保存到指定为此项任务保留的磁盘空间上,
      在某些情况下可全部存放到另外一块磁盘上。</para>

    <para>与其他文件系统的日志实现不同,
      <command>gjournal</command> 采用的是基于块, 而不是作为文件系统的一部分的方式 -
      它只是作为一种
      <acronym>GEOM</acronym> 扩展实现。</para>

    <para>如果希望启用 <command>gjournal</command>&os; 内核需要下列选项 - 这是 &os; 7.0 以及更高版本系统上的默认配置:</para>

    <programlisting>options	UFS_GJOURNAL</programlisting>

    <para>如果使用日志的卷需要在启动的时候被挂载, 还需加载
      <filename>geom_journal.ko</filename> 内核模块,
      将以下这行加入 <filename>/boot/loader.conf</filename></para>

    <programlisting>geom_journal_load="YES"</programlisting>

    <para>这个功能也可被编译进一个定制的内核,
      需在内核配置文件中加入以下这行:</para>

    <programlisting>options	GEOM_JOURNAL</programlisting>

    <para>现在, 可以为空闲的文件系统创建日志了。 对于新增的 <acronym>SCSI</acronym> 磁盘
      <filename>da4</filename>, 具体的操作步骤为:</para>

    <screen>&prompt.root; <userinput>gjournal load</userinput>
&prompt.root; <userinput>gjournal label /dev/da4</userinput></screen>

    <para>这样, 就会出现一个与
      <filename>/dev/da4</filename> 设备节点对应的
      <filename>/dev/da4.journal</filename> 设备节点。
      接下来, 可以在这个设备上建立文件系统:</para>

    <screen>&prompt.root; <userinput>newfs -O 2 -J /dev/da4.journal</userinput></screen>

    <para>这个命令将建立一个包含日志设备的
      <acronym>UFS</acronym>2 文件系统。</para>

    <para>然后就可以用 <command>mount</command> 命令来挂接设备了:</para>

    <screen>&prompt.root; <userinput>mount /dev/da4.journal /mnt</userinput></screen>

    <note>
      <para>当磁盘包含多个 slice 时, 每个 slice 上都会建立日志。
	例如, 如果有 <filename>ad4s1</filename><filename>ad4s2</filename> 这两个 slice,
	则 <command>gjournal</command> 会建立
	<filename>ad4s1.journal</filename><filename>ad4s2.journal</filename></para>
    </note>

    <para>出于性能考虑, 可能会希望在其他磁盘上保存日志。 对于这类情形,
      应该在启用日志的设备后面,给出日志提供者或存储设备。 在暨存的文件系统上,
      可以用 <command>tunefs</command> 来启用日志; 不过,
      在尝试修改文件系统之前, 您应对其进行备份。 多数情况下,
      如果无法创建实际的日志, <command>gjournal</command> 就会失败, 
      并且不会防止由于不当使用 <command>tunefs</command> 而造成的数据丢失。</para>

    <para>对于 &os; 系统的启动磁盘使用日志也是可能的。
      请参阅 <link xlink:href="&url.articles.gjournal-desktop;">Implementing UFS Journaling on
	a Desktop PC</link> 以获得更多详细信息。</para>
  </sect1>
</chapter>