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
|
<?xml version='1.0' encoding="UTF-8"?>
<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/ko/diskless-howto.xml,v 1.1 2004/11/04 11:45:14 neysx Exp $ -->
<!DOCTYPE guide SYSTEM "/dtd/guide.dtd">
<guide link="/doc/ko/diskless-howto.xml">
<title>젠투에서 디스크 없는 노드 사용하기</title>
<author title="연구자">
<mail link="ma53@drexel.edu">Michael Andrews</mail>
</author>
<author title="편집자">
<mail link="unsolo@sysrq.no">Kristian Jerpetjoen</mail>
</author>
<author title="검토자">
<mail link="swift@gentoo.org">Sven Vermeulen</mail>
</author>
<author title="검토자">
<mail link="neysx@gentoo.org">Xavier Neys</mail>
</author>
<author title="번역자">
<mail link="shavete@hotmail.com">shavete</mail>
</author>
<author title="편집자">
<mail link="envia@chol.com">Hwang Joonhyung</mail>
</author>
<abstract>
이 하우투는 여러분이 젠투 리눅스로 디스크 없는 노드를
만들 수 있도록 설치를 돕는다.
</abstract>
<license/>
<version>1.5</version>
<date>2004년 10월 9일</date>
<chapter>
<title>소개</title>
<section>
<title>이 하우투에 대해</title>
<body>
<p>
이 HOWTO문서는 여러분이 Gentoo Linux 배포판을 기반으로 하는 <e>diskless</e>
workstation을 설치하는 데 도움이 될 것이다. 우리는 기존의 사용자는 물론이고
새로운 사용자에게도 최대한 친근하게 다가가려고 할 것이다. 왜냐하면 우리 모두는
어떠한 면에서 하나이기 때문이다. :) 능숙한 사용자가 다수의 HOWTO를 diskless
node와 네트워크에 쉽게 적용할 때, 우리는 이 가이드가 흥미를 가진 모든 사용자들
(geek이든 아니든)이 설치를 쉽게 할 수 있게 하기를 희망한다.
</p>
</body>
</section>
<section>
<title>diskless 기계란 무엇인가?</title>
<body>
<p>
diskless machine이란 하드 디스크, 플로피 드라이브나 CD-ROM과 같은 일반적으로
사용되는 부트 디바이스를 가지고 있지 않은 PC를 뜻한다. diskless node는
네트워크를 통해 부팅되며, 로컬 하드 디스크처럼 사용할 수 있는 저장 공간을
제공하는 서버를 필요로 한다. 지금부터 우리는 서버를 <e>master</e>라 부를
것이며, diskless node를 <e>slave</e>라 부를 것이다. (이름이 뭘 의미하지 :)
slave node는 PXE 부팅이나 Etherboot를 지원하는 네트워크 어댑터가 필요하다.
지원하는 장치의 목록은
<uri link="http://www.etherboot.org">Etherboot.org</uri>에서 확인하라.
최근 출시된 대부분의 네트워크 카드가 PXE를 지원하고,
메인보드에 내장된 형태의 어댑터 또한 작동한다.
</p>
</body>
</section>
<section>
<title>시작하기 전에</title>
<body>
<p>
여러분은 master node에 Gentoo가 설치되어 있어야 되고, 여러분이 host하고 싶은
slave node의 파일시스템을 저장할만한 충분한 공간이 master상에 있어야 한다.
여러분이 근거리 연결(local area connection)과 분리된 인터넷 인터페이스를
가지고 있는지도 확인하라.
</p>
</body>
</section>
</chapter>
<chapter>
<title>마스터와 슬레이브 설정하기</title>
<section>
<title>커널에 대하여</title>
<body>
<note>
여러분이 openMosix cluster에 클러스터하려고 한다면, openMosix에 맞는
커널 패치를 사용했는지 확인해야 한다. 그 커널 패치는 portage아래
<path>sys-kernel/openmosix-sources</path>에 있다.
여러분이 openMosix에 맞는 커널을 컴파일하는 법을 배우기 위해서는,
<uri link="openmosix-howto.xml">openMosix HOWTO</uri>을 읽어봐야 한다.
</note>
<p>
커널이란 하드웨어와 시스템에 설치한 그 밖의 모든 소프트웨어 사이에 존재하는
소프트웨어이며, 커널의 중심부는 필수적으로 운영체제의 기반을 구성한다.
여러분이 컴퓨터를 켰을 때, BIOS는 하드 디스크의 지정된 부트 공간에 있는
instruction을 실행한다.
커널이 로드된 후에, 모든 프로세스는 커널에 의해 제어된다.
</p>
<p>
커널과 커널 설정에 관한 자세한 정보가 필요하면
<uri link="http://www.tldp.org/HOWTO/Kernel-HOWTO.html">kernel HOWTO</uri>를
참조하라.
</p>
</body>
</section>
<section>
<title>마스터 커널 설정하기</title>
<body>
<p>
master 커널은 여러분이 원하는만큼 커질 수도 있고, 알맞게 만들 수도 있지만,
여러분이 꼭 선택해야만 하는 몇가지의 커널 옵션이 있다.
아래와 같이 명령을 입력하여 커널 설정 메뉴를 실행한다.
</p>
<pre caption="마스터의 커널 설정을 고치기">
# <i>cd /usr/src/linux</i>
# <i>make menuconfig</i>
</pre>
<p>
여러분은 <path>/usr/src/linux/.config</path>를 직접 수정하는 방법에 대한
안전한 대안을 제공하는 회색과 파란색으로 이루어진 GUI를 볼 것이다.
만약 여러분의 커널이 현재 제대로 작동하고 있어서 현재의 설정을 저장하고자 하면,
GUI 환경에서 나와서 아래와 같이 명령을 입력한다.
</p>
<pre caption="마스터의 커널 설정을 백업하기">
# <i>cp .config .config_working</i>
</pre>
<p>
아래와 같이 부메뉴로 들어가서 나열된 항목들이 built-in으로 체크되어 있는지
확인하라. (modular가 <e>아니다</e>.)
아래에 있는 옵션들은 커널 2.4.22버전에서 볼 수 있는 것이다.
만약 여러분이 다른 버전의 커널을 사용한다면, 표시되는 문장들이나 순서가
다를 수도 있다. 적어도 아래에 보이는 항목을 선택하였는지 확인해라.
</p>
<pre caption="마스터의 커널 옵션">
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Networking options --->
<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[ ] Network packet filtering (replaces ipchains)
[ ] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
File systems --->
[*] /proc file system support
[*] /dev file system support (EXPERIMENTAL)
[*] Automatically mount at boot
Network File Systems --->
<*> NFS server support
[*] Provide NFSv3 server support
<comment>
여러분이 마스터 노드를 통해 인터넷에 접속하고 싶거나
보안 방화벽을 만들고 싶다면 iptables 지원을 추가하라.
</comment>
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration --->
<*> Connection tracking (required for masq/NAT)
<*> IP tables support (required for filtering/masq/NAT)
</pre>
<p>
패킷 필터링을 쓰고 싶다면, 여러분은 나머지를 나중에 모듈로 추가할 수 있다.
이를 어떻게 적절히 설치할 수 있는지에 대한
<uri link="http://www.gentoo.org/doc/ko/gentoo-security.xml#doc_chap12">젠투
보안 가이드 12장 방화벽</uri>을 읽어 보라.
</p>
<note>
위의 커널 설정 옵션들은 단지 여러분의 설정 옵션에 추가로 해 줘야 하는 것일 뿐,
여러분의 커널 설정을 완전히 교체하라는 것이 아니다.
</note>
<p>
master의 커널을 재설정한 다음, 아래와 같이 rebuild하라.
</p>
<pre caption="마스터의 커널과 모듈을 재컴파일하기">
# <i>make dep</i>
# <i>make clean bzImage modules modules_install</i>
<comment>(복사하기 전에 /boot가 마운트 되었는지 확인한다)</comment>
# <i>cp arch/i386/boot/bzImage /boot/bzImage-master</i>
# <i>cp System.map /boot/System.map-master</i>
</pre>
<p>
그런 다음, 여러분이 사용하는 부트로더에 따라 <path>lilo.conf</path>나
<path>grub.conf</path>에 새로운 커널 항목을 추가하고,
기본 부팅 항목으로 설정한다.
bzImage가 부트 디렉토리에 새로 생성될 것이다.
새로운 옵션들을 로드하기 위해서 시스템을 재부팅하는 것이 마지막 남은
해야할 모든 것이다.
</p>
</body>
</section>
<section>
<title>슬레이브 커널에 대하여</title>
<body>
<p>
slave 커널은 모듈없이 컴파일하는 것을 추천한다.
왜냐하면 원격 부팅을 통해 모듈을 로드하고 설정하는 것은 어렵고,
불필요한 작업이다.
게다가, slave 커널은 네트워크를 통해 효과적으로 부팅하기 위해서
최대한 작고 간단해야 한다.
우리는 master 커널이 설정되었던 공간에서 slave 커널을 컴파일할 것이다.
</p>
<p>
시간을 낭비하지 않고 혼란을 막기 위해 아래와 같이 명령을 실행하여 master 커널의 설정을 백업해 놓는 것은 좋은 생각이다.
</p>
<pre caption="마스터의 커널 설정을 백업하기">
# <i>cp /usr/src/linux/.config /usr/src/linux/.config_master</i>
</pre>
<p>
이제 우리는 master 커널을 설정한 것과 같은 방법으로 slave 커널을 설정할 것이다.
여러분이 새로운 설정 파일을 이용하여 시작하고 싶다면,
아래와 같이 명령을 실행하여 기본 설정 파일인
<path>/usr/src/linux/.config</path>을 다시 불러 올 수 있다.
</p>
<pre caption="깨끗한 설정을 얻기">
# <i>cd /usr/src/linux</i>
# <i>cp .config_master .config</i>
</pre>
<p>
아래와 같이 명령을 실행하여 GUI 환경의 설정 화면으로 들어간다.
</p>
<pre caption="슬레이브의 커널 설정을 고치기">
# <i>cd /usr/src/linux</i>
# <i>make menuconfig</i>
</pre>
<p>
아래의 옵션들을 module이 <e>아니라</e> built-in으로 선택하였는 지 확인해라.
</p>
<pre caption="슬레이브의 커널 옵션">
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Networking options --->
<*> Packet socket
[ ] Packet socket: mmapped IO
< > Netlink device emulation
[ ] Network packet filtering (replaces ipchains)
[ ] Socket Filtering
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support (NEW)
File systems --->
[*] /proc file system support
[*] /dev file system support (EXPERIMENTAL)
[*] Automatically mount at boot
Network File Systems --->
<*> file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
</pre>
<note>
dhcp 서버 대신에 BOOTP 서버를 설치할 수도 있다.
</note>
<impo>
네트워크 어댑터를 노드의 커널에 추가하는 것은 중요하다.
(모듈로 해서는 안 된다.)
디스크 없는 노드에서 일반적으로 모듈을 사용하는 것은 문제가 되지 않는다.
</impo>
<p>
지금부터 slave 커널을 컴파일해야 한다.
master 커널을 컴파일할 때 만든 모듈을 망가뜨리고 싶지 않다면
지금부터 조심해야 한다.
</p>
<pre caption="슬레이브의 커널을 컴파일하기">
# <i>cd /usr/src/linux</i>
# <i>make clean dep bzImage</i>
</pre>
<p>
slave의 파일과 필요한 파일을 저장해 놓을 디렉토리를 master상에 만들어 놓는다.
우리는 <path>/diskless</path>라고 만들것이지만,
여러분은 여러분 마음대로 만들 수 있다.
slave의 bzImage를 <path>/diskless</path>디렉토리에 복사해 놓는다.
</p>
<note>
만약 여러분이 다른 아키텍처들을 사용한다면 각 설정을
<path>.config_arch</path>에 저장하고 싶을 것이다. 이미지에 대해서도
같은 일을 하라. 그들을 <path>/diskless</path>에
<path>bzImage_arch</path>로 저장하라.
</note>
<pre caption="슬레이브의 커널을 복사하기">
# <i>mkdir /diskless</i>
# <i>cp /usr/src/linux/arch/i386/boot/bzImage /diskless</i>
</pre>
</body>
</section>
<section>
<title>준비용 슬레이브 파일 시스템 설정하기</title>
<body>
<p>
master와 slave의 파일시스템은 얼마든지 조정되고 바뀔 수 있다.
지금부터 우리는 오로지 적당한 설정 파일과 마운트 포인트가 담길
준비적인 파일시스템을 만드는 데 집중할 것이다.
우선 첫번째 slave를 위한 디렉토리를 <path>/diskless</path>안에 만든다.
각각의 slave는 자기만의 root파일시스템이 필요하다.
왜냐하면 시스템 파일을 공유하는 것은 접근권한 문제와
강한 충돌을 일으킬 수 있기 때문이다.
이러한 디렉토리의 이름은 여러분이 마음대로 지을 수 있지만,
slave의 IP 주소를 사용할 것을 제안한다.
왜냐하면 slave의 IP 주소는 유일하며, 혼동을 주지 않기 때문이다.
예를 들어 첫번째 slave의 고정 IP 주소는 <c>192.168.1.21</c>이다:
</p>
<pre caption="원격 루트 디렉터리 만들기">
# <i>mkdir /diskless/192.168.1.21</i>
</pre>
<p>
<path>/etc</path>안에 있는 여러 설정 파일들은 slave상에서 작동하기 위해 변경되어야 한다. 아래와 같이 명령을 실행하여 master의 <path>/etc</path>디렉토리를 새로운 slave 루트 디렉토리에 복사한다.
</p>
<pre caption="슬레이브의 파일시스템을 위해 /etc를 만들기">
# <i>cp -r /etc /diskless/192.168.1.21/etc</i>
</pre>
<p>
아직 파일시스템은 준비되지 않은 상태이다. 왜냐하면 파일시스템은 여러 마운트 포인트와 디렉토리를 필요로 하기 때문이다. 그것들을 만들기 위해 아래와 같이 명령을 실행한다.
</p>
<pre caption="슬레이브의 파일시스템에 마운트 지점과 디렉토리를 만들기">
# <i>mkdir /diskless/192.168.1.21/home</i>
# <i>mkdir /diskless/192.168.1.21/dev</i>
# <i>mkdir /diskless/192.168.1.21/proc</i>
# <i>mkdir /diskless/192.168.1.21/tmp</i>
# <i>mkdir /diskless/192.168.1.21/mnt</i>
# <i>chmod a+w /diskless/192.168.1.21/tmp</i>
# <i>mkdir /diskless/192.168.1.21/mnt/.initd</i>
# <i>mkdir /diskless/192.168.1.21/root</i>
# <i>mkdir /diskless/192.168.1.21/var</i>
# <i>mkdir /diskless/192.168.1.21/var/empty</i>
# <i>mkdir /diskless/192.168.1.21/var/lock</i>
# <i>mkdir /diskless/192.168.1.21/var/log</i>
# <i>mkdir /diskless/192.168.1.21/var/run</i>
# <i>mkdir /diskless/192.168.1.21/var/spool</i>
# <i>mkdir /diskless/192.168.1.21/usr</i>
# <i>mkdir /diskless/192.168.1.21/opt</i>
<comment>(openMosix 만)</comment>
# <i>mkdir /diskless/192.168.1.21/mfs</i>
</pre>
<p>
대부분의 "stubs"는 여러분이 알아볼 수 있어야 한다.
<path>/dev</path>나 <path>/proc</path>같은 stubs는 slave를 시작할 때,
populate되고, 나머지는 나중에 마운트 된다.
또한 여러분은 <path>/diskless/192.168.1.21/etc/hostname</path>를
slave의 호스트이름에 맞게 고쳐야 한다.
여러분이 slave를 부팅시키기 바로 전에 바이너리 파일과 라이브러리,
그리고 다른 파일들을 populate할 것이다.
</p>
</body>
</section>
</chapter>
<chapter>
<title>DHCP 서버 설정하기</title>
<section>
<title>DHCP 서버에 대하여</title>
<body>
<p>
DHCP는 Dynamic Host Configuration Protocol의 약자이다.
DHCP서버는 slave 컴퓨터가 PXE 부팅했을 때, 처음으로 연결하는 컴퓨터이다.
DHCP 서버의 주 목적은 IP 주소를 할당하는 것이다.
DHCP 서버는 ethernet의 MAC 주소를 바탕으로 IP주소를 할당한다.
slave가 주소를 할당받으면,
DHCP 서버는 slave에게 초기화 파일시스템과 커널이 어디 있는지 알려준다.
</p>
</body>
</section>
<section>
<title>여러분이 시작하기 전에</title>
<body>
<p>
시작하기 전에 확인해야할 몇가지가 있다. 첫째로 네트워크의 연결을 확인해야 한다.
</p>
<pre caption="네트워크 설정을 확인하기">
# <i>ifconfig eth0 enable multicast</i>
# <i>ifconfig -a</i>
</pre>
<p>
<e>eth0</e>디바이스가 작동하는 지 확인한다. 아래와 같이 보일 것이다.
</p>
<pre caption="올바르게 작동하는 eth0 디바이스">
eth0 Link encap:Ethernet HWaddr 00:E0:83:16:2F:D6
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:100
RX bytes:2483502568 (2368.4 Mb) TX bytes:1411984950 (1346.5 Mb)
Interrupt:18 Base address:0x1800
</pre>
<p>
가장 중요한 부분은 <e>MULTICAST</e>이다. 만약 <e>MULTICAST</e>라고 나오지 않는다면, multicast를 지원할 수 있도록 커널을 다시 컴파일해야 한다.
</p>
</body>
</section>
<section>
<title>DHCP 서버 설치하기</title>
<body>
<p>
네트워크에 DHCP 서버가 아직 설치되어 있지 않다면, DHCP 서버를 설치해야 한다.
</p>
<pre caption="Installing the dhcp server">
# <i>emerge dhcp</i>
</pre>
<p>
네트워크에 DHCP가 설치되어 있다면, PXE 부팅이 제대로 작동하기 위해서 설정을 해야 한다.
</p>
</body>
</section>
<section>
<title>DHCP 서버 설정하기</title>
<body>
<p>
DHCP 서버를 시작하기 전에 고쳐야 할 설정파일은 <path>/etc/dhcp/dhcpd.conf</path>이다. 아래의 예제를 복사한 후 고친다.
</p>
<pre caption="dhcp 서버의 설정 파일을 고치기">
# <i>cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf</i>
# <i>nano -w /etc/dhcp/dhcpd.conf</i>
</pre>
<p>
설정 파일의 일반적인 윤곽은 아래와 같이 의도적으로 정해진 방법을 따른다.
</p>
<pre caption="dhcpd.conf 윤곽의 예">
<comment># 전체 옵션은 여기에</comment>
ddns-update-style none;
shared-network LOCAL-NET {
<comment># 공유 네트워크 옵션은 여기에</comment>
subnet 192.168.1.0 netmask 255.255.255.0 {
<comment> # 서브넷 네트워크 옵션은 여기에</comment>
host slave{
<comment> # 호스트에 해당되는 옵션은 여기에</comment>
}
group {
<comment> # 그룹에 해당되는 옵션은 여기에</comment>
}
}
}
</pre>
<p>
The <c>shared-network</c> block is optional and should be used for IPs you want
to assign that belong to the same network topology. At least one <c>subnet</c>
must be declared and the optional <c>group</c> block allows you to group options
between items. A good example of <path>dhcpd.conf</path> looks like this:
</p>
<p>
<c>shared-network</c> 부분은 선택사항이며,
같은 네트워크 topology에 속한 IP 주소를 할당할 때 사용되어야 한다.
적어도 하나의 <c>subnet</c>이 반드시 선언되어야 하고,
선택 사항인 <c>group</c> 부분을 써서 항목에 대한 옵션들을 그룹으로 모을 수 있다.
<path>dhcpd.conf</path>의 좋은 예는 다음과 같다.
</p>
<pre caption="dhcpd.conf의 예">
# DHCP configuration file for DHCP ISC 3.0
ddns-update-style none;
# Definition of PXE-specific options
# Code 1: Multicast IP address of boot file server
# Code 2: UDP port that client should monitor for MTFTP responses
# Code 3: UDP port that MTFTP servers are using to listen for MTFTP requests
# Code 4: Number of seconds a client must listen for activity before trying
# to start a new MTFTP transfer
# Code 5: Number of seconds a client must listen before trying to restart
# a MTFTP transfer
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
subnet 192.168.1.0 netmask 255.255.255.0 {
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
# At least one of the vendor-specific PXE options must be set in
# order for the client boot ROMs to realize that we are a PXE-compliant
# server. We set the MCAST IP address to 0.0.0.0 to tell the boot ROM
# that we can't provide multicast TFTP (address 0.0.0.0 means no
# address).
option PXE.mtftp-ip 0.0.0.0;
# This is the name of the file the boot ROMs should download.
filename "pxelinux.0";
# This is the name of the server they should get it from.
<comment># 마스터의 IP를 쓰라</comment>
next-server 192.168.1.1;
}
<comment># 여러분이 특정한 이미지를 사용하지 않고 etherboot를 사용한다면 다음을 쓴다</comment>
class "etherboot" {
if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
filename "/diskless/vmlinuz";
}
}
pool {
max-lease-time 86400;
default-lease-time 86400;
<comment># 다음 줄은 원하지 않는 기계가 IP를 얻는 것을 막는다</comment>
deny unknown clients;
}
host slave21 {
<comment># 슬레이브의 MAC 주소</comment>
hardware ethernet 00:40:63:C2:CA:C9;
<comment># 슬레이브의 정적 IP</comment>
fixed-address 192.168.1.21;
server-name "master";
<comment># 필요하다면 게이트웨이 IP</comment>
option routers 192.168.1.1;
<comment># 필요하다면 DNS IP</comment>
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
<comment># 슬레이브 호스트 이름</comment>
option host-name "slave21";
<comment># MAC에 해당하는 이미지로 etherboot나 pxe boot를 할 경우 쓴다</comment>
option root-path "/diskless/192.168.1.21";
if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
filename "/vmlinuz_arch";
} else if substring (option vendor-class-identifier, 0,9) ="PXEClient" {
filename "/pxelinux.0";
}
}
}
</pre>
<note>
PXE 부트와 Ehterboot를 함께 사용할 수도 있다.
</note>
<p>
<c>next-server</c>다음에 나오는 IP 주소는
구체적인 <c>filename</c>을 필요로 한다.
이 IP 주소는 tftp 서버의 IP 주소이며, 보통 master의 IP 주소이다.
<c>filename</c>은 <path>/diskless</path>디렉토리와 관련되어 있다.
(이는 다음에 다룰 tftp 서버의 자세한 옵션에 따른 결과이다.)
<c>host</c>부분 안에서 <c>hardware ethernet</c> 옵션은 MAC 주소와
그 MAC 주소에 해당하는 고정 IP 주소를 다루고 있다.
<c>host-name</c>옵션은 단지 slave의 hostname이고, 포함시키면 좋을 것이다.
이 HOWTO에서 다루지 않는 <path>dhcpd.conf</path> 옵션에 관한 매우 훌륭한
man 페이지가 있다. 아래와 같이 명령을 실행하여 읽을 수 있다.
</p>
<pre caption="dhcpd.conf에 관한 man 페이지 보기">
# <i>man dhcpd.conf</i>
</pre>
</body>
</section>
<section>
<title>DHCP 서버 설치하기</title>
<body>
<p>
dhcp의 초기화 스크립트를 실행하기 전에 <path>/etc/conf.d/dhcp</path>를 수정하여 아래와 같이 보이도록 고친다.
</p>
<pre caption="/etc/conf.d/dhcp의 예">
IFACE="eth0"
<comment># 필요한 다른 옵션들을 집어넣는다</comment>
</pre>
<p>
<c>IFACE</c>변수는 DHCP 서버를 운영할 디바이스를 뜻한다.
우리의 경우에는 <c>eth0</c>이다.
<c>IFACE</c> 변수에 더 많은 인자를 추가하는 것은
여러개의 Ethernet카드를 가진 복잡한 네트워크 topology에 유용하다.
</p>
<pre caption="마스터에서 dhcp 서버 시작하기">
# <i>/etc/init.d/dhcp start</i>
</pre>
<p>
아래와 같이 명령을 실행하여 start-up 스크립트에 dhcp 서버를 추가한다.
</p>
<pre caption="마스터의 기본 런 레벨에 dhcp 서버를 추가하기">
# <i>rc-update add dhcp default</i>
</pre>
</body>
</section>
<section>
<title>DHCP 서버 문제 해결</title>
<body>
<p>
제대로 부팅되었는 지 확인하기 위해 <path>/var/log/daemon.log</path>를 살펴본다.
slave가 제대로 부팅되었다면 <path>syslog.log</path> 파일의 맨 아래에는
다음과 같은 몇 줄이 있을 것이다.
</p>
<pre caption="dhcp 로그 파일의 예">
DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0
</pre>
<note>
이 log 파일를 통해 여러분은 slave의 MAC 주소를 알 수 있다.
</note>
<p>
아래 메세지는 설정 파일에 무엇인가 잘못이 있지만
DHCP 서버는 제대로 broadcasting하고 있다는 것을 뜻한다.
</p>
<pre caption="dhpc 서버 에러">
no free leases on subnet LOCAL-NET
</pre>
<p>
설정 파일을 변경하고 그 변경된 내용을 적용할 때마다
DHCP 서버를 재시작해야 한다.
</p>
<pre caption="마스터의 dhcp 서버를 재시작하기">
# <i>/etc/init.d/dhcpd restart</i>
</pre>
</body>
</section>
</chapter>
<chapter>
<title>TFTP 서버와 PXE 리눅스 부트로더나 Etherboot 설정하기</title>
<section>
<title>TFTP 서버에 대하여</title>
<body>
<p>
TFTP는 Trivial File Transfer Protocol의 약자이다.
TFTP 서버는 slave에게 커널과 초기화 파일시스템을 제공할 것이다.
slave 커널과 파일시스템 모두는 TFTP 서버에 저장될 것이다. 그래서 master를 TFTP 서버로 만드는 것은 좋은 생각이다.
</p>
</body>
</section>
<section>
<title>TFTP 서버 설치하기</title>
<body>
<p>
가장 추천하는 tftp 서버는 tftp-hpa 패키지에서 구할 수 있다.
이 tftp 서버는 SYSLINUX 제작자가 만든 것이고, pxelinux와 잘 작동할 것이다.
아래와 같이 명령을 실행하여 설치할 수 있다.
</p>
<pre caption="서버를 설치하기">
# <i>emerge tftp-hpa</i>
</pre>
</body>
</section>
<section>
<title>TFTP 서버 설정하기</title>
<body>
<p>
<path>/etc/conf.d/in.tftpd</path> 파일을 고쳐야 한다.
<c>INTFTPD_PATH</c> 항목에 tftproot 디렉토리를 적어주고,
<c>INTFTPD_OPTS</c> 항목에 명령행 옵션을 적어준다.
<path>/etc/conf.d/in.tftpd</path>파일은 아래와 같은 모양이어야 한다.
</p>
<pre caption="/etc/conf.d/in.tftpd의 예">
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"
</pre>
<p>
<c>-l</c> 옵션은 서버가 stand alone 모드로 listen하므로,
inetd를 실행하지 않아도 된다는 것을 의미한다.
<c>-v</c> 옵션은 log/error메세지는 충분해야(verbose) 함을 의미한다.
<c>-s /diskless</c> 옵션은 tftp 서버의 루트를 지정한다.
</p>
</body>
</section>
<section>
<title>TFTP 서버 시작하기</title>
<body>
<p>
다음과 같이 명령을 실행하여 tftp서버를 시작한다.
</p>
<pre caption="마스터의 tftp 서버를 시작하기">
# <i>/etc/init.d/in.tftpd start</i>
</pre>
<p>
위 명령은 여러분이 <path>/etc/conf.d/in.tfpd</path> 파일에 지정해 놓은
옵션을 포함하여 tftp서버를 시작할 것이다.
시스템을 부팅할 때 자동으로 서버가 실행되기를 원한다면
아래와 같이 명령을 실행한다.
</p>
<pre caption="마스터의 기본 런 레벨에 tftp 서버를 추가하기">
# <i>rc-update add in.tftpd default</i>
</pre>
</body>
</section>
<section>
<title>PXELINUX에 대하여</title>
<body>
<p>
여러분이 이더부트만 사용한다면 이 절은 건너뛰어도 된다.
PXELINUX는 TFTP를 통해 제공될 LILO나 GRUB과 같은 기능을 하는
네트워크 부트로더이다. PXELINUX는 client에게 커널과 초기화 파일시스템이
어디에 위치하는 지를 알려주며 여러가지 커널 옵션을 지정할 수 있게 해주는
instruction으로 이루어진 필수적인 작은 묶음이다.
</p>
</body>
</section>
<section>
<title>시작하기 전에</title>
<body>
<p>
여러분은 H. Peter Anvin이 만든 SYSLINUX 패키지에 포함된 pxelinux.0 파일을
준비해야 한다. 아래와 같이 명령을 실행하여 패키지를 설치할 수 있다.
</p>
<pre caption="syslinux를 설치하기">
# <i>emerge syslinux</i>
</pre>
</body>
</section>
<section>
<title>PXELINUX 설치하기</title>
<body>
<note>
Etherboot에는 필요하지 않다.
</note>
<p>
tftp 서버를 시작하기 전에 pxelinux를 설치해야 한다.
우선 <path>/diskless</path>디렉토리에 pxelinux 바이너리를 복사한다.
</p>
<pre caption="원격 부트 로더를 설치하기">
# <i>cp /usr/lib/syslinux/pxelinux.0 /diskless</i>
# <i>mkdir /diskless/pxelinux.cfg</i>
# <i>touch /diskless/pxelinux.cfg/default</i>
</pre>
<p>
위 작업은 기본 부트로더 설정 파일을 생성할 것이다.
<path>pxelinux.0</path> 바이너리는 <path>pxelinux.cfg</path> 디렉토리에서
16진수로 된 client의 IP 주소가 이름인 파일을 찾을 것이다.
<path>pxelinux.0</path> 바이너리가 그런 파일을 찾지 못할 경우
파일 이름의 가장 오른쪽 자리의 숫자를 제거한 뒤 다시 찾기 시작할 것이며
이러한 작업은 숫자가 모두 제거될 때까지 계속 될 것이다.
2.05버전 이후의 syslinux는 MAX 주소 뒤에 붙는 이름을 가진 파일을 찾을 것이다.
만약 그러한 파일을 찾지 못했을 경우, <path>default</path> 파일을 사용할 것이다.
</p>
<pre caption="PXE가 pxelinux.cfg/에서 차례대로 찾는 파일들">
<comment>(16진수로 지정된 IP)</comment>
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
<comment>(처음의 01은 이더넷을 의미하고, 다음 바이트들은 슬레이브의 MAC 주소와 일치한다.)</comment>
01-00-40-63-c2-ca-c9
default
</pre>
<note>
이들은 모두 소문자이다.
</note>
<p>
<path>default</path> 파일을 가지고 시작해보자.
</p>
<pre caption="pxelinux.cfg/default의 예">
DEFAULT /diskless/bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21
</pre>
<p>
<c>DEFAULT</c> tag는 pxelinux가 미리 컴파일해 놓은 bzImage를 가리키도록 한다.
<c>APPEND</c> tag는 초기화 옵션을 덧붙이는 기능을 한다.
slave 커널을 <c>NFS_ROOT_SUPPORT</c>으로 컴파일하였기 때문에,
nfsroot라고 덧붙일 것이다.
먼저 나오는 IP 주소는 master의 IP 주소이고
두번째 나오는 IP 주소는 slave의 초기화 파일시스템을 저장하기 위해
<path>/diskless</path> 안에 만들어 놓았던 디렉토리이다.
</p>
</body>
</section>
<section>
<title>Etherboot에 대하여</title>
<body>
<note>
여러분이 PXE 부트를 사용한다면 필요하지 않다.
</note>
<p>
Etherboot는 TFTP 서버의 네트워크 부트 이미지를 이용해 부트한다.
PXE와 같이 이것도 LILO나 GRUB과 동등하다.
<c>mknbi</c> 유틸리티는 여러분이 다른 옵션을 써서
다른 이미지를 만드는 것을 가능하게 해 준다.
</p>
</body>
</section>
<section>
<title>시작하기 전에</title>
<body>
<p>
여러분은 Etherboot 이미지를 만들기 위해 <c>mknbi</c> (네트워크 부팅에 유용한
태그가 붙은 커널 이미지를 만드는 유틸리티) 패키지를 얻을 필요가 있다.
이 도구는 여러분의 원래 커널로부터 미리 설정된 커널 이미지를 만든다.
이는 아래에서 보여질 부트 옵션들을 포함한다.
</p>
<pre caption="mknbi 설치하기">
# <i>emerge mknbi</i>
</pre>
</body>
</section>
<section>
<title>Etherboot 설정하기</title>
<body>
<p>
이 절에서 우리는 단순한 Etherboot 이미지를 만들 것이다.
dhcp 서버가 클라이언트에게 dhcp.conf의 "option root-path"에 있는
root-path를 제공하기 때문에, 우리는 이를 여기에서 설명하지 않을 것이다.
더 자세한 내용은 mknbi 매뉴얼에서 찾을 수 있다.
</p>
<pre caption="mknbi 매뉴얼">
# <i>man mknbi</i>
</pre>
<p>
부트 이미지를 만들어야 한다. dhcp와 rootpath를 커널에 넘길 수 있는
부트 가능한 ELF 이미지를 만들 것이다.
또한 커널에게 네트워크에서 dhcp 서버를 찾도록 강제해야 한다.
</p>
<pre caption="네트워크 부트 이미지 만들기">
# <i>mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz </i>
</pre>
<note>
아키텍처에 특정한 이미지를 만드려면 <c>bzImage_arch</c>와
<c>vmlinuz_arch</c>를 입력해야 한다.
</note>
</body>
</section>
<section>
<title>네트워크 부팅 과정에서의 문제 해결</title>
<body>
<p>
여러분이 네트워크 부트 프로세스를 디버그할 수 있는 몇가지가 있다.
첫째로 여러분은 <c>tcpdump</c>라 불리우는 툴을 사용할 수 있다.
아래와 같이 명령을 실행하여 <c>tcpdump</c>를 설치한다.
</p>
<pre caption="tcpdump 설치하기">
# <i>emerge tcpdump</i>
</pre>
<p>
이제부터 여러분은 여러가지 네트워크 트래픽을 탐지할 수 있고, 여러분의 client/server간의 통신이 제대로 이루어지는 지 확인할 수 있다. 제대로 작동하지 않는 것들이 있을 때, 여러분이 체크할만한 몇가지가 있다. 우선 확인해야 할 것은 client/server가 물리적으로 적절히 연결되어 있는 지와 네트워크 케이블이 손상되지 않았는 지이다. client/server가 특정 포트에서 요청을 받아들이지 못한다면, 방화벽에 의한 간섭이 없는 지 확인해라. 두 컴퓨터 사이의 통신을 확인하기 위해서 아래와 같이 명령을 실행해라.
</p>
<pre caption="tcpdump를 통해 클라이언트와 서버의 상호 작용을 듣기">
# <i>tcpdump host </i><comment>client_ip</comment><i> and </i><comment>server_ip</comment>
</pre>
<p>
아래와 같이 명령을 실행하여 <c>tcpdump</c>를 이용한 특정 포트상의 통신 탐지도 가능하다.
</p>
<pre caption="tftp 서버 듣기">
# <i>tcpdump port 69</i>
</pre>
<p>
보통 "PXE-E32: TFTP open time-out"와 같은 에러가 생길 것이다.
이 에러는 방화벽에 관련된 에러이다.
<c>TCPwrappers</c>를 사용한다면 <path>/etc/hosts.allow</path>와
<path>etc/hosts.deny</path>가 제대로 설정되어 있는 지 확인하라.
client는 server로의 연결이 허락되어야 한다.
</p>
</body>
</section>
</chapter>
<chapter>
<title>NFS 서버 설정하기</title>
<section>
<title>NFS 서버에 대하여</title>
<body>
<p>
NFS는 Network File System의 약자다. NFS 서버는 slave에게 디렉토리를 제공하기 위해 사용될 것이다. 이부분은 나중에 조금씩 개인적으로 변경될 수 있다. 지금 다루려는 공통된 부분은 미리 준비된 slave node가 diskless 부팅을 하는 것이다.
</p>
</body>
</section>
<section>
<title>Portmapper에 대하여</title>
<body>
<p>
여러가지 client/server 서비스는 특정 포트를 탐지하지 못하고 대신 RPCs(Remote Procedure Calls)에 의존한다. 서비스가 초기화될 때, 서비스는 임의의 포트를 탐지하고 Portmapper 유틸리티를 이용하여 그 포트를 등록한다. NFS는 RPCs에 의존적이어서 NFS가 시작되기 전에 Portmapper가 실행되어 있어야 한다.
</p>
</body>
</section>
<section>
<title>시작하기 전에</title>
<body>
<p>
NFS 서버는 커널레벨 지원이 필요하며, 여러분의 커널이 지원하지 못하면
master 커널을 다시 컴파일하여야 한다.
아래와 같이 명령을 실행하여 master 커널을 다시 한번 확인하라.
</p>
<pre caption="NFS 해당 옵션 확인하기">
# <i>grep NFS /usr/src/linux/.config_master</i>
</pre>
<p>
커널이 제대로 설정되었다면, 아래와 같은 결과를 보게 될 것이다.
</p>
<pre caption="마스터의 커널 설정에 있는 올바른 NFS 해당 옵션">
# CONFIG_ROOT_NFS is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_TCP is not set
# CONFIG_NCPFS_NFS_NS is not set
</pre>
</body>
</section>
<section>
<title>NFS 서버 설치하기</title>
<body>
<p>
portage를 통해 NFC 패키지를 설치하려면 아래와 같은 명령을 실행한다.
</p>
<pre caption="nfs-utils 설치하기">
# <i>emerge nfs-utils</i>
</pre>
<p>
이 패키지는 portmapping utility, nft sserver, nfs client utilities를 설치하고,
자동으로 의존성을 구성해준다.
</p>
</body>
</section>
<section>
<title>NFS 서버 설정하기</title>
<body>
<p>
여러분은 세가지 주요 설정 파일을 고쳐야 한다.
</p>
<pre caption="NFS 설정 파일들">
/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs
</pre>
<p>
<path>/etc/exports</path> 파일은 NFS를 통해 어떻게, 누구에게, 무엇을
export할지를 정한다.
slave의 fstab 파일은 master가 export할 NFS 파일시스템을 마운트 할 수 있도록
고쳐져야 한다.
</p>
<p>
전형적인 master의 <path>/etc/exports</path> 파일은 아래와 같은 모양이다.
</p>
<pre caption="마스터의 /etc/exports의 예">
<comment># 각 슬레이브에 대해 다음과 같은 줄을 하나씩</comment>
/diskless/192.168.1.21 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
<comment># 모든 슬레이브에 공통</comment>
/opt 192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/usr 192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/home 192.168.1.0/24(sync,rw,no_root_squash,no_all_squash)
<comment># 공유 로그를 쓰고 싶은 경우</comment>
/var/log 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
</pre>
<p>
첫번째 필드는 export될 디렉토리를 가리키며, 다음 필드는 대상과 방법을 가리킨다.
이 필드는 두 부분으로 나누어 볼 수 있다.
누가 특정한 디렉토리에 마운트할 수 있도록 허락되었는지와
마운트하는 client가 파일시스템에 무엇을
(<c>ro</c>는 읽기 전용, <c>rw</c>는 읽기/쓰기를 의미한다.
<c>no_root_squash</c>와 <c>no_all_squash</c>는 diskless clients가
I/O를 요청하려 할 때, 서로 충돌하지 않도록 해주기 때문에 매우 중요하다.)
할 수 있는지로 나누어 진다.
slave의 fstab, <path>/diskless/192.168.1.21/etc/fstab</path>은
아래와 같은 모양이다.
</p>
<pre caption="슬레이브 fstab의 예제">
<comment># 이 항목들은 필수다</comment>
master:/diskless/192.168.1.21 / nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
master:/opt /opt nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/usr /usr nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/home /home nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
none /proc proc defaults 0 0
<comment># 유용하지만 필요하지는 않다</comment>
master:/var/log /var/log nfs hard,intr,rw 0 0
<comment>(openMosix 클러스터를 설치할 때만)</comment>
none /mfs mfs dfsa=1 0 0
</pre>
<p>
이 예에서, <e>master</e>는 단지 master의 호스트네임이지만,
IP 주소를 대신 사용할 수도 있다.
처음 필드는 마운트 될 디렉토리를 가르키며,
두번째 필드는 그 디렉토리가 마운트 되는 곳을 의미한다.
세번째 필드는 파일시스템을 보여주며,
NFS로 마운트 될 디렉토리는 반드시 NFS로 되어 있어야 한다.
네번째 필드는 마운트 과정에서 사용되는 여러가지 옵션을 가리킨다.
(마운트 옵션에 대하여 알고 싶으면 mount(1)을 보라.)
몇몇 사람들이 soft 마운트 포인트 때문에 어려움을 겪기 때문에
우리는 모든 디렉토리를 hard로 마운트하였다.
그러나 여러분의 클러스터를 더욱 효율적으로 만들기 위해서
<path>/etc/fstab</path> 안의 여러 옵션들을 살펴보아야 한다.
</p>
<p>
여러분이 수정해야할 마지막 파일은 <path>/etc/conf.d/nfs</path>이다.
이 파일은 nfs가 초기화될 때 사용되는 여러 옵션들에 대한 파일이며
아래와 같은 모습이다.
</p>
<pre caption="마스터의 /etc/conf.d/nfs의 예">
# Config file for /etc/init.d/nfs
# Number of servers to be started up by default
RPCNFSDCOUNT=8
# Options to pass to rpc.mountd
RPCMOUNTDOPTS=""
</pre>
<p>
여러분은 <c>RPCNFSDCOUNT</c>를 네트워크에 존재하는
diskless node의 수로 바꿔줘야 한다.
</p>
</body>
</section>
<section>
<title>NFS 서버 시작하기</title>
<body>
<p>
여러분은 아래와 같이 명령을 실행하여 <path>/etc/init.d</path>
안에 있는 스크립트를 이용하여 nfs 서버를 시작해야 한다.
</p>
<pre caption="마스터의 nfs 서버 시작하기">
# <i>/etc/init.d/nfs start</i>
</pre>
<p>
만약 시스템이 부팅될 때 nfs 서버를 시작하기 위해
이 스크립트를 실행하려면 아래와 같이 명령을 실행해라.
</p>
<pre caption="nfs 서버를 마스터의 기본 런 레벨에 추가하기">
# <i>rc-update add nfs default</i>
</pre>
</body>
</section>
</chapter>
<chapter>
<title>슬레이브 파일시스템 마무리하기</title>
<section>
<title>빠진 파일 복사</title>
<body>
<p>
지금부터 master의 파일시스템에 맞춰서 slave의 파일시스템을 만들고,
구체적인 몇몇 파일을 보존하면서 필요한 바이너리를 넣을 것이다.
</p>
<pre caption="슬레이브 파일시스템 만들기">
# <i>rsync -avz /bin /diskless/192.168.1.21</i>
# <i>rsync -avz /sbin /diskless/192.168.1.21</i>
# <i>rsync -avz /lib /diskless/192.168.1.21</i>
</pre>
<note>
cp 대신에 rsync -avz를 사용하는 이유는 심볼릭 링크들과
권한들을 유지하기 위해서이다.
</note>
</body>
</section>
<section>
<title>초기화 스크립트들</title>
<body>
<p>
기본 스크립트는 여러분의 slave node에는 맞지 않는 <e>checkroot</e>를
실행하려 할 것이다.
<path>/diskless/192.168.1.21/sbin/rc</path>를 직접 고치는 어려운 방법이 있지만,
어렵고 위험하다.
여러분이 node의 파일시스템을 다시 동기화하려고 결정했다면,
망가질 수도 있고, 스크립트 파일을 그대로 남겨두는 것을 잊을 수도 있다.
쉽게 하는 방법으로 시스템이 부팅될 때 <path>/fastboot</path> 파일을
가지고 있는 방법이 있다.
이 파일은 <e>checkroot</e>가 어떠한 파일시스템 체크도 실행하지 않도록 해준다.
하지만 그것이 초기화 과정을 마쳤을 때,
<path>/fastboot</path> 파일을 지울 것이다.
그렇기 때문에 우리는 아래와 같이 초기화 과정의 마지막에
이 파일을 다시 생성하도록 해야한다.
</p>
<pre caption="init 스크립트가 파일 시스템 체크를 하는 것을 막기">
<comment>(다음 부팅을 위해 /fastboot 파일 만들기)</comment>
# <i>touch /diskless/192.168.1.21/fastboot</i>
<comment>(부팅할 때마다 /fastboot 파일 만들기)</comment>
# <i>echo "touch /fastboot" >> /diskless/192.168.1.21/etc/conf.d/local.start</i>
</pre>
<p>
여러분의 diskless node에서 필요한 서비스에 해당하는 초기화 스크립트를 디렉토리 안에 넣어 놓아야 한다. 이 작업은 여러분의 slave가 무엇을 할지에 따라 결정된다.
</p>
<warn>
master로 로그인했을 때, <c>rc-update</c> 프로그램을 이용하여
slave 런레벨로부터 스크립트를 추가하거나 제거하지 말아라.
이 작업은 여러분의 master 런레벨을 변경할 것이다.
직접 링크를 만들거나, slave node로 로그인하여 ssh를 이용하거나,
모니터나 키보드를 slave에 연결하고 작업해라.
</warn>
<pre caption="전형적인 슬레이브의 런레벨들">
/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x 2 root root 4096 2003-11-09 15:27 boot
drwxr-xr-x 2 root root 4096 2003-10-01 21:10 default
drwxr-xr-x 2 root root 4096 2003-03-13 19:05 nonetwork
drwxr-xr-x 2 root root 4096 2003-02-23 12:26 single
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx 1 root root 23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx 1 root root 18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 portmap -> /etc/init.d/portmap
lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx 1 root root 18 2003-10-18 17:28 serial -> /etc/init.d/serial
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 metalog -> /etc/init.d/metalog
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 ntp-client -> /etc/init.d/ntp-client
lrwxrwxrwx 1 root root 16 2003-10-18 17:28 ntpd -> /etc/init.d/ntpd
lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vcron -> /etc/init.d/vcron
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
/diskless/192.168.1.21/etc/runlevels/single:
total 0
</pre>
<p>
지금이야 말로 여러분의 slave를 부팅하고 행운을 빌기에 좋은 시간이다.
작동하는가? 축하한다.
여러분은 diskless node의 소유자로서 스스로 자랑스럽게 여겨도 좋다. :)
</p>
</body>
</section>
<!--
<section>
<title>대안 : ClusterNFS</title>
<body>
<warn>
이는 이 문서의 검토자가 이 해법을 사용하고 있기 때문에 언급된 것이다.
젠투는 ClusterNFS를 지원하지 <e>않는다</e>는 것에 유의하라.
이는 포티지에 없으며 baselayout init 스크립트를 고쳐야 한다.
<b>여러분의 책임 하에서 사용하라.</b>
</warn>
<p>
만약 여러분이 각각의 슬레이브가 따로 루트를 가지면 마스터 디렉토리에서 파일을 업그레이드 할 때 관리 작업이 더 필요하기 때문에 그것을 바라지 않는다면, 마스터와 슬레이브를 포함한 모든 노드가 같은 루트를 공유하도록 할 수도 있다.
이는 여러분이 하나의 바이너리 세트만을 가지고 있기 때문에
여러분의 모든 기계들이 호환 가능해야 한다는 것을 뜻한다.
또한 모든 마스터 루트가 NFS를 통해 보내(export)질 수 있기 때문에
보안 문제가 있을 수 있다는 것도 알아야 한다.
</p>
<p>
만약 여러분이 여전히 이 대안을 시도해 보고 싶으시다면
ClusterNFS의 <uri link="http://clusternfs.sourceforge.net/">홈 페이지</uri>를
방문해서 소프트웨어를 다운로드받고 문서를 읽으라.
</p>
<p>
짧게 말하면, 모든 파일들은 공유되고 마스터와 모든 슬레이브 사이에 차이가
있어야 하는 파일들은 <path>file$$CLIENT$$</path>로 복사된다.
슬레이브가 <path>file</path>을 요청하면, ClusterNFS는
<path>file$$CLIENT$$</path>의 존재를 알아채고 그것을 대신 보낸다.
각 노드 사이에 차이가 있어야 하는 파일들은
<path>file$$IP=192.168.1.21$$</path>로 복사된다.
이는 디렉토리에도 똑같이 적용된다.
</p>
<p>
아주 짧게 말하면, 다음이 위에서 다룬 설치 과정과의 차이점이다.
</p>
<ul>
<li>여러분은 여러분의 마스터 커널에 NFS 서버 지원을 포함할 필요가 없다</li>
<li>nfs-utils를 설치(emerge)한 <e>뒤에</e> ClusterNFS를 설치하라</li>
<li>파일과 디렉토리의 슬레이브 사본은 아래에 설명한 것과 같이 만들라</li>
<li>각 노드의 루트 디렉토리를 만들지 마라</li>
<li><path>/etc/exports</path> 파일에서 /만 보내(export)라</li>
<li>
NFS를 통해 /만 슬레이브의 <path>/etc/fstab$$CLIENT$$</path> 파일 안에
마운트하라.
</li>
<li>
<path>/etc/init.d/nfs</path>를 아래에서 설명한 것과 같이 고치라</li>
<li>
<path>/etc/conf.d/local.start$$CLIENT$$</path>를
아래에서 설명한 것과 같이 고치라
</li>
</ul>
<pre caption="마스터와 슬레이브 사이에서 달라야 하는 파일">
/etc/conf.d/local.start$$CLIENT$$
/etc/conf.d/local.stop$$CLIENT$$<comment> (아마도 비었을 것이다)</comment>
/etc/crontab$$CLIENT$$<comment> (아마도 비었을 것이며, 마스터가 지저분한 일은 해 준다)</comment>
/etc/exports$$CLIENT$$<comment> (비었고, 슬레이브는 NFS 마운트를 가져가지(export) 않는다)</comment>
/etc/fstab$$CLIENT$$
/etc/hostname$$IP=192.168.1.21$$<comment> (여러분의 슬레이브를 입력)</comment>
/etc/mtab$$IP=192.168.1.21$$
/etc/runlevels$$CLIENT$$<comment> (마스터와 슬레이브 부트 스크립트 사이의 확실한 구분)</comment>
/fastboot$$CLIENT$$
/tmp$$IP=192.168.1.21$$
/var$$IP=192.168.1.21$$<comment> (/var 안과 같이 서브 디렉토리들을 만든다)</comment>
</pre>
<pre caption="/etc/init.d/nfs 고치기">
ebegin "Starting NFS daemon"
start-stop-daemon - -start - -quiet - -exec \
<comment># - -translate-names option 추가</comment>
$nfsd - - - -translate-names
eend $? "Error starting NFS daemon"
# Check if we support NFSv3
ebegin "Starting NFS mountd"
<comment># 다음 두 줄을 주석 처리하라 (ClusterNFS는 NFS v2 만을 안다)</comment>
# rpcinfo -u localhost nfs 3 &>/dev/null || \
# RPCMOUNTDOPTS="$RPCMOUNTDOPTS - -no-nfs-version 3"
start-stop-daemon - -start - -quiet - -exec \
$mountd - - $RPCMOUNTDOPTS 1>&2
eend $? "Error starting NFS mountd"
</pre>
<pre caption="/etc/conf.d/local.start$$CLIENT$$ 고치기">
<comment>(다음 줄 추가)</comment>
touch /fastboot\$\$CLIENT\$\$
</pre>
</body>
</section>
-->
</chapter>
</guide>
|