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
|
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!--
The FreeBSD Documentation Project
The FreeBSD Simplified Chinese Project
Original Revision: 1.158
$FreeBSD$
-->
<chapter id="basics">
<chapterinfo>
<authorgroup>
<author>
<firstname>Chris</firstname>
<surname>Shumway</surname>
<contrib>Rewritten by </contrib>
</author>
</authorgroup>
<!-- 10 Mar 2000 -->
</chapterinfo>
<title>UNIX 基础</title>
<sect1 id="basics-synopsis">
<title>概述</title>
<para>下列章节的命令和功能适用于FreeBSD操作系统。
同时这里许多内容和一些 类-&unix; 操作系统相关。
假如您已经熟悉这些内容可跳过不阅读。
假如您是FreeBSD新手, 那您应该认真详细地从头到尾读一遍这些章节。</para>
<para>读取这些内容,您将了解:</para>
<itemizedlist>
<listitem>
<para>怎样在FreeBSD使用 <quote>虚拟控制台</quote>。</para>
</listitem>
<listitem>
<para>在 &unix; 中文件权限如何运作,
以及理解 &os; 中的文件标志。</para>
</listitem>
<listitem>
<para>&os; 默认文件系统的架构。</para>
</listitem>
<listitem>
<para>&os;磁盘架构。</para>
</listitem>
<listitem>
<para>怎样挂接或卸下文件系统。</para>
</listitem>
<listitem>
<para>什么是进程、守护进程、信号。</para>
</listitem>
<listitem>
<para>什么是shell,应当怎样去改变登录进入的默认环境。
</para>
</listitem>
<listitem>
<para>怎样使用基本的文本编辑器。</para>
</listitem>
<listitem>
<para>什么是设备,什么是设备节点。</para>
</listitem>
<listitem>
<para>&os; 下,使用的是什么可执行文件格式。</para>
</listitem>
<listitem>
<para>怎样使用 man 手册并取得更多资讯。</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="consoles">
<title>虚拟控制台和终端</title>
<indexterm><primary>虚拟控制台</primary></indexterm>
<indexterm><primary>终端</primary></indexterm>
<para>可以用多种不同的方式使用 FreeBSD, 在文本终端输入命令是其中之一。
通过使用这种方式, 您可以容易地使用 FreeBSD 来获得 &unix;
操作系统的灵活而强大的功能。 这一节将介绍 <quote>终端</quote> 和
<quote>控制台</quote>, 以及如何在 FreeBSD 中使用它们。</para>
<sect2 id="consoles-intro">
<title>控制台</title>
<indexterm><primary>控制台</primary></indexterm>
<para>假如您没有设置 FreeBSD 在启动期间开启图形登录界面,
那么系统将在引导和启动脚本正确运行完成后,给您一个登录的提示。
您会看到类似这样的界面:</para>
<screen>Additional ABI support:.
Local package initialization:.
Additional TCP options:.
Fri Sep 20 13:01:06 EEST 2002
FreeBSD/i386 (pc3.example.org) (ttyv0)
login:</screen>
<para>这些信息可能和您的系统稍微有点不同,但不会有很大差别。
最后两行是我们感兴趣的,
理解这一行:</para>
<programlisting>FreeBSD/i386 (pc3.example.org) (ttyv0)</programlisting>
<para>这一行是您刚才启动的系统信息其中一块,
您所看到的是一个<quote>FreeBSD</quote>控制台,
运行在一个Intel或兼容的x86体系架构上面<footnote>
<para>现在理解一下<literal>i386</literal>的含义。
请注意尽管您的 FreeBSD 并非在 Intel 386 CPU
上运行, 但也会显示为 <literal>i386</literal>。
这不是指您的处理器, 而是指处理器的
<quote>体系结构</quote>。</para>
</footnote>。 这台计算机的名字 (每台 &unix; 计算机都有自己的名字) 叫
<hostid>pc3.example.org</hostid>, 就是现在这个系统控制台—这个 <devicename>ttyv0</devicename>
终端的样子。</para>
<para>在最后,最后一行一直保持这样:</para>
<programlisting>login:</programlisting>
<para>这里, 您将可以输入用户名
<quote>username</quote> 并登录到 &os; 系统中。
接下来的一节, 将介绍如何登录系统。</para>
</sect2>
<sect2 id="consoles-login">
<title>进入FreeBSD</title>
<para>FreeBSD是一个多用户多任务的系统,
换句话来说就是一个系统中可以容纳许多不同的用户,
而这些用户都可以同时在这台机器中运行大量的程序。</para>
<para>每一个多用户系统都必须在某方面去区分 <quote>user</quote>,
在 FreeBSD 里 (以及 类-&unix; 操作系统), 完成这方面工作是有必要的,
因而, 每位使用者在运行程序之前都必须首先 <quote>登录</quote>,
而每位用户都有与之对应的用户名 (<quote>username</quote>) 和密码
(<quote>password</quote>)。 FreeBSD
会在用户进入之前作出询问这两项信息。</para>
<indexterm><primary>启动脚本</primary></indexterm>
<para>当 FreeBSD 引导并运行完启动脚本之后,
<footnote>
<para>启动脚本这些程序在FreeBSD在启动过程中运行。
它们的主要功能为其他每方面的运行作好准备,
和运行您的配置所用到的相关环境。</para>
</footnote>, 它会给出一个提示, 并要求输入有效的用户名:
</para>
<screen>login:</screen>
<para>举个例子更容易理解,我们假设您的用户名叫 <username>john</username>。
在提示符下输入 <literal>john</literal> 并按 <keycap>Enter</keycap>,
此时您应该看到这个提示 <quote>password</quote>:
</para>
<screen>login: <userinput>john</userinput>
Password:</screen>
<para>现在输入 <username>john</username>的密码并按下
<keycap>Enter</keycap>。 输入密码时是 <emphasis>不回显的!</emphasis>
不必为此担心, 这样做是出于安全考虑。</para>
<para>假如您输入的密码是正确的, 这时你应该已进入 FreeBSD,
并可以开始尝试可用的命令了。</para>
<para>您应该看见 <acronym>MOTD</acronym> 或者出现一个命令提示符
(<literal>#</literal>、<literal>$</literal> 或 <literal>%</literal> 字符).
这表明您已成功登录进入FreeBSD。</para>
</sect2>
<sect2 id="consoles-virtual">
<title>多个控制台</title>
<para>在一个控制台运行 &unix; 命令虽说很好, 但 FreeBSD 具有一次运行
多个程序的能力。 仅使用一个控制台只会浪费 FreeBSD 同时运行多任务的能力。
而 <quote>虚拟控制台</quote> 在这方面发挥强大的功能。</para>
<para>FreeBSD 能配置出满足您不同需求的虚拟控制台,
在键盘上您用一组键就能从各个虚拟控制台之间切换。
各个控制台有自己的传输通道,
当您在各个控制台切换时 FreeBSD
会切换到合适的键盘传输通道和显示器传输通道。</para>
<para>FreeBSD 各个控制台之间可利用特殊组键切换并保留原有控制台
<footnote>
<para>关于 FreeBSD
的控制台和键盘设备这些详细资料或使用技巧可在手册里找到:
&man.syscons.4;、&man.atkbd.4;、&man.vidcontrol.1;
和 &man.kbdcontrol.1;。 我们不在这里详细介绍,
但是爱好者总会在手册里找到详细的答案。</para>
</footnote>,您可这样做:
<keycombo><keycap>Alt</keycap><keycap>F1</keycap></keycombo>,
<keycombo><keycap>Alt</keycap><keycap>F2</keycap></keycombo>, 一直到
<keycombo><keycap>Alt</keycap><keycap>F8</keycap></keycombo>
在FreeBSD里切换到其中一个虚拟控制台。</para>
<para>同样地, 您正在从其中某个控制台切换到另一个控制台的时候,
FreeBSD 会保存正在使用和恢复将要使用屏幕传输通道。
这种结果形成一种 <quote>错觉</quote>,
您拥有许多<quote>虚拟</quote>屏幕和键盘可以输入很多的命令。
这些程序需要在一个虚拟控制台不能停止运行而又不需要观察它,
它继续运行而您可以切换到其他的虚拟控制台。</para>
</sect2>
<sect2 id="consoles-ttys">
<title><filename>/etc/ttys</filename>文件</title>
<para>FreeBSD 虚拟控制台的默认配置为8个,但并不是硬性设置,
您可以很容易设置虚拟控制台的个数增多或减少。
虚拟控制台的的编号和设置在 <filename>/etc/ttys</filename> 文件里。</para>
<para>您可以使用 <filename>/etc/ttys</filename> 文件在 FreeBSD 下配置虚拟控制台。
文件里每一未加注释的行都能设置一个终端或虚拟控制台
(当行里含有 <literal>#</literal> 这个字符时不能使用) 。
FreeBSD 默认配置是配置出9个虚拟控制台而只能启动8个,
以下这些行是 <literal>ttyv</literal> 一起启动:</para>
<programlisting># name getty type status comments
#
ttyv0 "/usr/libexec/getty Pc" cons25 on secure
# Virtual terminals
ttyv1 "/usr/libexec/getty Pc" cons25 on secure
ttyv2 "/usr/libexec/getty Pc" cons25 on secure
ttyv3 "/usr/libexec/getty Pc" cons25 on secure
ttyv4 "/usr/libexec/getty Pc" cons25 on secure
ttyv5 "/usr/libexec/getty Pc" cons25 on secure
ttyv6 "/usr/libexec/getty Pc" cons25 on secure
ttyv7 "/usr/libexec/getty Pc" cons25 on secure
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure</programlisting>
<para>如果要了解这个文件中每一列的详细介绍,
以及虚拟控制台上所能使用的配置,
请参考联机手册 &man.ttys.5;。</para>
</sect2>
<sect2 id="consoles-singleuser">
<title>单用户模式的控制台</title>
<para>关于 <quote>单用户模式</quote> 详细介绍在 <xref linkend="boot-singleuser"/>
这里可以找到。 当您运行单用户模式时只能使用一个控制台,
没有多个虚拟控制台可使用。 单用户模式的控制台同也可以在
<filename>/etc/ttys</filename> 文件设置,
可在这行找到要启动的<literal>控制台</literal>:</para>
<programlisting># name getty type status comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none unknown off secure</programlisting>
<note>
<para>这个 <literal>console</literal> 已经注释掉,
您可编辑这行把 <literal>secure</literal> 改为
<literal>insecure</literal>。 这样,
当用单用户进入 FreeBSD 时, 它仍然要求提供
<username>root</username> 用户的密码。</para>
<para><emphasis>在把这个选项改为
<literal>insecure</literal></emphasis> 的时候一定要小心,
如果您忘记了
<username>root</username>用户的密码, 进入单用户会有点麻烦。
尽管仍然能进入单用户模式, 但如果您不熟悉它就会非常令人头疼。</para>
</note>
</sect2>
<sect2 id="consoles-vidcontrol">
<title>改变控制台的显示模式</title>
<para>FreeBSD 控制台默认的显示模式可以被调整为 1024x768, 1280x1024,
或者任何你的显卡芯片和显示器所支持的其他尺寸。
要使用一个不同的显示模式,
你必须首先重新编译内核并包含以下2个选项:</para>
<programlisting>options VESA
options SC_PIXEL_MODE</programlisting>
<para>在内核用这2个选项编译完成后,你就可以使用 &man.vidcontrol.1;
工具来测定你的硬件支持何种显示模式了。 以 root
身份在控制台键入以下命令来获得一份所支持的显示模式列表。</para>
<screen>&prompt.root; <userinput>vidcontrol -i mode</userinput></screen>
<para>这个命令的输出是一份你的硬件所支持的显示模式列表。
你可以在以 root 身份在控制台上键入 &man.vidcontrol.1;
命令来改变显示模式:</para>
<screen>&prompt.root; <userinput>vidcontrol MODE_279</userinput></screen>
<para>如果你对于新的显示模式满意,那么可以把它加入到
<filename>/etc/rc.conf</filename> 使机器在每次启动的时候都能生效,
我们使用了上一个例子中的模式:</para>
<programlisting>allscreens_flags="MODE_279"</programlisting>
</sect2>
</sect1>
<sect1 id="permissions">
<title>权限</title>
<indexterm><primary>UNIX</primary></indexterm>
<para>FreeBSD,是 BSD &unix; 的延续, 并基于几个关键的 &unix; 观念。
从一开始就多处提到 FreeBSD 是一个多用户的操作系统,
它能分别处理几个同时工作的用户所分配的毫无关联任务。
并负责为每位用户的硬件设备、 外设、 内存和
CPU 处理时间作出合理安排。</para>
<para>因为系统有能力支持多用户, 在每一方面系统都会作出谁能读、
写和执行的资源权力限制。 这点权限以三个八位元的方式储存着,
一个是表示文件所属者, 一个是表示文件所属群组, 一个是表示其他人。
这些数字以下列方式表示:</para>
<indexterm><primary>权限</primary></indexterm>
<indexterm>
<primary>文件权限</primary>
</indexterm>
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
<thead>
<row>
<entry>数值</entry>
<entry>权限</entry>
<entry>目录列表</entry>
</row>
</thead>
<tbody>
<row>
<entry>0</entry>
<entry>不能读,不能写,不能执行</entry>
<entry><literal>---</literal></entry>
</row>
<row>
<entry>1</entry>
<entry>不能读,不能写,可执行</entry>
<entry><literal>--x</literal></entry>
</row>
<row>
<entry>2</entry>
<entry>不能读,可写,不能执行</entry>
<entry><literal>-w-</literal></entry>
</row>
<row>
<entry>3</entry>
<entry>不能读,可写,可执行</entry>
<entry><literal>-wx</literal></entry>
</row>
<row>
<entry>4</entry>
<entry>可读,不能写,不能执行</entry>
<entry><literal>r--</literal></entry>
</row>
<row>
<entry>5</entry>
<entry>可读,不能写,可执行</entry>
<entry><literal>r-x</literal></entry>
</row>
<row>
<entry>6</entry>
<entry>可读,可写,不能执行</entry>
<entry><literal>rw-</literal></entry>
</row>
<row>
<entry>7</entry>
<entry>可读,可写,可执行</entry>
<entry><literal>rwx</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<indexterm>
<primary><command>ls</command></primary>
</indexterm>
<indexterm><primary>目录</primary></indexterm>
<para>使用命令的 <option>-l</option> (&man.ls.1;)
参数可以显示出文件的所属者、 所属组和其他人等属性。
请看以下的例子:</para>
<screen>&prompt.user; <userinput>ls -l</userinput>
total 530
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
...</screen>
<para>使用 <command>ls -l</command> 在每行的开始出现了:</para>
<screen>-rw-r--r--</screen>
<para>从左边起的第一个字,告诉我们这个文件是一怎样的文件:
普通文件?目录?特殊设备?socket?或是设备文件?
在这个例子, <literal>-</literal> 表示一个普通文件。
接下来三个字是 <literal>rw-</literal> 是文件拥有者的权限。
再接下来的三个字是 <literal>r--</literal> 是文件所属群组的权限。
最後三个字是 <literal>r--</literal> 是其他人的权限。
以这一个文件为例,他的权限设定是拥有者可以读写这个文件、群组可以读取、
其他使用者也能读取这个文件。
根据上面的表格, 用数字表示这个文件其三部分的权限应该是
<literal>644</literal>。 </para>
<para>这样很好,但系统怎样对设备进行权限控制的?
事实上 FreeBSD 将大部份硬件设备当作一个文件看待,
用程序能打开、读取、写入数据就如其他的文件一样。
而设备文件放在 <filename>/dev</filename> 目录。
</para>
<para>目录也视为一种文件,也有读取、写入、执行的权限。
但目录的执行权限意义并不与普通文件相同,
实际上执行权限是进入权限。
当一个目录是被标示可以执行的时, 表示可以进入它,
或者换言之, 利用 <quote>cd</quote> (改变当前目录) 进入它。
此外, 这也表示有权进入目录的用户, 可以访问其下的已知名字的文件
(当然目录下的文件也受到访问限制)。</para>
<para>详细方面,想读取一个目录的列表就必须设为可读权限,
同时想删除一个已知的文件,就必须把目录下这个文件设为可写
<emphasis>和</emphasis> 执行权限。
</para>
<para>还有更多权限设定,
但是他们大多用在特殊状况下如一个setuid的执行文件和粘贴性目录,
如果想要得知有关文件权限和如何设定的更多资讯,请看手册&man.chmod.1;。
</para>
<sect2>
<sect2info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Contributed by </contrib>
</author>
</authorgroup>
</sect2info>
<title>权限的符号化表示</title>
<indexterm><primary>权限</primary><secondary>符号</secondary></indexterm>
<para>权限符号,某些时候就是指符号表达式,
使用八进制的字符给目录或文件分配权限。
权限符号的使用语法是 (谁) (作用) (权限)。
看看下列数值的在那些地方所起什么样的作用:</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="3">
<thead>
<row>
<entry>选项</entry>
<entry>字母</entry>
<entry>介绍</entry>
</row>
</thead>
<tbody>
<row>
<entry>(谁)</entry>
<entry>u</entry>
<entry>用户</entry>
</row>
<row>
<entry>(谁)</entry>
<entry>g</entry>
<entry>所属群体</entry>
</row>
<row>
<entry>(谁)</entry>
<entry>o</entry>
<entry>其他人</entry>
</row>
<row>
<entry>(谁)</entry>
<entry>a</entry>
<entry>所有人 (<quote>全部</quote>)</entry>
</row>
<row>
<entry>(作用)</entry>
<entry>+</entry>
<entry>增加权限</entry>
</row>
<row>
<entry>(作用)</entry>
<entry>-</entry>
<entry>减少权限</entry>
</row>
<row>
<entry>(作用)</entry>
<entry>=</entry>
<entry>确定权限</entry>
</row>
<row>
<entry>(权限)</entry>
<entry>r</entry>
<entry>可读</entry>
</row>
<row>
<entry>(权限)</entry>
<entry>w</entry>
<entry>可写</entry>
</row>
<row>
<entry>(权限)</entry>
<entry>x</entry>
<entry>执行</entry>
</row>
<row>
<entry>(权限)</entry>
<entry>t</entry>
<entry>粘贴位</entry>
</row>
<row>
<entry>(权限)</entry>
<entry>s</entry>
<entry>设置 UID 或 GID</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>这些数值 &man.chmod.1; 以习惯标定的。
举个例子,用以下命令阻止其他人访问
<replaceable>FILE</replaceable>文件:</para>
<screen>&prompt.user; <userinput>chmod go= FILE</userinput></screen>
<para>如果需要对文件一次进行多项变动, 则可用逗号分开, 在下面的例子中,
将去掉 <replaceable>FILE</replaceable> 文件的群体和 <quote>全体其他用户</quote> 可写权限,
并为所有人增加可执行权限:</para>
<screen>&prompt.user; <userinput>chmod go-w,a+x <replaceable>FILE</replaceable></userinput></screen>
<!--
<para>大部份用户没有注意到这点,
应当指出这个方法仅使用在配置一个文件权限,不会添加或删除(文件)。
</para>
-->
</sect2>
<sect2>
<sect2info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Contributed by </contrib>
</author>
</authorgroup>
</sect2info>
<title>&os; 文件标志</title>
<para>在前面所介绍的文件权限的基础之上, &os;
还支持使用 <quote>文件标志</quote>。
这些标志为文件提供了进一步的安全控制机制,
但这些控制并不适用于目录。</para>
<para>这些文件标志提供了针对文件的进一步控制,
帮助确保即使是
<username>root</username> 用户也无法删除或修改文件。</para>
<para>文件标志可以通过使用 &man.chflags.1; 工具来修改,
其用户界面很简单。 例如, 要在文件 <filename>file1</filename>
上应用系统禁删标志, 应使用下述命令:</para>
<screen>&prompt.root; <userinput>chflags sunlink <filename>file1</filename></userinput></screen>
<para>要禁用系统禁删标志, 只需在前述命令中的
<option>sunlink</option> 标志前加 <quote>no</quote>。
例如:</para>
<screen>&prompt.root; <userinput>chflags nosunlink <filename>file1</filename></userinput></screen>
<para>要显示文件上的标志, 应使用命令 &man.ls.1;
的 <option>-lo</option> 参数:</para>
<screen>&prompt.root; <userinput>ls -lo <filename>file1</filename></userinput></screen>
<para>输出结果应类似于:</para>
<programlisting>-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1</programlisting>
<para>许多标志只可以由
<username>root</username> 用户来增加, 而另一些,
则可以由文件的所有者来增加。 建议管理员仔细阅读
&man.chflags.1; 和 &man.chflags.2; 联机手册,
以对其加深理解。</para>
</sect2>
<sect2>
<sect2info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>原作 </contrib>
</author>
</authorgroup>
</sect2info>
<title>setuid、 setgid 和 sticky 权限</title>
<para>除了前面已经讨论过的那些权限之外, 还有三个管理员应该知道的权限配置。
它们是 <literal>setuid</literal>、
<literal>setgid</literal> 和 <literal>sticky</literal>。</para>
<para>这些配置对于一些 &unix; 操作而言很重要,
因为它们能提供一些一般情况下不会授予普通用户的功能。
为了便于理解, 我们首先介绍真实用户 ID (real
user ID) 和生效用户 ID (effective user ID)。</para>
<para>真实用户 ID 是拥有或启动进程的用户 <acronym>UID</acronym>。
生效 <acronym>UID</acronym>
是进程以其身份运行的用户 ID。 举例来说,
&man.passwd.1; 工具通常是以发起修改密码的用户身份启动,
也就是说其进程的真实用户 ID 是那个用户的 ID;
但是, 由于需要修改密码数据库, 它会以
<username>root</username> 用户作为生效用户 ID 的身份运行。
这样, 普通的非特权用户就可以修改口令, 而不是看到
<errorname>Permission Denied</errorname> 错误了。</para>
<note>
<para>&man.mount.8; 的 <literal>nosuid</literal>
选项可以令系统在不给出任何错误提示的情况下不执行这些程序。
另一方面, 这个选项并不是万无一失的, 正如
&man.mount.8; 联机手册所提到的那样,
如果系统中安装了绕过 <literal>nosuid</literal>
的封装程序, 那么这种保护就可以被绕过了。</para>
</note>
<para>setuid 权限可以通过在普通权限前面加上一个数字四 (4)
来设置, 如下面的例子所示:</para>
<screen>&prompt.root; <userinput>chmod 4755 suidexample.sh</userinput></screen>
<para>这样一来,
<filename><replaceable>suidexample.sh</replaceable></filename>
的权限应该如下面这样:</para>
<programlisting>-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh</programlisting>
<para>您会注意到, 在原先的属主执行权限的位置变成了
<literal>s</literal>。 这样, 需要提升特权的可执行文件,
例如 <command>passwd</command> 就可以正常运行了。</para>
<para>可以打开两个终端来观察这一情形。 在其中一个终端里面,
以普通用户身份启动 <command>passwd</command> 进程。
在它等待输入新口令时, 在另一个终端中查看进程表中关于
<command>passwd</command> 命令的信息。</para>
<para>在终端 A 中:</para>
<screen>Changing local password for trhodes
Old Password:</screen>
<para>在终端 B 中:</para>
<screen>&prompt.root; <userinput>ps aux | grep passwd</userinput></screen>
<screen>trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd
root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd</screen>
<para>正如前面所说的那样, <command>passwd</command> 是以普通用户的身份启动的,
但其生效
<acronym>UID</acronym> 是 <username>root</username>。</para>
<para>与此对应, <literal>setgid</literal> 权限的作用,
与 <literal>setuid</literal> 权限类似,
只是当应用程序配合这一设定运行时, 它会被授予拥有文件的那个组的权限。</para>
<para>如果需要在文件上配置 <literal>setgid</literal> 权限,
可以在权限数值前面增加数字二 (2) 来运行 <command>chmod</command> 命令,
如下面的例子所示:</para>
<screen>&prompt.root; <userinput>chmod 2755 sgidexample.sh</userinput></screen>
<para>可以用与前面类似的方法来检视新设定的生效情况, 在组权限的地方的
<literal>s</literal> 表示这一配置已经生效:</para>
<screen>-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh</screen>
<note>
<para>在这些例子中, 尽管 shell 脚本也属于可执行文件的一种,
但它们不会以您配置的 <acronym>EUID</acronym> 或生效用户 ID 的身份运行。
这是因为 shell 脚本可能无法直接呼叫
&man.setuid.2; 调用。</para>
</note>
<para>我们已经讨论了两个特殊权限位
(<literal>setuid</literal> 和 <literal>setgid</literal>
权限位), 它们让用户在使用程序时能够用到更高的权限,
有时这会削弱系统的安全性。 除了这两个之外, 还有第三个特殊权限位:
<literal>sticky bit</literal>, 它能够增强安全性。</para>
<para>当在目录上设置了 <literal>sticky bit</literal> 之后,
其下的文件就只能由文件的所有者删除了。 这个权限设置能够防止用户删除类似
<filename class="directory">/tmp</filename> 这样的公共目录中不属于他们的文件。
要应用这种权限, 可以在权限设置前面加上数字一 (1)。 例如:</para>
<screen>&prompt.root; <userinput>chmod 1777 /tmp</userinput></screen>
<para>现在, 可以用
<command>ls</command> 命令来查看效果:</para>
<screen>&prompt.root; <userinput>ls -al / | grep tmp</userinput></screen>
<screen>drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp</screen>
<para>这里的结尾的 <literal>t</literal> 表示了
<literal>sticky bit</literal> 权限。</para>
</sect2>
</sect1>
<sect1 id="dirstructure">
<title>目录架构</title>
<indexterm><primary>目录层次</primary></indexterm>
<para>理解 FreeBSD 的目录层次结构对于建立对系统整体的理解十分重要的基础。
其中, 最重要的概念是根目录,
<quote>/</quote>。 这个目录是系统引导时挂接的第一个目录,
它包含了用以准备多用户操作所需的操作系统基础组件。
根目录中也包含了用于在启动时转换到多用户模式之前挂接其他文件系统所需的挂接点。</para>
<para>挂接点 (mount point) 是新增的文件系统在接入现有系统时的起点位置 (通常是根目录)。
在 <xref linkend="disk-organization"/> 对此进行了详细的阐述。
标准的挂接点包括
<filename>/usr</filename>、 <filename>/var</filename>、 <filename>/tmp</filename>、
<filename>/mnt</filename>, 以及 <filename>/cdrom</filename>。
这些目录通常会在
<filename>/etc/fstab</filename>
文件中提及。 <filename>/etc/fstab</filename>
是一张包含系统中各个文件系统及挂接点的表。
在 <filename>/etc/fstab</filename> 中的绝大多数文件系统都会在启动时由
&man.rc.8; 脚本自动挂接, 除非特别指定了 <option>noauto</option> 选项。
更多细节请参考 <xref linkend="disks-fstab"/>。</para>
<para>您可以通过 &man.hier.7; 来了解完整的文件系统层次说明。
现在, 让我们先来看一看绝大多数的常见的目录以供参考。</para>
<para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry>目录</entry>
<entry>介绍</entry>
</row>
</thead>
<tbody valign="top">
<row>
<entry><filename class="directory">/</filename></entry>
<entry>文件系统的根目录。</entry>
</row>
<row>
<entry><filename class="directory">/bin/</filename></entry>
<entry>在单个用户和多用户环境下的基本工具目录。
</entry>
</row>
<row>
<entry><filename class="directory">/boot/</filename></entry>
<entry>在操作系统在启动加载期间所用的程序和配置。
</entry>
</row>
<row>
<entry><filename class="directory">/boot/defaults/</filename></entry>
<entry>默认每步引导启动的配置内容,请查阅&man.loader.conf.5;。
</entry>
</row>
<row>
<entry><filename class="directory">/dev/</filename></entry>
<entry>设备节点,请查阅 &man.intro.4;。</entry>
</row>
<row>
<entry><filename class="directory">/etc/</filename></entry>
<entry>系统启动的配置和脚本。</entry>
</row>
<row>
<entry><filename class="directory">/etc/defaults/</filename></entry>
<entry>系统默认的启动配置和脚本,请参考 &man.rc.8; 。</entry>
</row>
<row>
<entry><filename class="directory">/etc/mail/</filename></entry>
<entry>关系到邮件系统运作的配置, 请参考 &man.sendmail.8;。</entry>
</row>
<row>
<entry><filename class="directory">/etc/namedb/</filename></entry>
<entry><command>named</command> 配置文件,请参考 &man.named.8;。</entry>
</row>
<row>
<entry><filename class="directory">/etc/periodic/</filename></entry>
<entry>每天、每星期和每月周期性地运行的脚本,
请通过 &man.cron.8;查阅 &man.periodic.8;。</entry>
</row>
<row>
<entry><filename class="directory">/etc/ppp/</filename></entry>
<entry><command>ppp</command>配置文件,请查阅&man.ppp.8;。
</entry>
</row>
<row>
<entry><filename class="directory">/mnt/</filename></entry>
<entry>由管理员习惯使用挂接点的临时空目录。</entry>
</row>
<row>
<entry><filename class="directory">/proc/</filename></entry>
<entry>运行中的文件系统,请参阅 &man.procfs.5;
和 &man.mount.procfs.8;。</entry>
</row>
<row>
<entry><filename class="directory">/rescue/</filename></entry>
<entry>用于紧急恢复的一组静态联编的程序; 参见
&man.rescue.8;。</entry>
</row>
<row>
<entry><filename class="directory">/root/</filename></entry>
<entry><username>root</username>用户的Home(主)目录。</entry>
</row>
<row>
<entry><filename class="directory">/sbin/</filename></entry>
<entry>在单个用户和多用户环境下的存放系统程序和管理所需的基本实用目录。</entry>
</row>
<row>
<entry><filename class="directory">/tmp/</filename></entry>
<entry>临时文件。
<filename class="directory">/tmp</filename> 目录中的内容,
一般不会在系统重新启动之后保留。 通常会将基于内存的文件系统挂在
<filename class="directory">/tmp</filename> 上。
这一工作可以用一系列 tmpmfs 相关的 &man.rc.conf.5; 变量来自动完成。
(或者, 也可以在
<filename>/etc/fstab</filename> 增加对应项; 参见 &man.mdmfs.8;)。</entry>
</row>
<row>
<entry><filename class="directory">/usr/</filename></entry>
<entry>存放大多数用户的应用软件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/bin/</filename></entry>
<entry>存放实用命令,程序设计工具,和应用软件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/include/</filename></entry>
<entry>存放标准 C include 文件.</entry>
</row>
<row>
<entry><filename class="directory">/usr/lib/</filename></entry>
<entry>存放库文件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/libdata/</filename></entry>
<entry>存放各种实用工具的数据文件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/libexec/</filename></entry>
<entry>存放系统实用或后台程序 (从另外的程序启动执行)。</entry>
</row>
<row>
<entry><filename
class="directory">/usr/local/</filename></entry>
<entry>存放本地执行文件, 库文件等等,
同时也是 FreeBSD ports 安装的默认安装目录。
<filename>/usr/local</filename> 在
<filename>/usr</filename> 中的目录布局大体相同,
请查阅 &man.hier.7;。 但
man 目录例外, 它们是直接放在
<filename>/usr/local</filename> 而不是
<filename>/usr/local/share</filename> 下的,
而 ports 说明文档在
<filename>share/doc/<replaceable>port</replaceable></filename>。</entry>
</row>
<row>
<entry><filename class="directory">/usr/obj/</filename></entry>
<entry>通过联编 <filename>/usr/src</filename> 得到的目标文件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/ports/</filename></entry>
<entry>存放 FreeBSD 的 Ports Collection (可选)。</entry>
</row>
<row>
<entry><filename class="directory">/usr/sbin/</filename></entry>
<entry>存放系统后台程序 和 系统工具 (由用户执行)。</entry>
</row>
<row>
<entry><filename class="directory">/usr/share/</filename></entry>
<entry>存放架构独立的文件。</entry>
</row>
<row>
<entry><filename class="directory">/usr/src/</filename></entry>
<entry>存放 BSD 或者本地源码文件。</entry>
</row>
<row>
<entry><filename
class="directory">/usr/X11R6/</filename></entry>
<entry>存放 X11R6 可执行文件、 库文件、 配置文件等的目录(可选)。
</entry>
</row>
<row>
<entry><filename class="directory">/var/</filename></entry>
<entry>多用途日志、 临时或短期存放的, 以及打印假脱机系统文件。
有时会将基于内存的文件系统挂在
<filename class="directory">/var</filename> 上。
这一工作可以通过在 &man.rc.conf.5; 中设置一系列 varmfs 变量
(或在
<filename>/etc/fstab</filename> 中加入一行配置; 参见 &man.mdmfs.8;)
来完成。</entry>
</row>
<row>
<entry><filename class="directory">/var/log/</filename></entry>
<entry>存放各种的系统记录文件。</entry>
</row>
<row>
<entry><filename class="directory">/var/mail/</filename></entry>
<entry>存放用户mailbox(一种邮件存放格式)文件。</entry>
</row>
<row>
<entry><filename class="directory">/var/spool/</filename></entry>
<entry>各种打印机和邮件系统spooling(回环)的目录。
</entry>
</row>
<row>
<entry><filename class="directory">/var/tmp/</filename></entry>
<entry>临时文件。 这些文件在系统重新启动时通常会保留,
除非 <filename class="directory">/var</filename>
是一个内存中的文件系统。</entry>
</row>
<row>
<entry><filename class="directory">/var/yp/</filename></entry>
<entry>NIS 映射。</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect1>
<sect1 id="disk-organization">
<title>磁盘组织</title>
<para>FreeBSD 查找文件的最小单位是文件名。
而文件名区分大小写,这就意味着
<filename>readme.txt</filename> 和 <filename>README.TXT</filename>
是两个不相同的文件。 FreeBSD 不凭文件扩展名
(<filename>.txt</filename>) 去识别这个文件是
程序、 文档, 或是其他格式的数据。</para>
<para>各种文件存放在目录里。 一个目录可以为空,
也可以含有多个的文件。一个目录同样可以包含其他的目录,
允许您在一个目录里建立多个不同层次的目录。
这将帮助您轻松地组织您的数据。</para>
<para>文件或目录是由文件名或目录名,加上斜线符号 <literal>/</literal>,
再根据需要在目录名后面加上其他目录的名称。
如果您有一个名为 <filename>foo</filename>
的目录, 它包含另一个目录
<filename>bar</filename>, 后者包括一个叫
<filename>readme.txt</filename> 的文件, 则全名, 或者说到文件的
<firstterm>路径</firstterm> 就是
<filename>foo/bar/readme.txt</filename>。</para>
<para>在文件系统里目录和文件的作用是存储数据。
每一个文件系统都有且只有一个顶级目录 <firstterm>根目录</firstterm>,
这个根目录则可以容纳其他目录。</para>
<para>您也许在其他的一些操作系统碰到类似这里的情况,
当然也有不同的情况。 举些例子, &ms-dos; 是用
<literal>\</literal> 分隔文件名或目录名,
而 &macos; 则使用<literal>:</literal>。</para>
<para>FreeBSD在路径方面不使用驱动器名符号或驱动器名称,
在FreeBSD里您不能这样使用:
<filename>c:/foo/bar/readme.txt</filename>。</para>
<para>为了代替(驱动器名符号), 一个文件系统会指定 <firstterm>根
文件系统</firstterm>, 根文件系统的根目录是
<literal>/</literal>。 其他每一个文件系统
<firstterm>挂接在</firstterm>根文件系统下。
无论有多少磁盘在FreeBSD 系统里, 每个磁盘都会以目录的方式加上。</para>
<para>假设您有三个文件系统, 名为 <literal>A</literal>、
<literal>B</literal> 和 <literal>C</literal>。
每个文件系统有一个根目录, 而各自含有两个其他的目录, 名为
<literal>A1</literal>, <literal>A2</literal> (
<literal>B1</literal>, <literal>B2</literal> 和
<literal>C1</literal>, <literal>C2</literal>)。</para>
<para>看看 <literal>A</literal> 这个根文件系统。 假如您用
<command>ls</command> 命令来查看这个目录您会见到两个子目录:
<literal>A1</literal> 和 <literal>A2</literal>。
这个目录树是这个样子:</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/example-dir1" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced"> /
|
+--- A1
|
`--- A2</literallayout>
</textobject>
</mediaobject>
<para>一个文件系统必须挂到另一个文件系统的某一目录,
所以现在假设把 <literal>B</literal> 文件系统挂到
<literal>A1</literal>目录, 那 <literal>B</literal> 根目录因此代替
了 <literal>A1</literal>,而显示出 <literal>B</literal>
目录(的内容):</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/example-dir2" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced"> /
|
+--- A1
| |
| +--- B1
| |
| `--- B2
|
`--- A2</literallayout>
</textobject>
</mediaobject>
<para>无论<literal>B1</literal> 或
<literal>B2</literal> 目录在那里而延伸出来的路径必须为
<filename>/A1/B1</filename> 或 <filename>/A1/B2</filename>。
而在 <filename>/A1</filename> 里原有的文件会临时隐藏。
想这些文件再出现把 <literal>B</literal> 从 A
<firstterm>挂接释放</firstterm>。</para>
<para>所有在<literal>B1</literal> 或 <literal>B2</literal>
目录里的文件都可以通过 <filename>/A1/B1</filename> 或
<filename>/A1/B2</filename> 访问。而在 <filename>/A1</filename>
中原有的文件会被临时隐藏,直到 <literal>B</literal> 从 A
上被<firstterm>卸载</firstterm> (unmout) 为止。</para>
<para>把 <literal>B</literal> 挂接在 <literal>A2</literal>
那图表的样子就是这样子:</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/example-dir3" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced"> /
|
+--- A1
|
`--- A2
|
+--- B1
|
`--- B2</literallayout>
</textobject>
</mediaobject>
<para>这个路径分别是 <filename>/A2/B1</filename> 和
<filename>/A2/B2</filename> 。</para>
<para>文件系统能把顶部挂接在另一个文件系统上。
继续这个例子, 把 <literal>C</literal> 文件系统挂接在
<literal>B</literal> 文件系统里的 <literal>B1</literal> 目录,
排列如下:</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/example-dir4" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced"> /
|
+--- A1
|
`--- A2
|
+--- B1
| |
| +--- C1
| |
| `--- C2
|
`--- B2</literallayout>
</textobject>
</mediaobject>
<para>或者把 <literal>C</literal> 文件系统挂接在 <literal>A</literal>
文件系统里的<literal>A1</literal>目录:</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/example-dir5" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced"> /
|
+--- A1
| |
| +--- C1
| |
| `--- C2
|
`--- A2
|
+--- B1
|
`--- B2</literallayout>
</textobject>
</mediaobject>
<para>假如您熟悉 &ms-dos; 并知道 <command>join</command> 命令,
尽管不相同,其实功能是相似的。</para>
<para>这方面不是普通知识而且涉及到您自己所关心的,
当您安装FreeBSD并在以后添加新磁盘时,
您必须知到该如何新建文件系统和挂接上。</para>
<para>(FreeBSD系统)它有一个主要的根文件系统, 不需要另外新建立,
但当需要手工处理时,这是一个有用的知识。</para>
<itemizedlist>
<title>多个文件系统的益处</title>
<listitem>
<para>不同的文件系统可用不同的 <firstterm>挂接参数</firstterm>。
举些例子, 仔细想一下, 根文件系统能用只读的方式挂接上,
防止不经意删除或编辑到一个危险的文件。
把各用户能写入的文件系统分开,
像<filename>/home</filename>这样,
由另外的文件系统分别用
<firstterm>nosuid</firstterm> 参数挂接,这个参数防止
<firstterm>suid</firstterm>/<firstterm>guid</firstterm>
在执行这个文件系统中的文件时生效, 从而缓解了一些安全问题。</para>
</listitem>
<listitem>
<para>FreeBSD 能根据一个文件系统使用的情况自动优化
这个文件系统上的文件布局。
所以对一个存储了大量小文件并会被频繁写入文件系统的优化与一个存储了少量大文件的优化是不同的。
而在一个大的单一文件系统上则无法体现这样的优化。</para>
</listitem>
<listitem>
<para>FreeBSD 的文件系统能够在断电时尽可能避免损失。
然而, 在关键点时的电源失效仍然可能会破坏文件系统的结构。
将您的文件系统分成多个有助于分散风险, 并方便备份和恢复。</para>
</listitem>
</itemizedlist>
<itemizedlist>
<title>单一文件系统的益处</title>
<listitem>
<para>文件系统是固定大小的。
当安装FreeBSD时新建一个文件系统并设定一个大小,
您会在稍后发觉到必须去建一个大的分区。
如果配置不当, 则需要备份、 重新创建文件系统,
然后再恢复数据。</para>
<important>
<para>FreeBSD 提供了 &man.growfs.8;
命令。 这使得能够实时地调整文件系统的大小,
因而不再受其限制。</para>
</important>
</listitem>
</itemizedlist>
<para>文件系统是和分区一一对应的。
这里的分区和常用的术语分区 (例如, &ms-dos; 分区)
的意思并不一样, 这是由于 &os; 的 &unix; 传统造成的。
每一个分区使用一个从 <literal>a</literal> 到
<literal>h</literal> 的字母来表示。 每个分区只能包含一个文件系统,
这意味着文件系统通常可以由它们在文件系统目录结构中的挂接点,
或对应的分区字母来表示。</para>
<para>FreeBSD 的 <firstterm>交换分区</firstterm> 也需要使用磁盘空间。
交换分区是给 FreeBSD 作 <firstterm>虚拟内存</firstterm> 使用的,
这样能令您的计算机有更多的内存可使用,
当FreeBSD在运行而内存不够的时候,
它会把其他一些可转移的数据转移到交换分区,
空出内存的位置以供使用。</para>
<para>某些 partitions 的用途是确定的。</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="5*"/>
<thead>
<row>
<entry>分区</entry>
<entry>约定</entry>
</row>
</thead>
<tbody valign="top">
<row>
<entry><literal>a</literal></entry>
<entry>通常指定为根文件系统</entry>
</row>
<row>
<entry><literal>b</literal></entry>
<entry>通常指定为交换分区</entry>
</row>
<row>
<entry><literal>c</literal></entry>
<entry>通常它和所在的 slice 大小相同。
<literal>c</literal> 分区上工作时必定会影响到事整个
slice (举个例子,坏块扫描器)。
您通常不愿意在这个partition建立文件系统。</entry>
</row>
<row>
<entry><literal>d</literal></entry>
<entry>分区 <literal>d</literal> 曾经有特殊的含义,
不过这种意义在现时的系统上已不再适用, 因此
<literal>d</literal> 可以和任何其它普通的分区一样使用了。</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>每一个包含了文件系统的分区被保存在
FreeBSD 称为 <firstterm>slice</firstterm> 的部分上。
Slice 是一个 FreeBSD 术语, 通常被叫做分区,
再次强调, 这是由于
FreeBSD 的 &unix; 背景。 Slices 有其编号, 从1到4。</para>
<indexterm><primary>slices</primary></indexterm>
<indexterm><primary>partitions</primary></indexterm>
<indexterm><primary>专用 (dangerously dedicated)</primary></indexterm>
<para>Slice 编号在设备名后面, 并有一个 <literal>s</literal>
前缀, 从 1 开始。 因此 <quote>da0<emphasis>s1</emphasis></quote>
是第一个 SCSI 驱动器的第一个 slice。 每个磁盘上只能有四个物理的
slices, 但您可以在物理 slice 中使用适当的类型来创建逻辑 slice。
这些扩展 slice 编号从 5 开始, 因此
<quote>ad0<emphasis>s5</emphasis></quote> 是第一个 IDE 磁盘中的第一个
扩展 slice。 文件系统所使用的设备应该占满 slice。</para>
<para>Slices, <quote>专用指定</quote> 物理驱动器,
和其他驱动器都包含 <firstterm>partitions</firstterm>,
那几个的 partitions 都是用字母从 <literal>a</literal>
到 <literal>h</literal> 来标定的,
而这些字母都在驱动器名字之后,所以
<quote>da0<emphasis>a</emphasis></quote> 是指首个da设备的 a partition,
而那个就是 <quote>专项指定</quote>。
<quote>ad1s3<emphasis>e</emphasis></quote> 是指IDE磁盘上第三个slice的第五个partition。
</para>
<para>最终,每个磁盘都被系统识别。
一个磁盘名字是用磁盘类型代码和编号来标识的,
它不像slices,磁盘的编号是由0开始的。
对应代码请看这里所列出的<xref linkend="basics-dev-codes"/>。</para>
<para>当在 FreeBSD 中指定 partition 名字时,
必须同时包含这个分区的 slice 和磁盘的名字; 类似地,
在指定 slice 时, 也应该给出包含该 slice 的磁盘名字。 可这样列出:
磁盘名称,<literal>s</literal>,slice 编号,和partition标定字母。
例子请看
<xref linkend="basics-disk-slice-part"/>。</para>
<para><xref linkend="basics-concept-disk-model"/>
这里显示了一个磁盘的布局,有更清楚的帮助。</para>
<para>在安装FreeBSD时,您首先要配置好磁盘slices,
然后在FreeBSD使用的slice上建立partitions。
并在每个partition上建立一个文件系统(或交换分区),
和指定文件系统的挂接位置。</para>
<table frame="none" pgwide="1" id="basics-dev-codes">
<title>磁盘设备的代码</title>
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="5*"/>
<thead>
<row>
<entry>代码</entry>
<entry>说明</entry>
</row>
</thead>
<tbody>
<row>
<entry><devicename>ad</devicename></entry>
<entry>ATAPI (IDE) 磁盘</entry>
</row>
<row>
<entry><devicename>da</devicename></entry>
<entry>SCSI 直接存取磁盘</entry>
</row>
<row>
<entry><devicename>acd</devicename></entry>
<entry>ATAPI (IDE) 光驱</entry>
</row>
<row>
<entry><devicename>cd</devicename></entry>
<entry>SCSI 光驱</entry>
</row>
<row>
<entry><devicename>fd</devicename></entry>
<entry>软驱</entry>
</row>
</tbody>
</tgroup>
</table>
<example id="basics-disk-slice-part">
<title>样例磁盘, Slice, 和 Partition 它们的命名</title>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="5*"/>
<thead>
<row>
<entry>命名</entry>
<entry>说明</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>ad0s1a</literal></entry>
<entry>在首个IDE磁盘(<literal>ad0</literal>)上的
第一个slice (<literal>s1</literal>)里的
第一个partition (<literal>a</literal>)。
</entry>
</row>
<row>
<entry><literal>da1s2e</literal></entry>
<entry>在第二个SCSI磁盘(<literal>da1</literal>)上的
第二个slice(<literal>s2</literal>)里的
第五个partition(<literal>e</literal>)。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
<example id="basics-concept-disk-model">
<title>一个磁盘的布局</title>
<para>从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。
假设磁盘大小为4 GB,它里面包含了两个2 GB 大小的slices (但在&ms-dos;叫partitions)。
首个slice是一个&ms-dos;磁盘叫<devicename>C:</devicename>,
而第二个slice是FreeBSD配置好的slice。
FreeBSD配置好的slice有三个partitions和另一个交换分区。</para>
<para>这三个partitions各自控制一个文件系统。
partition<literal>a</literal> 用于根文件系统,
partition<literal>e</literal> 用于 <filename>/var</filename> 目录层,
partition<literal>f</literal> 用于 <filename>/usr</filename> 目录层。</para>
<mediaobject>
<imageobject>
<imagedata fileref="install/disk-layout" format="EPS"/>
</imageobject>
<textobject>
<literallayout class="monospaced">.-----------------. --.
| | |
| DOS / Windows | |
: : > First slice, ad0s1
: : |
| | |
:=================: ==: --.
| | | Partition a, mounted as / |
| | > referred to as ad0s2a |
| | | |
:-----------------: ==: |
| | | Partition b, used as swap |
| | > referred to as ad0s2b |
| | | |
:-----------------: ==: | Partition c, no
| | | Partition e, used as /var > file system, all
| | > referred to as ad0s2e | of FreeBSD slice,
| | | | ad0s2c
:-----------------: ==: |
| | | |
: : | Partition f, used as /usr |
: : > referred to as ad0s2f |
: : | |
| | | |
| | --' |
`-----------------' --'</literallayout>
</textobject>
</mediaobject>
</example>
</sect1>
<sect1 id="mount-unmount">
<title>文件系统的挂接和卸下</title>
<para>
这种文件系统就像一棵树那样用<filename>/</filename>确立根部,
是比较理想的文件系统。
而<filename>/dev</filename>、 <filename>/usr</filename>
和其他目录就是根目录的分枝,
另外这些目录可以再分枝,例如<filename>/usr/local</filename>。
</para>
<indexterm><primary>根文件系统</primary></indexterm>
<para>应该考虑给某些目录一些空间从而分散文件系统。
<filename>/var</filename>
之下包含目录 <filename>log/</filename>,目录<filename>spool/</filename>,
和不同类型的临时文件,很可能把它塞满。
把什么都塞进根文件系统不是一个好主意,
好的做法是应该把 <filename>/var</filename> 从
<filename>/</filename>分离出去。</para>
<para>另一个要考虑的是,给物理设备或虚拟磁盘这些自带空间的文件系统确定目录结构树。
例如 <link
linkend="network-nfs">网络文件系统</link> 或光驱的挂接。
</para>
<sect2 id="disks-fstab">
<title><filename>fstab</filename> 文件</title>
<indexterm>
<primary>文件系统</primary>
<secondary>使用fstab的挂接</secondary>
</indexterm>
<para>在 <link linkend="boot">引导过程</link> 期间,
自动挂上<filename>/etc/fstab</filename>所列出的文件系统。
(除非他们注明为<option>noauto</option> 选项)。
</para>
<para> <filename>/etc/fstab</filename> 文件包含的各行的列表格式如下:
</para>
<programlisting><replaceable>device</replaceable> <replaceable>/mount-point</replaceable> <replaceable>fstype</replaceable> <replaceable>options</replaceable> <replaceable>dumpfreq</replaceable> <replaceable>passno</replaceable></programlisting>
<variablelist>
<varlistentry>
<term><literal>device</literal></term>
<listitem>
<para>设备名称(设备必须存在), 说明在
<xref linkend="disks-naming"/>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>mount-point</literal></term>
<listitem><para>目录 (目录必须存在),
用在那个挂接上的文件系统上。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>fstype</literal></term>
<listitem><para>文件系统类型,请通过&man.mount.8;查阅。
默认的FreeBSD文件系统类型是<literal>ufs</literal>。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options</literal></term>
<listitem><para>
设为可读写文件系统的<option>rw</option>选项,
或设为只读文件系统的<option>ro</option>选项,
或其他一些选项,可随意选一个。
一个常用的选项 <option>noauto</option> 用在不需在引导过程期间挂接的文件系统。
其他的选项在 &man.mount.8; 手册里列出。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>dumpfreq</literal></term>
<listitem><para>&man.dump.8;
使用这项去决定那个文件系统必须移贮。
假如缺少这项,默认的数值为0。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>passno</literal></term>
<listitem>
<para>这一项决定文件系统的检查顺序,
文件系统想跳过检查应将<literal>passno</literal>设为0。
根文件系统(那个是在每方面开始之前必须检查的)
应该将它的 <literal>passno</literal> 设为1,
其他文件系统的 <literal>passno</literal>
必须把数值设到大于1。假如多个文件系统的<literal>passno</literal>的值相同,
那么 &man.fsck.8; 在允许的情况下将尝试并行地去检查文件系统。
</para>
</listitem>
</varlistentry>
</variablelist>
<para>请参阅 &man.fstab.5; 联机手册,
以获得关于 <filename>/etc/fstab</filename> 文件格式,
以及其中所包含的选项的进一步信息。</para>
</sect2>
<sect2 id="disks-mount">
<title> <command>mount</command> 命令</title>
<indexterm>
<primary>文件系统</primary>
<secondary>挂接</secondary>
</indexterm>
<para>这个 &man.mount.8; 命令是挂接文件系统的基本运用。
</para>
<para>使用最多的基本格式:</para>
<informalexample>
<screen>&prompt.root; <userinput>mount <replaceable>device</replaceable> <replaceable>mountpoint</replaceable></userinput></screen>
</informalexample>
<para>它的选项非常多,而&man.mount.8; 手册同样提及, 但常用的都在这里:</para>
<variablelist>
<title>挂接的各种选项</title>
<varlistentry>
<term><option>-a</option></term>
<listitem>
<para>挂接<filename>/etc/fstab</filename>里所有列出的文件系统。
除非标记为 <quote>noauto</quote> 或作了排除在外的
<option>-t</option> 类型标记,或者在这之前已挂上。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-d</option></term>
<listitem>
<para>除了实际上系统调用以外,可以完成任何事情,这个选项是和
<option>-v</option>参数一起连在一块使用,可以决定&man.mount.8;所做的事情。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-f</option></term>
<listitem>
<para>强制去挂接一个未知的文件系统(会有危险),
或当把一个文件系统挂接状态由可读写降为只读时,强制撤消可写通道。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-r</option></term>
<listitem>
<para>以只读方式挂接文件系统。
这和在指定了 <option>-o</option> 选项配合
<option>ro</option> 参数的效果是一样的。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-t</option>
<replaceable>fstype</replaceable></term>
<listitem>
<para>根据给出的文件系统类型挂接文件系统,
假如给于<option>-a</option>选项,仅挂接这个类型的文件系统。
</para>
<para><quote>ufs</quote> 是默认的文件系统类型。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-u</option></term>
<listitem>
<para>在文件系统上修改挂接选项。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-v</option></term>
<listitem>
<para>版本模式。</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-w</option></term>
<listitem>
<para>以可读写方式挂接文件系统。</para>
</listitem>
</varlistentry>
</variablelist>
<para>The <option>-o</option> 选项采用一个逗号分开以下多个选项:</para>
<variablelist>
<varlistentry>
<term>noexec</term>
<listitem>
<para>不允许文件系统上的二进制程序执行。这也是一个有用的安全选项。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>nosuid</term>
<listitem>
<para>不允许文件系统上的 setuid 或 setgid 标记生效。这也是一个有用的安全选项。
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="disks-umount">
<title> <command>umount</command> 命令</title>
<indexterm>
<primary>文件系统</primary>
<secondary>卸下</secondary>
</indexterm>
<para>&man.umount.8; 命令同样采用一个参数、一个挂接点、一个设备名。
或采用<option>-a</option>选项,又或采用<option>-A</option>选项。
</para>
<para>所有格式都可采用 <option>-f</option> 去强行卸下,
或采用<option>-v</option> 用那适当的版本。 但警告,采用
<option>-f</option>并不是一个好主意,
强行卸下文件系统可能损坏计算机或破坏文件系统上的数据。
</para>
<para><option>-a</option> 和 <option>-A</option> 会卸下所有已挂接的文件系,
可能通过<option>-t</option>后面列出的文件系统进行修改,
但无论如何,<option>-A</option>都不会尝试去卸下根文件系统。
</para>
</sect2>
</sect1>
<sect1 id="basics-processes">
<title>进程</title>
<para>FreeBSD 是一个多任务操作系统。
这就意味着好像一次可以运行一个以上的程序。
每个占用一定时间运行的程序就叫 <firstterm>进程</firstterm> (process)。
你运行的每一个命令会至少启动一个新进程,还有很多一直运行着的系统进程,
用以维持系统的正常运作。
</para>
<para>每个进程用来标识的一个编号就叫
<firstterm>进程 ID</firstterm>, 或叫 <firstterm>PID</firstterm>。
而且,就像文件那样,每个进程也有所属用户和所属群体。
所属用户和所属群体使用在这方面:确定这个进程可以打开那些文件和那些设备,
从而在初期使用文件的权限。 多数的进程都有一个父进程,
而进程是依靠父进程来启动的。
例如,假如您把命令输入到shell里那shell是一个进程,而您运行的各个命令同样是进程,
那么,shell就是您各个运行进程的父进程。
而这方面有一个例外的进程就叫&man.init.8;。
<command>init</command>始终是首个进程,,所以他的PID始终是1,
而<command>init</command>在FreeBSD起动时由内核自动启动。</para>
<para>在系统上,有两个命令对进程观察非常有用:&man.ps.1; 和 &man.top.1;。
这个<command>ps</command>命令作用是观察当前运行进程的状态,
显示他们的PID,使用了多少内存,它们启动的命令行。
而<command>top</command>命令则是显示所有运行进程,并在以秒计的短时内更新数据。
您能交互式的观察您计算机的工作。
</para>
<para>默认情况下, <command>ps</command>仅显示出您自己所运行的命令。
例如:</para>
<screen>&prompt.user; <userinput>ps</userinput>
PID TT STAT TIME COMMAND
298 p0 Ss 0:01.10 tcsh
7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
48730 p0 IW 0:00.00 (dns helper) (navigator-linux-)
72210 p0 R+ 0:00.00 ps
390 p1 Is 0:01.14 tcsh
7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y
6688 p3 IWs 0:00.00 tcsh
10735 p4 IWs 0:00.00 tcsh
20256 p5 IWs 0:00.00 tcsh
262 v0 IWs 0:00.00 -tcsh (tcsh)
270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc
285 v0 S 0:38.45 /usr/X11R6/bin/sawfish</screen>
<para>在这个例子里您可看到,从 &man.ps.1; 输出的每一列是有规律的。
<literal>PID</literal> 就是进程ID,这个较早前已讨论过了。
PID号的分配由 1一直上升直到99999,
当您运行到超过限制时,这些编号会回转分配
(仍在使用中的 PID 不会分配给其他进程)。
<literal>TT</literal>这一列显示了程序运行所在的终端, 目前可以安全地忽略。
<literal>STAT</literal> 显示程序的状态,也可以安全地被忽略。
<literal>TIME</literal>是程序在CPU处理时间—运行的时间量,
并不是指您程序启动到现在的所用的时间。
许多程序碰巧遇到某方面在他们之前要花费大量CPU处理时间时,他们就必须等候。
最后, <literal>COMMAND</literal> 是运行程序时使所用的命令行。</para>
<para>&man.ps.1;支持使用各种选项去改变显示出来的内容,
最有用的一个就是<literal>auxww</literal>。
<option>a</option>选项显示出所有运行进程的内容, 而不仅仅是您的进程。
<option>u</option>选项显示出进程所归属的用户名字以及内存使用,
<option>x</option> 选项显示出后台进程。 而
<option>ww</option> 选项表示为 &man.ps.1; 把每个进程的整个命令行全部显示完,
而不是由于命令行过长就把它从屏幕上截去。</para>
<para>下面和从&man.top.1;输出是类似的,一个示例式对话就象这样子:
</para>
<screen>&prompt.user; <userinput>top</userinput>
last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10
47 processes: 1 running, 46 sleeping
CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle
Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top
7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14
281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA
296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm
48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu
175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd
7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt
...</screen>
<para>这个输出分成两部份。 前面部份(起始前五行)
显示了:运行于最后进程的PID、 系统负载均衡
(那个是指系统繁忙时的调节方式)、 系统正常运行时间 (
指从启动算起所用的时间) 和当前时间。 前面部份另外的图表
涉及:多少进程在运行(这个情况是47), 多少内存和多少交换分区在使用,
和在不同CPU状态里系统消耗多少时间。</para>
<para>在那下面一连串的纵列和从&man.ps.1;输出的的内存是相似的。
如以前&man.ps.1;一样,您能见到:PID、用户名、CPU处理时间合计、运行的命令。
&man.top.1;默认是显示您的进程所用内存空间的合计。
内存空间这里分成两列,一列为总体大小,另一列是必须请求驻留大小是多少内存—总体大小。
而驻留大小实际上是瞬间使用的多少。
在以上那个例子,您会看到那<application>&netscape;</application>总计需要30 MB内存,
但实际只用了9 MB。
</para>
<para>&man.top.1; 每两秒自动刷新一次,您可以用<option>s</option>改变刷新的秒数。
</para>
</sect1>
<sect1 id="basics-daemons">
<title>守护进程,信号和杀死进程</title>
<para>当您运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。
您之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的<firstterm>终端</firstterm>。
一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。
例如,一个web系统整天都在作web请求的响应,他不需要您输入任何东西就能完成,
这个类别的另一个例子就是把email的传送。
</para>
<para>我们把那些程序叫 <firstterm>守护进程</firstterm>。
守护神是希腊神话中的一些人物,非正非邪,他们是些守护小精灵, 大体上为人类作出贡献。
许多类似web服务或mail服务的系统对于今天仍有用途,
这就是为什么在那么长的时间里,BSD的吉祥物保持为一双鞋加一把钢叉的守护神模样。
</para>
<para>守护进程的程序命名通常在最后加一个 <quote>d</quote>。
<application>BIND</application> 是伯克利互联网域名服务 (而实际执行的程序名称则是
<command>named</command>),
<application>Apache</application> web系统的程序就叫 <command>httpd</command>,
在行式打印机上的打印守护进程就是 <command>lpd</command>。
这只是一种惯例,不是标准或硬性规定。
例如,为<application>Sendmail</application>而应用的主要mail守护进程就叫<command>sendmail</command>,
却不叫<command>maild</command>,这和您推测的一样。
</para>
<para>有时可能会需要与守护进程进行通讯。 而 <firstterm>信号</firstterm> 则是其中的一种通讯机制。
可以发送信号给守护进程 (或相关的另一些进程) 来与它进行通信,
不同的信号都有自己的数字编号—其中一些有特殊的含义,
其它的则可以被应用程序自己进行解释, 而一般来说,
应用程序的文档会告诉哪些信号会被如何处理。
您只能给所属于您的进程发信号,假如您给其他人的进程发信号,
进程就会用&man.kill.1; 或 &man.kill.2;权限进行拒绝。
当然,<username>root</username> 用户会例外,它能把各种信号发送给每个进程。
</para>
<para>在某些情况下,FreeBSD也会向应用软件发送信号。
假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,FreeBSD会向那个进程发送
<firstterm>段式违规</firstterm> 信号 (<literal>SIGSEGV</literal>)。
假如一个应用软件使用&man.alarm.3;系统去进行周期性调用闹钟功能,每当达到时间时,
FreeBSD会向应用软件发送闹钟信号(<literal>SIGALRM</literal>)。
</para>
<para>有两个信号可以停止进程:<literal>SIGTERM</literal> 和 <literal>SIGKILL</literal>。
<literal>SIGTERM</literal>比较友好,进程能<emphasis>捕捉</emphasis>这个信号,
根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。
在某些情况下, 假如进程正在进行作业而且不能中断,那么进程可以忽略这个
<literal>SIGTERM</literal>信号。
</para>
<para>对于<literal>SIGKILL</literal>信号,进程是不能忽略的。 这是一个
'<quote>我不管您在做什么,立刻停止</quote>'的信号。
假如您发送<literal>SIGKILL</literal>信号给进程,
FreeBSD就将进程停止在那里。<footnote>
<para>有点不正确—少数的东西是不能中断的。
例如, 假如进程试图读取网络上另一计算机上的文件,
而那个的计算机会因为某些原因拿走了这个文件,
那这个进程从上述情况来看是 <quote>不能中断</quote>。
最终这个进程会超时,典型的两分钟。一出现超时进程将被杀死。
</para>
</footnote>.</para>
<para>您可能会去使用
<literal>SIGHUP</literal>、 <literal>SIGUSR1</literal> 和
<literal>SIGUSR2</literal>信号。 这都是些通用的信号,各种应用程序都可以应用
在各方面的信号发送。
</para>
<para>假如您改变了web系统的配置文件—并想web系统去重读它的配置,
您可以停止然后再启动<command>httpd</command>。但这样做web系统会导致一个短暂
的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对<literal>SIGHUP</literal>
信号进行响应从而重读配置文件。
所以, 最好的方法, 就不是杀死并重启
<command>httpd</command>,
而是发一个 <literal>SIGHUP</literal> 信号给它。
因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。
</para>
<para>发送信号可用&man.kill.1; 命令, 请参考&man.kill.1;所列出的例子。
</para>
<procedure>
<title>发送一个信号给进程</title>
<para>这个例子显示了怎样去发一个信号给&man.inetd.8;。
<command>inetd</command>配置文件是<filename>/etc/inetd.conf</filename>,
如果想<command>inetd</command> 去重读文件系统的话,可以给它发一个<literal>SIGHUP</literal>
信号。
</para>
<step>
<para>寻找您要发送信号的进程ID,可以用&man.ps.1; 加 &man.grep.1;来完成。
&man.grep.1;命令被用在搜索输出方面,搜索您指定的字符串。
这命令是由普通用户来执行的,而&man.inetd.8;是<username>root</username>用户运行的,
所以必须给&man.ps.1;带上<option>ax</option>选项。
</para>
<screen>&prompt.user; <userinput>ps -ax | grep inetd</userinput>
198 ?? IWs 0:00.00 inetd -wW</screen>
<para>得出 &man.inetd.8; PID号是198。 有时
<literal>grep inetd</literal> 命令也出现在输出中,
这是因为在这方面 &man.ps.1; 也是寻找列表中运行进程。</para>
</step>
<step>
<para>使用 &man.kill.1; 去发送信号。 因为 &man.inetd.8;
是由 <username>root</username>启动的, 您必须使用 &man.su.1; 去
变为 <username>root</username> 用户。</para>
<screen>&prompt.user; <userinput>su</userinput>
<prompt>Password:</prompt>
&prompt.root; <userinput>/bin/kill -s HUP 198</userinput></screen>
<para>和大多数 &unix; 命令一样, &man.kill.1; 如果完成了任务, 就不会给出任何消息。
假如您发送信号给一个不属于您的进程,
您会看到 <errorname>kill:
<replaceable>PID</replaceable>: Operation not
permitted</errorname>.
假如输错了PID号,把信号发送到其他进程,那是坏事。
或者您侥幸,把信号发送到不存在的进程,
您会看见 <errorname>kill:
<replaceable>PID</replaceable>: No such process</errorname>.</para>
<note>
<title>为什么使用 <command>/bin/kill</command>?</title>
<para>许多shell提供了内建 <command>kill</command> 命令,
这样, shell就能直接发送信号,而不是运行 <filename>/bin/kill</filename>。
这点非常有用, 但不同shell有不同的语法来指定发送信号的名字,
与其试图把它们学完倒不如简单地直接使用
<command>/bin/kill <replaceable>...</replaceable></command>。
</para>
</note>
</step>
</procedure>
<para>发送其他的信号也很相似,
只要在命令行替换 <literal>TERM</literal> 或
<literal>KILL</literal> 就行了。
</para>
<important>
<para>在系统上随意杀死进程是个坏主意,特别是&man.init.8;,
它的进程ID是1,它非常特殊。可以运行
<command>/bin/kill -s KILL 1</command> 命令来让系统迅速关机。
当您按下 <keycap>Return</keycap> (回车)键之前,
<emphasis>一定要</emphasis> 详细检查您运行 &man.kill.1;
时所指定的参数。</para>
</important>
</sect1>
<sect1 id="shells">
<title>Shells</title>
<indexterm><primary>shells</primary></indexterm>
<indexterm><primary>命令行</primary></indexterm>
<para>在FreeBSD里,每日有一大堆工作是在命令行的界面完成的,那就叫做shell。
一个shell的主要功能就是从输入取得命令然后去执行他。
许多的shell同样能帮我们完成内建的每日功能,例如:文件管理、文件寻找、命令行编辑、
宏指令和环境变量。FreeBSD内含了一些shell,例如:<command>sh</command>、Bourne Shell、
<command>tcsh</command>和改良过的C-shell。
另外也有些shell也可在FreeBSD的Ports得到,例如:<command>zsh</command>和<command>bash</command>。
</para>
<para>您想使用哪一种shell取决于您的喜好,
假如您是C程序设计师,您可能选择一个C-like shell例如<command>tcsh</command>。
假如您是从Linux过来的或是一个命令行的新手,您可能会试一下<command>bash</command>。
这一点告诉我们每一个shell都有各自的特性,可能适用于您的工作环境,也可能不适用于您的工作环境。
</para>
<para>每个shell都有一个共通点就是文件名补全。
输入命令或文件名的前几个字,然后按<keycap>Tab</keycap>键,就能靠shell的自动补全功能得出
命令或文件名。这里有一个例子,假设您有两个文件叫
<filename>foobar</filename> 和<filename>foo.bar</filename>,而您想删除
<filename>foo.bar</filename>, 可这样在键盘上输入
<command>rm fo[<keycap>Tab</keycap>].[<keycap>Tab</keycap>]</command>。</para>
<para>那么shell就会输出 <command>rm
foo[BEEP].bar</command>。</para>
<para>这个[BEEP] 是这控制台铃声, 那个是告诉我们它不能完成文件名补全,因为有多个文件名符合。
<filename>foobar</filename> 和
<filename>foo.bar</filename> 都是以 <literal>fo</literal>开头, 它只可以补全到
<literal>foo</literal>。 输入
<literal>.</literal>并再按一次 <keycap>Tab</keycap>,shell才把其余的文件名全部显示出来。
</para>
<indexterm><primary>环境变量</primary></indexterm>
<para>另一个特点就是shell利用环境变量运行。环境变量是贮存在shell环境空间上相对应的键和可变值,
这个空间能够补程序从shell里读出,而且包含了许多程序的配置。
这个一个常用环境变量列和其含义的列表:</para>
<indexterm><primary>environment variables (环境变量)</primary></indexterm>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<thead>
<row>
<entry>变量</entry>
<entry>说明</entry>
</row>
</thead>
<tbody>
<row>
<entry><envar>USER</envar></entry>
<entry>当前登录进入的用户名。</entry>
</row>
<row>
<entry><envar>PATH</envar></entry>
<entry>搜索程序路径,以两点的冒号分隔开。</entry>
</row>
<row>
<entry><envar>DISPLAY</envar></entry>
<entry>假如有这个变量的话,就是X11显示器的网络名称。
</entry>
</row>
<row>
<entry><envar>SHELL</envar></entry>
<entry>当前所用的shell。</entry>
</row>
<row>
<entry><envar>TERM</envar></entry>
<entry>用户终端的名字,通常用在确定终端的能力。</entry>
</row>
<row>
<entry><envar>TERMCAP</envar></entry>
<entry>各种终端功能所用终端分离编码的基本数据项目。</entry>
</row>
<row>
<entry><envar>OSTYPE</envar></entry>
<entry>操作系统类型,默认是FreeBSD。</entry>
</row>
<row>
<entry><envar>MACHTYPE</envar></entry>
<entry>是指系统上运行的CPU体系结构。
</entry>
</row>
<row>
<entry><envar>EDITOR</envar></entry>
<entry>用户首选的文本编辑器。</entry>
</row>
<row>
<entry><envar>PAGER</envar></entry>
<entry>用户首选的文本页面调度程序 。</entry>
</row>
<row>
<entry><envar>MANPATH</envar></entry>
<entry>搜索联机手册路径,以两点的冒号分隔开。</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<indexterm><primary>Bourne shells</primary></indexterm>
<para>不同的shell设置环境变量也不相同。举个例子,
在如<command>tcsh</command> 和 <command>csh</command>这样的C-Style shell,
您必须使用<command>setenv</command>去设置环境变量。
而在如<command>sh</command>和<command>bash</command>这样的Bourne shell,
您必须使用<command>export</command>去设置当前环境变量。
再举个例子,要去设置或改变<envar>EDITOR</envar>环境变量,
在<command>csh</command>或<command>tcsh</command>下将<envar>EDITOR</envar>设为
<filename>/usr/local/bin/emacs</filename>:</para>
<screen>&prompt.user; <userinput>setenv EDITOR /usr/local/bin/emacs</userinput></screen>
<para>而在Bourne shell下,则是:</para>
<screen>&prompt.user; <userinput>export EDITOR="/usr/local/bin/emacs"</userinput></screen>
<para>您也可以在命令行上加一个<literal>$</literal>字符在变量之前从而取得环境变量。
举个例子,用<command>echo $TERM</command> 就会显示出<envar>$TERM</envar>的设定值,
其实就是shell取得<envar>$TERM</envar>并传给<command>echo</command>来显示的。</para>
<para>shell里有许多特别的字符代表着特别的资料,我们把叫做meta-characters。
最常用的就是<literal>*</literal>字符,它可代表文件名的任何字符。
这些特别字符应用到文件名全域方面。假如,输入
<command>echo *</command>和输入
<command>ls</command>的效果是相同的,其实就是 shell 取得了全部符合
<literal>*</literal>的文件名,并传给
<command>echo</command> 在命令行下显示出来。</para>
<para>为了防止shell去分析这些特别字符, 我们可在它之前加一个
<literal>\</literal>字符去说明它只是普通字符。
<command>echo $TERM</command>就会显示出您的终端情况,
而 <command>echo \$TERM</command> 就会显示出 <envar>$TERM</envar>
这几个字。</para>
<sect2 id="changing-shells">
<title>改变您用的Shell</title>
<para>改变您的Shell的最简单方法是使用
<command>chsh</command> 命令。 执行 <command>chsh</command> 将根据您设定的<envar>EDITOR</envar>
环境变量进入到那个编辑器,假如没有设定,就会进入<command>vi</command>编辑器。
请改变<quote>Shell:</quote>这行对应值。</para>
<para>您可使用<command>chsh</command> 的<option>-s</option>选项,
这样就能设置您的shell却又不用编辑器。假如您想把shell改为<command>bash</command>
可用下面的技巧。</para>
<screen>&prompt.user; <userinput>chsh -s /usr/local/bin/bash</userinput></screen>
<note>
<para>您使用的shells<emphasis>必须</emphasis>
在<filename>/etc/shells</filename> 文件里列出。 假如您从
<link linkend="ports">ports</link>里装一个shell, 那就不用做这步了。
假如您手工装一个shell,那就要手工添加进去。</para>
<para>举个例了子,假如您手工把 <command>bash</command>装到
<filename>/usr/local/bin</filename>里,您还要进行这一步:
</para>
<screen>&prompt.root; <userinput>echo "/usr/local/bin/bash" >> /etc/shells</userinput></screen>
<para>然后运行<command>chsh</command>。</para>
</note>
</sect2>
</sect1>
<sect1 id="editors">
<title>文本编辑器</title>
<indexterm><primary>文本编辑器</primary></indexterm>
<indexterm><primary>编辑器</primary></indexterm>
<para>FreeBSD 的很多配置都可以通过编辑文本文件来完成。
因此, 最好能熟悉某种文本编辑器。
FreeBSD 基本系统中提供了一些, 您也可以从 Ports Collection
安装其它编辑器。</para>
<indexterm>
<primary><command>ee</command></primary>
</indexterm>
<indexterm>
<primary>editors</primary>
<secondary><command>ee</command></secondary>
</indexterm>
<para>最容易学的而又简单的编辑器是
<application>ee</application>编辑器, 是个标准的简易编辑器。 要启动
<application>ee</application>,首先就要在命令行输入
<command>ee <replaceable>filename</replaceable></command>,
<replaceable>filename</replaceable> 是一个要编辑的文件名。
例如,要编辑 <filename>/etc/rc.conf</filename>就要输入
<command>ee /etc/rc.conf</command>,在
<command>ee</command>的控制内, 编辑器所有功能的操作方法都显示在最上方。
这个<literal>^</literal> 字符代表
键盘上的<keycap>Ctrl</keycap> 键, 所以<literal>^e</literal> 就是
<keycombo action="simul"><keycap>Ctrl</keycap><keycap>e</keycap></keycombo>组合键。
假如想离开<application>ee</application>,
按<keycap>Esc</keycap>键,就可选择离开编辑器。
当您修改了内容的时候,编辑器会提示您保存。</para>
<indexterm>
<primary><command>vi</command></primary>
</indexterm>
<indexterm>
<primary>编辑器</primary>
<secondary><command>vi</command></secondary>
</indexterm>
<indexterm>
<primary><command>emacs</command></primary>
</indexterm>
<indexterm>
<primary>编辑器</primary>
<secondary><command>emacs</command></secondary>
</indexterm>
<para>FreeBSD本身也带许可多有强大功能的文本编辑器, 例如
<application>vi</application>。还有其他在FreeBSD Ports里几种, 像
<application>emacs</application> 和 <application>vim</application>。
这些编辑器有着强大的功能,但同时学习起来比较复杂。
不管怎样,假如您从事文字编辑方面的工作,
学习如<application>vim</application> 或 <application>emacs</application>
这些有强大功能的编辑器用法,
在长时间工作里会帮您节省不少的时间。</para>
<para>很多需要修改文件或打字输入的应用程序都会自动打开一个文本编辑器。
更改默认使用的编辑器, 请设置 <envar>EDITOR</envar>
环境变量。 参阅 <link linkend="shells">shells</link>
以获取更多详细信息。</para>
</sect1>
<sect1 id="basics-devices">
<title>设备和设备节点</title>
<para>在一个系统里,硬件描述通常用法就是一个设备对应一个术语,包括磁盘、打印机、显卡和键盘。
当 FreeBSD 启动过程中,大多数的设备都能探测到并显示出来,
您也可以查阅<filename>/var/run/dmesg.boot</filename>,
引导时所有信息都在里面。</para>
<para>例如, <devicename>acd0</devicename> 就是
首个 IDE 光盘设备, 而 <devicename>kbd0</devicename>
则代表键盘。</para>
<para>在&unix;操作系统里,大多数设备存在的特殊访问文件就是叫做设备节点,
他们都定位在<filename>/dev</filename>目录里。</para>
<sect2>
<title>建立设备节点</title>
<para>当在系统中添加新设备或将附加设备的支持编译进内核之后,
都必须为其建立设备节点。</para>
<sect3>
<title><literal>DEVFS</literal> (DEVice 文件系统)</title>
<para> 这个设备文件系统, 或叫 <literal>DEVFS</literal>,
为内核的设备命名在整体文件系统命名里提供通道,
并不是建立或更改设备节点,
<literal>DEVFS</literal>只是为您的特别文件系统进行维护。</para>
<para>请参见 &man.devfs.5; 联机手册以了解更多细节。</para>
</sect3>
</sect2>
</sect1>
<sect1 id="binary-formats">
<title>二进制文件格式</title>
<para>要理解为什么 &os; 使用 &man.elf.5; 格式, 您必须首先了解一些 &unix; 系统中的
三种 <quote>主要</quote> 可执行文件格式的有关知识:</para>
<itemizedlist>
<listitem>
<para>&man.a.out.5;</para>
<para>是最古老和<quote>经典的</quote> &unix; 目标文件格式,
这种格式在其文件的开始处有一个短小而又紧凑的首部,
该首部带有一个魔幻数字,用来标识具体的格式(更多详情参见&man.a.out.5;)。
这种格式包含3个要装载入内存的段:.text, .data, 和 .bss,以及
一个符号表和一个字符串表。</para>
</listitem>
<listitem>
<para><acronym>COFF</acronym></para>
<para>SVR3目标文件格式。其文件头现在包括一个区段表(section table),
因此除了.text,.data,和.bss区段以外,您还可以包含其它的区段。</para>
</listitem>
<listitem>
<para>&man.elf.5;</para>
<para><acronym>COFF</acronym> 的后继, 其特点是可以有多个区段,
并可以使用32位或64位的值。 它有一个主要的缺点:
<acronym>ELF</acronym> 在其设计时假设每个系统体系结构只有一种 ABI。
这种假设事实上相当错误, 甚至在商业化的SYSV世界中都是错误的
(它们至少有三种ABI: SVR4, Solaris, SCO)。</para>
<para>FreeBSD试图在某种程度上解决这个问题,它提供一个工具,可以
对一个已知的<acronym>ELF</acronym>可执行文件
<emphasis>标识</emphasis>它所遵从的ABI的信息。
更多这方面的知识可以参见手册页&man.brandelf.1;</para>
</listitem>
</itemizedlist>
<para>FreeBSD从<quote>经典</quote>阵营中来,因此使用了&man.a.out.5;格式,
众多BSD版本的发行(直到3.X分支的开始)也证明了这种格式的有效性。
虽然在那以前的某段时间,在FreeBSD系统上创建和运行<acronym>ELF</acronym>格式
的二进制可执行文件(和内核)也是可能的,但FreeBSD一开始并不积极<quote>进步</quote>
到使用<acronym>ELF</acronym>作为其缺省的格式。为什么?噢,当Linux阵营完成了
转换到<acronym>ELF</acronym>格式的痛苦历程后,却发现并不足以由此而放弃
<filename>a.out</filename>可执行文件格式,因为正是由于它们不灵活的,
基于跳转表的共享库机制,使得销售商和开发者们构建共享库非常困难。
直到已有的<acronym>ELF</acronym>工具提供了一种解决共享库问题的办法,
并被普遍认为是<quote>前进方向</quote>以后,迁徙的代价在FreeBSD界才被接受,
并由此完成了迁徙。FreeBSD的共享库机制其基础更类似于Sun &sunos;的共享库机制,
并且正因为此,其易用性很好。</para>
<para>那么,为什么会有这么多不同的格式呢?</para>
<para>回溯到蒙昧和黑暗的过去,那时只有简单的硬件。这种简单的硬件支撑了一个简单
和小型的系统。在这样的简单系统上(PDP-11)<filename>a.out</filename>格式
足以胜任表达二进制文件的任务。当人们将&unix;从这种简单的系统中移植出来的时候,
<filename>a.out</filename>格式被保留了下来,因为对于早期将&unix;移植到
Motorola 68k,VAXen等系统来说,它还是足够可用的。</para>
<para>然后,一些聪明的硬件工程师认为,如果可以让软件完成一些简单的聪明操作,
那么他们就可以在硬件设计中减少若干门电路,并可以让CPU核心运行得更快。
当<filename>a.out</filename>格式用于这种新型的硬件系统时(现在我们叫它
<acronym>RISC</acronym>),显得并不合适。因此,人们设计了许多新的格式
以便在这样的硬件系统上能获得比简单的<filename>a.out</filename>格式更优越
的性能。诸如<acronym>COFF</acronym>,<acronym>ECOFF</acronym>,还有其它
一些晦涩难懂的格式正是在这个阶段被发明出来的,人们也研究了这些格式的局限性,
慢慢地最终落实到<acronym>ELF</acronym>格式。</para>
<para>同时,程序的大小变得越来越大,磁盘空间(以及物理内存)相对来说却仍然较小,
因此共享库的概念便产生了。VM系统也变得越来越复杂了。当所有这些进步都建立在
<filename>a.out</filename>格式的基础上的时候,它的可用性随着每个新特性
的产生就受到了严重考验。并且,人们还希望可以在运行时动态装载某些东西,或者
在初始化代码运行以后可以丢弃部分程序代码,以便节约主存储器和交换区。编程语言
也变得越来越复杂,人们希望可以在main()函数执行之前自动执行某些代码。为了实现
所有这些功能,人们对<filename>a.out</filename>格式作了很多改动(hack),
他们在某个阶段里基本也是可行的。随着时间的推移,<filename>a.out</filename>格式
不得不增加大量的代码和复杂度来满足这些需求。虽然<acronym>ELF</acronym>格式
解决了许多这样的问题,但是从一个可用的系统迁移到另一个系统却是痛苦的。因此
直到继续保留<filename>a.out</filename>格式的代价比迁移到<acronym>ELF</acronym>格式
的代价还大的时候,人们才会最终转换到<acronym>ELF</acronym>格式。</para>
<para>然而,随着时间的推移,FreeBSD系统本身的编译工具(特别是汇编器和装载器)
赖以派生的编译工具,其发展却形成了两个平行的分支。FreeBSD这个分支增加了共享库,
并修改了一些错误。而原先编写了这些工具的GNU人则重写了这些工具,并对交叉编译提供了
更简化的支持,还随意插入了不同格式的支持,等等。虽然很多人希望创建针对FreeBSD的
交叉编译器,但他们却并未如愿以偿,因为FreeBSD的<application>as</application>
和<application>ld</application>的源代码更为老旧,所以无法完成这个任务。
新的GNU工具链(<application>binutils</application>)则确实支持交叉编译,<acronym>ELF</acronym>
格式,共享库,C++扩展,等等。并且,由于很多供应商都发布<acronym>ELF</acronym>格式的
二进制文件,因而让FreeBSD能够运行它们将是一个很好的事情。</para>
<para><acronym>ELF</acronym>格式比<filename>a.out</filename>格式开销要大些,同时也
允许基础系统有更好的扩展性。<acronym>ELF</acronym>格式的有关工具有着更好的维护,
并且提供交叉编译支持,这对许多人来说是很重要的。<acronym>ELF</acronym>格式可能会稍微
慢一些,但很难测量出来。另外,在这两者之间,有许多细节也是不同的,比如它们映射页面的方式,
处理初始化代码的方式,等等。所有这些都不太重要,但这也确实是不同之处。在将来的适当时候,
<filename>GENERIC</filename>内核将不再支持<filename>a.out</filename>格式,并且,
当不再需要运行遗留的<filename>a.out</filename>格式程序时,内核也将不再提供对其的支持。</para>
</sect1>
<sect1 id="basics-more-information">
<title>取得更多的资讯</title>
<sect2 id="basics-man">
<title>联机手册</title>
<indexterm><primary>联机手册</primary></indexterm>
<para>最详细的使用说明文档莫过于 FreeBSD 里的联机手册了。
几乎每一个程序都会附上一份简短说明,
以介绍这个程序的的基本功能以及参数的用法。
我们能通过 <command>man</command> 命令来阅读这些说明, 而使用
<command>man</command> 命令却是简单的事情:</para>
<screen>&prompt.user; <userinput>man <replaceable>command</replaceable></userinput></screen>
<para><literal>command</literal> 就是您要了解的命令命称。
举个例子,想了解 <command>ls</command> 命令就输入:</para>
<screen>&prompt.user; <userinput>man ls</userinput></screen>
<para>这些在线手册分下列章节:</para>
<orderedlist>
<listitem>
<para>用户命令。</para>
</listitem>
<listitem>
<para>系统调用以及错误代码。</para>
</listitem>
<listitem>
<para>C 库文件里的函数说明。</para>
</listitem>
<listitem>
<para>设备驱动程序。</para>
</listitem>
<listitem>
<para>文件格式。</para>
</listitem>
<listitem>
<para>游戏以及其他娱乐。</para>
</listitem>
<listitem>
<para>各种资讯。</para>
</listitem>
<listitem>
<para>系统维护以及命令。</para>
</listitem>
<listitem>
<para>内核开发情况。</para>
</listitem>
</orderedlist>
<para>在某些情况下,同样的主题也会出现在在线手册的不同章节。
举个例子,系统里有<command>chmod</command>这个用户命令,而又有个
<function>chmod()</function> 系统调用。 在这种情形下,您应当向
<command>man</command> 命令指定需要的内容:
</para>
<screen>&prompt.user; <userinput>man 1 chmod</userinput></screen>
<para>这样就会显示出手册里的用户 <command>chmod</command> 命令。
传统上,我们在写入文档时把特定详细参考内容在在线手册括号里注明。
所以 &man.chmod.1; 是指 <command>chmod</command> 用户命令,
而 &man.chmod.2; 是指系统调用。
</para>
<para>如果您已经知道命令的名字,只是不知道要怎样使用的话,那就比较好办。
但您连名字都不知道呢?这个时候您就可以利用 <command>man</command> 的搜寻功能,
它会在手册的介绍部份找寻您要搜寻的关键字,它的选项是 <option>-k</option>:</para>
<screen>&prompt.user; <userinput>man -k mail</userinput></screen>
<para>当您使用这个命令的时候,man会把介绍里含有<quote>mail</quote>关键字
的命令列出来,实际上这和<command>apropos</command>命令的功能是相同的。</para>
<para>有时您会看到<filename>/usr/bin</filename> 下有许多命令但不知他们的用途,
您只需这样做:</para>
<screen>&prompt.user; <userinput>cd /usr/bin</userinput>
&prompt.user; <userinput>man -f *</userinput></screen>
<para>或者这样做</para>
<screen>&prompt.user; <userinput>cd /usr/bin</userinput>
&prompt.user; <userinput>whatis *</userinput></screen>
<para>两个命令是一样的。</para>
</sect2>
<sect2 id="basics-info">
<title>GNU Info 文件</title>
<indexterm><primary>Free软件基金会</primary></indexterm>
<para>FreeBSD许多应用软件以及实用工具来自Free软件基金会(FSF)。
作为手册的扩充,这些程序提供了一种更具有活力的超文档说明<literal>info</literal>,
您可用<command>info</command>命令来阅读他们。
假如您装上<application>emacs</application>,也能利用<application>emacs</application>
的info模式来阅读。
</para>
<para>使用 &man.info.1; 这个命令只需简单地输入:</para>
<screen>&prompt.user; <userinput>info</userinput></screen>
<para>想得到简单介绍, 请按 <literal>h</literal>。 想快速得到的命令说明,
请按 <literal>?</literal>。</para>
</sect2>
</sect1>
</chapter>
|