linux系统的NFS服务器搭建

NFS (Network FileSystem)最初是由SUN公司搞出来的一个产品,NFS(网络文件系统)服务可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机(Linux客户端)基于TCP/IP协议,像使用本地主机上的资源那样读写远程Linux系统上的共享文件。

为了检验NFS服务配置的效果,我们需要使用两台Linux主机(一台充当NFS服务器,一台充当NFS客户端)服务器192.168.10.10 客户端192.168.10.20。

一、NFS 服务端配置

1、安装nfs和rpcbind# yum -y install nfs-utils

2、启动服务 # systemctl start rpcbind nfs-server 启动服务先启动rpcbind再启动nfs(因为nfs要向rpc注册端口),如果不启动rpcbind服务时,直接启动nfs-server服务会出现报错。

[root@linuxprobe ~]# systemctl restart rpcbind
[root@linuxprobe ~]# systemctl enable rpcbind 
[root@linuxprobe ~]# systemctl start nfs
[root@linuxprobe ~]# systemctl enable nfs
[root@localhost ~]# systemctl status rpcbind
[root@localhost ~]# systemctl status nfs

3、exports 配置

编辑/etc/exports 增加需要共享的目录:

/nfs 192.168.10.0/24(rw)

[root@localhost ~]# exportfs -v

括号内可以不加任何参数,默认是读的权限。需要注意的是IP地址和括号之间不能留有空格,IP为*表示局域网都可以访问。

查看共享目录showmount -e localhost

4、重启服务

重启服务或执行如下命令使上面的配置生效# exportfs -rv刷新查看

exporting 102.168.10.0/24:/nfs

二、NFS客户端配置

windows挂载linux主机NFS

启动windows NFS客户端服务: 1.打开控制面板->程序->打开或关闭windows功能->NFS客户端 勾选NFS客户端,即开启windows NFS客户端服务. 2.win+R->cmd >mount 192.168.10.10:/nfs G:

linux挂载linux主机NFS

1、安装软件包

# yum -y install nfs-utils

客户端也必须安装该包,不然# mount -t nfs 192.168.10.10:/nfs/mnt时会提示找不到nfs参数。

将共享目录挂载到网页目录

mount -t nfs 192.168.10.10:/nfs /var/www/html

2、启动rpcbind服务

# systemctl start rpcbind

4、开机挂载设置

编辑/etc/fstab 可以设置nfs-client主机开机后自动挂载服务端的目录,在/etc/fstab中增加如下行:

192.168.1.10:/nfs /mnt nfs defaults 0 0

除了这种挂载之外,还有autofs按需挂载,这个在后面讲autofs服务时会提到。

另外在umount的过程中,还可能遇到无法umount的问题:

root@test:/# umount /nfs/ umount.nfs: /nfs: device is busy

遇到该问题时只需要使用fuser命令就可以解决:

root@test:/# fuser -km /nfs/ 或 root@test:/# fuser -f /nfs/

执行完上面的操作后,再去umount就可以了。fuser列出使用文件的本地进程的进程号,上面用到的几个参数的意义如下:

-f silently ignored (for POSIX compatibility) 
-i ask before killing (ignored without -k)
-k kill processes accessing the named file
-m show all processes using the named filesystems

工作流程:

1.首先服务器端启动RPC服务,并开启111端口

2.服务器端启动NFS服务,并向RPC注册端口信息

3.客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

4.服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

5.客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

三、权限与参数(补充说明)

1、权限

按照上面的配置给rw权限,nfs目录的为root默认创建,ll命令查看可以ls 读取,无法写入,在nfs服务端(10.10)主机上先给nfs目录赋予777的权限: # chmod 777 nfs 默认在不指定映射的用户时,系统指定的是nfsnobody用户和组。在不改变nfs目录的默认权限外,通过将nfs文件夹用户和属主更改为nfsnobody用户 #chown -R nfsnobody nfs 或者从/etc/idmapd.conf 更改它

[Mapping] Nobody-User = nfsnobody Nobody-Group = nfsnobody

使客户端挂载后可以写入, service rpcidmapd restart mount -o remount /nfs/。

如果rw,no_subtree_check,anonuid=65534,anongid=0,insecure,crossmnt

这种没法使用chown,会提示错误。服务器端改成如下就可以使用chown了,主要是no_root_squash。

rw,insecure,no_subtree_check,no_root_squash,crossmnt

2、参数

服务端在/etc/exports 括号中可以指定的参数:

选项描述

rw允许读写权限

ro只读权限

sync同步模式(Default),所有数据在写入后可以请求async异步模式,数据在写入过程中可以写入secureNFS通过1024以下的安全TCP/IP端口发送(Default)

insecureNFS可以通过所有端口发送

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_squashMap all uids and gids to the anonymous user. 对公共目录访问时较有用。no_all_squash保留共享文件的UID和GID (Default)

anonuid=UID指定匿名用户访问时映射机的用户uid

anongid=GID指定匿名用户访问时映射机的用户gid

常用配置示例如下:

/tmp     *(rw,no_root_squash)

/public 192.168.10.(rw)   (ro)

/nfs/test  192.168.10.10(rw)

/home/linux  *http://xiuxiu.com(rw,all_squash,anonuid=40,anongid=40)

/build buildhost[0-9].local.domain(rw)

/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)

客户端mount时的相关参数:

上面是 mount 自带的参数,除此之外,nfs 还支持指定以下参数:

例如,在挂载时可以按如下参数mount:

mount -t nfs -o nosuid,noexec,nodev,rw > -o bg,soft,rsize=32768,wsize=32768 > 192.168.10.20:/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相关服务:

systemd-cgls|grep rp[c] ├─rpc-statd.service │ └─2501 /usr/sbin/rpc.statd --no-notify │ └─2502 /usr/sbin/rpc.idmapd │ └─2503 /usr/sbin/rpc.mountd ├─rpcbind.service │ └─2486 /sbin/rpcbind -w

在新版本中默认情况下nfs-server和rpcbind服务开启后,nfs-mountd、nfs-lock、nfs-idmapd几个服务都默认会开启。而且从上面也可以看出nfs-lock 和 nfs-statd 两个对应的是同一个文件,可见在新版本中两个服务已进行了合并。

五、挂载时用户权限对应

将exports的配置更改为如下:

/nfs 102.168.10.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 一致。

服务端和客户端关闭防火墙和selinux

//关闭防火墙

[root@localhost1 ~]# systemctl stop firewalld

[root@localhost1 ~]# setenforce 0

//下载nfs相关软件

[root@localhost1 ~]#yum -y install nfs-utils

[root@localhost1 ~]#yum -y install rpcbind


发表评论

评论列表,共 0 条评论

    暂无评论