08-27-周三_17-09-29
This commit is contained in:
631
Linux服务/NFS网络文件共享.md
Normal file
631
Linux服务/NFS网络文件共享.md
Normal file
@@ -0,0 +1,631 @@
|
||||
# NFS网络文件共享
|
||||
|
||||
NFS(Network File System)是一种分布式文件系统协议,最初由Sun Microsystems在1984年开发。NFS允许计算机在网络上共享文件和目录,就像这些文件和目录位于本地计算机上一样。它广泛应用于UNIX和类UNIX系统中,但也可以在其他操作系统上使用,如Windows和macOS。
|
||||
|
||||
## NFS简介与RPC简介
|
||||
|
||||
### NFS服务介绍
|
||||
|
||||
NFS是一种网络协议,NFS依赖RPC才能工作。
|
||||
|
||||
NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。可以理解为把一个电脑上的硬盘挂载到另一个电脑上使用,另一个电脑能够像使用自己本地硬盘使用挂载的硬盘。
|
||||
|
||||
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责信息的传输。
|
||||
|
||||
### RPC协议介绍
|
||||
|
||||
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。其工作在TCP/UDP的111端口。建立在Socket之上的,主要是简化编程的工作在底层提供网络之间的通信。
|
||||
|
||||
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
|
||||
|
||||
#### RPC 远程过程调度
|
||||
|
||||
* NFS 协议本身并没有网络传输功能,而是基于远程过程调用协议实现的
|
||||
* 提供一个面向过程的远程服务的接口
|
||||
* 可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术的协议
|
||||
* 工作在 OSI 模型的会话层,它可以为遵从 RPC 协议应用层协议提供端口注册功能
|
||||
* 事实上,有很多服务(NFS 和 NIS 等)都可以向 RPC 注册端口
|
||||
* RPC 使用网络端口 111 来监听客户端的请求
|
||||
|
||||
#### RPC 协议模型
|
||||
|
||||
1. 基于 rpc 的服务(此处是指 nfs 服务,在别处有可能是代表其他服务)在启动时向 portmapper 注册端口
|
||||
2. 基于 rpc 的客户端联系服务端 portmapper 询问服务的端口号
|
||||
3. portmapper 告知客户端基于 rpc 服务使用的端口号
|
||||
4. 基于 rpc 的客户端访问被告知单某基于 rpc 服务的端口
|
||||
5. 基于 rpc 的服务响应客户端的请求
|
||||
|
||||

|
||||
|
||||
### NFS工作流程
|
||||
|
||||
1. 首先服务器端启动RPC服务,并开启111端口
|
||||
2. 然后还需要服务器端启动NFS服务,并向RPC注册端口信息
|
||||
3. 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
|
||||
4. 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
|
||||
5. 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
|
||||
|
||||
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/VgPgforTeyQakK6L.png!thumbnail" alt="img" />
|
||||
|
||||
### 挂载原理/过程
|
||||
|
||||
当我们在NFS服务器设置好一个共享目录/opt 后,其他人是有权访问/opt这个共享目录的,NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点(这个挂载点可以自己定义),路径不同也可以;如下图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/opt下的所有数据。
|
||||
|
||||
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/image-20250109102300565.png" alt="image-20250109102300565" style="zoom:80%;" />
|
||||
|
||||
# NFS共享实战
|
||||
|
||||
## 准备工作
|
||||
|
||||
一、服务器信息:
|
||||
|
||||
```bash
|
||||
主机 IP 服务 端口
|
||||
服务端: 192.168.88.10 nfs rpc 2049 111
|
||||
客户端: 192.168.88.20 nfs rpc 2049 111
|
||||
```
|
||||
|
||||
二、关闭防火墙
|
||||
|
||||
```bash
|
||||
# 关闭防火墙
|
||||
systemctl stop firewalld
|
||||
# 禁止防火墙开机自启
|
||||
systemctl disable firewalld
|
||||
```
|
||||
|
||||
如果必须开启防火墙,我们可以通过firewalld放行nfs和rpc服务
|
||||
|
||||
```bash
|
||||
# 开启nfs和rpc服务
|
||||
firewall-cmd --permanent --add-service=nfs
|
||||
firewall-cmd --permanent --add-service=rpc-bind
|
||||
|
||||
# 重载防火墙规则
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
三、关闭SELinux
|
||||
|
||||
```bash
|
||||
setenforce 0
|
||||
```
|
||||
|
||||
四、检查内核是否支持
|
||||
|
||||
```bash
|
||||
modinfo nfs
|
||||
```
|
||||
|
||||
## NFS软件介绍
|
||||
|
||||
相关软件包:nfs-utils、rpcbind
|
||||
|
||||
端口:2049(nfsd),其它端口由 portmap(111)分配。CentOS 6 开始 portmap 进程由 rpcbind 代替
|
||||
|
||||
NFS 服务主要进程:
|
||||
|
||||
* rpc.nfsd 最主要的 NFS 进程, 管理客户端是否可登录
|
||||
* rpc.mountd 挂载和卸载 NFS 文件系统,包括权限管理
|
||||
* rpc.lockd 非必要,管理文件锁,避免同时写出错
|
||||
* rpc.statd 非必要, 检查文件-致性, 可修复文件
|
||||
* 日志:/var/lib/nfs
|
||||
|
||||
配置文件:
|
||||
|
||||
* /etc/exports
|
||||
* /etc/exports.d/*.exports
|
||||
|
||||
## NFS部署
|
||||
|
||||
一、安装rpcbind和nfs服务
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# yum -y install rpcbind nfs-utils
|
||||
```
|
||||
|
||||
二、启动服务
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# systemctl enable --now rpcbind
|
||||
[root@localhost ~]# systemctl enable --now nfs-server
|
||||
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
|
||||
```
|
||||
|
||||
三、验证服务
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# systemctl status rpcbind
|
||||
● rpcbind.service - RPC Bind
|
||||
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; preset: enabled)
|
||||
Active: active (running) since Thu 2025-01-09 10:54:21 CST; 51s ago
|
||||
TriggeredBy: ● rpcbind.socket
|
||||
Docs: man:rpcbind(8)
|
||||
Main PID: 26847 (rpcbind)
|
||||
Tasks: 1 (limit: 10888)
|
||||
Memory: 1.6M
|
||||
CPU: 28ms
|
||||
CGroup: /system.slice/rpcbind.service
|
||||
└─26847 /usr/bin/rpcbind -w -f
|
||||
|
||||
Jan 09 10:54:21 localhost.localdomain systemd[1]: Starting RPC Bind...
|
||||
Jan 09 10:54:21 localhost.localdomain systemd[1]: Started RPC Bind.
|
||||
[root@localhost ~]# systemctl status nfs-server
|
||||
● nfs-server.service - NFS server and services
|
||||
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)
|
||||
Active: active (exited) since Thu 2025-01-09 10:54:39 CST; 42s ago
|
||||
Docs: man:rpc.nfsd(8)
|
||||
man:exportfs(8)
|
||||
Process: 27817 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
|
||||
Process: 27818 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
|
||||
Process: 27836 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, st>
|
||||
Main PID: 27836 (code=exited, status=0/SUCCESS)
|
||||
CPU: 35ms
|
||||
|
||||
Jan 09 10:54:38 localhost.localdomain systemd[1]: Starting NFS server and services...
|
||||
Jan 09 10:54:39 localhost.localdomain systemd[1]: Finished NFS server and services.
|
||||
|
||||
# 端口号验证
|
||||
[root@localhost ~]# ss -nlt
|
||||
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
|
||||
LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
|
||||
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
|
||||
LISTEN 0 4096 0.0.0.0:111 0.0.0.0:*
|
||||
LISTEN 0 4096 0.0.0.0:56973 0.0.0.0:*
|
||||
LISTEN 0 64 0.0.0.0:46725 0.0.0.0:*
|
||||
LISTEN 0 4096 0.0.0.0:20048 0.0.0.0:*
|
||||
LISTEN 0 64 [::]:2049 [::]:*
|
||||
LISTEN 0 128 [::]:22 [::]:*
|
||||
LISTEN 0 4096 [::]:111 [::]:*
|
||||
LISTEN 0 64 [::]:35931 [::]:*
|
||||
LISTEN 0 4096 [::]:35405 [::]:*
|
||||
LISTEN 0 4096 [::]:20048 [::]:*
|
||||
```
|
||||
|
||||
### NFS配置文件格式
|
||||
|
||||
```shell
|
||||
/dir 主机 1(opt1,opt2) 主机 2(opt1,opt2)
|
||||
```
|
||||
|
||||
* 主机格式
|
||||
* 单个主机: ipv4, ipv6, FQDN
|
||||
* IP networks: 两种掩码格式均支持
|
||||
* 172.18.0.0/255.255.0.0
|
||||
* 172.18.0.0/16
|
||||
* wildcards:主机名通配,例如*.iproute.cn,IP 不可以
|
||||
* netgroups: NIS 域的主机组,@group_ name
|
||||
* anonymous:表示使用*通配所有客户端
|
||||
* 选项格式
|
||||
* 默认选项
|
||||
* (ro,sync,root_squash, no_all_squash)
|
||||
* ro, rw
|
||||
* 只读和读写
|
||||
* async
|
||||
* 异步,数据变化后不立即写磁盘,等磁盘空闲时再写入,性能高
|
||||
* sync
|
||||
* 同步(1.0.0 后为默认),数据在请求时立即写入共享存储磁盘
|
||||
* root_squash
|
||||
* 远程 root 映射为 nfsnobody(默认),UID 为 65534,Centos8 为 nobody, 早期版本是 4294967294 (nfsnobody)
|
||||
* no_root_squash
|
||||
* 远程 root 映射成 root 用户
|
||||
* all_squash
|
||||
* 所有远程用户(包括 root)都变成 nfsnobody , Centos8 为 nobody
|
||||
* no_all_squash
|
||||
* 保留共享文件的 UID 和 GID (默认)
|
||||
* anonuid 和 anongid
|
||||
* 指明匿名用户映射为特定用户 UID 和组 GID,而非 nfsnobody ,可配合 all_squash 使用
|
||||
|
||||
### NFS相关工具
|
||||
|
||||
#### rpcinfo
|
||||
|
||||
rpcinfo 工具可以查看 RPC 相关信息
|
||||
|
||||
查看注册在指定主机的 RPC 程序
|
||||
|
||||
```shell
|
||||
rpcinfo -p hostname
|
||||
```
|
||||
|
||||
查看 rpc 注册程序
|
||||
|
||||
```shell
|
||||
rpcinfo -s hostname
|
||||
```
|
||||
|
||||
#### exportfs
|
||||
|
||||
可用于管理 NFS 导出的文件系统
|
||||
|
||||
常见选项:
|
||||
|
||||
* **-v**:查看本机所有 NFS 共享
|
||||
* **-r**:重读配置文件,并共享目录
|
||||
* **-a**:输出本机所有共享
|
||||
* **-au**:停止本机所有共享
|
||||
|
||||
#### showmount
|
||||
|
||||
常见用法:
|
||||
|
||||
```shell
|
||||
showmount -e hostname
|
||||
```
|
||||
|
||||
### 配置共享目录
|
||||
|
||||
服务端上创建共享目录;这里我们要挂载的目录是`/myshare`
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkdir -p /myshare
|
||||
```
|
||||
|
||||
### 手动挂载案例
|
||||
|
||||
```bash
|
||||
# 服务端
|
||||
[root@localhost ~]# vim /etc/exports
|
||||
/myshare 192.168.88.0/24
|
||||
[root@localhost ~]# cd /myshare
|
||||
[root@localhost myshare]# echo "hello" > file
|
||||
[root@localhost ~]# systemctl stop firewalld
|
||||
[root@localhost ~]# setenforce 0
|
||||
|
||||
# 客户端:
|
||||
[root@localhost ~]# yum install -y nfs-utils rpcbind
|
||||
[root@localhost ~]# showmount -e 192.168.88.10
|
||||
Export list for 192.168.88.10:
|
||||
# 虽然我们自己配置共享了,但是没有重读配置文件,所以读不到
|
||||
|
||||
# 服务端:
|
||||
[root@localhost myshare]# exportfs -r
|
||||
exportfs: No options for /myshare 192.168.88.0/24: suggest 192.168.88.0/24(sync) to avoid warning
|
||||
[root@localhost myshare]# exportfs -v
|
||||
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
|
||||
|
||||
# 客户端:
|
||||
[root@localhost ~]# showmount -e 192.168.88.10
|
||||
Export list for 192.168.88.10:
|
||||
/myshare 192.168.88.0/24
|
||||
[root@localhost ~]# mkdir /mnt/nfs
|
||||
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
192.168.88.10:/myshare 17G 1.7G 16G 10% /mnt/nfs
|
||||
[root@localhost ~]# cd /mnt/nfs/
|
||||
[root@localhost nfs]# ls
|
||||
file
|
||||
[root@localhost nfs]# cat file
|
||||
hello
|
||||
[root@localhost ~]# rm -f file
|
||||
rm: cannot remove 'file': Read-only file system
|
||||
[root@localhost ~]# umount /mnt/nfs
|
||||
# 现在是只读模式,想要修改模式要去改配置文件,先卸载挂载
|
||||
|
||||
# 服务端:
|
||||
[root@localhost ~]# vim /etc/exports
|
||||
/myshare 192.168.88.0/24(rw,sync,root_squash,no_all_squash)
|
||||
[root@localhost myshare]# exportfs -v
|
||||
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
|
||||
[root@localhost myshare]# exportfs -r
|
||||
[root@localhost myshare]# exportfs -v
|
||||
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
|
||||
|
||||
# 客户端:
|
||||
[root@localhost ~]# showmount -e 192.168.88.10
|
||||
Export list for 192.168.88.10:
|
||||
/myshare 192.168.88.0/24
|
||||
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
192.168.88.10:/myshare 17G 1.7G 16G 10% /mnt/nfs
|
||||
[root@localhost ~]# cd /mnt/nfs/
|
||||
[root@localhost nfs]# rm -f file
|
||||
rm: cannot remove 'file': Permission denied
|
||||
# 虽然给了rw权限,但是目录权限被linux控制
|
||||
|
||||
# 服务端:
|
||||
[root@localhost myshare]# ll -d /myshare/
|
||||
drwxr-xr-x. 2 root root 18 Jan 9 15:59 /myshare/
|
||||
[root@localhost myshare]# chmod a+w /myshare/
|
||||
|
||||
# 客户端:
|
||||
[root@localhost nfs]# rm -f file
|
||||
[root@localhost nfs]# echo "Hello, This is server2" > file
|
||||
[root@localhost nfs]# ll
|
||||
total 4
|
||||
-rw-r--r--. 1 nobody nobody 23 Jan 9 16:14 file
|
||||
[root@localhost nfs]# su - user01
|
||||
[user01@localhost ~]$ cd /mnt/nfs/
|
||||
[user01@localhost nfs]$ touch file1
|
||||
[user01@localhost nfs]$ ll
|
||||
总用量 4
|
||||
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月 16 22:08 file
|
||||
-rw-rw-r-- 1 user01 user01 0 7月 16 22:11 file1
|
||||
|
||||
# 服务端:
|
||||
[root@localhost myshare]# ll
|
||||
总用量 4
|
||||
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月 16 22:08 file
|
||||
-rw-rw-r--. 1 1000 1000 0 7月 16 22:11 file1
|
||||
[root@localhost myshare]# useradd -u1000 zhangsan
|
||||
[root@localhost myshare]# ll
|
||||
总用量 4
|
||||
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月 16 22:08 file
|
||||
-rw-rw-r--. 1 zhangsan zhangsan 0 7月 16 22:11 file1
|
||||
[root@localhost ~]# vim /etc/exports
|
||||
/myshare 192.168.88.0/24(rw,sync,no_root_squash,all_squash)
|
||||
[root@localhost myshare]# exportfs -r
|
||||
[root@localhost myshare]# exportfs -v
|
||||
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,all_squash)
|
||||
|
||||
# 客户端:
|
||||
[root@localhost ~]# umount /mnt/nfs/
|
||||
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
|
||||
[root@localhost ~]# df -h
|
||||
[root@localhost ~]# cd /mnt/nfs/
|
||||
[root@localhost ~]# touch file{2,3}
|
||||
[root@localhost nfs]# ll
|
||||
总用量 4
|
||||
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月 16 22:08 file
|
||||
-rw-rw-r-- 1 user01 user01 0 7月 16 22:11 file1
|
||||
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月 16 22:26 file2
|
||||
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月 16 22:26 file3
|
||||
```
|
||||
|
||||
## mount.nfs挂载选项
|
||||
|
||||
客户端 NFS 挂载
|
||||
|
||||
NFS 相关的挂载选项:`man 5 nfs`
|
||||
|
||||
* **fg**:(默认)前台挂载,失败直接退出
|
||||
* **bg**:后台挂载,失败后会再次尝试
|
||||
* **hard**:(默认)持续请求
|
||||
* **soft**:非持续请求
|
||||
* **intr 和 hard 配合**:请求可中断
|
||||
* **rsize 和 wsize**:一次读和写数据最大字节数,rsize=32768
|
||||
* **nosuid**:忽略文件的suid特殊权限
|
||||
* **_netdev**:提示标志,表示挂载的是网络设备,启动时候先简历网络连接,再挂载设备
|
||||
* **noexec**:表示不允许执行
|
||||
|
||||
提示:基于安全考虑,建议使用`nosuid,_netdev,noexec`挂载选项
|
||||
|
||||
范例:临时挂载 NFS 共享
|
||||
|
||||
```shell
|
||||
mount -o rw,nosuid,fg,hard,intr 192.168.88.10:/myshare /mnt/nfs
|
||||
```
|
||||
|
||||
范例:开机挂载
|
||||
|
||||
```shell
|
||||
vim /etc/fstab
|
||||
192.168.88.10:/myshare /mnt/nfs nfs defaults,_netdev 0 0
|
||||
```
|
||||
|
||||
# 自动挂载
|
||||
|
||||
由于NFS的应用场景,需要我们挂载远程硬盘本地使用,所以我们可以使用autofs服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载。
|
||||
|
||||
主要用于客户端上,在客户端上自动挂载服务端提供的共享目录。
|
||||
|
||||
## 相关包和文件
|
||||
|
||||
* 软件包: autofs
|
||||
* 服务文件: /usr/lib/systemd/system/autofs.service
|
||||
* 配置文件: /etc/auto.master
|
||||
|
||||
客户端安装:
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# yum install -y autofs
|
||||
[root@localhost ~]# systemctl enable --now autofs
|
||||
```
|
||||
|
||||
## 配置autofs
|
||||
|
||||
`autofs` 的主要配置分为 **主配置文件** 和 **挂载映射文件**。
|
||||
|
||||
### **主配置文件 **
|
||||
|
||||
`/etc/auto.master` 是 `autofs` 的主配置文件,用于定义挂载点及其对应的映射文件。
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
/mnt/nfs /etc/auto.nfs --timeout=300
|
||||
```
|
||||
|
||||
配置说明:
|
||||
|
||||
- `/mnt/nfs`:挂载点的根目录。
|
||||
- `/etc/auto.nfs`:挂载点对应的映射文件。
|
||||
- `--timeout=300`:挂载超时时间(单位为秒),300 秒后未访问的挂载点将自动卸载。
|
||||
|
||||
**注意**:修改 `/etc/auto.master` 后需要重新加载 `autofs` 服务。
|
||||
|
||||
```bash
|
||||
systemctl reload autofs
|
||||
```
|
||||
|
||||
### 挂载映射文件 `/etc/auto.nfs`
|
||||
|
||||
挂载映射文件定义了具体的 NFS 挂载规则。
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
share1 -fstype=nfs4,rw,soft nfs-server:/export/share1
|
||||
share2 -fstype=nfs4,ro,hard nfs-server:/export/share2
|
||||
```
|
||||
|
||||
#### 配置说明:
|
||||
|
||||
- `share1` 和 `share2`:挂载点名称,最终挂载路径为 `/mnt/nfs/share1` 和 `/mnt/nfs/share2`。
|
||||
- `-fstype=nfs4`: 指定文件系统类型为 NFSv4。
|
||||
- `rw`/`ro`:挂载权限,`rw` 表示读写,`ro` 表示只读。
|
||||
- soft/hard:
|
||||
- **soft**:如果 NFS 服务器未响应,客户端将返回错误。
|
||||
- **hard**:客户端将无限期尝试连接,直到服务器恢复正常。
|
||||
- `nfs-server:/export/share1`:NFS 服务器地址及其共享路径。
|
||||
|
||||
**注意**:修改挂载映射文件后无需重启服务,`autofs` 会动态加载。
|
||||
|
||||
## 挂载案例
|
||||
|
||||
一、创建挂载点目录
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkdir /mnt/nfs
|
||||
```
|
||||
|
||||
二、配置autofs自动挂载
|
||||
|
||||
```bash
|
||||
# 编辑auto.master主配置文件
|
||||
[root@localhost ~]# vim /etc/auto.master
|
||||
/mnt/nfs /etc/auto.nfs
|
||||
[root@localhost ~]# systemctl restart autofs
|
||||
|
||||
# 编辑挂载映射文件
|
||||
[root@localhost ~]# vim /etc/auto.nfs
|
||||
share -fstype=nfs4,rw,soft 192.168.88.10:/myshare
|
||||
```
|
||||
|
||||
三、验证挂载
|
||||
|
||||
```bash
|
||||
# 访问挂载点以触发自动挂载
|
||||
[root@localhost ~]# ls /mnt/nfs/share
|
||||
dir file file1
|
||||
[root@localhost ~]# cd /mnt/nfs/share/
|
||||
[root@localhost share]# ls
|
||||
dir file file1
|
||||
[root@localhost share]# cat file
|
||||
Hello, This is server2
|
||||
```
|
||||
|
||||
### 其他配置选项
|
||||
|
||||
在挂载映射文件中可以使用多种选项,以下是常用参数的详细说明:
|
||||
|
||||
#### 文件系统类型选项 (`-fstype=`)
|
||||
|
||||
- **nfs**:适用于 NFSv3 文件系统。
|
||||
- **nfs4**:适用于 NFSv4 文件系统。
|
||||
|
||||
#### 挂载选项
|
||||
|
||||
- **rw**:读写权限。
|
||||
- **ro**:只读权限。
|
||||
- **soft**:允许客户端在超时后返回错误。
|
||||
- **hard**:客户端会一直尝试连接,直到服务器恢复正常。
|
||||
- **intr**:允许中断挂载操作(NFSv3 使用)。
|
||||
- **timeo=<value>**:超时时间(默认 600 分钟)。
|
||||
- **bg**:后台挂载操作。
|
||||
|
||||
### 变量支持
|
||||
|
||||
映射文件中可以使用变量。例如:
|
||||
|
||||
```bash
|
||||
* -fstype=nfs4,rw 192.168.88.10:/myshare/&
|
||||
```
|
||||
|
||||
在此配置中,`*` 代表通配符,`&` 将被替换为对应挂载点名称。例如,访问 `/mnt/nfs/test` 时将挂载 `192.168.88.10:/myshare/test`
|
||||
|
||||
# 实战案例
|
||||
|
||||
将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录
|
||||
|
||||
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/image-20250110151646824.png" alt="image-20250110151646824" style="zoom:80%;" />
|
||||
|
||||
## 环境准备
|
||||
|
||||
将server1中的用户家目录共享出来,server2在登录相同用户的时候,看到的家目录下的文件是一致的
|
||||
|
||||
## 实验过程
|
||||
|
||||
一、NFS服务器(server1)创建用户和对应的目录,将用户user01的家目录共享出来
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkdir /data
|
||||
[root@localhost ~]# useradd -d /data/user01 user01
|
||||
[root@localhost ~]# id user01
|
||||
uid=1000(user01) gid=1000(user01) groups=1000(user01)
|
||||
[root@localhost ~]# vim /etc/exports
|
||||
[root@localhost ~]# cat /etc/exports
|
||||
# /myshare 192.168.88.0/24(rw,sync,root_squash,no_all_squash)
|
||||
/data/user01 192.168.88.0/24(rw,sync,anonuid=1000,anongid=1000,all_squash)
|
||||
[root@localhost ~]# exportfs -r
|
||||
[root@localhost ~]# exportfs -v
|
||||
/data/user01 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
|
||||
```
|
||||
|
||||
二、在NFS客户端(server2)中配置autofs
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# vim /etc/auto.master
|
||||
/- /etc/auto.user
|
||||
[root@localhost ~]# vim /etc/auto.user
|
||||
[root@localhost ~]# cat /etc/auto.user
|
||||
/data/user01 -fstype=nfs4,rw,soft 192.168.88.10:/data/user01
|
||||
[root@localhost ~]# systemctl restart autofs
|
||||
```
|
||||
|
||||
三、在server2中创建user01用户
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# useradd -d /data/user01 -u 1000 user01
|
||||
useradd: warning: the home directory /data/user01 already exists.
|
||||
useradd: Not copying any file from skel directory into it.
|
||||
```
|
||||
|
||||
四、测试
|
||||
|
||||
```bash
|
||||
# 在server1中,登录到user01用户创建一个文件
|
||||
[root@localhost ~]# su - user01
|
||||
[user01@localhost ~]$ echo "The file is created by server1-user01" > file
|
||||
|
||||
# 在server2中,登录到user01用户查看是否共享了该文件
|
||||
[root@localhost ~]# su - user01
|
||||
[user01@localhost ~]$ ls
|
||||
file
|
||||
[user01@localhost ~]$ cat file
|
||||
The file is created by server1-user01
|
||||
[user01@localhost ~]$ pwd
|
||||
/data/user01
|
||||
|
||||
# 检查server2中挂载情况
|
||||
[user01@localhost ~]$ df -h
|
||||
df: /mnt/nfs/share: Stale file handle
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.6M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
192.168.88.10:/data/user01 17G 1.7G 16G 10% /data/user01
|
||||
```
|
||||
|
||||
五、总结
|
||||
|
||||
从该实验结果中可以看出,我们通过nfs和autofs工具的配合使用,实现了两台主机共享同一个目录的效果。
|
||||
|
||||
NFS工具主要目的在于将远程存储设备共享出来,其他主机能够将分享出来的目录进行挂载。达到跟使用自己本地硬盘一样的效果。有效的解决了本地硬盘空间不足,部分文件需要共享,数据存储持久化等问题。是目前企业里使用较多的文件共享服务器最佳实践方案。
|
Reference in New Issue
Block a user