NFS Client in Linux Kernel - Mount

幾個(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_optionsnfs_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 tableBackChannel 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)宙暇。

  1. 發(fā)送EXCHANGE_ID,得到clientid议泵。此功能封裝在nfs4_proc_exchange_id
  2. 發(fā)送CREATE_SESSION占贫,對(duì)分配的clientid進(jìn)行confirm。此功能封裝在nfs4_proc_create_session
  3. 發(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)。

  1. 發(fā)送SECINFO_NO_NAME谐宙,此功能封裝在nfs4_do_find_root_sec
  2. 發(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)搭综。

  1. 發(fā)送SERVER_CAPS,此功能封裝在nfs4_server_capabilities
  2. 發(fā)送FSINFO划栓,此功能封裝在nfs4_do_fsinfo
  3. 發(fā)送PATHCONF兑巾,此功能封裝在nfs4_proc_pathconf
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忠荞,隨后出現(xiàn)的幾起案子蒋歌,更是在濱河造成了極大的恐慌,老刑警劉巖委煤,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂油,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡素标,警方通過(guò)查閱死者的電腦和手機(jī)称诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)头遭,“玉大人寓免,你說(shuō)我怎么就攤上這事〖莆” “怎么了袜香?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鲫惶。 經(jīng)常有香客問(wèn)我蜈首,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任欢策,我火速辦了婚禮吆寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踩寇。我一直安慰自己啄清,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布俺孙。 她就那樣靜靜地躺著辣卒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睛榄。 梳的紋絲不亂的頭發(fā)上荣茫,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音场靴,去河邊找鬼啡莉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憎乙,可吹牛的內(nèi)容都是我干的票罐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泞边,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼该押!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阵谚,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚕礼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后梢什,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奠蹬,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗡午,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囤躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荔睹,死狀恐怖狸演,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僻他,我是刑警寧澤宵距,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站吨拗,受9級(jí)特大地震影響满哪,放射性物質(zhì)發(fā)生泄漏婿斥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一哨鸭、第九天 我趴在偏房一處隱蔽的房頂上張望民宿。 院中可真熱鬧,春花似錦像鸡、人聲如沸勘高。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蕊蝗,卻和暖如春仅乓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬戚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工夸楣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子漩。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓豫喧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幢泼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紧显,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350