/ etc / exports和mount选项

在我的Linux服务器中,我在/ etc / exports中有以下选项

/home *(rw,sync,no_subtree_check,no_root_squash) 

而我从Mac上使用

 mount -t nfs -o resvport,rw,noatime,soft,intr,rsize=32768,wsize=32768,timeo=900,retrans=3,proto=tcp,vers=3,async 192.168.1.121:/home /Volumes/home 

正如你所看到的服务器指定的sync但我的装载选项是使用async ,所以哪一个将被使用?

syncasync对于两种不同的情况有不同的含义。

客户端上下文中的sync使得对文件的所有写入都被提交给服务器。 async会导致对文件的所有写入操作不会立即传送到服务器,通常只有在文件closures时才会传送到服务器。 因此,另一个主机打开相同的文件是不会看到第一个主机所做的更改。

请注意,NFS提供了“接近开放”的一致性,这意味着其他客户端不能假定其他人打开的文件中的数据是一致的(或者坦率地说,如果您不使用nfslock在客户端之间添加某种forms的同步)。

服务器上下文中的sync (缺省情况下)会导致服务器只回复说存储后端实际通知它写入数据写入的数据。 服务器上下文中的async获取服务器只是响应,就好像文件写在服务器上,而不pipe它是否实际写入了它。 这是很快,但也是非常危险的,因为数据可能有问题!

在大多数情况下,客户端的async和服务器端的sync 。 这提供了一个非常一致的行为,关于NFS应该如何工作。

基本上是MIFE说的; 这些选项是上下文敏感的。 重要的部分是在手册中:

 exports(5) async This option allows the NFS server to violate the NFS protocol and reply to requests before any changes made by that request have been committed to stable storage (eg disc drive). 

和(Mac)客户端上:

 mount_nfs(8) async Assume that unstable write requests have actually been committed to stable storage on the server, and thus will not require resending in the event that the server crashes. 

注意:在Mac上, mount_nfs(8)指出,只有在nfs.conf(5)nfs.client.allow_async选项也被启用时(也可以通过sysctl(8)来设置mount_nfs(8)async选项才会被使用。

所以,你可以在客户端请求async ,写请求将假定他们已经到达服务器。 由于您在服务器上指定了sync ,因此在数据实际写入磁盘时,它将满足来自客户端的请求。 (当然,服务器上的本地文件系统也可以用“同步”装载,虽然“asynchronous”似乎是默认的)

关于客户端的挂载选项:* rsize&wsize默认情况下设置为32768,用于TCP挂载。 * proto = tcp是默认值,如果服务器不支持则会回退到udp * vers = 3是默认值,如果服务器不支持则回退到2