Linux驱动 2026年4月21日 24 分钟

NFS中的exports文件与chmod相关命令

# NFS中的exports文件与chmod权限详解 在搭建 NFS 环境并使用网络挂载根文件系统时,通常会接触两个非常…

# NFS中的exports文件与chmod权限详解

在搭建 NFS 环境并使用网络挂载根文件系统时,通常会接触两个非常重要的知识点:

1. **`/etc/exports` 文件的作用**

2. **Linux 文件权限与 `chmod` 命令**

很多初学者会把这两者混在一起。实际上,它们解决的是两个不同层面的问题:

– `/etc/exports`:决定 **NFS 服务器把哪些目录共享给哪些客户端,以及共享方式是什么**

– `chmod`:决定 **共享出去之后,文件和目录本身的访问权限是什么**

## 1. `/etc/exports` 文件有什么作用

先纠正一个容易写错的地方:

> NFS 服务通常修改的是 **`/etc/exports`**,不是 `/etc/export`

`/etc/exports` 是 **NFS 服务器端的共享目录配置文件**

你可以把它理解成:

> **NFS 的共享清单**

它告诉系统:

– 哪个目录可以通过 NFS 共享出去

– 允许哪些客户端访问

– 客户端访问时是只读还是读写

– root 用户访问时是否保留 root 身份

– 是否采用同步写入等

## 2. `/etc/exports` 的典型写法

例如:

“`bash

/home/eh/linux/nfs/xuexi/rootfs *(rw,sync,no_root_squash,no_subtree_check)

“`

这一行的含义是:

**共享目录**:`/home/eh/linux/nfs/xuexi/rootfs`

**允许访问的客户端**:`*`,表示所有客户端

**`rw`**:允许读写

**`sync`**:同步写入

**`no_root_squash`**:客户端 root 用户在服务器上仍按 root 对待

**`no_subtree_check`**:关闭子树检查

## 3. `/etc/exports` 为什么重要

在 NFS 根文件系统启动时,开发板启动后会通过网络把服务器上的某个目录挂载为 Linux 根目录 `/`。

如果 `/etc/exports` 没有正确配置,常见问题包括:

– 根文件系统挂载失败

– 启动时报权限错误

– 只能读不能写

– root 用户在客户端写文件失败

所以 `/etc/exports` 本质上控制的是:

> **“这个目录能不能被共享,以及共享规则是什么”**

## 4. `/etc/exports` 的基本格式

格式如下:

“`bash

共享目录 客户端1(选项) 客户端2(选项) …

“`

例如:

“`bash

/home/eh/linux/nfs/xuexi/rootfs 192.168.10.50(rw,sync,no_root_squash)

/opt/share 192.168.10.0/24(ro,sync)

/data *(rw,sync)

“`

含义分别是:

– 第一行:只允许 `192.168.10.50` 读写访问

– 第二行:允许整个 `192.168.10.0/24` 网段只读访问

– 第三行:允许所有客户端读写访问

## 5. `/etc/exports` 常见选项说明

### `rw`

允许客户端读写。

### `ro`

只允许客户端读取。

### `sync`

同步写入。客户端写数据时,服务器会认真落盘后再返回,更安全。

### `async`

异步写入。速度更快,但突然断电时数据风险更大。

### `root_squash`

把客户端的 root 用户映射成匿名普通用户。默认更安全。

### `no_root_squash`

客户端 root 用户在服务器上仍然保留 root 权限。

**NFS 根文件系统开发** 中经常使用这个选项,否则开发板以 root 身份运行时可能遇到大量权限问题。

### `no_subtree_check`

关闭子树检查。开发环境中很常见,能减少某些不必要的问题。

## 6. 修改 `/etc/exports` 后为什么要重新加载

修改 `/etc/exports` 后,NFS 服务不会自动马上全部生效,通常需要重新导出配置。

常见命令:

“`bash

exportfs -ra

“`

查看当前导出情况:

“`bash

exportfs -v

“`

所以流程通常是:

1. 修改 `/etc/exports`

2. 执行 `exportfs -ra`

3. 用 `exportfs -v` 检查配置是否生效

## 7. `chmod` 命令是干什么的

`chmod` 的作用是:

> **修改文件或目录的权限**

Linux 权限主要分三种:

– `r`:读(read)

– `w`:写(write)

– `x`:执行(execute)

而权限又是针对三类对象设置的:

**owner**:文件拥有者

**group**:文件所属组

**others**:其他用户

所以一个完整权限实际上是三组权限组合。

例如:

“`bash

rwxr-xr-x

“`

表示:

– owner:`rwx`

– group:`r-x`

– others:`r-x`

## 8. 为什么 `777` 代表权限

Linux 里经常用数字表示权限,这是 **八进制表示法**

每一位数字都由下面三项相加得到:

– `r = 4`

– `w = 2`

– `x = 1`

所以:

– `7 = 4 + 2 + 1 = rwx`

– `6 = 4 + 2 = rw-`

– `5 = 4 + 1 = r-x`

– `4 = 4 = r–`

## 9. `777` 是什么意思

`777` 可以拆成:

“`bash

777 = 7 7 7

“`

分别对应:

– owner = 7 = `rwx`

– group = 7 = `rwx`

– others = 7 = `rwx`

所以:

“`bash

chmod 777 file

“`

等价于:

“`bash

rwxrwxrwx

“`

即:

> **所有用户都可读、可写、可执行**

## 10. `777` 对文件和目录分别意味着什么

### 对普通文件

表示:

– 所有人都能读

– 所有人都能改

– 所有人都能执行

这通常过于宽松,不安全。

### 对目录

目录的权限含义和普通文件稍有不同:

– `r`:可以查看目录里的文件名

– `w`:可以在目录中创建、删除、改名

– `x`:可以进入目录、访问目录中的文件

所以目录设成 `777` 表示:

> **任何人都能进入目录、查看目录、修改目录内容**

权限非常大。

## 11. `0666` 是什么意思

`0666` 也是权限数字表示法。

写成:

“`bash

0666 = 0 6 6 6

“`

前面的 `0` 一般表示:

> 这是八进制数

真正的权限是后三位:

– owner = 6 = `rw-`

– group = 6 = `rw-`

– others = 6 = `rw-`

所以:

“`bash

chmod 666 file

“`

或者:

“`bash

chmod 0666 file

“`

都表示:

“`bash

rw-rw-rw-

“`

也就是:

> **所有用户都可读、可写,但不可执行**

## 12. `666``0666` 有区别吗

在 `chmod` 命令里通常可以理解为基本等价。

但是在很多文档、程序代码、系统调用中,经常写成 `0666`,是为了明确表示这是一个八进制权限值。

例如在 C 代码里常看到:

“`c

open(“test.txt”, O_CREAT, 0666);

“`

这是标准写法。

## 13. `777``0666` 的本质区别

两者最核心的区别是:

> **`777` 有执行权限 `x`,而 `0666` 没有执行权限。**

### `777`

“`bash

rwxrwxrwx

“`

可读、可写、可执行。

### `666` / `0666`

“`bash

rw-rw-rw-

“`

可读、可写、不可执行。

## 14. 为什么目录一般不会设成 `666`

因为目录必须有 `x` 权限,用户才能:

– `cd` 进入目录

– 访问目录中的文件

– 遍历这个目录路径

所以目录如果设成:

“`bash

666

“`

虽然看起来可读可写,但实际上往往 **不能正常进入目录**

因此:

**文件** 常见权限:`644`、`666`

**目录** 常见权限:`755`、`775`

## 15. 常见权限对照表

| 数字 | 字符形式 | 含义 |

|——|———-|——|

| 777 | rwxrwxrwx | 所有人可读、可写、可执行 |

| 755 | rwxr-xr-x | 拥有者可写,其他人可读可执行 |

| 700 | rwx—— | 只有拥有者可访问 |

| 666 | rw-rw-rw- | 所有人可读可写,不可执行 |

| 644 | rw-r–r– | 拥有者可写,其他人只读 |

| 600 | rw——- | 只有拥有者可读写 |

## 16. 在 NFS 根文件系统中为什么经常看到 `chmod 777`

这是开发阶段很常见的“图省事”做法。

因为 NFS 根文件系统启动后,开发板会在共享目录中进行大量操作,例如:

– 创建临时文件

– 写日志

– 修改配置

– 拷贝测试程序

– 删除旧文件

如果权限不足,就可能出现各种问题:

– 无法创建文件

– 无法写目录

– shell 启动异常

– 某些程序运行失败

为了快速排除权限问题,有些教程会直接执行:

“`bash

chmod -R 777 /home/eh/linux/nfs/xuexi/rootfs

“`

这样做的优点是:

– 快速

– 省事

– 基本不会因为权限卡住

但缺点也明显:

– 权限太宽松

– 不安全

– 不适合正式环境

## 17. 在 NFS 场景里 `/etc/exports``chmod` 的区别

这两个经常同时出现,但它们不是同一层控制。

### `/etc/exports`

决定:

> **这个目录能不能通过 NFS 共享出去,以及共享规则是什么**

比如:

– 允许哪些 IP 访问

– 是只读还是读写

– 是否允许 root 保持 root 权限

### `chmod`

决定:

> **共享出去之后,这个目录里的文件和子目录本身谁能读、谁能写、谁能执行**

你可以这样理解:

– `/etc/exports` 像“门卫规则”

– `chmod` 像“进门后每个房间、每个柜子的锁”

所以:

> **NFS 导出成功,不等于客户端一定能正常读写文件。**

因为真正读写时还要受文件系统自身权限限制。

## 18. 为什么有时候 exports 配好了还是权限有问题

因为 NFS 访问通常有两层权限控制:

### 第一层:NFS 导出规则

例如:

“`bash

/home/eh/linux/nfs/xuexi/rootfs *(rw,sync,no_root_squash)

“`

### 第二层:文件系统本身权限

例如目录和文件本身可能是:

“`bash

drwxr-xr-x

-rw-r–r–

“`

如果第二层权限不够,即使 NFS 已经正确导出,客户端也不一定能写入。

所以开发中经常要一起处理:

– `/etc/exports`

– `chmod`

– `chown`

## 19. 开发阶段与正式环境的常见做法

### 开发调试阶段

为了尽快跑通系统,常见粗放做法是:

“`bash

chmod -R 777 /home/eh/linux/nfs/xuexi/rootfs

“`

并配合:

“`bash

/home/eh/linux/nfs/xuexi/rootfs *(rw,sync,no_root_squash,no_subtree_check)

“`

优点:

– 快速排除权限问题

– 调试方便

缺点:

– 非常不安全

– 只适合可信开发网络环境

### 更合理的长期做法

更推荐的做法通常是:

– 目录用 `755` 或 `775`

– 普通文件用 `644`

– 可执行程序和脚本用 `755`

– 配合 `chown` 设置正确拥有者

– 对确实需要写的目录单独放开权限,例如:

  – `/tmp`

  – `/var`

  – `/run`

  – 某些日志目录

## 20. 一句话总结

### `/etc/exports` 的作用

> **定义 NFS 服务器把哪些目录共享给哪些客户端,以及共享选项是什么。**

### `777` 的含义

> **rwxrwxrwx,所有用户都可读、可写、可执行。**

### `0666` 的含义

> **rw-rw-rw-,所有用户都可读、可写,但不可执行。**

### 两者本质区别

> **`777``666/0666` 多了执行权限 `x`**

### 在 NFS rootfs 场景里的本质理解

> **`/etc/exports` 决定目录能否共享;`chmod` 决定共享之后文件和目录的具体访问权限。**

## 21. 对嵌入式 Linux 开发者的建议

在搭建 NFS 根文件系统时,可以先用宽松权限快速跑通环境,但真正理解后,建议逐步过渡到更合理的权限设置。

开发时要养成下面这个思路:

1. **先看 `/etc/exports` 是否允许客户端访问**

2. **再看目录和文件本身的权限是否足够**

3. **必要时检查所有者和所属组(`chown`)**

4. **不要长期依赖 `777` 作为最终方案**

这样在后面调试内核、驱动、NFS rootfs、设备文件权限时,会清楚很多。

上一篇 Linux文件检索

# Linux 文件检索命令 ## 目录 – [find 命令](#一find-命令) – [g...

下一篇 为啥编译Linux内核模块时需要先编译内核

# 为什么编译 Linux 内核模块前,通常要先编译一下 Linux 内核 在学习 Linux 驱动开发时,很多教程都会...