通过NFS共享文件
NFS的全称:网络文件系统
此服务主要是用于 linux 和linux之间;unix 和 unix之间的网络文件传输;
这个服务器相对来说比较简单,但是难度在于如何配置它的端口号。
工作原理:
NFS提供很多功能,如:rpc.nfs;rpc.mount;rpc.lockd不同的功能由不同的daemon来完成。
NFS使用的端口是2049端口;
RPC使用的端口是111端口;(远程过程调用)
NFS服务器默认是安装好的,我们现在给重新启动一下:
# service nfs restart
当我在启动NFS的时候,NFS会把它的一些daemon发送到RPC去注册,RPC会随机的给这些daemon随机的去分配一些端口
可以使用如下命令查看随机分配的端口号有哪些:
# rpcinfo –p localhost 这里看到的随机分配的端口,只要一重新启动NFS,端口就又会重新分配,和现在看到的端口就不会是一样的了。
这里的随机分配的端口号是一个大问题,当我们在写防火墙的时候,就不容易写端口号了,因为这些端口号在每次重新启动NFS服务器的时候,都会重新分配不一样的端口号,那这些端口号是否可以固定呢?可以的,如下:
# vim /etc/sysconfig/nfs
找到如下端口号,把它改一下:
找到这些行,如下:
# LOCKD_TCPPORT=32803
# LOCKD_UDPPORT=32769
# MOUNTD_PORT=892
# STATD_PORT=662
找到上面这些行,然后把这些行前面的“#”给去掉,把后面的端口号给改一下,并且用双引号给引起来,如下:
LOCKD_TCPPORT=”4001”
LOCKD_UDPPORT=”4001”
MOUNTD_PORT=”4002”
STATD_PORT=”4003”
重启NFS之后,发现上面的端口号已经被固定下来,如下:
# service nfs restart
# rpcinfo –p localhost
然后就可以通过防火墙来控制其端口了。
# iptables –I INPUT 1 –p tcp –dport 111 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 111 –j ACCEPT
# iptables –I INPUT 1 –p tcp –dport 2049 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 2049 –j ACCEPT
# iptables –I INPUT 1 –p tcp –dport 4001:4003 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 4001:4003 –j ACCEPT
防火墙配置好之后一定要保存一下,如下:
# service iptables save
下面就开始配置网络共享了,如下:
先创建一个文件夹,然后通过NFS把这个文件共享出去:
# mkdir /xx
然后编辑一个文件:
# vim /etc/exports
语法:共享目录 共享的范围(属性1,属性2,……)
/xx 192.168.80.0/24(rw,sync)
“rw”为可读可写;
“ sync”为同步;同步的意思就是说,当用户把这个共享目录挂载到本地时,用户往这个挂载目录里写东西,其实就往/xx里写东西,两者保持一个同步。
在另外一台linux机器上查看服务器上的共享,方法:
# showmount –e 192.168.80.88
然后将服务器上共享目录挂载到本地上,如下:
# mount 192.168.80.88:/xx /tmp
当往这个挂载的目录里写文件的时候,发现权限不够,原因如下:
# cd /tmp/
# touch xx
Touch: 无法创建“xx”:权限不够
权限不够的原因是:是因为服务器里有一个设置,我们只写了两个(rw,sync),但实际上它还有一个隐藏的选项,我们没有看到而已,那这个隐藏选项叫 root_squash,意思是权限的压缩,这个权限是默认权限,并没有显示在这里面。意思是说,我现在共享了一个目录,在客户端上面如果挂载了我的共享目录的话,在客户端上如果使用root来登录的话,使用root来访问我的nfs共享的时候,NFS服务器会把它当成一个匿名用户(NFS nobody),所以当客户端使用root来往NFS里面写东西,由于服务器那边做了root_squash,所以当客户端使用root来往NFS共享里写东西时,服务器会认为客户端使用的是NFS nobody用户(匿名用户)。
为什么这么说?我们来看一个配置文件,如下:
# cat /var/lib/nfs/etab
/xx 192.168.80.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
这里我只设置了rw,sync,其实后面还有很多东西;
后面有写到,root_squash,意思是权限的压缩,压缩为ID为65534的用户。可以看下这个ID为什么用户,如下:
[root@server ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) ?=65534(nfsnobody)
这里就显示这个ID为nfsnobody用户(也就是匿名用户)
我们再来看一下这个共享目录的权限(在服务器上)
[root@server ~]# ll -d /xx/
drwxr-xr-x. 2 root root 4096 9? 17 23:18 /xx/
所属用户为root,所属组为root ,那么nfsnobody应该属于其它,权限这里的其它只有一个X权限
然后我们可以给其它加一个w权限,如下:
# chmod o+w /xx
这个时候客户端就可以往这个挂载里面写东西了,如下:
# cd /nfs/
# touch xx
[root@www nfs]# touch x
[root@www nfs]# ll
-rw-r--r--. 1 root root 0 9月 17 23:18 88888
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:45 sdo
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:47 wen
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:49 x
[root@www nfs]#
这个时候就会看下面三个文件的所有者和所属组都是属于nfsnobody了。
我们可以不做权限的压缩,如下:
在后面的括号里加上一句 no_root_squash意思是:不做权限的压缩
# vim /etc/exports
/xx 192.168.80.0/24(rw,sync,no_root_squash)
然后执行下面的命令(重新输出),如下;
# exportfs –arv
“a”所有
“r”重新挂载
“v”显示过程
“u”卸载
然后再在客户端上的NFS共享里创建一个文件,会显示所有者和所属组都为root了。
注意:不推荐大家反复多次的重启NFS服务,因为每次重新NFS服务的时候,NFS服务器都会到/var/lib/nfs/etab文件里去注册,会花很长时间,那时在创建文件的时候,会用掉很长时间才能创建出来。所以推荐大家,不要重启NFS服务,而是直接使用exportfs –arv命令。
如果只允许一台主机有写的权限,其它的不能有写的权限,可以写成如下:
# vim /etc/exports
/xx 192.168.80.88/32(rw,sync) 192.168.80.0/24(ro,sync)
前面的子网掩码不能写成24,如果你写成24的话,系统还会认为是这个网段,所以要写成32,另外上面的写法还可以写成:这里给分成两行来写的。
/xx 192.168.80.88/32(rw,sync)
/xx 192.168.80.0/24(rw,sync)
如果有多个共享的话,可以一一把系统中的共享文件全部写入到这里,如果有几百个,可以使用for 循环来做。