114 lines
4.4 KiB
ReStructuredText
114 lines
4.4 KiB
ReStructuredText
|
Reexporting NFS filesystems
|
||
|
===========================
|
||
|
|
||
|
Overview
|
||
|
--------
|
||
|
|
||
|
It is possible to reexport an NFS filesystem over NFS. However, this
|
||
|
feature comes with a number of limitations. Before trying it, we
|
||
|
recommend some careful research to determine whether it will work for
|
||
|
your purposes.
|
||
|
|
||
|
A discussion of current known limitations follows.
|
||
|
|
||
|
"fsid=" required, crossmnt broken
|
||
|
---------------------------------
|
||
|
|
||
|
We require the "fsid=" export option on any reexport of an NFS
|
||
|
filesystem. You can use "uuidgen -r" to generate a unique argument.
|
||
|
|
||
|
The "crossmnt" export does not propagate "fsid=", so it will not allow
|
||
|
traversing into further nfs filesystems; if you wish to export nfs
|
||
|
filesystems mounted under the exported filesystem, you'll need to export
|
||
|
them explicitly, assigning each its own unique "fsid= option.
|
||
|
|
||
|
Reboot recovery
|
||
|
---------------
|
||
|
|
||
|
The NFS protocol's normal reboot recovery mechanisms don't work for the
|
||
|
case when the reexport server reboots. Clients will lose any locks
|
||
|
they held before the reboot, and further IO will result in errors.
|
||
|
Closing and reopening files should clear the errors.
|
||
|
|
||
|
Filehandle limits
|
||
|
-----------------
|
||
|
|
||
|
If the original server uses an X byte filehandle for a given object, the
|
||
|
reexport server's filehandle for the reexported object will be X+22
|
||
|
bytes, rounded up to the nearest multiple of four bytes.
|
||
|
|
||
|
The result must fit into the RFC-mandated filehandle size limits:
|
||
|
|
||
|
+-------+-----------+
|
||
|
| NFSv2 | 32 bytes |
|
||
|
+-------+-----------+
|
||
|
| NFSv3 | 64 bytes |
|
||
|
+-------+-----------+
|
||
|
| NFSv4 | 128 bytes |
|
||
|
+-------+-----------+
|
||
|
|
||
|
So, for example, you will only be able to reexport a filesystem over
|
||
|
NFSv2 if the original server gives you filehandles that fit in 10
|
||
|
bytes--which is unlikely.
|
||
|
|
||
|
In general there's no way to know the maximum filehandle size given out
|
||
|
by an NFS server without asking the server vendor.
|
||
|
|
||
|
But the following table gives a few examples. The first column is the
|
||
|
typical length of the filehandle from a Linux server exporting the given
|
||
|
filesystem, the second is the length after that nfs export is reexported
|
||
|
by another Linux host:
|
||
|
|
||
|
+--------+-------------------+----------------+
|
||
|
| | filehandle length | after reexport |
|
||
|
+========+===================+================+
|
||
|
| ext4: | 28 bytes | 52 bytes |
|
||
|
+--------+-------------------+----------------+
|
||
|
| xfs: | 32 bytes | 56 bytes |
|
||
|
+--------+-------------------+----------------+
|
||
|
| btrfs: | 40 bytes | 64 bytes |
|
||
|
+--------+-------------------+----------------+
|
||
|
|
||
|
All will therefore fit in an NFSv3 or NFSv4 filehandle after reexport,
|
||
|
but none are reexportable over NFSv2.
|
||
|
|
||
|
Linux server filehandles are a bit more complicated than this, though;
|
||
|
for example:
|
||
|
|
||
|
- The (non-default) "subtreecheck" export option generally
|
||
|
requires another 4 to 8 bytes in the filehandle.
|
||
|
- If you export a subdirectory of a filesystem (instead of
|
||
|
exporting the filesystem root), that also usually adds 4 to 8
|
||
|
bytes.
|
||
|
- If you export over NFSv2, knfsd usually uses a shorter
|
||
|
filesystem identifier that saves 8 bytes.
|
||
|
- The root directory of an export uses a filehandle that is
|
||
|
shorter.
|
||
|
|
||
|
As you can see, the 128-byte NFSv4 filehandle is large enough that
|
||
|
you're unlikely to have trouble using NFSv4 to reexport any filesystem
|
||
|
exported from a Linux server. In general, if the original server is
|
||
|
something that also supports NFSv3, you're *probably* OK. Re-exporting
|
||
|
over NFSv3 may be dicier, and reexporting over NFSv2 will probably
|
||
|
never work.
|
||
|
|
||
|
For more details of Linux filehandle structure, the best reference is
|
||
|
the source code and comments; see in particular:
|
||
|
|
||
|
- include/linux/exportfs.h:enum fid_type
|
||
|
- include/uapi/linux/nfsd/nfsfh.h:struct nfs_fhbase_new
|
||
|
- fs/nfsd/nfsfh.c:set_version_and_fsid_type
|
||
|
- fs/nfs/export.c:nfs_encode_fh
|
||
|
|
||
|
Open DENY bits ignored
|
||
|
----------------------
|
||
|
|
||
|
NFS since NFSv4 supports ALLOW and DENY bits taken from Windows, which
|
||
|
allow you, for example, to open a file in a mode which forbids other
|
||
|
read opens or write opens. The Linux client doesn't use them, and the
|
||
|
server's support has always been incomplete: they are enforced only
|
||
|
against other NFS users, not against processes accessing the exported
|
||
|
filesystem locally. A reexport server will also not pass them along to
|
||
|
the original server, so they will not be enforced between clients of
|
||
|
different reexport servers.
|