NFS 服务端:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.118
NFS客户端:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.120
NFS 客户端和服务端SElinux都是关闭的。firewalld防火墙有开启。
https://baike.baidu.com/item/NFS/812203?fr=aladdin
NFS(Network File System) 是网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
早期NFS是SUN公司设计的一种用于在各类unix主机之间共享文件系统的协议。它本身也属于一种文件系统,我们之前接触的大部分文件系统都在内核中实现,NFS也是在内核中实现。如果各类unix系统在其内核附带了NFS协议的支持的功能的话,结合用户空间某些特定的服务,NFS就可以工作起来了。NFS本身是在内核中,要依赖用户空间中的程序。所以,对于在内核中实现了NFS协议功能的系统才能够使用NFS,比如windows系统就不行。其实linux系统上是后来有对早期SUN公司的NFS协议的重新实现,而且兼容原生SUN公司研发的NFS协议。所以可以不加区分的说现在linux系统上的是SUN公司研发的那个NFS协议。现在NFS有4个版本,第一个版本是NFSv1,这个版本没有走出过实验室。第二个版本是NFSv2,早期设计考虑为了性能,只支持udp协议,所以这个v2版本只支持udp协议,而且不支持kerberos进行集中的身份认证,所以相对来说不可靠而且不安全。第三个版本是NFSv3,它加入了对tcp协议的支持,而且部分功能实现了对kerberos的支持。第四个版本是NFSv4,这个版本才算得上是真正意义上的各功能模块完成了对kerberos的功能的支持,我们现在用的一般都是NFSv4版本。如图所示,可以实际理解从NFS是众多文件系统中的一种,可以通过VFS接口进行调用和转化。
既然nfs是一种文件系统,而且是在内核中实现的功能,那么它如何监听用户请求呢,因为一般是用户空间的进程向内核发起系统调用,申请注册使用某个端口,通过主机和端口可以标识一个套接字,所以说套接字是用户空间进程注册监听使用的。
nfs的工作严重依赖于RPC机制来进行数据传输。可以说RPC也属于一种协议。PRC叫做远程过程调用(Remote Procedure Call),也是SUN公司开发和提出的,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络模型中,RPC跨越传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用C/S模式。请求程序就是一个客户端,而服务提供程序就是一个服务端。首先客户端调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务端,进程保证睡眠状态直到调用信息到达为止。当一个调用信息到达,服务端获得进程参数,计算结果,发送答复信息,然后等待下一个调试信息,最后,客户端调用进程接受答复,重新获得进程结果,然后调用执行继续进行。RPC调用过程大概如下图所示:
其实可以把RPC的功能和pam,nsswitch以及xinetd进行类比,其实它无非也是个公共框架。配合nfs工作流程大概是:
在服务端,rpc监听在某个套接字上,以接受客户端请求,请求达到后(比如图中的RPC call),rpc会去把请求的服务启动,然后把请求转交给那个服务(就是图中的invoke service),由那个服务去调用客户端请求的过程(就是图中的call dispathch routine等步骤)。
然后,我们结合实际文件系统挂载目录然后来梳理一下这个过程。如下图所示:
在NFS server端,比如把本地磁盘的某个分区挂载到本地文件系统的某个目录下,比如把/dev/sda1挂载到/shared,然后在用户空间的应用程序向rpc server注册,让其代为监听到某个套接字上,此时这个rpc服务器对外的接口就表现为NFS协议的NFS服务器。待rpc服务器收到数据后,还是会通过本地的系统调用去存储数据(还是会通过本地内核所管理的文件系统去操作底层的数据存储等)。
在NFS client端,对于NFS文件系统,最终都是要挂载使用的,而我们的NFS客户端的内核中是有NFS模块的,因此NFS客户端本地的mount程序可以通过本地内核中NFS模块向远端NFS服务端发起连接请求,而后mount程序就将NFS共享的文件系统目录挂载到本地上的某个目录下了。比如挂载到/nfs目录下。在NFS client上用户空间的某个用户进程,就可以对本地文件系统的目录/nfs进行访问,用户权限允许的话,用户进程就可以向这个目录实现文件的增删改查。但是写入的文件不会在本地文件系统保留,即不是写入本地的ext系列或XFS文件系统,而是通过VFS文件系统接口使用内核中NFS文件系统模块向NFS服务器的rpc server发起远程过程调用,然后rpc会把请求转交给特定应用程序,后边nfs server端的处理步骤上边就有讲解了。
服务端和客户端都要安装上软件包nfs-utils。
Installed Packages
Name : nfs-utils
Arch : x86_64
Epoch : 1
Version : 1.3.0
Release : 0.61.el7
Size : 1.0 M
Repo : installed
From repo : base
Summary : NFS utilities and supporting clients and daemons for the kernel NFS server
URL : http://sourceforge.net/projects/nfs
License : MIT and GPLv2 and GPLv2+ and BSD
Description : The nfs-utils package provides a daemon for the kernel NFS server and
: related tools, which provides a much higher level of performance than the
: traditional Linux NFS server used by most users.
:
: This package also contains the showmount program. Showmount queries the
: mount daemon on a remote host for information about the NFS (Network File
: System) server on the remote host. For example, showmount can display the
: clients which are mounted on that host.
:
: This package also contains the mount.nfs and umount.nfs program.
说明:nfs-utils为内核中的NFS 服务端提供守护进程,以及支持NFS客户端的功能。还提供了一些相关的工具(
这些工具提供的NFS 服务器比大部分用户使用的传统linux的NFS服务器性能更高)。
工具包也包含showmount程序。showmount可以查询远程主机上的NFS服务端的挂载进程信息。可以在NFS客户端主机上显示远程主机上NFS服务端的挂载(导出)的文件系统信息。
[root@localhost ~]# rpm -ql nfs-utils
/etc/exports.d #挂载配置文件目录,还有一个主配置/etc/exports,这个配置是由setup程序提供的
/etc/gssproxy/24-nfs-server.conf
/etc/modprobe.d/lockd.conf
/etc/nfs.conf #nfs守护进程和工具的通用配置的配置文件
/etc/nfsmount.conf #nfs挂载的配置文件。三部分组成:Mount,Server以及Global
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs #nfs-config.service服务的配置文件
/sbin/mount.nfs #nfs的挂载程序
/sbin/mount.nfs4 #nfs的挂载程序,linux内核版本2.6.32之后,mount.nfs4与mount.nfs没有区别,都可以挂载所
#有NFS版本,不过在linux内核版本2.6.32之前,mount.nfs4必须挂载到NFS的第四版本的文件通,mount.nfs可
#以挂载NFS第二版和第三版的文件系统。
/sbin/osd_login
/sbin/rpc.statd # 维持nfs状态相关的一个程序
/sbin/umount.nfs #卸载nfs文件系统的程序
/sbin/umount.nfs4 #卸载nfs文件系统的程序
/usr/lib/systemd/scripts/nfs-utils_env.sh #一个bash脚本,可以为nfs-config.service提供环境变量相关的
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount
/usr/sbin/blkmapd #与
/usr/sbin/exportfs #维护导出的NFS文件系统表的程序
/usr/sbin/mountstats #分别显示每个客户端挂载的信息的程序
/usr/sbin/nfsdcltrack NFSv4客户端的一个追踪标记程序
/usr/sbin/nfsidmap #用于上层调用的一个id和用户名中间相互映射的程序
/usr/sbin/nfsiostat #使用/etc/self/mountstats文件来评估NFS挂载点的iostat信息(CPU的统计信息,以及输入输出设别的统计信息等)
/usr/sbin/nfsstat #列出NFS的统计信息的程序
/usr/sbin/rpc.gssd #PRCSEC_GSS守护进程
/usr/sbin/rpc.idmapd #idmapd守护进程
/usr/sbin/rpc.mountd #NFS挂载的守护进程
/usr/sbin/rpc.nfsd #NFS服务端的程序
/usr/sbin/rpcdebug
/usr/sbin/showmount #NFS服务端显示NFS挂载的信息的程序
/usr/sbin/sm-notify #发送重启通知的程序
/usr/sbin/start-statd
#中间省略安装文档文件(说明文档和man手册等)
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
(1) 服务端启动服务服务
大概有这些服务或者其他的unit:
[root@localhost ~]# cat txt
auth-rpcgss-module.service
nfs-blkmap.service
nfs-client.target
nfs-config.service
nfs-idmap.service
nfs-idmapd.service
nfs-lock.service
nfs-mountd.service
nfs-secure.service
nfs-server.service
nfs-utils.service
nfs.service
nfslock.service
proc-fs-nfsd.mount
rpc-gssd.service
rpc-statd-notify.service
rpc-statd.service
rpc_pipefs.target
rpcgssd.service
rpcidmapd.service
var-lib-nfs-rpc_pipefs.mount
初始状态是:
[root@localhost ~]# while read name;do echo "$name:"&&systemctl status $name; done
(2) 配置NFS服务导出的文件系统
配置文件:/etc/exports或/etc/exports.d/* (配置文件默认为空)
如果要配置,可以参考 man exports,里面有配置实例说明:
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
总体表现形式可以总结为,可以共享多个文件系统目录,每行定义一个:
/PATH/TO/SOME_DIR clients1(export_options, ...) clients2(export_options, ...)
(1) 第一个参数指定一个NFS server上文件系统的路径,表示要共享的文件系统目录。这个路径如果是提供
给其他非单一客户端挂载使用的,应该考虑到空间,性能等。最好是单独的硬盘的单独分区。比如共享的目录为
/shared;
(2) 第二个或第三等,可以允许设置多个访问端口,针对不同来源的客户端挂载时候有不同的权限等设置,我们
示例假设只设置一个client。注意clients与小括号间不能有空格,否则会有语法错误。
(3) client设置值
(a) 单个主机(single host):ipv4地址,ipv6地址,FQDN(域名);
例如:172.16.0.120 , fe80::20c:29ff:fe4d:d522,node2.yanhui.com
(b) 一个网络地址(network):address/netmask,子网掩码支持长格式和短格式;
例如:172.16.0.0/16,172.16.0.0/255.255.0.0
(c) 主机通配名(wildcards):例如*.yanhui.com;
NIS域内的主机组(netgroups):@group_name;
(d) 匿名的(anonymous):使用*通配所有主机;
说明:为了安全,生产环境共享出去的NFS文件系统,应该精细的控制客户端访问的地址。a,b,c三种形式比较常见。
每个客户端后边使用小括号引用起来的(导出)选项之间以逗号隔开,不能有空格。
(4) 常用导出的通用选项
ro:只读共享;
rw:读写共享;
sync:同步;(同步的话对io性能要求较高)
async:异步;
secure:客户端端口小于1024,否则就要使用insecure选项。
等等,还有很多
(5) 常用导出的用户ID映射选项
root_squash:压缩root用户,一般指将其映射为nfsnobody;
no_root_squash:不压缩root用户;
all_squash:压缩所有用户;
anonuid and anongid:将压缩的用户映射为此处指定的用户;
NFS server配置实例1:
[root@localhost ~]# mkdir -p /shared
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,sync,all_squash)
[root@localhost ~]#
重启或重载服务:
[root@localhost ~]# systemctl restart nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since Thu 2018-12-20 21:01:15 CST; 23s ago
Process: 10812 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
Process: 10809 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
Process: 10807 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
Process: 10842 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 10826 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 10824 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 10826 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Dec 20 21:01:15 localhost.localdomain systemd[1]: Starting NFS server and services...
Dec 20 21:01:15 localhost.localdomain systemd[1]: Started NFS server and services.
这里为了方便就直接关闭防火墙或者把nfs服务器对外开放了:
[root@localhost ~]# firewall-cmd --list-all --permanent
public (default)
interfaces:
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
开放nfs服务:
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6-client nfs ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
查看启动的端口信息(ss -tnl或ss -tnlp):
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 64 *:2049 *:*
LISTEN 0 128 *:40615 *:*
LISTEN 0 64 *:43881 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:20048 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 64 :::2049 :::*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::20048 :::*
LISTEN 0 64 :::60145 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 :::50360 :::*
LISTEN 0 100 ::1:25 :::*
使用showmount工具查看:
[root@localhost ~]# showmount -e #NFS服务端上执行
Export list for localhost.localdomain:
/shared 172.16.0.0/16
(3) 客户端挂载使用
使用mount.nfs或mount -t nfs来挂载。其使用形式大概如下:
mount -t nfs servername:/path/to/share /path/to/mount_point [-rvVwfnsh ] [-o options]
其中mount -t nfs可以替换为mount.nfs;
servername表示NFS server的ip;
/path/to/share表示共享的文件爱你系统目录;
/path/to/mount_point表示NFS client上文件系统的挂载点;
后边还可以跟选项。可以参考man nfs中的相关选项介绍,NFSv2,NFSv3相比NFSv4有独立的选项,NFSv4相较以前的版本也有独立的选项。这里不详细介绍了。
在NFS client上执行,假设挂载到/data目录下
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data
可以使用df或mount命令查看:
[root@localhost ~]# df -h | tail -1
172.16.0.118:/shared 50G 1.1G 49G 3% /data
[root@localhost ~]# mount |tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)
默认创建文件:
[root@localhost data]# touch yanhui.txt
touch: cannot touch ‘yanhui.txt’: Permission denied
说明:为什么,读写挂载的文件系统没有写入权限呢?
默认我的NFS server共享文件系统的挂载选项中有个参数"all_squash",所有客户端的用户写入都会
在NFS server上映射成匿名用户,如果不指定,就是默认的nfsnobody,来NFS server上看看nfsnobody
对共享的文件系统的权限
[root@localhost ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 16:06 /shared/
上面共享目录,普通用户根本没有写入选项。所以上面会提示权限拒绝(NFS共享权限和文件系统权限的交集才是最终的权限)。
推荐解决方案1:
直接在NFS server上让nfsnobody这个默认用户对文件系统目录拥有读写权限。可以使用acl权限设置来完成,示例代码:
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 23:07 /shared/
[root@localhost ~]# setfacl -m u:nfsnobody:rwx /shared
#修改设置acl权限,让nfsnobody用户对/shared目录拥有读写权限。
[root@localhost ~]# getfacl -p /shared
# file: /shared
# owner: root
# group: root
user::rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x
[root@localhost ~]# ls -ld /shared
drwxrwxr-x+ 2 root root 6 Dec 20 23:07 /shared
#上面后边多了一个符号"+"就表示这个目录拥有acl权限设置。
重新测试写入:
[root@localhost data]# echo "git clone" > yanhui.txt
[root@localhost data]# ls -l
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
服务端上查看:
[yanhui@localhost ~]$ ls -l /shared/
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[yanhui@localhost ~]$ cat /shared/yanhui.txt
git clone
解决方法2:直接改文件目录属主或属组的形式,这个就不演示了,和设置acl没区别
解决方法3:把NFS server的共享挂载选项的all_squash改成no_root_squash或root_squash,推荐改成
root_squash,这样一来就只有root用户被映射成普通用户,其他普通用户可以写入。
NFS server上创建一个普通用户centos,NFS client上创建一个普通用户xiaotang。我故意把它们的uid设置成一样。看看效果。
NFS 服务端修改挂载选项:
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,async,root_squash)
[root@localhost ~]# systemctl reload nfs.service
NFS client客户端重新卸载后挂载:
[root@localhost ~]# umount /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data
[root@localhost ~]# mount | tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)
NFS server创建用户centos,指明uid为10001:
[root@localhost ~]# useradd -u 10001 centos
[root@localhost ~]# id centos
uid=10001(centos) gid=10001(centos) groups=10001(centos)
NFS client创建用户xiaotang,指明uid为10001:
[root@localhost ~]# useradd -u 10001 xiaotang
[root@localhost ~]# id xiaotang
uid=10001(xiaotang) gid=10001(xiaotang) groups=10001(xiaotang)
NFS server端设置让centos用户拥有读写执行权限:
[root@localhost ~]# ls -ld /shared/
drwxrwxr-x+ 2 root root 23 Dec 20 23:13 /shared/
[root@localhost ~]# setfacl -m u:centos:rwx /shared/
[root@localhost ~]# getfacl -p /shared/
# file: /shared/
# owner: root
# group: root
user::rwx
user:centos:rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x
NFS client切换到普通用户xiaotang,然后向/data写入文件:
[xiaotang@localhost ~]$ ls -ld /data/
drwxrwxr-x 2 root root 23 Dec 20 23:13 /data/
[xiaotang@localhost ~]$ cd /data/
[xiaotang@localhost data]$ ls
yanhui.txt
[xiaotang@localhost data]$ touch file
[xiaotang@localhost data]$ ls -l
total 4
-rw-rw-r-- 1 xiaotang xiaotang 0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
服务端上查看:
[root@localhost ~]# ls -l /shared/
total 4
-rw-rw-r-- 1 centos centos 0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
用户是根据uid来对应的,这个实验验证了。
NFS client还是用root用户向/data写入:
[root@localhost ~]# echo "hello,world"0 > /data/mytxt
[root@localhost ~]# ls -l /data/mytxt
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 /data/mytxt
[root@localhost ~]# cat /data/mytxt
hello,world0
NFS server上查看:
[root@localhost ~]# ls -l /shared/
total 8
-rw-rw-r-- 1 centos centos 0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 mytxt
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[root@localhost ~]# cat /shared/mytxt
hello,world0
因为挂载权限root_squash的干预,root用户被映射成了默认的nfsnobody用户。这样做是比较安全的。如果要
使用root用户本身,可以修改挂载选项为no_root_squash。
示例:
#NFS client上执行:
[root@localhost ~]# showmount -e 172.16.0.118
Export list for 172.16.0.118:
/shared 172.16.0.0/16
#NFS server上执行:
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/shared 172.16.0.0/16
[root@localhost ~]# exportfs -v
/shared 172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -au #这里指定了-a选项,配合-u表示取消所有的文件系统导出,所有客端挂载都会断开
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r #这是重新导出,可以不用重启或重载服务,会更新/etc/exports和/var/lib/nfs/xtab中的内容
[root@localhost ~]# exportfs -v
/shared 172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -u 172.16.0.0/16:/shared #这是单独卸载一个共享文件系统。标准语法为:
exportfs -u host:/path
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r
[root@localhost ~]# exportfs -v
/shared 172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)