RH254小结(四)NFS服务器的搭建
NFS (Network FileSystem)最初是由SUN公司搞出来的一个产品,日常应用中也经常使用。这里有两台主机,一台提供NFS服务,一台client ,具体信息如下:
1client : 192.168.1.100
2server: 192.168.1.200
3domain: 361way
一、NFS 服务端配置
1、安装软件包
1# yum -y install nfs-utils
2、启动服务
1# systemctl start rpcbind nfs-server
nfs-server服务依赖rpcbind服务,如果不启动rpcbind服务时,直接启动nfs-server服务会出现报错:
1# systemctl start nfs-server
2Job for nfs-server.service failed. See 'systemctl status nfs-server.service' and 'journalctl -xn' for details.
3#使用journalctl查看到的详细报错内容如下
4Aug 08 23:18:21 www.361way.com kernel: svc: failed to register nfsdv3 RPC service (errno 97).
5Aug 08 23:18:21 www.361way.com kernel: svc: failed to register nfsaclv3 RPC service (errno 97).
6Aug 08 23:18:21 www.361way.com sm-notify[2573]: Version 1.3.0 starting
7Aug 08 23:18:21 www.361way.com rpc.mountd[2567]: Caught signal 15, un-registering and exiting.
8Aug 08 23:18:21 www.361way.com systemd[1]: Stopped NFSv4 ID-name mapping service.
9-- Subject: Unit nfs-idmapd.service has finished shutting down
3、配置idmapd.conf
1# vim /etc/idmapd.conf
2找到Domain项,修改为如下内容
3Domain=361way.com
配置该处是为了解决指定uid和gid后,挂载显示为nobody的问题 ,详细可以查看我之前写的 --- nfs只能挂载为nobody的解决方法 。
4、exports 配置
编辑/etc/exports 增加需要共享的目录:
1/nfs 192.168.1.0/24(rw)
括号内可以不加任何参数,默认是读的权限。需要注意的是IP地址和括号之间不能留有空格。
5、重启服务
重启服务或执行如下命令使上面的配置生效
1# exportfs -rv
2exporting 102.168.1.0/24:/nfs
6、防火墙配置
1# firewall-cmd --permanent --add-service=rpc-bind
2# firewall-cmd --permanent --add-service=nfs
3# firewall-cmd --reload
二、NFS客户端配置
1、安装软件包
1# yum -y install nfs-utils
客户端也必须安装该包,不然在mount时会提示找不到nfs参数。如下:
1# mount -t nfs 192.168.1.200:/nfs /mnt
2mount: wrong fs type, bad option, bad superblock on 192.168.1.200:/nfs,
3 missing codepage or helper program, or other error
4 (for several filesystems (e.g. nfs, cifs) you might
5 need a /sbin/mount.<type> helper program)
6 In some cases useful info is found in syslog - try
7# rpm -qf /usr/sbin/mount.nfs //可以看出mount.nfs是属于该包中的一个命令,等价于mount -t nfs
8nfs-utils-1.3.0-0.8.el7.x86_64
2、idmapd.conf配置
配置成和服务端的相同值,如下:
1# vim /etc/idmapd.conf
2找到Domain项,修改为如下内容
3Domain=361way.com
3、启动rpcbind服务
1# systemctl start rpcbind
4、开机挂载设置
编辑/etc/fstab 可以设置nfs-client主机开机后自动挂载服务端的目录,在/etc/fstab中增加如下行:
1192.168.1.200:/nfs /mnt nfs defaults 0 0
除了这种挂载之外,还有autofs按需挂载,这个在后面讲autofs服务时会提到。
三、权限与参数
1、权限相关
按照上面的配置给rw权限,理论上来讲我们可以写入文件---nfs目录的为root默认创建,但实际上呢?
1# ll
2total 0
3-rw-r--r--. 1 root root 0 aug 8 23:40 a
4# touch test
5touch: cannot touch ‘test’: Read-only file system
可以ls 读取,无法写入。由于nfs为root用户创建,我们在nfs服务端(1.200)主机上先给nfs目录赋予777的权限:
1服务端配置
2# chmod 777 nfs
3客户端测试
4# touch test
5# ls -l
6total 0
7-rw-r--r--. 1 root root 0 Aug 8 23:40 a
8-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 8 23:42 test
细心的你不知道有没有发现,默认在不指定映射的用户时,系统指定的是nfsnobody用户和组。所以针对不能写入的问题,我们除了可以将nfs目录的权限设置为777外,还可以在不改变nfs目录的默认权限外,通过将nfs用户和属主更改为nfsnobody用户,使客户端挂载后可以写入,两种方法任选其一。
2、参数相关
这里的参数有两部分---服务端参数、客户端参数。
先来看服务端在/etc/exports 括号中可以指定的参数:
选项 | 描述 |
---|---|
rw | 允许读写权限 |
ro | 只读权限 |
sync | 同步模式(Default),所有数据在写入后可以请求 |
async | 异步模式,数据在写入过程中可以写入 |
secure | NFS通过1024以下的安全TCP/IP端口发送(Default) |
insecure | NFS可以通过所有端口发送 |
wdelay | 如果多个用户要写入NFS目录,则归组写入 (Default) |
no_wdelay | 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 |
subtree_check | 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限 (Default) |
no_subtree_check | 与subtree_check对应 |
root_squash | Map requests from uid/gid 0 to the anonymous uid/gid. |
no_root_squash | root用户具有根目录的完全管理访问权限。 |
all_squash | Map all uids and gids to the anonymous user. 对公共目录访问时较有用。 |
no_all_squash | 保留共享文件的UID和GID (Default) |
anonuid=UID | 指定匿名用户访问时映射机的用户uid |
anongid=GID | 指定匿名用户访问时映射机的用户gid |
常用配置示例如下:
1/tmp *(rw,no_root_squash)
2/public 192.168.0.*(rw) *(ro)
3/nfs/test 192.168.0.100(rw)
4/home/linux *.361way.com(rw,all_squash,anonuid=40,anongid=40)
5/build buildhost[0-9].local.domain(rw)
6/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
客户端mount时的相关参数:
参数 | 描述 | 默认值 |
---|---|---|
suid nosuid | 如果挂载点上面有任何 SUID(粘滞位) 的 binary 程序时,你只要使用 nosuid 就可以取消 SUID 的功能! | suid |
rw ro | 如在服务允许写的权限,但为了安全起见,可以挂载时指定仅使用读取权限挂载 | rw |
dev nodev | 一般只有 /dev 这个目录挂载时才会用到 | dev |
exec noexec | 是否具有执行 binary file 的权限?如果掛载的只是资料区 (例如 /home),那么可以选择 noexec | exec |
user nouser | 是否允许使用者进行挂载与卸载功能?如果要保护系統,最好不要提供使用者進行掛载与卸载 | nouser |
auto noauto | 这个 auto 指的是『mount -a』时,是否自动挂载该挂载点。如果你不需要这个 partition 随时被挂载,可以设为 noauto。 | auto |
上面是 mount 自带的参数,除此之外,nfs 还支持指定以下参数:
参数 | 参数功能 | 默认值 |
---|---|---|
fg bg | 这两参数有点类似于进程中的fg、bg,指定fg mount时,会一直等到挂载成功或超时。指定bg时,挂载会在后台进行。 | fg |
soft hard | 为hard时,当C/S其中一台离线,则RPC 会持续的呼叫,直到对方恢复连线为止。如果是 soft ,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系統的延迟会比较不明显。 | hard |
intr | 当使用hard 方式時,若加上 intr 参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。 | 沒有 |
rsize wsize | 读(rsize)和写(wsize)的block块大小 (block size)。 这个设定值可以影响用户端与服务器端传送缓存区的大小。一来说,在LAN网络内,有足够内存时,这个值可以设的大一些。比如 32768 (bytes) ,用于提升数据传送速度。但也不能超过网络能够传送的最大值。 | rsize=1024 wsize=1024 |
如,在挂载时可以按如下参数mount:
1# mount -t nfs -o nosuid,noexec,nodev,rw \
2> -o bg,soft,rsize=32768,wsize=32768 \
3> 192.168.1.200:/nfs/public /mnt/public
四、nfs服务相关
在老发行版中的nfs中我们经常将服务分为如下几个:
- rcp.nfsd --- nfs服务提供者,主服务;
- rpc.mountd --- 验证nfs客户端挂载相关程序;
- rpc.lockd (非必须) --- 解决多个客户端同时挂载一个nfs服务端时,多个客户端同时写入一文件的问题,开启该服务可以避免该问题的发生,需客户端也同时开启该服务;
- rpc.statd(非必须)--- 与rpc.lockd相关,避免多个客户端同时访问同一文件时可能造成文件损坏的问题,该服务会进行文件检测。使用时也需服务端和客户端同时开启;
- rpc.idmapd ---解决nfs挂载时的nobody问题。
在查看新版本之前,我们先看下rhel7/centos7下的nfs服务相关的rpc服务和nfs文件,如下:
rpc相关服务:
1# systemd-cgls|grep rp[c]
2 ├─rpc-statd.service
3 │ └─2501 /usr/sbin/rpc.statd --no-notify
4 │ └─2502 /usr/sbin/rpc.idmapd
5 │ └─2503 /usr/sbin/rpc.mountd
6 ├─rpcbind.service
7 │ └─2486 /sbin/rpcbind -w
nfs相关服务有:
1# ll nfs*
2-rw-r--r--. 1 root root 345 Mar 6 2015 nfs-blkmap.service
3-rw-r--r--. 1 root root 215 Mar 6 2015 nfs-blkmap.target
4-rw-r--r--. 1 root root 477 Mar 6 2015 nfs-client.target
5-rw-r--r--. 1 root root 144 Mar 6 2015 nfs-config.service
6-rw-r--r--. 1 root root 240 Mar 6 2015 nfs-idmapd.service
7lrwxrwxrwx. 1 root root 18 Aug 8 23:18 nfs-idmap.service -> nfs-idmapd.service
8lrwxrwxrwx. 1 root root 17 Aug 8 23:18 nfs-lock.service -> rpc-statd.service
9-rw-r--r--. 1 root root 300 Mar 6 2015 nfs-mountd.service
10lrwxrwxrwx. 1 root root 19 Aug 8 23:18 nfs-secure-server.service -> rpc-svcgssd.service
11lrwxrwxrwx. 1 root root 16 Aug 8 23:18 nfs-secure.service -> rpc-gssd.service
12-rw-r--r--. 1 root root 881 Mar 6 2015 nfs-server.service
13lrwxrwxrwx. 1 root root 18 Aug 8 23:18 nfs.service -> nfs-server.service
14-rw-r--r--. 1 root root 567 Mar 6 2015 nfs-utils.service
在新版本中默认情况下nfs-server和rpcbind服务开启后,nfs-mountd、nfs-lock、nfs-idmapd几个服务都默认会开启。而且从上面也可以看出nfs-lock 和 nfs-statd 两个对应的是同一个文件,可见在新版本中两个服务已进行了合并。
五、挂载时用户权限对应
还按上面的示例,不过我们将exports的配置更改为如下:
1/nfs 102.168.1.0/24(rw,no_all_squash)
- 服务端共享了/nfs 目录
- 服务端有一个用户zhangshan,对应的用户uid和gid 都是1000 ,zhangshan用户创建一个文件server-zhangshan
- 客户端主机上uid和gid为1000对应的用户是lishi ,lishi 用户挂载后创建一个文件client-lishi
- 服务端还有一个用户wangwu ,uid和gid为5000 ,客户端上该uid 和 gid没有对应用户,wangwu创建了一个文件server-wangwu
当在客户端挂载后,在客户端上看到的文件server-zhangshan 、client-lishi 对应的用属主和属组,都是lishi ;而在服务端上看到的这两个文件的属主都是zhangshan ;在客户端上看到的server-wangwu看到的对应属主和属组是5000:5000 。所以客户端和服务器端都是以/etc/passwd、/etc/group中的uid和gid 对应相应的文件属主和属组的,如果两边的uid和gid不一致,就会出现上面描述的情况。在实际中应用中应尽量让目录对应的属主和属组的uid和gid 一致。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/rh254-nfs/4703.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.