1 ========== 1 ========== 2 NFS Client 2 NFS Client 3 ========== 3 ========== 4 4 5 The NFS client 5 The NFS client 6 ============== 6 ============== 7 7 8 The NFS version 2 protocol was first documente 8 The NFS version 2 protocol was first documented in RFC1094 (March 1989). 9 Since then two more major releases of NFS have 9 Since then two more major releases of NFS have been published, with NFSv3 10 being documented in RFC1813 (June 1995), and N 10 being documented in RFC1813 (June 1995), and NFSv4 in RFC3530 (April 11 2003). 11 2003). 12 12 13 The Linux NFS client currently supports all th 13 The Linux NFS client currently supports all the above published versions, 14 and work is in progress on adding support for 14 and work is in progress on adding support for minor version 1 of the NFSv4 15 protocol. 15 protocol. 16 16 17 The purpose of this document is to provide inf 17 The purpose of this document is to provide information on some of the 18 special features of the NFS client that can be 18 special features of the NFS client that can be configured by system 19 administrators. 19 administrators. 20 20 21 21 22 The nfs4_unique_id parameter 22 The nfs4_unique_id parameter 23 ============================ 23 ============================ 24 24 25 NFSv4 requires clients to identify themselves 25 NFSv4 requires clients to identify themselves to servers with a unique 26 string. File open and lock state shared betwe 26 string. File open and lock state shared between one client and one server 27 is associated with this identity. To support 27 is associated with this identity. To support robust NFSv4 state recovery 28 and transparent state migration, this identity 28 and transparent state migration, this identity string must not change 29 across client reboots. 29 across client reboots. 30 30 31 Without any other intervention, the Linux clie 31 Without any other intervention, the Linux client uses a string that contains 32 the local system's node name. System administ 32 the local system's node name. System administrators, however, often do not 33 take care to ensure that node names are fully 33 take care to ensure that node names are fully qualified and do not change 34 over the lifetime of a client system. Node na 34 over the lifetime of a client system. Node names can have other 35 administrative requirements that require parti 35 administrative requirements that require particular behavior that does not 36 work well as part of an nfs_client_id4 string. 36 work well as part of an nfs_client_id4 string. 37 37 38 The nfs.nfs4_unique_id boot parameter specifie 38 The nfs.nfs4_unique_id boot parameter specifies a unique string that can be 39 used together with a system's node name when !! 39 used instead of a system's node name when an NFS client identifies itself to 40 a server. Thus, if the system's node name is !! 40 a server. Thus, if the system's node name is not unique, or it changes, its 41 nfs.nfs4_unique_id can help prevent collisions !! 41 nfs.nfs4_unique_id stays the same, preventing collision with other clients >> 42 or loss of state during NFS reboot recovery or transparent state migration. 42 43 43 The nfs.nfs4_unique_id string is typically a U 44 The nfs.nfs4_unique_id string is typically a UUID, though it can contain 44 anything that is believed to be unique across 45 anything that is believed to be unique across all NFS clients. An 45 nfs4_unique_id string should be chosen when a 46 nfs4_unique_id string should be chosen when a client system is installed, 46 just as a system's root file system gets a fre 47 just as a system's root file system gets a fresh UUID in its label at 47 install time. 48 install time. 48 49 49 The string should remain fixed for the lifetim 50 The string should remain fixed for the lifetime of the client. It can be 50 changed safely if care is taken that the clien 51 changed safely if care is taken that the client shuts down cleanly and all 51 outstanding NFSv4 state has expired, to preven 52 outstanding NFSv4 state has expired, to prevent loss of NFSv4 state. 52 53 53 This string can be stored in an NFS client's g 54 This string can be stored in an NFS client's grub.conf, or it can be provided 54 via a net boot facility such as PXE. It may a 55 via a net boot facility such as PXE. It may also be specified as an nfs.ko 55 module parameter. !! 56 module parameter. Specifying a uniquifier string is not support for NFS 56 !! 57 clients running in containers. 57 This uniquifier string will be the same for al << 58 containers unless it is overridden by a value << 59 /sys/fs/nfs/net/nfs_client/identifier which wi << 60 namespace of the process which writes. << 61 58 62 59 63 The DNS resolver 60 The DNS resolver 64 ================ 61 ================ 65 62 66 NFSv4 allows for one server to refer the NFS c 63 NFSv4 allows for one server to refer the NFS client to data that has been 67 migrated onto another server by means of the s 64 migrated onto another server by means of the special "fs_locations" 68 attribute. See `RFC3530 Section 6: Filesystem 65 attribute. See `RFC3530 Section 6: Filesystem Migration and Replication`_ and 69 `Implementation Guide for Referrals in NFSv4`_ 66 `Implementation Guide for Referrals in NFSv4`_. 70 67 71 .. _RFC3530 Section 6\: Filesystem Migration a !! 68 .. _RFC3530 Section 6\: Filesystem Migration and Replication: http://tools.ietf.org/html/rfc3530#section-6 72 .. _Implementation Guide for Referrals in NFSv !! 69 .. _Implementation Guide for Referrals in NFSv4: http://tools.ietf.org/html/draft-ietf-nfsv4-referrals-00 73 70 74 The fs_locations information can take the form 71 The fs_locations information can take the form of either an ip address and 75 a path, or a DNS hostname and a path. The latt 72 a path, or a DNS hostname and a path. The latter requires the NFS client to 76 do a DNS lookup in order to mount the new volu 73 do a DNS lookup in order to mount the new volume, and hence the need for an 77 upcall to allow userland to provide this servi 74 upcall to allow userland to provide this service. 78 75 79 Assuming that the user has the 'rpc_pipefs' fi 76 Assuming that the user has the 'rpc_pipefs' filesystem mounted in the usual 80 /var/lib/nfs/rpc_pipefs, the upcall consists o 77 /var/lib/nfs/rpc_pipefs, the upcall consists of the following steps: 81 78 82 (1) The process checks the dns_resolve cach 79 (1) The process checks the dns_resolve cache to see if it contains a 83 valid entry. If so, it returns that ent 80 valid entry. If so, it returns that entry and exits. 84 81 85 (2) If no valid entry exists, the helper sc 82 (2) If no valid entry exists, the helper script '/sbin/nfs_cache_getent' 86 (may be changed using the 'nfs.cache_ge 83 (may be changed using the 'nfs.cache_getent' kernel boot parameter) 87 is run, with two arguments: 84 is run, with two arguments: 88 - the cache name, "dns_resolve" 85 - the cache name, "dns_resolve" 89 - the hostname to resolve 86 - the hostname to resolve 90 87 91 (3) After looking up the corresponding ip a 88 (3) After looking up the corresponding ip address, the helper script 92 writes the result into the rpc_pipefs p 89 writes the result into the rpc_pipefs pseudo-file 93 '/var/lib/nfs/rpc_pipefs/cache/dns_reso 90 '/var/lib/nfs/rpc_pipefs/cache/dns_resolve/channel' 94 in the following (text) format: 91 in the following (text) format: 95 92 96 "<ip address> <hostname> <ttl> 93 "<ip address> <hostname> <ttl>\n" 97 94 98 Where <ip address> is in the usual IPv4 95 Where <ip address> is in the usual IPv4 (123.456.78.90) or IPv6 99 (ffee:ddcc:bbaa:9988:7766:5544:3322:110 96 (ffee:ddcc:bbaa:9988:7766:5544:3322:1100, ffee::1100, ...) format. 100 <hostname> is identical to the second a 97 <hostname> is identical to the second argument of the helper 101 script, and <ttl> is the 'time to live' 98 script, and <ttl> is the 'time to live' of this cache entry (in 102 units of seconds). 99 units of seconds). 103 100 104 .. note:: 101 .. note:: 105 If <ip address> is invalid, say th 102 If <ip address> is invalid, say the string "0", then a negative 106 entry is created, which will cause 103 entry is created, which will cause the kernel to treat the hostname 107 as having no valid DNS translation 104 as having no valid DNS translation. 108 105 109 106 110 107 111 108 112 A basic sample /sbin/nfs_cache_getent 109 A basic sample /sbin/nfs_cache_getent 113 ===================================== 110 ===================================== 114 .. code-block:: sh 111 .. code-block:: sh 115 112 116 #!/bin/bash 113 #!/bin/bash 117 # 114 # 118 ttl=600 115 ttl=600 119 # 116 # 120 cut=/usr/bin/cut 117 cut=/usr/bin/cut 121 getent=/usr/bin/getent 118 getent=/usr/bin/getent 122 rpc_pipefs=/var/lib/nfs/rpc_pipefs 119 rpc_pipefs=/var/lib/nfs/rpc_pipefs 123 # 120 # 124 die() 121 die() 125 { 122 { 126 echo "Usage: $0 cache_name entry_name" 123 echo "Usage: $0 cache_name entry_name" 127 exit 1 124 exit 1 128 } 125 } 129 126 130 [ $# -lt 2 ] && die 127 [ $# -lt 2 ] && die 131 cachename="$1" 128 cachename="$1" 132 cache_path=${rpc_pipefs}/cache/${cachename 129 cache_path=${rpc_pipefs}/cache/${cachename}/channel 133 130 134 case "${cachename}" in 131 case "${cachename}" in 135 dns_resolve) 132 dns_resolve) 136 name="$2" 133 name="$2" 137 result="$(${getent} hosts ${name} 134 result="$(${getent} hosts ${name} | ${cut} -f1 -d\ )" 138 [ -z "${result}" ] && result="0" 135 [ -z "${result}" ] && result="0" 139 ;; 136 ;; 140 *) 137 *) 141 die 138 die 142 ;; 139 ;; 143 esac 140 esac 144 echo "${result} ${name} ${ttl}" >${cache_p 141 echo "${result} ${name} ${ttl}" >${cache_path}
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.