|
|
@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
这个问题分为两个部分:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. **Linux 端**:如何正确地安装、配置并启动 NFS 服务。
|
|
|
|
|
|
|
|
2. **Windows 端**:如何解决“无法创建映射网络驱动器”的常见问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我们将先确保 Linux 服务端配置无误,然后再排查 Windows 客户端的问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### **第一部分:在 Linux 上开启和配置 NFS 服务**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本教程以 CentOS/RHEL 和 Debian/Ubuntu 这两大主流 Linux 发行版为例。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **步骤 1:安装 NFS 服务器软件包**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **在 CentOS / RHEL / Fedora 上:**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo yum install -y nfs-utils
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **在 Debian / Ubuntu 上:**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo apt-get update
|
|
|
|
|
|
|
|
sudo apt-get install -y nfs-kernel-server
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **步骤 2:创建要共享的目录**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
假设我们要共享 `/data/nfs-share` 这个目录。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 创建目录:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo mkdir -p /data/nfs-share
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. **设置正确的权限**。这是一个关键步骤。为了让 Windows 客户端能够读写,我们需要确保 NFS 服务有权限操作这个目录。最简单的方式是将其所有权交给 `nfsnobody` 用户和组,这是一个专门为 NFS 匿名访问设计的用户。
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo chown -R nfsnobody:nfsnobody /data/nfs-share
|
|
|
|
|
|
|
|
# 也可以设置宽松的权限,但这在生产环境中需谨慎
|
|
|
|
|
|
|
|
sudo chmod 777 /data/nfs-share
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **步骤 3:配置 NFS 共享**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NFS 的共享配置在 `/etc/exports` 文件中。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 编辑该文件:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo vim /etc/exports
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 在文件末尾添加一行来定义共享规则。格式为:
|
|
|
|
|
|
|
|
`要共享的目录 客户端IP或网段(选项1,选项2,...)`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**示例配置:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **允许特定 IP (例如 `192.168.1.100`) 的 Windows 客户端读写:**
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
/data/nfs-share 192.168.1.100(rw,sync,no_root_squash)
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **允许整个 `192.168.1.0/24` 网段的客户端读写(更常用):**
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
/data/nfs-share 192.168.1.0/24(rw,sync,no_root_squash)
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**常用选项解释:**
|
|
|
|
|
|
|
|
* `rw`: (Read/Write) 允许读写。如果是只读,用 `ro`。
|
|
|
|
|
|
|
|
* `sync`: 数据同步写入磁盘。更安全,但性能稍低。`async` 是异步写入。
|
|
|
|
|
|
|
|
* `no_root_squash`: **这是连接 Windows 客户端时非常重要的一个选项**。它允许客户端以 root 用户身份写入文件时,在服务端也保留 root 身份。如果不加这个选项,客户端的 root 会被映射成服务端的匿名用户(`nfsnobody`),可能导致权限问题。
|
|
|
|
|
|
|
|
* `all_squash`: 将所有客户端用户都映射为匿名用户。
|
|
|
|
|
|
|
|
* `anonuid` 和 `anongid`: 与 `all_squash` 配合,指定映射到的匿名用户的 UID 和 GID。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **步骤 4:启动并设置开机自启 NFS 服务**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **在 CentOS / RHEL / Fedora 上:**
|
|
|
|
|
|
|
|
NFS 依赖 `rpcbind` (或 `portmap`) 服务,需要先启动它。
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo systemctl enable rpcbind
|
|
|
|
|
|
|
|
sudo systemctl enable nfs-server
|
|
|
|
|
|
|
|
sudo systemctl start rpcbind
|
|
|
|
|
|
|
|
sudo systemctl start nfs-server
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **在 Debian / Ubuntu 上:**
|
|
|
|
|
|
|
|
服务通常命名为 `nfs-kernel-server`。
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo systemctl enable nfs-kernel-server
|
|
|
|
|
|
|
|
sudo systemctl start nfs-kernel-server
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **步骤 5:使配置生效并检查防火墙**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. **使 `/etc/exports` 的配置生效:**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo exportfs -a
|
|
|
|
|
|
|
|
# 检查当前共享状态
|
|
|
|
|
|
|
|
sudo exportfs -v
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. **配置防火墙**。NFS 服务需要开放 `nfs` (2049端口), `mountd`, 和 `rpc-bind` 端口。
|
|
|
|
|
|
|
|
* **使用 `firewalld` (CentOS/RHEL 默认):**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
sudo firewall-cmd --permanent --add-service=nfs
|
|
|
|
|
|
|
|
sudo firewall-cmd --permanent --add-service=mountd
|
|
|
|
|
|
|
|
sudo firewall-cmd --permanent --add-service=rpc-bind
|
|
|
|
|
|
|
|
sudo firewall-cmd --reload
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
* **使用 `ufw` (Ubuntu 默认):**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
# 允许特定 IP 或网段访问
|
|
|
|
|
|
|
|
sudo ufw allow from 192.168.1.0/24 to any port nfs
|
|
|
|
|
|
|
|
sudo ufw enable
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
至此,您的 Linux NFS 服务器已经配置完毕并运行。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### **第二部分:在 Windows 上排查“无法创建映射网络驱动器”问题**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 Windows 上连接 NFS 失败,通常有以下几个原因:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **1. Windows NFS 客户端功能未安装**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这是最常见的原因。Windows 默认不安装 NFS 客户端。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **操作方法**:
|
|
|
|
|
|
|
|
1. 打开 “控制面板” -> “程序” -> “启用或关闭 Windows 功能”。
|
|
|
|
|
|
|
|
2. 在列表中找到并展开 **“NFS 服务”**。
|
|
|
|
|
|
|
|
3. 勾选 **“NFS 客户端”**。
|
|
|
|
|
|
|
|
4. 点击“确定”进行安装,可能需要重启电脑。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **2. 网络连接或防火墙问题**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **确认网络连通性**:在 Windows 的命令提示符(cmd)中,`ping <Linux服务器IP>`,确保可以 ping 通。
|
|
|
|
|
|
|
|
* **Linux 防火墙**:请再次确认您已按照**第一部分步骤 5**正确开放了 NFS 相关服务的端口。
|
|
|
|
|
|
|
|
* **Windows 防火墙**:尝试暂时关闭 Windows 防火墙,看是否能连接成功。如果可以,说明需要为 NFS 连接在 Windows 防火墙中添加入站/出站规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **3. 权限和用户映射问题**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这是最棘手的问题。Windows 的用户体系 (SID) 和 Linux 的用户体系 (UID/GID) 完全不同。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **匿名访问认证**:当 Windows 以普通用户身份连接时,NFS 服务端通常会将其视为匿名用户。
|
|
|
|
|
|
|
|
* **解决方案**:
|
|
|
|
|
|
|
|
1. 确保您在 Linux 端的 `/etc/exports` 配置中使用了 `all_squash`,并将权限赋予了匿名用户。
|
|
|
|
|
|
|
|
2. **修改 Windows 注册表以匹配匿名 UID/GID**。这是解决权限问题的关键。
|
|
|
|
|
|
|
|
a. 按 `Win + R`,输入 `regedit` 打开注册表编辑器。
|
|
|
|
|
|
|
|
b. 导航到 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default`。
|
|
|
|
|
|
|
|
c. 在右侧窗格中,右键新建两个 `DWORD (32 位) 值`:
|
|
|
|
|
|
|
|
* `AnonymousUid`
|
|
|
|
|
|
|
|
* `AnonymousGid`
|
|
|
|
|
|
|
|
d. 双击这两个新建的值,将它们的**基数**改为**十进制**,然后输入 Linux 端 `nfsnobody` 用户的 UID 和 GID。
|
|
|
|
|
|
|
|
* **如何查找 `nfsnobody` 的 UID/GID?** 在 Linux 上执行:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
id nfsnobody
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
输出可能像这样: `uid=65534(nfsnobody) gid=65534(nfsnobody) ...`
|
|
|
|
|
|
|
|
* 那么就在 Windows 注册表中将 `AnonymousUid` 和 `AnonymousGid` 的值都设置为 `65534`。
|
|
|
|
|
|
|
|
e. **重启 Windows 电脑**或**重启 NFS 客户端服务**(在“服务”中找到 `Client for NFS` 右键重启)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### **4. 映射驱动器时的语法错误**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **正确语法**:在“映射网络驱动器”窗口中,路径格式应为:
|
|
|
|
|
|
|
|
`\\<Linux服务器IP>\<Linux共享目录的绝对路径>`
|
|
|
|
|
|
|
|
**注意**:路径中的斜杠是**反斜杠 `\`**。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **示例**:
|
|
|
|
|
|
|
|
`\\192.168.1.50\/data/nfs-share`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **使用命令行 `mount`**:
|
|
|
|
|
|
|
|
打开**管理员权限**的命令提示符或 PowerShell。
|
|
|
|
|
|
|
|
```cmd
|
|
|
|
|
|
|
|
mount \\<Linux服务器IP>\<Linux共享目录> <盘符>:
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
**示例:**
|
|
|
|
|
|
|
|
```cmd
|
|
|
|
|
|
|
|
mount \\192.168.1.50\data\nfs-share Z:
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
使用命令行通常能看到更详细的错误提示,例如 `Network Error - 53` (找不到网络路径) 或 `Network Error - 67` (找不到网络名) 等,有助于进一步排查。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### **排查流程总结**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. **先搞定 Linux 端**:安装 -> 创建目录 -> 设置权限 -> 配置 `/etc/exports` -> 启动服务 -> 配置防火墙。
|
|
|
|
|
|
|
|
2. **再处理 Windows 端**:
|
|
|
|
|
|
|
|
* 确认 **NFS 客户端**已安装。
|
|
|
|
|
|
|
|
* 确认**网络可达** (`ping`)。
|
|
|
|
|
|
|
|
* **关键**:修改**注册表**中的 `AnonymousUid` 和 `AnonymousGid`,使其与 Linux 端的 `nfsnobody` 用户匹配。
|
|
|
|
|
|
|
|
* **重启** Windows 的 NFS 客户端服务或电脑。
|
|
|
|
|
|
|
|
* 使用**正确的语法** (`\\IP\path`) 进行映射。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
遵循这个流程,绝大多数 Windows 连接 Linux NFS 的问题都可以得到解决。
|