美文网首页
NFS Client in Linux Kernel - Mou

NFS Client in Linux Kernel - Mou

作者: 帆子_8c3a | 来源:发表于2019-03-13 20:08 被阅读0次

几个基本概念

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_optionsnfs_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_clientnfs_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 tableBackChannel Slot table
并与nfs client关联。

clp->cl_session = session;

2.1.2.4 发现server trunking

nfs41_discover_server_trunking实现。

  1. 发送EXCHANGE_ID,得到clientid。此功能封装在nfs4_proc_exchange_id
  2. 发送CREATE_SESSION,对分配的clientid进行confirm。此功能封装在nfs4_proc_create_session
  3. 发送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实现。

  1. 发送SECINFO_NO_NAME,此功能封装在nfs4_do_find_root_sec
  2. 发送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实现。

  1. 发送SERVER_CAPS,此功能封装在nfs4_server_capabilities
  2. 发送FSINFO,此功能封装在nfs4_do_fsinfo
  3. 发送PATHCONF,此功能封装在nfs4_proc_pathconf

相关文章

网友评论

      本文标题:NFS Client in Linux Kernel - Mou

      本文链接:https://www.haomeiwen.com/subject/lhqxmqtx.html