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
linux内核挂载nfs,NFS Client in Linux Kernel - Mount相关推荐
- 【Linux下挂载QNAP NFS 共享权限异常处理】
Linux下挂载QNAP NFS 共享权限异常处理 前言 現象 處理 相關命令 NFS 配置中的權限壓縮 前言 在Linux 上掛載QNAP的NFS共享且啟用ACL可能會遇到ROOT用戶正常,但非RO ...
- 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )
文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...
- linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档
处理器:Exynos4412 Cortex_A9 四核 一: 4412 uboot 目录: uboot基本配置编译 make xxx_config 编译结果如上图. Uboot启动第一阶段分析: 1 ...
- Linux内核分析(三)----初识linux内存管理子系统
原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...
- linux内核分成如下五个子系统,linux内核主要由5个子系统 Linux内核由哪几个子系统组成?...
1, Linux内核由哪几个子系统组成? Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信.1.进程调度(SCHED):控制进程对CPU的访问.当需要选择下一 ...
- Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理
为什么80%的码农都做不了架构师?>>> Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 本书使用高分辨率精心绘制的300多张图片,帮助大家理解操作系统特有 ...
- linux内核锁死怎么解决_解决Linux内核中的2038年问题
linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间. 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示 ...
- iso linux 内核版本号_Linux发行版和Linux内核的区别
Linux内核版本与linux发行版本的区别 LINUX内核版本 是指系统内核的版本号.LINUX的内核具有两种不同的版本号,实验版本和产品化版本.要确定 LINUX版本 的类型,只要查看一下版本号: ...
- Linux内核学习之路_1_编译Linux内核
1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...
- 图解linux内核设计艺术,Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理...
Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 作者:新设计团队 出版日期:2011年05月 文件大小:29.01M 支持设备: ¥6.00在线试读 适用客户端: 言商书局 iPa ...
最新文章
- java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...
- linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
- 图文详解 Kubernetes,刺激…
- 技术实践 | 网易云信 QUIC 加速服务架构与实践
- 进程的退出方式以及僵尸进程和孤儿进程
- 除掉字符串里面相同的字符
- 电影控、如何从视频文件名获取信息
- 建议能在园子里面发布Silverlight2.0应用
- 网络术语还在困扰你吗?
- echarts地图下钻可缩放
- MATLAB-数组的使用
- pccad 电气元件_CAD电气符号库下载|cad电气符号图库大全 GB4728完整版 - 极光下载站...
- php curl 417,PHP Curl 417 Expectation Failed解决办法
- linux安装压缩文件的工具,Linux上安装rar解压工具
- 博达网站服务器地址怎么查,路由器博达路由器配置经典教程
- HTML设置文字和图片居中
- 云服务器修改dns服务器为阿里云公共dns服务器
- 【Redis | 黑马点评 + 思维导图】分布式锁
- 一文带你读懂“亚当理论”的精髓:期货股票交易操作守则与操作技巧
- uniapp引入使用pixi.js遇到的坑
热门文章
- 洛谷1072 Hankson 的趣味题
- 远程桌面 端口号修改 3389端口修改
- 相控阵天线方位角俯仰角matlab画图,基于相控阵天线测试的波束指向角计算方法...
- redis设置key的时间戳
- IT人才外包的驻场外派流程是怎样的?
- 开源 | 在Github开源社区做了两年的我,现在怎么样了?
- C# 二维码生成支持汉字中间带图片
- 小羊驼和你一起学习cocos2d-x之六(lua、android.mk)
- 小红书去水印代码_PHP语言对接抖音快手小红书视频/图片去水印API接口源码
- 第四次工业革命 (The Industrial Revolution):人工智能 (AI)