- NFS Client in Linux Kernel - Mou
- NFS Client in Linux Kernel - cre
- NFS Client in Linux Kernel - Rec
- NFS Client in Linux Kernel - Ope
- NFS Client in Linux Kernel - Loc
- NFS Client in Linux Kernel - Rea
- NFS Client in Linux Kernel - Ses
- NFS Client in Linux Kernel - RPC
- NFS Client in Linux Kernel - Rea
- nfs-ganesha - Lock
几个基本概念
struct nfs_server
NFS client parameters stored in the superblock(来自nfs_fs_sb.h的注释). 这是文件系统超级块结构中与NFS文件系统本身相关的字段,也就是struct super_block结构中的字段s_fs_info。和其他FS一样,mount时候创建super_block,系统中super_block形成一个链表。
struct nfs_client
The nfs_client identifies our client state to the server(来自nfs_fs_sb.h的注释).
如果系统挂在了下面两个NFS,系统会创建两个nfs的super_block,对应两个nfs_server。但由于server地址相同,且NFS协议相同,所以系统只创建一个nfs_client。
mount -t nfs -o vers=4 192.168.6.144:/tmp/nfs/root1 /tmp/root1
mount -t nfs -o vers=4 192.168.6.144:/tmp/nfs/root 2 /tmp/root2
struct nfs_inode
NFS特有的inode结构
FS的初始化
struct file_system_type nfs4_fs_type = {
.owner = THIS_MODULE,
.name = "nfs4",
.mount = nfs_fs_mount,
.kill_sb = nfs_kill_super,
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
};
static struct file_system_type nfs4_remote_fs_type = {
.owner = THIS_MODULE,
.name = "nfs4",
.mount = nfs4_remote_mount,
.kill_sb = nfs_kill_super,
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
};
nfs的mount做了以下几件事:
1. 解析mount命令传进的参数
由nfs_parse_mount_options
和nfs_parse_devname
实现的。下面是内核log
[77666.149229] NFS: nfs mount opts='minorversion=1,addr=10.2.2.2,clientaddr=10.2.2.2'
[77666.149236] NFS: parsing nfs mount option 'minorversion=1'
[77666.149241] NFS: parsing nfs mount option 'addr=10.2.2.2'
[77666.149246] NFS: parsing nfs mount option 'clientaddr=10.2.2.2'
[77666.149250] NFS: MNTPATH: '/vfs'
2. 执行mount操作
由nfs4_remote_mount
实现,它返回该nfs文件系统的root dentry。和其他FS一样,mount时候需要创建并初始化一个super_block,inode可以找到这个super_block。对于nfs的super_block,有两个重要数据结构是struct nfs_server
和struct nfs_client
。nfs_client
被包含在nfs_server
之中。super_block的s_fs_info指向nfs_server
。
2.1 设置nfs client
nfs4_set_client
2.1.1 分配nfs_client
由nfs4_alloc_client
实现。
2.1.2 初始化nfs_client
由nfs4_init_client
实现。
2.1.2.1 为nfs client设置callback
这些callback会在nfs框架下,在需要的时候调用,类似设计模式中的template method模式
const struct nfs_rpc_ops nfs_v4_clientops = {
.version = 4, /* protocol version */
.dentry_ops = &nfs4_dentry_operations,
.dir_inode_ops = &nfs4_dir_inode_operations,
.file_inode_ops = &nfs4_file_inode_operations,//元数据的操作相关函数
.file_ops = &nfs4_file_operations,//非元数据的操作相关函数, file->f_op->read之类的在此
...
}
2.1.2.2 创建rpc client
由nfs_create_rpc_client
实现。内部调用SUN RPC,先连接对方Server,看Server是否支持这个版本的NFS RPC请求。如果是,创建rpc client。
2.1.2.3 NFS4.1初始化nfs_client
由nfs41_init_client
实现。注意nfs4_init_client
是对所有NFS4协议的初始化,nfs41_init_client
是对NFS4.1小版本特殊的初始化,它是由nfs4_init_client_minor_version
调用的。
在内存中创建session对象并初始化,为session创建fc_slot_table和bc_slot_table,分别代表ForeChannel Slot table
和BackChannel Slot table
。
并与nfs client关联。
clp->cl_session = session;
2.1.2.4 发现server trunking
由nfs41_discover_server_trunking
实现。
- 发送EXCHANGE_ID,得到clientid。此功能封装在
nfs4_proc_exchange_id
- 发送CREATE_SESSION,对分配的clientid进行confirm。此功能封装在
nfs4_proc_create_session
- 发送RECLAIM_COMPLETE,此功能封装在
nfs4_reclaim_complete
2.2 设置nfs_server
由nfs4_create_server
实现。
2.2.1 分配nfs_server
由nfs_alloc_server
实现。
2.2.2 初始化nfs_server
由nfs4_init_server
实现。初始化nfs_server,并且将nfs_server和nfs_client关联在一起(nfs4_set_client
)
2.2.3 另外对nfs_server的设置
由nfs4_server_common_setup
实现。
2.2.3.1 Probe the root fh
由nfs4_get_rootfh
实现。
- 发送SECINFO_NO_NAME,此功能封装在
nfs4_do_find_root_sec
- 发送LOOKUP_ROOT,获取root fh,并得到FSID。此功能封装在
nfs4_lookup_root
以下是内核的log
[77666.162909] Server FSID: 98:98
[77666.162913] Pseudo-fs root FH at ffff880036f7b0c0 is 128 bytes, crc: 0x7133d1b0:
[77666.162916] 43000000 7bcc3946 2664c9fa c301002f
[77666.162917] 00000000 00000000 00000000 00000000
[77666.162919] 00000000 00000000 00000000 00000000
[77666.162921] 00000000 00000000 00000000 00000000
[77666.162923] 00000000 00000000 00000000 00000000
[77666.162924] 00000000 00000000 00000000 00000000
[77666.162926] 00000000 00000000 00000000 00000000
[77666.162928] 00000000 00000000 00000000 00000000
Probe fsinfo
由nfs_probe_fsinfo
实现。
- 发送SERVER_CAPS,此功能封装在
nfs4_server_capabilities
- 发送FSINFO,此功能封装在
nfs4_do_fsinfo
- 发送PATHCONF,此功能封装在
nfs4_proc_pathconf
网友评论