nfs-client.rst 5.3 KB

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