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
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
|
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!--
The FreeBSD Dutch Documentation Project
$FreeBSD$
%SOURCE% en_US.ISO8859-1/books/handbook/config/chapter.sgml
%SRCID% 39544
-->
<chapter id="config-tuning">
<chapterinfo>
<authorgroup>
<author>
<firstname>Chern</firstname>
<surname>Lee</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Mike</firstname>
<surname>Smith</surname>
<contrib>Naar een tutorial van </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Matt</firstname>
<surname>Dillon</surname>
<contrib>Tevens gebaseerd op tuning(7) door </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Danny</firstname>
<surname>Pansters</surname>
<contrib>Vertaald door </contrib>
</author>
<author>
<firstname>René</firstname>
<surname>Ladan</surname>
</author>
</authorgroup>
</chapterinfo>
<title>Instellingen en optimalisatie</title>
<sect1 id="config-synopsis">
<title>Overzicht</title>
<indexterm><primary>systeeminstellingen</primary></indexterm>
<indexterm><primary>systeemoptimalisatie</primary></indexterm>
<para>Systeeminstellingen zijn een belangrijk aspect van &os;.
Correcte instellingen helpen moeilijkheden bij toekomstige
upgrades te voorkomen. In dit hoofdstuk wordt het instellen van
&os; beschreven, alsmede een aantal prestatiebevorderende
maatregelen waarmee een &os; systeem geoptimaliseerd kan
worden.</para>
<para>Na het lezen van dit hoofdstuk weet de lezer:</para>
<itemizedlist>
<listitem>
<para>Hoe efficiënt om te gaan met bestandssystemen en
wisselpartities;</para>
</listitem>
<listitem>
<para>De grondbeginselen van het <filename>rc.conf</filename>
instellingensysteem en van het opstarten van toepassingen
(diensten) met
<filename class="directory">/usr/local/etc/rc.d</filename>;</para>
</listitem>
<listitem>
<para>Hoe een netwerkkaart ingesteld en getest wordt;</para>
</listitem>
<listitem>
<para>Hoe virtuele hosts op netwerkapparatuur ingesteld
worden;</para>
</listitem>
<listitem>
<para>Hoe de instellingenbestanden in <filename
class="directory">/etc</filename> gebruikt worden;</para>
</listitem>
<listitem>
<para>Hoe &os; geoptimaliseerd kan worden met
<command>sysctl</command>-variabelen;</para>
</listitem>
<listitem>
<para>Hoe schijfprestaties te verbeteren en hoe
kernelbeperkingen gewijzigd kunnen worden.</para>
</listitem>
</itemizedlist>
<para>Veronderstelde voorkennis:</para>
<itemizedlist>
<listitem>
<para>De grondbeginselen van &unix; en &os; (<xref
linkend="basics"/>) begrijpen;</para>
</listitem>
<listitem>
<para>Bekend zijn met de grondbeginselen van kernelinstellingen
en compilatie (<xref linkend="kernelconfig"/>).</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="configtuning-initial">
<title>Initiële instellingen</title>
<sect2>
<title>Partitioneren</title>
<indexterm><primary>partitioneren</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>Basispartities</title>
<para>Bij het aanmaken van bestandssystemen met &man.bsdlabel.8;
of &man.sysinstall.8; is het van belang dat op een harde
schijf de gegevensoverdracht het snelst is aan de buitenste
sporen en het langzaamst aan de binnenste. Kleinere en
veelgebruikte bestandssystemen kunnen daarom het beste aan de
buitenkant van de schijf geplaatst worden, terwijl grotere
partities als <filename class="directory">/usr</filename> meer naar de
binnenkant van de schijf geplaatst kunnen worden. Het is een
goed idee om partities aan te maken in deze of gelijksoortige
volgorde: root, swap, <filename class="directory">/var</filename>,
<filename class="directory">/usr</filename>.</para>
<para>De grootte van de partitie <filename
class="directory">/var</filename> hangt
af van de wijze waarop de machine gebruikt gaat worden. Het
bestandssysteem <filename class="directory">/var</filename> wordt
gebruikt voor onder meer postbussen, logbestanden en printergegevens
en -wachtrijen. Postbussen en logbestanden kunnen onverwacht
groot worden, afhankelijk van het aantal systeemgebruikers en
de bewaarduur van logbestanden. De meeste gebruikers zullen
zelden meer dan ongeveer een gigabyte aan vrije schijfruimte
op <filename class="directory">/var</filename> nodig hebben.</para>
<note>
<para>Er zijn een aantal gevallen waar een grote hoeveelheid
ruimte in <filename class="directory">/var/tmp</filename> nodig is.
Wanneer er nieuwe software wordt geïnstalleerd met
&man.pkg.add.1; pakken de pakketprogramma's een tijdelijke
kopie van de pakketten uit in <filename
class="directory">/var/tmp</filename>. Grote softwarepakketten,
zoals <application>Firefox</application>,
<application>OpenOffice</application> of
<application>LibreOffice</application> kunnen lastig zijn om
te installeren wanneer er onvoldoende vrije schijfruimte
beschikbaar is onder <filename
class="directory">/var/tmp</filename>.</para>
</note>
<para>De partitie <filename class="directory">/usr</filename> bevat veel
van de benodigde systeembestanden, waaronder de &man.ports.7;
collectie (aanbevolen) en de broncode (optioneel). Beide zijn
optioneel tijdens de installatie, maar we raden voor deze
partitie tenminste 2 gigabyte aan.</para>
<para>Het is verstandig rekening te houden met de vereiste
schijfruimte bij het kiezen van partitiegroottes. Als in een
partitie onvoldoende vrije schijfruimte is, terwijl een andere
vrijwel niet gebruikt wordt, is dat een vervelend en niet
optimaal oplosbaar probleem.</para>
<note>
<para>&man.sysinstall.8;'s <literal>Auto-defaults</literal>
partitiekeuze kan in de ervaring van sommige gebruikers
mogelijk te kleine <filename class="directory">/var</filename> en
<filename class="directory">/</filename> partities opleveren.
Partitioneren moet verstandig en niet te zuinig gebeuren.</para>
</note>
</sect3>
<sect3 id="swap-design">
<title>Wisselpartities (swap)</title>
<indexterm><primary>swap grootte</primary></indexterm>
<indexterm><primary>wisselpartitie</primary></indexterm>
<indexterm><primary>wisselpartitiegrootte</primary></indexterm>
<para>De vuistregel is dat het wisselbestand ongeveer het
dubbele van de grootte van het systeemgeheugen (RAM) moet
zijn. Als de machine bijvoorbeeld 128 megabytes geheugen
heeft, kan het beste een wisselbestand van (tenminste)
256 megabytes gebruikt worden. Minder dan
256 megabytes swap is in dit geval af te raden. Systemen
met weinig geheugen kunnen overigens beter functioneren met
meer swap. Ook is het verstandig rekening te houden met
eventuele geheugenuitbreiding in de toekomst. Bovendien zijn
de VM paging-algoritmen van de kernel zo afgestemd dat ze het
beste presteren bij een wisselbestand van tenminste tweemaal
de grootte van het geheugen. Een te kleine swap kan dus
inefficiënties in de VM-code tot gevolg hebben en
mogelijk problemen veroorzaken als het systeemgeheugen
uitgebreid wordt.</para>
<para>Op grotere systemen met meerdere SCSI-schijven (of
meerdere IDE-schijven op verschillende controllers) is het aan
te raden om op elke schijf een wisselpartitie in te stellen
(dit kan tot en met vier schijven), elk met ongeveer dezelfde
grootte. De kernel kan met arbitraire groottes werken, maar
interne datastructuren schalen tot viermaal de grootste
swappartitie. De kernel kan de beschikbare ruimte voor het
wisselbestand het meest optimaal indelen als de partities
ongeveer even groot zijn. Een grote swap is prima, ook als ze
zelden gebruikt wordt. Zo kan het gemakkelijker zijn om een
(uit de hand gelopen) proces dat het systeem grotendeels bezet
houdt te beëindigen, voordat er opnieuw opgestart moet
worden.</para>
</sect3>
<sect3>
<title>Waarom partitioneren?</title>
<para>Waarom niet één enkele grote partitie
gebruiken? Er zijn verscheidene redenen waarom dit niet zo'n
goed idee is. De verschillende partities hebben hun eigen
karakteristieke operationele gedrag en vereisten. Door ze te
scheiden zijn er betere mogelijkheden om het systeem te
optimaliseren. Vanaf de <filename class="directory">/</filename> en
<filename class="directory">/usr</filename> partities wordt
bijvoorbeeld vooral gelezen en er wordt weinig naar geschreven,
terwijl er in <filename class="directory">/var</filename> en
<filename class="directory">/var/tmp</filename> zowel veel gelezen
als geschreven wordt.</para>
<para>Door een systeem goed te partitioneren wordt vermeden dat
fragmentatie die optreedt in de kleinere partities met veel
schrijfactiviteit doorsijpelt naar partities die vooral
lees-intensief zijn. Door schrijf-intensieve partities aan
het begin van de schijf te plaatsen, zijn de prestaties wat
betreft invoer/uitvoer het beste daar waar het het meest
nodig is. Ofschoon er natuurlijk ook de best mogelijke
in/uit prestaties wenselijk zijn in de grotere partities,
weegt het plaatsen van deze bestandssystemen aan het begin van
de schijf niet tegen de voordelen van het plaatsen van
<filename class="directory">/var</filename> aan het begin van de
schijf (na root en swap) voor de totale snelheid van het systeem.
Tenslotte zijn er veiligheidsoverwegingen. Een compacte en nette
rootpartitie die vrijwel alleen-lezen is, heeft een betere
kans om een nare crash te overleven.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="configtuning-core-configuration">
<title>Hoofdinstellingen</title>
<indexterm>
<primary>rc bestanden</primary>
<secondary><filename>rc.conf</filename></secondary>
</indexterm>
<para>De voornaamste lokatie voor systeeminstellingen is
<filename>/etc/rc.conf</filename>. Dit bestand bevat een scala
aan instellingen, die gebruikt wordt om het systeem in te stellen
bij het opstarten. De naam impliceert dit al. Het is informatie
voor de <filename>rc*</filename> bestanden (rc staat voor
<quote>resource configuration</quote> of broninstellingen).</para>
<para>De systeembeheerder wordt geacht regels toe te voegen aan
<filename>rc.conf</filename> om de standaardinstellingen uit
<filename>/etc/defaults/rc.conf</filename> aan te passen. Het
standaardbestand moet niet letterlijk gekopiëerd worden naar
<filename class="directory">/etc</filename>. Het bevat standaardwaardes
en is niet bedoeld als voorbeeld. Alle wijzigingen die specifiek zijn
voor een systeem horen in <filename>/etc/rc.conf</filename>
thuis.</para>
<para>In een clusterscenario is het nuttig om systeemspecifieke
instellingen te scheiden van algemene instellingen die voor het
hele cluster gelden. Hiervoor kunnen een aantal strategieën
worden gebruikt. De aanbevolen benadering is om systeem-specifieke
instellingen in het bestand <filename>/etc/rc.conf.local</filename> te
plaatsen. Een voorbeeld:</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.voorbeeld.org"
ifconfig_fxp0="inet 10.1.1.1/8"</programlisting></listitem>
</itemizedlist>
<para><filename>rc.conf</filename> kan naar elk systeem
gedistribueerd worden met <command>rsync</command> of een
gelijksoortig programma, terwijl <filename>rc.conf.local</filename>
uniek blijft.</para>
<para>Het actualiseren van het systeem met &man.sysinstall.8; of
<command>make world</command> overschrijft
<filename>rc.conf</filename> niet, zodat de bestaande
systeeminstellingen niet verloren gaan.</para>
<tip>
<para>Het instellingenbestand <filename>/etc/rc.conf</filename> wordt
gelezen door &man.sh.1;. Dit stelt systeembeheerders in staat om een
zekere hoeveelheid logica aan dit bestand toe te voegen, dat kan helpen
in het creëren van zeer ingewikkelde configuratiescenario's.
Bekijk &man.rc.conf.5; voor meer informatie over dit onderwerp.</para>
</tip>
</sect1>
<sect1 id="configtuning-appconfig">
<title>Toepassingen instellen</title>
<para>Geïnstalleerde toepassingen hebben meestal hun eigen
instellingenbestanden, met hun eigen syntaxis, etc. Het is van
belang deze bestanden apart te houden van het basissysteem, zodat
ze makkelijk gelokaliseerd kunnen worden en beheerd kunnen worden
met de hulpmiddelen voor pakketbeheer.</para>
<indexterm><primary>/usr/local/etc</primary></indexterm>
<para>Deze bestanden worden meestal geïnstalleerd in
<filename class="directory">/usr/local/etc</filename>. Als een toepassing
een uitgebreide verzameling bestanden voor instellingen heeft, wordt
er een submap voor aangemaakt.</para>
<para>Bij de installatie van een port of pakket, worden normaliter
ook voorbeeldbestanden met instellingen geïnstalleerd. Deze
zijn doorgaans te herkennen aan een toevoegsel
<filename>.default</filename>. Als er geen bestaande
instellingenbestanden voor de toepassing zijn, kunnen ze gemaakt
worden door de <filename>.default</filename>-bestanden te
kopiëren.</para>
<para>Een voorbeeld is de map
<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>Aan de grootte van de bestanden is te zien dat alleen
<filename>srm.conf</filename> gewijzigd is. Als later de port
<application>Apache</application> wordt vernieuwd, wordt dit
bestand niet overschreven.</para>
</sect1>
<sect1 id="configtuning-starting-services">
<sect1info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Bijgedragen door </contrib>
</author>
</authorgroup>
</sect1info>
<title>Diensten starten</title>
<indexterm><primary>diensten</primary></indexterm>
<para>Veel gebruikers kiezen ervoor om software van derden te
installeren op &os; vanuit de Portscollectie. In veel gevallen
is het noodzakelijk om de software dusdanig in te stellen dat
het opstart tijdens het opstarten van de computer. Diensten
zoals <filename role="package">mail/postfix</filename> of
<filename role="package">www/apache22</filename> zijn slechts
twee voorbeelden van softwarepakketten die gestart kunnen worden
tijdens de systeemstart. In deze paragraaf wordt toegelicht hoe
software van derde partijen kan worden gestart.</para>
<para>In &os; worden de meeste diensten, zoals &man.cron.8;, door
de opstartscripts van het systeem gestart. Deze scripts kunnen
verschillen tussen &os; en leverancierversies, echter het meest
belangrijke aspect om in gedachten te houden is dat hun
opstartinstellingen verwerkt kunnen worden door simpele
opstartscripts.</para>
<sect2>
<title>Uitgebreide applicatieinstellingen</title>
<para>Nu &os; <filename>rc.d</filename> heeft, zijn de
instellingen van applicaties die mee moeten opstarten
versimpeld en rijker aan mogelijkheden. Door gebruik te maken
van de sleutelwoorden die in de paragraaf <link
linkend="configtuning-rcd"><filename>rc.d</filename></link>
behandeld worden, kunnen applicaties nu starten na andere
diensten. <acronym>DNS</acronym> kan bijvoorbeeld extra
opties meekrijgen van <filename>/etc/rc.conf</filename> in
plaats van hard ingestelde opties in het opstartscript. Een
basisscript ziet er ongeveer als volgt uit:</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
#
# VERANDER DE STANDAARDWAARDEN HIER NIET
# STEL ZE IN HET BESTAND /etc/rc.conf IN
#
utility_enable=${utility_enable-"NO"}
pidfile=${utility_pidfile-"/var/run/utility.pid"}
run_rc_command "$1"</programlisting>
<para>Dit script zorgt ervoor dat
<application>utility</application> wordt gestart na de pseudodienst
<literal>DAEMON</literal>. Het biedt ook de mogelijkheid voor
het instellingen en volgen van het <acronym>PID</acronym> of
het proces-<acronym>ID</acronym> bestand.</para>
<para>Voor deze applicatie kan dan de volgende regel in
<filename>/etc/rc.conf</filename> geplaatst worden:</para>
<programlisting>utility_enable="YES"</programlisting>
<para>Deze methode maakt het volgende mogelijk: makkelijker
commandoregelopties manipuleren, importeren van
standaardfuncties uit <filename>/etc/rc.subr</filename>,
compatibiliteit met het gereedschap &man.rcorder.8; en het
levert makkelijkere configuratie via het bestand
<filename>rc.conf</filename>.</para>
</sect2>
<sect2>
<title>Diensten met diensten starten</title>
<para>Andere diensten, zoals <acronym>POP</acronym>3-server
daemons, <acronym>IMAP</acronym>, enzovoort, kunnen gestart
worden door gebruik te maken van &man.inetd.8;. Daaraan is
voorafgegaan dat die dienst uit de Portscollectie is
geïstalleerd en dat er een regel met instellingen is
toegevoegd aan <filename>/etc/inetd.conf</filename> of
één van de bestaande niet-actieve regels is
geactiveerd. Werken met <application>inetd</application> en
zijn instellingen wordt uitgebreid toegelicht in de paragraaf
over <link linkend="network-inetd">inetd</link>.</para>
<para>In sommige gevallen is het handiger om &man.cron.8; te
gebruiken om diensten te starten. Deze aanpak heeft een aantal
voordelen omdat <command>cron</command> start als de eigenaar
van <filename>crontab</filename>. Dit stelt reguliere
gebruikers in staat om sommige applicaties te starten en te
onderhouden.</para>
<para><command>cron</command> levert een unieke optie: in plaats
van een tijdsspecificatie kan <literal>@reboot</literal>
gebruikt worden. Dit zorgt ervoor dat de taak gestart wordt als
&man.cron.8; gestart wordt, meestal tijdens een
systeemstart.</para>
</sect2>
</sect1>
<sect1 id="configtuning-cron">
<sect1info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
</sect1info>
<title><command>cron</command> instellen</title>
<indexterm>
<primary>cron</primary>
<secondary>instellen</secondary>
</indexterm>
<para>Een zeer nuttig hulpprogramma in &os; is &man.cron.8;. De
daemon <command>cron</command> draait op de achtergrond en
controleert voortdurend <filename>/etc/crontab</filename>. Ook
controleert <command>cron</command> de map
<filename class="directory">/var/cron/tabs</filename>, op zoek naar nieuwe
<filename>crontab</filename> bestanden. Deze
<filename>crontab</filename> bestanden bevatten informatie over
specifieke taken die <command>cron</command> moet verrichten op
gezette tijden.</para>
<para><command>cron</command> gebruikt twee verschillende soorten
instellingenbestanden: de systeemcrontab en gebruikerscrontabs. Deze
formaten verschillen alleen in het zesde en verdere velden. In de
systeemcrontab zal <command>cron</command> het commando draaien als de
gebruiker die in het zesde veld is opgegeven. In een gebruikerscrontab
draaien alle commando's onder de gebruiker die de crontab heeft
aangemaakt, dus is het zesde veld het laatste veld; dit is een belangrijk
beveiligingsaspect. Het laatste veld is altijd het commando dat gedraaid
wordt.</para>
<note>
<para>Gebruikerscrontabs geven individuele gebruikers de
mogelijkheid om bepaalde terugkerende taken automatisch te laten
uitvoeren zonder dat <username>root</username>-rechten noodig
zijn. Commando's in de crontab van een gebruiker worden
uitgevoerd met de rechten van de eigenaar.</para>
<para><username>root</username> kan ook een gebruikerscrontab
aanleggen net als elke andere gebruiker. Dit is niet dezelfde als
<filename>/etc/crontab</filename> (de systeemcrontab). Omdat de
systeemcrontab in de praktijk de commando's als root uitvoert, is het
doorgaans niet nodig om een gebruikerscrontab voor
<username>root</username> te maken.</para>
</note>
<para><filename>/etc/crontab</filename> (de systeemcrontab) ziet er
uit als volgt:</para>
<programlisting># /etc/crontab - root's crontab for &os;
#
# $&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
# <co id="co-comments"/>
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin <co id="co-env"/>
HOME=/var/log
#
#
#minuut uur mdag maand wdag wie commando <co id="co-field-descr"/>
#
#
*/5 * * * * root /usr/libexec/atrun <co id="co-main"/></programlisting>
<calloutlist>
<callout arearefs="co-comments">
<para>Zoals in de meeste &os; instellingenbestanden gaat het
karakter <literal>#</literal> vooraf aan commentaar.
Commentaar wordt gebruikt als uitleg en geheugensteun.
Commentaar dient niet vermengd te worden met commando's,
anders wordt het commentaar opgevat als deel van het commando.
Blanco regels worden genegeerd.</para>
</callout>
<callout arearefs="co-env">
<para>Eerst worden omgevingsvariabelen gedefiniëerd.
Hoervoor wordt het is-gelijk karakter (<literal>=</literal>)
gebruikt. In het bovenstaande voorbeeld wordt het gebruikt
voor de variabelen <envar>SHELL</envar>, <envar>PATH</envar>
en <envar>HOME</envar>. Als de regel <envar>SHELL</envar>
ontbreekt, gebruikt <command>cron</command> standaard
<command>sh</command> als shell. Voor de omgevingsvariabele
<envar>PATH</envar> bestaat geen standaardwaarde. Als
<envar>PATH</envar> ontbreekt moeten absolute paden gebruikt
worden. Als <envar>HOME</envar> ontbreekt, gebruikt
<command>cron</command> de thuismap van de gebruiker die
<command>cron</command> aanroept.</para>
</callout>
<callout arearefs="co-field-descr">
<para>In deze commentaarregel staan de zeven velden van een
crontabdefinitie. Dit zijn <literal>minuut</literal>,
<literal>uur</literal>, <literal>mdag</literal>,
<literal>maand</literal>, <literal>wdag</literal>,
<literal>wie</literal> en <literal>commando</literal>. De
betekenissen liggen voor de hand: <literal>minuut</literal>
is het aantal minuten van het tijdstip waarop het commando
moet worden uitgevoerd; <literal>uur</literal> geeft het uur
aan; <literal>mdag</literal> staat voor de dag van de maand;
<literal>maand</literal> staat voor het maandnummer en
<literal>wdag</literal> geeft de dag van de week aan. Het
veld <literal>wie</literal> is bijzonder en bestaat alleen in
<filename>/etc/crontab</filename>. Het geeft aan als welke
gebruiker het commando uitgevoerd moet worden. Het laatste veld
bevat het uit te voeren commando.</para>
</callout>
<callout arearefs="co-main">
<para>In deze regel worden aan de hierboven besproken opties
waarden toegekend. Er wordt gebruik gemaakt van
<literal>*/5</literal> en <literal>*</literal> karakters.
Deze betekenen <quote>eerst-laatst</quote> en kunnen gezien
worden als <emphasis>telkens</emphasis>. In deze regel staat
dus dat het commando <command>atrun</command> elke vijf
minuten moet worden uitgevoerd door <username>root</username>,
ongeacht welke dag of maand het is. Meer informatie over
<command>atrun</command> staat in &man.atrun.8;.</para>
<para>Commando's kunnen een willekeurig aantal opties of
argumenten meekrijgen. Als commando's echter meerdere regels
nodig hebben moeten deze regels afgebroken worden met een
backslash <quote>\</quote> karakter, om aan te geven dat ze op
de volgende regel vervolgd worden.</para>
</callout>
</calloutlist>
<para>Dit is de basisopzet voor elk <filename>crontab</filename>
bestand. De enige uitzondering is de aanwezigheid van veld zes,
waar de gebruikersnaam wordt aangegeven. Dit veld bestaat alleen
in het systeembestand <filename>/etc/crontab</filename>. Voor
<filename>crontab</filename>bestanden van individuele gebruikers
moet dit veld worden weggelaten.</para>
<sect2 id="configtuning-installcrontab">
<title>Een crontab installeren</title>
<important>
<para>De onderstaande procedure moet niet gebruikt worden om de
systeemcrontab <filename>/etc/crontab</filename> te wijzigen of te
installeren. Er kan een gewone editor gebruikt worden.
<command>cron</command> ziet dat het bestand veranderd is en begint
direct met het gebruiken van de nieuwe versie. <ulink
url="&url.books.faq;/admin.html#ROOT-NOT-FOUND-CRON-ERRORS">Deze
FAQ vraag</ulink> geeft verdere uitleg.</para>
</important>
<para>Om een nieuwe <filename>crontab</filename> te installeren
moet eerst een bestand in het juiste formaat gemaakt worden en
daarna moet het geiuml;nstalleerd worden met commando
<command>crontab</command>:</para>
<screen>&prompt.root; <userinput>crontab crontabbestand</userinput></screen>
<para>In dit voorbeeld is <filename>crontabbestand</filename> de
naam van een eerder gemaakt
<filename>crontab</filename>-bestand.</para>
<para>Er bestaat ook een optie om een lijst van
geïnstalleerde <filename>crontab</filename>-bestanden op te
vragen, namelijk de optie <option>-l</option> van
<command>crontab</command>.</para>
<para>Gebruikers die hun eigen crontabbestand willen schrijven
zonder het gebruik van een sjabloon, kunnen gebruik maken van
<command>crontab -e</command>. Dit opent de
<envar>EDITOR</envar> met een leeg bestand. Als het bestand
wordt opgeslagen en de editor wordt afgesloten, wordt het
bestand automatisch als <filename>crontab</filename>
geïnstalleerd.</para>
<para>Een gebruikers<filename>crontab</filename> kan verwijderd
worden door de met <command>crontab</command> de optie
<option>-r</option> te gebruiken.</para>
</sect2>
</sect1>
<sect1 id="configtuning-rcd">
<sect1info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
</sect1info>
<title>Gebruik van rc met &os;</title>
<indexterm><primary>rc.d</primary></indexterm>
<para>Sinds 2002 gebruikt &os; het NetBSD <filename>rc.d</filename>
systeem bij het opstarten van het systeem. Veel van de bestanden
in <filename class="directory">/etc/rc.d</filename> zijn scripts voor
basisdiensten die werken met de opties <option>start</option>,
<option>stop</option> en <option>restart</option>, analoog aan
hoe diensten die via een port of pakket zijn geïnstalleerd
gestart worden met de scripts in
<filename>/usr/local/etc/rc.d</filename>. &man.sshd.8; kan
bijvoorbeeld als volgt herstart worden:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd restart</userinput></screen>
<para>Deze procedure is vrijwel gelijk voor andere diensten.
Uiteraard worden diensten meestal automatisch tijdens het
opstarten van de computer gestart zoals in &man.rc.conf.5; staat.
Om de Network Address Translation daemon bij het opstarten te
laten starten is de volgende regel in
<filename>/etc/rc.conf</filename> bijvoorbeeld voldoende:</para>
<programlisting>natd_enable="YES"</programlisting>
<para>Als er reeds een <literal>natd_enable="NO"</literal> regel is,
kan <literal>NO</literal> gewoon in <literal>YES</literal>
veranderd worden. De rc scripts starten, voor zover nodig,
automatisch andere afhankelijke diensten.</para>
<para>Omdat het <filename>rc.d</filename> systeem in eerste
instantie bedoeld is om diensten te starten en stoppen bij het
opstarten en afsluiten van het systeem, werken de standaardopties
<option>start</option>, <option>stop</option> en
<option>restart</option> alleen als de juiste variabelen in
<filename>/etc/rc.conf</filename> zijn ingesteld. Het commando
<command>sshd restart</command> alleen dan als
<varname>sshd_enable</varname> de waarde <literal>YES</literal>
heeft in <filename>/etc/rc.conf</filename>. Als er een dienst
gestart, gestopt of herstart moet worden, ongeacht de definities
in <filename>/etc/rc.conf</filename>, moet het commando
voorafgegaan worden door <quote>one</quote>. Dus om
<command>sshd</command> te herstarten ongeacht
de instellingen in <filename>/etc/rc.conf</filename>, voldoet het
volgende commando:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd onerestart</userinput></screen>
<para>Het is eenvoudig te controleren of een dienst is ingeschakeld
is in <filename>/etc/rc.conf</filename> door het bijpassende
<filename>rc.d</filename>-script uit te voeren met de optie
<option>rcvar</option>. Voor <command>sshd</command>:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd rcvar</userinput>
# sshd
$sshd_enable=YES</screen>
<note>
<para>De tweede regel (<literal># sshd</literal>) is de
uitvoer van <command>sshd</command>, geen
<username>root</username>-console.</para>
</note>
<para>De optie <option>status</option> wordt gebruikt om vast te
stellen of een dienst gestart is. Om bijvoorbeeld te controleren
of <command>sshd</command> gestart is:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/sshd status</userinput>
sshd is running as pid 433.</screen>
<para>In sommige gevallen is het ook mogelijk om een dienst te
herstarten met de optie <option>reload</option>. Dan wordt er
getracht een signaal te sturen aan een individuele dienst, waarbij
de dienst de bestanden met instellingen opnieuw in moet lezen.
Meestal komt dit neer op het verzenden van het signaal
<literal>SIGHUP</literal>. Deze optie wordt niet door alle
diensten ondersteund.</para>
<para>Het <application>rc.d</application>-systeem wordt niet alleen
gebruikt voor netwerkdiensten, maar ook voor het merendeel van de
systeemstart. In dit kader is bijvoorbeeld het bestand
<filename>bgfsck</filename> interessant. Als dit script wordt
uitgevoerd, wordt de volgende boodschap getoond:</para>
<screen>Starting background file system checks in 60 seconds.</screen>
<para>Dit script wordt dus gebruikt voor bestandssysteemcontrole in
de achtergrond, hetgeen alleen tijdens de systeemstart
gebeurt.</para>
<para>Veel systeemdiensten zijn afhankelijk van andere diensten om
correct te kunnen functioneren. Zo starten NIS en andere
RPC-gebaseerde diensten niet als de dienst
<command>rpcbind</command> (portmapper) nog niet draait. Om dit
te stroomlijnen wordt informatie over afhankelijkheden en andere
metagegevens ingevoegd in het commentaar bovenaan het
opstartscript. Deze commentaarregels worden vervolgens tijdens de
systeemstart met &man.rcorder.8; verwerkt om zo vast te stellen in
welke volgorde de systeemdiensten gestart moeten worden.</para>
<para>De volgende woorden moeten in alle opstartscripts staan (ze
zijn benodigd door &man.rc.subr.8; om het opstartscript te
activeren):</para>
<itemizedlist>
<listitem>
<para><literal>PROVIDE</literal>: geeft aan in welke diensten
dit bestand voorziet.</para>
</listitem>
<listitem>
<para><literal>REQUIRE</literal>: geeft aan welke andere
diensten vereist zijn voor deze dienst. Dit script wordt
uitgevoerd <emphasis>na</emphasis> de aangegeven
diensten.</para>
</listitem>
<listitem>
<para><literal>BEFORE</literal>: geeft diensten aan die
afhankelijk zijn van deze dienst. Dit bestand wordt
uitgevoerd <emphasis>vóór</emphasis> de
aangegeven diensten.</para>
</listitem>
</itemizedlist>
<para>Met deze methode kan een systeembeheerder gemakkelijk
systeemdiensten besturen, zonder gedoe met
<quote>runlevels</quote> zoals bij sommige andere &unix;
systemen.</para>
<para>Meer informatie over het <filename>rc.d</filename>-systeem
staat in &man.rc.8; en &man.rc.subr.8;. Als u geïnteresseerd
bent in het schrijven van uw eigen
<filename>rc.d</filename>-script of om de huidige scripts te
verbeteren is wellicht <ulink url="&url.articles.rc-scripting">dit
artikel</ulink> interessant.</para>
</sect1>
<sect1 id="config-network-setup">
<sect1info>
<authorgroup>
<author>
<firstname>Marc</firstname>
<surname>Fonvieille</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
</sect1info>
<title>Netwerkkaarten instellen</title>
<indexterm>
<primary>netwerkkaarten</primary>
<secondary>instellen</secondary>
</indexterm>
<para>Het is tegenwoordig nauwelijks voorstelbaar dat een computer
geen netwerkverbinding heeft. Het toevoegen en instellen van een
netwerkkaart is een gebruikelijke taak voor een
&os;-beheerder.</para>
<sect2>
<title>Het juiste stuurprogramma vinden</title>
<indexterm>
<primary>netwerkkaarten</primary>
<secondary>stuurprogramma</secondary>
</indexterm>
<para>Voor het zoeken begint, moet duidelijk zijn om welke kaart
het gaat, welke chip erop zit en of het een PCI- of ISA-kaart
is. &os; ondersteunt vele kaarten. Op de Hardware
Compatibiliteitslijst voor de betreffende uitgave staan de
kaarten die ondersteund worden.</para>
<para>Als duidelijk is dat een kaart ondersteund wordt, moet
vastgesteld worden wat het geschikte stuurprogramma is. In het
bestand <filename>/usr/src/sys/conf/NOTES</filename> staat een
lijst van stuurprogramma's voor netwerkinterfaces met wat
informatie over de ondersteunde chipsets of kaarten. In geval
van twijfel biedt de hulppagina voor het stuurprogramma
(<command>man</command>) vaak uitkomst. In het algemeen bevat
deze meer informatie over de ondersteunde hardware en mogelijke
problemen die kunnen optreden.</para>
<para>Als een veelgebruikte kaart gebruikt wordt, hoeft meestal
niet ver gezocht te worden. Stuurprogramma's voor
veelvoorkomende netwerkinterfaces zijn al aanwezig in de
algemene kernel <filename>GENERIC</filename>. In dat geval
wordt zo'n kaart al gevonden bij het opstarten, bijvoorbeeld met
het volgende bericht:</para>
<screen>dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
miibus0: <MII bus> on dc0
bmtphy0: <BCM5201 10/100baseTX PHY> PHY 1 on miibus0
bmtphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc0: Ethernet address: 00:a0:cc:da:da:da
dc0: [ITHREAD]
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
miibus1: <MII bus> on dc1
bmtphy1: <BCM5201 10/100baseTX PHY> 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>In dit voorbeeld zitten er twee kaarten in het systeem die
het stuurprogramma &man.dc.4; gebruiken.</para>
<para>Als het stuurprogramma voor een NIC geen onderdeel is van de
kernel <filename>GENERIC</filename>, dan dient het juiste
stuurprogramma voor die NIC geladen te worden. Dit kan op twee
manieren:</para>
<itemizedlist>
<listitem>
<para>De meest eenvoudige manier is het laden van een
kernelmodule voor een netwerkkaart met &man.kldload.8; of
automatisch tijdens het opstarten van het systeem door de
benodigde regel toe te voegen aan
<filename>/boot/loader.conf</filename>. Niet alle
NIC-stuurprogramma's zijn als module beschikbaar. Zo zijn
er bijvoorbeeld geen modules beschikbaar voor
ISA-kaarten.</para>
</listitem>
<listitem>
<para>Ondersteuning voor een kaart kan ook in de kernel
gecompileerd worden. In
<filename>/usr/src/sys/conf/NOTES</filename>,
<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf/NOTES</filename>
en de hulppagina van het stuurprogramma is na te lezen wat
er in het kernelinstellingenbestand moet staan. In <xref
linkend="kernelconfig"/> staat meer informatie over het
compileren van een eigen kernel. Als een netwerkkaart al
bij het opstarten wordt herkend door de kernel
<filename>GENERIC</filename>, is er geen reden om een andere
kernel te bouwen.</para>
</listitem>
</itemizedlist>
<sect3 id="config-network-ndis">
<title>Gebruik maken van &windows;
NDIS-stuurprogramma's</title>
<indexterm><primary>NDIS</primary></indexterm>
<indexterm><primary>NDISulator</primary></indexterm>
<indexterm><primary>&windows; drivers</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>
<para>Helaas zijn er nog steeds veel leveranciers die geen
schema's leveren voor stuurprogramma's aan de open-source
gemeenschap, omdat ze deze informatie beschouwen als
handelsgeheimen. Als gevolg daarvan hebben de ontwikkelaars
van &os; en andere projecten twee keuzes: zelf de
stuurprogramma's ontwikkelen door een langdurig en pijnlijk
proces van de huidige stuurprogramma's te ontcijferen, of door
gebruik te maken van de huidige binaire bestanden voor het
µsoft.windows; platform. De meeste ontwikkelaars,
inclusief diegeen die gekoppeld zijn aan &os;, hebben voor het
laatste gekozen.</para>
<para>Dankzij de bijdragen van Bill Paul (wpaul) is er
<quote>native</quote> ondersteuning
voor de Network Driver Interface Specification (NDIS). De
&os; NDISulator (ook wel bekend als Project Evil) neemt een
binair &windows; stuurprogramma en doet net alsof deze in een
&windows; systeem draait. Omdat het stuurprogramma
&man.ndis.4; een &windows; binary gebruikt; draait het alleen
op &i386;- en amd64-systemen. PCI, CardBus, PCMCIA (PC-Card) en
USB-apparaten worden ondersteund.</para>
<para>Om de NDISulator te gebruiken zijn drie dingen nodig:</para>
<orderedlist>
<listitem>
<para>De bronbestanden van de kernel</para>
</listitem>
<listitem>
<para>Een &windowsxp; stuurprogramma (met de extensie
<filename>.SYS</filename>)</para>
</listitem>
<listitem>
<para>Een instellingenbestand van het &windowsxp;
stuurprogramma (met de extensie
<filename>.INF</filename>)</para>
</listitem>
</orderedlist>
<para>Lokaliseer de bestanden voor uw specifieke kaart. Over
het algemeen kunnen deze gevonden worden op de bijgeleverde
CD's of op de website van de leverancier. In de volgende
voorbeelden maken we gebruik van
<filename>W32DRIVER.SYS</filename> en
<filename>W32DRIVER.INF</filename>.</para>
<para>De bit-breedte van het stuurprogramma moet overeenkomen met die
van het stuurprogramma. Gebruik voor &os;/i386 een 32-bits &windows;
stuurprogramma. Voor &os;/amd64 is een 64-bits &windows;
stuurprogramma nodig.</para>
<para>De volgende stap is het compileren van het binaire
stuurprogramma in een laadbare kernelmodule. Gebruik &man.ndisgen.8;
als <username>root</username>:</para>
<screen>&prompt.root; <userinput>ndisgen <replaceable>/pad/naar/W32DRIVER.INF</replaceable>
<replaceable>/pad/naar/W32DRIVER.SYS</replaceable></userinput></screen>
<para>&man.ndisgen.8; is interactief en vraagt om extra informatie als
het dat nodig heeft. Een nieuwe kernel-module wordt in de huidige map
geschreven. Gebruik &man.kldload.8; om de nieuwe module te
laden:</para>
<screen>&prompt.root; <userinput>kldload <replaceable>./W32DRIVER_SYS.ko</replaceable></userinput></screen>
<para>Naast de gegenereerde kernelmodule, moeten ook de modules
<filename>ndis.ko</filename> en
<filename>if_ndis.ko</filename> geladen worden. Dit zou
automatisch moeten gebeuren als er een module geladen wordt
dit afhankelijk is van &man.ndis.4;. Als ze handmatig
ingeladen moeten worden gebruik dan de volgende
commando's:</para>
<screen>&prompt.root; <userinput>kldload ndis</userinput>
&prompt.root; <userinput>kldload if_ndis</userinput></screen>
<para>Het eerste commando laadt de stuurprogrammawrapper voor de
NDIS miniport, de tweede laadt de daadwerkelijke
netwerkinterface.</para>
<para>Controleer nu &man.dmesg.8; om te zien of er ergens fouten
voorkomen. Als alles goed gegaan is ziet u ongeveer het
volgende:</para>
<screen>ndis0: <Wireless-G PCI Adapter> 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>Vanaf dit moment kan de <devicename>ndis0</devicename>
net zo gebruikt worden als elke andere netwerkkaart (bv.
<devicename>dc0</devicename>).</para>
<para>Het systeem kan geconfigureerd worden zodat de
NDIS-modules automatisch gestart worden tijdens het opstarten
van het systeem, net zoals bij andere modules. Kopieer eerst
de gegenereerde module <filename>W32DRIVER_SYS.ko</filename> naar
de map <filename class="directory">/boot/modules</filename>.
Voeg daarna de volgende regel toe aan
<filename>/boot/loader.conf</filename>:</para>
<programlisting>W32DRIVER_SYS_load="YES"</programlisting>
</sect3>
</sect2>
<sect2>
<title>De netwerkkaart instellen</title>
<indexterm>
<primary>netwerkkaarten</primary>
<secondary>instellen</secondary>
</indexterm>
<para>Nadat een geschikt stuurprogramma geladen is, moet de kaart
nog ingesteld worden. Mogelijk is dit al gebeurd door
<application>sysinstall</application> tijdens de
installatie.</para>
<para>Om de instellen van de netwerkkaarten weer te geven:</para>
<screen>&prompt.user; <userinput>ifconfig</userinput>
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
ether 00:a0:cc:da:da:da
inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
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<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
nd6 options=3<PERFORMNUD,ACCEPT_RTADV></screen>
<para>In dit voorbeeld werden de volgende apparaten
weergegeven:</para>
<itemizedlist>
<listitem>
<para><devicename>dc0</devicename>: de eerste
Ethernet-interface;</para>
</listitem>
<listitem>
<para><devicename>dc1</devicename>: de tweede
Ethernet-interface;</para>
</listitem>
<listitem>
<para><devicename>plip0</devicename>: De parallele poort-interface
(mits er een parallele poort aanwezig is op de machine)</para>
</listitem>
<listitem>
<para><devicename>lo0</devicename>: het
loopback-apparaat;</para>
</listitem>
</itemizedlist>
<para>&os; gebruikt de naam van het stuurprogramma gevolgd door
een nummer voor de volgorde waarop de kaarten gedetecteerd zijn
bij het opstarten. <devicename>sis2</devicename> is de derde
netwerkkaart in het systeem die het stuurprogramma &man.sis.4;
gebruikt.</para>
<para>In het vorige voorbeeld is het apparaat
<devicename>dc0</devicename> volledig operationeel. Dit blijkt
uit de volgende indicatoren:</para>
<orderedlist>
<listitem>
<para><literal>UP</literal> betekent dat de kaart ingesteld is
en klaar is voor gebruik;</para>
</listitem>
<listitem>
<para>De kaart heeft een Internet (<literal>inet</literal>)
adres (in dit geval <hostid
role="ipaddr">192.168.1.3</hostid>);</para>
</listitem>
<listitem>
<para>Het heeft een geldig subnetmasker
(<literal>netmask</literal>; <hostid
role="netmask">0xffffff00</hostid> is hetzelfde als
<hostid role="netmask">255.255.255.0</hostid>);</para>
</listitem>
<listitem>
<para>Het heeft een geldig broadcastadres (in dit geval
<hostid role="ipaddr">192.168.1.255</hostid>);</para>
</listitem>
<listitem>
<para>Het MAC-adres van de kaart (<literal>ether</literal>) is
<hostid role="mac">00:a0:cc:da:da:da</hostid>;</para>
</listitem>
<listitem>
<para>De fysieke mediaselectie staat in autoselectiemodus
(<literal>media: Ethernet autoselect (100baseTX
<full-duplex>)</literal>).
<devicename>dc1</devicename> is ingesteld om met
<literal>10baseT/UTP</literal>-media te werken. Meer
informatie over de mogelijke mediatypes staan in de
hulppagina's voor het betreffende stuurprogramma.</para>
</listitem>
<listitem>
<para>De status van de verbinding (<literal>status</literal>)
is <literal>active</literal>, dat wil zeggen dat de drager
is gevonden. Bij <devicename>dc1</devicename>staat echter
<literal>status: no carrier</literal>. Dit is normaal als
er geen Ethernetkabel in de kaart gestoken is.</para>
</listitem>
</orderedlist>
<para>Als de uitvoer &man.ifconfig.8; er ongeveer zoals hieronder
uitziet, dan is de netwerkkaart nog niet ingesteld:</para>
<screen>dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80008<VLAN_MTU,LINKSTATE>
ether 00:a0:cc:da:da:da
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active</screen>
<para>Om de kaart in te stellen zijn
<username>root</username>-rechten nodig. De netwerkkaart kan
vanaf de console worden ingesteld met &man.ifconfig.8;, maar dan
moet dat na elke herstart herhaald worden. Daarom wordt het
vrijwel altijd in <filename>/etc/rc.conf</filename>
gezet.</para>
<para>In <filename>/etc/rc.conf</filename> moet voor elke
netwerkkaart in een systeem een regel toegevoegd worden. In het
huidige voorbeeld zou dat het volgende kunnen zijn:</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>,
enzovoort, moeten vervangen worden door de correcte
stuurprogramma's voor de netwerkkaarten, zo ook de
<acronym>IP</acronym>-adressen. In de handleiding van het
stuurprogramma en van &man.ifconfig.8; staan meer details over
de mogelijke opties en in &man.rc.conf.5; staat meer informatie
over <filename>/etc/rc.conf</filename>.</para>
<para>Als het netwerk al is ingesteld tijdens het installeren van
&os; staan er al enkele regels met betrekking tot de
netwerkkaart(en) in <filename>/etc/rc.conf</filename>. Het is
dus handig <filename>/etc/rc.conf</filename> te controleren
voordat er regels toegevoegd worden.</para>
<para>Ook <filename>/etc/hosts</filename> moet worden gewijzigd om
de namen en <acronym>IP</acronym> adressen van verschillende
machines op het lokale netwerk, als ze er nog niet in staan.
Meer informatie staat in &man.hosts.5; en
<filename>/usr/share/examples/etc/hosts</filename>.</para>
<note>
<para>Als internettoegang nodig is met dit apparaat, kan
het zijn dat de default gateway en de naamserver handmatig
moeten worden ingesteld:</para>
<screen>&prompt.root; <userinput>echo 'defaultrouter="<replaceable>your_default_router</replaceable>"' >> /etc/rc.conf</userinput>
&prompt.root; <userinput>echo 'nameserver <replaceable>your_DNS_server</replaceable>' >> /etc/resolv.conf</userinput></screen>
</note>
</sect2>
<sect2>
<title>Testen en problemen oplossen</title>
<para>Als de veranderingen in <filename>/etc/rc.conf</filename>
zijn gemaakt, moet het systeem opnieuw gestarten worden (of
moeten nauwkeurig alle daemons gestart of herstart worden).
Veranderingen aan de interface(s) worden dan toegepast en dan
kan er controleerd worden of herstarten goed werkt zonder
foutmeldingen. Als alternatief kan ook het netwerk systeem
herstart worden:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/netif restart</userinput></screen>
<note>
<para>Als er ook een default gateway ingesteld is in het
<filename>/etc/rc.conf</filename> bestand, moet ook onderstaand
command worden gegeven:</para>
<screen>&prompt.root; <userinput>/etc/rc.d/routing restart</userinput></screen>
</note>
<para>Zodra het netwerk systeem is herstart, moeten de netwerk
interfaces opnieuw getest worden.</para>
<sect3>
<title>Testen van de netwerkkaart</title>
<indexterm>
<primary>netwerk kaarten</primary>
<secondary>testen</secondary>
</indexterm>
<para>Om te controleren of een ethernet kaart goed geconfigureerd
is, moeten er twee dingen gedaan worden. Allereerst, ping de
interface zelf, en daarna een andere machine op het LAN.</para>
<para>Test eerst de lokale interface:</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>Nu kan er een andere machine op het LAN gepinged worden:</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>Dit kan ook worden geprobeerd met de machine naam in plaats
van met <hostid role="ipaddr">192.168.1.2</hostid> als dit
geconfigureerd is in het <filename>/etc/hosts</filename>
bestand.</para>
</sect3>
<sect3>
<title>Problemen oplossen</title>
<indexterm>
<primary>netwerk kaarten</primary>
<secondary>probleem oplossing</secondary>
</indexterm>
<para>Het testen en zoeken van problemen is altijd een
pijnpunt, welke verminderd kan worden door een aantal
simpele dingen eerst te controleren. Is de netwerkkabel
ingestoken? Zijn de netwerk instellingen correct opgegeven?
Is de firewall goed geconfigureerd? Is de netwerkkaart
ondersteund door &os;? Controleer altijd de hardware notities
voordat er een probleem rapport wordt verstuurd. Update naar
de laatste -STABLE versie, en controleer de mailing lijsten en
misschien zelfs het internet.</para>
<para>Als de kaart werkt, maar de prestaties zijn slecht, dan kan
het de moeite waard zijn om &man.tuning.7; door te nemen.
Incorrecte netwerkinstellingen kunnen ook tot langzame
verbindingen leiden.</para>
<para>Soms kunnen enkele <errorname>device timeouts</errorname>
optreden. Met sommige kaarten is dit normaal gedrag. Maar als
dit continu gebeurt of storend is, is het verstandig uit te
zoeken of er geen sprake is van een hardwareconfict tussen de
netwerkkaart en een ander apparaat. Ook dient nogmaals de
bekabeling gecontroleerd te worden. Misschien zit er niets
anders op dan een andere netwerkkaart te gebruiken.</para>
<para>Het is ook mogelijk dat er <errorname>watchdog
timeout</errorname> foutmeldingen optreden. Als eerste moet
dan de netwerkkabel gecontroleerd worden. Veel kaarten hebben
een PCI-slot nodig dat Bus Mastering ondersteunt. Sommige
oudere moederborden hebben maar één PCI-slot
waarmee dit kan (meestal slot 0). In de documentatie van de
netwerkkaart en het moederbord is na te gaan of dit het
probleem is.</para>
<para><errorname>No route to host</errorname> meldingen treden op
als het systeem niet in staat is om een pakket naar de
eindbestemming te routeren. Dit kan gebeuren als er geen
standaardroute aangegeven is of als er een kabel niet verbonden
is. De uitvoer van <command>netstat -rn</command> moet
gecontroleerd worden of er een geldige route is naar de
bestemming. Mocht dit niet het geval zijn, dan staat er meer
informatie in <xref linkend="advanced-networking"/>.</para>
<para><errorname>ping: sendto: Permission denied</errorname>
foutmeldingen worden vaak veroorzaakt door een verkeerd
ingestelde firewall. Als de kernel <command>ipfw</command>
activeert bij het opstarten zonder dat er firewallregels zijn
gedefiniëerd, is het standaardbeleid om alle verkeer te
weigeren, zelfs pings! In <xref linkend="firewalls"/> staat meer
informatie.</para>
<para>Er kan ook sprake zijn van onvoldoende prestaties doordat de
instelling van de mediaselectie niet optimaal is. In dergelijke
gevallen is het mogelijk om de mediaselectie niet als
<literal>autoselect</literal> in te stellen, maar expliciet aan
te geven wat de mediaselectie moet zijn, bijvoorbeeld
10baseT/UTP voor twisted pair. Hoewel dit voor de meeste
hardware helpt, kan het zijn dat de problemen blijven. Dan
moeten nogmaals de netwerkinstellingen gecontroleerd worden en
geeft de &man.tuning.7; handleiding wellicht meer
informatie.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="configtuning-virtual-hosts">
<title>Virtuele hosts</title>
<indexterm><primary>virtuele hosts</primary></indexterm>
<indexterm><primary>IP-aliassen</primary></indexterm>
<para>&os; wordt veel gebruikt voor virtuele sitehosting, waarbij
één fysieke server er op het netwerk uitziet alsof
het meerdere servers zijn. Dit kan bereikt worden door meerdere
<acronym>IP</acronym>-adressen toe te kennen aan dezelfde
interface.</para>
<para>Een bepaalde netwerkinterface heeft een <quote>echt</quote>
adres en kan daarnaast een willekeurig aantal
<quote>alias</quote>-adressen hebben. Normaliter worden
dergelijke aliassen toegevoegd door aliasregels toe te voegen aan
<filename>/etc/rc.conf</filename>.</para>
<para>Een aliasregel voor de interface
<devicename>fxp0</devicename> ziet er zo uit:</para>
<programlisting>ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"</programlisting>
<para>De aliasregels moeten beginnen met <literal>alias0</literal>
en moete elkaar dan opvolgen (bijvoorbeeld
<literal>_alias1,</literal>, <literal>_alias2</literal>,
enzovoort). Het instelproces stopt als er een nummer
ontbreekt.</para>
<para>Het is belangrijk dat aliassen het juiste netmasker hebben.
Dit is eenvoudig: Een bepaalde interface moet altijd
één adres hebben dat het netmasker van het netwerk
correct representeert. Elk ander adres binnen dit netwerk op deze
interface (alias) moet een netmasker van allemaal
<literal>1</literal>'en (bits) hebben (getoond als <hostid
role="netmask">255.255.255.255</hostid> of <hostid
role="netmask">0xffffffff</hostid>).</para>
<para>Een voorbeeld. Stel de interface
<devicename>fxp0</devicename> is verbonden met twee netwerken, het
netwerk <hostid role="ipaddr">10.1.1.0</hostid> met masker
<hostid role="netmask">255.255.255.0</hostid> en het netwerk
<hostid role="ipaddr">202.0.75.16</hostid> met netmasker
<hostid role="netmask">255.255.255.240</hostid>. Het systeem
moet ook de adressen <hostid role="ipaddr">10.1.1.1</hostid> tot
en met <hostid role="ipaddr">10.1.1.5</hostid> en <hostid
role="ipaddr">202.0.75.17</hostid> tot en met <hostid
role="ipaddr">202.0.75.20</hostid> krijgen. Zoals hierboven
vermeld, heeft alleen het eerste adres in een netwerkreeks (in dit
geval <hostid role="ipaddr">10.0.1.1</hostid> en <hostid
role="ipaddr">202.0.75.17</hostid>) een geldig netmasker. Alle
overige (<hostid role="ipaddr">10.1.1.2</hostid> tot en met
<hostid role="ipaddr">10.1.1.5</hostid> en <hostid
role="ipaddr">202.0.75.18</hostid> tot en met <hostid
role="ipaddr">202.0.75.20</hostid>) moeten ingesteld worden met
het netmasker <hostid
role="netmask">255.255.255.255</hostid>.</para>
<para>De volgende regels voor <filename>/etc/rc.conf</filename>
stellen een adapter in voor het bovenstaande scenario:</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-syslog">
<sect1info>
<authorgroup>
<author>
<firstname>Niclas</firstname>
<surname>Zeising</surname>
<contrib>Bijgedragen door </contrib>
</author>
</authorgroup>
</sect1info>
<title>De systeemlogger <application>syslogd</application>
configureren</title>
<indexterm><primary>systeemlogging</primary></indexterm>
<indexterm><primary>syslog</primary></indexterm>
<indexterm><primary>syslogd</primary></indexterm>
<para>Systeemlogging is een belangrijk aspect van systeembeheer. Het wordt
zowel gebruikt voor het opsporen van hardware-problemen als voor
software-problemen in het systeem. Het speelt ook zeer belangrijke rol bij
het controleren van de beveiliging en het reageren op incidenten.
Systeem-daemons die niet in een terminal beheerd worden, loggen gewoonlijk
informatie naar een systeemlogfaciliteit of een ander logbestand.</para>
<para>Deze sectie beschrijft hoe de &os; systeemlogger, &man.syslogd.8;, te
configureren en te gebruiken, en behandelt logrotatie en logbeheer met
&man.newsyslog.8;. De focus ligt bij het opzetten en gebruiken van
<command>syslogd</command> op een lokale machine. Meer geavanceerdere
opstellingen die een aparte loghost gebruiken staan in <xref
linkend="network-syslogd"/>.</para>
<sect2>
<title><application>syslogd</application> gebruiken</title>
<para>In de standaardconfiguratie van &os; wordt &man.syslogd.8; gestart
tijdens het opstarten. Dit wordt bepaald door de variabele
<literal>syslogd_enable</literal> in <filename>/etc/rc.conf</filename>.
Er zijn vele toepassingsargumenten die het gedrag van &man.syslogd.8;
beïnvloeden. Gebruik <literal>syslogd_flags</literal> in
<filename>/etc/rc.conf</filename> om ze te veranderen. Bekijk
&man.syslogd.8; voor meer informatie over de argumenten, en
&man.rc.conf.5;, <xref linkend="configtuning-core-configuration"/> en
<xref linkend="configtuning-rcd"/> voor meer informatie over
<filename>/etc/rc.conf</filename> en het deelsysteem &man.rc.8;.</para>
</sect2>
<sect2>
<title><application>syslogd</application> configureren</title>
<indexterm><primary>syslog.conf</primary></indexterm>
<para>Het configuratiebestand, standaard
<filename>/etc/syslog.conf</filename>, bepaalt wat &man.syslogd.8; doet
met de logregels nadat ze eenmaal ontvangen zijn. Er zijn verschillende
parameters om de afhandeling van binnenkomende gebeurtenissen te
beheren, waarvan de twee basaalste <firstterm>faciliteit</firstterm> en
<firstterm>niveau</firstterm> zijn. De faciliteit beschrijft welk
deelsysteem het bericht genereerde, zoals de kernel of een daemon, het
niveau beschrijft de ernst van de opgetreden gebeurtenis. Dit maakt het
mogelijk om het bericht naar verschillende logbestanden te loggen, of
het weg te gooien, afhankelijk van de faciliteit en het niveau. Het is
ook mogelijk om actie te nemen afhankelijk van de toepassing dat het
bericht verstuurde, en in het geval van loggen op afstand, ook de
hostnaam van de machine dat het logbericht genereerde.</para>
<para>Het configureren van &man.syslogd.8; is vrij rechttoe-rechtaan. Het
configuratiebestand bevat één regel per actie, de syntaxis
van elke regel is een selecteerderveld gevolgd door een actieveld. De
syntaxis van het selecteerderveld is
<replaceable>faciliteit.niveau</replaceable> dat overeenkomt met
logberichten van <replaceable>faciliteit</replaceable> op niveau
<replaceable>niveau</replaceable> of hoger. Het is ook mogelijk om een
optionele vergelijkingsvlag voor het niveau toe te voegen om meer
precies te specificeren wat er gelogd wordt. Er kunnen meerdere
selecteerdervelden worden gebruikt voor dezelfde actie, ze worden
gescheiden door een puntkomma (<literal>;</literal>). Het gebruik van
<literal>*</literal> zal met alles overeenkomen. Het actieveld bepaalt
waar het logbericht naar toe wordt gezonden, zoals een bestand of een
loghost op afstand. Als voorbeeld is hier de standaard
<filename>syslog.conf</filename> van &os;:</para>
<programlisting># $&os;$
#
# 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 &man.syslog.conf.5; manpage.
*.err;kern.warning;auth.notice;mail.crit /dev/console <co id="co-syslog-many-match"/>
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.* /var/log/security
auth.info;authpriv.info /var/log/auth.log
mail.info /var/log/maillog <co id="co-syslog-one-match"/>
lpr.info /var/log/lpd-errs
ftp.info /var/log/xferlog
cron.* /var/log/cron
*.=debug /var/log/debug.log <co id="co-syslog-comparison"/>
*.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
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.* /var/log/all.log
# uncomment this to enable logging to a remote loghost 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
!ppp <co id="co-syslog-prog-spec"/>
*.* /var/log/ppp.log
!*</programlisting>
<calloutlist>
<callout arearefs="co-syslog-many-match">
<para>Komt overeen met alle berichten met een <literal>err</literal>
of hoger, alsook met <literal>kern.warning</literal>,
<literal>auth.notice</literal> en <literal>mail.crit</literal>, en
stuur deze logberichten naar de console (
<filename>/dev/console</filename>).</para>
</callout>
<callout arearefs="co-syslog-one-match">
<para>Komt overeen met alle berichten van de faciliteit
<literal>mail</literal> op niveau <literal>info</literal> of hoger,
en logt de berichten in
<filename>/var/log/maillog</filename>.</para>
</callout>
<callout arearefs="co-syslog-comparison">
<para>Deze regel gebruikt een vergelijkingsvlag, <literal>=</literal>
om alleen met de berichten op niveau <literal>debug</literal>
overeen te komen en ze op te slaan in
<filename>/var/log/debug.log</filename>.</para>
</callout>
<callout arearefs="co-syslog-prog-spec">
<para>Hier volgt een gebruiksvoorbeeld van een
<emphasis>programmaspecificatie</emphasis>. Dit zorgt ervoor dat de
regels alleen geldig zijn voor het programma in de
programmaspecificatie. In dit geval zorgen deze en de volgende
regel ervoor dat alle berichten van <command>ppp</command>, maar
niet van andere programma's, in
<filename>/var/log/ppp.log</filename> terechtkomen.</para>
</callout>
</calloutlist>
<para>Dit voorbeeld toont dat er vele niveaus en deelsystemen zijn. De
niveaus zijn, in volgorde van meest naar minst kritisch:
<literal>emerg</literal>, <literal>alert</literal>,
<literal>crit</literal>, <literal>err</literal>,
<literal>warning</literal>, <literal>notice</literal>,
<literal>info</literal> en <literal>debug</literal>.</para>
<para>De faciliteiten zijn, in geen specifieke volgorde:
<literal>auth</literal>, <literal>authpriv</literal>,
<literal>console</literal>, <literal>cron</literal>,
<literal>daemon</literal>, <literal>ftp</literal>,
<literal>kern</literal>, <literal>lpr</literal>,
<literal>mail</literal>, <literal>mark</literal>,
<literal>news</literal>, <literal>security</literal>,
<literal>syslog</literal>, <literal>user</literal>,
<literal>uucp</literal> en <literal>local0</literal> tot en met
<literal>local7</literal>. Let erop dat andere besturingssystemen
andere faciliteiten kunnen hebben.</para>
<para>Met deze kennis is het eenvoudig om een nieuwe regel aan
<filename>/etc/syslog.conf</filename> toe te voegen om alles van de
verschillende daemons op niveau <literal>notice</literal> en hoger naar
<filename>/var/log/daemon.log</filename> te loggen:</para>
<programlisting>daemon.notice /var/log/daemon.log</programlisting>
<para>Bekijk &man.syslog.3; en &man.syslogd.8; voor meer informatie over
de verschillende niveaus en faciliteiten. Zie &man.syslog.conf.5; en
<xref linkend="network-syslogd"/> voor meer informatie over
<filename>syslog.conf</filename>, de syntaxis, en geavanceerdere
gebruiksvoorbeelden.</para>
</sect2>
<sect2>
<title>Logbeheer en -rotatie met
<application>newsyslog</application></title>
<indexterm><primary>newsyslog</primary></indexterm>
<indexterm><primary>newsyslog.conf</primary></indexterm>
<indexterm><primary>logrotatie</primary></indexterm>
<indexterm><primary>logbeheer</primary></indexterm>
<para>Logbestanden hebben de neiging om snel te groeien en gestadig
opgehoopt te raken. Dit leidt tot bestanden die vol zitten met minder
direct bruikbare informatie en de harde schijf volmaken. Logbeheer
kan gebruikt worden om dit te beheersen. In &os; wordt
&man.newsyslog.8; gebruikt om logbestanden te beheren. Dit programma
wordt gebruikt om periodiek logbestanden te roteren en te comprimeren
en om optioneel ontbrekende logbestanden aan te maken en programma's
te signaleren dat logbestanden zijn verplaatst. De logbestanden hoeven
niet per sé van syslog afkomstig te zijn; &man.newsyslog.8;
werkt met elke log van elk programma. Het is belangrijk om op te
merken dat <command>newsyslog</command> normaliter vanuit &man.cron.8;
wordt gedraaid en niet een systeem-daemon is. In de
standaardconfiguratie wordt het elk uur gedraaid.</para>
<sect3>
<title><application>newsyslog</application> configureren</title>
<para>Om te weten wat het moet doen leest &man.newsyslog.8; zijn
configuratiebestand, standaard is dit
<filename>/etc/newsyslog.conf</filename>. Dit configuratiebestand
bevat één regel voor elk bestand dat &man.newsyslog.8;
beheert. Elke regel noemt de eigenaar van het bestand, rechten, en
wanneer dat bestand te roteren, alsook optionele vlaggen die de
logrotatie beïnvloeden (zoals compressie) en naar welke
programma's een signaal te sturen wanner de log is geroteerd. Als
voorbeeld is hier de standaard configuratie in &os;:</para>
<programlisting># configuration file for newsyslog
# $&os;$
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated. This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf). If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults. In particular, it may be desirable to switch many of the 644
# entries to 640 or 600. For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential. In the
# future, these defaults may change to more conservative ones.
#
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/all.log 600 7 * @T00 J
/var/log/amd.log 644 7 100 * J
/var/log/auth.log 600 7 100 @0101T JC
/var/log/console.log 600 5 100 * J
/var/log/cron 600 3 100 * JC
/var/log/daily.log 640 7 * @T00 JN
/var/log/debug.log 600 7 100 * JC
/var/log/init.log 644 3 100 * J
/var/log/kerberos.log 600 7 100 * J
/var/log/lpd-errs 644 7 100 * JC
/var/log/maillog 640 7 * @T00 JC
/var/log/messages 644 5 100 @0101T JC
/var/log/monthly.log 640 12 * $M1D0 JN
/var/log/pflog 600 3 100 * JB /var/run/pflogd.pid
/var/log/ppp.log root:network 640 3 100 * JC
/var/log/security 600 10 100 * JC
/var/log/sendmail.st 640 10 * 168 B
/var/log/utx.log 644 3 * @01T05 B
/var/log/weekly.log 640 5 1 $W6D0 JN
/var/log/xferlog 600 7 100 * JC</programlisting>
<para>Elke regel begint met de naam van het bestand dat geroteerd moet
worden, optioneel gevolgd door een eigenaar en groep voor zowel de
geroteerde als nieuw aangemaakte bestanden. Het volgende veld,
<literal>mode</literal> is de modus van de bestanden en
<literal>count</literal> geeft aan hoeveel geroteerde logbestanden
bewaard moeten worden. De velden <literal>size</literal> en
<literal>when</literal> vertellen <command>newyslog</command> wanneer
het bestand geroteerd moet worden. Een logbestand wordt geroteerd
wanneer òfwel de grootte meer is dan de waarde in het veld
<literal>size</literal>, òfwel wanneer de tijd in het veld
<literal>when</literal> is verstreken. <literal>*</literal> geeft aan
dat dit veld genegeerd wordt. Het veld
<replaceable>flags</replaceable> geeft &man.newsyslog.8; verdere
instructies, zoals hoe het geroteerde bestand te comprimeren of om het
logbestand aan te maken als het ontbreekt. De laatste twee velden
zijn optioneel en specificeren het <acronym
role="Process Identifier">PID</acronym>-bestand van een proces en
een naar dat proces te verzenden signaalnummer wanneer het bestand
wordt geroteerd. Raadpleeg &man.newsyslog.conf.5; voor meer
informatie over alle velden, geldige vlaggen en hoe de rotatietijd te
specificeren. Herinner dat <command>newsyslog</command> wordt
gedraaid vanuit <command>cron</command> en niet vaker bestanden kan
roteren dan dat het gedraaid wordt vanuit &man.cron.8;.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="configtuning-configfiles">
<title>Instellingenbestanden</title>
<sect2>
<title><filename class="directory">/etc</filename> layout</title>
<para>Instellingengegevens wordt in een aantal mappen bewaard.
Daar zijn onder andere:</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>Generieke systeeminstellingenbestanden, specifiek
voor het systeem.</entry>
</row>
<row>
<entry><filename
class="directory">/etc/defaults</filename></entry>
<entry>De standaardversies van
systeeminstellingenbestanden.</entry>
</row>
<row>
<entry><filename class="directory">/etc/mail</filename></entry>
<entry>Extra &man.sendmail.8; instellingenbestanden of
instellingenbestanden voor andere MTAs.</entry>
</row>
<row>
<entry><filename class="directory">/etc/ppp</filename></entry>
<entry>Instellingen voor zowel gebruiker- als kernel-ppp
programma's.</entry>
</row>
<row>
<entry><filename class="directory">/etc/namedb</filename></entry>
<entry>Standaardlocatie voor &man.named.8; gegevens.
Normaal gesproken bevinden zich hier
<filename>named.conf</filename> en zonebestanden.</entry>
</row>
<row>
<entry><filename
class="directory">/usr/local/etc</filename></entry>
<entry>Instellingenbestanden voor geïnstalleerde
software. Kan submappen hebben waarin bij elkaar
horende instellingengegevens van een applicatie
gegroepeerd zijn.</entry>
</row>
<row>
<entry><filename
class="directory">/usr/local/etc/rc.d</filename></entry>
<entry>Start- en stopscripts voor geïnstalleerde
diensten.</entry>
</row>
<row>
<entry><filename class="directory">/var/db</filename></entry>
<entry>Automatisch gemaakte systeemspecifieke
databasebestanden, zoals de pakketdatabase, de
&man.locate.1; database, enzovoort.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect2>
<sect2>
<title>Hostnamen</title>
<indexterm><primary>hostnaam</primary></indexterm>
<indexterm><primary>DNS</primary></indexterm>
<sect3>
<title><filename>/etc/resolv.conf</filename></title>
<indexterm><primary><filename>resolv.conf</filename></primary></indexterm>
<para>In <filename>/etc/resolv.conf</filename> wordt
voorgeschreven op welke wijze &os; het Domain Name System
(DNS) moet gebruiken.</para>
<para>De meest voorkomende termen in
<filename>resolv.conf</filename> zijn:</para>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="2*"/>
<tbody>
<row>
<entry><literal>nameserver</literal></entry>
<entry>Het <acronym>IP</acronym>-adres van een
naamserver die ondervraagd moet worden voor
naam/<acronym>IP</acronym>-conversie. De servers
worden in volgorde geprobeerd en het maximale aantal
is drie.</entry>
</row>
<row>
<entry><literal>search</literal></entry>
<entry>Zoeklijst voor het opzoeken van hostnamen.
Meestal wordt deze bepaald door het domein waarop de
lokale hostnaam zich bevindt.</entry>
</row>
<row>
<entry><literal>domain</literal></entry>
<entry>De lokale domeinnaam.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Een typisch <filename>resolv.conf</filename>
bestand:</para>
<programlisting>search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30</programlisting>
<note>
<para><literal>search</literal> en <literal>domain</literal>
dienen niet tegelijk gebruikt te worden.</para>
</note>
<para>Als DHCP wordt gebruikt: &man.dhclient.8; overschrijft
meestal <filename>resolv.conf</filename> met informatie
ontvangen van de DHCP-server.</para>
</sect3>
<sect3>
<title><filename>/etc/hosts</filename></title>
<indexterm><primary>hosts</primary></indexterm>
<para><filename>/etc/hosts</filename> is een eenvoudige
tekstdatabase uit de dagen van het oude Internet. Het werkt
samen met DNS en NIS om namen en <acronym>IP</acronym>
adressen over en weer te vertalen. Lokale computers,
verbonden via een LAN, kunnen hier het beste in opgenomen
worden om zo op simpele wijze naam/<acronym>IP</acronym>
conversie voor een LAN te hebben, zonder noodzaak voor een
&man.named.8; server. Ook kunnen naamaliassen toegekend
worden (vergelijkbaar met CNAMES bij DNS). Op soortgelijke
wijze kan <filename>/etc/hosts</filename> gebruikt worden als
een (zeer beperkte) lokale DNS cache.</para>
<programlisting># $&os;$
#
# Host Database
# Dit bestand hoort de adressen en aliassen te bevatten
# voor de lokale hosts die dit bestand gebruiken.
# Bij gebruik van DNS of NIS hoeft dit bestand helemaal niet gebruikt
# te worden. Zie /etc/nsswitch.conf voor de volgorde van resolutie.
#
#
::1 localhost localhost.my.domain myname.my.domain
127.0.0.1 localhost localhost.my.domain myname.my.domain
#
# Verzonnen netwerk.
#10.0.0.2 myname.my.domain myname
#10.0.0.3 myfriend.my.domain myfriend
#
# Volgens RFC 1918 mogen de volgende IP netwerken gebruikt worden
# als private netwerken die niet met Internet verbonden zijn:
#
# 10.0.0.0 - 10.255.255.255
# 172.16.0.0 - 172.31.255.255
# 192.168.0.0 - 192.168.255.255
#
# Als er toch verbinding moet zijn met Internet, zijn echte
# officieel toegewezen nummers nodig. Probeer ECHT GEEN eigen
# netwerknummers te verzinnen, maar vraag ze op bij de provider
# (als die er is) of bij de Internet Registry (ftp naar
# rs.internic.net, map `/templates').
#</programlisting>
<para><filename>/etc/hosts</filename> heeft als formaat:</para>
<programlisting>[Internet address] [official hostname] [alias1] [alias2] ...</programlisting>
<para>Bijvoorbeeld:</para>
<programlisting>10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2</programlisting>
<para>In &man.hosts.5; staat meer informatie.</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> lijkt veel op
<filename>rc.conf</filename>. Waardetoekenning heeft weer de
vorm <literal>variable=value</literal>. De ingestelde
&man.sysctl.8;-waarden worden doorgevoerd op het moment dat het
systeem naar multi-user modus gaat. Niet alle variabelen kunnen
in deze modus gewijzigd worden.</para>
<para>Om te voorkomen dat er logregels geplaatst worden als
processen crashen en om te voorkomen dat andere gebruikers
kunnen zien welke processen er gestart zijn door een andere
gebruiker, kunnen de volgende instellingen worden gezet in
<filename>sysctl.conf</filename>:</para>
<programlisting>#Log exits met fatale signalen niet (bv. sig 11)
kern.logsigexit=0
# Voorkom dat gebruikers informatie zien over processen die
# worden gedraaid onder een ander UID.
security.bsd.see_other_uids=0</programlisting>
</sect2>
</sect1>
<sect1 id="configtuning-sysctl">
<title>Optimaliseren met sysctl</title>
<indexterm><primary>sysctl</primary></indexterm>
<indexterm>
<primary>optimalisering</primary>
<secondary>met sysctl</secondary>
</indexterm>
<para>&man.sysctl.8; is een interface waarmee veranderingen gemaakt
kunnen worden aan een draaiend &os;-systeem. Er zijn onder meer
vele geavanceerde opties voor de TCP/<acronym>IP</acronym>-stack
en het virtuele geheugensysteem, waarmee een ervaren
systeembeheerder de systeemprestaties drastisch kan verbeteren.
Met &man.sysctl.8; kunnen meer dan vijfhonderd systeemvariabelen
opgevraagd en ingesteld worden.</para>
<para>In essentie heeft &man.sysctl.8; twee functies: het lezen en
wijzigen van systeeminstellingen.</para>
<para>Om alle leesbare variabelen te tonen:</para>
<screen>&prompt.user; <userinput>sysctl -a</userinput></screen>
<para>Om een bepaalde variabele op te vragen, bijvoorbeeld
<varname>kern.maxproc</varname>:</para>
<screen>&prompt.user; <userinput>sysctl kern.maxproc</userinput>
kern.maxproc: 1044</screen>
<para>Om een bepaalde variabele toe te kennen (te wijzigen), is de
syntaxis
<replaceable>variable</replaceable>=<replaceable>value</replaceable>:</para>
<screen>&prompt.root; <userinput>sysctl kern.maxfiles=5000</userinput>
kern.maxfiles: 2088 -> 5000</screen>
<para>Waarden van sysctl-variabelen zijn doorgaans strings (tekst),
getallen of booleans (<literal>1</literal> als waar,
<literal>0</literal> als onwaar).</para>
<para>Om automatisch variabelen in te stellen als de machine start,
kunnen ze toegevoegd worden aan
<filename>/etc/sysctl.conf</filename>. Meer informatie staat in
&man.sysctl.conf.5; en <xref
linkend="configtuning-sysctlconf"/>.</para>
<sect2 id="sysctl-readonly">
<sect2info>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
</sect2info>
<title>&man.sysctl.8; alleen-lezen</title>
<para>In sommige gevallen is het wenselijk om &man.sysctl.8;-waarden
die alleen-lezen zijn toch te wijzigen. Hoewel dit soms
onontkoombaar is, kan het alleen bij een (her)start gedaan
worden.</para>
<para>Op sommige laptops is bijvoorbeeld het apparaat
&man.cardbus.4; niet in staat om geheugenregio's af te tasten, met
als gevolg foutmeldingen als:</para>
<screen>cbb0: Could not map register memory
device_probe_and_attach: cbb0 attach returned 12</screen>
<para>In dergelijke gevallen moeten er meestal enkele
&man.sysctl.8;-instellingen gewijzigd worden die alleen-lezen zijn
en een standaardwaarde hebben. Dit kan bereikt worden door
&man.sysctl.8; <quote>OIDs</quote> in de lokale
<filename>/boot/loader.conf</filename> te zetten.
Standaardinstellingen staan in
<filename>/boot/defaults/loader.conf</filename>.</para>
<para>Om het bovenstaande probleem op te lossen moet in
<filename>/boot/loader.conf</filename>
<literal>hw.pci.allow_unsupported_io_range=1</literal> ingesteld
worden. Dan werkt &man.cardbus.4; wel goed.</para>
</sect2>
</sect1>
<sect1 id="configtuning-disk">
<title>Harde schijven optimaliseren</title>
<sect2>
<title>Sysctl-variabelen</title>
<sect3>
<title><varname>vfs.vmiodirenable</varname></title>
<indexterm><primary><varname>vfs.vmiodirenable</varname></primary></indexterm>
<para>De sysctl-variabele <varname>vfs.vmiodirenable</varname>
kan de waarde 0 (uit) of 1 (aan) hebben. De standaardwaarde
is 1. Deze variabele bepaalt hoe mappen door het systeem in
een cache bewaard worden. De meeste mappen zijn klein en
gebruiken slechts een klein fragment (typisch 1 K) in het
bestandssysteem en nog minder (typisch 512 bytes) in de
buffercache. Als deze variabele uit staat (op 0) bewaart de
buffercache slechts een bepaald aantal mappen in de cache, ook
al is er een overvloed aan geheugen beschikbaar. Wanneer deze
aan staat (op 1), wordt de VM paginacache gebruikt, waardoor
voor het cachen van mappen al het geheugen kan worden
gebruikt. Het is echter wel zo dat het minimale in-core
geheugen dat gebruikt wordt om een map te cachen in dat geval
de fysieke paginagrootte is (typisch 4 K) in plaats van
512 bytes. Het is aan te raden deze optie aan te laten
staan als gebruik gemaakt wordt van diensten die met grote
aantallen bestanden werken, zoals webcaches, grote
mailsystemen en newsservers. Als deze optie aan blijft staan,
verlaagt die de prestaties niet, ook al kost het meer
geheugen. Door experimenteren is dit voor een systeem na te
gaan.</para>
</sect3>
<sect3>
<title><varname>vfs.write_behind</varname></title>
<indexterm><primary><varname>vfs.write_behind</varname></primary></indexterm>
<para>De sysctl-variabele <varname>vfs.write_behind</varname>
staat standaard aan (<literal>1</literal>). Dit betekent dat
het bestandssysteem gegevens naar het medium gaat schrijven op
het moment dat er een volledig cluster aan gegevens verzameld
is. Dit is meestal het geval bij het schrijven van grote
sequentiële bestanden. Het idee is om te voorkomen dat
de buffercache verzadigd raakt met vuile buffers zonder dat
dit bijdraagt aan de I/O-prestaties. Dit kan echter processen
ophouden en onder sommige omstandigheden is het wellicht beter
deze sysctl uit te zetten.</para>
</sect3>
<sect3>
<title><varname>vfs.hirunningspace</varname></title>
<indexterm><primary><varname>vfs.hirunningspace</varname></primary></indexterm>
<para>De sysctl-variabele <varname>vfs.hirunningspace</varname>
bepaalt hoeveel nog te schrijven gegevens er in het complete
systeem op elk moment in de wachtrij naar schijfcontrollers
mag staan. De standaardwaarde is meestal voldoende, maar op
machines met veel schijven, is het beter deze te verhogen naar
vier of vijf <emphasis>megabyte</emphasis>. Het instellen van
een te hoge waarde (groter dan de schrijfdrempel van de
buffercache) kan leiden tot zeer slechte prestaties bij
clustering. Stel deze waarde niet arbitrair hoog in! Hogere
schrijfwaarden kunnen vertraging veroorzaken in het lezen, als
dit tegelijk plaatsvindt.</para>
<para>Er zijn verscheidene andere sysctl's voor buffercache en
VM-pagecache. Het wordt afgeraden deze te wijzigen. Het
VM-systeem is zeer goed in staat zichzelf automatisch te
optimaliseren.</para>
</sect3>
<sect3>
<title><varname>vm.swap_idle_enabled</varname></title>
<indexterm><primary><varname>vm.swap_idle_enabled</varname></primary></indexterm>
<para>De sysctl-variabele
<varname>vm.swap_idle_enabled</varname> is nuttig in grote
meergebruikersystemen met veel gebruikers die af- en aanmelden
en veel onbenutte processen. Dergelijke systemen hebben de
neiging om voortdurend de vrije geheugenreserves onder druk
te zetten. Het is mogelijk om de prioriteit van
geheugenpagina's die verband houden met onbenutte processen
sneller te laten dalen dan met het normale pageout-algoritme,
door deze sysctl aan te zetten en via
<varname>vm.swap_idle_threshold1</varname> en
<varname>vm.swap_idle_threshold2</varname> de swapout
hysterese (in seconden onbenut) af te stemmen. Deze optie
dient alleen gebruikt te worden als ze echt nodig is, want de
andere kant van de medaille is dat dit eerder pre-page
geheugen inhoudt in plaats van later, waardoor het meer
wisselbestand- en schijfbandbreedte kost. In een klein
systeem heeft deze optie een voorspelbaar effect, maar in
grote systemen waar al sprake is van een matige paging kan
deze optie het mogelijk maken voor het VM-systeem om hele
processen gemakkelijk in en uit het geheugen te halen.</para>
</sect3>
<sect3>
<title><varname>hw.ata.wc</varname></title>
<indexterm><primary><varname>hw.ata.wc</varname></primary></indexterm>
<para>Ten tijde van &os; 4.3 is er geflirt met het
uitzetten van IDE-schrijfcaching. Hierdoor neemt de
bandbraadte naar IDE-schijven af, maar het werd als
noodzakelijk beschouwd vanwege ernstige problemen met
gegevensinconsistentie die door harde schijfproducenten
geëintroduceerd waren. Het probleem is dat IDE-schijven
niet de waarheid vertellen over wanneer een schrijfactie
klaar is. Door IDE-schrijfcaching wordt data niet alleen
ongeordend geschreven, maar soms kan zelfs het schrijven van
sommige blokken voortdurend uitgesteld worden als er sprake is
van een hoge schijfbelasting. Een crash of stroomstoring kan
dan ernstige corruptie aan het bestandssysteem veroorzaken.
Daarom werd de standaardinstelling van &os; voor alle
zekerheid gewijzigd. Helaas was het resultaat een groot
verlies aan prestaties en na die uitgave is de
standaardwaarde weer terug veranderd. Met de sysctl-variabele
<varname>hw.ata.wc</varname> kan gecontroleerd worden of
schrijfcaching aan of uit staat. Als schrijfcaching uit
staat, kan het die weer aangezet worden door
<varname>hw.ata.wc</varname> op 1 te zetten. Aangezien dit
een kernelvariabele is, moet deze ingesteld worden vanuit de
bootloader tijdens het opstarten. Nadat de kernel eenmaal
opgestart is, heeft het wijzigen van deze sysctl geen
effect.</para>
<para>Meer informatie staat in &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>kernelopties</primary>
<secondary><literal>SCSI_DELAY</literal></secondary>
</indexterm>
<para>De kernelinstelling <literal>SCSI_DELAY</literal> kan
gebruikt worden om de opstarttijd te versnellen. De
standaardwaarde is nogal hoog en kan <literal>15</literal>
seconden vertraging veroorzaken. Met modernere SCSI-systemen
is <literal>5</literal> seconden al voldoende (zeker met
moderne schijven). De <varname>kern.cam.scsi_delay</varname>
opstart variabele moet hier gebruikt worden. De variabele
en kernelconfiguratie-optie accepteren waarden uitgedrukt
in <emphasis>milliseconden</emphasis> en
<emphasis>niet</emphasis> in
<emphasis>seconden</emphasis>.</para>
</sect3>
</sect2>
<sect2 id="soft-updates">
<title>Softupdates</title>
<indexterm><primary>Softupdates</primary></indexterm>
<indexterm><primary>tunefs</primary></indexterm>
<para>&man.tunefs.8; kan gebruikt worden om een bestandsysteem
nauwkeurig af te stellen. Het heeft veel opties, maar nu wordt
alleen het aan- en uitzetten van softupdates besproken. Dat
gaat als volgt:</para>
<screen>&prompt.root; <userinput>tunefs -n enable /filesystem</userinput>
&prompt.root; <userinput>tunefs -n disable /filesystem</userinput></screen>
<para>Een bestandssysteem kan niet met &man.tunefs.8; gewijzigd
worden als het aangekoppeld is. Softupdates aanzetten wordt dus
in het algemeen gedaan vanuit enkelegebruikermodus, voordat
partities aangekoppeld zijn.</para>
<para>Softupdates zorgen voor een drastische verbetering van de
prestaties met betrekking tot metagegevens, met name het
aanmaken en verwijderen van bestanden, door gebruik van een
geheugencache. Het wordt dan ook aangeraden om op alle
bestandssystemen softupdates te gebruiken. Er zijn twee nadelen
aan softupdates: softupdates garanderen een consistent
bestandssysteem in geval van een crash, maar het kan makkelijk
enkele seconden (zelfs een minuut) achter liggen met het
daadwerkelijk bijwerken op de fysieke harde schijf. Als een
systeem crasht gaat wellicht meer werk verloren dan anders het
geval zou zijn. Daarnaast vertragen softupdates het vrijgeven
van bestandssysteemblokken. Als een bestandssysteem (zoals de
rootpartitie) bijna vol is, dan kan het verrichten van een grote
update, zoals <command>make installworld</command>, ertoe leiden
dat het bestandssysteem ruimtegebrek krijgt en dat daardoor de
operatie mislukt.</para>
<sect3>
<title>Meer over softupdates</title>
<indexterm>
<primary>Softupdates</primary>
<secondary>details</secondary>
</indexterm>
<para>Er zijn traditioneel twee methodes om de metagegevens van
een bestandssysteem terug naar de schijf te schrijven. Het
bijwerken van metagegevens houdt het bijwerken van van
niet-inhoudelijke gegevens zoals inodes of mappen in.</para>
<para>Historisch gezien was het gebruikelijk om updates aan
metagegevens synchroon weg te schrijven. Als een map
bijvoorbeeld gewijzigd was, wachtte het systeem totdat de
verandering daadwerkelijk naar de schijf geschreven was. De
gegevensbuffers (de inhoud van een bestand) werden
doorgeschoven naar de buffercache en op een later moment
asynchroon op de schijf opgeslagen. Het voordeel van deze
benadering is dat ze altijd veilig is. Als het systeem faalt
tijdens het bijwerken, zijn de metagegevens nog altijd
consistent. Een bestand kan volledig gecreëerd zijn of
helemaal niet. Als de gegevensblokken van een bestand nog
niet van de buffercache naar de schijf geschreven zijn ten
tijde van de crash, is &man.fsck.8; in staat om dit te
herkennen en het bestandssysteem te repareren door de lengte
van het bestand nul te maken. Deze implementatie is ook
helder en eenvoudig. Het nadeel is echter dat het wijzigen
van metagegevens een traag proces is. Een
<command>rm -r</command> benadert bijvoorbeeld alle bestanden
in een map sequentiëel, maar elke mapverandering
(verwijderen van een bestand) wordt synchroon naar de schijf
geschreven. Dit omvat ook het bijwerken van de map zelf, van
de inodetabel en mogelijk ook van indirecte blokken die voor
het bestand in kwestie zijn gealloceerd. Gelijksoortige
processen spelen zich af bij een commando als
<command>tar -x</command>, waarbij een grote
bestandshiëearchie wordt uitgepakt.</para>
<para>De tweede mogelijkheid is om het bijwerken van
metagegevens asynchroon weg te schrijven. Dit is standaard in
&linux;/ext2fs en als een *BSD UFS-bestandssysteem met
<command>mount -o async</command> aangekoppeld is, is de
werking hetzelfde. Alle bijwerkingen aan metagegevens worden
eenvoudigweg doorgegeven aan de buffercache en vermengd met
inhoudelijke updates van de bestandsgegevens. Het voordeel
is een grote winst aan snelheid, omdat er niet telkens gewacht
hoeft te worden op het bijwerken van metagegevens tot deze
daadwerkelijk naar de schijf geschreven zijn. De
implementatie is ook in dit geval helder en eenvoudig. Het
grote nadeel is uiteraard dat er geen enkele garantie is voor
de consistentie van het bestandssysteem. Als het systeem
faalt tijdens een operatie waarbij veel metagegevens worden
bijgewerkt (bijvoorbeeld door een stroomstoring of iemand
drukt op de resetknop), blijft het bestandssysteem in een
onvoorspelbare toestand achter. Er is geen mogelijkheid om de
toestand van het bestandssysteem te onderzoeken als het
systeem weer opstart, want de gegevensblokken van een bestand
kunnen al weggeschreven zijn geweest terwijl het wegschrijven
van bijwerkingen aan de inodetabel of de bijhorende map nog
niet plaats heeft gevonden. Het is zelfs onmogelijk om een
<command>fsck</command> te implementeren die de overgebleven
chaos kan opruimen: de benodigde informatie is gewoon niet
volledig aanwezig op de schijf. Als een bestandssysteem op
deze manier onherstelbaar beschadigd is, is de enige optie
&man.newfs.8; te gebruiken en vervolgens te herstellen van
een back-up.</para>
<para>De gebruikelijke oplossing voor dit probleem is het
implementeren van <emphasis>dirty region logging</emphasis>,
ook wel <emphasis>journaling</emphasis> genoemd, hoewel deze
term niet consistent gebruikt wordt en soms ook wordt gebruikt
voor andere vormen van transactielogging. Het bijwerken van
metagegevens wordt nog steeds synchroon geschreven, maar
slechts naar een klein gebied van de schijf. Later worden ze
dan naar de juiste locatie verplaatst. Omdat het loggebied
klein is, hoeven de koppen van de schijf zelfs tijdens
schrijfintensieve operaties nog maar over een kleine fysieke
afstand te bewegen en door deze snellere respons zijn dit
soort operaties sneller dan op de traditionele manier. De
extra complexiteit van de implementatie is nogal beperkt, dus
het risico van introductie van extra bugs valt mee. Een
nadeel is dat alle metagegevens tweemaal geschreven worden
(eerst naar het loggebied en later nog eens naar de
definitieve locatie). Dus bij normaal gebruik kan er sprake
zijn van wat men wel noemt een <quote>performance
pessimization</quote>. Anderzijds kunnen in geval van een
crash alle nog uitstaande metagegevensoperaties snel worden
teruggedraaid of vanuit het loggebied alsnog worden afgemaakt
wanneer de machine weer opstart. Het bestandssysteem start
dan snel op.</para>
<para>Kirk McKusick, de vader van het Berkeley FFS, loste dit
probleem op met softupdates, wat betekent dat alle uitstaande
acties voor het bijwerken van metagegevens in het geheugen
bewaard worden en dan geordend naar de schijf geschreven
worden. Dit heeft het gevolg dat in geval van intensieve
operaties met betrekking tot metagegevens, latere bijwerkingen
aan een item eerdere bewerkingen opvangen
(<quote>catch</quote>) als deze nog in het geheugen zitten en
nog niet weggeschreven waren. Dus alle operaties, op
bijvoorbeeld een map, worden in het algemeen eerst in het
geheugen uitgevoerd voordat er wordt bijgewerkt naar schijf.
De gegevensblokken worden geordend conform hun positie, zodat
ze nooit weggeschreven worden voordat hun metagegevens
geschreven zijn. Als het systeem een crash ondervindt,
veroorzaakt dat impliciet het terugdraaien van uitstaande
operaties (<quote>log rewind</quote>): alle operaties die nog
niet weggeschreven waren lijken nooit gebeurd te zijn. Zo
wordt een consistent bestandssysteem in stand gehouden dat
eruit ziet alsof het 30 tot 60 seconden eerder was. Het
gebruikte algoritme garandeert dat alle bronnen die in gebruik
zijn als zodanig gemarkeerd worden in hun daarvoor geschikte
bitmaps: blokken en inodes. Na een crash is de enige
allocatiefout die kan optreden dat bronnen gemarkeerd kunnen
zijn als in gebruik (<quote>used</quote>), terwijl ze
feitelijk alweer beschikbaar (<quote>free</quote>) zijn.
&man.fsck.8; herkent deze situatie en stelt dergelijke vrij
te maken bronnen opnieuw beschikbaar. Het is volkomen veilig
om na een crash te negeren dat het bestandssysteem niet schoon
is en het tot aankoppelen te dwingen met
<command>mount -f</command>. Om niet langer gebruikte
bronnen vrij te maken moet later &man.fsck.8; uitgevoerd
worden. Dit is dan ook het idee achter <emphasis>background
fsck</emphasis>: op het moment dat het systeem aan het
opstarten is, wordt er alleen een
<emphasis>snapshot</emphasis> van het systeem bewaard.
<command>fsck</command> kan later uitgevoerd worden. Alle
bestandssystemen kunnen <quote>dirty</quote> aangekoppeld
worden en het systeem kan gewoon verder opstarten naar
meergebruikermodus. Vervolgens zijn er
<command>fsck</command>s gepland die in de achtergrond draaien
voor elk bestandssysteem dat niet schoon is en waarmee
bezette bronnen vrijgegeven worden. Bestandssystemen die geen
gebruik maken van softupdates moeten echter nog steeds gebruik
maken van de normale <command>fsck</command> in de
voorgrond.</para>
<para>Het voordeel van softupdates is dat operaties op
metagegevens bijna net zo snel zijn als asynchrone updates
(dat wil zeggen sneller dan met <emphasis>logging</emphasis>,
waarbij de metagegevens keer op keer geschreven worden).
Nadelen zijn de complexiteit van de code (wat een groter
risico op bugs impliceert in een gebied dat bijzonder
gevoelig is voor verlies van gebruikersgegevens) en een
groter geheugenverbruik. Tevens moet de gebruiker wennen aan
enkele eigenaardigheden. Na een crash lijkt de toestand van
het bestandssysteem wat <quote>ouder</quote>. In situaties
waar de standaard synchrone benadering een aantal lege
bestanden zou hebben achtergelaten na
<command>fsck</command>, is het met softupdates juist zo dat
dergelijke bestanden er helemaal niet zijn, omdat de
metagegevens of de bestandsinhoud nooit naar de schijf zijn
geschreven. Schijfruimte wordt pas vrijgegeven als de
bijwerkingen aan metagegevens en inhoudelijke
bestandsgegevens weggeschreven zijn, wat mogelijk pas enige
tijd na het uitvoeren van <command>rm</command> plaatsvindt.
Dit kan problemen veroorzaken als er grote hoeveelheden
gegevens naar een bestandssysteem geschreven worden dat
onvoldoende vrije ruimte heeft om alle bestanden twee keer te
kunnen bevatten (bijvoorbeeld in <filename>/tmp</filename>).</para>
</sect3>
</sect2>
</sect1>
<sect1 id="configtuning-kernel-limits">
<title>Fijnafstemming van kernellimieten</title>
<indexterm>
<primary>fijnafstemming</primary>
<secondary>kernellimieten</secondary>
</indexterm>
<sect2 id="file-process-limits">
<title>Bestandsproceslimieten</title>
<sect3 id="kern-maxfiles">
<title><varname>kern.maxfiles</varname></title>
<indexterm><primary><varname>kern.maxfiles</varname></primary></indexterm>
<para><varname>kern.maxfiles</varname> kan worden verhoogd of
verlaagd, afhankelijk van de systeembehoeften. Deze variabele
geeft het maximale aantal bestandsdescriptors op een systeem.
Als de bestandsdescriptortabel vol is, toont de systeembuffer
meerdere malen <errorname>file: table is full</errorname>, hetgeen
achteraf te zien is met <command>dmesg</command>.</para>
<para>Elk geopend bestand, socket of fifo heeft een
bestandsdescriptor. Een grote produktieserver kan makkelijk
enige duizenden bestandsdescriptors nodig hebben, afhankelijk
van het soort en aantal diensten die tegelijk draaien.</para>
<para>In oudere versies van &os; werd de standaard waarde van
<varname>kern.maxfiles</varname> afgeleid van de optie
<option>maxusers</option> in het kernelconfiguratiebestand.
<varname>kern.maxfiles</varname> groeit evenredig met de
waarde van <literal>maxusers</literal>. Als een aangepaste
kernel wordt gebouwd, is het een goed idee om deze kerneloptie
in te stellen afhankelijk van het gebruikt van een systeem
(maar niet te laag). Hoewel een produktieserver misschien
niet 256 gelijktijdige gebruikers heeft, kunnen de benodigde
systeembronnen het beste vergeleken worden met een
grootschalige webserver.</para>
<para>De optie <literal>maxusers</literal> stelt de grootte van
een aantal belangrijke systeemtabellen in. Dit aantal moet
ruwweg gelijk zijn aan het aantal gebruikers dat verwacht
wordt gelijktijdig van de machine gebruik te maken.</para>
<para>Vanaf &os; 4.5 wordt <varname>kern.maxusers</varname>
automatisch ingesteld tijdens het opstarten gebaseerd op de
hoeveelheid beschikbare geheugen in het systeem en kan worden
vastgesteld tijdens het draaien door te kijken naar de
alleen-lezen sysctl <varname>kern.maxusers</varname>. Sommige
configuraties hebben grotere of kleinere waarden nodig van
<varname>kern.maxusers</varname>, deze kunnen worden gezet
als een opstartvariabele. Waardes van 64, 128 en 256 zijn
daarin niet ongewoon. We raden aan om niet boven de 256 te
gaan tenzij er heel veel bestandsdescriptors benodigd zijn;
veel van de aanpasbaare waarden die standaard worden bepaald
door <varname>kern.maxusers</varname> kunnen individueel
worden overschreven tijdens het opstarten en/of tijdens het
draaien van het systeem in
<filename>/boot/loader.conf</filename> (zie de handleiding
&man.loader.conf.5; of het bestand
<filename>/boot/defaults/loader.conf</filename> voor een paar
aanwijzingen) of zoals elders beschreven in dit document.
<!--(rene) kill next sentence-->
Systemen die ouder zijn dan &os; 4.4 moeten deze waarden
instellen via de kerneloptie &man.config.8;
<option>maxusers</option>.</para>
<para>Voor oudere versies stelt het systeem deze waarde zelf in
als deze uitdrukkelijk op <literal>0</literal> is gezet.
<footnote>
<para>Het auto-tuning-algoritme stelt
<literal>maxusers</literal> in afhankelijk van de
hoeveelheid geheugen in het systeem, met een minimum van
32 en een maximum van 384.</para></footnote>
Als het gewenst is om deze waarde zelf aan te geven, wordt
aangeraden om <literal>maxusers</literal> minstens op 4 te
zetten, met name als het X Window systeem in gebruik is of als
er software gecompileerd wordt. De reden hiervoor is dat de
belangrijkste tabel die door <literal>maxusers</literal>
ingesteld wordt, het maximum aantal processen is, dat
ingesteld wordt op <literal>20 + 16 * maxusers</literal>, dus
als <literal>maxusers</literal> op 1 ingesteld wordt, zijn er
maar 36 gelijktijdige processen mogelijk, inclusief de
ongeveer achttien processen die door het systeem tijdens het
opstarten start en de ongeveer vijftien processen die
waarschijnlijk aangemaakt worden door het opstarten van het X
Window systeem. Zelfs een eenvoudige taak als het afbeelden
van een hulppagina start negen processen op om de pagina te
filteren, te decomprimeren en af te beelden. Als
<literal>maxusers</literal> op 64 ingesteld wordt, zijn er
1044 gelijktijdige processen mogelijk, wat genoeg moet zijn
voor bijna alle soorten gebruik. Als echter de gevreesde
fout <errortype>proc table full</errortype> verschijnt als er
geprobeerd wordt om een programma op te starten of als er een
server gedraaid wordt met een groot aantal gelijktijdige
gebruikers, zoals <hostid
role="fqdn">ftp.FreeBSD.org</hostid>, kan het getal altijd
verhoogd worden en kan de kernel opnieuw gebouwd
worden.</para>
<note>
<para><literal>maxusers</literal> stelt
<emphasis>geen</emphasis> grens aan het aantal gebruikers
dat zich op de machine kan aanmelden. Het stelt gewoon
verschillende tabelgroottes in op redelijke waardes,
uitgaande van het maximum aantal gebruikers dat
waarschijnlijk de machine gebruikt en van het aantal
processen dat elk van deze gebruikers zal draaien. Een
sleutelwoord dat <emphasis>wel</emphasis> het aantal
gelijktijdige aanmeldingen op afstand en X-terminalvensters
begrensd is <link
linkend="kernelconfig-ptys"><literal>pseudo-device pty
16</literal></link>. In &os; 5.X kan dit getal
genegeerd worden omdat daar het stuurprogramma &man.pty.4;
<quote>auto-cloning</quote> is. Er kan eenvoudig gebruik
worden gemaakt van de regel <literal>device pty</literal>
in het instellingenbestand.</para>
</note>
</sect3>
<sect3>
<title><varname>kern.ipc.somaxconn</varname></title>
<indexterm><primary><varname>kern.ipc.somaxconn</varname></primary></indexterm>
<para>De sysctl-variabele <varname>kern.ipc.somaxconn</varname>
beparkt de grootte van de luisterwachtrij voor het accepteren
van nieuwe TCP-verbindingen. De standaardwaarde van
<literal>128</literal> is meestal te laag voor robuuste
behandeling van nieuwe verbindingen in een zwaarbeladen
webserveromgeving. Voor zulke omgevingen wordt aangeraden
deze waarde te verhogen tot <literal>1024</literal> of hoger.
De dienstdaemon beperkt misschien zelf de luisterwachtrij
(bijvoorbeeld &man.sendmail.8; of
<application>Apache</application>), maar heeft vaak een
mogelijkheid in een configuratiebestand de wachtrijgrootte
aan te passen. Grote luisterwachtrijen zijn ook beter in het
ontwijken van Ontzegging van Dienst (<abbrev>DoS</abbrev>)
aanvallen.</para>
</sect3>
</sect2>
<sect2 id="nmbclusters">
<title>Netwerkbeperkingen</title>
<para>De kerneloptie <literal>NMBCLUSTERS</literal> bepaalt het
aantal netwerk-Mbufs dat beschikbaar is voor een systeem. Een
veel bezochte server met een laag aantal Mbufs beperkt de
mogelijkheden van &os;. Elk cluster staat voor ongeveer
2 K geheugen, dus een waarde van 1024 stelt 2 megabyte
aan kernelgeheugen voor, dat is gereserveerd voor
netwerkbuffers. Een simpele berekening geeft aan hoeveel er
nodig is. Stel dat een webserver met een maximum van 1000
simultane verbindingen voor elke verbinding 16 K aan
ontvangstnetwerkbuffers en 16 K aan zendbuffers kost, dan
is ongeveer 32 MB aan netbuffers nodig voor de webserver.
Een goede vuistregel is te vermeniguldigen met twee, dus
2x32 MB / 2 KB = 64 MB /
2 kB = 32768. Voor machines met veel geheugen wordt
4096 tot 32768 aangeraden. Er moet in geen geval een arbitrair
hoge waarde voor deze sysctl opgegeven worden, want dat kan
leiden tot een crash tijdens het opstarten. Met de optie
<option>-m</option> van &man.netstat.1; kan het clustergebruik
van het netwerk bekeken worden.</para>
<para>De loaderparameter <varname>kern.ipc.nmbclusters</varname>
moet gebruikt worden om dit tijdens het opstarten toe te passen.
Alleen voor oudere versies van &os; is het nodig om de
kerneloptie <literal>NMBCLUSTERS</literal> te gebruiken.</para>
<para>Voor drukke servers die extensief gebruik maken van de
systeemaanroep &man.sendfile.2;, kan het nodig zijn het aantal
&man.sendfile.2;-buffers te verhogen via de kerneloptie
<literal>NSFBUFS</literal> of door de waarde in te stellen in
<filename>/boot/loader.conf</filename> (in &man.loader.8; staan
details). Als er in de procestabel processen staan met een
status <literal>sfbufa</literal> is dat een algemene indicator
dat deze parameter aangepast moet worden. De sysctl-variabele
<varname>kern.ipc.nsfbufs</varname> is alleen-lezen en laat zien
op welke waarde deze kernelvariabele is ingesteld. Deze
parameter schaalt engiszins met de variabele
<varname>kern.maxusers</varname>, maar het kan nodig zijn om
deze bij te stellen.</para>
<important>
<para>Zelfs als een socket als non-blocking gemarkeerd is, dan
nog kan het aanroepen van &man.sendfile.2; op de non-blocking
socket ertoe leiden dat er toch blokkade optreedt totdat er
voldoende <literal>struct sf_buf</literal>'s vrijgemaakt
zijn.</para>
</important>
<sect3>
<title><varname>net.inet.ip.portrange.*</varname></title>
<indexterm><primary>net.inet.ip.portrange.*</primary></indexterm>
<para>De sysctl-variabelen
<varname>net.inet.ip.portrange.*</varname> bepalen welke reeks
poortnummers automatisch gebonden wordt aan TCP- en
UDP-sockets. Er zijn drie gebieden: een laag gebied, een
(standaard) middengebied en een hoog gebied. De meeste
netwerkprogramma's gebruiken het standaardbereik, wat
begrensd wordt door
<varname>net.inet.ip.portrange.first</varname> en
<varname>net.inet.ip.portrange.last</varname> met
standaardwaarden van respectievelijk 1024 en 5000. Gebonden
poortreeksen worden gebruikt voor uitgaande verbindingen en
het is onder bepaalde omstandigheden mogelijk dat poorten op
raken. Dit gebeurt meestal in het geval van een zwaar belaste
webproxy. Poortbereik is niet van belang als vooral diensten
draaien die zich bezighouden met inkomende verbindingen, zoals
een normale webserver, of als het aantal uitgaande
verbindingen beperkt is, zoals bij een mailrelay. Voor
situaties waarin een tekort aan poorten dreigt, wordt
aangeraden om <varname>net.inet.ip.portrange.last</varname>
bescheiden op te hogen. Een waarde van
<literal>10000</literal>, <literal>20000</literal> of
<literal>30000</literal> is redelijk. Er moet ook rekening
met effecten op firewalls gehouden worden als de poortreeks
gewijzigd wordt. Sommige firewalls kunnen grote poortreeksen
blokkeren, meestal de lagere poorten, en verwachten dat andere
systemen hogere poorten gebruiken voor uitgaande verbindingen.
Om deze reden wordt het niet aanbevolen om
<varname>net.inet.ip.portrange.first</varname> te
verlagen.</para>
</sect3>
<sect3>
<title>TCP Bandbreedtevertragingsproduct (TCP Bandwidth Delay
Product)</title>
<indexterm>
<primary>TCP bandbreedtevertragingsproduct</primary>
<secondary><varname>net.inet.tcp.inflight.enable</varname></secondary>
</indexterm>
<para>De TCP-bandbreedtevertragingsproductlimitatie lijkt op
TCP/Vegas in NetBSD. Het kan aangezet worden door de
sysctl-variabele
<varname>net.inet.tcp.inflight.enable</varname> de waarde
<literal>1</literal> te geven. Het systeem tracht dan het
bandbreedtevertragingssprodukt te berekenen voor elke
verbinding en beperkt dan de hoeveelheid gegevens in de
wachtrij naar het netwerk tot de hoeveelheid die vereist is om
maximale doorvoer te kunnen handhaven.</para>
<para>Dit is nuttig bij gebruik van modems, Gigabit Ethernet of
zelfs bij WAN-verbindingen met hoge snelheid (of elke andere
verbinding met een groot bandbreedtevertragingsprodukt), in
het bijzonder als ook windowschaling of een groot
verzendwindow gebruikt wordt. Als deze optie aangezet wordt,
dient ook <varname>net.inet.tcp.inflight.debug</varname> de
waarde <literal>0</literal> te krijgen (geen debugging) en
voor produktiegebruik kan het instellen van
<varname>net.inet.tcp.inflight.min</varname> naar minstens
<literal>6144</literal> voordeel opleveren. Het instellen van
hoge minima kan effectief het beperken van bandbreedte
ondermijnen, afhankelijk van de verbinding. De mogelijkheid
tot limitering zorgt ervoor dat de hoeveelheid gegevens die
opgebouwd wordt, in tussentijdse route- en switchwachtrijen
verlaagd kan worden en tevens kan de hoeveelheid gegevens die
opgebouwd wordt in de interfacewachtrij van de lokale host
verlaagd worden. Met minder pakketten in wachtrijen kunnen
interactieve verbindingen opereren met lagere
<emphasis>Round Trip</emphasis> tijden, met name over langzame
modems. Deze optie gaat alleen over datatransmissie (upload /
serverkant) en heeft geen effect gegevensontvangst (download /
cliëntkant).</para>
<para>Aanpassen van
<varname>net.inet.tcp.inflight.stab</varname> wordt
<emphasis>niet</emphasis> aangeraden. Deze parameter krijgt
standaard een waarde van 20, wat 2 maximale pakketten opgeteld
bij de bandbreedtevensterberekening representeert. Het extra
venster is nodig om het algoritme stabiel te houden en om de
reactietijd bij veranderende omstandigheden te verbeteren,
maar het kan ook leiden tot langere pingtijden over langzame
verbindingen (zonder het inflight-algoritme kan dit echter nog
erger zijn). In dergelijke gevallen kan deze parameter
misschien verlaagd worden naar 15, 10 of 5 en misschien moet
voor het gewenste effect ook
<varname>net.inet.tcp.inflight.min</varname> verlaagd worden
(bijvoorbeeld naar 3500). Het verlagen van deze parameters
moet pas in laatste instantie overwogen worden.</para>
</sect3>
</sect2>
<sect2>
<title>Virtueel Geheugen</title>
<sect3>
<title><varname>kern.maxvnodes</varname></title>
<para>Een vnode is de interne representatie van een bestand of
een map. Het verlagen van het aantal beschikbare vnodes voor
het besturingssysteem leidt dus tot een daling van schijf-I/O.
Normaliter wordt dit door het besturingssysteem afgehandeld en
hoeft de instelling niet gewijzigd te worden. Im sommige
gevallen kan schijf-I/O de beperkende factor zijn en kan het
systeem alle beschikbare vnodes in gebruik hebben. Dan dient
deze instelling gewijzigd te worden. De hoeveelheid inactief
en beschikbaar RAM dient meegenomen te worden in de
beslissing.</para>
<para>Het huidige aantal gebruikte vnodes kan als volgt bekeken
worden:</para>
<screen>&prompt.root; <userinput>sysctl vfs.numvnodes</userinput>
vfs.numvnodes: 91349</screen>
<para>Om het maximale aantal vnodes weer te geven:</para>
<screen>&prompt.root; <userinput>sysctl kern.maxvnodes</userinput>
kern.maxvnodes: 100000</screen>
<para>Als het huidige aantal gebruikte vnodes dicht bij het
maximale aantal ligt, is het verstandig om
<varname>kern.maxvnodes</varname> op te hogen met 1.000.
Ook <varname>vfs.numvnodes</varname> dient in de gaten
gehouden te worden. Als de waarde weer tot aan het maximum
stijgt, dan moet <varname>kern.maxvnodes</varname> verder
opgehoogd worden. Er dient een verschuiving op te treden in
het door &man.top.1; gerapporteerde geheugengebruik. Er hoort
meer geheugen actief te zijn.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="adding-swap-space">
<title>Wisselbestandruimte toevoegen</title>
<para>Hoe goed er ook gepland wordt, soms draait een systeem gewoon
niet zoals verwacht. Een oorzaak hiervoor kan een tekort aan
wisselbestandruimte zijn. Als blijkt dat er meer
wisselbestandruimte nodig is, kan dat eenvoudig. Er zijn drie
manieren om de totale ruimte beschikbaar als wisselbestand te
vergroten: een nieuwe harde schijf toevoegen, swappen over NFS of
een wisselbestand maken op een bestaande (UFS of andere)
partitie.</para>
<para>Kijk voor informatie over het beveiligen van het
wisselbestand, welke opties hiervoor bestaan, en waarom dit gedaan
zou moeten worden in <xref linkend="swap-encrypting"/> van het
handboek.</para>
<sect2 id="new-drive-swap">
<title>Swap op een nieuwe of bestaande harde schijf</title>
<para>Een nieuwe harde schijf voor swap toevoegen geeft betere prestaties
dan een partitie aan een bestaande schijf toevoegen. Het aanmaken van
partities en harde schijven wordt uitgelegd in <xref
linkend="disks-adding"/>. <xref linkend="configtuning-initial"/>
bespreekt de overwegingen van partitie-indelingen en de grootte van
swap-partities.</para>
<para>Gebruik &man.swapon.8; om een swap-partitie aan het systeem toe te
voegen, bijvoorbeeld:</para>
<screen>&prompt.root; <userinput>swapon <replaceable>/dev/ada1s1b</replaceable></userinput></screen>
<warning>
<para>Het is mogelijk om elke partitie te gebruiken die momenteel niet
aangekoppeld is, zelfs als deze al gegevens bevat. Het gebruik van
&man.swapon.8; op een partitie die gegevens bevat zal deze gegevens
overschrijven en vernietigen. Zorg ervoor dat de partitie die als
swap toegevoegd wordt echt de bedoelde partitie is voordat
&man.swapon.8; gebruikt wordt.</para>
</warning>
<para>Voeg een regel toe aan <filename>/etc/fstab</filename> voor de
partitie om deze swap-partitie automatisch toe te voegen tijdens het
opstarten:</para>
<programlisting><replaceable>/dev/ada1s1b</replaceable> none swap sw 0 0</programlisting>
<para>Raadpleeg &man.fstab.5; voor een uitleg over de regels in
<filename>/etc/fstab</filename>.</para>
</sect2>
<sect2 id="nfs-swap">
<title>Swappen over NFS</title>
<para>In het algemeen wordt swappen over NFS niet aangeraden
behalve als het onmogelijk is om naar een lokale schijf te
swappen. NFS-swappen wordt gelimiteerd door de hoeveelheid
beschikbare bandbreedte en belast het de NFS-server.</para>
</sect2>
<sect2 id="create-swapfile">
<title>Wisselbestanden</title>
<para>Het is mogelijk om een bestand aan te maken van een bepaalde
grootte en dit als swap te gebruiken. In dit voorbeeld wordt
een bestand van 64 MB gebruikt,
<filename>/usr/swap0</filename>. Uiteraard kan een willekeurige
naam gebruikt worden.</para>
<example>
<title>Een wisselbestand aanmaken op &os;</title>
<orderedlist>
<listitem>
<para>De kernel <filename>GENERIC</filename> bevat reeds het
stuurprogramma voor geheugenschijven (&man.md.4;) dat nodig is
voor deze bewerking. Zorg ervoor dat tijdens het bouwen van een
eigen kernel de volgende regel in uw configuratiebestand
zit:</para>
<programlisting>device md</programlisting>
<para>Kijk voor meer informatie over het bouwen van een eigen kernel
in <xref linkend="kernelconfig"/>.</para>
</listitem>
<listitem>
<para>Het wisselbestand <filename>/usr/swap0</filename>
aanmaken:</para>
<screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
</listitem>
<listitem>
<para>De correcte rechten op <filename>/usr/swap0</filename>
instellen:</para>
<screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
</listitem>
<listitem>
<para>Het wisselbestand opnemen in
<filename>/etc/rc.conf</filename>:</para>
<programlisting>swapfile="/usr/swap0" # Instellen op naam van wisselbestand als hulpwisselbestand gewenst is</programlisting>
</listitem>
<listitem>
<para>De machine moet herstart worden of om het
wisselbestand direct in te schakelen:</para>
<screen>&prompt.root; <userinput>mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0</userinput></screen>
</listitem>
</orderedlist>
</example>
</sect2>
</sect1>
<sect1 id="acpi-overview">
<sect1info>
<authorgroup>
<author>
<firstname>Hiten</firstname>
<surname>Pandya</surname>
<contrib>Geschreven door </contrib>
</author>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
</author>
</authorgroup>
</sect1info>
<title>Energie- en bronnenbeheer</title>
<para>Het is belangrijk om hardwarebronnen op een efficiënte
wijze te benutten. Voordat <acronym>ACPI</acronym>
geïntroduceerd werd was het lastig en onflexibel om het
energieverbruik en de thermische eigenschappen van een systeem te
beheersen. De hardware werd beheerst de <acronym>BIOS</acronym>
en dus had de gebruiker minder controle en zichtbaarheid in de
energiebeheerinstellingen. Enige gelimiteerde configuratie was
mogelijk via <emphasis>Advanced Power Management (APM)</emphasis>.
Energie- en bronnenbeheer is een belangrijk onderdeel van moderne
machines. Het besturingssysteem moet bijvoorbeeld systeemlimieten
in de gaten houdt (en mogelijk een SMS sturen of iets dergelijks)
als de systeemtemperatuur onverwacht toeneemt.</para>
<para>In dit deel van het &os; handboek wordt uitgebreide informatie
verschaft over <acronym>ACPI</acronym>. Aan het einde worden
referenties geleverd naar meer leesmateriaal.</para>
<sect2 id="acpi-intro">
<title>Wat is ACPI?</title>
<indexterm><primary>ACPI</primary></indexterm>
<indexterm><primary>APM</primary></indexterm>
<para>Advanced Configuration and Power Interface
(<acronym>ACPI</acronym>) is een standaard die door een
alliantie van producenten geschreven is, met als doel te
voorzien in een standaardinterface voor hardwarebronnen- en
energiebeheer. Een belangrijk element is dat het meer
flexibiliteit en beheersmogelijkheden biedt aan het
besturingssysteem (<acronym>OS</acronym>). Moderne systemen
hebben de limieten van de huidige PNP-interfaces verder opgerekt
dan wenselijk en misschien wel mogelijk was.
<acronym>ACPI</acronym> is de directe opvolger van
<acronym>APM</acronym> (Advanced Power Management). Centraal is
het verleggen van hardwarebeheer en -monitoring naar de OS-laag
in plaats van de zeer beperkte BIOS-laag.</para>
</sect2>
<sect2 id="acpi-old-spec">
<title>Tekortkomingen van APM</title>
<para>Met de <emphasis>Advanced Power Management (APM)</emphasis>
faciliteit kan het energieverbruik van een systeem geregeld
worden op basis van de systeemactiviteit. Het APM-BIOS wordt
geleverd door de systeemproducent of -verkoper en het is
specifiek voor dat betreffende hardwareplatform. Een
APM-stuurprogramma in het besturingssysteem regelt vervolgens de
toegang tot de <emphasis>APM Software Interface</emphasis>, die
het besturen van vermogensniveau mogelijk maakt. APM dient nog
steeds gebruikt te worden met systemen die gefabriceerd zijn
voor het jaar 2000.</para>
<para>Er zijn vier hoofdproblemen met APM te onderscheiden: ten
eerste wordt het energiebeheer verricht door een BIOS
(afhankelijk van producent) en het besturingssysteem heeft daar
geen kennis van. De gebruiker die idle-time waarden instelt
voor een harde schijf in het APM-BIOS is hier een voorbeeld van.
Dan zal het BIOS de harde schijf langzamer kunnen laten draaien
zonder dat het besturingssysteem de noodzaak ziet of het
goedkeurt. Ten tweede: de APM-logica is ingebed in de BIOS,
waardoor het buiten het besturingssysteem om opereert. Dit
houdt in dat gebruikers problemen met hun APM-BIOS alleen kunnen
verhelpen door een nieuw BIOS in het ROM te flashen, wat een
gevaarlijke en mogelijk onherstelbare operatie is. Ten derde is
APM een producent-specifieke technologie, in de zin dat er
altijd een hoge mate van duplicatie zal zijn van al dan niet
geslaagde pogingen om het wiel opnieuw uit te vinden en
uiteraard ook van bugs. Er is geen enkele garantie dat het
wegnemen van een bug door een producent ook een zelfde bug
wegneemt bij een concurrent. Tenslotte is het van belang te
weten dat de APM-BIOS in het algemeen gewoon te weing geheugen
kon gebruiken om een ingewikkeld energiebeheer te kunnen
implementeren. Laat staan dat deze goed aanpasbaar was aan
veranderlijke doelstellingen voor de betreffende machine.</para>
<para><emphasis>Plug-n-play BIOS (PNPBIOS)</emphasis> was in veel
situaties onbetrouwbaar. PNPBIOS is 16-bitstechnologie, dus het
besturingssysteem moet 16-bit emulatie gebruiken om met
PNPBIOS-methoden te kunnen samenwerken.</para>
<para>Het &os;-stuurprogramma <acronym>APM</acronym> is
gedocumenteerd in &man.apm.4;.</para>
</sect2>
<sect2 id="acpi-config">
<title><acronym>ACPI</acronym> instellen</title>
<para>Het stuurprogramma <filename>acpi.ko</filename> wordt
standaard geladen bij het opstarten door de &man.loader.8; en
hoeft <emphasis>niet</emphasis> gecompileerd te worden. De
redenatie is dat er met modules gemakkelijker gewerkt kan
worden, bijvoorbeeld een andere <filename>acpi.ko</filename>
gebruiken zonder dat er een nieuwe kernel gebouwd moet worden.
Dit heeft het voordeel dat testen eenvoudiger is. Een andere
reden is dat het opstarten van <acronym>ACPI</acronym> nadat
een systeem eenmaal volledig opgestart is meestal niet goed
werkt. Mocht er hinder ondervonden worden, dan kan
<acronym>ACPI</acronym> beter uitgeschakeld worden. Dit
stuurprogramma kan niet gestopt worden als het eenmaal geladen
is, omdat de systeembus het gebruikt voor allerlei interacties
met hardware. <acronym>ACPI</acronym> kan uitgezet worden door
het instellen van <literal>hint.acpi.0.disabled="1"</literal> in
<filename>/boot/loader.conf</filename> of in de &man.loader.8;
prompt.</para>
<note>
<para><acronym>ACPI</acronym> en <acronym>APM</acronym>
kunnen niet samenleven en moeten afzonderlijk en exclusief
gebruikt worden. De laatste die gestart wordt bepaalt of het
stuurprogramma de ander wel of niet ziet.</para>
</note>
<para>In haar eenvoudigste vorm kan <acronym>ACPI</acronym>
gebruikt worden om het systeem in slaapmodus te zetten met
&man.acpiconf.8; met de vlag <option>-s</option> en een optie
<literal>1-5</literal>. De meeste gebruikers hebben alleen
<literal>1</literal> of <literal>3</literal> nodig. De optie
<literal>5</literal> verricht een <quote>soft-off</quote>, wat
hetzelfde is als:</para>
<screen>&prompt.root; <userinput>halt -p</userinput></screen>
<para>Andere opties zijn mogelijk via &man.sysctl.8;. Zie de
handleidingen van &man.acpi.4; en &man.acpiconf.8; voor meer
informatie.</para>
</sect2>
</sect1>
<sect1 id="ACPI-debug">
<sect1info>
<authorgroup>
<author>
<firstname>Nate</firstname>
<surname>Lawson</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Peter</firstname>
<surname>Schultz</surname>
<contrib>Met medewerking van </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
</author>
</authorgroup>
</sect1info>
<title>&os; <acronym>ACPI</acronym> gebruiken en debuggen</title>
<para><acronym>ACPI</acronym> is een totaal nieuwe manier om
apparaten te ontdekken, om energieverbruik te beheren en om een
gestandaardiseerde toegang te bieden tot allerlei apparaten die
eerder via het <acronym>BIOS</acronym> beheerd werden. Er wordt
voortdurend vooruitgang geboekt om <acronym>ACPI</acronym> op alle
systemen te laten werken, maar bugs in de
<firstterm><acronym>ACPI</acronym>Machine Language</firstterm>
(<acronym>AML</acronym>) bytecode van sommige moederborden,
onvolledigheden in de subsystemen van de kernel van &os; en bugs
in de &intel; <acronym>ACPI-CA</acronym> interpreter blijven
opduiken.</para>
<para>Deze tekst is bedoeld om u te helpen met het bijstaan van de
&os; <acronym>ACPI</acronym> beheerders met het vinden van de
hoofdoorzaken van problemen die u opmerkt en met het debuggen en
het vinden van een oplossing.</para>
<sect2 id="ACPI-submitdebug">
<title>Debuginformatie aanleveren</title>
<note>
<para>Voordat een probleem wordt gemeld, moet het zeker zijn dat
de laatste <acronym>BIOS</acronym> versie draait en indien
beschikbaar de geïntregeerde controller firmware
versie.</para>
</note>
<para>Diegenen die meteen een probleem willen indienen, sturen de
volgende informatie naar <ulink
url="mailto:freebsd-acpi@FreeBSD.org">
freebsd-acpi@FreeBSD.org</ulink>:</para>
<itemizedlist>
<listitem>
<para>Omschrijving van het foutieve gedrag, inclusief
systeemtype en -model en alles wat de fout kan veroorzaken.
Als het een nieuw fenomeen is, dan dient ook zo accuraat
mogelijk aangegeven te worden wanneer de fout het eerst
optrad.</para>
</listitem>
<listitem>
<para>De uitvoer van &man.dmesg.8; van <command>boot
-v</command>, inclusief foutmeldingen die gegenereerd
worden als de fout optreedt.</para>
</listitem>
<listitem>
<para>De uitvoer van &man.dmesg.8; van <command>boot
-v</command> met <acronym>ACPI</acronym> uitgeschakeld,
indien het uitzetten van <acronym>ACPI</acronym> het
probleem oplost.</para>
</listitem>
<listitem>
<para>Uitvoer van <command>sysctl hw.acpi</command>. Dit is
tevens een goede manier om uit te vinden welke
<acronym>ACPI</acronym>-mogelijkheden een systeem
heeft.</para>
</listitem>
<listitem>
<para>Een <acronym>URL</acronym> waar de
<firstterm><acronym>ACPI</acronym>Source
Language</firstterm> (<acronym>ASL</acronym>) gevonden
kan worden. De <acronym>ASL</acronym> dient
<emphasis>niet</emphasis> rechtstreeks naar de lijst
gezonden te worden, omdat deze nogal groot kan zijn. Een
kopie van een ASL kan gemaakt worden met het volgende
commando:</para>
<screen>&prompt.root; <userinput>acpidump -dt > <replaceable>naam</replaceable>-<replaceable>systeem</replaceable>.asl</userinput></screen>
<para>(Vervang uw aanmeldnaam door
<filename>$NAME</filename> en producent/model door
<filename>$SYSTEM</filename>. Bijvoorbeeld:
<filename>njl-FooCo6000.asl</filename>)</para>
</listitem>
</itemizedlist>
<para>De meeste &os;-programmeurs lezen de &a.current;, maar
problemen gaan bij voorkeur ook naar &a.acpi.name; zodat ze
zeker gezien worden. Het kan enige tijd duren voordat er
antwoord komt, omdat deze mensen elders ook nog volledige banen
hebben. Als de bug niet meteen duidelijk is, komt er
waarschijnlijk en verzoek om een <acronym>PR</acronym> in te
dienen via &man.send-pr.1;. Als er een <acronym>PR</acronym>
moet worden opgesteld, dan dient alle hierboven gevraagde
informatie vermeld te worden. Dit helpt om het probleem te
kunnen volgen en oplossen. Het sturen van een
<acronym>PR</acronym> zonder eerst &a.acpi.name; te mailen is
niet wenselijk, aangezien men <acronym>PR</acronym>s gebruikt
als herinnering van bestaande problemen, niet als
rapportagesysteem. Mogelijk is een probleem al eens door iemand
anders gemeld.</para>
</sect2>
<sect2 id="ACPI-background">
<title>Achtergrond</title>
<para><acronym>ACPI</acronym> is aanwezig op alle moderne
computers die voldoen aan de ia32 (x86), ia64 (Itanium) of amd64
(AMD) architecturen. De volledige standaard heeft vele
mogelijkheden zoals <acronym>CPU</acronym>-prestatiebeheer,
energiebeheer, thermische zones, diverse batterijsystemen,
ingebedde controllers en busnummering. De meeste systemen
implementeren minder dan de volledige standaard. Een
desktopsysteem implementeert bijvoorbeeld meestal alleen
busnummering, terwijl laptops mogelijk ook koeling- en
batterijbeheer ondersteunen. Laptops hebben ook suspend en
resume (slapen en wakker worden) met hun eigen aanverwante
comlexiteit.</para>
<para>Een <acronym>ACPI</acronym>-compliant systeem heeft
verscheidene componenten. Het <acronym>BIOS</acronym>- en
chipsetverkopers bieden verscheidene vaste tabellen aan zoals
<acronym>FADT</acronym> in het geheugen die zaken als de
<acronym>APIC</acronym>-afbeelding (gebruikt voor
<acronym>SMP</acronym>), configuratieregisters, en eenvoudige
configuratiewaarden specificeren. Ook wordt er een tabel van
bytecode (de <firstterm>Differentiated System
Description Table</firstterm> of <acronym>DSDT</acronym>)
geleverd die een op een boomstructuur lijkende namespace biedt
voor apparaten en methoden.</para>
<para>Het stuurprogramma <acronym>ACPI</acronym> moet de
voorgedefinieerde tabellen verwerken, een interpreter voor de
bytecode implementeren en apparaatstuurprogramma's en de kernel
aanpassen om informatie van het
<acronym>ACPI</acronym>-subsysteem te accepteren. &intel; heeft
een interpreter beschikbaar gesteld (<acronym>ACPI-CA</acronym>)
die door &os; en ook door &linux; en NetBSD gebruikt wordt. De
<acronym>ACPI-CA</acronym>-broncode staat in <filename
class="directory">src/sys/contrib/dev/acpica</filename>. De
lijmcode die <acronym>ACPI-CA</acronym> laat werken met &os;
staat in <filename class="directory">src/sys/dev/acpica/Osd</filename>.
Stuurprogramma's die verscheidene
<acronym>ACPI</acronym>-apparaten implementeren staan in
<filename class="directory">src/sys/dev/acpica</filename>.</para>
</sect2>
<sect2 id="ACPI-comprob">
<title>Algemene problemen</title>
<para>Wil <acronym>ACPI</acronym> goed werken, dan moeten alle
onderdelen goed werken. Hieronder staan enkele algemene
problemen in volgorde van hoe vaak ze optreden en enkele
mogelijke oplossingen of manieren om de problemen te
vermijden.</para>
<sect3>
<title>Muisproblemen</title>
<para>Soms doet een muis het niet bij het opstarten uit de
slaapstand. Een bekend lapmiddel is het toevoegen van
<literal>hint.psm.0.flags="0x3000"</literal> aan het bestand
<filename>/boot/loader.conf</filename>. Als dat niet werkt,
dan wordt aangeraden een bugrapport in te sturen, zoals
eerder is beschreven.</para>
</sect3>
<sect3>
<title>Suspend/resume</title>
<para><acronym>ACPI</acronym> heeft drie slaapstanden waarbij
het geheugen (<acronym>RAM</acronym>) wordt ingezet. Dit
zijn de <acronym>STR</acronym>-toestanden
<literal>S1</literal>-<literal>S3</literal>, en nog een
slaap-met-gebruik-van-harde-schijf toestand
(<literal>STD</literal>) die <literal>S4</literal> heet.
<literal>S5</literal> is <quote>zacht uit</quote> en is de
normale status van een systeem als het is aangesloten maar
niet is aangezet. <literal>S4</literal> kan feitelijk op twee
manieren geïmplementeerd worden:
<literal>S4</literal><acronym>BIOS</acronym> is een slaapstand
naar schijf met behulp van het <acronym>BIOS</acronym> en
<literal>S4</literal><acronym>OS</acronym> wordt volledig door
het besturingssysteem geïmplenteerd.</para>
<para>als eerste dienen de <command>sysctl hw.acpi</command>
items die iets met de slaapstand te maken hebben gecontroleerd
te worden. Hieronder staan de resultaten voor een
Thinkpad:</para>
<screen>hw.acpi.supported_sleep_state: S3 S4 S5
hw.acpi.s4bios: 0</screen>
<para>Dit betekent dat hier <command>acpiconf -s</command>
gebruikt kan worden om <literal>S3</literal>,
<literal>S4</literal><acronym>OS</acronym> en
<literal>S5</literal> te testen. Als <option>s4bios</option>
gelijk was aan (<literal>1</literal>), dan zou er
<literal>S4</literal><acronym>BIOS</acronym> ondersteuning
zijn in plaats van <literal>S4</literal>
<acronym>OS</acronym>.</para>
<para>Als suspend/resume getest moet worden, dient, indien
ondersteund, bij <literal>S1</literal> begonnen te worden.
Deze toestand heeft de grootste kans om te werken, omdat deze
niet veel stuurprogrammaondersteuning vereist. Niemand heeft
nog <literal>S2</literal> geïmplementeerd, maar het is
ongeveer hetzelfde als <literal>S1</literal>. Daarna wordt
<literal>S3</literal> getest. Dit is het diepste
<acronym>STR</acronym>-niveau en heeft uitgebreide
ondersteuning van stuurprogramma's nodig om hardware goed
opnieuw te kunnen starten. Mochten er blokkades optreden,
dan kan naar de &a.acpi.name; lijst gemaild worden. Er kan
echter geen snelle oplossing verwacht worden, omdat er nog de
nodige stuurprogramma's/hardware liggen om getest en bewerkt
te worden.</para>
<para>Een veelvoorkomend probleem met suspend/resume is dat veel
apparaatstuurprogramma's hun firmware, registers of apparaatgeheugen
niet fatsoenlijk opslaan, herstellen, of herinitialiseren. Een
eerste poging om het probleem te vinden omvat:</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>Deze test emuleert de suspend/resume-cyclus van alle
apparaten zonder daadwerkelijk naar de toestand <literal>S3</literal>
te gaan. In sommige gevallen kunt u zo eenvoudig problemen
vaststellen (bijvoorbeeld het verliezen van de firmware-toestand,
timeout van de apparaatwaakhond, en steeds opnieuw iets proberen).
Merk op dat het systeem niet werkelijk naar de toestand
<literal>S3</literal> gaat, wat inhoudt dat apparaten geen spanning
verliezen waardoor velen prima zullen werken zelfs als de
suspend/resume-methoden geheel ontbreken, dit in tegenstelling tot de
echte toestand <literal>S3</literal>.</para>
<para>Moeilijkere gevallen vereisen aanvullende hardware, dat is een
serieële poort/kabel voor de serieële console of een
Firewire poort/kabel voor &man.dcons.4;, en vaardigheden in het
debuggen van de kernel.</para>
<para>Om een probleem te kunnen isoleren helpt het om zoveel
mogelijk stuurprogramma's uit de kernel te halen. Als dit
werkt, kan er teruggewerkt worden naar het stuurprogramma dat
schuldig is aan het falen. Meestal vertonen binaire
stuurprogramma's als <filename>nvidia.ko</filename>, X11
beeldschermstuurprogramma's en <acronym>USB</acronym> de
meeste problemen, terwijl bijvoorbeeld Ethernet-interfaces
meestal meteen goed werken. Als de stuurprogramma's zonder
problemen geladen en verwijderd kunnen worden, dan is dit te
automatiseren door de juiste commando's in
<filename>/etc/rc.suspend</filename> en
<filename>/etc/rc.resume</filename> te zetten. Er staat een
voorbeeld (achter commentaartekens) voor het laden en
verwijderen van een stuurprogramma. Als het beeldscherm er na
wakker worden vreemd uitziet, kan geprobeerd worden
<option>hw.acpi.reset_video</option> op nul te zetten. Met
langere of kortere waarden voor
<option>hw.acpi.sleep_delay</option> kan bekeken worden of dat
helpt.</para>
<para>In geval van problemen is het ook een optie om een recente
&linux; distibutie met ondersteuning voor
<acronym>ACPI</acronym> support te starten en daarvan de
suspend/resume ondersteuning op dezelfde hardware uit te
proberen. Als het werkt met &linux;, dan is het
waarschijnlijk een &os; stuurprogrammaprobleem en als het
mogelijk is uit te vinden over welk stuurprogramma het gaat,
kan dat bijdragen aan het oplossen van het probleem.
<acronym>ACPI</acronym> houdt zich in het algemeen niet bezig
met andere stuurprogramma's zoals geluid,
<acronym>ATA</acronym>, enzovoort. Als er dus een echt
probleem met een stuurprogramma is, dan is waarchijnlijk
uiteindelijk ook nodig naar de &a.current.name; lijst te
posten en naar de beheerder van het stuurprogramma. Voor
degenen met moed is het vooral aan te raden een paar
&man.printf.3;s in problematische stukken van een
stuurprogramma te plaatsen voor debugging om na te gaan waar
de resumefunctie precies hangt.</para>
<para>Tot slot kan geprobeerd worden om <acronym>ACPI</acronym>
uit te zetten en in plaats daarvan <acronym>APM</acronym> aan
te zetten. Als suspend/resume werkt met
<acronym>APM</acronym>, is het wellicht verstandig het daarbij
te houden, vooral met wat oudere apparatuur (voor 2000).
Producenten hebben nogal wat tijd nodig gehad om
<acronym>ACPI</acronym> ondersteuning goed te krijgen en voor
oudere hardware is het waarschijnlijker dat er
<acronym>BIOS</acronym>-problemen zijn met
<acronym>ACPI</acronym>.</para>
</sect3>
<sect3>
<title>Systeem hangt (tijdelijk of permanent)</title>
<para>Meestal is het hangen van het systeem het gevolg van
verloren interrupts of een interruptstorm. Chipsets kunnen
een heleboel problemen hebben, afhankelijk van hoe het
<acronym>BIOS</acronym> interrupts instelt voor het opstarten,
of de <acronym>APIC</acronym> (<acronym>MADT</acronym>) tabel
correct is en de routering van het <firstterm>System Control
Interrupt</firstterm> (<acronym>SCI</acronym>).</para>
<indexterm><primary>interruptstorms</primary></indexterm>
<para>Interruptstorms kunnen onderscheiden worden van verloren
geraakte interrupts door de uitvoer van <command>vmstat
-i</command> te controleren en de regel met
<literal>acpi0</literal> goed te lezen. Als de teller in
toenemende mate hoger staat dan enkele per seconde, dan is
sprake van een interruptstorm. Als het systeem lijkt te
hangen, is het wellicht nog mogelijk door te dringen tot
de <acronym>DDB</acronym> (<keycombo
action="simul"><keycap>CTRL</keycap>
<keycap>ALT</keycap><keycap>ESC</keycap></keycombo>) en
<literal>show interrupts</literal> uit te voeren.</para>
<indexterm>
<primary>APIC</primary>
<secondary>uitschakelen</secondary>
</indexterm>
<para>De beste hoop in geval van interruptproblemen is om
<acronym>APIC</acronym>-ondersteuning uit te zetten met
<literal>hint.apic.0.disabled="1"</literal> in
<filename>loader.conf</filename>.</para>
</sect3>
<sect3>
<title>Panics</title>
<para>Panics zijn relatief zeldzaam met <acronym>ACPI</acronym>
en krijgen de hoogste prioriteit bij het oplossen. Eerst
moeten de verschillende gebeurtenissen waarmee de panic (als
mogelijk) te reproduceren is geïsoleerd worden en moet
een backtrace gemaakt worden. <literal>options DDB</literal>
dient aangezet te worden en er dient een seriële
console (<xref linkend="serialconsole-ddb"/>) of een
&man.dump.8; partitie te komen. In <acronym>DDB</acronym> is
een backtrace te maken met <literal>tr</literal>. Als de
backtrace handmatig opgeschreven moet worden, is het
belangrijk dat in ieder geval de bovenste en onderste vijf (5)
regels van de backtrace genoteerd worden.</para>
<para>Daarna dient getracht te worden het systeem te starten
zonder <acronym>ACPI</acronym>. Als dat werkt, is het
<acronym>ACPI</acronym>-subsysteem geïsoleerd en kunnen
de verschillende <option>debug.acpi.disable</option>-waarden
uitgeprobeerd worden. In &man.acpi.4; staan enkele
voorbeelden.</para>
</sect3>
<sect3>
<title>Systeem slaat aan na slaapstand of stop</title>
<para><literal>hw.acpi.disable_on_poweroff="0"</literal> kan
uitgezet worden in &man.loader.conf.5;. Hierdoor schakelt
<acronym>ACPI</acronym> bepaalde gebeurtenissen tijdens het
afsluitproces niet uit. Om dezelfde redenen moeten sommige
systemen deze waarde altijd op <literal>1</literal>
(standaard) hebben staan. In het algemeen lost dit een
probleem op waarbij een systeem spontaan weer opkomt nadat het
in slaapstand is gezet of geheel gestopt is.</para>
</sect3>
<sect3>
<title>Overige problemen</title>
<para>Als er nog andere problemen zijn met
<acronym>ACPI</acronym> (met een docking station of
apparaten niet gedetecteerd, enzovoort), dan kan een mail met
beschijving naar de mailinglijst gezonden worden. Sommige
zaken kunnen echter gerelateerd zijn aan delen van het
<acronym>ACPI</acronym>-subsysteem die nog niet af zijn,
dus het kan in sommige gevallen een tijd duren. Gebruikers
moeten soms geduld en de bereidheid om eventuele
patches uit te proberen hebben.</para>
</sect3>
</sect2>
<sect2 id="ACPI-aslanddump">
<title><acronym>ASL</acronym>, <command>acpidump</command> en
<acronym>IASL</acronym></title>
<indexterm>
<primary>ACPI</primary>
<secondary>ASL</secondary>
</indexterm>
<para>Het grootste probleem is dat
<acronym>BIOS</acronym>-producenten vaak incorrecte (of gewoon
foutieve) bytecode leveren. Dit blijkt doorgaans uit
kernelboodschappen als:</para>
<screen>ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
(Node 0xc3f6d160), AE_NOT_FOUND</screen>
<para>Vaak kunnen dergelijke problemen geoplost worden door de
<acronym>BIOS</acronym> bij te werken tot de laatste revisie.
De meeste consoleberichten zijn onschuldig, maar als er andere
problemen zijn, zoals batterijstatus die niet werkt, dan ligt
het voor de hand te zoeken naar problemen in de
<acronym>AML</acronym>-code. De bytecode die
<acronym>AML</acronym> genoemd wordt, wordt gecompileerd van een
broncodetaal <acronym>ASL</acronym>. Deze staat weer in een
tabel <acronym>DSDT</acronym>. Met &man.acpidump.8; kan een
kopie van de <acronym>ASL</acronym> gemaakt worden. Dan moeten
zowel de opties <option>-t</option> (laat inhoud van vaste
tabellen zien) als <option>-d</option> (disassembleer
<acronym>AML</acronym> naar <acronym>ASL</acronym>) gebruikt
worden. In <link linkend="ACPI-submitdebug">Debuginformatie
aanleveren</link> staat een voorbeeld.</para>
<para>De eenvoudigste eerste controle is de
<acronym>ASL</acronym>-code opnieuw compileren en kijken of er
foutmeldingen optreden. Waarschuwingen kunnen doorgaans
genegeerd worden, maar fouten zijn bugs die er meestal toe
leiden dat <acronym>ACPI</acronym> niet correct werkt. Om
<acronym>ASL</acronym> te hercompileren:</para>
<screen>&prompt.root; <userinput>iasl eigen.asl</userinput></screen>
</sect2>
<sect2 id="ACPI-fixasl">
<title><acronym>ASL</acronym> repareren</title>
<indexterm>
<primary>ACPI</primary>
<secondary>ASL</secondary>
</indexterm>
<para>Op langere termijn is het de bedoeling dat voor vrijwel elke
machine <acronym>ACPI</acronym> werkt zonder enig ingrijpen van
de gebruiker. Op dit moment wordt er echter nog gewerkt aan
oplossingen voor veel voorkomende vergissingen die
<acronym>BIOS</acronym>-producenten maken. De µsoft;
interpreter (<filename>acpi.sys</filename> en
<filename>acpiec.sys</filename>) controleert niet strikt of het
<acronym>BIOS</acronym> volledig aan de standaard voldoet,
waardoor het voorkomt dat <acronym>BIOS</acronym>-makers die
alleen testen onder &windows; bepaalde fouten in hun
<acronym>ASL</acronym> nooit correct repareren. &os; hoopt door
te gaan met de identificatie en documentatie van welk
niet-standaard gedrag precies wordt toegelaten door
µsoft;'s interpreter en te dit te repliceren zodat &os;
kan werken zonder dat gebruikers zich gedwongen zien om de
<acronym>ASL</acronym> te repareren. Als een tijdelijke
oplossing en om te helpen met het in kaart brengen van bepaald
gedrag, kan de <acronym>ASL</acronym> handmatig gerepareerd
worden. Mocht dit lukken, dan wordt erop aangedrongen een
&man.diff.1; van de oude en de nieuwe <acronym>ASL</acronym> te
mailen, zodat het foutieve gedrag mogelijk in
<acronym>ACPI-CA</acronym> kan worden verwerkt, waardoor andere
gebruikers niet meer handmatig met hun <acronym>ASL</acronym>
aan de gang hoeven.</para>
<indexterm>
<primary>ACPI</primary>
<secondary>foutmeldingen</secondary>
</indexterm>
<para>Hieronder staat een lijst algemene foutmeldingen, hun
oorzaken en hoe ze op te lossen:</para>
<sect3>
<title>_OS afhankelijkheden</title>
<para>Sommige <acronym>AML</acronym>s gaan ervan uit dat de
wereld enkel bestaat uit &windows; versies. &os; kan zich
voordoen als elk <acronym>OS</acronym> om te kijken of dit
problemen oplost. Een gemakkelijke manier om dit te doen is
<literal>hw.acpi.osname="Windows 2001"</literal> in te stellen
in <filename>/boot/loader.conf</filename> of andere
gelijksoortige strings die in een <acronym>ASL</acronym>
staan.</para>
</sect3>
<sect3>
<title>Ontbrekende return-opdrachten</title>
<para>Sommige methoden hebben geen specifieke returnwaarde,
zoals wel vereist wordt door de standaard. Hoewel
<acronym>ACPI-CA</acronym> hier niets mee doet, heeft &os;
de mogelijkheid tot impliciete returns. Er kunnen ook
expliciete return-opdrachten toegevoegd worden waar vereist,
als het bekend is welke waarden teruggevoerd moeten worden.
Om <command>iasl</command> te dwingen tot compilatie van
<acronym>ASL</acronym> kan de schakeloptie
<option>-f</option> gebruikt worden.</para>
</sect3>
<sect3>
<title>De standaard <acronym>AML</acronym> aanpassen</title>
<para>Nadat <filename>eigen.asl</filename> aangepast is, kan
deze als volgt gecompileerd worden:</para>
<screen>&prompt.root; <userinput>iasl eigen.asl</userinput></screen>
<para>Met de optie <option>-f</option> is af te dwingen dat de
<acronym>AML</acronym> gemaakt wordt, zelfs als er
compileerfouten optreden. Sommige fouten (zoals ontbrekende
return-opdrachten) worden automatisch opgelost door de
interpreter.</para>
<para><filename>DSDT.aml</filename> is de standaardnaam voor het
bestand dat door <command>iasl</command> wordt geproduceerd.
Dit is in plaats van de foutieve versie uit het
<acronym>BIOS</acronym> (die nog steeds aanwezig is in het
flashgeneugen) te laden door
<filename>/boot/loader.conf</filename> als volgt te
wijzigen:</para>
<programlisting>acpi_dsdt_load="YES"
acpi_dsdt_name="/boot/DSDT.aml"</programlisting>
<para><filename>DSDT.aml</filename> moet in de map <filename
class="directory">/boot</filename> staan.</para>
</sect3>
</sect2>
<sect2 id="ACPI-debugoutput">
<title>Debuguitvoer van <acronym>ACPI</acronym> verkrijgen</title>
<indexterm>
<primary>ACPI</primary>
<secondary>problemen</secondary>
</indexterm>
<indexterm>
<primary>ACPI</primary>
<secondary>debuggen</secondary>
</indexterm>
<para>Het stuurprogramma <acronym>ACPI</acronym> heeft een zeer
flexibele debugfaciliteit. Er kan zowel een verzameling van
subsystemen aangegeven worden als het niveau van uitvoerigheid.
De te debuggen subsystemen worden aangegeven als lagen
(<quote>layers</quote>) en zijn opgedeeld in
<acronym>ACPI-CA</acronym>-componenten (ACPI_ALL_COMPONENTS) en
<acronym>ACPI</acronym>-hardware-ondersteuning
(ACPI_ALL_DRIVERS). De uitvoerigheid van debuguitvoer wordt
aangegeven als het niveau (<quote>level</quote>) en gaat van
CPI_LV_ERROR (alleen fouten rapporteren) tot ACPI_LV_VERBOSE
(alles). Het niveau is een bitmasker en dus kunnen er meerdere
opties tegelijk ingeschakeld worden (gescheiden door spaties).
In de praktijk wordt wellicht een seriële console gebruikt
om de uitvoer te loggen als deze zo omvangrijk is dat de
console berichtbuffer vol loopt (misschien wel meerdere keren).
Een complete lijst van de individuele lagen en niveaus staat in
&man.acpi.4;.</para>
<para>Debuguitvoer staat standaard niet aan. Door
<literal>options ACPI_DEBUG</literal> toe te voegen aan het
bestand met kernelinstellingen als <acronym>ACPI</acronym> als
de kernel is gebouwd, wordt het ingeschakeld. Door
<literal>ACPI_DEBUG=1</literal> toe te voegen aan
<filename>/etc/make.conf</filename> wordt het systeembreed
ingeschakeld. Als <acronym>ACPI</acronym> als module wordt
gebruikt (de normale situatie), dan hoeft slechts de module
<filename>acpi.ko</filename> opnieuw gecompileerd te
worden:</para>
<screen>&prompt.root; <userinput>cd /sys/modules/acpi/acpi
&& make clean &&
make ACPI_DEBUG=1</userinput></screen>
<para><filename>acpi.ko</filename> moet in
<filename class="directory">/boot/kernel</filename> komen te
staan en de gewenste debuglaag en het gewenste niveau van
uitvoerigheid dienen toegevoegd te worden aan
<filename>loader.conf</filename>. Hieronder een voorbeeld
waarmee debuguitvoer wordt aangezet voor alle
<acronym>ACPI-CA</acronym>-componenten en alle
<acronym>ACPI</acronym>-hardware-stuurprogramma's
(<acronym>CPU</acronym>, <acronym>LID</acronym>, enzovoort.
Het niveau van uitvoerigheid is het laagst mogelijke. Er
worden alleen fouten gemeld.</para>
<programlisting>debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
debug.acpi.level="ACPI_LV_ERROR"</programlisting>
<para>Als de gezochte informatie wordt veroorzaakt door een
specifieke gebeurtenis (bijvoorbeeld in en uit slaapstand gaan),
dan kunnen wijzigingen aan <filename>loader.conf</filename>
achterwege blijven en in plaats daarvan kan
<command>sysctl</command> gebruikt worden om laag en niveau in
te stellen na het opstarten en zo het systeem voor te bereiden
op die specifieke gebeurtenis. De <command>sysctl</command>s
hebben dezelfde namen als de parameters in
<filename>loader.conf</filename>.</para>
</sect2>
<sect2 id="ACPI-References">
<title>Verwijzingen</title>
<para>Meer informatie over <acronym>ACPI</acronym> staat op de
volgende locaties:</para>
<itemizedlist>
<listitem>
<para>De &a.acpi;</para>
</listitem>
<listitem>
<para>De <acronym>ACPI</acronym> mailinglijst archieven <ulink
url="http://lists.freebsd.org/pipermail/freebsd-acpi/">
</ulink></para>
</listitem>
<listitem>
<para>De oude <acronym>ACPI</acronym> mailinglijst archieven <ulink
url="http://home.jp.FreeBSD.org/mail-list/acpi-jp/">
</ulink></para>
</listitem>
<listitem>
<para>De <acronym>ACPI</acronym> 2.0 specificatie
<ulink url="http://acpi.info/spec.htm"></ulink></para>
</listitem>
<listitem>
<para>&os; Handleidingen: &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> debugging informatie</ulink>.
(Gebruikt Compaq als voorbeeld, maar van algemeen
nut).</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
</chapter>
|