![]() |
Basis to evaluate and compare
|
![]() |
Name space
|
||||||
![]() |
Stateful or stateless operation
|
||||||
![]() |
Semantics of sharing
|
||||||
![]() |
Remote access methods: issues about how actively server should participate in the file operation (such as notification of cache inconsistency, ...)
|
![]() |
Client-server model |
||||||||||||
![]() |
Use RPC: Operates in synchronous mode (see RPC note)
|
![]() |
Server can export the entire file system or a subtree |
||||
![]() |
Client mounts the exported file system (or subtree) or any subtree of the file system. Two types of mount operation:
|
![]() |
Simple recovery mechanism |
![]() |
Transparent access to remote files |
![]() |
Unix file system semantics |
![]() |
Transport-independent |
![]() |
NFS Protocol: GETATTR, SETATTR, LOOKUP, READLINK, READ, WRITE, CREATE, REMOVE, RENAME, LINK, SYMLINK, MKDIR, RMDIR, READDIR, STATFS |
||||
![]() |
Mount Protocol: MNT, DUMP, UMNT, UMNTALL, EXPORT |
||||
![]() |
RPC: each request is sent as an RPC packet |
||||
![]() |
XDR: a machine-independent data encoding method |
||||
![]() |
Daemon processes
|
![]() |
No open/close method |
||||||
![]() |
Every request has full information such as file offset, number of bytes, ... |
||||||
![]() |
Easy crash recovery: nothing needs to be done |
||||||
![]() |
Major problem of statelessness:
|
![]() |
NFS uses Sun RPC -> Sun RPC supports only synchronous communication -> synchronous nature of NFS |
||||||||||||||||||
![]() |
RPC message
|
![]() |
Application in client machine issues a file operation with vnode -> |
||
![]() |
The corresponding vnode virtual function in turn calls file system specific code. In this case NFS function -> |
||
![]() |
NFS client sends the corresponding req. ->
|
||
![]() |
Server gets the req. & map to the local vnode -> |
||
![]() |
Server invokes local vnode operation -> |
||
![]() |
Server replies -> |
||
![]() |
Client receives the response -> |
||
![]() |
At client side, remaining vnode operations are executed -> |
||
![]() |
Client application is resumed |
![]() |
When a client request LOOKUP, CREATE, or MKDIR, server replies with a unique file handle, whose components are usually:
|
||
![]() |
The client uses the file handle for subsequent requests |
![]() |
Application calls mount -> |
||||||
![]() |
new vfs structure allocated -> nfs_mount() called:
|
||||||
![]() |
Client adds server addr to vfs structure -> |
||||||
![]() |
Client allocates vnode and rnode (NFS version of inode) for the root dir of the mounted file system |
![]() |
Control flow
|
||||||
![]() |
Single pathname may cause several pathname lookup RPCs |
||||||
![]() |
Why not sending full pathname with a single pathname lookup RPC?
|
![]() |
In Unix, for example:
|
||||||
![]() |
In NFS, the process can only read from the file because each read/write is checked against |
![]() |
In Unix, if
|
||||||
![]() |
In NFS, the former will get invalid file handle error after the deletion |
![]() |
In Unix, each read/write is atomic: vnode and inode are locked |
![]() |
In NFS, a single read/write may span several RPC calls (max size of RPC packet is 8K) |
![]() |
Modern NFS provides Network Lock Manager to lock entire file or a portion of it. But it's advisory lock! |
![]() |
Any NFS request that modifies the file system (data or meta data) is extremely slow, because every update should be committed to a stable storage |
![]() |
"ls -l" will be end up with bunch of RPC calls (stat for each file in the dir). In the case of local file system, inode cache will boost up the speed |
![]() |
RPC retransmission could aggravate the network problem |
![]() |
Client caches both file blocks and attributes |
||||||
![]() |
Cache coherence problem
|
![]() |
Client side: hint = user knows about the crash of the client machine
|
||||
![]() |
Server side: use static RAM and do not commit to disk every time |
![]() |
Nonidempotent req. can cause problems, for example:
|
||||||||||||||
![]() |
Also hurts server performance a lot
|
![]() |
Server specifies machines, called export list, which can mount the file system or subdirectory
|
||||
![]() |
(In case of AUTH_UNIX authentication) NFS requests are access-controlled based on uid and gid
|
||||
![]() |
Also NFS requests are not encrypted |
![]() |
Map the same (uid, gid) from different machines to different (uid, gid) of server
|
||||||||||||
![]() |
No mainstream NFS use UID remapping. They use secure RPC with AUTH_DES or AUTH_KERB |
![]() |
Remap root from client machine to nobody |
![]() |
Design Goals and Characteristics
|
![]() |
Issues on network configuration and load of servers |
||||||||
![]() |
Clustered network configuration
|
||||||||
![]() |
Load of servers
|
![]() |
The collection of AFS servers together holds the shared files |
||||||||||||||
![]() |
Files are organized in volumes
|
||||||||||||||
![]() |
Uniform name space
|
||||||||||||||
![]() |
Client caches files and may have local files for performance reason or convenience |
![]() |
AFS only guarantees session semantics for data - consistency at open and close |
||
![]() |
AFS provides stronger semantics for meta data (file attributes)
|
![]() |
Client caches whole file or 64K chunks, if the file is bigger than 64K, in the disk |
||||||||
![]() |
Client caches file attributes in memory |
||||||||
![]() |
Client serves read, write using the cache |
||||||||
![]() |
The cache is flushed when the file is closed |
||||||||
![]() |
Coherence
|
![]() |
Pathname lookup--translation of pathname into fid--is done by the client |
||
![]() |
Directory is just another file. So if the client does not have a directory which is part of the pathname, then fetch the directory from the server and proceeds.
|
||
![]() |
Server is just presented with fid. And this makes server's operation very fast |
![]() |
AFS server does not trust clients. Hence use Kerberos authentication |
![]() |
Also ACL for each directory, but not for files |
![]() |
To access a file, user should pass both of AFS's ACL and Unix permission check |
![]() |
Server is fairly off-load, but client becomes heavy-loaded |
||||
![]() |
Session semantics is not good enough
|
![]() |
An
attempt to make NFS be stateful
|