NFS服务的简单介绍与运用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS服务的简单介绍与运用相关的知识,希望对你有一定的参考价值。

NFS服务


Network File System 网络文件系统,基于内核的文件系统。Sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(RemoteProcedure Call Protocol远程过程调用)实现


RPC采用C/S模式。客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。


    NFS优势:节省本地存储空间,将常用的数据如:home目录,存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用



   简单的说,就是在nfs服务器上有一个共享的文件夹挂载到本地的一个目录上,当你访问这个目录的时候是在本地,但是数据是在远程的nfs服务器的数据;


NFS服务介绍


软件包:nfs-utils

Kernel支持:nfs.ko

端口:2049(nfsd), 其它端口由portmap(111)分配


配置文件:/etc/exports,/etc/exports.d/*.exports

CentOS7不支持同一目录同时用nfs和samba共享,因为使用锁机制不同

相关软件包:rpcbind(必须),tcp_wrappers

rpcbind 是固定端口号111

在centos 7上 按需激活 ,rpcbind服务激活的同时会将nfs服务一同激活

将systemctl stop rpcbind.socket停止的时候,systemctl status rpcbind.service也会停止的,激活socket的时候不会激活service;激活service的时候会激活socket

在centos 6上,当你将rpcbind服务停止,nfs服务是起不来得,会报错,因为centos6上不能解决服务依赖关系

在centos 6上没有service和socket之分,是一个整体

CentOS6开始portmap进程由rpcbind代替

NFS服务主要进程:


rpc.nfsd 最主要的NFS进程,管理客户端是否可登录

rpc.mountd 挂载和卸载NFS文件系统,包括权限管理

rpc.lockd 非必要,管理文件锁,避免同时写出错 ,一个用户在访问这个资源的时候会加锁,防止另一个人写东西,避免数据损坏

rpc.statd 非必要,检查文件一致性,可修复文件


日志:/var/lib/nfs/


NFS配置文件


导出的文件系统的格式:

/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...

#开始为注释

主机格式:

单个主机:ipv4,ipv6,FQDN

IP networks:两种掩码格式均支持

172.18.0.0/255.255.0.0

172.18.0.0/16

wildcards:主机名通配,例如*.magedu.com,IP不可以

netgroups:NIS域的主机组,@group_name

anonymous:表示使用*通配所有客户端


在centos 7上 systemctl start nfs-server nfs的主服务

在centos 6上     service nfs start


配置防火墙,开放NFS服务


配置NFS使用固定端口

vim /etc/sysconfig/nfs
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
STATD_OUTGOING_PORT=2020

防火墙除开放上述端口,还需开放TCP和UDP的111和2049共4个端口


nfs的主配置文件/etc/exports这个包不是来自nfs-utils这个包,是来自setup这个包

[[email protected] ~]#rpm -qf /etc/exports
setup-2.8.71-7.el7.noarch

实验,实现共享文件的设置:

在centos 7 (192.168.77.7)这个主机作为nfs的服务器,现在将/app/nfsdir1和nfsdir2这两个文件夹共享出来,可让其他的一些主机访问这个文件;


配置如下:在nfs的配置文件/etc/exports这个文件中设置一些选项

[[email protected] nfsdir2]#vim /etc/exports


/app/nfsdir1    * 所有人都能挂载


另一个共享文件


[[email protected] nfsdir2]#vim /etc/exports.d/dir.exports 注意,在/etc/exports.d/这个目录下,设置想要共享的目录必须以"  .exports这个后缀结尾 "


/app/nfsdir2    192.168.77.6

  | |

共享目录 设置只能是这个主机访问这个共享目录,其他主机就不能访问,因为设置了固定的ip

[[email protected] nfsdir2]#exportfs -r 重读配置文件使生效,也可重启服务
exportfs: No options for /app/nfsdir1 *: suggest *(sync) to avoid warning  #这个警告无关紧要
exportfs: No options for /app/nfsdir2 192.168.77.6: suggest 192.168.77.6(sync) to avoid warning
[[email protected] nfsdir2]#exportfs -v 查看共享出来的文件夹
/app/nfsdir2  192.168.77.6(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/app/nfsdir1  <world>(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

exportfs 服务器的工具


–v 查看本机所有NFS共享

–r 重读配置文件,并共享目录

–a 输出本机所有共享,恢复共享

–au 停止本机所有共享,临时取消所有共享


showmount -e hostname 客户端工具,查看远程nfs服务器共享出来的文件夹

showmount -e 192.168.77.7

[[email protected] ~]#showmount -e 192.168.77.7

clnt_create: RPC: Program not registered 有这个报错的时候原因是服务器段的nfs  ystemctl start nfs服务没有起来(端口号)

[[email protected] ~]#showmount -e 192.168.77.7
Export list for 192.168.77.7:
/app/nfsdir1 *
/app/nfsdir2 192.168.77.6

然后在客户端将服务器共享出来的文件夹挂载在本机的一个文件夹下面

mount 192.168.77.7:/app/nfsdir1 /mnt/nfs1
[[email protected] ~]#mount 192.168.77.7:/app/nfsdir1 /mnt/nfs1
[email protected] ~]#mount 192.168.77.7:/app/nfsdir2 /mnt/nfs2
[[email protected] ~]#df
192.168.77.7:/app/nfsdir1
                      48803584   32896  48770688   1% /mnt/nfs1
192.168.77.7:/app/nfsdir2
                      48803584   32896  48770688   1% /mnt/nfs2

在/mnt/nfs1这个目录下就可以看到/app/nfsdir1中的文件

[[email protected] ~]#cd /mnt/nfs1/
[[email protected] nfs1]#ls
dir1file
[[email protected] nfs1]#cd /mnt/nfs2/
[[email protected] nfs2]#ls
dir2file


df命令和mount可以看到挂载

[[email protected] nfs2]#mount
192.168.77.7:/app/nfsdir1 on /mnt/nfs1 type nfs (rw,vers=4,addr=192.168.77.7,clientaddr=192.168.77.6)
192.168.77.7:/app/nfsdir2 on /mnt/nfs2 type nfs (rw,vers=4,addr=192.168.77.7,clientaddr=192.168.77.6)

可以明显的看出在服务器端看到的是只读权限,在客户端看到的是可读可写权限,但是你是创建不了文件的,如下所示,可以看出还是依据服务器端的默认权限来的

[[email protected] nfs2]#touch 11
touch: cannot touch `11‘: Read-only file system
可以指定版本挂载
mount -o vers=3  192.168.77.7:/app/nfsdir1 /mnt/nfs1
[[email protected] ~]#mount -o vers=3  192.168.77.7:/app/nfsdir1 /mnt/nfs1
[[email protected] ~]#mount
192.168.77.7:/app/nfsdir1 on /mnt/nfs1 type nfs (rw,vers=3,addr=192.168.77.7)
想要实现永久挂载需要写入/etc/fstab文件中
vim /etc/fstab
192.168.77.7:/app/nfsdir1               /mnt/nfs1       nfs  vers=3     0 0

由于nfs的安全性不好,可以看到服务器的共享目录和允许访问的ip,所以可以仿造ip来去实现挂载, 可以修改配置文件或者直接修改ifconfig eth0 192.168.26.106,现在可以就直接挂载了,挂载之前切记要将以前挂载的文件取消挂载,防止死机。


实验2:共享文件权限的设置

[[email protected] nfsdir2]#vim /etc/exports.d/dir.exports 
/app/nfsdir2    192.168.77.6(rw)可读可写权限
[[email protected] ~]#mount 192.168.77.7:/app/nfsdir2 /mnt/nfs2
[[email protected] ~]#df
192.168.77.7:/app/nfsdir2
                      48803584   32896  48770688   1% /mnt/nfs2
[[email protected] nfs2]#touch f1
touch: cannot touch `f1‘: Permission denied

 

明显的错误提示跟原来的不一样了,由于不知道它是以谁的身份来运行,所以先简单粗暴的加一个777权限,chmod 777 /app/nfsdir2

[[email protected] nfs2]#touch f1
[[email protected] nfs2]#ll
total 0
-rw-r--r-- 1 root      root      0 Oct 15  2017 dir2file
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 16  2017 f1

看见没有,它是以nfsnobody的身份在运行而不是root,所以现在给nfsnobody加权限就可以了

[[email protected] app]#chmod 755  /app/nfsdir2/
[[email protected] app]#setfacl -m u:nfsnobody:rwx nfsdir2/
[[email protected] nfs2]#touch f2
[[email protected] nfs2]#ll
total 0
-rw-r--r-- 1 root      root      0 Oct 15  2017 dir2file
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 16  2017 f1
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 16  2017 f2

客户端的账户分两种,普通用户(wang,mage),如果以普通用户的身份去访问nfs服务器资源的时候,他会映射成为与nfs服务器同id的用户,root访问的时候是以nfsnobody身份


例如:

[[email protected] nfs2]#su - wang
[email protected] nfs2]$touch f3
touch: cannot touch `f3‘: Permission denied 权限拒绝,证明普通用户不是以nfsnobody的身份去访问资源的

查看普通用户以谁的身份用行,加权限查看

[[email protected] app]#chmod 777  /app/nfsdir2/
[[email protected] nfs2]$touch f3
[[email protected] nfs2]$ll
-rw-rw-r-- 1 wang      wang      0 Oct 16  2017 f3
[[email protected] app]#cd /app/nfsdir2/
[[email protected] nfsdir2]#ll
-rw-rw-r-- 1       500       500 0 Oct 16 09:14 f3

NFS配置文件


每个条目指定目录导出到的哪些主机,及相关的权限和选项默认选项:(ro,sync,root_squash,no_all_squash)squash压榨

ro,rw 只读和读写

async 异步,数据变化后不立即写磁盘,性能高

sync(1.0.0后为默认)同步,数据在请求时立即写入共享

no_all_squash (默认)保留共享文件的UID和GID

all_squash 所有远程用户(包括root)都变成nfsnobody

root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)

no_root_squash 远程root映射成root用户

anonuid和anongid 指明匿名用户映射为特定用户UID和组

GID,而非nfsnobody,可配合all_squash使用

[[email protected] nfsdir2]#vim /etc/exports.d/dir.exports
/app/nfsdir2    192.168.77.6(rw,all_squash,no_root_squash)如果定义了压榨所有用户包括root,则定义的no_root_squash不压榨root也不会生效


*****指定访问nfs资源为特定的一个用户如何配置

[[email protected] nfsdir2]#vim /etc/exports.d/dir.exports 
/app/nfsdir2    192.168.77.6(rw,all_squash,anonuid=48,anongid=48) 意思这个uid和did=48的这个用户将被映射为访问nfs资源的用户


[[email protected] nfs2]$touch f4
[[email protected] nfs2]$ll
-rw-rw-r-- 1 apache    apache    0 Oct 16  2017 f4
[[email protected] nfs2]#touch f5
[[email protected] nfs2]#ll
-rw-r--r-- 1 apache    apache    0 Oct 16  2017 f5

可以针对同一个网段内的一些ip做不同权限的设置

[[email protected] nfsdir2]#vim /etc/exports.d/dir.exports
/app/nfsdir2    192.168.77.6(ro)        192.168.77.0/24(rw) 
[[email protected] nfsdir2]#exportfs -v 会出现两条配置
/app/nfsdir2  192.168.77.6(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/app/nfsdir2  192.168.77.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

在其他主机上测试

[[email protected] nfs2]#touch f1
[[email protected] nfs2]#ll
-rw-r--r--. 1 root      root      0 Oct 15 16:39 dir2file
-rw-r--r--. 1 nfsnobody nfsnobody 0 Oct 16 09:57 f1

现在想实现家目录挂载,比如77.7这个主机提供共享存储,将77.6这个主机的wang用户的家目录放在77.7这个主机的共享文件夹上去,节约磁盘空间,统一管理

[[email protected] wanghome]#vim /etc/exports
/app/nfsdir1    *
/app/homedir/wanghome   *(rw) 虽然加了读写权限
[[email protected] ~]#mkdir /app/homedir/wanghome -pv
[[email protected] ~]#cd /app/homedir/wanghome/
[[email protected] wanghome]#cp /etc/skel/.[^.]* . -r  由于家目录的文件是隐藏的可用ls -a查看


[[email protected] wanghome]#useradd -u 500 tianxia 指定一个uid=500的用户,因为centos 7和centos 6上的普通用户id不同
[[email protected] wanghome]#id tianxia
uid=500(tianxia) gid=2009(tianxia) groups=2009(tianxia)
[[email protected] wanghome]#setfacl -R -m u:tianxia:rwx

/app/homedir/wanghome/ 加权限为了远程主机的普通用户可创建文件


在远程主机测试

[[email protected] ~]#mount 192.168.77.7:/app/homedir/ /home/wang

这里可挂载父目录也可以挂载子目录,只要父目录共享出来子目录就可以挂载,不过一般不会这样,一般共享出来什么挂载什么


[[email protected] ~]#su - wang
[[email protected] ~]$ls -a
.  ..  wanghome
[[email protected] wanghome]$touch f1
[[email protected] wanghome]$ll
total 0
-rw-rw-r-- 1 wang wang 0 Oct 16  2017 f1
实现了家目录挂载

上述实验有一个问题,就是uid不统一,最好统一
在服务器端看到wang用户创建的文件所有者和所属组不同了
[[email protected] wanghome]#ll
total 0
-rw-rw-r-- 1 tianxia 500 0 Oct 16 10:54 f1

实验:实现伪根的挂载

[[email protected] app]#mkdir /app/testdir/dir3 -p
[[email protected] app]#mkdir /app/nfsdir2/dir2 -p
[[email protected] app]#mkdir /app/nfsdir1/dir1 -p
[[email protected] dir1]#touch /app/testdir/dir3/file3
[[email protected] dir1]#touch /app/nfsdir1/dir1/file1
[[email protected] dir1]#touch /app/nfsdir2/dir2/file2
[[email protected] ~]#mkdir /app/nfsroot/

现在想要用户通过伪根的挂在来访问资源,将nfsdir1  nfsdir2   testdir这三个目录都放在nfsroot这个目录下面,用目录挂目录来实现

[[email protected] app]#mkdir nfsroot/dir1
[[email protected] app]#mkdir nfsroot/dir2
[[email protected] app]#mkdir nfsroot/dir3
[[email protected] app]#mount -B /app/nfsdir1/ /app/nfsroot/dir1/
[[email protected] app]#mount -B /app/nfsdir2/ /app/nfsroot/dir2/
[[email protected] app]#mount -B /app/testdir/ /app/nfsroot/dir3/
[[email protected] app]#mount
/dev/sda3 on /app/nfsroot/dir1 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda3 on /app/nfsroot/dir2 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda3 on /app/nfsroot/dir3 type xfs (rw,relatime,attr2,inode64,noquota)
[[email protected] ~]#vim /etc/exports
/app]#mkdir/nfsroot     *(rw,fsid=0,crossmnt)
/app/nfsroot/dir1       *(rw)
/app/nfsroot/dir2       *(ro)
/app/nfsroot/dir3       *(rw)

fsid=0表示伪根的根 ,crossmnt表示允许挂设备来挂载


在客户端挂载

[[email protected] ~]#showmount -e 192.168.77.7
Export list for 192.168.77.7:
/app/nfsroot/dir3 *
/app/nfsroot/dir2 *
/app/nfsroot/dir1 *
/app/nfsroot      *
[[email protected] ~]#mount 192.168.77.7:/ /mnt
[[email protected] ~]#df
192.168.77.7:/  48803584   33024  48770560   1% /mnt
[[email protected] ~]#cd /mnt/
[[email protected] mnt]#ls
dir1  dir2  dir3


自动挂载

可使用autofs按需要挂载NFS共享,在空闲时自动卸载

由autofs包提供

系统管理器指定由/etc/auto.master自动挂载器守护进程控制的挂载点

自动挂载监视器访问这些目录并按要求挂载文件系统

文件系统在失活的指定间隔5分钟后会自动卸载

为所有导出到网络中的NFS启用特殊匹配 -host 至“browse”


自动挂载有两种方法:


第一种

  相对路径法;分两部分

在/etc/auto.master这个配置文件中定义子目录的配置文件路径和父目录


例如:/dev/sr0/misc/cd这个目录中在/etc/auto.master是这样定义的
(dirname)/misc    /etc/auto(子配置文件路径)
子配置文件vim /etc/auto
(basename)cd-    fstype=iso9660:/dev/sr0

由于是挂载的光盘所以要加个文件系统类型 ,本地设备的时候要加冒号


注意:子配置文件不用事先创建,当你访问的时候会自动生成


示例:

vim /etc/auto.master
/app/d1/        /etc/tianauto 
vim /etc/tianauto 
nfs     -fstype=nfs,vers=3      192.168.77.77:/app


重启autofs服务后就可以看到挂载,如果要是看不到挂载,那就重启nfs服务,因为这个自动挂载是由这两个服务提供的


用相对路径挂载的时候会有问题如果将/home/testdir 这个目录挂载到192.168.77.77:/app,则/home/中的文件会被隐藏,普通用户登录进去是找不到家的,说白了,就是/home这个目录中挂载的什么由子配置文件中定义


解决上述问题用绝对路径的方法来配置


第二种方法:

绝对路径;格式:

vim /etc/auto.master
/- /etc/test2

/-表示不定义父目录,定义子配置文件谁说了算,所有的完整路径在子配置文件中定义


vim /etc/test2
/home/testdir  -fstype=nfs,vers=3      192.168.77.77:/app


配置完后切记访问/home/目录使之自动生成


在配置文件/etc/auto.master中有一个比较神奇的定义/net -hosts这一项,它可以不用mount挂载,可以直接切换到nfs服务器共享的文件路径中;如下:

[[email protected] ~]#cd /net/
[[email protected] net]#ls
[[email protected] net]#cd 192.168.77.77
[[email protected] 192.168.77.77]#ls
app
[[email protected] 192.168.77.77]#cd app/
[[email protected] app]#ls
aa  bb  tian

上述是学到的一些知识,本人基础薄弱,有什么错误还望多多指出以便改进,谢谢!!!!!!





本文出自 “13147090” 博客,谢绝转载!

以上是关于NFS服务的简单介绍与运用的主要内容,如果未能解决你的问题,请参考以下文章

NFS服务搭建与配置

1.NFS服务配置

Tomcat的简单介绍,安装,以及简单的配置运用

NFS共享文件系统的介绍与配置

53次课( NFS介绍 NFS服务端安装配置NFS配置选项)

NFS介绍 NFS服务端安装配置 NFS配置选项