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服务的简单介绍与运用的主要内容,如果未能解决你的问题,请参考以下文章