NFS介绍

NFS简介

Network File System 网络文件系统,基于内核的文件系统,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

SUN公司研发

通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC[远程过程调用]实现

在NFS的应用结构中有服务器和客户机两种角色,NFS客户端通过挂载NFS文件系统的方式访问NFS服务器中输出的共享目录

在同一台主机中既可以当NFS服务器也可以作为客户机

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

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

版本信息
centos7默认使用NFSv4版,实现伪根,辅助服务不需要,完全支持kerberos安全加密
改进了Internet 上的存取和执行效能
在协议中增强了安装方面
只支持TCP传输,通过一个安全的带内系统,协商在服务器和客户端之间使用的安全性类型
使用字符串而不是整数来表示用户和组标识符
centos7中不支持同一目录同时使用nfs和smb共享,因为使用的锁机制不同


NFS服务介绍

软件包:nfs-utils

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

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

服务管理service文件:/usr/lib/systemd/system/nfs-server.service

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

locate nfs.ko # 显示NFS文件系统路径

日志:/var/lib/nfs/


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

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

   rpc.lockd 非必要,管理文件锁,避免同时写出错

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


配置文件添加共享目录格式
  /dir host1(option1,…) host2(option2,…)
  #号开头为注释行


主机的格式有
单个主机:IPv4,IPv6

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

  192.168.40.0/255.255.255.0

  192.168.40.0/24

主机名通配:
  *.linux.com
  IP不支持通配


选项
默认选项为:(ro,sync,root_squash,no_all_squash)

选项作用
ro/rw只读和读写
async异步,数据变化后不立即写磁盘,性能高
sync同步,数据在请求时立即写入磁盘
no_all_squash保留共享文件的UID和GID
all_squash所有远程用户(包括root)都变为nfsnobody
root_squash远程root映射为nfsnobody
no_root_squash远程root映射成root用户
anonuid和anongid指明匿名用户映射为特定用户UID个GID,而非nfsnobody。可配合all_squash使用

挂载时选项:man 5 nfs

选项作用
fg默认。前台挂载,如果网络出现问题,mount命令会一直停留在屏幕中等待
bg后台挂载,推送到后台执行命令
hard默认,持续请求,当因为网络等原因导致挂载不上时,会持续发送请求挂载
soft如果出现网络原因导致挂载不上,那么过一段时间再试,而不是持续不断的请求
intr和hard结合,请求可以按Ctrl+c终止请求
rsize和wsize一次读觉写数据最大字节数
_netdev无网络时不挂在
nosuid挂载上后目录或文件的suid特殊权限不支持
nodev挂载后包含设备的信息不支持
noexec挂在后可执行程序不支持

示例:mount -o rw,nosuid,fg,hard,intr 192.168.40.17:/testdir /mnt/nfs/


永久挂载的两种写法

1写到/etc/rc.d/rc.local文件中,在文件中添加的命令就像我们在命令行输入的命令格式相同

[root@lvs rc.d]# vim /etc/rc.d/rc.local   
#!/bin/bash

# 中间有部分注释信息,我删除了
touch /var/lock/subsys/local			# 文件中自带的
mount /dev/sr0 /mnt/cdrom				# 实现开机挂载需要添加的

为文件添加上执行权限。centos7默认是没有执行权限的!

chmod +x /etc/rc.d/rc.local 

2写到/etc/fstab文件中
格式:nfsserver-IP:/dir /mnt/nfs nfs defualts 0 0

多余说明:在系统启动时,/etc/fstab文件挂载要优先于network服务,/etc/fstab文件中如果有通过网络挂载的NFS文件系统,那么就会跳过,当系统启动后,由netfs程序重新扫描一次/etc/fstab文件,然后将其没有挂载的重新挂在一次

启动服务

systemctl start nfs-server
systemctl enable nfs-server

在客户机查看NFS服务器共享目录的命令

showmount -e server-IP

查看配置文件书写格式,其中有示例写法

man 5 exports

修改完后不需要重启服务,使用exportfs命令将其生效

exportfs 

-r:重新导出所有目录
-au:取消所有目录导出
-a:重新导出所有目录
-v:详细

示例:一步一步了解
场景:192.168.40.7时NFS服务器,192.168.40.17时客户端
1、在40.7修改配置文件添加一个目录共享/etc/exports,默认此文件是空的,在里边添加即可

vim /etc/exports
/data/nfs1      *	# *表示通配符。所有主机可连。

2、重读

exportfs -r
exportfs: No options for /data/nfs1 *: suggest *(sync) to avoid warning
这个提示显示没有添加任何选项,则默认为sync选项
显示默认选项
exportfs -v
/data/nfs1      <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
# 上面(括号)內的选项是默认选项,如果要修改,在配置文件中添加

3、接着再次在客户端40.17使用

showmount -e 192.168.40.7	就可以看到共享出来的目录了

# 如果没有showmount命令安装nfs-utils包
mkdir /mnt/nfs1
mount 192.168.40.7:/data/nfs1 /mnt/nfs1/

在客户机问题出现:

cd /mnt/nfs1
touch file1
touch: cannot touch ‘111’: Read-only file system	
# 出现此错误,使我们没有指定选项时,默认选项时ro,只读,需要服务端修改

4、40.7服务器再次编辑

vim /etc/exports
/data/nfs1      *(rw)

exportfs -r		# 当添加一个选项后,不会再出现上面的报错

5、客户端测试

cd /mnt/nfs1
touch root.txt
touch: cannot touch ‘root.txt’: Permission denied	

权限拒绝,通过NFS访问是root用户,但最终还是访问的远程主机的目录,本机的root用户到了远程主机将不再是root用户了,他没有权限访问

  在客户机如果使用root用户和其他用户在NFS共享目录中创建文件,其实是映射为服务器的nfsnobody用户。而在服务器中/data/nfs1目录权限并没有对nfsnobody用户开放权限,所以默认都是拒绝创建文件的,可以为nfsnobody用户在共享目录上添加facl权限,以使所有客户机只要映射为nfsnobody用户就有权限对共享目录进行管理

setfacl -m u:nfsnobody:rwx /data/nfs1

touch root.txt	# 此时再创建就是成功的

权限为下:属主属组都是nfsnobody
-rw-r--r-- 1 nfsnobody nfsnobody    0 Dec  2 11:41 root.txt	

总结:客户机root用户访问共享目录时被映射为服务器端nfsnobody用户这种行为被称为权限压榨,exportfs -v命令中root_squash表明,squash压制的意思,也可以no_root_squash取消压榨

在客户机中使用其他普通用户在共享目录中创建文件时并没有映射为nfsnobody用户,而是此用户本身,所以默认也是权限拒绝的,不允许创建文件。

注意:服务端如果有和此用户UID相同的用户时,文件的属主属组会被看为是服务端的用户,而不是客户端创建文件所使用的用户。如果服务端没有和客户端创建文件的用户相同UID的用户,那么服务端显示的文件属主属组是客户端创建文件用户的UID,而不是用户名。解决方法:可以使用ldap服务统一管理账户,目前还不会,用到再学

总结:对于普通用户在共享目录中的操作默认是没有压榨权限的,操作用户的UID是多少,服务端就会显示其UID,exportfs -v命令中no_all_squash表明,squash压制的意思,也可以all_squash设置压榨


怎么看root创建的文件到服务端变为nfsnobody用户这个效果呢

1)在服务端先将共享目录创建777权限

chmod 777 /data/nfs1

2)到客户端使用root用户创建文件

cd /mnt/nfs1
touch nfs.txt

3)返回服务端查看

[root@centos_7 nfs1]# ll
-rw-r--r-- 1 nfsnobody nfsnobody    0 Dec  2 11:41 nfs.txt

改变压榨后映射的用户

vim /etc/exports

/data/nfs1      *(rw,no_root_squash,all_squash,anonuid=555,anongid=555)
# 将所有用户压榨权限映射为服务端用户nfs,555是nfs的uid,gid

只允许某IP或某网段访问共享目录

在40.7上添加
vim /etc/exports
/data/nfs1      *(rw,no_root_squash,all_squash,anonuid=555,anongid=555)
/data/nfs2      192.168.40.6(rw) 	#192.168.40.0/24(rw)

测试;

40.17上创建/mnt/nfs2
mkdir /mnt/nfs2
mount 192.168.40.7:/data/nfs2 /mnt/nfs2/
mount.nfs: access denied by server while mounting 192.168.40.7:/data/nfs2
# 访问被拒绝了,因为只允许40.6挂载

40.6创建/mnt/nfs2目录后挂载正常


实现用户家目录漫游

效果:在哪个设备登录,看到的文件都是相同的

192.168.40.7 客户机
192.168.40.17 NFS服务器

步骤;
1、40.17上创建一个cheng用户,查看其ID
2、编辑修改NFS配置文件

vim  /etc/exports
/home/cheng		192.168.40.0/24(rw,anonuid=1000,anongid=1000,all_squash)

exportfs -r 
exportfs -v

3、40.7挂载

mount 192.168.40.17:/home/cheng	/home/cheng

#永久挂载
vim /etc/fstab
192.168.40.17:/home/cheng	/home/cheng		nfs	defaults	0 0

mount -a

4、此时在40.7的/home/cheng目录中创建文件其实就是在远程NFS服务器中的/home/cheng目录下创建文件,以此实现cheng用户在哪个主机登录看到的文件都是相同的
创建用户时指定挂载的目录!就可以使用!



NFS主从同步https://blog.csdn.net/qq_43058911/article/details/104792394,也很重要的

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值