300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > linux内核挂载nfs NFS Client in Linux Kernel - Mount

linux内核挂载nfs NFS Client in Linux Kernel - Mount

时间:2021-12-10 07:00:53

相关推荐

linux内核挂载nfs NFS Client in Linux Kernel - Mount

几个基本概念

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。