幾個(gè)基本概念
struct nfs_server
NFS client parameters stored in the superblock(來(lái)自nfs_fs_sb.h的注釋). 這是文件系統(tǒng)超級(jí)塊結(jié)構(gòu)中與NFS文件系統(tǒng)本身相關(guān)的字段纽谒,也就是struct super_block結(jié)構(gòu)中的字段s_fs_info。和其他FS一樣仇穗,mount時(shí)候創(chuàng)建super_block未蝌,系統(tǒng)中super_block形成一個(gè)鏈表好芭。
struct nfs_client
The nfs_client identifies our client state to the server(來(lái)自nfs_fs_sb.h的注釋).
如果系統(tǒng)掛在了下面兩個(gè)NFS仅孩,系統(tǒng)會(huì)創(chuàng)建兩個(gè)nfs的super_block利术,對(duì)應(yīng)兩個(gè)nfs_server模庐。但由于server地址相同瑞你,且NFS協(xié)議相同酪惭,所以系統(tǒng)只創(chuàng)建一個(gè)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結(jié)構(gòu)
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命令傳進(jìn)的參數(shù)
由nfs_parse_mount_options
和nfs_parse_devname
實(shí)現(xiàn)的者甲。下面是內(nèi)核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. 執(zhí)行mount操作
由nfs4_remote_mount
實(shí)現(xiàn)春感,它返回該nfs文件系統(tǒng)的root dentry。和其他FS一樣虏缸,mount時(shí)候需要?jiǎng)?chuàng)建并初始化一個(gè)super_block鲫懒,inode可以找到這個(gè)super_block。對(duì)于nfs的super_block刽辙,有兩個(gè)重要數(shù)據(jù)結(jié)構(gòu)是struct nfs_server
和struct nfs_client
窥岩。nfs_client
被包含在nfs_server
之中。super_block的s_fs_info指向nfs_server
宰缤。
2.1 設(shè)置nfs client
nfs4_set_client
2.1.1 分配nfs_client
由nfs4_alloc_client
實(shí)現(xiàn)颂翼。
2.1.2 初始化nfs_client
由nfs4_init_client
實(shí)現(xiàn)。
2.1.2.1 為nfs client設(shè)置callback
這些callback會(huì)在nfs框架下慨灭,在需要的時(shí)候調(diào)用朦乏,類(lèi)似設(shè)計(jì)模式中的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,//元數(shù)據(jù)的操作相關(guān)函數(shù)
.file_ops = &nfs4_file_operations,//非元數(shù)據(jù)的操作相關(guān)函數(shù), file->f_op->read之類(lèi)的在此
...
}
2.1.2.2 創(chuàng)建rpc client
由nfs_create_rpc_client
實(shí)現(xiàn)。內(nèi)部調(diào)用SUN RPC氧骤,先連接對(duì)方Server呻疹,看Server是否支持這個(gè)版本的NFS RPC請(qǐng)求。如果是筹陵,創(chuàng)建rpc client刽锤。
2.1.2.3 NFS4.1初始化nfs_client
由nfs41_init_client
實(shí)現(xiàn)。注意nfs4_init_client
是對(duì)所有NFS4協(xié)議的初始化朦佩,nfs41_init_client
是對(duì)NFS4.1小版本特殊的初始化并思,它是由nfs4_init_client_minor_version
調(diào)用的。
在內(nèi)存中創(chuàng)建session對(duì)象并初始化语稠,為session創(chuàng)建fc_slot_table和bc_slot_table纺荧,分別代表ForeChannel Slot table
和BackChannel Slot table
。
并與nfs client關(guān)聯(lián)。
clp->cl_session = session;
2.1.2.4 發(fā)現(xiàn)server trunking
由nfs41_discover_server_trunking
實(shí)現(xiàn)宙暇。
- 發(fā)送EXCHANGE_ID,得到clientid议泵。此功能封裝在
nfs4_proc_exchange_id
- 發(fā)送CREATE_SESSION占贫,對(duì)分配的clientid進(jìn)行confirm。此功能封裝在
nfs4_proc_create_session
- 發(fā)送RECLAIM_COMPLETE,此功能封裝在
nfs4_reclaim_complete
2.2 設(shè)置nfs_server
由nfs4_create_server
實(shí)現(xiàn)先口。
2.2.1 分配nfs_server
由nfs_alloc_server
實(shí)現(xiàn)型奥。
2.2.2 初始化nfs_server
由nfs4_init_server
實(shí)現(xiàn)。初始化nfs_server碉京,并且將nfs_server和nfs_client關(guān)聯(lián)在一起(nfs4_set_client
)
2.2.3 另外對(duì)nfs_server的設(shè)置
由nfs4_server_common_setup
實(shí)現(xiàn)厢汹。
2.2.3.1 Probe the root fh
由nfs4_get_rootfh
實(shí)現(xiàn)。
- 發(fā)送SECINFO_NO_NAME谐宙,此功能封裝在
nfs4_do_find_root_sec
- 發(fā)送LOOKUP_ROOT烫葬,獲取root fh,并得到FSID凡蜻。此功能封裝在
nfs4_lookup_root
以下是內(nèi)核的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
實(shí)現(xiàn)搭综。
- 發(fā)送SERVER_CAPS,此功能封裝在
nfs4_server_capabilities
- 發(fā)送FSINFO划栓,此功能封裝在
nfs4_do_fsinfo
- 發(fā)送PATHCONF兑巾,此功能封裝在
nfs4_proc_pathconf