文件系统之mount执行流程

本文详细解析了Linux内核中的挂载机制,包括mount命令的系统调用处理、do_mount函数流程、do_new_mount函数查找文件系统类型、vfs_kern_mount初始化struct mount结构并调用mount_fs完成挂载过程,以及do_add_mount将mount信息添加到命名空间的挂载树中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这里参考的linux内核版本是3.10。

主要函数:

kernel/fs/namespace.c:

SYSCALL_DEFINE5(mount,....)

do_mount()

vfs_kern_mount()


kernel/fs/filesystems.c

get_fs_type()

kernel/fs/super.c

mount_fs()


1 用户空间执行mount命令后,会执行系统mount的系统调用,内核中的对应处理函数是SYSCALL_DEFINE5()。

2 内核中SYSCALL_DEFINE5()的处理流程:

   首先完成参数的拷贝,然后执行do_mount()

3 do_mount()函数中主要调用了do_new_mount() 函数

4. do_new_mount() 函数首先根据函数get_fs_type(fstype),找到fstype对应的struct file_system_type *类型的结构体指针,该指针的所有指向的成员函数最终完成挂载。

 需要说明的是fstype对应的文件类型是在register_filesystem()处注册在了全局的变量file_systems。

5 vfs_kern_mount()中初始化了了struct mount* mnt,之后调用mount_fs()完成挂载。

6 在最后do_add_mount()中,add a mount into a namespace's mount tree.


<think>好的,用户的问题是关于在Linux中挂载NFS文件系统或解决挂载过程中遇到的问题。我需要根据提供的引用内容来组织回答,同时遵循系统级指令。首先,我需要确保回答结构清晰,分步骤说明挂载过程,并解决常见问题。 首先,引用[1]详细描述了挂载NFS的步骤,包括安装服务、配置目录、导出设置以及测试挂载。我需要将这些步骤整理成清晰的步骤列表,并确保使用正确的命令。同时,要注意用户可能遇到的权限问题,比如exports文件的配置是否正确,目录权限是否开放。 然后,引用[2]提供了NFS的背景信息,虽然用户可能不需要这部分,但可以作为补充说明,增强回答的完整性。引用[3]提到了构建文件系统后复制到NFS目录,这部分可能在开发板环境中使用,需要提及应用场景,比如嵌入式开发中的使用。 接下来,用户的问题可能涉及挂载失败的情况,比如权限问题、版本不匹配或防火墙设置。需要根据常见问题列出解决方案,例如检查NFS服务状态、确认版本一致性、关闭防火墙等。 需要确保回答中使用正确的中文,行内数学公式用$...$,但在这个问题中可能用不上。但如果有变量或路径,需要用代码块或引号标出。例如,路径/home/用户名/nfs_rootfs需要正确显示。 另外,用户可能需要生成相关问题,我需要考虑常见的后续问题,比如性能优化、权限配置、自动挂载等。这些问题应该与挂载NFS相关,并且有实际意义。 需要检查是否有遗漏的步骤,比如exports配置后的exportfs命令和重启服务,这些步骤是否必要,以及如何验证挂载是否成功。例如,在Ubuntu上测试挂载到/mnt,或者在开发板上执行mount命令。 可能遇到的问题包括NFS版本不一致,例如vers=3需要客户端和服务端一致,或者防火墙阻止了2049端口。需要提醒用户检查这些方面。 最后,确保回答结构清晰,分步骤说明安装配置、挂载步骤、常见问题解决,并且引用标识正确添加在相关段落末尾。同时,生成的相关问题要覆盖用户可能感兴趣的扩展话题。</think>### Linux挂载NFS文件系统流程解析 #### 一、NFS服务端配置步骤 1. **安装NFS服务** ```bash sudo apt-get install nfs-kernel-server ``` 2. **创建共享目录** ```bash cd ~ && mkdir nfs_rootfs chmod 777 nfs_rootfs # 确保开放权限 ``` 3. **配置exports文件** ```bash sudo vi /etc/exports ``` 添加以下内容(替换`<用户名>`为实际值): ``` /home/<用户名>/nfs_rootfs *(rw,nohide,insecure,no_subtree_check,async,no_root_squash) ``` - `rw`:允许读写 - `no_root_squash`:允许root用户访问[^1] 4. **生效配置并重启服务** ```bash sudo exportfs -arv # 重新加载exports配置 sudo systemctl restart nfs-kernel-server ``` #### 二、客户端挂载操作 1. **Ubuntu本地测试** ```bash sudo mount -t nfs -o nolock,vers=3 192.168.1.100:/home/user/nfs_rootfs /mnt ``` - `vers=3`:指定NFSv3协议(需与服务端一致) - `nolock`:禁用文件锁(适用于简单环境) 2. **开发板挂载** ```bash mount -t nfs -o nolock,vers=3 192.168.1.100:/home/user/nfs_rootfs /mnt ``` 成功后可通过`df -h`验证挂载状态[^3] #### 三、常见问题解决方案 | 问题现象 | 排查步骤 | |------------------------|--------------------------------------------------------------------------| | **挂载超时** | 1. 检查`ping`测试网络连通性<br>2. 确认服务端防火墙开放2049端口 | | **Permission Denied** | 1. 检查共享目录权限是否为`777`<br>2. 确认exports配置包含`no_root_squash` | | **协议版本不匹配** | 1. 服务端/客户端均添加`vers=3`参数<br>2. 更新`nfs-common`软件包 | | **Stale File Handle** | 1. 强制卸载`umount -l /mnt`<br>2. 重启NFS服务后重新挂载 | #### 四、嵌入式开发场景应用 使用Buildroot生成根文件系统后,可通过NFS直接挂载测试: ```bash cp rootfs.tar ~/nfs_rootfs/ && tar -xvf rootfs.tar # 解压到NFS目录 ``` 开发板启动时加载NFS根文件系统可加速调试流程[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值