Final project: build it, break it, fix it

This is where you put the whole course together. You’ll build a small but real setup from an empty cluster, prove it works from two clients, then let three faults loose on it and fix them using nothing but the troubleshooting order from Phase 4.

There’s no new theory here. The point is to practise the habits that matter on the job: build in a clean order, check from the client side, save a baseline, and when things break, find the cause before you touch anything.

Give yourself about two hours. Try each fault on your own before you read the answers at the end of the lab.

Where this lesson fits

Lesson 55 of 56 in NetApp ONTAP Storage Administration · Phase 5: Final project and career · Before this: Lesson 54, SnapMirror and takeover failures · Next: Lesson 56, NetApp interview questions

TimeYou needBy the end you can
2 hoursThe practice shell (Phase 4 setup not needed: you start from a reset)Build NFS and iSCSI storage end to end, then find and fix three faults on your own

What it is, in one line

The final project is a complete ONTAP job in one sitting: build an SVM that serves an NFS share to a Linux web server and a LUN to a database server, then troubleshoot three faults the way you would on a real night shift.

In Simple Words

A driving test, not another lesson

After weeks of driving lessons, the test doesn’t teach you anything new. The examiner watches you do everything in order: mirrors, signal, move off, park, and handle the surprise when a car pulls out in front of you.

This lesson is your driving test. The surprises are planted on purpose, and you pass when you can explain what went wrong, not when you get lucky with a fix.

Engineer's View

What you’ll build

One SVM, svm_fp, with a NAS LIF on node 01 and an iSCSI LIF on each node. NFS v3 and v4.1 are on. The SVM root lets the lab subnet read (to walk the namespace), and a separate export policy web_hosts gives read-write only to linux1 (192.168.56.21).

A 50 GB volume vol_web at /web serves the web files. A thin 60 GB volume vol_db on the other node holds a 50 GB LUN mapped to an igroup for rhel1, so the database server should see two paths: optimized through node 02, which owns the LUN, and non-optimized through node 01.

That covers aggregates, SVMs, LIFs, NFS exports, iSCSI, LUN masking and ALUA, the core of what a storage admin does every week.

How it works, step by step

1Build in layers

Aggregates first, then the SVM, then LIFs, then protocols, then volumes and LUNs, and access rules last. Building in this order means every command finds the thing it depends on.

ONTAP final project: build, prove, baseline and troubleshoot

2Prove it from the clients

ONTAP saying “Job succeeded” isn’t proof. A mount that can write a file and a multipath map with two paths are.

3Save a baseline

Before anything breaks, save the health list and the key show commands. Every fix later is a comparison against this.

ONTAP final project: the three planted faults and their fixes

4Troubleshoot in order

For each complaint: write the symptom, find the scope, check health, read events, then walk the layers (Lesson 47). Fix one thing at a time and check from the client after each fix.

ComplaintStart withLessons
NFS Permission deniedExport rules, check-access30, 49
LUN missingSession, igroup, mapping, LUN state48
Only one path, or slow pathLIFs on both nodes, ALUA24, 53

Hands-on lab: the full build and three faults

Before you run any command, double-check it

Read every command twice before you press Enter. Check the target: the server name, the user, the disk or device name, the path and the sizes. These commands are for learning and were tested in our lab, not on your system. At work, run the read-only commands first, follow your change process, make sure a backup exists, and ask a second person to check anything that changes or deletes data. You run them at your own risk.

This lab uses the SaatVedha ONTAP practice shell, our own learning tool. It is not NetApp software: real ONTAP output looks like this but is not identical.

1Reset and build

Reset the lab, create fp-build.txt with these lines, and run it:

storage aggregate create -aggregate aggr1_01 -node saat-cluster-01 -diskcount 8 -disktype SAS
storage aggregate create -aggregate aggr1_02 -node saat-cluster-02 -diskcount 8 -disktype SAS
vserver create -vserver svm_fp -aggregate aggr1_01 -rootvolume-security-style unix
network interface create -vserver svm_fp -lif fp_nas1 -service-policy default-data-files -home-node saat-cluster-01 -home-port e0c -address 192.168.56.150 -netmask 255.255.255.0 -auto-revert true
network interface create -vserver svm_fp -lif fp_iscsi1 -service-policy default-data-iscsi -home-node saat-cluster-01 -home-port e0d -address 192.168.56.151 -netmask 255.255.255.0
network interface create -vserver svm_fp -lif fp_iscsi2 -service-policy default-data-iscsi -home-node saat-cluster-02 -home-port e0d -address 192.168.56.152 -netmask 255.255.255.0
vserver nfs create -vserver svm_fp -v3 enabled -v4.1 enabled
vserver export-policy rule create -vserver svm_fp -policyname default -clientmatch 192.168.56.0/24 -rorule sys -rwrule never -superuser none
vserver export-policy create -vserver svm_fp -policyname web_hosts
vserver export-policy rule create -vserver svm_fp -policyname web_hosts -clientmatch 192.168.56.21 -rorule sys -rwrule sys -superuser sys -protocol nfs
volume create -vserver svm_fp -volume vol_web -aggregate aggr1_01 -size 50g -junction-path /web -policy web_hosts -security-style unix
vserver iscsi create -vserver svm_fp
volume create -vserver svm_fp -volume vol_db -aggregate aggr1_02 -size 60g -space-guarantee none -snapshot-policy none
lun create -vserver svm_fp -path /vol/vol_db/lun_db -size 50g -ostype linux -space-reserve disabled
lun igroup create -vserver svm_fp -igroup ig_rhel1 -protocol iscsi -ostype linux -initiator iqn.1994-05.com.redhat:8f3d2c1b9a7e
lun mapping create -vserver svm_fp -path /vol/vol_db/lun_db -igroup ig_rhel1
python ontapsim.py -c "simctl reset"
python ontapsim.py --run fp-build.txt

The only warnings should be that each node has no spare SAS disks left, which is expected in this small lab.

✅ Checkpoint: No line starts with Error.

2Prove both clients work

Log in and run:

simctl host linux1 mount 192.168.56.150:/web /mnt/web vers=4.1
simctl host linux1 touch /mnt/web/index.html
simctl host linux1 ls /mnt/web
simctl host rhel1 iscsi-discover 192.168.56.151
simctl host rhel1 iscsi-login
simctl host rhel1 rescan
simctl host rhel1 multipath

You should see the share and two paths:

(mounted 192.168.56.150:/web on /mnt/web type nfs4)
...
index.html
...
Scanning SCSI subsystem for new devices... 2 new or changed device(s) found.
saat-cluster::> simctl host rhel1 multipath
3600a0980337a4868374d525946676d4 dm-2 NETAPP,LUN C-Mode
size=50G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 30:0:0:0 sdj 8:16 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 32:0:0:0 sdl 8:48 active ready running

✅ Checkpoint: linux1 lists index.html and rhel1 shows a 50G LUN with two paths.

3Save your baseline

cluster show
storage failover show
network interface show -vserver svm_fp
vserver export-policy rule show -vserver svm_fp
lun igroup show -vserver svm_fp -instance

Copy the output into a text file. You’ll compare against it in a few minutes.

✅ Checkpoint: You have the baseline saved.

4Let the faults loose

Run these lines without thinking about them too much, then pretend three different teams have just called you:

simctl break export-drop svm_fp web_hosts
simctl break iqn-typo svm_fp ig_rhel1
simctl break lif-down svm_fp fp_iscsi2
simctl tick 1

The web team says their server can’t read its files. The database team says their disk is gone after a reboot.

A third person says “one of the storage paths alerted last night”. Now find and fix everything, using only ONTAP and the host views. Stop here and try it yourself before reading on.

✅ Checkpoint: You have written down three symptoms.

5Answers: what the clients see

simctl host linux1 ls /mnt/web
simctl host rhel1 rescan

You’ll see:

ls: cannot open directory '/mnt/web': Permission denied
saat-cluster::> simctl host rhel1 rescan
Scanning SCSI subsystem for new devices... 0 new or changed device(s) found.
(No LUN paths. Check: sessions or FC logins, igroup initiators, LUN mapping, LUN/volume online, reporting nodes.)

✅ Checkpoint: You see Permission denied and no LUN paths.

6Answers: health first, then the layers

cluster show
event log show -severity <=ERROR
network interface show -vserver svm_fp
vserver export-policy rule show -vserver svm_fp -policyname web_hosts
vserver export-policy check-access -vserver svm_fp -volume vol_web -client-ip 192.168.56.21 -authentication-method sys -protocol nfs4 -access-type read-write
lun igroup show -vserver svm_fp -instance
vserver iscsi initiator show -vserver svm_fp

The important lines:

saat-cluster::> event log show -severity <=ERROR
There are no entries matching your query.
...
            fp_iscsi2  down/down  192.168.56.152/24  saat-cluster-02 e0d     true
saat-cluster::> vserver export-policy rule show -vserver svm_fp -policyname web_hosts
There are no entries matching your query.
saat-cluster::> vserver export-policy check-access -vserver svm_fp -volume vol_web -client-ip 192.168.56.21 -authentication-method sys -protocol nfs4 -access-type read-write
                                    Policy       Policy       Rule
Path                   Policy       Owner        Owner Type  Index Access
---------------------- ------------ ------------ ---------- ------ ----------
/                      default      svm_fp_root  volume          1 read
/web                   web_hosts    vol_web      volume          0 denied
2 entries were displayed.
...
            Initiators: iqn.1994-05.com.redhat:8f3d2c1b9a70 (not logged in)
saat-cluster::> vserver iscsi initiator show -vserver svm_fp
           Tpgroup       Initiator                                      Igroup
Vserver    Name          Name                                           Name
---------- ------------- ---------------------------------------------- ------------
svm_fp     fp_iscsi1     iqn.1994-05.com.redhat:8f3d2c1b9a7e            -
svm_fp     fp_iscsi2     iqn.1994-05.com.redhat:8f3d2c1b9a7e            -
2 entries were displayed.

The cluster is healthy and the event log is empty, so these are configuration changes, not hardware.

Fault 1: web_hosts has no rules, so /web is denied. Fault 2: the igroup holds an IQN ending in 9a70 while rhel1 really is 9a7e. Fault 3: fp_iscsi2 is administratively down.

✅ Checkpoint: You found all three faults, or know which one you missed.

7Answers: fix one at a time and check

lun igroup remove -vserver svm_fp -igroup ig_rhel1 -initiator iqn.1994-05.com.redhat:8f3d2c1b9a70
lun igroup add -vserver svm_fp -igroup ig_rhel1 -initiator iqn.1994-05.com.redhat:8f3d2c1b9a7e
simctl host rhel1 rescan
simctl host rhel1 multipath

After the igroup fix you get one path only:

Scanning SCSI subsystem for new devices... 1 new or changed device(s) found.
saat-cluster::> simctl host rhel1 multipath
3600a0980337a4868374d525946676d4 dm-2 NETAPP,LUN C-Mode
size=50G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
`-+- policy='service-time 0' prio=10 status=enabled
  `- 30:0:0:0 sdj 8:16 active ready running

Look closely: the only path has prio=10, the non-optimized one through node 01. The LUN lives on node 02, and node 02’s iSCSI LIF is the one that’s down. The database works, but every I/O takes the long way.

network interface modify -vserver svm_fp -lif fp_iscsi2 -status-admin up
simctl host rhel1 rescan
simctl host rhel1 multipath
vserver export-policy rule create -vserver svm_fp -policyname web_hosts -clientmatch 192.168.56.21 -rorule sys -rwrule sys -superuser sys -protocol nfs
simctl host linux1 ls /mnt/web

You should see both paths back and the web files:

3600a0980337a4868374d525946676d4 dm-2 NETAPP,LUN C-Mode
size=50G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 30:0:0:0 sdj 8:16 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 32:0:0:0 sdl 8:48 active ready running
saat-cluster::> vserver export-policy rule create -vserver svm_fp -policyname web_hosts -clientmatch 192.168.56.21 -rorule sys -rwrule sys -superuser sys -protocol nfs
saat-cluster::> simctl host linux1 ls /mnt/web
index.html

✅ Checkpoint: rhel1 has two paths again and linux1 lists index.html.

Practice shell: only the non-optimized path left while the iSCSI LIF on node 02 is down
After the igroup fix only the long path works, because node 02’s iSCSI LIF is down.

8Close it out

Run the baseline commands again and compare. Then write three short lines, one per fault: what the user saw, the cause, the fix. That’s your incident note, and it’s the habit interviewers ask about.

✅ Checkpoint: Your new output matches the baseline.

Break It, Then Fix It

A classic mistake made while fixing: you re-create the export rule in a hurry and copy the safe-looking “superuser none” from the default policy.

1Re-create the rule the wrong way

From the fixed state, delete rule 1 and add it back with -superuser none:

vserver export-policy rule delete -vserver svm_fp -policyname web_hosts -ruleindex 1
vserver export-policy rule create -vserver svm_fp -policyname web_hosts -clientmatch 192.168.56.21 -rorule sys -rwrule sys -superuser none -protocol nfs
simctl host linux1 touch /mnt/web/new.html

You’ll get this:

touch: cannot touch '/mnt/web/new.html': Permission denied
(you are root on the client, but superuser is "none" in export rule 1, so root is mapped to the anonymous user 65534, which cannot write here)

Reading works, but root on linux1 can’t write. With -superuser none, ONTAP maps the client’s root user to the anonymous user (65534 here), which has no write permission on the volume. The practice shell explains this in brackets; a real client just says Permission denied.

✅ Checkpoint: Root on linux1 gets Permission denied when writing.

Linux client: root write denied with superuser none, fixed with superuser sys
superuser none squashes root, so writes fail until the rule is fixed.

2Fix it the right way

Decide what the web server needs. If its application runs as root and must write, set superuser to sys for that one host. Better still, run the application as a normal user who owns the files, and keep root squashed.

vserver export-policy rule modify -vserver svm_fp -policyname web_hosts -ruleindex 1 -superuser sys
simctl host linux1 touch /mnt/web/new.html
simctl host linux1 ls /mnt/web

You should see:

index.html  new.html

✅ Checkpoint: linux1 can write again.

This happened at work

Three alerts, one night shift

A junior storage engineer at an IT services company in Warangal was on her third night shift when, just after 1 a.m., three tickets arrived within ten minutes of each other, right after a planned power test in the data centre. Her first instinct was to call her lead.

Instead she opened the team runbook and went in order. Cluster health was fine and there were no hardware events, so she treated each ticket as a configuration problem. An automation job had reapplied an old export policy, a rebuilt host had a new IQN, and an iSCSI LIF had been left down after switch work earlier that evening.

She fixed all three in about forty minutes, checked each one from the client side, and wrote a short note per ticket. Her lead’s only change the next morning was to add “check for automation jobs that ran” to the runbook.

Common mistakes and troubleshooting

MistakeWhat happensDo this instead
Fixing before finding all faultsYou stop at the first fix and miss the restList every symptom, then fix one at a time
Trusting “Job succeeded”A share that can’t be written still looks fineProve it from the client: write a file, check multipath
Ignoring a single pathThe LUN works but slowly, and has no spare pathExpect an optimized and a non-optimized path
Copying options without reading themsuperuser none breaks root writesKnow what each export option does
No incident noteThe same fault comes back next monthWrite symptom, cause and fix for every ticket

Interview questions

Click a question to open it. Each one is written the way an interviewer would ask it. Under it you will see why they ask it and one way you could answer, in your own words.

Fresher level

1. Walk me through how you’d give a Linux server an NFS share on ONTAP, from scratch.

Why they ask this: They want to see you know the build order and don’t skip access control.

How you might answer: I’d make sure there’s an aggregate and an SVM with NFS turned on and a data LIF. Then I’d create an export policy with a rule for the server’s IP, create the volume with a junction path and that policy, and check it with vserver export-policy check-access before the server mounts it and writes a test file.

2. After you give a LUN to a host, how do you know the job is really done?

Why they ask this: They’re checking that you verify from the host side.

How you might answer: I ask the host team to rescan and show me multipath -ll or the Windows MPIO view. I expect the right size and two or more paths, one optimized through the owning node, and I check lun igroup show -instance says logged in.

2–5 years experience

3. Three tickets arrive at once after a maintenance window. How do you handle them?

Why they ask this: They want calm prioritisation and a method.

How you might answer: First I check cluster health and the event log to see if there’s one shared cause, like a node or port. If the cluster is healthy, I treat them as separate configuration problems, work through them in business-impact order, and check each fix from the client before moving on.

4. A database host has only one path to its LUN and it’s the non-optimized one. What’s likely wrong?

Why they ask this: They’re testing ALUA understanding in a real symptom.

How you might answer: The path through the node that owns the LUN is missing. I’d check the iSCSI or FC LIF on that node, whether it’s down or not zoned, and the reporting nodes in lun mapping show. Until it’s fixed every I/O crosses the cluster network and there’s no spare path.

Senior level

5. How would you turn a set of one-off fixes like these into something your team doesn’t repeat?

Why they ask this: They want to see you improve the system, not just the incident.

How you might answer: I’d write a short note for each incident, then look for patterns: automation jobs that change config, hosts rebuilt without updating igroups, LIFs left down after network work. Each pattern becomes a check in the runbook or a guardrail, like RBAC limits or a post-change verification script.

6. If you could only monitor five things on an ONTAP cluster, what would they be?

Why they ask this: They want judgement about what matters most.

How you might answer: Node health and Takeover Possible, aggregate and volume space, SnapMirror health and lag, LIFs that are down or away from home, and latency per important volume. With AutoSupport working on top, those catch most problems before users do.

Quick quiz

Q1. In what order should you build NFS storage?

  1. Export rule, volume, SVM, aggregate
  2. Aggregate, SVM, LIF, NFS, export policy, volume
  3. Volume, LIF, aggregate, SVM
  4. It doesn’t matter
Show answer

B — each step depends on the one before it.

Q2. The event log is empty and the cluster is healthy, but three things broke. What does that suggest?

  1. Hardware failure
  2. Configuration changes
  3. A full aggregate
  4. A failed node
Show answer

B — no hardware events points to settings that changed.

Q3. A host shows only a prio=10 path to its LUN. What does that mean?

  1. Everything is perfect
  2. Only the non-optimized path through the partner node is working
  3. The LUN is offline
  4. The igroup is empty
Show answer

B — the optimized path through the owning node is missing.

Q4. With -superuser none, what happens to root from the client?

  1. It keeps full access
  2. It is mapped to the anonymous user
  3. It is blocked from mounting
  4. It becomes vsadmin
Show answer

B — root squashing maps root to the anonymous user.

Q5. What proves an NFS share works for a web server?

  1. The volume create job succeeded
  2. The server can mount it and write a test file
  3. The aggregate is online
  4. The LIF exists
Show answer

B — proof comes from the client side.

Quick recap

  • Build in layers: aggregate, SVM, LIFs, protocols, volumes and LUNs, access rules.
  • Prove every service from the client and save a baseline.
  • Health and events first; empty events point to configuration changes.
  • Fix one fault at a time and check from the client after each.
  • Write an incident note: symptom, cause, fix.

Next lesson

Lesson 56: NetApp interview questions → You’ll practise the questions interviewers ask at fresher, mid and senior level, and how to answer them.

Further reading: ONTAP final project

Want to go deeper into ONTAP final project? Keep NetApp’s ONTAP concepts guide open while you build; it explains every layer you touch in this project. You can also see the full plan for this course on the NetApp ONTAP Storage Administration course page.

Scroll to Top

This website uses cookies

We use a few cookies to keep this site working. If you allow it, we also use Google Analytics to count visits so we can improve our lessons. You can accept all, deny the optional ones, or choose what to allow.