aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook/config/chapter.sgml
blob: a0e28d65195adf83065e5deab9816f0c0e16e8b8 (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
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!--
     The FreeBSD Documentation Project
     The FreeBSD Chinese Documentation Project

     Original Revision: 1.247
     $FreeBSD$
-->

<chapter id="config-tuning">
  <chapterinfo>
    <authorgroup>
      <author>
        <firstname>Chern</firstname>
	<surname>Lee</surname>
	<contrib>原作: </contrib>
      </author>
    </authorgroup>
    <authorgroup>
      <author>
        <firstname>Mike</firstname>
	<surname>Smith</surname>
	<contrib>这份文档基于一份教程, 其作者是 </contrib>
      </author>
    </authorgroup>
    <authorgroup>
      <author>
        <firstname>Matt</firstname>
	<surname>Dillon</surname>
	<contrib>此外, 也参考了 tuning(7), 其作者是 </contrib>
      </author>
    </authorgroup>
  </chapterinfo>

  <title>设置和调整</title>

  <sect1 id="config-synopsis">
    <title>概述</title>

    <indexterm><primary>系统配置</primary></indexterm>
    <indexterm><primary>系统优化</primary></indexterm>

    <para>使用 &os; 的一个重要问题是系统配置。
      正确地配置系统能充分地减少以后维护和升级系统所需的工作量。
      这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os;
      系统的一些参数。</para>

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

    <itemizedlist>
      <listitem>
	<para>如何有效地利用文件系统和交换分区。</para>
      </listitem>
      <listitem>
	<para><filename>rc.conf</filename> 的基本设置以及
	  <filename class="directory">/usr/local/etc/rc.d</filename> 启动体系。</para>
      </listitem>
      <listitem>
	<para>如何设置和测试网卡。</para>
      </listitem>
      <listitem>
	<para>如何在您的网络设备上配置虚拟主机。</para>
      </listitem>
      <listitem>
	<para>如何使用 <filename class="directory">/etc</filename> 下的各配置文件。</para>
      </listitem>
      <listitem>
	<para>如何通过 <command>sysctl</command> 变量来对 &os; 系统进行调优。</para>
      </listitem>
      <listitem>
	<para>怎样调整磁盘性能和修改内核限制。</para>
      </listitem>
    </itemizedlist>

    <para>在阅读本章之前,您应该了解:</para>

    <itemizedlist>
      <listitem>
	<para>了解 &unix;&os; 的基础知识
	  (<xref linkend="basics"/>)。</para>
      </listitem>
      <listitem>
	<para>熟悉内核配置编译的基础知识
	  (<xref linkend="kernelconfig"/>)。</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="configtuning-initial">
    <title>初步配置</title>

    <sect2>
      <title>分区规划</title>

      <indexterm><primary>分区规划</primary></indexterm>
      <indexterm>
        <primary><filename class="directory">/etc</filename></primary>
      </indexterm>
      <indexterm>
        <primary><filename class="directory">/var</filename></primary>
      </indexterm>
      <indexterm>
        <primary><filename class="directory">/usr</filename></primary>
      </indexterm>

      <sect3>
	<title>基本分区</title>

	<para>当使用 &man.bsdlabel.8; 或者 &man.sysinstall.8;
	  来分割您的文件系统的时候,
	  要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。
	  因此应该将小的和经常访问的文件系统放在驱动器靠外的位置,
	  一些大的分区比如 <filename class="directory">/usr</filename>
	  应该放在磁盘比较靠里的位置。
	  以类似这样的顺序建立分区是一个不错的主意:root,swap,
	  <filename class="directory">/var</filename><filename class="directory">/usr</filename></para>

	<para><filename class="directory">/var</filename> 分区的大小能反映您的机器使用情况。
	  <filename class="directory">/var</filename> 文件系统用来存储邮件,
          日志文件和打印队列缓存,
	  特别是邮箱和日志文件可能会达到无法预料的大小,
	  这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。
	  大多数用户很少需要 <filename class="directory">/var</filename>1GB 以上的闲置空间。</para>

        <note>
          <para>有时候 <filename class="directory">/var/tmp</filename> 需要很多的磁盘空间。
            在使用 &man.pkg.add.1; 安装新的软件时,包管理工具会在
            <filename class="directory">/var/tmp</filename> 中解压出一份临时拷贝。
            大的软件包,像 <application>Firefox</application><application>OpenOffice</application> 或者
            <application>LibreOffice</application>
            在安装时如果 <filename class="directory">/var/tmp</filename>
            中没有足够的空间就可能需要一些技巧了。</para>
        </note>

	<para><filename class="directory">/usr</filename>
          分区存储很多用来系统运行所需要的文件例如
	  &man.ports.7; (建议这样做) 和源代码 (可选的)。
          ports 和基本系统的源代码在安装时都是可选的,
	  但我们建议给这个分区至少保留 2GB 的可用空间。</para>

	<para>当选择分区大小的时候,记住保留一些空间。
	  用完了一个分区的空间而在另一个分区上还有很多,
	  可能会导致出现一些错误。</para>

	<note><para>一些用户会发现 &man.sysinstall.8; 的
	  <literal>Auto-defaults</literal> 自动分区有时会分配给
	  <filename class="directory">/var</filename><filename class="directory">/</filename> 较小的分区空间。
	  分区应该精确一些并且大一些。</para></note>
      </sect3>

      <sect3 id="swap-design">
	<title>交换分区</title>

	<indexterm><primary>交换分区分配</primary></indexterm>
	<indexterm><primary>交换分区</primary></indexterm>

	<para>一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。
	  例如,如果机器有 128M 内存,交换文件应该是 256M。
	  较小内存的系统可以通过多一点地交换分区来提升性能。
	  不建议小于 256&nbsp;兆的交换分区,并且扩充您的内存应该被考虑一下。
	  当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存)
	  页面调度算法可以将性能调整到最好。如果您给机器添加更多内存,
	  配置太小的交换分区会导致 VM 页面扫描的代码效率低下。</para>

	<para>在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上,
	  建议在每个驱动器上建立交换分区(直到四个驱动器)。
	  交换分区应该大约一样大小。内核可以使用任意大小,
	  但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小,
	  可以允许内核最佳地调度交换空间来访问磁盘。
	  即使不太使用,分配大的交换分区也是好的,
	  在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。</para>
      </sect3>

      <sect3>
	<title>为什么要分区?</title>

	<para>一些用户认为一个单独的大分区将会很好,
	  但是有很多原因会证明为什么这是个坏主意。首先,
	  每个分区有不同的分区特性,因此分开可以让文件系统调整它们。
	  例如,根系统和 <filename class="directory">/usr</filename> 一般只是读取,写入很少。
	  很多读写频繁的被放在 <filename class="directory">/var</filename><filename class="directory">/var/tmp</filename>中。</para>

	<para>适当的划分一个系统, 在其中使用较小的分区, 这样,
	  那些以写为主的分区将不会比以读为主的分区付出更高的代价。
	  将以写为主的分区放在靠近磁盘的边缘,
	  例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的
	  I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能,
	  把他们移动到磁盘外围不会带来多大的性能提升,反而把
	  <filename class="directory">/var</filename> 移到外面会有很好的效果。最后涉及到安全问题。
	  一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。
        </para>
      </sect3>
    </sect2>

  </sect1>

  <sect1 id="configtuning-core-configuration">
    <title>核心配置</title>

    <indexterm>
      <primary>rc 文件</primary>
      <secondary><filename>rc.conf</filename></secondary>
    </indexterm>

    <para>系统的配置信息主要位于 <filename>/etc/rc.conf</filename>。
      这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统,
      这个名字直接说明了这点;它也是 <filename>rc*</filename>
      文件的配置信息。</para>

    <para>系统管理员应该在 <filename>rc.conf</filename> 文件中建立记录来覆盖
      <filename>/etc/defaults/rc.conf</filename> 中的默认设置。
      这个默认文件不应该被逐字的复制到
      <filename class="directory">/etc</filename> —— 它包含的是默认值而不是一个例子。
      所有特定的改变应该在 <filename>rc.conf</filename> 中。</para>

    <para>在集群应用中,为了降低管理成本,
      可以采用多种策略把涉及全站范围的设置从特定于系统的设置中分离出来。
      推荐的方法是把系统范围的配置放到
      <filename>/etc/rc.conf.local</filename> 文件中。
      例如:</para>

    <itemizedlist>
      <listitem><para><filename>/etc/rc.conf</filename>:</para>

      <programlisting>sshd_enable="YES"
keyrate="fast"
defaultrouter="10.1.1.254"</programlisting></listitem>

      <listitem><para><filename>/etc/rc.conf.local</filename>:</para>

<programlisting>hostname="node1.example.org"
ifconfig_fxp0="inet 10.1.1.1/8"</programlisting></listitem>
    </itemizedlist>

    <para><filename>rc.conf</filename> 文件可以通过
      <command>rsync</command> 或类似的程序来分发到所有的机器上,
      而各自的 <filename>rc.conf.local</filename> 文件则保持不变。</para>

    <para>使用 &man.sysinstall.8; 或者 <command>make world</command>
      来升级系统不会覆盖 <filename>rc.conf</filename>
      文件, 所以系统配置信息不会丢失。</para>

    <tip>
      <para>配置文件 <filename>/etc/rc.conf</filename>
	是通过 &man.sh.1; 解析的。 这使得系统管理员可以在其中添加一些逻辑,
	从而创建能够适应非常复杂的场景的配置。 请参阅联机手册
	&man.rc.conf.5; 来了解关于这一话题的进一步信息。</para>
    </tip>
  </sect1>

  <sect1 id="configtuning-appconfig">
    <title>应用程序配置</title>

    <para>典型的,被安装的应用程序有他自己的配置文件、语法等等。
      从基本系统中分开他们是很重要的以至于他们可以容易的被
      package 管理工具定位和管理</para>

    <indexterm><primary>/usr/local/etc</primary></indexterm>

    <para>一般来说,这些文件被安装在
      <filename class="directory">/usr/local/etc</filename>。这个例子中,
      一个应用程序有很多配置文件并且创建了一个子目录来存放他们。</para>

    <para>通常,当一个 port 或者 package 被安装的时候,
      配置文件示例也同样被安装了。它们通常用 <filename>.default</filename>
      的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制
      <filename>.default</filename> 文件来创建。</para>

    <para>例如,看一下这个目下的内容
      <filename class="directory">/usr/local/etc/apache</filename></para>

<literallayout class="monospaced">-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf
-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf.default
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf.default
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic.default
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types.default
-rw-r--r--  1 root  wheel   7980 May 20  1998 srm.conf
-rw-r--r--  1 root  wheel   7933 May 20  1998 srm.conf.default</literallayout>

    <para>文件大小显示了只有 <filename>srm.conf</filename> 改变了。以后
      <application>Apache</application> 的升级就不会改变这个文件。</para>

  </sect1>

  <sect1 id="configtuning-starting-services">
    <sect1info>
      <authorgroup>
        <author>
	<firstname>Tom</firstname>
	<surname>Rhodes</surname>
	<contrib>Contributed by </contrib>
	</author>
      </authorgroup>
    </sect1info>

    <title>启动服务</title>

    <indexterm><primary>服务</primary></indexterm>

    <para>许多用户会选择使用 Ports Collection 来在 &os; 上安装第三方软件。
      很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务,
      例如 <filename role="package">mail/postfix</filename><filename role="package">www/apache13</filename>
      就是这些需要在系统初始化时启动的软件包中的两个典型代表。
      这一节解释了启动第三方软件所需要的步骤。</para>

    <para>&os; 包含的大多数服务,例如 &man.cron.8;,
      就是通过系统启动脚本启动的。 这些脚本也许会有些不同,
      这取决于 &os; 版本。 但是不管怎样,
      需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。</para>

    <sect2>
      <title>扩展应用程序配置</title>

      <para>现在 &os; 提供了 <filename>rc.d</filename>,
	这使得对应用软件的启动进行配置变得更加方便,
	并提供了更多的其他功能。 例如, 使用在
	<link linkend="configtuning-rcd">rc.d</link> 一节中所介绍的关键字,
	应用程序就可以设置在某些其他服务,
	例如 <acronym>DNS</acronym> 之后启动; 除此之外,
	还可以通过 <filename>rc.conf</filename> 来指定一些额外的启动参数,
	而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示:</para>

      <programlisting>#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name=utility
rcvar=utility_enable

command="/usr/local/sbin/utility"

load_rc_config $name

#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
pidfile=${utility_pidfile-"/var/run/utility.pid"}

run_rc_command "$1"</programlisting>

      <para>这个脚本将保证
	<application>utility</application> 能够在
	<literal>DAEMON</literal> 服务之后启动。 它同时也提供了设置和跟踪
	<acronym>PID</acronym>, 也就是进程
	<acronym>ID</acronym> 文件的方法。</para>

      <para>可以在 <filename>/etc/rc.conf</filename> 中加入:</para>

      <programlisting>utility_enable="YES"</programlisting>

      <para>这个方法也使得命令行参数、包含 <filename>/etc/rc.subr</filename>
	中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过
	<filename>rc.conf</filename> 文件来配置的方法。</para>
    </sect2>

    <sect2>
      <title>用服务来启动服务</title>

      <para>其他服务, 例如 <acronym>POP</acronym>3
	服务器, <acronym>IMAP</acronym>, 等等,
	也可以通过 &man.inetd.8; 来启动。 这一过程包括从
	Ports Collection 安装相应的应用程序,
	并把配置加入到 <filename>/etc/inetd.conf</filename> 文件,
	或去掉当前配置中的某些注释。
	如何使用和配置 <application>inetd</application><link linkend="network-inetd">inetd</link> 一节中进行了更为深入的阐述。</para>

      <para>一些情况下, 通过
	&man.cron.8; 来启动系统服务也是一种可行的选择。
	这种方法有很多好处, 因为 <command>cron</command> 会以
	<filename>crontab</filename> 的文件属主身份执行那些进程。
	这使得普通用户也能够执行他们的应用。</para>

      <para><command>cron</command> 工具提供了一个独有的功能, 以
	<literal>@reboot</literal> 来指定时间。
	这样的设置将在 &man.cron.8; 启动时运行,
	通常这也是系统初始化的时候。</para>
    </sect2>
  </sect1>

  <sect1 id="configtuning-cron">
    <sect1info>
      <authorgroup>
        <author>
	<firstname>Tom</firstname>
	<surname>Rhodes</surname>
	<contrib>Contributed by </contrib>
	<!-- 20 May 2003 -->
	</author>
      </authorgroup>
    </sect1info>
    <title>配置 <command>cron</command></title>

    <indexterm><primary>cron</primary>
      <secondary>配置</secondary></indexterm>

    <para>&os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。
      <command>cron</command> 软件在后台运行并且经常检查
      <filename>/etc/crontab</filename> 文件。<command>cron</command>
      软件也检查 <filename class="directory">/var/cron/tabs</filename> 目录,搜索新的
      <filename>crontab</filename> 文件。这些 <filename>crontab</filename>
      文件存储一些 <command>cron</command> 在特定时间执行任务的信息。</para>

    <para><command>cron</command> 程序使用两种不同类型的配置文件,
      即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。
      在系统 crontab 中,第六个字段是用于执行命令的用户名。
      这给予了系统 crontab 以任意用户身份执行命令的能力。
      在用户 crontab 中, 第六个字段是要执行的命令,
      所有的命令都会以这个用户自己的身份执行;
      这是一项重要的安全功能。</para>

    <note>
      <para>同其他用户一样, <username>root</username> 用户也可以有自己的
        crontab。 它不同于
        <filename>/etc/crontab</filename> (也就是系统 crontab)。
        由于有系统 crontab 的存在, 通常并不需要给
        <username>root</username> 建立单独的用户 crontab。</para>
    </note>

    <para>让我们来看一下 <filename>/etc/crontab</filename> 文件:</para>


    <programlisting># /etc/crontab - root's crontab for &os;
#
# &dollar;&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp &dollar;
# <co id="co-comments"/>
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <co id="co-env"/>
HOME=/var/log
#
#
#minute	hour	mday	month	wday	who	command <co id="co-field-descr"/>
#
#
*/5	*	*	*	*	root	/usr/libexec/atrun <co id="co-main"/>
</programlisting>

    <calloutlist>
      <callout arearefs="co-comments">
	<para>像大多数 &os; 配置文件一样,<literal>#</literal> 字符是注释。
	  这样, 就可以编写注释来说明要执行什么操作, 以及这样做的原因。
	  需要注意的是, 注释应该另起一行, 而不能跟命令放在同一行上,
	  否则它们会被看成命令的一部分。 这个文件中的空行会被忽略。</para>
      </callout>

      <callout arearefs="co-env">
	<para>首先应该定义环境变量。等号
	  (<literal>=</literal>) 字符用来定义任何环境变量,像这个例子用到了
	  <envar>SHELL</envar><envar>PATH</envar><envar>HOME</envar>
	  变量。如果 shell 行被忽略掉,<command>cron</command> 将会用默认值
	  <command>sh</command>。如果 <option>PATH</option> 变量被忽略,
	  那么就没有默认值并且需要指定文件绝对位置。如果 <option>HOME</option>
	  被忽略,<command>cron</command> 将用用执行者的 home 目录。</para>
      </callout>

      <callout arearefs="co-field-descr">
	<para>这一行定义了七个字段。它们是 <literal>minute</literal><literal>hour</literal><literal>mday</literal><literal>month</literal><literal>wday</literal><literal>who</literal><literal>command</literal>。
	  它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour
	  跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour
	  还有 minute 都差不多,用月份来表示。wday 字段表示星期几。
	  所有这些字段的值必须是数字并且用24小时制来表示。<quote>who</quote>
	  字段是特别的,并且只在 <filename>/etc/crontab</filename> 文件中存在。
	  这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的
	  <filename>crontab</filename> 文件的时候,他们就会没有这个字段选项。最后,是
	  <literal>command</literal> 字段。这是最后的一个字段,
	  所以自然就是它指定要运行的程序。</para>
      </callout>

      <callout arearefs="co-main">
	<para>最后一行定义了上面所说的值。注意这里我们有一个
	  <literal>*/5</literal> 列表,紧跟着是一些 <literal>*</literal>
	  字符。<literal>*</literal> 字符代表<quote>开始到最后</quote>,
	  也可以被解释成 <emphasis>每次</emphasis>。所以,根据这行,
	  显然表明了无论在何时每隔 5 分钟以 <username>root</username>
	  身份来运行 <command>atrun</command> 命令。查看 &man.atrun.8;
	  手册页以获得 <command>atrun</command> 的更多信息。</para>

	<para>命令可以有任意多个传递给它们的标志。无论怎样,
	  扩展到多行的命令应该用反斜线(<quote>\</quote>)来续行。</para>
      </callout>
    </calloutlist>

    <para>这是每个 <filename>crontab</filename> 文件的基本设置,
      虽然它们有一个不同。第六行我们指定的用户名只存在于系统
      <filename>/etc/crontab</filename> 文件。这个字段在普通用户的
      <filename>crontab</filename> 文件中应该被忽略。</para>


    <sect2 id="configtuning-installcrontab">
      <title>安装 Crontab</title>

      <important>
      <para>绝对不要用这种方法来编辑/安装系统 crontab。
	您需要做的只是使用自己喜欢的编辑器:
	<command>cron</command> 程序会注意到文件发生了变化,
	并立即开始使用新的版本。参见
	<ulink url="&url.books.faq;/admin.html#ROOT-NOT-FOUND-CRON-ERRORS">
	这个 FAQ 项目 </ulink> 以了解进一步的情况。</para>
      </important>

      <para>要安装刚写好的用户
	<filename>crontab</filename>,
	首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用
	<command>crontab</command> 程序来完成。最常见的用法是:</para>

      <screen>&prompt.user; <userinput>crontab crontab-file</userinput></screen>
      
      <para>在前面的例子中, <filename>crontab-file</filename> 是一个事先写好的
    <filename>crontab</filename></para>

      <para>还有一个选项用来列出安装的 <filename>crontab</filename> 文件:
	只要传递 <option>-l</option> 选项给 <command>crontab</command>
	然后看一下输出。</para>

      <para>用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用
	<command>crontab -e</command> 选项也是可以的。
	它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候,
	它会自动的用 <command>crontab</command> 来安装这个文件。
      </para>
      
      <para>如果您稍后想要彻底删除自己的用户 <filename>crontab</filename>
	可以使用 <command>crontab</command><option>-r</option>
	选项。
      </para>

    </sect2>
  </sect1>

  <sect1 id="configtuning-rcd">
    <sect1info>
      <authorgroup>
        <author>
	 <firstname>Tom</firstname>
	 <surname>Rhodes</surname>
	 <contrib>Contributed by </contrib>
	 <!-- 16 May 2003 -->
        </author>
      </authorgroup>
    </sect1info>

    <title>&os; 中使用 rc</title>

    <para>2002 年, &os; 整合了来自 NetBSD 的
      <filename>rc.d</filename> 系统, 并通过它来完成系统的初始化工作。
      用户要注意在
      <filename class="directory">/etc/rc.d</filename> 目录下的文件。
      这里面的许多文件是用来管理基础服务的, 它们可以通过
      <option>start</option><option>stop</option>,
      以及 <option>restart</option> 选项来控制。
      举例来说, &man.sshd.8; 可以通过下面的命令来重启:</para>

    <screen>&prompt.root; <userinput>/etc/rc.d/sshd restart</userinput></screen>

    <para>对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据
      &man.rc.conf.5; 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务,
      可以简单地通过在 <filename>/etc/rc.conf</filename> 中加入如下设置来完成:</para>

    <programlisting>natd_enable="YES"</programlisting>

    <para>如果 <option>natd_enable="NO"</option> 行已经存在,
      只要简单的把 <option>NO</option> 改成 
      <option>YES</option> 即可。
      rc 脚本在下次重新启动的时候会自动的装载所需要的服务,
      像下面所描述的那样。</para>

    <para>由于 <filename>rc.d</filename>
      系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的
      <filename>/etc/rc.conf</filename> 变量,标准的
      <option>start</option><option>stop</option><option>restart</option> 选项将会执行他们的动作。例如
      <command>sshd restart</command> 命令只在 <filename>/etc/rc.conf</filename>
      中的 <varname>sshd_enable</varname> 设置成 <option>YES</option>
      的时候工作。不管是否在 <filename>/etc/rc.conf</filename> 中设置了,要
      <option>start</option><option>stop</option> 或者 <option>restart</option>
      一个服务,命令前可以加上一个<quote>one</quote>前缀。例如要不顾当前
      <filename>/etc/rc.conf</filename> 的设置重新启动
      <command>sshd</command>,执行下面的命令:</para>

    <screen>&prompt.root; <userinput>/etc/rc.d/sshd onerestart</userinput></screen>

    <para>用选项 <option>rcvar</option> 可以简单来的检查
      <filename>/etc/rc.conf</filename> 中用适当的 <filename>rc.d</filename>
      脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查
      <command>sshd</command> 是否真的在 <filename>/etc/rc.conf</filename>
      中被启动了:</para>

    <screen>&prompt.root; <userinput>/etc/rc.d/sshd rcvar</userinput>
# sshd
$sshd_enable=YES</screen>

    <note>
      <para>第二行 (<literal># sshd</literal>) 是从
	<command>sshd</command> 命令中输出的,而不是
	<username>root</username> 控制台。</para>
    </note>

    <para>为了确定一个服务是否真的在运行,可以用 <option>status</option>
      选项。例如验证 <command>sshd</command> 是否真的启动了:</para>

    <screen>&prompt.root; <userinput>/etc/rc.d/sshd status</userinput>
sshd is running as pid 433.</screen>

    <para>有些时候也可以 <option>reload</option> 服务。
      这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。
      多数情况下, 发给服务的会是 <literal>SIGHUP</literal>
      信号。 并非所有服务都支持这一功能。</para>

    <para><filename>rc.d</filename> 系统不仅用于网络服务,
      它也为系统初始化中的多数过程提供支持。
      比如 <filename>bgfsck</filename> 文件, 当它被执行时,
      将会给出下述信息:</para>

    <screen>Starting background file system checks in 60 seconds.</screen>

    <para>这个文件用做后台文件系统检查,系统初始化的时候完成。</para>

    <para>很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于
      RPC 的服务启动可能在 <command>rpcbind</command> 服务启动之前失败。
      要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。
      程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。</para>

    <para>下面的字句必须被包含在所有的启动脚本文件里,
      (他们都是 &man.rc.subr.8; 用来 <quote>enable</quote>
      启动脚本必需的):</para>

    <itemizedlist>
      <listitem>
	<para><literal>PROVIDE</literal>: 指定此文件所提供的服务的名字。</para>
      </listitem>
    </itemizedlist>

    <para>以下的字句可以被包含在启动文件的顶部。严格来说他们不是必需的,
      但作为对于 &man.rcorder.8; 有一定的提示作用:</para>

    <itemizedlist>
      <listitem>
	<para><literal>REQUIRE</literal>: 列出此服务启动之前所需要的其他服务。
	  此脚本提供的服务会在指定的那些服务 <emphasis>之后</emphasis>
	  启动。</para>
      </listitem>

      <listitem>
	<para><literal>BEFORE</literal>: 列出依赖此服务的其他服务。
	  此脚本提供的服务将在指定的那些服务 <emphasis>之前</emphasis>
	  启动。</para>
      </listitem>
    </itemizedlist>

    <para>通过在启动脚本中仔细设定这些关键字,
      系统管理员可以很有条理的控制脚本的启动顺序,
      进而避免使用像其他 &unix; 操作系统那样混乱的
      <quote>runlevels</quote></para>

    <para>更多关于 <filename>rc.d</filename> 系统的信息, 可以在
      &man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。
      如果您有意撰写自己的 <filename>rc.d</filename> 脚本,
      或对现有的脚本进行一些改进, 也可以参考
      <ulink url="&url.articles.rc-scripting">这篇文章</ulink></para>
  </sect1>

  <sect1 id="config-network-setup">
    <sect1info>
      <authorgroup>
        <author>
	 <firstname>Marc</firstname>
	 <surname>Fonvieille</surname>
	 <contrib>Contributed by </contrib>
	 <!-- 6 October 2002 -->
        </author>
      </authorgroup>
    </sect1info>

    <title>设置网卡</title>

    <indexterm>
      <primary>网卡</primary>
      <secondary>配置</secondary>
    </indexterm>

    <para>现在我们不可想象一台计算机没有网络连接的情况。
      添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。
    </para>

    <sect2>
      <title>查找正确的驱动程序</title>

      <indexterm>
	<primary>网卡</primary>
	<secondary>驱动程序</secondary>
      </indexterm>

      <para>在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI
	还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。
	可以查看您的版本硬件兼容性列表以确定您的网卡被支持。
      </para>

      <para>确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。
	<filename>/usr/src/sys/conf/NOTES</filename><filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/NOTES</filename>
	将为您提供所支持的一些网卡和芯片组的信息。
	如果您怀疑驱动程序是否使所要找的那一个,
	请参考驱动程序的联机手册。
	联机手册将提供关于所支持的硬件更详细的信息,
	甚至还包括可能发生的问题。</para>

      <para>如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。
	常用的网卡在 <filename>GENERIC</filename> 内核中已经支持了,
	所以您的网卡在启动时就会显示出来,像是:</para>

<screen>dc0: &lt;82c169 PNIC 10/100BaseTX&gt; port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
miibus0: &lt;MII bus&gt; on dc0
bmtphy0: &lt;BCM5201 10/100baseTX PHY&gt; PHY 1 on miibus0
bmtphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc0: Ethernet address: 00:a0:cc:da:da:da
dc0: [ITHREAD]
dc1: &lt;82c169 PNIC 10/100BaseTX&gt; port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
miibus1: &lt;MII bus&gt; on dc1
bmtphy1: &lt;BCM5201 10/100baseTX PHY&gt; PHY 1 on miibus1
bmtphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: Ethernet address: 00:a0:cc:da:da:db
dc1: [ITHREAD]</screen>

      <para>在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。</para>

      <para>如果您的网卡没有出现在
	<filename>GENERIC</filename> 中, 则需要手工加载合适的驱动程序。
	要完成这项工作可以使用下面两种方法之一:</para>

      <itemizedlist>
        <listitem>
	  <para>最简单的办法是用 &man.kldload.8; 加载网卡对应的内核模块。
	    除此之外, 通过在 <filename>/boot/loader.conf</filename>
	    文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。
	    不过, 并不是所有的网卡都能够通过这种方法提供支持;
	    ISA 网卡是比较典型的例子。</para>
	</listitem>

	<listitem>
	  <para>另外, 您也可以将网卡的支持静态联编进内核。 察看
	    <filename>/usr/src/sys/conf/NOTES</filename><filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/NOTES</filename>
	    以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。
	    要了解关于重新编译内核的进一步细节, 请参见 <xref
	    linkend="kernelconfig"/>。 如果您的卡在引导时可以被内核
	    (<filename>GENERIC</filename>) 识别,
	    您应该不需要编译新的内核。</para>
	</listitem>
      </itemizedlist>

      <sect3 id="config-network-ndis">
	<title>使用 &windows; NDIS 驱动程序</title>

	<indexterm><primary>NDIS</primary></indexterm>
	<indexterm><primary>NDISulator</primary></indexterm>
	<indexterm><primary>&windows; 驱动程序</primary></indexterm>
	<indexterm><primary>Microsoft Windows</primary></indexterm>
	<indexterm><primary>Microsoft Windows</primary>
	    <secondary>device drivers (设备驱动)</secondary></indexterm>
	<indexterm><primary>KLD (kernel loadable
	  object)</primary></indexterm>
<!-- We should probably omit the expanded name, and add a <see> entry
for it.  Whatever is done must also be done to the same indexterm in
linuxemu/chapter.sgml -->

	<para>不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密,
	  至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。
	  因此, &os; 和其他操作系统的开发者就只剩下了两种选择:
	  要么经历长时间的痛苦过程来对驱动进行逆向工程,
	  要么使用现存的为
	  &microsoft.windows; 平台提供的预编译版本的驱动程序。
	  包括参与 &os; 开发的绝大多数开发人员,
	  都选择了后一种方法。</para>

	<para>得益于 Bill Paul (wpaul) 的工作, 已经可以 <quote>直接地</quote>
	  支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。
	  &os; NDISulator (也被称为 Project Evil) 可以支持二进制形式的
	  &windows; 驱动程序, 并让它相信正在运行的是 &windows;。 由于
	  &man.ndis.4; 驱动使用的是用于 &windows; 的二进制形式的驱动,
	  因此它只能在 &i386; 和 amd64 系统上使用。</para>

	<note>
	  <para>&man.ndis.4; 驱动在设计时主要提供了
	    PCI、 CardBus 和 PCMCIA 设备的支持,
	    而 USB 设备目前则没有提供支持。</para>
	</note>

	<para>要使用 NDISulator, 您需要三件东西:</para>

	<orderedlist>
	 <listitem>
	  <para>内核的源代码</para>
	 </listitem>
	 <listitem>
	  <para>二进制形式的 &windowsxp; 驱动程序
	    (扩展名为 <filename>.SYS</filename>)</para>
	 </listitem>
	 <listitem>
	  <para>&windowsxp; 驱动程序配置文件
	    (扩展名为 <filename>.INF</filename>)</para>
	 </listitem>
	</orderedlist>

	<para>您需要找到用于您的卡的这些文件。 一般而言,
	  这些文件可以在随卡附送的 CD 或制造商的网站上找到。
	  在下面的例子中, 我们用
	  <filename>W32DRIVER.SYS</filename><filename>W32DRIVER.INF</filename> 来表示这些文件。</para>

	<note>
	  <para>不能在 &os;/amd64 上使用 &windows;/i386 驱动程序。
	    必须使用 &windows;/amd64 驱动才能在其上正常工作。</para>
	</note>

	<para>接下来的步骤是将二进制形式的驱动程序组装成内核模块。
	  要完成这一任务, 需要以
	  <username>root</username> 用户的身份执行 &man.ndisgen.8;:</para>

	<screen>&prompt.root; <userinput>ndisgen <replaceable>/path/to/W32DRIVER.INF</replaceable> <replaceable>/path/to/W32DRIVER.SYS</replaceable></userinput></screen>

	<para>&man.ndisgen.8; 是一个交互式的程序,
	  它会提示您输入所需的一些其他的额外信息;
	  这些工作完成之后, 它会在当前目录生成一个内核模块文件,
	  这个文件可以通过下述命令来加载:</para>

	<screen>&prompt.root; <userinput>kldload <replaceable>./W32DRIVER_SYS.ko</replaceable></userinput></screen>

	<para>除了刚刚生成的内核模块之外,
	  还必须加载 <filename>ndis.ko</filename><filename>if_ndis.ko</filename> 这两个内核模块, 在您加载需要
	  &man.ndis.4; 的模块时, 通常系统会自动完成这一操作。
	  如果希望手工加载它们, 则可以使用下列命令:</para>

	<screen>&prompt.root; <userinput>kldload ndis</userinput>
&prompt.root; <userinput>kldload if_ndis</userinput></screen>

	<para>第一个命令会加载  NDIS 袖珍端口驱动封装模块,
	  而第二条命令则加载实际的网络接口。</para>

	<para>现在请查看 &man.dmesg.8; 来了解是否发生了错误。
	  如果一切正常, 您会看到类似下面的输出:</para>

	<screen>ndis0: &lt;Wireless-G PCI Adapter&gt; mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps</screen>

	<para>这之后, 就可以像使用其它网络接口
	  (例如 <devicename>dc0</devicename>) 一样来使用
	  <devicename>ndis0</devicename> 设备了。</para>

	<para>与任何其它模块一样, 您也可以配置系统,
	  令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块
	  <filename>W32DRIVER_SYS.ko</filename> 复制到 <filename
	  class="directory">/boot/modules</filename> 目录中。
	  接下来, 在
	  <filename>/boot/loader.conf</filename> 中加入:</para>

	<programlisting>W32DRIVER_SYS_load="YES"</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>配置网卡</title>

      <indexterm>
	<primary>网卡</primary>
	<secondary>配置</secondary>
      </indexterm>

      <para>现在正确的网卡驱动程序已经装载,那么就应该配置它了。
	跟其他配置一样,网卡可以在安装时用
	<application> sysinstall </application> 来配置。</para>

      <para>要显示您系统上的网络接口的配置,输入下列命令:</para>

<screen>&prompt.user; <userinput>ifconfig</userinput>
dc0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
        options=80008&lt;VLAN_MTU,LINKSTATE&gt;
        ether 00:a0:cc:da:da:da
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX &lt;full-duplex&gt;)
        status: active
dc1: flags=8802&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
        options=80008&lt;VLAN_MTU,LINKSTATE&gt;
        ether 00:a0:cc:da:da:db
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        media: Ethernet 10baseT/UTP
        status: no carrier
plip0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; metric 0 mtu 16384
        options=3&lt;RXCSUM,TXCSUM&gt;
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3&lt;PERFORMNUD,ACCEPT_RTADV&gt;</screen>

      <para>在这个例子中,显示出了下列设备:</para>

      <itemizedlist>
	<listitem>
	  <para><devicename>dc0</devicename>: 第一个以太网接口
	    </para>
	</listitem>

	<listitem>
	  <para><devicename>dc1</devicename>: 第二个以太网接口
	    </para>
	</listitem>

	<listitem>
	  <para><devicename>plip0</devicename>: 并口 (如果系统中有并口的话)</para>
	</listitem>

	<listitem>
	  <para><devicename>lo0</devicename>: 回环设备</para>
	</listitem>
      </itemizedlist>

      <para>
	&os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如
	<devicename>sis2</devicename> 是系统中使用 &man.sis.4;
	驱动的第三块网卡。
     </para>

      <para>在这个例子中,<devicename>dc0</devicename>
	设备启用了。主要表现在:</para>

      <orderedlist>
	<listitem>
	  <para><literal>UP</literal> 表示这块网卡已经配置完成准备工作。</para>
	</listitem>

	<listitem>
	  <para>这块网卡有一个 Internet (<literal>inet</literal>) 地址
	    (这个例子中是 <hostid role="ipaddr">192.168.1.3</hostid>)。</para>
	</listitem>

	<listitem>
	  <para>它有一个有效的子网掩码 (<literal>netmask</literal><hostid role="netmask">0xffffff00</hostid> 等同于
	    <hostid role="netmask">255.255.255.0</hostid>)。</para>
	</listitem>

	<listitem>
	  <para>它有一个有效的广播地址 (这个例子中是
	    <hostid role="ipaddr">192.168.1.255</hostid>)。</para>
	</listitem>

	<listitem>
	  <para>网卡的 MAC  (<literal>ether</literal>) 地址是
	    <hostid role="mac">00:a0:cc:da:da:da</hostid></para>
	</listitem>

	<listitem>
	  <para>物理传输媒介模式处于自动选择状态
	    (<literal>media: Ethernet autoselect
	    (100baseTX &lt;full-duplex&gt;)</literal>)。我们看到
	    <devicename>dc1</devicename> 被配置成运行在
	    <literal>10baseT/UTP</literal> 模式下。
	    要了解驱动媒介类型的更多信息,
	    请查阅它们的使用手册。</para>
	</listitem>

	<listitem>
	  <para>连接状态 (<literal>status</literal>)是
	    <literal>active</literal>,也就是说连接信号被检测到了。对于
	    <devicename>dc1</devicename>,我们看到
	    <literal>status: no carrier</literal>。
	    这通常是网线没有插好。</para>
	</listitem>
      </orderedlist>

      <para>如果 &man.ifconfig.8; 的输出显示了类似于:</para>

<screen>dc0: flags=8843&lt;BROADCAST,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
        options=80008&lt;VLAN_MTU,LINKSTATE&gt;
        ether 00:a0:cc:da:da:da
        media: Ethernet autoselect (100baseTX &lt;full-duplex&gt;)
        status: active</screen>

      <para>的信息,那么就是还没有配置网卡。</para>

      <para>要配置网卡,您需要 <username>root</username> 权限。
	网卡配置可以通过使用 &man.ifconfig.8; 命令行方式来完成,
	但是这样每次启动都要做一遍。放置网卡配置信息的文件是
	<filename>/etc/rc.conf</filename></para>

      <para>用您自己喜欢的编辑器打开 <filename>/etc/rc.conf</filename>。
	并且您需要为每一块系统中存在的网卡添加一行,
	在我们的例子中,添加如下几行:</para>

<programlisting>ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"</programlisting>

      <para>用自己正确的设备名和地址来替换例子中的
	<devicename>dc0</devicename><devicename>dc1</devicename>
	等内容。您应该应该查阅网卡驱动和 &man.ifconfig.8;
	的手册页来了解各选项,也要查看一下 &man.rc.conf.5;
	帮助页来了解 <filename>/etc/rc.conf</filename> 的语法。</para>

      <para>如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。
	所以在添加新行前仔细检查一下 <filename>/etc/rc.conf</filename></para>

      <para>您也可能需要编辑
	<filename>/etc/hosts</filename> 来添加局域网中不同的机器名称和 IP
	地址, 如果它们不在那里的话。 请查看联机手册 &man.hosts.5;
	和 <filename>/usr/share/examples/etc/hosts</filename>
	以了解更多信息。</para>

      <note>
	<para>如果计划通过这台机器访问 Internet,
	  您还需要手工配置默认网关和域名解析服务器:</para>

	<screen>&prompt.root; <userinput>echo 'defaultrouter="<replaceable>your_default_router</replaceable>"' &gt;&gt; /etc/rc.conf</userinput>
&prompt.root; <userinput>echo 'nameserver <replaceable>your_DNS_server</replaceable>' &gt;&gt; /etc/resolv.conf</userinput></screen>
      </note>
    </sect2>

    <sect2>
      <title>测试和调试</title>

      <para>对 <filename>/etc/rc.conf</filename>
	做了必要的修改之后应该重启系统以应用对接口的修改,
	并且确认系统重启后没有任何配置错误。
	另外您也可以重启网络系统:</para>

      <screen>&prompt.root; <userinput>/etc/rc.d/netif restart</userinput></screen>

      <note>
	<para>如果在
	  <filename>/etc/rc.conf</filename> 中配置了默认网关,
	  还需要运行下面的命令:</para>

	<screen>&prompt.root; <userinput>/etc/rc.d/routing restart</userinput></screen>
      </note>

      <para>网络系统重启之后, 应测试网络接口。</para>

      <sect3>
	<title>测试以太网卡</title>

	<indexterm>
	  <primary>网卡</primary>
	  <secondary>测试</secondary>
	</indexterm>

	<para>为了确认网卡被正确的配置了,在这里我们要做两件事情。首先,
	  ping 自己的网络接口,接着 ping 局域网内的其他机器。</para>

	<para>首先测试本地接口:</para>

<screen>&prompt.user; <userinput>ping -c5 192.168.1.3</userinput>
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms</screen>

	<para>现在我们应该 ping 局域网内的其他机器:</para>

<screen>&prompt.user; <userinput>ping -c5 192.168.1.2</userinput>
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms</screen>

	<para>您如果您设置了 <filename>/etc/hosts</filename>
	  文件,也可以用机器名来替换 <hostid role="ipaddr">192.168.1.2</hostid>。</para>
      </sect3>

      <sect3>
	<title>调试</title>

      <indexterm>
	<primary>网卡</primary>
	<secondary>故障排除</secondary>
      </indexterm>

      <para>调试硬件和软件配置一直是一件头痛的事情,
	从最简单的开始可以减轻一些痛苦。
	例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗?
	是否使用了被 &os; 支持的网卡?
	在发送错误报告之前您应该查看一下硬件说明,
	升级 &os; 到最新的 STABLE 版本,
	看一下邮件列表或者在 Internet 上搜索一下。</para>

      <para>如果网卡工作了,
	但性能低下,应该好好阅读一下 &man.tuning.7; 联机手册。
	您也可以检查一下网络配置,
	不正确的设置会导致慢速的网络连接。</para>

      <para>一些用户可能会在一些网卡上经历一到两次
	<errorname>device timeouts</errorname>, 这通常是正常现象。
	如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。
	仔细检查网线连接, 或者换一块网卡。</para>

      <para>有时用户会看到少量 <errorname>watchdog timeout</errorname>
	错误。 这种情况要做的第一件事就是检查线缆连接。
	一些网卡需要支持总线控制的 PCI 插槽。
	在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。
	检查网卡和主板说明书来确定是不是这个问题。</para>

      <para><errorname>No route to host</errorname>
	通常发生在如果系统不能发送一个路由到目的主机的包的时候。
	这在没有指定默认路由或者网线没有插上时会发生。
	检查 <command>netstat -rn</command>
	的输出并确认有一个有效的路由能到达相应的主机。
	如果没有,请查阅 <xref linkend="advanced-networking"/>。</para>

      <para><errorname>ping: sendto: Permission denied</errorname>
	错误信息经常由防火墙的配置错误引起。
	如果 <command>ipfw</command> 在内核中启用了但是没有定义规则,
	那么默认的规则就是拒绝所有通讯,甚至 ping 请求!
	查阅 <xref linkend="firewalls"/> 以了解更多信息。</para>

      <para>有时网卡性能低下或者低于平均水平,
	这种情况最好把传输媒介模式从 <literal>autoselect</literal>
	改变为正确的传输介质模式。
	这通常对大多数硬件有用, 但可能不会解决所有人的问题。
	接着,检查所有网络设置,并且阅读 &man.tuning.7; 手册页。</para>

      </sect3>
    </sect2>
  </sect1>

  <sect1 id="configtuning-virtual-hosts">
    <title>虚拟主机</title>

    <indexterm><primary>虚拟主机</primary></indexterm>
    <indexterm><primary>IP 别名</primary></indexterm>

    <para> &os;  的一个很普通的用途是虚拟主机站点,
      一个服务器虚拟成很多服务器一样提供网络服务。
      这通过在一个接口上绑定多个网络地址来实现。</para>

    <para>一个特定的网络接口有一个<quote>真实</quote>的地址,
      也可能有一些<quote>别名</quote>地址。这些别名通常用
      <filename>/etc/rc.conf</filename> 中的记录来添加。</para>

    <para>一个 <devicename>fxp0</devicename> 的别名记录类似于:</para>

<programlisting>ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"</programlisting>

    <para>
      记住别名记录必须从 <literal>alias0</literal>
      开始并且按顺序递增(例如 <literal>_alias1</literal><literal>_alias2</literal>)。
      配置程序将会停止在第一个缺少的数字的地方。</para>

    <para>
      计算别名的子网掩码是很重要的,幸运的是它很简单。
      对于一个接口来说,必须有一个描述子网掩码的地址。
      任何在这个网段下的地址必须有一个全是 <literal>1</literal>
      的子网掩码(通常表示为
      <hostid role="netmask">255.255.255.255</hostid><hostid role="netmask">0xffffffff</hostid></para>

    <para>举例来说, 假设使用
      <devicename>fxp0</devicename> 连接到两个网络,
      分别是 <hostid role="ipaddr">10.1.1.0</hostid>,
      其子网掩码为 <hostid role="netmask">255.255.255.0</hostid>,
      以及 <hostid role="ipaddr">202.0.75.16</hostid>,
      其子网掩码为 <hostid role="netmask">255.255.255.240</hostid>。
      我们希望从 <hostid role="ipaddr">10.1.1.1</hostid><hostid role="ipaddr">10.1.1.5</hostid> 以及从
      <hostid role="ipaddr">202.0.75.17</hostid><hostid role="ipaddr">202.0.75.20</hostid> 的地址能够互相访问。
      如前所述, 只有两个网段中的第一个地址 (本例中,
      <hostid role="ipaddr">10.0.1.1</hostid><hostid role="ipaddr">202.0.75.17</hostid>) 应使用真实的子网掩码;
      其余的 (<hostid role="ipaddr">10.1.1.2</hostid><hostid role="ipaddr">10.1.1.5</hostid> 以及
      <hostid role="ipaddr">202.0.75.18</hostid><hostid role="ipaddr">202.0.75.20</hostid>) 则必须配置为使用
      <hostid role="netmask">255.255.255.255</hostid> 作为子网掩码。</para>

    <para>下面是根据上述描述所进行的 <filename>/etc/rc.conf</filename>
      配置:</para>

    <programlisting>ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"</programlisting>

  </sect1>

  <sect1 id="configtuning-configfiles">
    <title>配置文件</title>

    <sect2>
      <title><filename class="directory">/etc</filename> 布局</title>
      <para>在配置信息中有很多的目录,这些包括:</para>

      <informaltable frame="none" pgwide="1">
	<tgroup cols="2">
	  <colspec colwidth="1*"/>
	  <colspec colwidth="2*"/>

	  <tbody>
	    <row>
	      <entry><filename class="directory">/etc</filename></entry>
	      <entry>一般的系统配置信息。这儿的数据是与特定系统相关的。</entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/etc/defaults</filename></entry>
	      <entry>系统配置文件的默认版本。</entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/etc/mail</filename></entry>
	      <entry>额外的 &man.sendmail.8; 配置信息,其他 MTA 配置文件。
	      </entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/etc/ppp</filename></entry>
	      <entry>用于用户级和内核级 ppp 程序的配置。
	      </entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/etc/namedb</filename></entry>
	      <entry>&man.named.8; 数据的默认位置。通常 <filename>named.conf</filename> 和区域文件存放在这里。</entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/usr/local/etc</filename></entry>
	      <entry>被安装的应用程序配置文件。可以参考每个应用程序的子目录。</entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/usr/local/etc/rc.d</filename></entry>
	      <entry>被安装程序的 启动/停止 脚本。</entry>
	    </row>
	    <row>
	      <entry><filename class="directory">/var/db</filename></entry>
	      <entry>特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。</entry>
	    </row>
	  </tbody>
	</tgroup>
      </informaltable>
    </sect2>

    <sect2>
      <title>主机名</title>

      <indexterm><primary>主机名</primary></indexterm>
      <indexterm><primary>DNS</primary></indexterm>

      <sect3>
	<title><filename>/etc/resolv.conf</filename></title>

	<indexterm>
	  <primary><filename>resolv.conf</filename></primary>
	</indexterm>

	<para><filename>/etc/resolv.conf</filename> 指示了 &os; 如何访问域名系统(DNS)。</para>

	<para><filename>resolv.conf</filename> 中最常见的记录是:
	</para>

	<informaltable frame="none" pgwide="1">
	  <tgroup cols="2">
	  <colspec colwidth="1*"/>
	  <colspec colwidth="2*"/>

	    <tbody>
	      <row>
		<entry><literal>nameserver</literal></entry>
		<entry>按顺序要查询的名字服务器的 IP 地址,最多三个。</entry>
	      </row>
	      <row>
		<entry><literal>search</literal></entry>
		<entry>
		搜索机器名的列表。这通常由本地机器名的域决定。</entry>
	      </row>
	      <row>
		<entry><literal>domain</literal></entry>
		<entry>本地域名。</entry>
	      </row>
	    </tbody>
	  </tgroup>
	</informaltable>

	<para>一个典型的 <filename>resolv.conf</filename> 文件:</para>

	<programlisting>search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30</programlisting>

	<note><para>只能使用一个 <literal>search</literal><literal>domain</literal> 选项。</para></note>

	<para>如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP
	  服务器接受来的信息重写 <filename>resolv.conf</filename></para>
      </sect3>

      <sect3>
	<title><filename>/etc/hosts</filename></title>

	<indexterm><primary>主机</primary></indexterm>

	<para><filename>/etc/hosts</filename> 是 Internet
	  早期使用的一个简单文本数据库。
	  它结合 DNS 和 NIS 提供名字到 IP 地址的映射。
	  通过局域网连接的机器可以用这个简单的命名方案来替代设置一个
	  &man.named.8; 服务器。另外,<filename>/etc/hosts</filename>
	  也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。</para>

	<programlisting># &dollar;&os;&dollar;
#
#
# Host Database
#
# This file should contain the addresses and aliases for local hosts that
# share this file.  Replace 'my.domain' below with the domainname of your
# machine.
#
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
#
#
::1			localhost localhost.my.domain
127.0.0.1		localhost localhost.my.domain
#
# Imaginary network.
#10.0.0.2		myname.my.domain myname
#10.0.0.3		myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
#	10.0.0.0	-   10.255.255.255
#	172.16.0.0	-   172.31.255.255
#	192.168.0.0	-   192.168.255.255
#
# In case you want to be able to connect to the Internet, you need
# real official assigned numbers.  Do not try to invent your own network
# numbers but instead get one from your network provider (if any) or
# from your regional registry (ARIN, APNIC, LACNIC, RIPE NCC, or AfriNIC.)
#</programlisting>

	<para><filename>/etc/hosts</filename> 用简单的格式:</para>

	<programlisting>[Internet address] [official hostname] [alias1] [alias2] ...</programlisting>

	<para>例如:</para>

	<programlisting>10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2</programlisting>

	<para>参考 &man.hosts.5; 以获得更多信息。</para>
      </sect3>
    </sect2>

    <sect2>
      <title>日志文件配置</title>

      <indexterm><primary>日志文件</primary></indexterm>

      <sect3>
	<title><filename>syslog.conf</filename></title>

	<indexterm><primary>syslog.conf</primary></indexterm>

	<para><filename>syslog.conf</filename> 是 &man.syslogd.8; 程序的配置文件。
	它指出了的  <command>syslog</command> 哪种信息类型被存储在特定的日志文件中。</para>

	<programlisting># &dollar;&os;&dollar;
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manual page.
*.err;kern.debug;auth.notice;mail.crit          /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.*                                      /var/log/security
mail.info                                       /var/log/maillog
lpr.info                                        /var/log/lpd-errs
cron.*                                          /var/log/cron
*.err                                           root
*.notice;news.err                               root
*.alert                                         root
*.emerg                                         *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote log host named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
!startslip
*.*                                             /var/log/slip.log
!ppp
*.*                                             /var/log/ppp.log</programlisting>

	<para>参考 &man.syslog.conf.5; 手册页以获得更多信息</para>
      </sect3>

      <sect3>
	<title><filename>newsyslog.conf</filename></title>

	<indexterm><primary>newsyslog.conf</primary></indexterm>

	<para><filename>newsyslog.conf</filename> 是一个通常用
	  &man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。
	  &man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。
	  比如 <filename>logfile</filename> 被移动到
	  <filename>logfile.0</filename><filename>logfile.0</filename>
	  被移动到 <filename>logfile.1</filename> 等等。另外,日志文件可以用
	  &man.gzip.1; 来压缩,它们是这样的命名格式:
	  <filename>logfile.0.gz</filename><filename>logfile.1.gz</filename>
	  等等。</para>

	<para><filename>newsyslog.conf</filename>
	  指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。
	  日志文件可以在它们达到一定大小或者在特定的日期被重新整理。</para>

	<programlisting># configuration file for newsyslog
# &dollar;&os;&dollar;
#
# filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron                           600  3     100  *     Z
/var/log/amd.log                        644  7     100  *     Z
/var/log/kerberos.log                   644  7     100  *     Z
/var/log/lpd-errs                       644  7     100  *     Z
/var/log/maillog                        644  7     *    @T00  Z
/var/log/sendmail.st                    644  10    *    168   B
/var/log/messages                       644  5     100  *     Z
/var/log/all.log                        600  7     *    @T00  Z
/var/log/slip.log                       600  3     100  *     Z
/var/log/ppp.log                        600  3     100  *     Z
/var/log/security                       600  10    100  *     Z
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/daily.log                      640  7     *    @T00  Z
/var/log/weekly.log                     640  5     1    $W6D0 Z
/var/log/monthly.log                    640  12    *    $M1D0 Z
/var/log/console.log                    640  5     100  *     Z</programlisting>

	<para>参考 &man.newsyslog.8; 手册页以获得更多信息。</para>
      </sect3>
    </sect2>

    <sect2 id="configtuning-sysctlconf">
      <title><filename>sysctl.conf</filename></title>

      <indexterm><primary>sysctl.conf</primary></indexterm>
      <indexterm><primary>sysctl</primary></indexterm>

      <para><filename>sysctl.conf</filename><filename>rc.conf</filename> 这两个文件的风格很接近。 其中的配置均为
	<literal>变量=值</literal>
	这样的形式。 在这个文件中配置的值, 均会在系统进入多用户模式之后进行实际的修改操作。
	需要注意的是, 并不是所有的变量都能够在多用户模式下修改。</para>

      <para>如果希望关闭对收到致命的信号退出的进程进行记录,
	并阻止普通用户看到其他用户的进程, 可以在 <filename>sysctl.conf</filename>
	中进行下列配置:</para>

      <programlisting># 不记录由于致命信号导致的进程退出 (例如信号 11,访问越界)
kern.logsigexit=0

# 阻止用户看到以其他用户 UID 身份执行的进程。
security.bsd.see_other_uids=0</programlisting>
    </sect2>
  </sect1>

  <sect1 id="configtuning-sysctl">
    <title>用 sysctl 进行调整</title>

    <indexterm><primary>sysctl</primary></indexterm>
    <indexterm>
      <primary>调整</primary>
      <secondary>以 sysctl</secondary>
    </indexterm>

    <para>&man.sysctl.8; 是一个允许您改变正在运行中的 &os;
      系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项,
      这可以让有经验的管理员提高引人注目的系统性能。用
      &man.sysctl.8; 可以读取设置超过五百个系统变量。</para>

    <para>基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。</para>

    <para>查看所有可读变量:</para>

    <screen>&prompt.user; <userinput>sysctl -a</userinput></screen>

    <para>读一个指定的变量,例如 <varname>kern.maxproc</varname></para>

    <screen>&prompt.user; <userinput>sysctl kern.maxproc</userinput>
kern.maxproc: 1044</screen>

    <para>要设置一个指定的变量,直接用
      <replaceable>variable</replaceable>=<replaceable>value</replaceable>
      这样的语法:</para>

    <screen>&prompt.root; <userinput>sysctl kern.maxfiles=5000</userinput>
kern.maxfiles: 2088 -&gt; 5000</screen>

    <para>sysctl 变量的设置通常是字符串、数字或者布尔型。
      (布尔型用 <literal>1</literal> 来表示'yes',用
      <literal>0</literal> 来表示'no')。</para>

    <para>如果你想在每次机器启动时自动设置某些变量,
      可将它们加入到文件 <filename>/etc/sysctl.conf</filename>
      之中。更多信息,请参阅手册页 &man.sysctl.conf.5; 及
      <xref linkend="configtuning-sysctlconf"/></para>

  <sect2 id="sysctl-readonly">
    <sect2info>
      <authorgroup>
        <author>
	 <firstname>Tom</firstname>
	 <surname>Rhodes</surname>
	 <contrib>Contributed by </contrib>
	 <!-- 31 January 2003 -->
        </author>
      </authorgroup>
    </sect2info>
    <title>只读的 &man.sysctl.8;</title>

    <para>有时可能会需要修改某些只读的 &man.sysctl.8;
      的值。 尽管有时不得不这样做,
      但只有通过(重新)启动才能达到这样的目的。</para>

    <para>例如一些膝上型电脑的 &man.cardbus.4;
      设备不会探测内存范围,并且产生看似于这样的错误:</para>

    <screen>cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12</screen>

    <para>像上面的错误通常需要修改一些只读的 &man.sysctl.8;
      默认设置。要实现这点,用户可以在本地的
      <filename>/boot/loader.conf.local</filename> 里面放一个
      &man.sysctl.8; <quote>OIDs</quote>。那些设置定位在
      <filename>/boot/defaults/loader.conf</filename> 文件中。</para>

    <para>修复上面的问题用户需要在刚才所说的文件中设置
      <option>hw.pci.allow_unsupported_io_range=1</option>。现在
      &man.cardbus.4; 就会正常的工作了。</para>

    </sect2>
  </sect1>

  <sect1 id="configtuning-disk">
    <title>调整磁盘</title>

    <sect2>
      <title>Sysctl 变量</title>

      <sect3>
	<title><varname>vfs.vmiodirenable</varname></title>

	<indexterm>
	  <primary><varname>vfs.vmiodirenable</varname></primary>
	</indexterm>

	<para><varname>vfs.vmiodirenable</varname> sysctl
	  变量可以设置成0(关)或者1(开);默认是1。
	  这个变量控制目录是否被系统缓存。大多数目录是小的,
	  在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小
	  (典型的是512字节)。当这个变量设置为关闭 (<literal>0</literal>) 时,
	  缓存器仅仅缓存固定数量的目录,即使您有很大的内存。
	  而将其开启 (设置为1) 时, 则允许缓存器用 VM
	  页面缓存来缓存这些目录,让所有可用内存来缓存目录。
	  不利的是最小的用来缓存目录的核心内存是大于 512
	  字节的物理页面大小(通常是 4k)。
	  我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。
	  这些服务包括 web 缓存,大容量邮件系统和新闻系统。
	  尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。
	  但还是应该检验一下。</para>
      </sect3>

     <sect3>
 	<title><varname>vfs.write_behind</varname></title>

 	<indexterm>
 	  <primary><varname>vfs.write_behind</varname></primary>
 	</indexterm>

 	<para><varname>vfs.write_behind</varname> sysctl
	  变量默认是 <literal>1</literal> (打开)。
	  它告诉文件系统簇被收集满的时候把内容写进介质,
	  典型的是在写入大的连续的文件时。
	  主要的想法是, 如果可能对 I/O 性能会产生负面影响时,
 	  应尽量避免让缓冲缓存被未同步缓冲区充满。
	  然而它可能降低处理速度并且在某些情况下您可能想要关闭它。</para>
       </sect3>

       <sect3>
 	<title><varname>vfs.hirunningspace</varname></title>

 	<indexterm>
 	  <primary><varname>vfs.hirunningspace</varname></primary>
 	</indexterm>

 	<para><varname>vfs.hirunningspace</varname> sysctl
	  变量决定了在任何给定情况下,
	  有多少写 I/O 被排进队列以给系统的磁盘控制器。
	  默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成
	  4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。
	  不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。</para>

 	<para>sysctl 中还有许多与 buffer cache 和 VM页面 cache
	  有关的值, 一般不推荐修改它们。
	  虚拟内存系统已经能够很好地进行自动调整了。</para>
       </sect3>

       <sect3>
 	<title><varname>vm.swap_idle_enabled</varname></title>

 	<indexterm>
 	  <primary><varname>vm.swap_idle_enabled</varname></primary>
 	</indexterm>

 	<para><varname>vm.swap_idle_enabled</varname> sysctl
	  变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。
	  这些系统注重在空闲的内存中间产生连续压力的处理。通过
	  <varname>vm.swap_idle_threshold1</varname><varname>vm.swap_idle_threshold2</varname> 打开这个特性并且调整交换滞后
	  (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页
	  (pageout)算法更快。这给出页守护进程带来了帮助。
	  除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存,
	  因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果,
	  但是在大的系统上它已经做了合适的页面调度这个选项允许 VM
	  系统容易的让全部的进程进出内存。</para>
       </sect3>

      <sect3>
	<title><varname>hw.ata.wc</varname></title>

	<indexterm>
	  <primary><varname>hw.ata.wc</varname></primary>
	</indexterm>

	<para>&os;&nbsp;4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE
	  磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的,
	  可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE
	  硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时,
	  IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时,
	  它甚至会自作主张地对推迟某些块的实际写操作。 这样一来,
	  在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。
	  基于这些考虑, 我们将 &os; 的默认配置改成了更为安全的禁用 IDE
	  写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低,
	  因此在后来的发行版中这个配置又改为默认启用了。
	  您可以通过观察 <varname>hw.ata.wc</varname> sysctl 变量,
	  来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用,
	  您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过
	  boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。</para>

	<para>要了解更多的信息,请查阅 &man.ata.4;。</para>
      </sect3>

      <sect3>
	<title><literal>SCSI_DELAY</literal>
	(<varname>kern.cam.scsi_delay</varname>)</title>

	<indexterm>
	  <primary><varname>kern.cam.scsi_delay</varname></primary>
	</indexterm>

	<indexterm>
	  <primary>kernel options</primary>
	  <secondary><literal>SCSI_DELAY</literal></secondary>
	</indexterm>

	<para><literal>SCSI_DELAY</literal> 内核配置会缩短系统启动时间。
	  默认值在系统启动过程中有 <literal>15</literal> 秒的迟延时间,
	  这是一个足够多且可靠的值。把它减少到 <literal>5</literal>
	  通常也能工作(特别是现代的驱动器)。
	  您可以在系统引导时调整引导加载器变量
	  <varname>kern.cam.scsi_delay</varname> 来改变它。
	  需要注意的是, 此处使用的单位是
	  <emphasis>毫秒</emphasis><emphasis></emphasis><emphasis></emphasis></para>
      </sect3>
    </sect2>

    <sect2 id="soft-updates">
      <title>Soft Updates</title>

      <indexterm><primary>Soft Updates</primary></indexterm>
      <indexterm><primary>tunefs</primary></indexterm>

      <para>&man.tunefs.8; 程序能够用来很好的调整文件系统。
	这个程序有很多不同的选项,但是现在只介绍 Soft Updates
	的打开和关闭,这样做:</para>

      <screen>&prompt.root; <userinput>tunefs -n enable /filesystem</userinput>
&prompt.root; <userinput>tunefs -n disable /filesystem</userinput></screen>

      <para>在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开
	Soft Updates 的最佳时机是在单用户模式下任何分区被挂载前。</para>

      <para>
	Soft Updates 极大地改善了元数据修改的性能,
	主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用
	Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates
	保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!)
	之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。
	第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统
	(例如根文件系统)快满了的情况下对系统进行大规模的升级比如
	<command>make installworld</command>,
	可能会引起磁盘空间不足从而造成升级失败。
      </para>

      <sect3>
	<title>Soft Updates 的详细资料</title>

	<indexterm>
	  <primary>Soft Updates</primary>
	  <secondary>详细资料</secondary>
	</indexterm>

	<para>
	  有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。
	  (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据)</para>

	<para>
	  从前,默认方法是同步更新这些元数据(meta-data)。
	  如果一个目录改变了,系统在真正写到磁盘之前一直等待。
	  文件数据缓存(文件内容)在这之后以非同步形式写入。
	  这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data)
	  一直处于完整状态。文件要不就被完整的创建要不根本就不创建。
	  如果崩溃时找不到文件的数据块,&man.fsck.8;
	  可以找到并且依靠把文件大小设置为 0 来修复文件系统。
	  另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如
	  <command>rm -r</command> 命令,依次触及目录下的所有文件,
	  但是每个目录的改变(删除一个文件)都要同步写入磁盘。
	  这包含它自己更新目录,inode 表和可能对文件分散的块的更新。
	  同样问题出现大的文件操作上(比如 <command>tar -x</command>)。</para>

	<para>
	  第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的
	  <command>mount -o async</command> 默认的方法。所有元数据更新也是通过缓存。
	  也就是它们会混合在文件内容数据更新中。
	  这个方法的优点是不需要等待每个元数据更新都写到磁盘上,
	  所以所有引起元数据更新大的操作比同步方式更快。同样,
	  这个方法也是清楚且简单的,所以代码中的漏洞风险很小。
	  缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败
	  (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。
	  系统再启动时没有机会检查文件系统的状态;inode
	  表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用
	  <command>fsck</command>  命令来清理(因为磁盘上没有所需要的信息)。
	  如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。
	</para>

	<para>
	  这个问题通常的解决办法是使用 <emphasis>dirty region logging</emphasis>
	  或者 <emphasis>journaling</emphasis>
	  尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。
	  这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。
	  过后他们将会被移动到正确的位置。因为纪录区很小,
	  磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。
	  另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次
	  (一次写到纪录区域,一次写到正确的区域)。正常情况下,
	  悲观的性能可能会发生。从另一方面来讲,
	  崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。
	</para>

	<para>Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates
	  解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘
	  (<quote>有序的元数据更新</quote>)。这样的结果是,在繁重的元数据操作中,
	  如果先前的更新还在内存中没有被写进磁盘,后来的更新就会捕捉到。
	  所以所有的目录操作在写进磁盘的时候首先在内存中执行
	  (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。
	  如果系统崩溃了这将导致一个固定的 <quote>日志回朔</quote>:
	  所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在
	  3060 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后,
	  唯一的资源分配错误是一个实际是<quote>空闲</quote>的资源的资源被标记为<quote>使用</quote>。
	  &man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用
	  <command>mount -f</command> 强制挂上的文件系统的错误状态是安全的。
	  为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用
	  <emphasis>后台 fsck</emphasis>:系统启动的时候只有一个文件系统的
	  <emphasis>快照</emphasis> 被记录下来。<command>fsck</command>
	  可以在过后运行。所有文件系统可以在<quote>有错误</quote>的时候被挂接,
	  所以系统可以在多用户模式下启动。接着,后台 <command>fsck</command>
	  可以在所有文件系统需要的时候启动来释放可能没有使用的资源。
	  (尽管这样,不用 Soft Updates 的文件系统依然需要通常的
	  <command>fsck</command>。)
	</para>

	<para>
	  它的优点是元数据操作几乎跟非同步一样快
	  (也就是比需要两次元数据写操作的 <emphasis>logging</emphasis>
	  更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险)
	  和高的内存使用量。另外它有些特点需要知道。崩溃之后,
	  文件系统状态会<quote>落后</quote>一些。同步的方法用
	  <command>fsck</command> 后在一些地方可能产生一些零字节的文件,
	  这些文件在用 Soft Updates 文件系统之后不会存在,
	  因为元数据和文件内容根本没有写进磁盘(可能发生在运行
	  <command>rm</command> 之后)。这可能在文件系统上安装大量数据时候引发问题,
	  没有足够的剩余空间来两次存储所有文件。</para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="configtuning-kernel-limits">
    <title>调整内核限制</title>

    <indexterm>
      <primary>调整</primary>
      <secondary>内核限制</secondary>
    </indexterm>

    <sect2 id="file-process-limits">
      <title>文件/进程限制</title>

      <sect3 id="kern-maxfiles">
	<title><varname>kern.maxfiles</varname></title>

	<indexterm>
	  <primary><varname>kern.maxfiles</varname></primary>
	</indexterm>

	<para><varname>kern.maxfiles</varname> 可以根据系统的需要适当增减。
	  这个变量用于指定在系统中允许的文件描述符的最大数量。
	  当文件描述符表满的时候,
	  <errorname>file: table is full</errorname>
	  会在系统消息缓冲区中反复出现, 您可以使用
	  <command>dmesg</command> 命令来观察这一现象。</para>

	<para>每个打开的文件、 套接字和管道, 都会占用一个文件描述符。
	  在大型生产服务器上, 可能会轻易地用掉数千个文件描述符,
	  具体用量取决于服务的类型和并行启动的服务数量。</para>

	<para>在早期版本的 &os; 中, <varname>kern.maxfiles</varname> 的默认值,
	  是根据您内核配置文件中的 <option>maxusers</option> 选项计算的。
          <varname>kern.maxfiles</varname> 这个数值,
          会随 <option>maxusers</option> 成比例地增减。
          当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。
          这个数字同时还决定内核的许多预设的限制值。 有时,
          尽管并不会真的有 256 个用户同时连接一台生产服务器,
          但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。</para>

        <para>变量 <varname>kern.maxusers</varname>
          会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后,
          可以通过只读的 <varname>kern.maxusers</varname> sysctl 变量值来进行观察。
          有些情况下, 可能会希望使用更大或更小一些的
          <varname>kern.maxusers</varname>, 它可以以加载器变量的形式进行配置;
          类似 64128256 这样的值都并不罕见。 我们不推荐使用超过 256
          的值, 除非您需要巨量的文件描述符; 根据
          <varname>kern.maxusers</varname> 推算默认值的那些变量,
          一般都可以在引导甚至运行时通过 <filename>/boot/loader.conf</filename>
          (请参见 &man.loader.conf.5; 联机手册或
          <filename>/boot/defaults/loader.conf</filename> 文件来获得相关的指导)
          或这篇文档的其余部分所介绍的方式来调整。</para>

	<para>在较早的版本中, 如果您明确地将
	  <literal>maxusers</literal> 设置为
	  <literal>0</literal>, 则系统会自动地根据硬件配置来确定这个值。<footnote>
	    <para>自动调整算法会将
	      <literal>maxusers</literal> 设置为与主存的数量一样,
	      或者取其下限 32 或上限 384</para>
	  </footnote>。 在 &os;&nbsp;5.X 和更高版本中, <literal>maxusers</literal>
	  如果不指定的话, 就会取默认值 <literal>0</literal>。 如果希望自行管理
	  <literal>maxusers</literal>, 则应配置一个不低于 4 的值,
	  特别是使用 X Window System 或编译软件的时候。
	  这样做的原因是, <literal>maxusers</literal>
	  所决定的一个最为重要的表的尺寸会影响最大进程数,
	  这个数值将是 <literal>20 + 16 *
	  maxusers</literal>。 因此如果将 <literal>maxusers</literal> 设置为 1,
	  您就只能同时运行 36 个进程, 这还包括了 18
	  个左右的系统引导时启动的进程, 以及 15 个左右的,
	  在您启动 X Window System 时所引发的进程。 即使是简单的任务,
	  如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、
	  解压缩, 并显示它。 将
	  <literal>maxusers</literal> 设为 64 将允许您同时执行最多 1044
	  个进程, 这几乎足以满足任何需要了。 不过,
	  如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如
	  <hostid role="fqdn">ftp.FreeBSD.org</hostid>) 时,
	  看到令人担忧的 <errortype>proc table
	  full</errortype> 错误, 就应该提高这一数值,
	  并重新联编内核。</para>

	<note>
	  <para><literal>maxusers</literal><emphasis>不能</emphasis>
	    限制实际能够登录到您系统上来的用户的数量。
	    它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸,
	    以便提供支持他们所需运行的进程资源。</para>
	</note>

      </sect3>

      <sect3>
	<title><varname>kern.ipc.somaxconn</varname></title>

	<indexterm>
	  <primary><varname>kern.ipc.somaxconn</varname></primary>
	</indexterm>

	<para><varname>kern.ipc.somaxconn</varname> sysctl 变量
	  限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载
	  web服务环境来说,默认的 <literal>128</literal> 太小了。
	  大多数环境这个值建议增加到 <literal>1024</literal> 或者更多。
	  服务进程会自己限制侦听队列的大小(例如 &man.sendmail.8;
	  或者 <application>Apache</application>),
	  常常在它们的配置文件中有设置队列大小的选项。
	  大的侦听队列对防止拒绝服务 <abbrev>DoS</abbrev> 攻击也会有所帮助。</para>
      </sect3>

    </sect2>
    <sect2 id="nmbclusters">
      <title>网络限制</title>

      <para><literal>NMBCLUSTERS</literal> 内核配置选项指出了系统可用的网络Mbuf的数量。
	一个高流量的服务器使用一个小数目的网络缓存会影响 &os; 的性能。
	每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。
	可以用简单的方法计算出来需要多少网络缓存。
	如果您有一个同时发生1000个以上连接的web服务器,
	并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。
	一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。
	我们建议在有大量内存的机器上把这个值设置在409632768之间。
	没有必要把它设置成任意太高的值,它会在启动时引起崩溃。
	&man.netstat.1; 的 <option>-m</option> 选项可以用来观察网络cluster使用情况。</para>

      <para><varname>kern.ipc.nmbclusters</varname> 可以用来在启动时刻调节这个。
	仅仅在旧版本的 &os; 需要使用 <literal>NMBCLUSTERS</literal>
	&man.config.8; 选项。</para>

      <para>经常使用 &man.sendfile.2; 系统调用的繁忙的服务器,
	有必要通过 <literal>NSFBUFS</literal> 内核选项或者在
	<filename>/boot/loader.conf</filename> (查看 &man.loader.8; 以获得更多细节)
	中设置它的值来调节 &man.sendfile.2; 缓存数量。
	这个参数需要调节的普通原因是在进程中看到 <literal>sfbufa</literal>
	状态。sysctl <varname>kern.ipc.nsfbufs</varname>
	变量在内核配置变量中是只读的。 这个参数是由 <varname>kern.maxusers</varname>
	决定的,然而它可能有必要因此而调整。</para>

      <important>
	<para>
	  即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫
	  &man.sendfile.2; 可能导致 &man.sendfile.2; 呼叫阻塞直到有足够的
	  <literal>struct sf_buf</literal> 可用。
	</para>
      </important>

      <sect3>
	<title><varname>net.inet.ip.portrange.*</varname></title>

	<indexterm>
	  <primary>net.inet.ip.portrange.*</primary>
	</indexterm>

	<para><varname>net.inet.ip.portrange.*</varname> sysctl
	  变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。
	  这里有三个范围:一个低端范围,一个默认范围和一个高端范围。
	  大多数网络程序分别使用由 <varname>net.inet.ip.portrange.first</varname><varname>net.inet.ip.portrange.last</varname> 控制的从 10245000
	  的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口,
	  这经常发生在运行一个高负荷 web 代理服务器的时候。
	  这个端口范围不是用来限制主要的例如 web
	  服务器进入连接或者有固定端口例如邮件传递对外连接的。
	  有时您可能用完了端口,那就建议适当的增加
	  <varname>net.inet.ip.portrange.last</varname><literal>10000</literal><literal>20000</literal> 或者
	  <literal>30000</literal> 可能是适当的值。
	  更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围
	  (通常是低范围的端口)并且用高端口进行对外连接(&mdash;)。
	  基于这个问题建议不要把 <varname>net.inet.ip.portrange.first</varname>
	  设的太小。</para>
      </sect3>

      <sect3>
	<title>TCP 带宽迟延(Bandwidth Delay Product)</title>

	<indexterm>
	  <primary>限制 TCP 带宽延迟积</primary>
	  <secondary><varname>net.inet.tcp.inflight.enable</varname></secondary>
	</indexterm>

	<para>限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。
	  它可以通过将 sysctl 变量
	  <varname>net.inet.tcp.inflight.enable</varname>
	  设置成 <literal>1</literal> 来启用。
	  系统将尝试计算每一个连接的带宽延迟积,
	  并将排队的数据量限制在恰好能保持最优吞吐量的水平上。</para>

	<para>这一特性在您的服务器同时向使用普通调制解调器,
	  千兆以太网, 乃至更高速度的光与网络连接
	  (或其他带宽延迟积很大的连接) 的时候尤为重要,
	  特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。
	  如果启用了这个选项, 您还应该把
	  <varname>net.inet.tcp.inflight.debug</varname> 设置为
	  <literal>0</literal> (禁用调试),
	  对于生产环境而言, 将 <varname>net.inet.tcp.inflight.min</varname>
	  设置成至少
	  <literal>6144</literal> 会很有好处。 然而, 需要注意的是,
	  这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。
	  这个限制特性减少了在路由和交换包队列的堵塞数据数量,
	  也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、
	  交互式连接,尤其是通过慢速的调制解调器,也能用低的
	  <emphasis>往返时间</emphasis>操作。但是,注意这只影响到数据发送
	  (上载/服务端)。对数据接收(下载)没有效果。
	</para>

	<para>调整 <varname>net.inet.tcp.inflight.stab</varname><emphasis></emphasis> 推荐的。 这个参数的默认值是
	  20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。
	  额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力,
	  但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用
	  inflight 算法低许多)。 对于这些情形,
	  您可能会希望把这个参数减少到 1510, 或 5;
	  并可能因此而不得不减少
	  <varname>net.inet.tcp.inflight.min</varname> (比如说,
	  3500) 来得到希望的效果。 减少这些参数的值,
	  只应作为最后不得已时的手段来使用。</para>
      </sect3>
    </sect2>

    <sect2>
      <title>虚拟内存</title>

      <sect3>
        <title><varname>kern.maxvnodes</varname></title>

        <para>vnode 是对文件或目录的一种内部表达。
          因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。
          一般而言, 这是由操作系统自行完成的, 也不需要加以修改。
          但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足,
          则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。</para>

        <para>要查看当前在用的 vnode 数量:</para>

        <screen>&prompt.root; <userinput>sysctl vfs.numvnodes</userinput>
vfs.numvnodes: 91349</screen>

        <para>要查看最大可用的 vnode 数量:</para>

        <screen>&prompt.root; <userinput>sysctl kern.maxvnodes</userinput>
kern.maxvnodes: 100000</screen>

        <para>如果当前的 vnode 用量接近最大值, 则将
          <varname>kern.maxvnodes</varname> 值增大 1,000
          可能是个好主意。 您应继续查看
          <varname>vfs.numvnodes</varname> 的数值,
          如果它再次攀升到接近最大值的程度,
          仍需继续提高 <varname>kern.maxvnodes</varname>。
          在 &man.top.1; 中显示的内存用量应有显著变化,
          更多内存会处于活跃 (active) 状态。</para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="adding-swap-space">
    <title>添加交换空间</title>

    <para>
      不管您计划得如何好,有时候系统并不像您所期待的那样运行。
      如果您发现需要更多的交换空间,添加它很简单。
      有三种方法增加交换空间:添加一块新的硬盘驱动器、通过
      NFS 使用交换空间和在一个现有的分区上创建一个交换文件。</para>

    <para>要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的
      <xref linkend="swap-encrypting"/></para>

    <sect2 id="new-drive-swap">
      <title>在新的硬盘驱动器上使用交换空间</title>

      <para>这是添加交换空间最好的方法,
	当然为了达到这个目的需要添加一块硬盘。
	毕竟您总是可以使用另一块磁盘。如果能这么做,
	重新阅读一下手册中关于交换空间的 <xref
	linkend="configtuning-initial"/> 来了解如何最优地安排交换空间。</para>
    </sect2>

    <sect2 id="nfs-swap">
      <title>通过 NFS 交换</title>

      <para>除非没有可以用作交换空间的本地硬盘时,
	否则不推荐您使用 NFS 来作为交换空间使用。
	NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。</para>
    </sect2>

    <sect2 id="create-swapfile">
      <title>交换文件</title>

      <para>
	您可以创建一个指定大小的文件用来当作交换文件。
	在我们的例子中我们将会使用叫做 <filename>/usr/swap0</filename>64MB 大小的文件。当然您也可以使用任何您所希望的名字。</para>

      <example>
	<title>&os; 中创建交换文件</title>

      <orderedlist>
	<listitem>
	  <para>确认您的内核配置包含虚拟磁盘(Memory disk)驱动
	    (&man.md.4;)。它在 <filename>GENERIC</filename> 内核中是默认的。</para>

	  <programlisting>device   md   # Memory "disks"</programlisting>
	</listitem>

	<listitem>
	  <para>创建一个交换文件(<filename>/usr/swap0</filename>):</para>

	  <screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
	</listitem>

	<listitem>
	  <para>赋予它(<filename>/usr/swap0</filename>)一个适当的权限:</para>

	  <screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
	</listitem>

	<listitem>
	  <para><filename>/etc/rc.conf</filename> 中启用交换文件:</para>

	  <programlisting>swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.</programlisting>
	</listitem>

	<listitem>

	  <para>通过重新启动机器或下面的命令使交换文件立刻生效:</para>

	  <screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /usr/swap0 -u 0 &amp;&amp; swapon /dev/md0</userinput></screen>
        </listitem>
      </orderedlist>

      </example>
    </sect2>
  </sect1>

  <sect1 id="acpi-overview">
    <sect1info>
      <authorgroup>
	<author>
	  <firstname>Hiten</firstname>
	  <surname>Pandya</surname>
	  <contrib>Written by </contrib>
	</author>
	<author>
	  <firstname>Tom</firstname>
	  <surname>Rhodes</surname>
	</author>
      </authorgroup>
    </sect1info>

    <title>电源和资源管理</title>

    <para>
      
      
      <acronym>BIOS</acronym> 接口管理,例如<emphasis>可插拔 BIOS
      (PNPBIOS)</emphasis>或者<emphasis>高级电源管理(APM)</emphasis>
      等等。电源和资源管理是现代操作系统的关键组成部分。
      例如您可能当系统温度过高的时候让您的操作系统能监视到
      (并且可能提醒您)。
    </para>

    <para>以有效的方式利用硬件资源是非常重要的。 在引入 <acronym>ACPI</acronym>
      之前, 管理电源使用和系统散热对操作系统是很困难的。 硬件由 <acronym>BIOS</acronym>
      进行管理, 因而用户对电源管理配置的控制和查看都比较困难。 一些系统通过
      <emphasis>高级电源管理 (APM)</emphasis> 提供了有限的配置能力。
      电源和资源管理是现代操作系统的一个关键组件。 例如, 您可能希望操作系统监视系统的一些限制,
      例如系统的温度是否超出了预期的增长速度 (并在需要时发出警告)。</para>

    <para>&os; 使用手册的这一章节,我们将提供 <acronym>ACPI</acronym>
      全面的信息。 参考资料会在末尾给出。</para>

    <sect2 id="acpi-intro">
      <title>什么是 ACPI?</title>

      <indexterm>
	<primary>ACPI</primary>
      </indexterm>

      <indexterm>
	<primary>APM</primary>
      </indexterm>

      <para>高级配置和电源接口 (<acronym>ACPI</acronym>)
	是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是
	<emphasis>操作系统控制的配置和电源管理(Operating System-directed
	configuration and Power Management)</emphasis>,也就是说,
	它给操作系统(<acronym>OS</acronym>)提供了更多的控制和弹性。
	在引入 <acronym>ACPI</acronym> 之前,
	现代操作系统使得目前即插即用接口的局限性更加 <quote>凸现</quote> 出来。
	<acronym>ACPI</acronym><acronym>APM(高级电源管理)</acronym>
	的直接继承者。</para>
    </sect2>

    <sect2 id="acpi-old-spec">
      <title>高级电源管理 (APM) 的缺点</title>

      <para><emphasis>高级电源管理 (APM)</emphasis>
      是一种基于系统目前的活动控制其电源使用的机制。
      APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。
      在 OS 中的 APM 驱动作为中介来访问 <emphasis>APM 软件接口</emphasis>,
      从而实现对电源使用的管理。 在 2000 年或更早的时期生产的计算机系统,
      仍需要使用 APM。</para>

      <para>APM 有四个主要的问题。 首先, 电源管理是通过
      (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。
      例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值,
      当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度,
      而不会征求 OS 的同意。 第二, APM 逻辑是嵌入
      BIOS 的, 因此它是在 OS 的控制之外运转的。
      这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS
      才能够解决某些问题; 而这是一个很危险的操作,
      因为它可能使系统进入一个无法恢复的状态。 第三, APM
      是一种制造商专属的技术, 也就是说有很多第三方的
      (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有,
      也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM
      BIOS 没有为实现复杂的电源策略提供足够的余地,
      也无法实现能够非常适合具体机器的策略。</para>

      <para><emphasis>即插即用 BIOS (PNPBIOS)</emphasis>
      在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术,
      因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法
      <quote>接口</quote></para>

      <para>&os; <acronym>APM</acronym> 驱动在 &man.apm.4; 手册页中有描述。</para>
    </sect2>

    <sect2 id="acpi-config">
      <title>配置 <acronym>ACPI</acronym></title>

      <para>默认情况下, <filename>acpi.ko</filename> 驱动,
      会在系统引导时由 &man.loader.8; 加载, 而 <emphasis>不应</emphasis>
      直接联编进内核。 这样做的原因是模块操作起来更方便, 例如, 无需重新联编内核就可以切换到另一个
      <filename>acpi.ko</filename> 版本。 这样可以让测试变得更简单一些。
      另一个原因是, 许多时候在启动已经启动之后再启动 <acronym>ACPI</acronym> 可能会有些问题。
      如果您遇到了问题, 可以全面禁用 <acronym>ACPI</acronym>。
      这个驱动不应, 目前也无法卸载, 因为系统总线通过它与许多不同的硬件进行交互。
      <acronym>ACPI</acronym> 可以通过在
      <filename>/boot/loader.conf</filename> 中配置或在 &man.loader.8; 提示符处配置
      <literal>hint.acpi.0.disabled="1"</literal> 来禁用。
      </para>

      <note><para><acronym>ACPI</acronym><acronym>APM</acronym> 不能共存,
      相反, 它们应分开使用。 后加载的驱动如果发现系统中已经执行了其中的一个,
      便会停止执行。</para></note>

      <para><acronym>ACPI</acronym> 可以用来让系统进入休眠模式,
      方法是使用 &man.acpiconf.8; 的 <option>-s</option>
      参数, 加上一个 <literal>1-5</literal> 的数字。 多数用户会希望使用
      <literal>1</literal><literal>3</literal> (挂起到 RAM)。
      而 <literal>5</literal> 则会让系统执行与下列命令效果类似的软关机:</para>

      <screen>&prompt.root; <userinput>halt -p</userinput></screen>

      <para>除此之外, 还有一些通过 &man.sysctl.8; 提供的选项。 请参见联机手册
      &man.acpi.4; 和 &man.acpiconf.8; 以获得更多信息。
      </para>
    </sect2>
  </sect1>

  <sect1 id="ACPI-debug">
    <sect1info>
      <authorgroup>
        <author>
          <firstname>Nate</firstname>
          <surname>Lawson</surname>
          <contrib>撰写人:</contrib>
        </author>
      </authorgroup>
      <authorgroup>
        <author>
          <firstname>Peter</firstname>
          <surname>Schultz</surname>
          <contrib>协力:</contrib>
        </author>
        <author>
          <firstname>Tom</firstname>
          <surname>Rhodes</surname>
        </author>
      </authorgroup>
    </sect1info>

    <title>使用和调试 &os; <acronym>ACPI</acronym></title>

    <indexterm>
      <primary>ACPI</primary>
      <secondary>problems</secondary>
    </indexterm>

    <para><acronym>ACPI</acronym> 是一种全新的发现设备、 管理电源使用、
      以及提供过去由 <acronym>BIOS</acronym> 管理的访问不同硬件的标准化方法。
      让 <acronym>ACPI</acronym> 在各种系统上都能正确使用的工作一直在进行,
      但许多主板的 <firstterm><acronym>ACPI</acronym> 机器语言</firstterm>
      (<acronym>AML</acronym>) 字节代码中的 bug,  &os; 的内核中子系统设计的不完善,
      以及  &intel;
      <acronym>ACPI-CA</acronym> 解释器中的 bug 仍然不时会出现。</para>

    <para>这份文档期望能够帮助您协助 &os;
      <acronym>ACPI</acronym> 的维护人员来找到您所观察到的问题的根源,
      并通过调试找到其解决方法。 感谢您阅读这份文档,
      我们也希望能够解决您的系统上的问题。</para>

    <sect2 id="ACPI-submitdebug">
      <title>提交调试信息</title>

      <note>
	<para>在提交问题之前, 请确认您已经在运行最新的
	  <acronym>BIOS</acronym> 版本, 此外, 也包括嵌入式控制器的固件版本。</para>
      </note>

      <para>如果您希望提交一个问题,
	请确保将下述信息发到
	<ulink url="mailto:freebsd-acpi@FreeBSD.org">
	freebsd-acpi@FreeBSD.org</ulink>:</para>

      <itemizedlist>
	<listitem>
	  <para>问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。
	    另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。</para>
	</listitem>

	<listitem>
	  <para><quote>boot
	    -v</quote> 之后得到的 &man.dmesg.8; 输出, 以及任何在重现
	    bug 时出现的错误信息。</para>
	</listitem>

	<listitem>
	  <para>在禁用了 <acronym>ACPI</acronym> 之后的 <quote>boot
	    -v</quote> 的 &man.dmesg.8; 输出, 如果您发现禁用 ACPI
	    能够帮助消除问题。</para>
	</listitem>

	<listitem>
	  <para>来自 <command>sysctl hw.acpi</command>的输出。
	    这也是找到您的系统所提供的功能的一种好办法。</para>
	</listitem>

	<listitem>
	  <para>能够得到您的 <firstterm><acronym>ACPI</acronym> Source Language</firstterm>
	    (<acronym>ASL</acronym>) 的 <acronym>URL</acronym><emphasis>不要</emphasis><acronym>ASL</acronym> 直接发到邮件列表中,
	    因为它们可能非常大。
	    为了得到 <acronym>ASL</acronym>
	    您可以运行这个命令:</para>

	  <screen>&prompt.root; <userinput>acpidump -dt &gt; <replaceable>name</replaceable>-<replaceable>system</replaceable>.asl</userinput></screen>

	  <para>(把
	    <replaceable>name</replaceable> 改为您的登录名,
	    并把
	    <replaceable>system</replaceable> 改为您的硬件制造商及其型号。 例如:
	    <filename>njl-FooCo6000.asl</filename>)</para>
	</listitem>
      </itemizedlist>

      <para>许多开发者也会订阅 &a.current;
        但还是请发到 &a.acpi.name; 这样它会被更多人看到。
	请耐心等待, 因为我们都有全职的其他工作。
	如果您的 bug 不是显而易见的, 我们可能会要求您通过
	&man.send-pr.1; 来提交一个 <acronym>PR</acronym>。
	在输入 <acronym>PR</acronym> 时,请将同样的信息包含进去。
	这将帮助我们来追踪和解决问题。
	不要在给 &a.acpi.name; 写信之前发送
	<acronym>PR</acronym> 因为我们把它当作已知文体的备忘录而不是报告机制。
	您的问题很可能已经被其他人报告过了。</para>
    </sect2>

    <sect2 id="ACPI-background">
      <title>背景</title>

      <indexterm>
	<primary>ACPI</primary>
      </indexterm>

      <para><acronym>ACPI</acronym> 存在于采用
	ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。
	完整的标准具有大量的各式功能, 包括
	<acronym>CPU</acronym> 性能管理、 电源控制、 温度监控、
	电池系统、 嵌入式控制器以及总线枚举。
	绝大多数系统实现比完整标准的功能要少一些。 例如,
	桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。
	笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。</para>

      <para>符合 <acronym>ACPI</acronym> 的系统中有许多组件。
	<acronym>BIOS</acronym> 和芯片组制造商提供一些固定的表
	(例如, <acronym>FADT</acronym>) 在存储器中, 以提供类似
	<acronym>APIC</acronym> 映射 (用于 <acronym>SMP</acronym>)、
	配置寄存器、 以及简单的配置值等等。 另外,
	一个字节代码 (bytecode) 表
	(<firstterm>系统区别描述表</firstterm>
	<acronym>DSDT</acronym>)
	则提供了通过树状命名空间来指定设备及其功能的方法。</para>

      <para><acronym>ACPI</acronym> 驱动必须要处理固定表,
	实现字节码解释器, 并修改驱动程序和内核, 以接受来自
	<acronym>ACPI</acronym> 子系统的信息。 对于 &os;&intel;
	提供了一个解释器 (<acronym>ACPI-CA</acronym>),
	它在 Linux 和 NetBSD 也可以使用。
	<acronym>ACPI-CA</acronym> 源代码可以在
	<filename class="directory">src/sys/contrib/dev/acpica</filename>
	找到。 用于在 &os; 中允许 <acronym>ACPI-CA</acronym>
	正确运转的代码则在
	<filename>src/sys/dev/acpica/Osd</filename>。
	最后, 用于实现 <acronym>ACPI</acronym> 设备的驱动可以在
	<filename class="directory">src/sys/dev/acpica</filename> 找到。</para>
    </sect2>

    <sect2 id="ACPI-comprob">
      <title>常见问题</title>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>problems</secondary>
      </indexterm>

      <para>要让 <acronym>ACPI</acronym> 正常工作,
	它的每一部分都必须工作正常。 下面是一些常见的问题,
	按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。</para>

      <sect3>
	<title>鼠标问题</title>

	<para>某些时候, 唤醒操作会导致鼠标不再正常工作。
	  已知的绕过这一问题的方法, 是在
	  <filename>/boot/loader.conf</filename> 文件中添加
	  <literal>hint.psm.0.flags="0x3000"</literal> 设置。
	  如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。</para>
      </sect3>

      <sect3>
	<title>休眠/唤醒</title>

	<para><acronym>ACPI</acronym> 提供了三种休眠到
	  <acronym>RAM</acronym> (<acronym>STR</acronym>) 的状态,
	  <literal>S1</literal>-<literal>S3</literal>,
	  以及一个休眠到磁盘的状态 (<literal>STD</literal>),
	  称作 <literal>S4</literal><literal>S5</literal><quote>软关机</quote> 同时也是系统接好电源但没有开机时的正常状态。
	  <literal>S4</literal> 实际上可以用两种不同的方法来实现。
	  <literal>S4</literal><acronym>BIOS</acronym> 是一种由
	  <acronym>BIOS</acronym> 辅助的挂起到磁盘方法, 而
	  <literal>S4</literal><acronym>OS</acronym>
	  则是完全由操作系统实现的。</para>

	<para>可以使用 <command>sysctl hw.acpi</command>
	  来查看与休眠有关的项目。
	  这里是我的 Thinkpad 上得到的结果。</para>

	<screen>hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0</screen>

	<para>这表示我可以使用 <command>acpiconf -s</command>
	  来测试 <literal>S3</literal><literal>S4</literal><acronym>OS</acronym>, 以及
	  <literal>S5</literal>。 如果 <option>s4bios</option> 是一
	  (<literal>1</literal>), 则可以使用
	  <literal>S4</literal><acronym>BIOS</acronym>
	  来代替 <literal>S4</literal>
	  <acronym>OS</acronym></para>

	<para>当测试休眠/唤醒时, 从
	  <literal>S1</literal> 开始, 如果它被支持的话。
	  这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。
	  没有人实现 <literal>S2</literal> 但如果您有它的支持,
	  则应该和 <literal>S1</literal> 类似。 下一件值得尝试的是
	  <literal>S3</literal>。 这是最深的
	  <acronym>STR</acronym> 状态,
	  并需要一系列驱动的支持才能够正常地重新初始化您的硬件。
	  如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name;
	  邮件列表, 尽管不要指望问题一定会很快解决,
	  因为有许多驱动程序/硬件需要进行更多的测试和改进。</para>

	<para>休眠和唤醒操作最常见的问题是某些设备驱动程序不会保存、
	  恢复或正确地重新初始化其固件、 寄存器或设备内存。
	  尝试调试这些问题时, 首先可以尝试:</para>

	<screen>&prompt.root; <userinput>sysctl debug.bootverbose=1</userinput>
&prompt.root; <userinput>sysctl debug.acpi.suspend_bounce=1</userinput>
&prompt.root; <userinput>acpiconf -s 3</userinput></screen>

	<para>这个测试会模拟休眠和恢复过程而不真的进入 <literal>S3</literal>
	  状态。 有时, 您会用这种方式很容易地抓住问题
	  (例如, 丢失固件状态、 设备 watchdog 超时, 以及一直重试等)。
	  注意系统不会真的进入
	  <literal>S3</literal> 状态, 这意味着这些设备可能不会掉电,
	  而许多设备在完全不提供休眠和恢复方法时仍可正常工作,
	  而不像使用真的 <literal>S3</literal>
	  状态那样。</para>

	<para>较难的情况则需要更多的硬件, 例如用于串口控制台的串口/线,
	  以及用于 &man.dcons.4; 的火线口/线和内核调试技能。</para>

	<para>为了帮助隔离问题, 请在内核中删去尽可能多的驱动。
	  如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。
	  通常预编译的驱动程序如
	  <filename>nvidia.ko</filename>、 X11
	  显示驱动, 以及 <acronym>USB</acronym> 的问题最多,
	  而以太网卡的驱动则通常工作的很好。
	  如果您能够通过加载和卸载驱动使系统正常工作,
	  您可以通过将适当的命令放到
	  <filename>/etc/rc.suspend</filename><filename>/etc/rc.resume</filename> 来将这个过程自动化。
	  在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。
	  另外您还可以将 <option>hw.acpi.reset_video</option> 设置为零
	  (<literal>0</literal>), 如果您的显示在唤醒之后显得很混乱。
	  此外您还可以尝试更长或更短的
	  <option>hw.acpi.sleep_delay</option> 值看看是否有所助益。</para>

	<para>另一件值得一试的事情是使用一个比较新的包含
	  <acronym>ACPI</acronym> 支持的 Linux 发行版来试试看他们的
	  休眠/唤醒 功能是否在同样的硬件上能够正常工作。
	  如果在 Linux 下正常, 则很可能是 &os; 驱动程序的问题,
	  而隔离问题并找到存在问题的驱动有助于解决它。
	  需要注意的是 <acronym>ACPI</acronym> 的维护人员通常并不维护其他驱动
	  (例如 声音、 <acronym>ATA</acronym>, 等等)
	  因此如果最终发现是驱动的问题最好还是发到
	  &a.current.name; 邮件列表并发给驱动程序的维护者。
	  如果您喜欢冒险, 则可以加一些 &man.printf.3;
	  到有问题的驱动中, 以找到它的恢复功能发生问题的位置。</para>

	<para>最后, 试试看禁用 <acronym>ACPI</acronym>
	  并代之以启用 <acronym>APM</acronym>。
	  如果 休眠/唤醒 能够在 <acronym>APM</acronym> 下正常工作,
	  使用 <acronym>APM</acronym> 可能会更好,
	  特别是对于较老的硬件 (2000年以前)。
	  硬件制造商需要一些时间来让老硬件的
	  <acronym>ACPI</acronym> 工作正常,
	  而 <acronym>ACPI</acronym> 的问题十之八九是
	  <acronym>BIOS</acronym> 中的毛病引发的。</para>
      </sect3>

      <sect3>
	<title>系统停止响应 (暂时或永久性地)</title>

	<indexterm>
	  <primary>中断风暴</primary>
	</indexterm>

	<para>绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。
	  芯片组有很多问题最终会溯源到 <acronym>BIOS</acronym>
	  如何在引导系统之前配置中断, <acronym>APIC</acronym>
	  (<acronym>MADT</acronym>) 表的正确性, 以及
	  <firstterm>系统控制中断</firstterm>
	  (<acronym>SCI</acronym>) 如何路由。</para>

	<para>通过察看 <command>vmstat -i</command>
	  的输出中包括 <literal>acpi0</literal>
	  的那一行可以区分中断风暴和未能及时响应中断。
	  如果每秒计数器增长的速度多于一两个,
	  则您是遇到了中断风暴。 如果系统停止了响应,
	  您可以尝试停止内核并进入 <acronym>DDB</acronym>
	  (在控制台上按 <keycombo action="simul"><keycap>CTRL</keycap>
	  <keycap>ALT</keycap><keycap>ESC</keycap></keycombo>)
	  并输入 <literal>show interrupts</literal></para>

	<indexterm>
	  <primary>APIC</primary>
	  <secondary>禁用</secondary>
	</indexterm>

	<para>处理中断问题的救命稻草是尝试禁用
	  <acronym>APIC</acronym> 支持, 这是通过在
	  <filename>loader.conf</filename> 中加入
	  <literal>hint.apic.0.disabled="1"</literal>
	  完成的。</para>
      </sect3>

      <sect3>
	<title>崩溃</title>

	<para>崩溃对于 <acronym>ACPI</acronym> 是比较罕见的情况,
	  如果发现, 我们将会非常重视并很快修复它。
	  您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话)
	  的操作并获取一份调用堆栈。 请启用
	  <option>options DDB</option> 并设置串行控制台
	  (参见 <xref linkend="serialconsole-ddb"/>)
	  或配置一个 &man.dump.8; 分区。 您将在
	  <acronym>DDB</acronym> 中通过 <option>tr</option>
	  得到调用堆栈。 如果您只能用手抄的方法记录它,
	  一定要记下头五 (5) 行和最后五 (5) 行。</para>

	<para>然后, 尝试通过在启动时禁用
	  <acronym>ACPI</acronym> 来隔离故障。 如果这样做能够正常工作,
	  请通过设置 <option>debug.acpi.disable</option>
	  的那组数值来隔离具体是哪个 <acronym>ACPI</acronym>
	  子系统的问题。 请参见
	  &man.acpi.4; 联机手册中给出的那些例子。</para>
      </sect3>

      <sect3>
	<title>系统在休眠或关机之后又启动了</title>
	<para>首先请尝试在 &man.loader.conf.5; 中设置
	  <option>hw.acpi.disable_on_poweroff=</option><quote>0</quote>。
	  这将让 <acronym>ACPI</acronym> 不再在关机过程中禁用一些事件。
	  基于同样的原因, 一些系统需要把这个值设置为 <quote>1</quote>
	  (这是默认值)。
	  这通常能够修复在休眠或关机时立即再次启动的问题。</para>
      </sect3>

      <sect3>
	<title>其他问题</title>

	<para>如果您有 <acronym>ACPI</acronym> 的其他问题
	  (同 docking station 协同工作、 无法检测设备, 等等),
	  请把描述发给邮件列表; 不过, 这些问题也有可能和
	  <acronym>ACPI</acronym> 中尚未完成的部分有关,
	  它们可能需要时间才能被实现。 请给点耐心,
	  并准备测试我们可能会发给您的补丁。</para>
      </sect3>
    </sect2>

    <sect2 id="ACPI-aslanddump">
      <title><acronym>ASL</acronym><command>acpidump</command>, 以及
        <acronym>IASL</acronym></title>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>ASL</secondary>
      </indexterm>

      <para>最常见的问题是 <acronym>BIOS</acronym>
	制造商提供的不正确 (甚至完全错误的!) 字节代码。
	这通常会以类似下面这样的内核消息显示在控制台上:</para>

      <screen>ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND</screen>

      <para>许多时候, 您可以通过将
	<acronym>BIOS</acronym> 升级到最新版本来解决此类问题。
	绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常,
	则从 <acronym>AML</acronym> 开始查找问题将是一条捷径。
	字节代码, 或常说的 <acronym>AML</acronym>,
	是从一种叫做 <acronym>ASL</acronym> 的语言写成的源代码进行编译得到的结果。
	<acronym>AML</acronym> 一般存放在
	<acronym>DSDT</acronym> 表中。 要得到您系统的
	<acronym>ASL</acronym>, 需要使用 &man.acpidump.8;。
	需要同时指定 <option>-t</option> (显示固定标的内容)
	和 <option>-d</option> (将 <acronym>AML</acronym> 反编译成
	<acronym>ASL</acronym>) 两个选项。 请参见
	<link linkend="ACPI-submitdebug">如何提交调试信息</link>
	一节了解如何使用它。</para>

      <para>最方便的初步检查是尝试重新编译
	<acronym>ASL</acronym> 来看看是否有错误。
	通常可以忽略这一过程中产生的警告,
	但错误一般就都是 bug, 它们通常就是导致
	<acronym>ACPI</acronym> 无法正常工作的原因。
	要重新编译您的 <acronym>ASL</acronym>,
	可以使用下面的命令:</para>

      <screen>&prompt.root; <userinput>iasl your.asl</userinput></screen>
    </sect2>

    <sect2 id="ACPI-fixasl">
      <title>修复 <acronym>ASL</acronym></title>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>ASL</secondary>
      </indexterm>

      <para>我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用
	<acronym>ACPI</acronym>。 然而, 目前我们仍然在开发绕过
	<acronym>BIOS</acronym> 制造商常见错误的方法。
	&microsoft; 解释器 (<filename>acpi.sys</filename><filename>acpiec.sys</filename>) 并不会严格地检查是否遵守了标准,
	因此许多只在 &windows; 中测试 <acronym>ACPI</acronym><acronym>BIOS</acronym> 制造商很可能永远不会修正他们的
	<acronym>ASL</acronym>。 我们希望不断地找出并用文档说明
	&microsoft; 的解释器到底允许那些不标准的行为,
	并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正
	<acronym>ASL</acronym>。 作为一项临时缓解问题的方法,
	并帮助我们确认其行为, 您可以手工修正
	<acronym>ASL</acronym>。 如果这样能够解决问题,
	请把新旧 <acronym>ASL</acronym> 的 &man.diff.1;
	发给我们, 这样我们就有可能绕过 <acronym>ACPI-CA</acronym>
	中的错误行为, 从而不再需要您来手工修正。</para>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>error messages</secondary>
      </indexterm>

      <para>下面是一些常见的错误信息, 它们的原因,
	以及如何修正。</para>

      <sect3>
	<title>_OS dependencies (_OS 依赖)</title>

	<para>某些 <acronym>AML</acronym> 假定世界是由不同版本的
	  &windows; 组成的。 您可以让 &os; 声称自己是任意
	  <acronym>OS</acronym> 来看一看是否能够修正问题。
	  比较简单的办法是设置
	  <option>hw.acpi.osname</option>="Windows 2001"
	  到 <filename>/boot/loader.conf</filename> 中, 或使用您在
	  <acronym>ASL</acronym> 中找到的其他字符串。</para>
      </sect3>

      <sect3>
	<title>Missing Return statements (缺少返回语句)</title>

	<para>一些方法可能没按照标准要求的那样显式地返回值。
	  尽管 <acronym>ACPI-CA</acronym> 无法处理它,
	  但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。
	  您也可以增加一个显式的
	  Return 语句, 如果您知道那里需要返回一个值的话。
	  要强制 <command>iasl</command> 编译
	  <acronym>ASL</acronym>, 需要使用 <option>-f</option>
	  标志。</para>
      </sect3>

      <sect3>
	<title>替换默认的 <acronym>AML</acronym></title>

	<para>在定制 <filename>your.asl</filename> 之后,
	  您可以通过下面的命令编译它:</para>

	<screen>&prompt.root; <userinput>iasl your.asl</userinput></screen>

	<para>可以使用 <option>-f</option> 标志来强制创建
	  <acronym>AML</acronym>, 即使在编译过程中发生了错误。
	  请注意某些错误 (例如, 缺少 Return 语句)
	  会自动被解释器忽略掉。</para>

	<para><filename>DSDT.aml</filename><command>iasl</command> 命令的默认输出文件名。
	  可以加载它来取代您 <acronym>BIOS</acronym>
	  中存在问题的副本 (它仍然存在于闪存中),
	  其方法是按下面的说明编辑
	  <filename>/boot/loader.conf</filename></para>

	<programlisting>acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"</programlisting>

	<para>一定要把您的 <filename>DSDT.aml</filename> 复制到
	  <filename class="directory">/boot</filename> 目录中。</para>
      </sect3>
    </sect2>

    <sect2 id="ACPI-debugoutput">
      <title><acronym>ACPI</acronym> 中获取调试输出信息</title>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>问题</secondary>
      </indexterm>

      <indexterm>
	<primary>ACPI</primary>
	<secondary>调试</secondary>
      </indexterm>

      <para><acronym>ACPI</acronym> 驱动程序提供了非常灵活的调试机制。
	这允许您指定一组子系统, 以及所需要的详细信息。
	需要调试的子系统可以按 <quote>layers(层)</quote>
	来指定, 并分为	<acronym>ACPI-CA</acronym> 组件 (ACPI_ALL_COMPONENTS)
	和 <acronym>ACPI</acronym> 硬件支持 (ACPI_ALL_DRIVERS)。
	调试输出的详细程度可以通过
	<quote>level(详细度)</quote> 来指定, 其范围是
	ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。
	<quote>level</quote> 是一个位掩码因此可以一次设置多个选项,
	中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出,
	如果它太长以至于冲掉了控制台消息缓冲的话。
	不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。</para>

      <para>调试输出默认并不开启。 要起用它, 您需要在内核设置中添加
	<literal>options ACPI_DEBUG</literal>, 如果您的内核中编入了
	<acronym>ACPI</acronym> 的话。 您还可以在
	<filename>/etc/make.conf</filename> 中加入
	<literal>ACPI_DEBUG=1</literal> 来在全局起用它。
	如果它只是模块, 您可以用下面的方法来重新编译
	<filename>acpi.ko</filename></para>

      <screen>&prompt.root; <userinput>cd /sys/modules/acpi/acpi
&amp;&amp; make clean &amp;&amp;
make ACPI_DEBUG=1</userinput></screen>

      <para>安装 <filename>acpi.ko</filename><filename class="directory">/boot/kernel</filename> and add your
	并把所需的详细度和层在 <filename>loader.conf</filename> 中指定。
	这个例子将启用所有
	<acronym>ACPI-CA</acronym> 组件以及所有
	<acronym>ACPI</acronym> 硬件驱动
	(<acronym>CPU</acronym><acronym>LID</acronym>, 等等) 的消息。
	只输出错误信息, 也就是最低的详细度。</para>

      <programlisting>debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"</programlisting>

      <para>如果您需要的信息是由某个特定的事件触发的
	(比如说, 休眠之后的唤醒), 您可以不修改
	<filename>loader.conf</filename> 而转而使用
	<command>sysctl</command>
	来在启动和为那个事件准备系统之后再指定层和详细度。
	这些 <command>sysctl</command> 的名字和
	<filename>loader.conf</filename> 中的一致。</para>
    </sect2>

    <sect2 id="ACPI-References">
      <title>参考文献</title>

      <para>关于 <acronym>ACPI</acronym> 的更多信息可以从下面这些地方找到:</para>

      <itemizedlist>
	<listitem>
	  <para>The &a.acpi;</para>
	</listitem>

	<listitem>
	  <para><acronym>ACPI</acronym> 邮件列表存档
	    <ulink url="http://lists.freebsd.org/pipermail/freebsd-acpi/"></ulink></para>
	</listitem>

        <listitem>
          <para>旧的 <acronym>ACPI</acronym> 邮件列表存档
            <ulink url="http://home.jp.FreeBSD.org/mail-list/acpi-jp/"></ulink></para>
        </listitem>

	<listitem>
	  <para>The <acronym>ACPI</acronym> 2.0 标准
	    <ulink url="http://acpi.info/spec.htm"></ulink></para>
	</listitem>

	<listitem>
	  <para>&os; 手册页: &man.acpi.4;,
	    &man.acpi.thermal.4;, &man.acpidump.8;, &man.iasl.8;,
	    &man.acpidb.8;</para>
	</listitem>

	<listitem>
	  <para><ulink
	    url="http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt">
	    <acronym>DSDT</acronym> 调试资源</ulink>.
	    (使用 Compaq 作为例子但通常情况下都很有用。)</para>
	</listitem>
      </itemizedlist>
    </sect2>
  </sect1>
</chapter>