Linux NFS共享目录配置及开机自动挂载

在需要被挂载的服务器上安装nfs-kernel-server

1
sudo apt install nfs-kernel-server

/etc/exports

通过此文件配置共享目录,样例

1
2
3
4
5
6
7
8
9
10
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
/data/share 192.168.1.157(insecure,rw,sync,all_squash,no_subtree_check) *(insecure,ro,async,all_squash,no_subtree_check)

这里配置了/data/share为共享目录,允许从192.168.1.157进行读写操作,允许从其他任意IP进行只读操作。

把共享目录的owner改成 nobody:nogroup

1
sudo chown nobody:nogroup /data/share

设置共享目录的权限

1
sudo chmod 777 /data/share

重新加载配置文件

1
sudo exportfs -a

在需要挂载的服务器需要安装nfs-common

1
apt install nfs-common

挂载命令样例 ,把140上的/data/share共享目录挂载到本地/mnt/140share

1
mount 192.168.1.140:/data/share /mnt/140share

端口

使用到的端口,如果有防火墙需要设置

111/tcp+udp

2049/tcp

不同版本的NFS服务器也可能需要更多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Data ONTAP:
111 TCP/UDP portmapper
2049 TCP/UDP nfsd
635 TCP/UDP mountd
4045 TCP/UDP nlockmgr
4046 TCP/UDP status
4049 TCP/UDP rquotad

Data ONTAP 7-Mode:
111 TCP/UDP portmapper
2049 TCP/UDP nfsd
4046 TCP/UDP mountd
4045 TCP/UDP nlockmgr
4047 TCP/UDP status
4049 TCP/UDP rquotad

参考:Which Network File System (NFS) TCP and NFS UDP ports are used on the storage system? - NetApp Knowledge Base

另外可能用到一个随机端口,在/etc/default/nfs-kernel-server中通过

1
RPCMOUNTDOPTS="--port 33333"

可以使之固定为33333。

更改设置后重启服务

1
service nfs-kernel-server restart

如果希望系统启动时自动加载文件系统

/etc/fstab

通过此文件配置系统启动时自动挂载

样例

1
2
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
192.168.1.140:/data/share /mnt/140share nfs defaults 0 0

重新加载配置文件

1
sudo mount -a

配置中type是被挂载的路径的类型

常用的类型有:

nfs表示远程linux的共享路径

cifs表示远程windows的共享路径

ext4表示本地ext4路径

配置中options是挂载选项,在挂载windows目录时,通过以下方式指定用户名和密码

1
defaults,auto,username=MZhDai,password=******,dir_mode=0777,file_mode=0777

另外挂载windows目录需要 mount.cifs 支持,如果没有可以通过以下命令安装

1
sudo apt install cifs-utils

挂载命令通过 -o指定选项

1
sudo mount.cifs //192.168.1.107/f /mnt/107f -o user=MZhDai,pass=******,dir_mode=0777,file_mode=0777

还有常用的选项如

1
2
3
4
5
ro :只读挂载
rw : 读写挂载
uid=`id -u <owner>` : 指定挂载后的所有者
gid=`id -g <group>` : 指定挂载后的所有组
iocharset=utf8 : 指定编码为uft8,解决中文乱码问题,我在WSL2挂载Windows共享遇到过一次

.cifs 可以省略,mount命令会自动识别需要挂载的路径类型

访问挂载的共享目录卡住

执行

1
ls /mnt

1
df -h

时卡住

可以使用

1
strace ls /mnt

1
strace df -h

查看命令执行的过程,看看最终卡在哪一步,比如卡在访问/mnt/abc

查看挂载参数

1
cat /proc/mounts

查看服务器支持的版本

1
nfsstat -s

卸载挂载点

1
umount <挂载点>

如果卡住试下强制卸载

1
umount -f <挂载点>

1
umount -lf <挂载点>

如果还是卸载失败可以看一下哪个进程在使用挂载点下的文件

1
lsof|grep <挂载点>

考虑杀死进程后再卸载

指定挂载使用的NFS协议版本

1
mount.nfs XXX XXX -o nfsvers=3

一般是v4版本卡住,改用v3可以解决

OSError: [Errno 37] Unable to open file

增加nolock挂载参数

1
mount.nfs XXX XXX -o nfsvers=3,nolock