Repository navigation
Expand file tree
/
Copy pathnetapp-tutorial3.html
More file actions
1021 lines (924 loc) · 63.8 KB
/
Copy pathnetapp-tutorial3.html
File metadata and controls
1021 lines (924 loc) · 63.8 KB
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NetApp ONTAP: Controller Architecture & Cluster Setup — Tutorial 3</title>
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Sora:wght@300;400;600;700;800&family=Inter:wght@300;400;500;600&display=swap');
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-card: #1c2333;
--bg-card-hover: #21283a;
--accent-blue: #58a6ff;
--accent-green: #3fb950;
--accent-orange: #f78166;
--accent-purple: #bc8cff;
--accent-yellow: #e3b341;
--accent-teal: #39d3c3;
--text-primary: #e6edf3;
--text-secondary: #8b949e;
--text-muted: #6e7681;
--border: #30363d;
--border-bright: #484f58;
--sidebar-width: 290px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
font-family: 'Inter', sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
display: flex;
min-height: 100vh;
}
/* ── SIDEBAR ── */
.sidebar {
width: var(--sidebar-width);
background: var(--bg-secondary);
border-right: 1px solid var(--border);
position: fixed;
top: 0; left: 0;
height: 100vh;
overflow-y: auto;
z-index: 100;
display: flex;
flex-direction: column;
}
.sidebar-header {
padding: 20px 16px;
border-bottom: 1px solid var(--border);
background: var(--bg-secondary);
position: sticky; top: 0; z-index: 10;
}
.sidebar-logo { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
.sidebar-logo .logo-icon {
width: 32px; height: 32px;
background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple));
border-radius: 8px;
display: flex; align-items: center; justify-content: center;
font-size: 16px;
}
.sidebar-logo span {
font-family: 'Sora', sans-serif;
font-weight: 700; font-size: 14px;
color: var(--text-primary); letter-spacing: 0.5px;
}
.sidebar-subtitle { font-size: 11px; color: var(--text-muted); padding-left: 42px; }
.toc-nav { padding: 12px 0; flex: 1; }
.toc-section-label {
font-size: 10px; font-weight: 600; text-transform: uppercase;
letter-spacing: 1.2px; color: var(--text-muted);
padding: 12px 16px 6px;
}
.toc-link {
display: flex; align-items: center; gap: 8px;
padding: 7px 16px; font-size: 12.5px;
color: var(--text-secondary); text-decoration: none;
transition: all 0.2s ease;
border-left: 2px solid transparent; line-height: 1.4;
}
.toc-link:hover { background: var(--bg-card); color: var(--text-primary); border-left-color: var(--accent-blue); }
.toc-link.active { background: rgba(88,166,255,0.1); color: var(--accent-blue); border-left-color: var(--accent-blue); font-weight: 500; }
.toc-link .toc-num { font-size: 10px; font-weight: 700; color: var(--text-muted); min-width: 18px; font-family: 'JetBrains Mono', monospace; }
.toc-link.sub { padding-left: 32px; font-size: 12px; }
/* ── MAIN ── */
.main-content { margin-left: var(--sidebar-width); flex: 1; max-width: calc(100vw - var(--sidebar-width)); }
.top-header {
background: linear-gradient(135deg, #0d1117 0%, #1a2744 50%, #0d2035 100%);
border-bottom: 1px solid var(--border);
padding: 60px 60px 50px;
position: relative; overflow: hidden;
}
.top-header::before {
content: ''; position: absolute; inset: 0;
background: radial-gradient(ellipse at 70% 50%, rgba(88,166,255,0.08) 0%, transparent 60%),
radial-gradient(ellipse at 20% 80%, rgba(63,185,80,0.06) 0%, transparent 50%);
}
.header-badge {
display: inline-flex; align-items: center; gap: 6px;
background: rgba(88,166,255,0.12); border: 1px solid rgba(88,166,255,0.3);
border-radius: 20px; padding: 4px 14px;
font-size: 12px; color: var(--accent-blue); font-weight: 500;
margin-bottom: 18px; font-family: 'JetBrains Mono', monospace;
}
.main-title {
font-family: 'Sora', sans-serif; font-size: 38px; font-weight: 800;
line-height: 1.15; margin-bottom: 16px;
background: linear-gradient(135deg, #e6edf3 30%, #58a6ff 70%, #bc8cff 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text; position: relative;
}
.header-desc { font-size: 15px; color: var(--text-secondary); line-height: 1.7; max-width: 680px; position: relative; }
.header-meta { display: flex; gap: 24px; flex-wrap: wrap; margin-top: 20px; position: relative; }
.meta-chip { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--text-secondary); }
.meta-chip .dot { width: 8px; height: 8px; border-radius: 50%; }
.content-area { padding: 40px 60px 80px; max-width: 1000px; }
.section { margin-bottom: 60px; scroll-margin-top: 30px; }
.section-header {
display: flex; align-items: flex-start; gap: 16px;
margin-bottom: 24px; padding-bottom: 16px;
border-bottom: 1px solid var(--border);
}
.section-icon {
width: 44px; height: 44px; border-radius: 10px;
display: flex; align-items: center; justify-content: center;
font-size: 20px; flex-shrink: 0; margin-top: 2px;
}
.icon-blue { background: rgba(88,166,255,0.15); border: 1px solid rgba(88,166,255,0.3); }
.icon-green { background: rgba(63,185,80,0.15); border: 1px solid rgba(63,185,80,0.3); }
.icon-orange { background: rgba(247,129,102,0.15); border: 1px solid rgba(247,129,102,0.3); }
.icon-purple { background: rgba(188,140,255,0.15); border: 1px solid rgba(188,140,255,0.3); }
.icon-teal { background: rgba(57,211,195,0.15); border: 1px solid rgba(57,211,195,0.3); }
.icon-yellow { background: rgba(227,179,65,0.15); border: 1px solid rgba(227,179,65,0.3); }
.section-title-wrap h2 { font-family: 'Sora', sans-serif; font-size: 24px; font-weight: 700; color: var(--text-primary); line-height: 1.2; }
.section-title-wrap .section-num { font-size: 11px; font-family: 'JetBrains Mono', monospace; color: var(--text-muted); font-weight: 400; margin-bottom: 4px; }
.card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 24px; margin-bottom: 20px; transition: border-color 0.2s; }
.card:hover { border-color: var(--border-bright); }
.card-title { font-family: 'Sora', sans-serif; font-weight: 600; font-size: 15px; color: var(--text-primary); margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }
p { font-size: 14.5px; line-height: 1.8; color: var(--text-secondary); margin-bottom: 14px; }
.callout { border-radius: 10px; padding: 16px 20px; margin: 20px 0; display: flex; gap: 14px; align-items: flex-start; }
.callout-icon { font-size: 18px; margin-top: 1px; flex-shrink: 0; }
.callout-content { flex: 1; }
.callout-title { font-weight: 600; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; }
.callout-text { font-size: 13.5px; line-height: 1.7; color: var(--text-secondary); }
.callout.info { background: rgba(88,166,255,0.08); border: 1px solid rgba(88,166,255,0.25); }
.callout.info .callout-title { color: var(--accent-blue); }
.callout.success { background: rgba(63,185,80,0.08); border: 1px solid rgba(63,185,80,0.25); }
.callout.success .callout-title { color: var(--accent-green); }
.callout.warning { background: rgba(227,179,65,0.08); border: 1px solid rgba(227,179,65,0.3); }
.callout.warning .callout-title { color: var(--accent-yellow); }
.callout.danger { background: rgba(247,129,102,0.08); border: 1px solid rgba(247,129,102,0.3); }
.callout.danger .callout-title { color: var(--accent-orange); }
.callout.tip { background: rgba(188,140,255,0.08); border: 1px solid rgba(188,140,255,0.25); }
.callout.tip .callout-title { color: var(--accent-purple); }
.code-block { background: #0a0e13; border: 1px solid var(--border); border-radius: 10px; overflow: hidden; margin: 16px 0; font-family: 'JetBrains Mono', monospace; }
.code-header { background: var(--bg-secondary); border-bottom: 1px solid var(--border); padding: 8px 16px; display: flex; align-items: center; justify-content: space-between; }
.code-lang { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.8px; }
.code-dots { display: flex; gap: 5px; }
.code-dots span { width: 10px; height: 10px; border-radius: 50%; }
.dot-red { background: #ff5f56; } .dot-yellow { background: #ffbd2e; } .dot-green { background: #27c93f; }
.code-body { padding: 20px; font-size: 13px; line-height: 1.8; color: #79c0ff; overflow-x: auto; }
.code-body .cmd { color: #3fb950; }
.code-body .comment { color: #6e7681; font-style: italic; }
.code-body .param { color: #ffa657; }
.code-body .value { color: #a5d6ff; }
.code-body .output { color: #8b949e; }
.spec-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13.5px; }
.spec-table th { background: var(--bg-secondary); color: var(--text-secondary); font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; padding: 10px 16px; text-align: left; border-bottom: 2px solid var(--border); }
.spec-table td { padding: 11px 16px; border-bottom: 1px solid var(--border); color: var(--text-secondary); vertical-align: middle; }
.spec-table tr:hover td { background: rgba(255,255,255,0.02); }
.badge { display: inline-block; padding: 2px 10px; border-radius: 20px; font-size: 11.5px; font-weight: 600; font-family: 'JetBrains Mono', monospace; }
.badge-blue { background: rgba(88,166,255,0.15); color: var(--accent-blue); border: 1px solid rgba(88,166,255,0.3); }
.badge-green { background: rgba(63,185,80,0.15); color: var(--accent-green); border: 1px solid rgba(63,185,80,0.3); }
.badge-orange { background: rgba(247,129,102,0.15); color: var(--accent-orange); border: 1px solid rgba(247,129,102,0.3); }
.badge-purple { background: rgba(188,140,255,0.15); color: var(--accent-purple); border: 1px solid rgba(188,140,255,0.3); }
.badge-yellow { background: rgba(227,179,65,0.15); color: var(--accent-yellow); border: 1px solid rgba(227,179,65,0.3); }
.badge-teal { background: rgba(57,211,195,0.15); color: var(--accent-teal); border: 1px solid rgba(57,211,195,0.3); }
.badge-gray { background: rgba(139,148,158,0.15); color: var(--text-secondary); border: 1px solid var(--border); }
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 16px 0; }
.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin: 20px 0; }
.stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 20px; text-align: center; }
.stat-num { font-family: 'Sora', sans-serif; font-size: 36px; font-weight: 800; line-height: 1; margin-bottom: 6px; }
.stat-label { font-size: 12px; color: var(--text-muted); font-weight: 500; }
.svg-diagram { margin: 24px 0; }
.diagram-caption { font-size: 12px; color: var(--text-muted); text-align: center; margin-top: 10px; font-style: italic; }
.mermaid-wrap { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 28px 20px 16px; margin: 20px 0; overflow-x: auto; }
h3 { font-family: 'Sora', sans-serif; font-size: 17px; font-weight: 600; color: var(--text-primary); margin: 28px 0 12px; }
h4 { font-family: 'Sora', sans-serif; font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; }
.hl { color: var(--accent-purple); font-weight: 500; }
.hl-green { color: var(--accent-green); font-weight: 500; }
.hl-blue { color: var(--accent-blue); font-weight: 500; }
.port { font-family: 'JetBrains Mono', monospace; background: rgba(88,166,255,0.1); color: var(--accent-blue); padding: 1px 6px; border-radius: 4px; font-size: 13px; }
.bullet-list { list-style: none; padding: 0; }
.bullet-list li { padding: 6px 0 6px 20px; font-size: 13.5px; color: var(--text-secondary); line-height: 1.6; position: relative; }
.bullet-list li::before { content: '▸'; position: absolute; left: 0; color: var(--accent-blue); font-size: 11px; top: 9px; }
.step-list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.step-list li { display: flex; align-items: flex-start; gap: 14px; font-size: 13.5px; color: var(--text-secondary); line-height: 1.6; }
.step-num { width: 24px; height: 24px; border-radius: 50%; background: rgba(88,166,255,0.15); border: 1px solid rgba(88,166,255,0.3); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 700; color: var(--accent-blue); flex-shrink: 0; font-family: 'JetBrains Mono', monospace; margin-top: 2px; }
.qa-block { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 20px; margin-bottom: 16px; }
.qa-q { font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 10px; display: flex; gap: 10px; align-items: flex-start; }
.qa-a { font-size: 13.5px; color: var(--text-secondary); line-height: 1.7; padding-left: 4px; }
.qa-label { background: rgba(88,166,255,0.15); color: var(--accent-blue); padding: 2px 8px; border-radius: 6px; font-size: 11px; font-family: 'JetBrains Mono', monospace; font-weight: 700; flex-shrink: 0; margin-top: 2px; }
.divider { height: 1px; background: var(--border); margin: 40px 0; }
.author-section { background: linear-gradient(135deg, #161b22, #1c2333); border: 1px solid var(--border); border-radius: 16px; padding: 36px; margin-top: 60px; }
.author-card { display: flex; gap: 20px; align-items: flex-start; }
.author-avatar { width: 56px; height: 56px; background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple)); border-radius: 14px; display: flex; align-items: center; justify-content: center; font-size: 26px; flex-shrink: 0; }
.author-name { font-family: 'Sora', sans-serif; font-size: 18px; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; }
.author-title { font-size: 13px; color: var(--accent-blue); margin-bottom: 12px; }
.author-bio { font-size: 13.5px; color: var(--text-secondary); line-height: 1.7; margin-bottom: 14px; }
.tech-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.author-email { color: var(--accent-teal); font-size: 13px; text-decoration: none; }
@media (max-width: 768px) {
.sidebar { display: none; }
.main-content { margin-left: 0; max-width: 100vw; }
.top-header { padding: 30px 20px; }
.content-area { padding: 20px; }
.grid-2, .grid-3 { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<!-- ── SIDEBAR ── -->
<nav class="sidebar">
<div class="sidebar-header">
<div class="sidebar-logo">
<div class="logo-icon">🗄️</div>
<span>NetApp ONTAP</span>
</div>
<div class="sidebar-subtitle">Tutorial 3 — Controller Architecture</div>
</div>
<div class="toc-nav">
<div class="toc-section-label">Overview</div>
<a href="#intro" class="toc-link"><span class="toc-num">00</span> What This Tutorial Covers</a>
<div class="toc-section-label">Part I — Controller Anatomy</div>
<a href="#ports" class="toc-link"><span class="toc-num">01</span> External Ports Overview</a>
<a href="#console" class="toc-link sub"><span class="toc-num">↳</span> Console / Serial Port</a>
<a href="#sp" class="toc-link sub"><span class="toc-num">↳</span> Service Processor (SP)</a>
<a href="#e0m" class="toc-link sub"><span class="toc-num">↳</span> E0M Management Port</a>
<a href="#net-san" class="toc-link sub"><span class="toc-num">↳</span> NAS, SAN & SAS Ports</a>
<div class="toc-section-label">Part II — Internal Components</div>
<a href="#cache-nvram" class="toc-link"><span class="toc-num">02</span> Cache & NVRAM</a>
<a href="#pam" class="toc-link"><span class="toc-num">03</span> Flash Cache (PAM2)</a>
<a href="#boot" class="toc-link"><span class="toc-num">04</span> Boot / Flash Module</a>
<div class="toc-section-label">Part III — Cluster Setup</div>
<a href="#lab" class="toc-link"><span class="toc-num">05</span> Lab Environment</a>
<a href="#initial-config" class="toc-link"><span class="toc-num">06</span> Initial Configuration</a>
<div class="toc-section-label">Part IV — CLI Essentials</div>
<a href="#cli" class="toc-link"><span class="toc-num">07</span> CLI Navigation & Commands</a>
<div class="toc-section-label">Exam Prep</div>
<a href="#interview" class="toc-link"><span class="toc-num">08</span> Interview & Exam Q&A</a>
<a href="#bestpractice" class="toc-link"><span class="toc-num">09</span> Best Practices</a>
</div>
</nav>
<!-- ── MAIN ── -->
<div class="main-content">
<header class="top-header">
<div class="header-badge">📘 TUTORIAL 03 · ONTAP SERIES</div>
<h1 class="main-title">Controller Architecture<br>& Cluster Setup</h1>
<p class="header-desc">Physical anatomy of an ONTAP controller, I/O internals, and building a two-node cluster from scratch via CLI.</p>
<div class="header-meta">
<div class="meta-chip"><span class="dot" style="background:var(--accent-blue)"></span> Intermediate Level</div>
<div class="meta-chip"><span class="dot" style="background:var(--accent-green)"></span> FAS & AFF Platforms</div>
<div class="meta-chip"><span class="dot" style="background:var(--accent-purple)"></span> ONTAP 9.7+</div>
</div>
</header>
<div class="content-area">
<!-- ════════ INTRO ════════ -->
<section class="section" id="intro">
<div class="section-header">
<div class="section-icon icon-blue">🚀</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 00</div>
<h2>What This Tutorial Covers</h2>
</div>
</div>
<p>This tutorial covers the physical and logical anatomy of an ONTAP storage controller — ports, cache, NVRAM, PAM2, and the boot module — then walks through building a two-node HA cluster via CLI.</p>
<div class="grid-3">
<div class="stat-card"><div class="stat-num" style="color:var(--accent-blue)">3</div><div class="stat-label">Key Ports on Every Controller</div></div>
<div class="stat-card"><div class="stat-num" style="color:var(--accent-green)">4</div><div class="stat-label">Core Internal Components</div></div>
<div class="stat-card"><div class="stat-num" style="color:var(--accent-purple)">10s</div><div class="stat-label">Consistency Point Interval</div></div>
</div>
</section>
<!-- ════════ PORTS OVERVIEW ════════ -->
<section class="section" id="ports">
<div class="section-header">
<div class="section-icon icon-teal">🔌</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 01</div>
<h2>External Ports Overview</h2>
</div>
</div>
<p>Every NetApp controller exposes ports across three categories: <span class="hl">management & console</span>, <span class="hl-green">data connectivity</span> (NAS/SAN), and <span class="hl-blue">backend shelf connectivity</span>.</p>
<div class="svg-diagram">
<svg viewBox="0 0 820 220" xmlns="http://www.w3.org/2000/svg" width="100%" style="max-width:820px">
<rect x="20" y="40" width="780" height="140" rx="12" fill="#1c2333" stroke="#30363d" stroke-width="2"/>
<text x="410" y="30" text-anchor="middle" font-family="Sora,sans-serif" font-size="13" fill="#8b949e" font-weight="600">ONTAP STORAGE CONTROLLER — EXTERNAL PORTS</text>
<rect x="50" y="70" width="110" height="80" rx="8" fill="#0d2035" stroke="#39d3c3" stroke-width="1.5"/>
<text x="105" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#39d3c3" font-weight="700">CONSOLE</text>
<text x="105" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">Serial / RS-232</text>
<rect x="88" y="118" width="34" height="20" rx="4" fill="#30363d" stroke="#39d3c3" stroke-width="1"/>
<text x="105" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#39d3c3">e0c</text>
<rect x="185" y="70" width="110" height="80" rx="8" fill="#0d2035" stroke="#bc8cff" stroke-width="1.5"/>
<text x="240" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#bc8cff" font-weight="700">SERVICE PROC</text>
<text x="240" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">SP / RLM / BMC</text>
<rect x="222" y="118" width="34" height="20" rx="4" fill="#30363d" stroke="#bc8cff" stroke-width="1"/>
<text x="240" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#bc8cff">chip</text>
<rect x="320" y="70" width="110" height="80" rx="8" fill="#0d2035" stroke="#58a6ff" stroke-width="1.5"/>
<text x="375" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#58a6ff" font-weight="700">E0M</text>
<text x="375" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">Mgmt Port</text>
<rect x="357" y="118" width="34" height="20" rx="4" fill="#30363d" stroke="#58a6ff" stroke-width="1"/>
<text x="375" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#58a6ff">100Mb</text>
<rect x="455" y="70" width="110" height="80" rx="8" fill="#0d2035" stroke="#3fb950" stroke-width="1.5"/>
<text x="510" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#3fb950" font-weight="700">NAS PORTS</text>
<text x="510" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">e0a/e0b/e0d…</text>
<rect x="488" y="118" width="44" height="20" rx="4" fill="#30363d" stroke="#3fb950" stroke-width="1"/>
<text x="510" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#3fb950">1/10/25GbE</text>
<rect x="590" y="70" width="80" height="80" rx="8" fill="#0d2035" stroke="#f78166" stroke-width="1.5"/>
<text x="630" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#f78166" font-weight="700">SAN</text>
<text x="630" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">FC / iSCSI</text>
<rect x="614" y="118" width="32" height="20" rx="4" fill="#30363d" stroke="#f78166" stroke-width="1"/>
<text x="630" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#f78166">HBA</text>
<rect x="690" y="70" width="85" height="80" rx="8" fill="#0d2035" stroke="#e3b341" stroke-width="1.5"/>
<text x="733" y="95" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#e3b341" font-weight="700">SAS</text>
<text x="733" y="110" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">Disk Shelves</text>
<rect x="715" y="118" width="36" height="20" rx="4" fill="#30363d" stroke="#e3b341" stroke-width="1"/>
<text x="733" y="132" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#e3b341">backend</text>
<text x="105" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Initial config</text>
<text x="240" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Remote console</text>
<text x="375" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Day-to-day mgmt</text>
<text x="510" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">NFS/CIFS/SMB</text>
<text x="630" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">FC/iSCSI</text>
<text x="733" y="175" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Shelf link</text>
</svg>
<div class="diagram-caption">Figure 1 — Controller external ports grouped by function</div>
</div>
<div id="console"></div>
<h3>🖥️ Console / Serial Port</h3>
<p>Used for <span class="hl">initial out-of-band access</span> before any IP is assigned. Connect via serial cable to launch the cluster setup wizard. Baud rate must be set to <strong>115200</strong>. In production, this port is used only during first setup or emergency recovery.</p>
<div id="sp"></div>
<h3>🔧 Service Processor (SP / RLM / BMC)</h3>
<p>An independent management chip embedded on the controller board. Operates via a dedicated 1GbE interface, independently from ONTAP — so it remains accessible even when the OS is offline, rebooting, or during hardware POST.</p>
<div class="card">
<div class="card-title">🆚 SP vs E0M — When to Use Which</div>
<table class="spec-table">
<thead><tr><th>Scenario</th><th>Use SP</th><th>Use E0M</th></tr></thead>
<tbody>
<tr><td>Normal CLI administration</td><td>—</td><td><span class="badge badge-green">✓ Preferred</span></td></tr>
<tr><td>Controller rebooting / upgrading</td><td><span class="badge badge-blue">✓ Required</span></td><td>—</td></tr>
<tr><td>Controller powered off</td><td><span class="badge badge-blue">✓ Works</span></td><td><span class="badge badge-orange">✗ Offline</span></td></tr>
<tr><td>Hardware POST monitoring</td><td><span class="badge badge-blue">✓ Works</span></td><td>—</td></tr>
</tbody>
</table>
</div>
<div id="e0m"></div>
<h3>🌐 Management Port — E0M</h3>
<p>The <span class="port">E0M</span> is a dedicated 100 Mbps management-only interface — it cannot carry data traffic by design. Once an IP is configured during initial setup, <span class="hl-green">90% of daily operations</span> use SSH over this port.</p>
<div id="net-san"></div>
<h3>📡 NAS, SAN & SAS Ports</h3>
<table class="spec-table">
<thead><tr><th>Port Type</th><th>Protocol</th><th>Purpose</th><th>Port Count</th></tr></thead>
<tbody>
<tr><td><span class="badge badge-green">NAS Ports</span></td><td>NFS, CIFS/SMB</td><td>File-level storage over Ethernet</td><td>4–12</td></tr>
<tr><td><span class="badge badge-orange">SAN Ports</span></td><td>FC, iSCSI, FCoE</td><td>Block-level storage over SAN</td><td>2–8 (HBA)</td></tr>
<tr><td><span class="badge badge-yellow">SAS Ports</span></td><td>SAS</td><td>Disk shelf back-end connectivity</td><td>2–4 per loop</td></tr>
<tr><td><span class="badge badge-blue">Cluster Ports</span></td><td>10GbE private</td><td>HA heartbeat & NVRAM sync</td><td>2–4 per node</td></tr>
</tbody>
</table>
<div id="unified"></div>
<div class="callout tip">
<div class="callout-icon">🔮</div>
<div class="callout-content">
<div class="callout-title">Unified Ports (UTA2)</div>
<div class="callout-text">Some controllers feature <strong>Unified Target Adapters (UTA2)</strong> — SFP+ slots that can operate as either 10GbE NAS or 16Gb FC SAN, depending on the transceiver and software persona. One physical port, two identities — but not simultaneously.</div>
</div>
</div>
</section>
<!-- ════════ CACHE & NVRAM ════════ -->
<section class="section" id="cache-nvram">
<div class="section-header">
<div class="section-icon icon-purple">🧠</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 02</div>
<h2>Cache & NVRAM — The I/O Engine</h2>
</div>
</div>
<p><span class="hl-blue">Cache (DRAM)</span> and <span class="hl">NVRAM</span> form ONTAP's high-speed staging layer — absorbing writes, acknowledging them immediately, and persisting to disk in the background while protecting against data loss.</p>
<div class="svg-diagram">
<svg viewBox="0 0 820 340" xmlns="http://www.w3.org/2000/svg" width="100%" style="max-width:820px">
<text x="410" y="22" text-anchor="middle" font-family="Sora,sans-serif" font-size="13" fill="#8b949e" font-weight="600">HA PAIR — CACHE & NVRAM INTERNAL LAYOUT</text>
<rect x="20" y="35" width="360" height="280" rx="12" fill="#161b22" stroke="#58a6ff" stroke-width="1.5"/>
<text x="200" y="60" text-anchor="middle" font-family="Sora,sans-serif" font-size="12" fill="#58a6ff" font-weight="700">CONTROLLER-A (stor-a01)</text>
<rect x="40" y="75" width="155" height="100" rx="8" fill="#1c2333" stroke="#bc8cff" stroke-width="1.5"/>
<text x="118" y="97" text-anchor="middle" font-family="Sora,sans-serif" font-size="11" fill="#bc8cff" font-weight="600">CACHE (DRAM)</text>
<rect x="50" y="105" width="63" height="55" rx="5" fill="#21283a" stroke="#bc8cff" stroke-width="1"/>
<text x="82" y="121" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#bc8cff">WRITE</text>
<text x="82" y="134" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">partition</text>
<rect x="125" y="105" width="60" height="55" rx="5" fill="#21283a" stroke="#bc8cff" stroke-width="1"/>
<text x="155" y="121" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#bc8cff">READ</text>
<text x="155" y="134" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#6e7681">partition</text>
<rect x="210" y="75" width="150" height="100" rx="8" fill="#1c2333" stroke="#3fb950" stroke-width="1.5"/>
<text x="285" y="97" text-anchor="middle" font-family="Sora,sans-serif" font-size="11" fill="#3fb950" font-weight="600">NVRAM</text>
<rect x="218" y="105" width="62" height="55" rx="5" fill="#21283a" stroke="#3fb950" stroke-width="1"/>
<text x="249" y="118" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">LOCAL P1</text>
<text x="249" y="130" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">active</text>
<rect x="290" y="105" width="62" height="55" rx="5" fill="#21283a" stroke="#3fb950" stroke-width="1"/>
<text x="321" y="118" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">LOCAL P2</text>
<text x="321" y="130" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">standby</text>
<rect x="40" y="195" width="155" height="50" rx="6" fill="#0d1f12" stroke="#3fb950" stroke-width="1" stroke-dasharray="4,3"/>
<text x="118" y="216" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">NVRAM REMOTE RESERVE</text>
<text x="118" y="230" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">for CONTROLLER-B data</text>
<rect x="210" y="195" width="150" height="50" rx="6" fill="#0d1f12" stroke="#e3b341" stroke-width="1" stroke-dasharray="4,3"/>
<text x="285" y="216" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#e3b341">BATTERY BACKUP</text>
<text x="285" y="230" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">protects uncommitted data</text>
<rect x="440" y="35" width="360" height="280" rx="12" fill="#161b22" stroke="#f78166" stroke-width="1.5"/>
<text x="620" y="60" text-anchor="middle" font-family="Sora,sans-serif" font-size="12" fill="#f78166" font-weight="700">CONTROLLER-B (stor-b01)</text>
<rect x="460" y="75" width="155" height="100" rx="8" fill="#1c2333" stroke="#bc8cff" stroke-width="1.5"/>
<text x="538" y="97" text-anchor="middle" font-family="Sora,sans-serif" font-size="11" fill="#bc8cff" font-weight="600">CACHE (DRAM)</text>
<rect x="470" y="105" width="63" height="55" rx="5" fill="#21283a" stroke="#bc8cff" stroke-width="1"/>
<text x="502" y="121" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#bc8cff">WRITE</text>
<rect x="545" y="105" width="60" height="55" rx="5" fill="#21283a" stroke="#bc8cff" stroke-width="1"/>
<text x="575" y="121" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#bc8cff">READ</text>
<rect x="630" y="75" width="150" height="100" rx="8" fill="#1c2333" stroke="#3fb950" stroke-width="1.5"/>
<text x="705" y="97" text-anchor="middle" font-family="Sora,sans-serif" font-size="11" fill="#3fb950" font-weight="600">NVRAM</text>
<rect x="638" y="105" width="62" height="55" rx="5" fill="#21283a" stroke="#3fb950" stroke-width="1"/>
<text x="669" y="118" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">LOCAL P1</text>
<rect x="710" y="105" width="62" height="55" rx="5" fill="#21283a" stroke="#3fb950" stroke-width="1"/>
<text x="741" y="118" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">LOCAL P2</text>
<rect x="460" y="195" width="155" height="50" rx="6" fill="#0d1f12" stroke="#3fb950" stroke-width="1" stroke-dasharray="4,3"/>
<text x="538" y="216" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#3fb950">NVRAM REMOTE RESERVE</text>
<text x="538" y="230" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">for CONTROLLER-A data</text>
<rect x="630" y="195" width="150" height="50" rx="6" fill="#0d1f12" stroke="#e3b341" stroke-width="1" stroke-dasharray="4,3"/>
<text x="705" y="216" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#e3b341">BATTERY BACKUP</text>
<line x1="380" y1="180" x2="440" y2="180" stroke="#58a6ff" stroke-width="2" stroke-dasharray="5,3"/>
<polygon points="440,175 450,180 440,185" fill="#58a6ff"/>
<polygon points="380,175 370,180 380,185" fill="#58a6ff"/>
<text x="410" y="173" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#58a6ff">HA INTERCONNECT</text>
<text x="410" y="198" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="8" fill="#6e7681">NVRAM mirror sync</text>
<rect x="130" y="270" width="140" height="35" rx="6" fill="#161b22" stroke="#e3b341" stroke-width="1.5"/>
<text x="200" y="291" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#e3b341">💾 DISK SHELVES</text>
<line x1="200" y1="265" x2="200" y2="270" stroke="#e3b341" stroke-width="1.5"/>
<rect x="550" y="270" width="140" height="35" rx="6" fill="#161b22" stroke="#e3b341" stroke-width="1.5"/>
<text x="620" y="291" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#e3b341">💾 DISK SHELVES</text>
<line x1="620" y1="265" x2="620" y2="270" stroke="#e3b341" stroke-width="1.5"/>
</svg>
<div class="diagram-caption">Figure 2 — HA pair cache & NVRAM layout with mirrored remote reserves</div>
</div>
<div id="write-flow"></div>
<h3>✍️ Write I/O Flow & Consistency Point (CP)</h3>
<p>Writes never go directly to disk. ONTAP stages data through Cache and NVRAM, then commits to disk every 10 seconds via the Consistency Point process. While one NVRAM partition flushes to disk, the other absorbs new writes — ensuring zero-interruption throughput.</p>
<div class="mermaid-wrap">
<div class="mermaid">
flowchart LR
A([Host Write Request]) --> B{NAS or SAN?}
B -- NAS/Ethernet --> C[NAS Ports]
B -- SAN/FC-iSCSI --> D[SAN HBA Ports]
C --> E[Write Partition of Cache]
D --> E
E --> F[NVRAM Local P1 or P2]
E --> G[Partner NVRAM Remote Reserve]
F --> H{10-second timer}
G --> H
H -- CP triggered --> I[Consistency Point Process]
I --> J[Data committed to Disk Shelves via SAS]
I --> K[Cache + NVRAM flushed]
H -- incoming during flush --> L[NVRAM P2 takes over intake]
L --> M[Roles swap every 10s]
style A fill:#1c2333,stroke:#58a6ff,color:#e6edf3
style I fill:#1c2333,stroke:#3fb950,color:#e6edf3
style J fill:#1c2333,stroke:#e3b341,color:#e6edf3
</div>
<div class="diagram-caption">Figure 3 — Write I/O flow from host to disk, including CP trigger cycle</div>
</div>
<div class="callout danger">
<div class="callout-icon">🔴</div>
<div class="callout-content">
<div class="callout-title">Power Loss Protection</div>
<div class="callout-text">On primary controller failure, the partner reads its NVRAM remote reserve and commits pending writes. If both controllers lose power, NVRAM battery backup offloads data to vault drives; on restart, ONTAP reads the vault and completes the commit.</div>
</div>
</div>
<div id="read-flow"></div>
<h3>📖 Read I/O & the Read Cache</h3>
<p>Read requests are served from the DRAM read cache when hot data is available. On a cache miss, ONTAP uses PAM logs to locate data on the exact shelf/disk, avoiding a full scan.</p>
<div class="mermaid-wrap">
<div class="mermaid">
flowchart TD
A([Host Read Request]) --> B[Controller NAS/SAN Ports]
B --> C{Found in Read Cache?}
C -- YES: Read Hit --> D[Return data from DRAM cache]
D --> E[✅ Low latency response]
C -- NO: Read Miss --> F[Check PAM / Flash Cache logs]
F --> G{Location found in PAM?}
G -- YES --> H[Go directly to shelf + disk location]
G -- NO: Full scan --> I[Scan all shelves and disks]
H --> J[Copy data to Read Cache]
I --> J
J --> K[Serve data to host]
style C fill:#1c2333,stroke:#bc8cff,color:#e6edf3
style E fill:#1c2333,stroke:#3fb950,color:#e6edf3
style F fill:#1c2333,stroke:#39d3c3,color:#e6edf3
</div>
<div class="diagram-caption">Figure 4 — Read I/O path: cache hit vs. miss, and PAM-assisted lookup</div>
</div>
</section>
<!-- ════════ PAM ════════ -->
<section class="section" id="pam">
<div class="section-header">
<div class="section-icon icon-teal">⚡</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 03</div>
<h2>Flash Cache — Performance Acceleration Module (PAM2)</h2>
</div>
</div>
<p><span class="hl-blue">PAM2</span> is a large NAND-based PCIe card that acts as a read-acceleration index. On a cache miss, ONTAP queries PAM's NV logs to locate data on the exact shelf and disk — skipping a full shelf scan.</p>
<div class="grid-2">
<div class="card">
<div class="card-title">📊 PAM2 Sizing</div>
<table class="spec-table">
<thead><tr><th>Controller Tier</th><th>PAM2 Capacity</th></tr></thead>
<tbody>
<tr><td>Entry (FAS2600)</td><td><span class="badge badge-gray">512 GB</span></td></tr>
<tr><td>Mid-Range (FAS8200)</td><td><span class="badge badge-blue">1 TB</span></td></tr>
<tr><td>High-End (FAS9000)</td><td><span class="badge badge-purple">2 TB</span></td></tr>
</tbody>
</table>
</div>
<div class="card">
<div class="card-title">📋 What PAM Stores (NV Logs)</div>
<ul class="bullet-list">
<li>Metadata of data flushed from NVRAM after each CP cycle</li>
<li>Metadata of data evicted from the read cache</li>
<li>Exact shelf and disk location pointers</li>
<li>Analogy: a book index — jump to page 950, don't read cover-to-cover</li>
</ul>
</div>
</div>
<div class="callout info">
<div class="callout-icon">📌</div>
<div class="callout-content">
<div class="callout-title">Component Roles — Quick Reference</div>
<div class="callout-text">
<strong>Cache (DRAM)</strong>: Reads & writes — hot staging layer.<br>
<strong>NVRAM</strong>: Write path only — durability journal + HA mirror.<br>
<strong>PAM2 / Flash Cache</strong>: Read path only — NV log index for cache misses.
</div>
</div>
</div>
</section>
<!-- ════════ BOOT MODULE ════════ -->
<section class="section" id="boot">
<div class="section-header">
<div class="section-icon icon-orange">💾</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 04</div>
<h2>Boot / Flash Module — Where ONTAP Lives</h2>
</div>
</div>
<p>A dedicated PCIe flash module stores the ONTAP OS image with a <span class="hl">dual-partition design</span>: one active partition runs the current version; the other holds the previous version for instant rollback.</p>
<div class="mermaid-wrap">
<div class="mermaid">
flowchart LR
subgraph Flash["Flash / Boot Module"]
P1["Partition A\n(Current Version)\ne.g., ONTAP 9.12.1"]
P2["Partition B\n(Previous Version)\ne.g., ONTAP 9.11.1"]
end
subgraph Upgrade["ONTAP Upgrade Process"]
U1[Download target image] --> U2[Write to inactive partition]
U2 --> U3[Reboot controller]
U3 --> U4[Boot from updated partition]
U4 --> U5[Partition roles swap]
end
subgraph Rollback["Rollback if Needed"]
R1[Identify issue] --> R2[Boot from previous partition]
R2 --> R3[Roles swap back]
end
P2 -.->|upgrade target| U2
P1 -.->|stays running until reboot| U3
style Flash fill:#161b22,stroke:#f78166
style Upgrade fill:#161b22,stroke:#3fb950
style Rollback fill:#161b22,stroke:#e3b341
</div>
<div class="diagram-caption">Figure 5 — Dual-partition boot module layout enabling safe upgrades & instant rollback</div>
</div>
<div class="callout success">
<div class="callout-icon">🔄</div>
<div class="callout-content">
<div class="callout-title">Why Two Partitions?</div>
<div class="callout-text">The new ONTAP image is written to the inactive partition; the controller keeps running the current version. After a reboot, the updated partition becomes active. The previous partition remains intact for a one-reboot rollback if issues arise.</div>
</div>
</div>
</section>
<!-- ════════ LAB ENV ════════ -->
<section class="section" id="lab">
<div class="section-header">
<div class="section-icon icon-green">🧪</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 05</div>
<h2>Hands-On Lab Environment</h2>
</div>
</div>
<p>Use the <strong>"Cluster Setup — ONTAP 9.7"</strong> lab template from NetApp's virtual lab portal. It provisions a two-node HA pair with shared disk shelves, a jump host, domain controller, Linux client, and Windows/AD server.</p>
<div class="card">
<div class="card-title">🏗️ Lab Topology</div>
<div class="mermaid-wrap" style="padding:16px 10px 8px; margin:0;">
<div class="mermaid">
graph TB
JH["Jump Host\n(Windows Server)\nIP: 10.50.1.10"] --> CT1
JH --> CT2
JH --> LX
JH --> DC
subgraph Cluster["stor-cluster01 — 2-Node HA Pair"]
CT1["Controller A\nstor-a01\nMgmt: 10.50.1.11"]
CT2["Controller B\nstor-b01\nMgmt: 10.50.1.12"]
CT1 <-->|HA Interconnect| CT2
end
CT1 --- DS[("Shared Disk Shelves")]
CT2 --- DS
LX["Linux Client\nIP: 10.50.1.20"]
DC["Active Directory DC\ndomain: lab.internal\nIP: 10.50.1.5"]
style Cluster fill:#161b22,stroke:#58a6ff
</div>
</div>
<div class="diagram-caption">Figure 6 — Lab network topology (IPs are representative examples)</div>
</div>
</section>
<!-- ════════ INITIAL CONFIG ════════ -->
<section class="section" id="initial-config">
<div class="section-header">
<div class="section-icon icon-blue">⚙️</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 06</div>
<h2>Initial Configuration & Cluster Setup</h2>
</div>
</div>
<p>A factory-fresh controller has no configuration. First access is always via the console port. The setup wizard guides you through assigning IPs, naming the cluster, and installing licenses.</p>
<div id="cluster-create"></div>
<h3>🔨 Creating the First Cluster Node (Key Steps)</h3>
<ul class="step-list">
<li><div class="step-num">1</div>Connect console → hit <strong>Enter</strong> → type <code style="color:var(--accent-green)">yes</code> to start wizard.</li>
<li><div class="step-num">2</div>Select node management port (<span class="port">E0M</span> in production, <span class="port">e0c</span> in lab). Assign node mgmt IP, mask, gateway.</li>
<li><div class="step-num">3</div>Choose <strong>Create</strong> (not Join). Select <strong>No</strong> for single-node — we're building an HA pair.</li>
<li><div class="step-num">4</div>Set <code style="color:var(--accent-orange)">admin</code> password, cluster name, cluster management IP, DNS domain & server.</li>
<li><div class="step-num">5</div>Install required protocol licenses (NFS, CIFS, FCP, iSCSI, SnapMirror) when prompted.</li>
</ul>
<div class="code-block">
<div class="code-header">
<span class="code-lang">ONTAP CLI — Cluster Creation Wizard</span>
<div class="code-dots"><span class="dot-red"></span><span class="dot-yellow"></span><span class="dot-green"></span></div>
</div>
<div class="code-body">
<span class="comment"># Console login — hit Enter to start wizard</span>
<span class="output">Do you want to proceed? {yes}: </span><span class="value">yes</span>
<span class="output">Enter the node management interface port [e0M]: </span><span class="value">e0c</span>
<span class="output">Enter the node management interface IP address: </span><span class="value">10.50.1.11</span>
<span class="output">Enter the node management interface netmask: </span><span class="value">255.255.255.0</span>
<span class="output">Enter the node management interface default gateway: </span><span class="value">10.50.1.1</span>
<span class="output">Create a new cluster or join an existing cluster? {create, join}: </span><span class="value">create</span>
<span class="output">Use as single-node cluster? {yes, no} [no]: </span><span class="value">no</span>
<span class="output">Enter the cluster administrator password: </span><span class="value">************</span>
<span class="output">Enter the cluster name: </span><span class="value">stor-cluster01</span>
<span class="output">Enter the cluster management interface IP: </span><span class="value">10.50.1.100</span>
<span class="output">DNS domain names: </span><span class="value">lab.internal</span>
<span class="output">Name server IP addresses: </span><span class="value">10.50.1.5</span>
<span class="cmd">stor-cluster01::> </span>
</div>
</div>
<div id="add-node"></div>
<h3>➕ Adding the Second Node</h3>
<p>Open a console to Controller B. When prompted, choose <strong>Join</strong> and provide a cluster private network IP from Controller A (169.254.x.x range) so the node can discover the existing cluster.</p>
<div class="code-block">
<div class="code-header">
<span class="code-lang">ONTAP CLI — Joining Second Node</span>
<div class="code-dots"><span class="dot-red"></span><span class="dot-yellow"></span><span class="dot-green"></span></div>
</div>
<div class="code-body">
<span class="output">Enter the node management interface port [e0M]: </span><span class="value">e0c</span>
<span class="output">Enter the node management interface IP address: </span><span class="value">10.50.1.12</span>
<span class="output">Create a new cluster or join an existing cluster? {create, join}: </span><span class="value">join</span>
<span class="output">Enter IP of an interface on the private cluster network: </span><span class="value">169.254.10.1</span>
<span class="output">This node has joined the cluster.</span>
<span class="cmd">ssh admin@10.50.1.100</span>
<span class="cmd">stor-cluster01::> </span>
</div>
</div>
<div id="licenses"></div>
<h3>🔑 License Management</h3>
<p>ONTAP uses feature-based licensing. Core protocols (NFS, CIFS, FCP, iSCSI) and data features (SnapMirror, FlexClone) each require a separate key. Licenses are installed with no downtime.</p>
<div class="code-block">
<div class="code-header">
<span class="code-lang">ONTAP CLI — License Commands</span>
<div class="code-dots"><span class="dot-red"></span><span class="dot-yellow"></span><span class="dot-green"></span></div>
</div>
<div class="code-body">
<span class="cmd">system license add</span> <span class="param">-license-code</span> <span class="value">XXXX-YYYY-ZZZZ-AAAA</span>
<span class="cmd">system license show</span>
</div>
</div>
<div id="mgmt-ip"></div>
<h3>🌐 Node Management IP vs Cluster Management IP</h3>
<div class="svg-diagram">
<svg viewBox="0 0 740 200" xmlns="http://www.w3.org/2000/svg" width="100%" style="max-width:740px">
<text x="370" y="20" text-anchor="middle" font-family="Sora,sans-serif" font-size="13" fill="#8b949e" font-weight="600">CLUSTER vs NODE MANAGEMENT IPs</text>
<rect x="260" y="35" width="220" height="55" rx="8" fill="#0d2035" stroke="#58a6ff" stroke-width="2"/>
<text x="370" y="57" text-anchor="middle" font-family="Sora,sans-serif" font-size="12" fill="#58a6ff" font-weight="700">Cluster Management IP</text>
<text x="370" y="75" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" fill="#a5d6ff">10.50.1.100</text>
<text x="370" y="103" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">One per cluster — accesses any node</text>
<rect x="60" y="120" width="200" height="55" rx="8" fill="#161b22" stroke="#3fb950" stroke-width="1.5"/>
<text x="160" y="142" text-anchor="middle" font-family="Sora,sans-serif" font-size="12" fill="#3fb950" font-weight="700">stor-a01 Node Mgmt</text>
<text x="160" y="160" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" fill="#79c0ff">10.50.1.11</text>
<rect x="480" y="120" width="200" height="55" rx="8" fill="#161b22" stroke="#3fb950" stroke-width="1.5"/>
<text x="580" y="142" text-anchor="middle" font-family="Sora,sans-serif" font-size="12" fill="#3fb950" font-weight="700">stor-b01 Node Mgmt</text>
<text x="580" y="160" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" fill="#79c0ff">10.50.1.12</text>
<line x1="300" y1="90" x2="200" y2="120" stroke="#484f58" stroke-width="1.5" stroke-dasharray="4,3"/>
<line x1="440" y1="90" x2="540" y2="120" stroke="#484f58" stroke-width="1.5" stroke-dasharray="4,3"/>
<text x="160" y="190" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Reach even when cluster mgmt moves</text>
<text x="580" y="190" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#6e7681">Reach even when cluster mgmt moves</text>
</svg>
<div class="diagram-caption">Figure 7 — Cluster management IP vs node management IPs — separate but complementary</div>
</div>
<table class="spec-table">
<thead><tr><th>IP Type</th><th>Count</th><th>Port Used</th><th>Survives Node Failover?</th></tr></thead>
<tbody>
<tr><td><span class="badge badge-blue">Cluster Management</span></td><td>1 per cluster</td><td>E0M on any node</td><td>Can be relocated to another node</td></tr>
<tr><td><span class="badge badge-green">Node Management</span></td><td>1 per node</td><td>E0M on that specific node</td><td>Tied to that node's hardware</td></tr>
</tbody>
</table>
</section>
<!-- ════════ CLI ════════ -->
<section class="section" id="cli">
<div class="section-header">
<div class="section-icon icon-yellow">💻</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 07</div>
<h2>ONTAP CLI Navigation & Key Commands</h2>
</div>
</div>
<p>ONTAP's CLI is a hierarchical shell. Use <span class="hl-green">Tab</span> at any point to see all available sub-commands. Use <code style="color:var(--accent-teal)">top</code> to jump to the root shell instantly.</p>
<div id="commands"></div>
<h3>📋 Essential Cluster & Node Commands</h3>
<div class="code-block">
<div class="code-header">
<span class="code-lang">ONTAP CLI — Essential Commands</span>
<div class="code-dots"><span class="dot-red"></span><span class="dot-yellow"></span><span class="dot-green"></span></div>
</div>
<div class="code-body">
<span class="comment"># Cluster health</span>
<span class="cmd">cluster show</span>
<span class="comment"># Node summary</span>
<span class="cmd">system node show</span>
<span class="comment"># Full node details (all attributes)</span>
<span class="cmd">system node show</span> <span class="param">-instance</span>
<span class="comment"># Select specific fields</span>
<span class="cmd">system node show</span> <span class="param">-fields</span> <span class="value">model,serial-number</span>
<span class="comment"># Installed licenses</span>
<span class="cmd">system license show</span>
<span class="comment"># CLI navigation</span>
<span class="cmd">cd ..</span> <span class="comment"># Go up one level</span>
<span class="cmd">top</span> <span class="comment"># Jump to root shell</span>
<span class="cmd"><Tab></span> <span class="comment"># Show all commands at current level</span>
</div>
</div>
<div class="callout tip">
<div class="callout-icon">💡</div>
<div class="callout-content">
<div class="callout-title">-instance vs -fields</div>
<div class="callout-text"><strong>-instance</strong>: Expands any <em>show</em> command to all attributes — useful for serial numbers, firmware, port stats. <strong>-fields</strong>: Filters output to specific columns — ideal for scripting and reporting.</div>
</div>
</div>
</section>
<!-- ════════ INTERVIEW Q&A ════════ -->
<section class="section" id="interview">
<div class="section-header">
<div class="section-icon icon-purple">🎯</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 08</div>
<h2>Interview & Exam Q&A</h2>
</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q1</span> Explain the three main management ports on a NetApp controller.</div>
<div class="qa-a"><strong>Console port</strong>: Initial out-of-band config before any IP is assigned; physical cable required. <strong>E0M</strong>: Dedicated 100 Mbps management port for daily SSH/HTTPS access. <strong>SP</strong>: Independent management chip accessible even when ONTAP is offline — critical during reboots, upgrades, or hardware faults.</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q2</span> How does ONTAP protect uncommitted write data on controller failure?</div>
<div class="qa-a">Writes are simultaneously staged to local Cache, local NVRAM, and the partner's NVRAM remote reserve via the HA interconnect. If the local controller fails, the partner commits pending data from its reserve. If both controllers lose power, NVRAM battery backup offloads data to vault drives for recovery on restart.</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q3</span> What is a Consistency Point and how often does it occur?</div>
<div class="qa-a">A CP is a background process that commits buffered writes from Cache and NVRAM to disk every <strong>10 seconds</strong>. While one NVRAM partition flushes to disk, the second simultaneously absorbs new client writes, ensuring continuous performance.</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q4</span> Node Management IP vs Cluster Management IP — what's the difference?</div>
<div class="qa-a">A <strong>Node Management IP</strong> is tied to a specific controller's hardware and always reaches that node. A <strong>Cluster Management IP</strong> is a single floating IP for the entire cluster — it's hosted on one node but can be relocated without changing the address. Most admin tasks use the cluster management IP.</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q5</span> What is Flash Cache (PAM2) and how does it improve reads?</div>
<div class="qa-a">PAM2 is a NAND flash PCIe card that stores NV logs — metadata recording exact shelf and disk locations of data flushed from cache or NVRAM. On a read miss, ONTAP queries PAM to seek directly to the data's location rather than scanning every shelf — like using an index instead of reading a book cover to cover.</div>
</div>
<div class="qa-block">
<div class="qa-q"><span class="qa-label">Q6</span> Why does the ONTAP boot module have two partitions?</div>
<div class="qa-a">The dual-partition design enables <strong>safe upgrades and instant rollback</strong>. The new image is written to the inactive partition while the controller runs from the current one. After a reboot, the updated partition becomes active. The previous partition remains intact for a one-reboot rollback.</div>
</div>
</section>
<!-- ════════ BEST PRACTICES ════════ -->
<section class="section" id="bestpractice">
<div class="section-header">
<div class="section-icon icon-green">✅</div>
<div class="section-title-wrap">
<div class="section-num">SECTION 09</div>
<h2>Best Practices Summary</h2>
</div>
</div>
<div class="grid-2">
<div class="card">
<div class="card-title">🔌 Port Management</div>
<ul class="bullet-list">
<li>Configure both Node and Cluster Management IPs on E0M — isolation from data traffic prevents mgmt blackouts.</li>
<li>Always assign a dedicated SP IP — it's your lifeline during upgrades and faults.</li>
<li>Assign UTA2 persona before cabling to avoid reconfiguration downtime.</li>
<li>Document all port-to-IP mappings immediately after initial setup.</li>
</ul>
</div>
<div class="card">
<div class="card-title">🧠 Cache & NVRAM</div>
<ul class="bullet-list">
<li>Never manually tune NVRAM partition assignments — these are factory-configured.</li>
<li>Monitor NVRAM battery health — a degraded battery risks data loss on dual-node failure.</li>
<li>Track read-hit rates weekly — high rates indicate good cache fit.</li>
<li>PAM2 is most impactful for large random-read working sets exceeding DRAM size.</li>
</ul>
</div>
<div class="card">
<div class="card-title">⚙️ Cluster Setup</div>
<ul class="bullet-list">
<li>Follow naming conventions — renaming cluster/nodes later is disruptive.</li>
<li>Obtain all IP assignments from the network team before starting setup.</li>
<li>Install all protocol licenses before provisioning storage.</li>
<li>Validate HA pair health (<code>storage failover show</code>) immediately after joining the second node.</li>
</ul>
</div>
<div class="card">
<div class="card-title">💻 CLI Productivity</div>
<ul class="bullet-list">
<li>Use <code>-instance</code> for deep troubleshooting, <code>-fields</code> for targeted reporting.</li>
<li>Use <code>top</code> to jump to root shell instead of multiple <code>cd ..</code> commands.</li>
<li>Pipe show commands to <code>| grep</code> for fast pattern matching.</li>
<li>Explore with Tab — ONTAP CLI is self-documenting.</li>
</ul>
</div>
</div>
</section>
<div class="divider"></div>
<!-- ════════ AUTHOR ════════ -->
<section class="section" id="about">
<div class="author-section">
<div class="author-card">
<div class="author-avatar">👨💻</div>
<div style="flex:1">
<div class="author-name">Mohammed Abdul</div>
<div class="author-title">Data Protection Architect · Hybrid Cloud Specialist</div>
<div class="author-bio">Mohammed Abdul is a Data Protection Architect with more than 10 years of experience in Hybrid Cloud, having worked with global clients across various industries. Specialises in enterprise backup, recovery, and data protection strategy across on-premises and cloud environments.</div>
<div class="tech-badges">
<span class="badge badge-blue">AWS</span>
<span class="badge badge-teal">Azure</span>
<span class="badge badge-green">GCP</span>
<span class="badge badge-orange">Commvault</span>
<span class="badge badge-purple">Veeam</span>
<span class="badge badge-yellow">NetBackup</span>
<span class="badge badge-gray">NetApp ONTAP</span>
</div>
<a class="author-email" href="mailto:abdul.md.20000102@gmail.com">✉️ abdul.md.20000102@gmail.com</a>
</div>
</div>
<div class="callout warning" style="margin-top: 28px">
<div class="callout-icon">📢</div>
<div class="callout-content">
<div class="callout-title">Disclaimer</div>
<div class="callout-text">This content is for educational purposes. All IPs, hostnames, and values are representative — replace with your environment's actual values. Always refer to official NetApp documentation and your organisation's change management procedures for production implementations. NetApp, ONTAP, FAS, AFF are trademarks of NetApp, Inc.</div>
</div>
</div>
</div>
</section>
</div><!-- /content-area -->
</div><!-- /main-content -->
<script>
mermaid.initialize({
startOnLoad: true,
theme: 'dark',
themeVariables: {
primaryColor: '#1c2333',
primaryTextColor: '#e6edf3',
primaryBorderColor: '#58a6ff',
lineColor: '#8b949e',
secondaryColor: '#161b22',
tertiaryColor: '#0d1117',
edgeLabelBackground: '#161b22',
clusterBkg: '#161b22',
clusterBorder: '#30363d',
nodeBorder: '#58a6ff',
mainBkg: '#1c2333',
fontFamily: 'JetBrains Mono, monospace',
fontSize: '12px'
}
});