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
|
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!--
De Vinum Volume Manager
Door Greg Lehey (grog at lemis dot com)
Toegevoegd aan het Handboek door Hiten Pandya <hmp@FreeBSD.org>
en Tom Rhodes <trhodes@FreeBSD.org>
The Dutch FreeBSD Documentation Project
$FreeBSD$
%SOURCE% en_US.ISO8859-1/books/handbook/vinum/chapter.sgml
%SRCID% 39544
-->
<chapter id="vinum-vinum">
<chapterinfo>
<authorgroup>
<author>
<firstname>Greg</firstname>
<surname>Lehey</surname>
<contrib>Geschreven door </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Erwin</firstname>
<surname>Kooi</surname>
<contrib>Vertaald door </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>De VINUM volumebeheerder</title>
<sect1 id="vinum-synopsis">
<title>Overzicht</title>
<para>Welke harde schijven er ook gebruikt worden, er zijn altijd
mogelijke problemen:</para>
<itemizedlist>
<listitem>
<para>Ze kunnen te klein zijn.</para>
</listitem>
<listitem>
<para>Ze kunnen te traag zijn.</para>
</listitem>
<listitem>
<para>Ze kunnen te onbetrouwbaar zijn.</para>
</listitem>
</itemizedlist>
<para>Er zijn verschillende oplossingen voor deze problemen
voorgesteld en geïmplementeerd. Eén manier waarop
gebruikers zich wapenen tegen een aantal van deze problemen is
door meerdere en soms ook redundante schijven te gebruiken. Naast
ondersteuning voor verschillende kaarten en controllers die
hardware-RAID ondersteunen, bevat het &os; basissysteem ook de
Vinum Volume Manager, een
<quote>blokapparaatstuurprogramma</quote> waarmee virtuele
schijven gemaakt kunnen worden. <emphasis>Vinum</emphasis> is een
zogenaamde <emphasis>Volume Manager</emphasis>, een stuurprogramma
voor virtuële schijven dat deze drie problemen in beschouwing
neemt. Vinum biedt meer flexibiliteit, prestaties en
betrouwbaarheid dan traditionele schijfopslag en er kan RAID-0,
RAID-1 en RAID-5 mee gemaakt worden of een combinatie van deze
RAID-niveaus.</para>
<para>In dit hoofdstuk wordt een overzicht gegeven van de mogelijke
problemen die traditionele schijfopslag met zich meebrengt en de
Vinum Volume Manager wordt geïntroduceerd.</para>
<note>
<para>Vanaf &os; 5, is Vinum herschreven om in de
GEOM-architectuur (<xref linkend="GEOM"/>) te passen, met behoud
van de originele ideëen, terminologie, en metagegevens die
op de schijf staan. Deze herschrijving wordt
<emphasis>gvinum</emphasis> (voor <emphasis>GEOM
vinum</emphasis>) genoemd. De volgende tekst refereert aan
<emphasis>Vinum</emphasis> als een abstracte naam, onafhankelijk
van de implementatievariant. Alle commando-aanroepen dienen nu
met het commando <command>gvinum</command> gedaan te worden, en
de naam van de kernelmodule is veranderd van
<filename>vinum.ko</filename> naar
<filename>geom_vinum.ko</filename>, en alle apparaatknooppunten
bevinden zich in <filename class="directory">/dev/gvinum</filename> in
plaats van <filename class="directory">/dev/vinum</filename>. Sinds
&os; 6 is de oude implementatie van Vinum niet meer beschikbaar in
de broncode.</para>
</note>
</sect1>
<sect1 id="vinum-intro">
<title>Schijfgrootte</title>
<indexterm><primary>Vinum</primary></indexterm>
<indexterm>
<primary>RAID</primary>
<secondary>software</secondary>
</indexterm>
<para>De capaciteit van schijven wordt groter, maar ook de vraag
naar capaciteit neemt toe. Vaak is het gewenste bestandssysteem
groter dan de op dat moment beschikbare schijven. Hoewel dit
probleem niet meer zo actueel als het tien jaar geleden was,
bestaat het nog steeds. In sommige systemen is dit opgelost door
een virtuele harde schijf te maken die de gegevens op meerdere
fysieke harde schijven kan opslaan.</para>
</sect1>
<sect1 id="vinum-access-bottlenecks">
<title>Snelheid van toegang</title>
<para>Moderne systemen hebben vaak simultaan toegang tot gegevens
nodig. FTP en webservers kunnen bijvoorbeeld duizenden simultane
sessies onderhouden en hebben vaak meerdere 100 Mbit/s
verbindingen met de rest van de wereld. De benodigde
gegevensdoorvoer is dan groter dan de meeste schijven kunnen
leveren.</para>
<para>Huidige schijven kunnen gegevens sequentieel overdragen met
ongeveer 70 MB/s, maar deze snelheid heeft geen waarde in een
omgeving waar onafhankelijke processen toegang tot de schijf
hebben. In zo'n situatie is het interessanter om vanuit het
standpunt van de schijfstuurprogramma te kijken: de belangrijkste
parameter is dan de belasting die een bepaalde gegevensoverdracht
op het stuurprogramma plaatst. Met andere woorden: wat is het
tijdsbeslag van een gegevensoverdracht op te schijf?</para>
<para>Bij elke gegevensoverdracht moet de schijf eerst zijn kop
positioneren, wachten tot de eerste sector onder de kop doorkomt
en vervolgens de overdracht starten. Deze acties duren bijzonder
kort. Het heeft geen enkele zin om ze te onderbreken.</para>
<para><anchor id="vinum-latency"/>Neem een overdracht van ongeveer
10 kB: de huidige generatie high-performance schijven kan de kop
in 3.5 ms plaatsen. De snelste schijven draaien met 15.000
toeren per minuut, dus de gemiddelde rotatie vertraging (een
halve omwenteling) bedraagt 2 ms. Met 70 MB/s de overdracht
zelf duurt ongeveer 150 μs, bijna niets vergeleken met de tijd
die verloren is gegaan aan het positioneren. In zulke gevallen
daalt de gegevensoverdracht naar iets meer dan 1 MB/s en is dus
duidelijk afhankelijk van de grootte van de over te dragen
gegevens.</para>
<para>De traditionele en logische oplossing voor dit probleem is
<quote>meer schijven</quote>: in plaats van één
grote schijf, meerdere kleine schijven met een zelfde totale
opslagcapaciteit. Iedere schijf is in staat om onafhankelijk de
kop te plaatsen en de gegevens over te dragen, dus de effectieve
doorvoer neemt toe met een factor bijna gelijk aan het aantal
schijven.</para>
<para>De exacte verbetering van de doorvoer is natuurlijk kleiner
dan het aantal schijven, want hoewel iedere schijf in staat is om
parallel de gegevens over te dragen, er is geen garantie dat de
gegevens gelijk over de schijven verdeeld is. De belasting op de
ene schijf zal dan ook groter zijn dan op de andere schijf.</para>
<indexterm>
<primary>aaneenschakelen</primary>
<secondary>schijven aaneenschakelen</secondary>
</indexterm>
<indexterm>
<primary>Vinum</primary>
<secondary>aaneenschakelen</secondary>
</indexterm>
<indexterm><primary>RAID</primary></indexterm>
<para>Een gelijke belasting van de schijven is in grote mate
afhankelijk van de manier waarop gegevens over de schijven zijn
verdeeld. In het volgende stuk is de opslag van een virtuele
schijf voor te stellen als een verzameling sectoren die met een
nummer aangesproken kan worden, net als bladzijden in een boek.
De meest voor de hand liggende methode om een virtuele schijf
te maken is het achter elkaar plakken van de fysieke schijven.
Een virtueel boek zou dan opgebouwd zijn uit verschillende achter
elkaar zittende fysieke hoofdstukken. Deze methode heet
<emphasis>aaneenschakelen</emphasis>
(<quote>concatenation</quote>) en heeft het voordeel dat schijven
verschillend van grootte kunnen zijn. Dit werkt prima als
toegang tot de gegevens gelijk verdeeld is over de hele
gegevensverzameling. Als die toegang beperkt is tot een klein
deel van de gegevensverzameling, is de snelheidsverbetering een
stuk kleiner. <xref linkend="vinum-concat"/> laat de manier zien
hoe aaneengeschakelde schijven hun gegevens opslaan.</para>
<para>
<figure id="vinum-concat">
<title>Aaneengeschakeld georganiseerd</title>
<graphic fileref="vinum/vinum-concat"/>
</figure></para>
<indexterm>
<primary>verdelen</primary>
<secondary>schijven stripen</secondary>
</indexterm>
<indexterm>
<primary>Vinum</primary>
<secondary>verdelen</secondary>
</indexterm>
<para>Een andere methode is het verdelen van de totale opslag van
de virtuele schijf in kleinere stukjes van gelijke grootte en ze
achter elkaar op verschillende fysieke schijven op te slaan.
Bijvoorbeeld: de eerste 256 sectoren worden op schijf 1
opgeslagen, de tweede 256 sectoren op schijf 2 enzovoort, tot de
laatste schijf is gebuikt, waarna weer bij schijf 1 verder wordt
gegaan, net zolang tot de schijven vol zijn. Deze methode heet
<emphasis>verdelen</emphasis> (<quote>striping</quote>) of
<acronym>RAID-0</acronym>.
<footnote>
<para><acronym>RAID</acronym> staat voor <emphasis>Redundant
Array of Inexpensive Disks</emphasis> (Redundante Reeks van
Goedkope Schijven) en biedt verschillende vormen van
fouttolerantie. Hoewel die laatste term wat misleidend is:
het biedt namelijk geen redundantie.</para></footnote>.
Bij RAID-0 kost het iets meer moeite om de gegevens te vinden en
het kan extra I/O belasting met zich meebrengen als gegevens zijn
verdeeld over verschillende fysieke schijven. Het kan echter ook
zorgen voor een constantere belasting van die schijven.
<xref linkend="vinum-striped"/> geeft weer hoe RAID-0 schijven hun
gegevens opslaan.</para>
<para>
<figure id="vinum-striped">
<title>Verdeeld georganiseerd</title>
<graphic fileref="vinum/vinum-striped"/>
</figure></para>
</sect1>
<sect1 id="vinum-data-integrity">
<title>Betrouwbaarheid van gegevens</title>
<para>Het laatste probleem met de huidige schijven is dat ze
onbetrouwbaar zijn. Hoewel de betrouwbaarheid de laatste jaren
enorm is toegenomen, blijven schijven het vitale onderdeel van
een server dat waarschijnlijk als eerste kapot gaat. Als dat
gebeurt kan het catastrofale gevolgen hebben: het vervangen van
de schijf en het terugplaatsen van de gegevens kan dagen
kosten.</para>
<indexterm>
<primary>spiegelen</primary>
<secondary>schijven spiegelen</secondary>
</indexterm>
<indexterm>
<primary>Vinum</primary>
<secondary>spiegelen</secondary>
</indexterm>
<indexterm><primary>RAID-1</primary></indexterm>
<para>De traditionele manier om dit te voorkomen is
<emphasis>spiegelen</emphasis> (<quote>mirroring</quote>): het
hebben van een kopie van de gegevens op een andere fysieke schijf.
Sinds de uitvinding van RAID niveaus staat dit bekend als
RAID-1. Een schrijfactie naar de virtuele schijf gebeurt op
beide fysieke schijven. Een leesactie hoeft slechts vanaf
één te gebeuren. Op deze manier kan de virtuele
schijf dus blijven werken als één van de twee
fysieke schijven kapot is.</para>
<para>RAID-1 heeft twee problemen:</para>
<orderedlist>
<listitem>
<para>Prijs. Er is twee keer zoveel schijfruimte nodig als bij
een niet-redundante schijf.</para>
</listitem>
<listitem>
<para>Prestatie. Een schrijfactie moet op twee schijven
gebeuren en kost dus twee keer zoveel bandbreedte. Een
leesactie hoeft maar op één schijf te gebeuren
en heeft hier dus geen last van.</para>
</listitem>
</orderedlist>
<indexterm>
<primary>RAID-5</primary>
</indexterm>
<para>Een andere manier is <emphasis>pariteit</emphasis>,
uitgevoerd in <acronym>RAID</acronym> niveaus 2, 3, 4 en 5.
Van deze vier is <acronym>RAID-5</acronym> het meest interessant.
In Vinum is het geïmplementeerd als een variant van een
verdeelde organisatie waarbij één blok van elk deel
is gereserveerd voor de pariteit van één van de andere
blokken. Voor Vinum is een <acronym>RAID-5</acronym> samenstelling
(<quote>plex</quote>) dan ook gelijk aan een verdeelde
samenstelling, met als verschil dat het een pariteitblok bevat in
ieder deel. Zoals voorgeschreven door <acronym>RAID-5</acronym>
wisselt de locatie van dit pariteitblok van het ene deel naar het
andere. De nummers in de gegevensblokken geven de relatieve
bloknummers aan.</para>
<para>
<figure id="vinum-raid5-org">
<title>RAID-5 georganiseerd</title>
<graphic fileref="vinum/vinum-raid5-org"/>
</figure></para>
<para>Vergeleken met spiegelen heeft <acronym>RAID-5</acronym> het
voordeel dat er beduidend minder opslagcapaciteit nodig is.
Lezen gebeurt op dezelfde manier als bij een verdeelde
organisatie, maar schrijven kost beduidend meer tijd, ongeveer
25% van de leesprestaties meer. Als één schijf
uitvalt, kan de reeks doorwerken in een <emphasis>verslechterde
staat</emphasis> (<quote>degraded mode</quote>): gegevens van
een functionerende schijf kunnen zonder problemen gelezen worden,
maar gegevens van de defecte schijf moeten eerst worden
samengesteld uit de pariteit van de overeenkomende blokken van de
resterende schijven.</para>
</sect1>
<sect1 id="vinum-objects">
<title>Vinum objecten</title>
<para>Om deze problemen op te lossen, hanteert vinum een
hiërarchie met vier niveaus van objecten:</para>
<itemizedlist>
<listitem>
<para>Het meest zichtbare object is de virtuele schijf. Dit
object wordt <emphasis>volume</emphasis> genoemd. Op een
paar kleine details na, hebben volumes dezelfde
eigenschappen als een &unix; schijf. Het belangrijkste
verschil is dat er geen beperking aan de grootte van de
schijf is.</para>
</listitem>
<listitem>
<para>Volumes zijn opgebouwd uit
<emphasis>samenstellingen</emphasis>, die elk de totale
opslagcapaciteit van het volume hebben. Dit niveau in de
hiërarchie biedt daarom redundantie. Een samenstelling
is goed voor te stellen als een individuele schijf in een
<acronym>RAID-1</acronym> systeem. Iedere schijf bevat
dezelfde gegevens.</para>
</listitem>
<listitem>
<para>Omdat Vinum bestaat binnen het &unix; opslagsysteem, moet
het mogelijk zijn om &unix; partities te gebruiken als
bouwstenen voor samenstellingen die uit meerdere schijven
bestaan. Maar het blijkt dat dit te inflexibel is: &unix;
schijven hebben een beperkt aantal partities. In plaats
daarvan verdeelt Vinum een &unix; partitie (de schijf) in
aaneengesloten stukken die <emphasis>subschijven</emphasis>
worden genoemd. Deze subschijven worden vervolgens als
bouwstenen voor de samenstelling gebruikt.</para>
</listitem>
<listitem>
<para>Subschijven bestaan op Vinum
<emphasis>schijven</emphasis>, op dit moment &unix;
partities. Een Vinum schijf kan een oneindig aantal
subschijven bevatten. Met uitzondering van een klein stukje
aan het begin van de schijf, dat wordt gebruikt om informatie
over de instellingen en de toestand op te slaan, is de gehele
schijf beschikbaar voor de opslag van gegevens.</para>
</listitem>
</itemizedlist>
<para>In de volgende paragrafen wordt beschreven hoe deze objecten
de functionaliteit van Vinum leveren.</para>
<sect2>
<title>Volumegrootte overwegingen</title>
<para>Een samenstelling kan meerdere subschijven bevatten die
uitgespreid zijn over alle schijven in de Vinum instelling.
Dat houdt in dat de grootte van een individuele schijf geen
limiet is voor de samenstelling en dus niet voor het
volume.</para>
</sect2>
<sect2>
<title>Redundante gegevensopslag</title>
<para>Vinum implementeert <acronym>RAID-0</acronym> door meerdere
samenstellingen aan een volume te koppelen. Elke samenstelling
representeert hierbij de gegevens in het volume. Een volume kan
tussen de één en acht samenstellingen
bevatten.</para>
<para>Hoewel een samenstelling de totale gegevens van een volume
voorstelt, is het mogelijk dat delen van deze voorstelling
missen, door ontwerp (door geen subschijf voor delen van de
samenstelling te definiëren) of per ongeluk (door een
defecte schijf). Zo lang tenminste één
samenstelling de gegevens voor het gehele volume kan leveren, is
het volume volledig bruikbaar.</para>
</sect2>
<sect2>
<title>Prestaties</title>
<para>Vinum implementeert aaneenschakelen en spiegelen op het
niveau van de samenstelling:</para>
<itemizedlist>
<listitem>
<para>Een aaneengeschakelde samenstelling gebruikt de
adresruimte van elke subschijf achter elkaar.</para>
</listitem>
<listitem>
<para>Een verdeelde samenstelling spreiden de gegevens over
iedere subschijf. De subschijven moeten daarvoor allemaal
dezelfde grootte hebben en er moeten tenminste twee
subschijven zijn om onderscheid te kunnen maken met een
aaneengeschakelde samenstelling.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2>
<title>Welke samenstelling?</title>
<para>De versie van Vinum die met &os; &rel.current; wordt
meegeleverd, kent twee soorten samenstellingen:</para>
<itemizedlist>
<listitem>
<para>Aaneengeschakelde samenstellingen zijn het meest
flexibel: ze kunnen een oneindig aantal subschijven
bevatten die verschillend van lengte mogen zijn. De
samenstelling kan uitgebreid worden door subschijven toe te
voegen. Ze kosten minder <acronym>CPU</acronym> tijd dan
verdeelde samenstellingen, hoewel het verschil van de
<acronym>CPU</acronym> belasting niet meetbaar is. Aan de
andere kant, ze zijn het meest kwetsbaar voor
<quote>hot-spots</quote>, waar één schijf
heel intensief gebruikt wordt en anderen ongebruikt
blijven.</para>
</listitem>
<listitem>
<para>Het grootste voordeel van verdeelde samenstellingen
(<acronym>RAID-0</acronym>) is dat ze geen
<quote>hot-spots</quote> hebben. Door het kiezen van een
optimale deelgrootte (veelal 256 kB) kan de belasting op de
fysieke schijven gelijk getrokken worden. De nadelen van
deze aanpak zijn (minuscuul) complexere code en beperkingen
aan de subschijven: ze moeten allemaal van gelijke grootte
zijn en het uitbreiden van een samenstelling met extra
subschijven is zo gecompliceerd, dat de huidige versie van
Vinum dit niet ondersteunt. Vinum voegt een extra,
triviale, beperking toe: een verdeelde samenstelling moet
tenminste twee subschijven hebben, omdat die anders niet
onderscheiden kan worden van een aaneengeschakelde
samenstelling.</para>
</listitem>
</itemizedlist>
<para>In <xref linkend="vinum-comparison"/> worden de voor- en
nadelen van elke samenstelling samengevat.</para>
<table id="vinum-comparison" frame="none">
<title>Vinum samenstellingen</title>
<tgroup cols="5">
<thead>
<row>
<entry>Samenstellingtype</entry>
<entry>Minimaal aantal subschijven</entry>
<entry>Subschijven toevoegen</entry>
<entry>Gelijke grootte</entry>
<entry>Toepassing</entry>
</row>
</thead>
<tbody>
<row>
<entry>aaneengeschakeld</entry>
<entry>1</entry>
<entry>ja</entry>
<entry>nee</entry>
<entry>Veel gegevensopslag met maximale flexibiliteit en
gemiddelde performance.</entry>
</row>
<row>
<entry>verdeeld</entry>
<entry>2</entry>
<entry>nee</entry>
<entry>ja</entry>
<entry>Hoge prestaties, ook bij veel gelijktijdige
toegang.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
<sect1 id="vinum-examples">
<title>Voorbeelden</title>
<para>Vinum houdt een <emphasis>instellingendatabase</emphasis>
bij waarin beschreven staat welke objecten bekend zijn in het
systeem. Bij het instellen vult de gebruiker deze database uit
één of meer instellingenbestanden met behulp van
het hulpprogramma &man.gvinum.8;. Vinum bewaart een kopie van de
database op iedere slice (die Vinum <emphasis>apparaat</emphasis>
noemt) die door Vinum wordt beheerd. Deze database wordt na
iedere statuswijziging bijgewerkt, zodat een na een herstart
accuraat de toestand van ieder Vinum object wordt weergegeven.</para>
<sect2>
<title>Het instellingenbestand</title>
<para>Het instellingenbestand beschrijft de individuele vinum
objecten. De definitie van een eenvoudig volume kan er zo
uitzien:</para>
<programlisting>drive a device /dev/da3h
volume myvol
plex org concat
sd length 512m drive a</programlisting>
<para>Dit bestand beschrijft vier Vinum objecten:</para>
<itemizedlist>
<listitem>
<para>De <emphasis>drive</emphasis> regel beschrijft een
partitie (<emphasis>drive</emphasis>) en de relatieve
positie ten opzichte van de onderliggende hardware. Het
heeft de symbolische naam <emphasis>a</emphasis>. Deze
scheiding van de symbolische naam van de schijf maakt het
mogelijk om schijven te verplaatsen van de ene locatie naar
de andere, zonder verwarring te veroorzaken.</para>
</listitem>
<listitem>
<para>De <emphasis>volume</emphasis> regel beschrijft een
volume. Het enige benodigde attribuut is de naam:
<emphasis>myvol</emphasis>.</para>
</listitem>
<listitem>
<para>De <emphasis>plex</emphasis> regel beschrijft een
samenstelling. Het enige benodigde attribuut is de
organisatie, in dit geval <emphasis>concat</emphasis>. Er
is geen naam nodig: het systeem genereert automatisch een
naam door <emphasis>.p</emphasis><emphasis>x</emphasis> aan
de volumenaam toe te voegen, waarbij <emphasis>x</emphasis>
het nummer van de samenstelling in het volume is. De naam
van deze samenstelling wordt dus
<emphasis>myvol.p0</emphasis>.</para>
</listitem>
<listitem>
<para>De <emphasis>sd</emphasis> regel beschrijft een
subschijf. De minimale specificaties zijn de naam van een
schijf waar de subschijf kan worden opgeslagen en de lengte
van de subschijf. Net als bij een samenstelling is er geen
naam nodig: het systeem genereert automatisch een naam door
<emphasis>.s</emphasis><emphasis>x</emphasis> aan de
samenstellingnaam toe te voegen, waarbij
<emphasis>x</emphasis> het nummer van de subschijf is. De
naam van deze subschijf is dus
<emphasis>myvol.p0.s0</emphasis>.</para>
</listitem>
</itemizedlist>
<para>Na het verwerken van dit bestand ziet de uitvoer van
&man.gvinum.8; er als volgt uit:</para>
<programlisting width="97">
&prompt.root; gvinum -> <userinput>create config1</userinput>
Configuration summary
Drives: 1 (4 configured)
Volumes: 1 (4 configured)
Plexes: 1 (8 configured)
Subdisks: 1 (16 configured)
D a State: up Device /dev/da3h Avail: 2061/2573 MB (80%)
V myvol State: up Plexes: 1 Size: 512 MB
P myvol.p0 C State: up Subdisks: 1 Size: 512 MB
S myvol.p0.s0 State: up PO: 0 B Size: 512 MB</programlisting>
<para>Deze uitvoer geeft de korte uitvoer van &man.gvinum.8; weer.
Het is grafisch weergegeven in
<xref linkend="vinum-simple-vol"/>.</para>
<para>
<figure id="vinum-simple-vol">
<title>Een eenvoudig Vinum volume</title>
<graphic fileref="vinum/vinum-simple-vol"/>
</figure></para>
<para>Deze en de volgende figuren stellen een volume voor dat
samenstellingen bevat die weer de subschijven bevatten. In dit
triviale voorbeeld bevat het volume een samenstelling en deze
samenstelling bevat een subschijf.</para>
<para>Dit speciale volume heeft geen voordeel boven een gewone
schijf partitie. Het bevat één samenstelling, dus
het is niet redundant. De samenstelling bevat
één subschijf, dus er is geen verschil in de
plaats van de gegevens met een conventionele schijfpartitie. In
de volgende paragrafen worden meer interessante instellingen
getoond.</para>
</sect2>
<sect2>
<title>Verbeterde betrouwbaarheid: spiegelen</title>
<para>De betrouwbaarheid van een volume wordt vergroot door
spiegelen. Bij het opzetten van een gespiegeld volume is het
van belang dat subschijven van iedere samenstelling op een
andere schijf staan, zodat een defecte schijf niet beide
samenstellingen beïnvloedt. De volgende instelling maakt
een gespiegeld volume:</para>
<programlisting>drive b device /dev/da4h
volume mirror
plex org concat
sd length 512m drive a
plex org concat
sd length 512m drive b</programlisting>
<para>In dit voorbeeld was het niet nodig om schijf
<emphasis>a</emphasis> opnieuw te definiëren, omdat Vinum
alle objecten bijhoudt in de instellingendatabase. Na het
verwerken van deze definitie, ziet de instelling er als volgt
uit:</para>
<programlisting width="97">
Drives: 2 (4 configured)
Volumes: 2 (4 configured)
Plexes: 3 (8 configured)
Subdisks: 3 (16 configured)
D a State: up Device /dev/da3h Avail: 1549/2573 MB (60%)
D b State: up Device /dev/da4h Avail: 2061/2573 MB (80%)
V myvol State: up Plexes: 1 Size: 512 MB
V mirror State: up Plexes: 2 Size: 512 MB
P myvol.p0 C State: up Subdisks: 1 Size: 512 MB
P mirror.p0 C State: up Subdisks: 1 Size: 512 MB
P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB
S myvol.p0.s0 State: up PO: 0 B Size: 512 MB
S mirror.p0.s0 State: up PO: 0 B Size: 512 MB
S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB</programlisting>
<para>Het is grafisch weergegeven in
<xref linkend="vinum-mirrored-vol"/>.</para>
<para>
<figure id="vinum-mirrored-vol">
<title>Een gespiegeld Vinum volume</title>
<graphic fileref="vinum/vinum-mirrored-vol"/>
</figure></para>
<para>In dit voorbeeld bevat iedere samenstelling de volledige 512
MB van de opslagcapaciteit. Net als in het vorige voorbeeld
bevat iedere samenstelling slechts één
subschijf.</para>
</sect2>
<sect2>
<title>Verbeterde prestatie</title>
<para>Het gespiegelde volume in het vorige voorbeeld is beter
bestand tegen hardware fouten dan een niet-gespiegeld volume,
maar de prestaties zijn lager: iedere schrijfactie naar het
volume moet op beide schijven worden uitgevoerd, waardoor een
groter deel van de bandbreedte van de schijf nodig is. Als
prestaties een belangrijke rol spelen, moet er een andere
benadering gekozen worden: in plaats van spiegelen worden de
gegevens verdeeld over zoveel mogelijk schijven. De volgende
instelling laat een volume zien waarbij een samenstelling
over vier schijven verdeeld is:</para>
<programlisting>drive c device /dev/da5h
drive d device /dev/da6h
volume stripe
plex org striped 512k
sd length 128m drive a
sd length 128m drive b
sd length 128m drive c
sd length 128m drive d</programlisting>
<para>Zoals eerder al te zien was, is het niet nodig om schijven
die al bekend zijn bij Vinum opnieuw te definiëren. Na
het verwerken van deze definitie, ziet de instelling er zo
uit:</para>
<programlisting width="92">
Drives: 4 (4 configured)
Volumes: 3 (4 configured)
Plexes: 4 (8 configured)
Subdisks: 7 (16 configured)
D a State: up Device /dev/da3h Avail: 1421/2573 MB (55%)
D b State: up Device /dev/da4h Avail: 1933/2573 MB (75%)
D c State: up Device /dev/da5h Avail: 2445/2573 MB (95%)
D d State: up Device /dev/da6h Avail: 2445/2573 MB (95%)
V myvol State: up Plexes: 1 Size: 512 MB
V mirror State: up Plexes: 2 Size: 512 MB
V striped State: up Plexes: 1 Size: 512 MB
P myvol.p0 C State: up Subdisks: 1 Size: 512 MB
P mirror.p0 C State: up Subdisks: 1 Size: 512 MB
P mirror.p1 C State: initializing Subdisks: 1 Size: 512 MB
P striped.p1 State: up Subdisks: 1 Size: 512 MB
S myvol.p0.s0 State: up PO: 0 B Size: 512 MB
S mirror.p0.s0 State: up PO: 0 B Size: 512 MB
S mirror.p1.s0 State: empty PO: 0 B Size: 512 MB
S striped.p0.s0 State: up PO: 0 B Size: 128 MB
S striped.p0.s1 State: up PO: 512 kB Size: 128 MB
S striped.p0.s2 State: up PO: 1024 kB Size: 128 MB
S striped.p0.s3 State: up PO: 1536 kB Size: 128 MB</programlisting>
<para>
<figure id="vinum-striped-vol">
<title>Een verdeeld Vinum volume</title>
<graphic fileref="vinum/vinum-striped-vol"/>
</figure></para>
<para>Dit volume wordt weergegeven in
<xref linkend="vinum-striped-vol"/>. De grijstinten geven de
positie binnen de samenstelling aan: de lichtste strepen komen
het eerst, de donkerste het laatst.</para>
</sect2>
<sect2>
<title>Betrouwbaarheid en prestaties</title>
<para><anchor id="vinum-resilience"/>Met voldoende hardware is het
mogelijk om een volume te bouwen met zowel verbeterde
betrouwbaarheid als verbeterde prestaties ten opzichte van een
standaard &unix; partitie. De volgende instelling is een
voorbeeld van zo'n volume:</para>
<programlisting>volume raid10
plex org striped 512k
sd length 102480k drive a
sd length 102480k drive b
sd length 102480k drive c
sd length 102480k drive d
sd length 102480k drive e
plex org striped 512k
sd length 102480k drive c
sd length 102480k drive d
sd length 102480k drive e
sd length 102480k drive a
sd length 102480k drive b</programlisting>
<para>De subschijven van de tweede samenstelling zijn twee
schijven verschoven ten opzichte van die van de eerste
samenstelling. Dit zorgt ervoor dat een schrijfactie niet naar
dezelfde schijven gaat, zelfs niet als die schrijfactie over
twee schijven plaatsvindt.</para>
<para><xref linkend="vinum-mirrored-vol"/> laat deze instelling
zien in grafische vorm.</para>
<para>
<figure id="vinum-raid10-vol">
<title>Een gespiegeld en verdeeld Vinum volume</title>
<graphic fileref="vinum/vinum-raid10-vol"/>
</figure></para>
</sect2>
</sect1>
<sect1 id="vinum-object-naming">
<title>Objectnamen</title>
<para>Zoals eerder in dit hoofdstuk beschreven staat, kent Vinum
standaardnamen toe aan samenstellingen en subschijven. Er mag
echter een andere naam aan gegeven worden. Een andere naamgeving
wordt niet aangeraden: ervaring met de VERITAS volumebeheerder,
die een willekeurige object benaming toestaat, heeft laten zien
dat deze flexibiliteit geen beduidend voordeel heeft, terwijl het
de kans op verwarring vergroot.</para>
<para>Namen mogen bestaan uit alle karakters, behalve de spatie,
maar het wordt aanbevolen om alleen letters, cijfers en het
liggende streepje te gebruiken. De namen van de volumes,
samenstellingen en subschijven kunnen 64 tekens lang zijn en de
namen van schijven kunnen 32 tekens lang zijn.</para>
<para>Vinum objecten worden apparaatknooppunten toegekend in de
hiërarchie <filename class="directory">/dev/gvinum</filename>. Met
de instellingen uit de vorige paragraaf creërt Vinum de volgende
apparaatknooppunten:</para>
<itemizedlist>
<listitem>
<para>Karakterapparaatingangen voor elk volume. Dit zijn de
primaire apparaten die door Vinum gebruikt worden. De
bovenstaande configuratie zou dus deze apparaten bevatten:
<filename class="devicefile">/dev/gvinum/myvol</filename>,
<filename class="devicefile">/dev/gvinum/mirror</filename>,
<filename class="devicefile">/dev/gvinum/striped</filename>,
<filename class="devicefile">/dev/gvinum/raid5</filename> en
<filename class="devicefile">/dev/gvinum/raid10</filename>.</para>
</listitem>
<listitem>
<para>Alle volumes krijgen ingangen direct onder
<filename class="directory">/dev/gvinum/</filename>.</para>
</listitem>
<listitem>
<para>De mappen
<filename class="directory">/dev/gvinum/plex</filename>, en
<filename class="directory">/dev/gvinum/sd</filename>, welke
respectievelijk apparaatknooppunten voor elke plex en voor elke
subschijf bevatten.</para>
</listitem>
</itemizedlist>
<para>Dit is een volgend voorbeeld:</para>
<programlisting>drive drive1 device /dev/sd1h
drive drive2 device /dev/sd2h
drive drive3 device /dev/sd3h
drive drive4 device /dev/sd4h
volume s64 setupstate
plex org striped 64k
sd length 100m drive drive1
sd length 100m drive drive2
sd length 100m drive drive3
sd length 100m drive drive4</programlisting>
<para>Na verwerking van dit bestand maakt &man.gvinum.8; de volgende
structuur aan in <filename
class="directory">/dev/gvinum</filename>:</para>
<programlisting>drwxr-xr-x 2 root wheel 512 Apr 13 16:46 plex
crwxr-xr-- 1 root wheel 91, 2 Apr 13 16:46 s64
drwxr-xr-x 2 root wheel 512 Apr 13 16:46 sd
/dev/vinum/plex:
total 0
crwxr-xr-- 1 root wheel 25, 0x10000002 Apr 13 16:46 s64.p0
/dev/vinum/sd:
total 0
crwxr-xr-- 1 root wheel 91, 0x20000002 Apr 13 16:46 s64.p0.s0
crwxr-xr-- 1 root wheel 91, 0x20100002 Apr 13 16:46 s64.p0.s1
crwxr-xr-- 1 root wheel 91, 0x20200002 Apr 13 16:46 s64.p0.s2
crwxr-xr-- 1 root wheel 91, 0x20300002 Apr 13 16:46 s64.p0.s3</programlisting>
<para>Hoewel het wordt aangeraden om samenstellingen en subschijven
geen naam mee te geven, moeten Vinum schijven een naam hebben.
Hierdoor kan een schijf naar een andere locatie verplaatst worden
terwijl hij nog steeds automatisch herkend wordt. Schijfnamen
mogen maximaal 32 tekens lang zijn.</para>
<sect2>
<title>Bestandssystemen maken</title>
<para>Volumes lijken voor het systeem identiek aan schijven, met
één uitzondering: in tegenstelling tot &unix;
schijven partitioneert Vinum het volume niet en het bevat dus
geen partitietabel. Daarom was het nodig een paar
schijfhulpprogramma's te veranderen, met name &man.newfs.8;, dat
voorheen probeerde om de laatste letter van een Vinum
volumenaam als een partitie te zien. Bijvoorbeeld: een schijf
kan een naam hebben als <filename
class="devicefile">/dev/ad0a</filename> of <filename
class="devicefile">/dev/da2h</filename>. Deze namen stellen
respectievelijk de eerste partitie (<devicename>a</devicename>)
op de eerste (0) IDE schijf (<devicename>ad</devicename>) en de
achtste partitie (<devicename>h</devicename>) op de derde (2)
SCSI schijf (<devicename>da</devicename>) voor. Een Vinum
volume kan daarentegen <filename
class="devicefile">/dev/gvinum/concat</filename>
heten, een naam die geen enkele relatie met een partitienaam
heeft.</para>
<para>Gebruik &man.newfs.8; om een bestandssysteem op dit volume
aan te maken:</para>
<screen>&prompt.root; <userinput>newfs /dev/gvinum/concat</userinput></screen>
</sect2>
</sect1>
<sect1 id="vinum-config">
<title>Vinum instellen</title>
<para>De <filename>GENERIC</filename> kernel bevat geen Vinum. Het
is mogelijk een kernel te bouwen waar Vinum in zit, maar dit
wordt niet aangeraden. De standaard manier om Vinum te starten
is als kernelmodule (<acronym>kld</acronym>). Het is zelfs niet
nodig om &man.kldload.8; te gebruiken voor Vinum. Als
&man.gvinum.8; wordt gestart en de module is niet geladen, dan
gebeurt dit alsnog automatisch.</para>
<sect2>
<title>Opstarten</title>
<para>Vinum slaat de instellingeninformatie op de schijfslices op
in ongeveer dezelfde vorm als de instellingenbestanden. Bij
het lezen van de instellingendatabase herkent Vinum een aantal
sleutelwoorden die niet zijn toegestaan in
instellingenbestanden. Een schijfinstelling kan bijvoorbeeld
de volgende tekst bevatten:</para>
<programlisting width="119">volume myvol state up
volume bigraid state down
plex name myvol.p0 state up org concat vol myvol
plex name myvol.p1 state up org concat vol myvol
plex name myvol.p2 state init org striped 512b vol myvol
plex name bigraid.p0 state initializing org raid5 512b vol bigraid
sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b
sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b
sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b
sd name myvol.p1.s1 drive d plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 1048576b
sd name myvol.p2.s0 drive a plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 0b
sd name myvol.p2.s1 drive b plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 524288b
sd name myvol.p2.s2 drive c plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1048576b
sd name myvol.p2.s3 drive d plex myvol.p2 state init len 524288b driveoffset 1048841b plexoffset 1572864b
sd name bigraid.p0.s0 drive a plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 0b
sd name bigraid.p0.s1 drive b plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 4194304b
sd name bigraid.p0.s2 drive c plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 8388608b
sd name bigraid.p0.s3 drive d plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 12582912b
sd name bigraid.p0.s4 drive e plex bigraid.p0 state initializing len 4194304b driveoff set 1573129b plexoffset 16777216b</programlisting>
<para>Duidelijke verschillen zijn de aanwezigheid van expliciete
locatie informatie en namen (beide zijn toegestaan, maar worden
afgeraden) en informatie over de toestand (die niet beschikbaar
is voor de gebruiker). Vinum slaat geen informatie over
schijven op in de instellingen: het vindt de schijven door de
ingestelde schijven te scannen naar partities met een
vinum label. Hierdoor kan Vinum zelfs schijven detecteren als
ze aan een andere &unix; schijf worden toegekend.</para>
<sect3 id="vinum-rc-startup">
<title>Automatisch opstarten</title>
<para><emphasis>Gvinum</emphasis> start altijd automatisch op
wanneer de kernelmodule eenmaal is geladen, via
&man.loader.conf.5;. Voeg
<literal>geom_vinum_load="YES"</literal> toe aan
<filename>/boot/loader.conf</filename> om de module
<emphasis>GVinum</emphasis> tijdens het opstarten te
laden.</para>
<para>Als Vinum met <command>gvinum start</command> wordt
gestart, leest Vinum de instellingendatabase van
één van de Vinum schijven. Normaal gesproken
bevat iedere schijf een identieke kopie van de
instellingendatabase. Het maakt dus niet uit welke schijf
gelezen wordt. Na een crash moet Vinum echter bepalen welke
schijf het laatst is bijgewerkt en de instellingen van die
schijf gebruiken. Als het nodig is worden de instellingen
van de oudere schijven daarna bijgewerkt, in volgorde van
leeftijd.</para>
</sect3>
</sect2>
</sect1>
<sect1 id="vinum-root">
<title>Het rootbestandssysteem op Vinum</title>
<para>Bij een machine die een volledig gespiegeld bestandssysteem
heeft, is het wenselijk ook het rootbestandssysteem te spiegelen.
Het bouwen van zo'n instelling is niet zo rechttoe-rechtaan als
bij een ander bestandssysteem omdat:</para>
<itemizedlist>
<listitem>
<para>Het rootbestandssysteem al heel snel beschikbaar moet zijn
tijdens het opstartproces, dus de Vinum infrastructuur moet
dan al beschikbaar zijn.</para>
</listitem>
<listitem>
<para>Het volume met het rootbestandssysteem bevat ook de
bootstrap en de kernel, die gelezen moeten worden door de
eigen systeemprogramma's (bijvoorbeeld de BIOS op PC's), die
meestal ingesteld kunnen worden om Vinum te gebruiken.</para>
</listitem>
</itemizedlist>
<para>In de volgende paragrafen wordt de term
<quote>rootvolume</quote> gebruikt voor het Vinum volume dat het
rootbestandssysteem bevat. Het is waarschijnlijk een goed idee om
de naam <literal>root</literal> te gebruiken voor dit volume, maar
dit is niet technisch noodzakelijk. Alle commandovoorbeelden in
de volgende stukken gaan echter uit van deze naam.</para>
<sect2>
<title>Vinum op tijd starten voor het rootbestandssysteem</title>
<para>Om dit te bereiken, moeten een aantal stappen worden
doorlopen:</para>
<itemizedlist>
<listitem>
<para>Vinum moet beschikbaar zijn voor de kernel tijdens
het opstarten. De methode zoals beschreven in
<xref linkend="vinum-rc-startup"/> is dus niet geschikt en
de <literal>start_vinum</literal> parameter mag zelfs
<emphasis>niet</emphasis> aanwezig zijn als de volgende
opzet wordt gebruikt. De eerste optie is Vinum statisch
in de kernel te compileren, zodat het altijd beschikbaar
is. Maar die is vaak niet wenselijk. Er is nog een
mogelijkheid door <filename>/boot/loader</filename>
(<xref linkend="boot-loader"/>) de Vinum kernel module te
laten laden, voordat de kernel gestart wordt. Dit wordt
gedaan door de volgende regel in
<filename>/boot/loader.conf</filename> op te nemen:</para>
<programlisting>gvinum_load="YES"</programlisting>
</listitem>
<listitem>
<para>Voor <emphasis>Gvinum</emphasis> wordt alles
automatisch opgestart nadat de kernelmodule eenmaal is
geladen, dus is alleen de procedure die hierboven is
beschreven nodig.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2>
<title>Een Vinum rootvolume beschikbaar maken voor
bootstrap</title>
<para>Omdat de huidige &os; bootstrap maar 7,5 KB code bevat en
al belast is met het lezen van bestanden (zoals
<filename>/boot/loader</filename>) van het UFS bestandssysteem,
is het bijna onmogelijk om het ook te leren hoe Vinum
informatie gelezen moet worden en deze dan te gebruiken om de
elementen van het bootvolume samen te stellen. Er zijn daarom
een paar trucs nodig om de bootstrapcode wijs te maken dat er
een standaard <literal>"a"</literal> partitie aanwezig is met
het rootbestandssysteem.</para>
<para>Om dit mogelijk te maken, moet het rootvolume aan de
volgende eisen voldoen:</para>
<itemizedlist>
<listitem>
<para>Het rootvolume mag niet verdeeld of RAID-5 zijn.</para>
</listitem>
<listitem>
<para>Het rootvolume mag niet meer dan één
aaneengeschakelde subschijf per samenstelling
bevatten.</para>
</listitem>
</itemizedlist>
<para>Het is mogelijk en wenselijk om meer dan één
samenstelling te hebben, ieder met een replica van het
rootbestandssysteem. Het bootstrapproces gebruikt wel maar
één van deze replica's om de bootstrap en alle
andere bestanden te vinden, tot het moment dat de kernel het
rootbestandssysteem laadt. Iedere subschijf binnen deze
samenstellingen heeft dus zijn eigen <literal>"a"</literal>
partitievoorstelling nodig om dit apparaat opstartbaar te maken.
Het is niet verplicht dat iedere voorgestelde
<literal>"a"</literal> partitie op dezelfde offset is geplaatst
binnen het apparaat, vergeleken met andere apparaten die
samenstellingen van het rootvolume bevatten. Het is wel een
goed idee om op die manier Vinum volumes te maken, zodat de
resulterende gespiegelde apparaten symmetrisch zijn. Dit om
verwarring te voorkomen.</para>
<para>Om deze <literal>"a"</literal> partities voor ieder
apparaat dat een deel van het rootvolume bevat te maken, moet
het volgende worden gedaan:</para>
<procedure>
<step>
<para>De locatie (offset vanaf het begin van het apparaat) en
de grootte van de subschijf die onderdeel is van het
rootvolume moet als volgt bekeken worden:</para>
<screen>&prompt.root; <userinput>gvinum l -rv root</userinput></screen>
<note><para>De Vinum offsets en groottes worden aangegeven in
bytes. Ze moeten door 512 worden gedeeld om de bloknummers
te krijgen die in <command>bsdlabel</command> moeten
worden gebruikt.</para></note>
</step>
<step>
<para>Voor elk apparaat dat deelneemt aan het
rootbestandssysteem moet het onderstaande command
uitgevoerd worden:</para>
<screen>&prompt.root; <userinput>bsdlabel -e <replaceable>apparaatnaam</replaceable></userinput></screen>
<para><replaceable>apparaatnaam</replaceable> moet of de naam
van een schijf (zoals <devicename>da0</devicename>) voor
schijven zonder slice-tabel zijn (ook wel: fdisk), of de
naam van de slice zijn (zoals
<devicename>ad0s1</devicename>).</para>
<para>Als er al een <literal>"a"</literal> partitie op het
apparaat aanwezig is (waarschijnlijk met een pre-Vinum
rootbestandssysteem), moet die eerst worden hernoemd,
zodat het wel toegankelijk blijft (voor de zekerheid), maar
niet langer gebruikt wordt om het systeem van op te
starten. Actieve partities (zoals een rootbestandssysteem
dat op dit moment aangekoppeld is) kan geen andere naam
gegeven worden. Dit moet dus gebeuren als het systeem vanaf
een <quote>Fixit</quote> medium opgestart is of in twee
stappen, waar (in een gespiegelde situatie) de schijf waar
niet van opgestart is als eerste wordt aangepast.</para>
<para>Daarna moet de offset van de Vinum partitie op dit
apparaat (als het bestaat) opgeteld worden bij de offset
van de rootvolume subschijf op dit apparaat. De
resulterende waarde wordt de <literal>"offset"</literal>
waarde voor de nieuwe <literal>"a"</literal> partitie. De
<literal>"size"</literal> waarde voor deze partitie kan
worden gehaald uit bovenstaande berekening. De
<literal>"fstype"</literal> wordt
<literal>4.2BSD</literal>. De <literal>"fsize"</literal>,
<literal>"bsize"</literal> en <literal>"cpg"</literal>
waardes moeten zo goed mogelijk worden gekozen om een
daadwerkelijk bestandssysteem na te bootsen, hoewel ze
vrij onbelangrijk zijn in deze context.</para>
<para>Op deze manier wordt een nieuwe <literal>"a"</literal>
partitie gemaakt dat de Vinum partitie op dit apparaat
overlapt. Het <command>bsdlabel</command> staat deze
overlap alleen toe als de Vinum partitie gemarkeerd is met
het bestandssysteemtype <literal>"vinum"</literal>.</para>
</step>
<step>
<para>Dat is het! Er bestaat nu een nep
<literal>"a"</literal> partitie op ieder apparaat dat een
replica van het rootvolume heeft. Het is aan te bevelen
om de resultaten nogmaals te verifiëren met iets
als:</para>
<screen>&prompt.root; <userinput>fsck -n /dev/<replaceable>devnaam</replaceable>a</userinput></screen>
</step>
</procedure>
<note>
<para>Alle bestanden die controle informatie bevatten
moeten relatief zijn ten opzichte van het
rootbestandssysteem in het Vinum volume dat, bij het
creëren van een Vinum volume, niet overeen hoeft te komen
met het rootbestandssysteem dat op dit moment in gebruik is.
Dit geldt in het bijzonder voor
<filename>/etc/fstab</filename> en
<filename>/boot/loader.conf</filename>.</para>
</note>
<para>Bij de volgende herstart zou de bootstrap de juiste
controle informatie moeten vinden in het nieuwe, op Vinum
gebaseerde, rootbestandssysteem en moeten starten. Aan het
einde van het kernel initialisatie proces, nadat alle apparaten
aangemeld zijn, geeft het volgende bericht aan dat het opzetten
gelukt is:</para>
<screen>Mounting root from ufs:/dev/gvinum/root</screen>
</sect2>
<sect2>
<title>Een op Vinum gebaseerde rootinstallatie</title>
<para>Nadat het Vinum rootvolume is opgezet, geeft
<command>gvinum l -rv root</command> een volgend
resultaat:</para>
<screen>...
Subdisk root.p0.s0:
Size: 125829120 bytes (120 MB)
State: up
Plex root.p0 at offset 0 (0 B)
Drive disk0 (/dev/da0h) at offset 135680 (132 kB)
Subdisk root.p1.s0:
Size: 125829120 bytes (120 MB)
State: up
Plex root.p1 at offset 0 (0 B)
Drive disk1 (/dev/da1h) at offset 135680 (132 kB)</screen>
<para>De interessante waarden zijn <literal>135680</literal> voor
de offset (relatief ten opzichte van de partitie
<filename class="devicefile">/dev/da0h</filename>). Dit vertaalt zich
naar 265 schijfblokken van 512 bytes in termen van
<command>bsdlabel</command>.
Zo is de grootte van dit rootvolume 245760 blokken van 512 bytes.
<filename class="devicefile">/dev/da1h</filename>, dat de tweede
replica van dit rootvolume bevat, is symmetrische opgezet.</para>
<para>Het bsdlabel voor deze apparaten kan er zo uitzien:</para>
<screen>...
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*)
c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*)
h: 71771672 16 vinum # (Cyl. 0*- 4467*)</screen>
<para>Hieruit blijkt dat de <literal>"size"</literal> parameter
voor de nep <literal>"a"</literal> partitie overeenkomt met
de waarde als hierboven beschreven en dat de
<literal>"offset"</literal> parameter de som is van de offset
binnen de Vinum partitie <literal>"h"</literal> en de offset
van deze partitie binnen het apparaat (of de slice). Dit is
een normale opzet om problemen te voorkomen zoals in <xref
linkend="vinum-root-panic"/> beschreven is. Verder blijkt
dat de hele <literal>"a"</literal> partitie volledig binnen de
<literal>"h"</literal> partitie valt die alle Vinum gegevens
voor dit apparaat bevat.</para>
<para>In het bovenstaande voorbeeld is de volledige schijf voor
Vinum gereserveerd en er is geen restant van de pre-Vinum
rootpartitie, omdat dit een nieuwe schijf is die vanaf het begin
af aan bedoeld was als onderdeel van een Vinum instelling.</para>
</sect2>
<sect2>
<title>Problemen oplossen</title>
<para>Als er iets fout gaat moet er een manier zijn om dat te
herstellen. De volgende lijst bevat een paar bekende valkuilen
en oplossingen.</para>
<sect3>
<title>Systeem bootstrap laadt, maar systeem start niet
door</title>
<para>Als om wat voor reden dan ook het systeem niet doorgaat
met opstarten, kan de bootstrap worden onderbroken door de
<keycap>spatie</keycap> toets in te drukken tijdens de 10
seconden waarschuwing. Dan kunnen de loader variabelen
(zoals <literal>vinum.autostart</literal>) bekeken worden
met behulp van <command>show</command> en aangepast worden
met <command>set</command> of
<command>unset</command>.</para>
<para>Als het enige probleem was dat de Vinum kernelmodule
nog niet in de lijst van modules staat die automatisch
geladen wordt, dan zal <command>load geom_vinum</command>
helpen.</para>
<para>Als alles in orde is, kan het opstartproces doorgestart
worden met <command>boot -as</command>. De opties
<option>-as</option> geven de kernel aan om het
rootbestandssysteem te vragen (<option>-a</option>),
en het opstartproces te stoppen in single-user mode
(<option>-s</option>), waarbij het rootbestandssysteem als
alleen-lezen aangekoppeld wordt. Op die manier is er geen
risico op gegevensinconsistentie tussen de samenstellingen,
zelfs niet als er maar één samenstelling van
een multi-samenstellingen volume aangekoppeld is.</para>
<para>Op de prompt, waar om het rootbestandssysteem gevraagd
wordt, kan ieder apparaat dat een valide rootbestandssysteem
bevat worden opgegeven. Als <filename>/etc/fstab</filename>
goed is opgezet, is iets als
<literal>ufs:/dev/gvinum/root</literal> te zien. Een typische
andere keuze kan <literal>ufs:da0d</literal> zijn, dat een
hypothetische partitie is die het pre-Vinum
rootbestandssysteem bevat. Als één van de alias
<literal>"a"</literal> partities ingevuld wordt die
eigenlijk een referentie naar de subschijf van het Vinum
rootapparaat zijn, dan wordt in een gespiegelde opzet maar
éé kant van het gespiegelde volume aangekoppeld.
Als dit bestandssysteem later als lezen/schrijven
aangekoppeld wordt, moet(en) de andere samenstelling(en) van
het rootvolume verwijderd worden, omdat deze samenstellingen
anders inconsistente gegevens bevatten.</para>
</sect3>
<sect3>
<title>Alleen primaire bootstrap laadt</title>
<para>Als <filename>/boot/loader</filename> niet start, maar
de primaire bootstrap laadt wel (zichtbaar door een enkel
minteken in de linker bovenhoek van het scherm, direct na de
start van het opstartproces), kan worden geprobeerd het
primaire opstartproces te onderbreken door op de
<keycap>spatie</keycap> toets te drukken. Dit zorgt ervoor
dat het opstartproces stopt bij de tweede fase (zie ook
<xref linkend="boot-boot1"/>). Hier kan worden geprobeerd
vanaf een andere partitie te starten, bijvoorbeeld van de
partitie waar het vorige rootbestandssysteem op stond, dat
nu van de <literal>"a"</literal> verplaatst is.</para>
</sect3>
<sect3 id="vinum-root-panic">
<title>Niets start, paniek van bootstrap</title>
<para>Dit gebeurt als de bootstrap is vernietigd door de Vinum
installatie. Helaas laat Vinum op dit moment slechts 4 KB
vrij aan het begin van zijn partitie voordat de Vinum volume
identificatie geschreven wordt. De stage 1 en 2 bootstraps
en de bsdlabel-informatie hebben ongeveer 8 KB nodig. Dus
als de Vinum partitie op offset 0 van de slice van de schijf
begint die als opstartbaar was bedoeld, zal deze Vinum
informatie de bootstrap vernielen.</para>
<para>Als bovenstaande situatie is omzeild, bijvoorbeeld door
te starten vanaf een <quote>Fixit</quote> medium, en de
bootstrap opnieuw is aangemaakt met
<command>bsdlabel -B</command> zoals beschreven in
<xref linkend="boot-boot1"/>, overschrijft de nieuwe bootstrap
de Vinum identificatie en kan Vinum de Vinum schijven niet
langer vinden. Hoewel geen instellingsgegevens van Vinum of
gegevens in de Vinum volumes overschreven wordt en alle
gegevens hersteld kunnen worden door precies dezelfde
instellingsgegevens van Vinum opnieuw in te vullen, is dit
een lastige situatie om te herstellen. Het zou nodig zijn om
de complete Vinum partitie tenminste 4 KB te
verplaatsen, om te voorkomen dat de Vinum identificatie en de
bootstrap met elkaar botsen.</para>
</sect3>
</sect2>
</sect1>
</chapter>
|