几个基本概念

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

linux内核挂载nfs,NFS Client in Linux Kernel - Mount相关推荐

  1. 【Linux下挂载QNAP NFS 共享权限异常处理】

    Linux下挂载QNAP NFS 共享权限异常处理 前言 現象 處理 相關命令 NFS 配置中的權限壓縮 前言 在Linux 上掛載QNAP的NFS共享且啟用ACL可能會遇到ROOT用戶正常,但非RO ...

  2. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  3. linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档

    处理器:Exynos4412  Cortex_A9 四核 一: 4412 uboot 目录: uboot基本配置编译 make xxx_config 编译结果如上图. Uboot启动第一阶段分析: 1 ...

  4. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  5. linux内核分成如下五个子系统,linux内核主要由5个子系统 Linux内核由哪几个子系统组成?...

    1, Linux内核由哪几个子系统组成? Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信.1.进程调度(SCHED):控制进程对CPU的访问.当需要选择下一 ...

  6. Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理

    为什么80%的码农都做不了架构师?>>>    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 本书使用高分辨率精心绘制的300多张图片,帮助大家理解操作系统特有 ...

  7. linux内核锁死怎么解决_解决Linux内核中的2038年问题

    linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间. 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示 ...

  8. iso linux 内核版本号_Linux发行版和Linux内核的区别

    Linux内核版本与linux发行版本的区别 LINUX内核版本 是指系统内核的版本号.LINUX的内核具有两种不同的版本号,实验版本和产品化版本.要确定 LINUX版本 的类型,只要查看一下版本号: ...

  9. Linux内核学习之路_1_编译Linux内核

    1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...

  10. 图解linux内核设计艺术,Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理...

    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 作者:新设计团队 出版日期:2011年05月 文件大小:29.01M 支持设备: ¥6.00在线试读 适用客户端: 言商书局 iPa ...

最新文章

  1. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...
  2. linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
  3. 图文详解 Kubernetes,刺激…
  4. 技术实践 | 网易云信 QUIC 加速服务架构与实践
  5. 进程的退出方式以及僵尸进程和孤儿进程
  6. 除掉字符串里面相同的字符
  7. 电影控、如何从视频文件名获取信息
  8. 建议能在园子里面发布Silverlight2.0应用
  9. 网络术语还在困扰你吗?
  10. echarts地图下钻可缩放
  11. MATLAB-数组的使用
  12. pccad 电气元件_CAD电气符号库下载|cad电气符号图库大全 GB4728完整版 - 极光下载站...
  13. php curl 417,PHP Curl 417 Expectation Failed解决办法
  14. linux安装压缩文件的工具,Linux上安装rar解压工具
  15. 博达网站服务器地址怎么查,路由器博达路由器配置经典教程
  16. HTML设置文字和图片居中
  17. 云服务器修改dns服务器为阿里云公共dns服务器
  18. 【Redis | 黑马点评 + 思维导图】分布式锁
  19. 一文带你读懂“亚当理论”的精髓:期货股票交易操作守则与操作技巧
  20. uniapp引入使用pixi.js遇到的坑

热门文章

  1. 洛谷1072 Hankson 的趣味题
  2. 远程桌面 端口号修改 3389端口修改
  3. 相控阵天线方位角俯仰角matlab画图,基于相控阵天线测试的波束指向角计算方法...
  4. redis设置key的时间戳
  5. IT人才外包的驻场外派流程是怎样的?
  6. 开源 | 在Github开源社区做了两年的我,现在怎么样了?
  7. C# 二维码生成支持汉字中间带图片
  8. 小羊驼和你一起学习cocos2d-x之六(lua、android.mk)
  9. 小红书去水印代码_PHP语言对接抖音快手小红书视频/图片去水印API接口源码
  10. 第四次工业革命 (The Industrial Revolution):人工智能 (AI)