运维开发网

NFS服务配置

运维开发网 https://www.qedev.com 2021-04-25 13:37 出处:51CTO 作者:80民工
NFS是NetworkFileSystem的简写,即网络文件系统,网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。NFS允许一个系统在网络上与他人共享目录和文件

NFS是NetworkFileSystem的简写,即网络文件系统,网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。NFS允许一个系统在网络上与他人共享目录和文件,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。


14.1 服务端配置NFS

在CentOS上使用NFS服务需要安装两个包nfs-utilsrpcbind,使用yum安装nfs-utils时会一并安装rpcbind。

# yum install -y nfs-utils

CentOS 6之前的版本都是安装portmap包,从CentOS开始,改为安装rpcbind包了。

配置NFS,需要编辑配置文件/etc/exports

  • 首先修改配置文件(默认该文件为空):
# vim /etc/exports				#写入下面内容/home/nfstestdir 192.168.100.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

上面配置文件就一行,分为三部分:

  1. 本地要共享出去的目录
  2. 允许访问的主机(可以是一个IP,也可以是IP段)
  3. 小括号里面是一些权限选项
rw		表示读/写  
ro		表示只读

sync		同步模式,表示内存中的数据实时写入磁盘  
async		非同步模式,表示内存中的数据定期写入磁盘
  
no_root_squash		加上该选项后,root用户就会对共享的目录拥有最高权限,像操作本机的目录一样  
root_squash		与上面对应,表示root用户对共享目录的权限不高,只有普通用户的权限  
all_squash		表示不管使用NFS的用户是谁,其身份都被限定为一个指定的普通用户身份
  
anonuid/anongid		必须和root_squash以及all_squash选项一同使用,用于指定使用NFS的用户被限定后的uid和gid,前提是本机的/etc/passwd中存在相应的uid和gid

  • 创建相关目录并启动NFS服务:
# mkdir /home/nfstestdir# systemctl start rpcbind				#启动NFS服务之前,要先启动rpcbind服务# ps aux |grep rpcrpc        2487  0.0  0.0  65000  1416 ?        Ss   20:36   0:00 /sbin/rpcbind -w
rpcuser    2506  0.0  0.0  42420  1756 ?        Ss   20:36   0:00 /usr/sbin/rpc.statd
root       2507  0.0  0.0      0     0 ?        S<   20:36   0:00 [rpciod]root       2513  0.0  0.0  19360   404 ?        Ss   20:36   0:00 /usr/sbin/rpc.idmapd
root       2526  0.0  0.0  42608   940 ?        Ss   20:36   0:00 /usr/sbin/rpc.mountd
root       2600  0.0  0.0 112720   984 pts/0    S+   20:45   0:00 grep --color=auto rpc# systemctl start nfs# ps aux |grep  nfsroot       2536  0.0  0.0      0     0 ?        S<   20:36   0:00 [nfsd4_callbacks]root       2542  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2543  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2544  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2545  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2546  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2547  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2548  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2549  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]root       2602  0.0  0.0 112720   984 pts/0    R+   20:46   0:00 grep --color=auto nfs# systemctl enable rpcbind				#使其开机启动# systemctl enable nfsCreated symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.


14.2 客户端挂在NFS

本实验需要两台机器,我用的两台机器的IP分别为192.168.100.140 和192.168.100.150,其中提供NFS服务的是192.168.100.140。在客户端挂载NFS之前,给客户端也安装nfs-utils。

  • 先在客户端查看服务端共享了哪些目录:
# showmount -e 192.168.100.140				#使用命令 showmount -e IP 就可以查看NFS的共享情况clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)				#这里有报错,113端口不通,防火墙导致# systemctl stop firewalld				#这一步在服务端操作,关掉防火墙,最好也关掉SELinux# showmount -e 192.168.100.140				#这一步在客户端操作,再次查看服务端NFS的共享情况Export list for 192.168.100.140:
/home/nfstestdir 192.168.100.0/24				#可以看到之前服务器端共享的目录和IP段

  • 然后在客户端上挂在NFS:
# mount -t nfs 192.168.100.140:/home/nfstestdir /mnt/				# -t nfs 指定挂载的类型为nfs# df -h 文件系统                          容量  已用  可用 已用% 挂载点
/dev/sda3                          16G  3.4G   13G   22% /
devtmpfs                          1.9G     0  1.9G    0% /dev
tmpfs                             1.9G     0  1.9G    0% /dev/shm
tmpfs                             1.9G  8.7M  1.9G    1% /run
tmpfs                             1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                         197M  113M   85M   58% /boot
tmpfs                             378M     0  378M    0% /run/user/0
192.168.100.140:/home/nfstestdir   16G  3.4G   13G   22% /mnt				#这里可以看到刚挂载的/mnt分区

  • 进入/mnt/目录下,创建测试文件:
# cd /mnt/# touch lzx.txttouch: 无法创建"lzx.txt": 权限不够				#这是因为之前服务端创建的/home/nfstestdir目录权限不合适,挂载后等于被限制uid为1000的用户# chmod 777 /home/nfstestdir/				#服务端操作,修改目录权限# touch lzx.txt				#客户端操作,就可以创建文件了# ls -l总用量 0
-rw-r--r--. 1 mysql mysql 0 7月  12 21:07 lzx.txt				#说明mysql用户的uid和gid都为1000# tail 10 /etc/passwd				#服务端查看验证tail: 无法打开"10" 读取数据: 没有那个文件或目录==> /etc/passwd <==systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin				#这里mysql用户的uid和gid为1000rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin# id mysql				#客户端查看uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)

可以看到,新创建的文件lzx.txt所有者和所属组都为mysql,其uid和gid都为1000。


14.3 命令exportfs

exportfs命令常用参数:

-a		表示全部挂载或者卸载

-r		表示重新挂载

-u		表示卸载某一个目录

-v		表示显示共享的目录

当改变/etc/exports配置文件后,使用exportfs命令挂载不需要重启NFS服务。下面做个测试。


  • 首先修改服务端配置文件:
# vim /etc/exports				#增加下面一行/tmp/ 192.168.100.0/24(rw,sync,no_root_squash)

  • 服务端执行exportfs命令:
# exportfs -arv				#服务端直接执行,-arv选项可以直接查看新共享的目录,而不需要重启NFS服务exporting 192.168.100.0/24:/tmp
exporting 192.168.100.0/24:/home/nfstestdir# showmount -e 192.168.100.140				#客户端查看Export list for 192.168.100.140:
/tmp             192.168.100.0/24
/home/nfstestdir 192.168.100.0/24

上面已经用到了mount命令,-t nfs指定挂载类型为nfs,另外还有-o nolock(即不加锁)选项。

  • 在客户端执行命令:
# mkdir /lzx# mount -t nfs -o nolock 192.168.100.140:/tmp/ /lzx/

  • 可以在客户端上把要挂载的目录写到/etc/fstab文件中,然后挂载时只需要执行mount -a命令:
192.168.100.140:/tmp/ /lzx  nfs defaults,nolock   0 0				#增加该行

  • 之前挂载了NFS,需要先卸载:
# umount /lzx

  • 然后重新挂载:
# mount -a

这样操作的好处就是以后开机会自动挂载NFS。

还有,服务端之前设置了no_root_squash参数,表示不限制root用户,它在共享目录下创建文件和在本机创建一样。

# cd /lzx/# lsmysql.sock  systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM# ls -l总用量 0
srwxrwxrwx. 1 mysql mysql  0 7月  12 20:27 mysql.sock
drwx------. 3 root  root  17 7月  12 17:50 systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM# touch 1.txt# ll总用量 0
-rw-r--r--. 1 root  root   0 7月  12 21:43 1.txt				#这里的属主和属组都是rootsrwxrwxrwx. 1 mysql mysql  0 7月  12 20:27 mysql.sock
drwx------. 3 root  root  17 7月  12 17:50 systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM


14.4 NFS客户端问题

NFS有2、3、4三个大版本,NFS4可能会存在客户端文件属主属组为nobody的问题。

客户端在挂载共享目录后,不管是root用户还是普通用户,在创建文件时属主、属组为nobody。

两种方法解决该问题:

  1. 客户端挂载时加上-o nfsvers=3,指定NFS版本为3;

  2. 客户端和服务端都修改 /etc/idmapd.conf 文件,把#Domain = local.domain.edu改为Domain = xxx.com(这里xxx.com自定义),然后重启rpcidmapd服务(CentOS 7直接重启rpcbind服务即可)。


更多资料参考:

详细讲解NFS配置过程

NFS搭建、配置及故障排除详解

0

精彩评论

暂无评论...
验证码 换一张
取 消