一、 什么是NFS
网路文件系统(Network File System,NFS)由SUN公司开发, 功能是通过TCP/IP网络让不同的机器 不同的操作系统能够彼此分享数据, 让应用程序在客户端通过网络访问位于服务器磁盘中的数据, 是在Unix系统间实现磁盘文件共享的一种方法.
二、 NFS的优势
2.1 节省本地存储空间, 将常用的数据存放在一台NFS服务器上且可以通过网络络访问, 那么本地终端将可以减少自生身存储空间的使用.
2.2 配置相对简单
三. 工作原理
因为NFS支持的功能相当多, 而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据; 因此NFS的功能所对应的端口才没有固定, 而是采用随机取用一些未被使用的小于724的端口来作为
传输之用; 但如此一来又造成客户端要连接服务器时的困扰, 因为客户端要知道服务器端的相关端口才能够联机, 此时我们需要用到RPC的服务.
RPC最主要的功能就是指定每个NFS功能所对应的端口号, 并且回报给客户端, 让客户端可以连接到正确的端口上. 当服务器在启动NFS时会随机选选数个端口并主动地向RPC注册. 因此RPC可以知道每个端口对应的NFS功
能, 然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口, 所以可以让NFS的启动更为容易. 注意启动NFS之前, 要先启动RPC否则NFS会无法向RPC注册, 另外重新启动RPC时原本注册的数据会不见, 因
此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册.
当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?
1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求.
2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端.
3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机.
四、 NFS服务安装
nfs客户端和服务端都安装nfs-utils包,同时自动安装rpcbind。安装后会创建nfsnobody用户和组,uid和gid都是65534。
4.1 服务端
4.1.1 安装所需的RPM包
[root@localhost ~]# yum -y install nfs-utils rpcbind
4.1.2 创建NFS共享文件夹
[root@localhost ~]# mkdir -p /opt/harbor_disk
[root@localhost ~]# chmod 777 /opt/harbor_disk
4.1.3 修改NFS配置文件
[root@localhost ~]# vim /etc/exports
添加:
/opt/harbor_disk 172.16.70.0/24(rw,sync,no_root_squash)
#参数解析
/opt/harbor_disk 共享目录
172.16.70.0/24 能够访问该共享目录的网段段
rw 读写 ro 只读 sync 同步写 将数据同步写入内存缓冲区与磁盘中 效率低 但可以保证数据的一致性. async 异步写 将数据先保存在内存缓冲区中 必要时才写入磁盘 wdelay 延迟写 root_squash 屏蔽ROOT权限 对共享目录的权限会被压缩为nfsnobody用户的权 no_root_squash 不屏蔽ROOT权限 用户如果是root权限,对共享目录也具有root权限 all_squash 屏蔽所有远程用户权限 不管你访问共享目录的用户是谁, 都必须压缩为nfsnobody用户的权限
1、普通用户 当设置all_squash时:访客时一律被映射为匿名用户(nfsnobody) 当设置no_all_squash时:访客被映射为服务器上相同uid的用户,因此在客户端应建立与服务端uid一致的用户,否则也映射为nfsnobody。root除外,因为root_suqash为默认选项,除非指定了no_root_squash 2、root用户 当设置root_squash时:访客以root用户访问NFS服务端时,被映射为nfsnobody用户 当设置no_root_squash时:访客以root用户访问NFS服务端时,被映射为root用户。以其他用户访问时同样映射为对应uid的用户,因为no_all_squash是默认选项 选项说明 ro:共享目录只读 rw:共享目录可读可写 all_squash:所有访问用户都映射为匿名用户或用户组 no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组 root_squash(默认):将来访的root用户映射为匿名用户或用户组 no_root_squash:来访的root用户保持root帐号权限 anonuid=<UID>:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534) anongid=<GID>:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534) secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器 insecure:允许客户端从大于1024的tcp/ip端口连接服务器 sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性 async:将数据先保存在内存缓冲区中,必要时才写入磁盘 wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率 no_wdelay:若有写操作则立即执行,应与sync配合使用 subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限 no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率 以nfsuser(uid=1000)创建共享目录,参数默认rw 复制代码 # mkdir /var/nfs # chown nfsuser. -R /var/nfs # vim /etc/exports /var/nfs 192.168.1.0/24(rw) # exportfs -r #重载exports配置 # exportfs -v #查看共享参数 /var/nfs 192.168.1.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash) 复制代码 exportfs参数说明 -a 全部挂载或卸载 /etc/exports中的内容 -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录) -v 输出详细的共享参数
4.1.4 启动NFS服务
[root@localhost ~]# systemctl restart rpcbind
[root@localhost ~]# systemctl restart nfs
4.2 客户端
4.2.1 安装NFS客户端工具
[root@harbor-a harbor]# yum install nfs-utils
4.2.2 查看NFS服务端的共享目录
[root@harbor-a harbor]# showmount -e 172.16.70.233
Export list for 172.16.70.233:
/opt/harbor_disk 172.16.70.0/24
4.2.3 挂载共享目录
[root@harbor-a harbor]# mkdir -p /mnt/harbor_disk
4.2.4 修改fstab挂载网络磁盘空间
添加:
172.16.70.233:/opt/harbor_disk /mnt/harbor_disk nfs defaults 0 0
mount -a
4.2.5 查看系统所挂载的磁盘
[root@harbor-a harbor]# df -Th
...
172.16.70.233:/opt/harbor_disk nfs4 18G 1.9G 16G 11% /mnt/harbor_disk ##此为NFS磁盘
五、注意
如果NFS服务器开启了防火墙, 由于NFS默认使用5个端口, 其中有4个端口是动态的, 所以如果服务器和客户端之间有iptables, 就要先把这4个动态端口设置成静态的, 然后加入进防火墙规则里放行流量, 需要修改的端口
有如下四个(端口可以根据需求改, 不一定就和我这一样):
5.1 在NFS服务端修改配置文件, /etc/sysconfig/nfs
RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 #TCP锁使用端端口 LOCKD_UDPPORT=30002 #UDP锁使用端口 MOUNTD_PORT=30003 #挂载使用端口 STATD_PORT=30004 #状态使用端口
5.2 在服务端防火墙上放行以下流量:
[root@file-server ~]# iptables -A INPUT -s x.x.x.0/24 -p tcp –dport 111 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 172.16.70.0/24 -p udp –dport 111 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 172.16.70.0/24 -p tcp –dport 2049 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 172.16.70.0/24 -p udp –dport 2049 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 172.16.70.0/24 -p tcp –dport 30001:30004 -j ACCEPT
[root@file-server ~]# iptables -A INPUT -s 172.16.70.0/24 -p udp –dport 30001:30004 -j ACCEPT
保存规则:
service iptables save
查看可以挂载的目录
[root@file-server ~]# showmount -e localhost
Export list for localhost:
/share 192.168.214.0/24
注:
如要设置NFS共享磁盘可被所有的主机关联挂载, 可在/etc/exports配置文件中进行如下设置:
1. 修改配置文件/opt/nfs_test *(rw,sync,no_root_squash)
2. 刷新NFS配置 exportfs -rv
################以下为外部参考
五、启动服务
# systemctl start rpcbind.service # systemctl enable rpcbind.service # systemctl start nfs.service # systemctl enable nfs.service
启动顺序一定是rpcbind->nfs,否则有可能出现错误
六、Linux客户端挂载
1、直接挂载
# mount -t nfs nfs.st.local:/var/nfs /mnt
也可将挂载配置写入fstab文件中,与普通磁盘挂载一样,挂载时同样可以指定权限,只是类型为nfs。
2、autofs挂载
# yum -y install autofs # vi /etc/auto.master #添加一行 /- /etc/auto.mount # vi /etc/auto.mount #添加一行 /mnt -fstype=nfs,rw nfs.st.local:/var/nfs #启动服务 # systemctl start autofs # systemctl enable autofs
七、故障解决
1、nfs只能挂载为nobody
同时修改服务端、客户端/etc/idmapd.conf中的Domain为一样的值,随后重启rpcidmapd服务,或重启所有服务
2、客户端无法卸载nfs目录
umount.nfs4: /var/nfs: device is busy
执行fuser -km /var/nfs/,然后再执行umount
3、mount: 文件系统类型错误、选项错误、10.0.110.113:/nfs 上有坏超级块、
缺少代码页或助手程序,或其他错误
(对某些文件系统(如 nfs、cifs) 您可能需要
一款 /sbin/mount.<类型> 助手程序)
有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。
解决方法如下:
77 rpcinfo -p
78 rpm -qa |grep nfs-utils
79 yum -y install nfs-utils
80 systemctl start nfs-utils
81 systemctl enable nfs-utils
82 rpcinfo -p
83 mount -t nfs 10.0.110.113:/nfs /home/ddsc/data/
============================================================================================= # 老男孩教育: # # www.oldboyedu.com # # 邮件:miaokm@oldboyedu.com(189 1048 1057) # # 地址:北京市昌平区顺沙路8号院汇德商厦4F # # 资源老师 手机电话: QQ号码 资源老师: 手机电话: QQ号码 # # 飞雪 135 5261 2571 80042789 小雨 186 0046 2391 390320151 # # 歪歪 189 1171 8229 70271111 丹丹 158 1059 0206 41117397 # # 冰冰 150 1078 5220 41117483 # ============================================================================================= 老男孩深圳脱产01-day30-综合架构存储服务 00. 课程介绍部分 1) 存储服务的概念 2) 存储服务的部署(NFS) 3) 存储服务的配置 服务端配置操作 客户端配置操作 4) 存储服务的原理(数据无法存储) 5) 客户端挂载应用 mount -o ro 6) 存储服务企业应用 02. NFS存储服务概念介绍 NFS是Network File System的缩写,中文意思是网络文件共享系统, 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录 存储服务的种类 用于中小型企业: 实现数据共享存储 FTP(文件传输协议) 运维01 服务器A 服务器B FTP服务器 运维02 服务器C 服务器D 中小型电商公司(游戏点卡 游戏币 道具 Q币 充值话费) --- 财务对账信息(数据库) --- 对账文件 --- FTP服务器 权限(用户认证的权限 存储目录的权限(用户)) 获取数据的方式 ??? SSH远程服务 sFTP samba windows--linux之间数据传输 Linux部署samba NFS linux--linux之间数据传输 用于门户网站: 一个用户 -- 存储服务器 上万个用户 -- 存储服务器 利用分布式存储 Moosefs(mfs) 比较落伍,初学学习比较简单 GlusterFS FastDFS 企业应用较多 03. NFS存储服务作用 1) 实现数据的共享存储 2) 编写数据操作管理 3) 节省购买服务器磁盘开销 淘宝--上万 用电开销 04. NFS服务部署流程 RPC: 远程过程调用服务程序--- 相当于租房的中介(网络编程支持) 服务端部署 第一个历程: 下载安装软件 rpm -qa|grep -E "nfs|rpc" yum install -y nfs-utils rpcbind 第二个历程: 编写nfs服务配置文件 vim /etc/exports (man exports) 01 02(03) 01: 设置数据存储的目录 /data 02: 设置网络一个白名单 (允许哪些主机连接到存储服务器进行数据存储) 03: 配置存储目录的权限信息 存储目录一些功能 /data 172.16.1.0/24(rw,sync) 第三个历程: 创建一个存储目录 mkdir /data chown nfsnobody.nfsnobody /data 第四个历程: 启动服务程序 先启动 rpc服务 systemctl start rpcbind.service systemctl enable rpcbind.service 再启动 nfs服务 systemctl start nfs systemctl enable nfs 客户端部署 第一个历程: 安装nfs服务软件 yum install -y nfs-utils 第二个历程: 实现远程挂载共享目录 mount -t nfs 172.16.1.31:/data /mnt 05. NFS服务工作原理: 服务端: 1. 启动rpc服务,开启111端口 2. 启动nfs服务 3. 实现nfs服务进程和端口好的注册 补充: 检查nfs服务进程与端口注册信息 没有注册时候: [root@nfs01 ~]# rpcinfo -p 172.16.1.31 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 nfs服务注册之后信息: [root@nfs01 ~]# rpcinfo -p 172.16.1.31 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 53997 status 100024 1 tcp 49863 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 客户端: 1. 建立TCP网络连接 2. 客户端执行挂载命令,进行远程挂载 3. 可以实现数据远程传输存储 06. nfs服务端详细配置说明 实现多个网段主机可以进行挂载 第一种方法: /data 172.16.1.0/24(rw,sync) 10.0.0.0/24(rw,sync) 第二种方法: /data 172.16.1.0/24(rw,sync) /data 10.0.0.0/24(rw,sync) 总结:共享目录的权限和哪些因素有关: 1)和存储目录的本身权限有关 (755 属主:nfsnobody) 2)和配置文件中的权限配置有关 rw/ro xxx_squash anonuid/anongid 3)和客户端挂载命令的参数有关 ro ?? NFS配置参数权限 rw -- 存储目录是否有读写权限 ro -- 存储目录是否时只读权限 sync -- 同步方式存储数据 直接将数据保存到磁盘(数据存储安全) async -- 异步方式存储数据 直接将数据保存到内存(提高数据存储效率) no_root_squash -- 不要将root用户身份进行转换 root_squash -- 将root用户身份进行转换 all_squash -- 将所有用户身份都进行转换 no_all_squash -- 不要将普通用户身份进行转换 操作演示all_squash参数功能: vim /etc/exports /data 172.16.1.0/24(ro,sync,all_squash) [oldboy@backup mnt]$ touch oldboy_data.txt [oldboy@backup mnt]$ ll total 4 -rw-rw-r-- 1 nfsnobody nfsnobody 0 May 9 12:11 oldboy_data.txt 操作演示no_all_squash参数功能: [root@nfs01 ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,no_all_squash) [oldboy@backup mnt]$ touch oldboy_data02.txt touch: cannot touch ‘oldboy_data02.txt’: Permission denied 解决权限问题: [root@nfs01 ~]# chmod o+w /data/ [root@nfs01 ~]# ll /data/ -d drwxr-xrwx. 2 nfsnobody nfsnobody 52 May 9 12:11 /data/ [oldboy@backup mnt]$ touch oldboy_data02.txt [oldboy@backup mnt]$ ll total 4 -rw-r--r-- 1 nfsnobody nfsnobody 7 May 9 10:57 backup_data.txt -rw-rw-r-- 1 oldboy oldboy 0 May 9 12:17 oldboy_data02.txt -rw-rw-r-- 1 nfsnobody nfsnobody 0 May 9 12:11 oldboy_data.txt 操作演示root_squash参数功能: vim /etc/exports /data 172.16.1.0/24(rw,sync,root_squash) [root@backup mnt]# touch root_data.txt [root@backup mnt]# ll -rw-r--r-- 1 nfsnobody nfsnobody 0 May 9 12:20 root_data.txt 操作演示no_root_squash参数功能 [root@backup mnt]# ll total 4 -rw-r--r-- 1 root root 0 May 9 12:23 root_data02.txt 企业互联网公司如何配置NFS 各种squash参数 保证网站存储服务器用户数据安全性: no_all_squash 需要进行配置 共享目录权限为www(确保客户端用户 服务端用户 uid数值一致) root_squash 需要进行配置 root---nfsnobody data目录---www 以上默认配置(很多服务默认配置都是从安全角度出发) 如何查看nfs默认配置 cat /var/lib/nfs/etab --- 记录nfs服务的默认配置记录信息 /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,n o_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash) 如何让root用户可以操作管理www用户管理的data目录 root --- root_squash --- www ---操作--- data目录 anonuid=65534,anongid=65534 --- 可以指定映射的用户信息 修改映射用户:www=1002 /data 172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002) 企业中如何编辑nfs配置文件 01. 通用方法 ***** /data 172.16.1.0/24(rw,sync) 02. 特殊情况 (让部分人员不能操作存储目录 可以看目录中的数据) /data 10.0.0.0/24(ro,sync) 03. 修改默认的匿名用户 /data 10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx) nfs服务问题: 01. nfs服务器重启,挂载后创建数据比较慢 服务器重启方式不正确 服务重启: 01. restart 重启服务 强制断开所有连接 用户感受不好 02. reload 重启服务(平滑重启) 强制断开没有数据传输的连接 提升用户感受 07. nfs客户端详细配置说明 mount -t nfs 172.16.1.31:/data /mnt 如何实现自动挂载: 01. 利用rc.local echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local 02. 利用fstab文件 vim /etc/fstab 172.16.1.31:/data /mnt nfs defaults 0 0 特殊的服务已经开启了 centos6:无法实现网路存储服务自动挂载原因 根据系统服务启动顺序 按照顺序依次启动 network服务--- sshd服务--- crond服务--- rsync服务--- rpcbind服务--- nfs服务 先加载/etc/fstab --- network服务 --- autofs服务 autofs服务程序:开机自动启动 服务启动好之后,重新加载fstab centos7:无法实现网路存储服务自动挂载原因 根据系统服务启动顺序 network服务 sshd服务 crond服务 rsync服务 先加载/etc/fstab network服务 autofs==centos7?? 客户端mount命令参数 rw --- 实现挂载后挂载点目录可读可写 (默认) ro --- 实现挂载后挂载点目录可读可写 suid --- 在共享目录中可以让setuid权限位生效 (默认) nosuid --- 在共享目录中可以让setuid权限位失效 提供共享目录的安全性 exec --- 共享目录中的执行文件可以直接执行 noexec --- 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性 auto --- 可以实现自动挂载 mount -a 实现加载fstab文件自动挂载 noauto --- 不可以实现自动挂载 nouser --- 禁止普通用户可以卸载挂载点 user --- 允许普通用户可以卸载挂载点 [oldboy@web01 ~]$ umount /mnt umount: /mnt: umount failed: Operation not permitted 客户端如何卸载 umount -lf /mnt --- 强制卸载挂载点 -l 不退出挂载点目录进行卸载 -f 强制进行卸载操作 08. 课程总结: 1)NFS存储服务器概念 2)NFS存储工作原理图 3)NFS存储服务部署 4)NFS服务端详细配置说明 服务端配置参数 xxx_squash 5) NFS客户端详细配置说明 如何实现自动挂载 客户端挂载参数说明 man mount 如何强制卸载共享目录 作业: 01. 实现fatab文件自动挂载的特殊服务是什么? 02. 研究user参数作用 03. NFS服务部署过程 实时同步服务 SSH远程服务