FreeBSD mount_nfs memo

之前記過 FreeBSD nfsd 的服務流程,這邊記得是 FreeBSD mount_nfs 的流程:

  • mount_nfs 自己會先以 RPC 的 NFS_NULL_PROC 探看 server 的 nfsd
  • mount_nfs 接著以 RPC 的 RPC_MOUNT 對 server 的 mountd 取得 exported root handle。
  • mount_nfs 將取得的資訊以 iovec 的結構存起來。
  • mount_nfs 最後將這個 iovec 的參數丟進 nmount() system call 進入 kernel mode。
  • nmount() 訂義在 /usr/src/sys/kern/vfs_mount.c
  • nmount() 透過 vfs_domount() 呼叫到真正的 VFS_MOUNT()
  • 這時候就會由訂義在 /usr/src/sys/fs/nfsclient/nfs_clvfsops.cnfs_mount() 做真正的後續。
  • 在 kernel 的 vnode operations 裡,每當 mount 動作執行後,就會跟著執行 statfs。
  • 在 nfs 下,nfs_mount() 做完,就會跟著 nfs_statfs()
  • nfs_statfs() 裡面,會依序呼叫 FSINFOFSSTAT 這兩個 RPC procedure。

所以,這就是為什麼每當 client 做了 mount_nfs 以後,server 那邊收到的記錄是:NULL、FSINFO、FSSTAT。

1 year ago
FreeBSD, NFS, Programming, Memo,

FreeBSD nfsserver.ko - nfsrv_read()

nfsrv_read() 這個函式負責負作 NFS 收到的 read procedure。

首先它會從 request decode 取得 file handle,offset 與 count,根據 offset 與 count 總合的大小建立一「串」mbuf。然後將這串 mbuf 分別指派給 struct uio 的 io vector(struct iovec :[vec_base, vec_len])。

最後執行 VOP_READ() 這個神祕的函式將 file handle 在 offset 到 count 的資料,讀到 io vector 中,也就是讀到 mbuf 中。

再由 kernel 將 mbuf 們傳到網路上。

1 year ago
freebsd, nfs,