centos7搭建nfs服务器
一.NFS简介
NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
NFS服务端、RPC协议、客户端三者可以理解为房源、中介、租客之间的关系:
二、所需要的软件及软件结构
要设定好 NFS 服务器我们必须要有两个软件才行,分别是:
- RPC 主程序:rpcbind
就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC 服务,而要启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! (在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的!) - NFS 主程序:nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件啦!一定要有喔!
- 主要配置文件:/etc/exports
这个档案就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个档案『 不一定会存在』,你可能必须要使用 vim 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已吶! - NFS 文件系统维护指令:/usr/sbin/exportfs
这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法我们在底下会介绍。 - 分享资源的登录档:/var/lib/nfs/*tab
在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。 - 客户端查询服务器分享资源的指令:/usr/sbin/showmount
这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!
三、环境准备
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@server ~]# uname -r 3.10.0-693.el7.x86_64 [root@server ~]# hostname -I 10.0.0.10
四、安装NFS服务和RPC-bind服务
1、查看系统是否已安装NFS
[root@bogon ~]# rpm -qa | grep nfs [root@bogon ~]# rpm -qa | grep rpcbind
2、安装NFS
[root@server ~]# yum -y install nfs-utils rpcbind
五、服务端配置
在NFS服务端上创建共享目录/data/nfsdir并设置权限
[root@server ~]# mkdir -p /data/nfsdir
[root@server ~]# chmod 666 /data/nfsdir/
[root@server ~]# ll /data/
total 0
drw-rw-rw- 2 root root 6 Apr 16 08:52 nfsdir
编辑export文件
[root@server ~]# vi /etc/exports
/data/nfsdir 10.0.0.0/24(rw,no_root_squash,no_all_squash,sync)
常见的参数则有: 参数值 内容说明 rw ro 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。 sync async sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘! no_root_squash root_squash 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行! all_squash 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦! anonuid anongid anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。
配置生效
[root@server ~]# exportfs -r
启动rpc和nfs(注意顺序)
[root@server ~]# systemctl start rpcbind
[root@server ~]# systemctl start nfs
查看RPC服务的注册情况
[root@server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 54506 status 100024 1 tcp 34836 status 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 44948 nlockmgr 100021 3 udp 44948 nlockmgr 100021 4 udp 44948 nlockmgr 100021 1 tcp 41426 nlockmgr 100021 3 tcp 41426 nlockmgr 100021 4 tcp 41426 nlockmgr
选项与参数: -p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息; -t :针对某主机的某支程序检查其 TCP 封包所在的软件版本; -u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;
利用showmount命令检查服务端连机情况
[root@server ~]# showmount -e localhost Export list for localhost: /data/nfsdir 10.0.0.0/24
选项与参数: -a :显示目前主机与客户端的 NFS 联机分享的状态; -e :显示某部主机的 /etc/exports 所分享的目录数据。
六、客户端配置
创建需要挂载的目录
[root@client01 ~]# mkdir /nfsdir
查看服务端的共享目录信息
[root@client01 ~]# showmount -e 10.0.0.10 Export list for 10.0.0.10: /data/nfsdir 10.0.0.0/24
为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议
mount -t nfs 192.168.2.203:/data/lys /lys -o proto=tcp -o nolock
七.测试
查看挂载情况
[root@client01 ~]# df -h|grep nfsdir 10.0.0.10:/data/nfsdir 17G 1.3G 16G 8% /nfsdir
服务端在共享目录下生成一个测试文件
[root@server ~]# echo "hello nfs" > /data/nfsdir/test.txt
客户端查看
[root@client01 ~]# ll /nfsdir/ total 4 -rw-r--r-- 1 root root 10 Apr 16 09:19 test.txt
[root@client01 ~]# cat /nfsdir/test.txt
hello nfs
客户端生成文件内容
[root@client01 ~]# echo "client also write message" >> /nfsdir/test.txt [root@client01 ~]# cat /nfsdir/test.txt hello nfs client also write message
服务端查看文件内容
[root@server ~]# cat /data/nfsdir/test.txt hello nfs client also write message
卸载已挂载的NFS
[root@client01 ~]# umount /nfsdir/ [root@client01 ~]# df -h|grep nfsdir [root@client01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 220M 0 220M 0% /dev tmpfs 231M 0 231M 0% /dev/shm tmpfs 231M 4.6M 226M 2% /run tmpfs 231M 0 231M 0% /sys/fs/cgroup /dev/sda1 1014M 125M 890M 13% /boot tmpfs 47M 0 47M 0% /run/user/0
补充部分:
由于每次nfs启动向rpc注册端口都是随机生成,不是固定的,这样就给我们防火墙的设置带来不便。
[root@server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 54506 status 100024 1 tcp 34836 status 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 44948 nlockmgr 100021 3 udp 44948 nlockmgr 100021 4 udp 44948 nlockmgr 100021 1 tcp 41426 nlockmgr 100021 3 tcp 41426 nlockmgr 100021 4 tcp 41426 nlockmg
通过修改配置文件,将注册端口固定。
[root@server ~]# echo -e "RQUOTAD_PORT=30001\nLOCKD_TCPPORT=30002\nLOCKD_UDPPORT=30002\nMOUNTD_PORT=30003\nSTATD_PORT=30004" >>/etc/sysconfig/nfs [root@server ~]# tail -5 /etc/sysconfig/nfs RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30002 MOUNTD_PORT=30003 STATD_PORT=30004
重启nfs,并查看注册端口
[root@server ~]# systemctl restart nfs [root@server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 54506 status 100024 1 tcp 34836 status 100005 1 udp 30003 mountd 100005 1 tcp 30003 mountd 100005 2 udp 30003 mountd 100005 2 tcp 30003 mountd 100005 3 udp 30003 mountd 100005 3 tcp 30003 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 38083 nlockmgr 100021 3 udp 38083 nlockmgr 100021 4 udp 38083 nlockmgr 100021 1 tcp 46265 nlockmgr 100021 3 tcp 46265 nlockmgr 100021 4 tcp 46265 nlockmgr
这下防火墙只需要开发这些相应的端口就可以了。
over...