After three decades since RFC1094 defined NFS's behavior, symbolic link resolution remains a surprisingly persistent challenge in distributed filesystems. The fundamental architecture still requires clients to interpret symbolic links, which can create numerous issues in complex deployment scenarios.
As of NFSv4 (including NFSv4.1 and v4.2), server-side symbolic link resolution remains unavailable as a standard feature. The protocol's design fundamentally delegates pathname interpretation to clients, including:
- Absolute path resolution (/path/to/link)
- Relative path resolution (../sibling/link)
- Permission checking for traversed directories
While full server-side resolution isn't possible, these export options can help manage link behavior:
# /etc/exports example with relevant options
/export/path client.ip(rw,sync,no_subtree_check,crossmnt)
Key options that affect link behavior:
- no_subtree_check: Reduces server-side path validation (can help with some link issues)
- crossmnt: Allows clients to traverse mount points on the server
- nohide: Makes all server mount points visible
Relative links (../../target) often work better than absolute paths in NFS environments because:
- They're resolved relative to the link's location rather than client root
- They don't break when client mount points differ from server paths
- Example of problematic absolute link:
ln -s /data/app/config /export/home/user/config
- Better relative alternative:
ln -s ../../../data/app/config /export/home/user/config
For environments where link behavior is critical, consider:
1. Bind mounts on the server:
# Before exporting
mount --bind /actual/path /exported/path
2. Client-side mount namespaces:
# Create consistent view on clients
unshare -m
mount --make-shared /
3. NFSv4 pseudo-filesystem roots:
# Server export using fsid=0
/export(rw,fsid=0,insecure,no_subtree_check)
/export/data(rw,nohide,insecure,no_subtree_check)
When troubleshooting, use these diagnostic tools:
# Show how server exports paths
showmount -e nfs-server
# Trace NFS operations
mount -t nfs -o vers=4.2,debug client:/path /mnt
tail -f /var/log/messages
Since RFC1094 (1989), NFS has traditionally handled symbolic links client-side, requiring the client to interpret link paths. This architecture persists through NFSv3 and v4, though modern implementations offer more flexibility.
For NFSv4 (Linux kernel 2.6.23+), try these export options in /etc/exports
:
/data client-ip(rw,sync,no_subtree_check,crossmnt)
Key parameters:
- crossmnt: Allows clients to traverse mount points on the server
- no_subtree_check: Reduces path validation overhead
When client-side resolution is unavoidable, relative links often work better:
# Instead of: ln -s /server/path/to/target /export/linkname # Use: cd /export && ln -s ../path/to/target linkname
For complex environments:
- Bind mounts can simulate server-side resolution:
- Automount can dynamically handle paths:
mount --bind /actual/path /exported/path
# /etc/auto.master /export /etc/auto.nfs --timeout=60 # /etc/auto.nfs data -fstype=nfs,rw server:/real/data/path
Check link handling with:
# Server-side: ls -l /export/path stat /export/path/linkname # Client-side: strace ls -l /mnt/nfs/linkname 2>&1 | grep 'openat\|stat'