# 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、设备文件权限时,会清楚很多。