一、目标 通过几个实例展示:
1.两台web服务器共用一个nfs共享文件夹,nfs文件夹充当web服务器存放静态资源的文件服务器。两台web服务器使用root身份均可以实现对文件夹读写。
2.两台web服务器共用一个nfs共享文件夹,nfs文件夹充当web服务器存放静态资源的文件服务器。两台web服务器使用非root身份均可以实现对文件夹读写。
3.自动挂载的使用
二、引言 NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。
三、准备工作 服务器名 ip os和主要软件 用途
nfs10 192.168.73.10 centos7.6+nfs-utils nfs服务端 nfs11 192.168.73.11 centos7.6+nfs-utils web服务器1 nfs12 192.168.73.12 centos7.6+nfs-utils web服务器2
1.所有主机上都安装nfs
yum install nfs-* -y
四、实例1:多台web服务器以root身份实现动静分离,映射nfs共享文件夹充当所有web服务器的静态资源存储池 1.[服务器端]新建一个共享文件夹,用于存放所有web服务器的静态文件
mkdir /data/nfs -p 2.[服务器端]填写nfs配置文件,以共享资源
cat > /etc/exports <<EOF /data/nfs 192.168.73.0/24(rw) EOF 啰嗦:这相当于建立一个共享文件夹叫/data/nfs,允许 192.168.73.0/24的主机(可读写)
3.[服务器端]给共享文件夹/data/nfs附加权限(让客户端主机能写)
setfacl -m u:nfsnobody:rwx /data/nfs 为啥要这样做?看最下面的注释。
4.(可略)[服务器端]查看本机的共享资源和共享策略
[root@nfs10 ~]# exportfs -v #/data/nfs #192.168.73.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,no_all_squash) 啰嗦:执行命令后,可以看出来共享了哪些资源,以及策略,策略会写的非常详细。
5.[服务器端]重启nfs服务
systemctl restart nfs-server 6.[客户端(即web1和web2下都称客户端)]查看nfs服务器共享了哪些资源
showmount -e 192.168.73.10 啰嗦:192.168.73.10指的是nfs服务器的ip
7.[客户端]新建文件夹用于挂载NFS共享文件夹
mkdir /mnt/hiibm.com 8.[客户端]挂载nfs共享文件夹到本地/mnt/hiibm.com上(两种挂载方式二选一)
● 临时挂载
mount 192.168.73.10:/data/nfs /mnt/hiibm.com/ ● 永久挂载
#1.修改系统挂载配置文件,写上一行挂载内容 vim /etc/fstab 192.168.73.10:/data/nfs /mnt/hiibm.com/ nfs _netdev 0 0
#2.挂载所有 mount -a
#3.查看挂载情况(可略) df -hT ● (可略-扩展)取消临时挂载
umount /mnt/hiibm.com/ 9.[客户端]测试是否可以读写文件
#分别在两台web服务器上测试写文件到挂载点。 [root@nfs11 ~]# echo "a11-1" >/mnt/hiibm.com/a11-1.txt [root@nfs12 ~]# echo "a12-1" > /mnt/hiibm.com/a12-1.txt 啰嗦:证明是没问题的,两台客户端web服务器均能往nfs共享文件夹中读写文件。
10.(可略)[服务器端]查看客户端上传来的文件,以及属性
啰嗦:为啥在nfs服务器端看到的文件所属都是nfsnobody?而不是root?简单的说下,因为/etc/exports默认会压缩客户端的root权限为nfsnobody,这是出于安全考虑。
五、实例2:多台web服务器使用非root身份读写文件到NFS共享文件夹,实现动静分离 本例的目的是,让web服务器所写的文件的所属者均是web服务器的运行web服务的用户(说白点,比如web服务器通常使用的是nginx,那么运行nginx的用户是nginx或叫自己建的xnginx,那当xnginx接收用户上传来的文件时,写到nfs共享文件夹后,文件的所属者就是nginx或xnginx,而非root)
1.[所有主机]建个运行nginx的用户xnginx,并指定用户id
useradd -u 3721 xnginx 啰嗦:新建系统用户xnginx,指定用户id是3721。(为啥要指定id?因为怕各主机用户产生的id不同,导致在nfs上的文件属性上显示不出用户)
2.[服务器]新建存放web静态文件的nfs共享文件夹
mkdir /data/nfsweb/a.com -p 3.[服务器]填写nfs配置文件,以共享资源
vim /etc/exports #添加下面的配置信息,以共享出web静态文件夹 /data/nfsweb/a.com 192.168.73.0/24(rw) 4.(可略)[服务器]查看nfs服务器的共享策略(着重看倒数倒数2-3行)
[root@nfs10 a.com]# exportfs -v /data/nfs 192.168.73.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) /data/nfsweb/a.com 192.168.73.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) 5.[服务器]给nfs服务器上的共享文件夹赋目标用户xnginx的写权限
setfacl -m u:xnginx:rwx /data/nfsweb/a.com 6.(可略-扩展)[服务器]查看nfs服务器上的共享文件夹的facl扩展权限
[root@nfs10 a.com]# getfacl /data/nfsweb/a.com/ getfacl: Removing leading '/' from absolute path names
file: data/nfsweb/a.com/
owner: root
group: root
user::rwx user:xnginx:rwx user:nfsnobody:rwx group::r-x mask::rwx other::r-x 7.(必略-扩展)[服务器]删除掉xnginx用户对指定的nfs共享文件夹权限
setfacl -x u:xnginx /data/nfsweb/a.com/ 8.[服务器端]重启nfs服务
systemctl restart nfs-server 9.[客户端]使用root身份创建挂载点文件夹
mkdir -p /data/web/a.com chown xnginx:xnginx /data/web/a.com 10.[客户端]使用root身份挂载nfs刚刚共享的文件夹/data/nfsweb/a.com/到本地的/data/web/a.com(两种挂载方式二选一)
● 临时挂载
mount 192.168.73.10:/data/nfsweb/a.com /data/web/a.com/ ● 永久挂载
#1.修改系统挂载配置文件,写上一行挂载内容 vim /etc/fstab 192.168.73.10:/data/nfsweb/a.com /data/web/a.com nfs _netdev 0 0
#2.挂载所有 mount -a
#3.查看挂载情况(可略) df -hT 11.[客户端]客户端切换身份到运行nginx的用户xnginx上,并写文件到挂载点
su - xnginx echo "xnginx1-1" > /data/web/a.com/xnginx1-1.txt ll /data/web/a.com/ 12.(可略)[服务器]查看nfs共享文件夹里的从客户端写过来的文件的属性
[root@nfs10 a.com]# ll /data/nfsweb/a.com/ total 20 -rw-r--r--. 1 nfsnobody nfsnobody 9 Jul 8 15:50 a.com1-1.txt -rw-rw-r--. 1 xnginx xnginx 9 Jul 8 15:51 a.com1-2.txt -rw-r--r--. 1 nfsnobody nfsnobody 7 Jul 8 15:48 a.com1.txt -rw-rw-r--. 1 x1 x1 5 Jul 8 16:30 x1-1.txt -rw-rw-r--. 1 xnginx xnginx 10 Jul 8 16:43 xnginx1-1.txt ----->身份已经不是nfsnobody了
六、(扩展)自动挂载 ■ 自动挂载的相对路径法 接着上面的nfs服务,在客户端实现自动挂载nfs共享文件夹 重启服务systemctl restart autofs
客户端-修改自动挂载配置文件 vim /etc/auto.misc 在【cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom】那行下面添加以下一行内容: xnfs -fstype=nfs 192.168.73.6:/data/web
修改完/etc/auto.misc后,无需重启autofs服务,因为我们修改的是它的子配置文件
客户端-查看一下是否自动出现了/disc目录 [root@web1 ~]# ls /misc/ [root@web1 ~]# ----------->看不到有任何目录,这是正常的,只有你使用的时候才会被自动挂载 [root@web1 ~]# cd /misc/xnfs ----------->直接进目标文件夹,发现竟然能进得去, [root@web1 xnfs]# ls ----------->再看下这个被自动挂载的目录xnfs文件夹下是否有nfs服务器上共享出来的东西,竟然真有 a71.txt a72.txt a7.txt aaa.txt haha.txt [root@web1 xnfs]# echo "automount11111" >/misc/xnfs/xautomount.txt ----------->完全可以写文件到被自动挂载的文件夹 [root@web1 xnfs]# ls a71.txt a72.txt a7.txt aaa.txt haha.txt xautomount.txt
小结:使用自动挂载时,父目录/misc文件夹是无需手工创建的,被访问的子目录目标目录也是无需手工创建的,因为我们把文件夹名写在了autofs的子配置文件了,它会自动创建
-------------------分割线----------------------------------
■ 自动挂载的相对路径法再举例
客户端-修改自动挂载的主配置文件 vim /etc/auto.master 在【/misc /etc/auto.misc】的下面添加一行配置信息 /xdata /etc/auto.xdata
新建子自动挂载配置文件/etc/auto.xdata vim /etc/auto.xdata 在配置文件中写上下面这一行配置信息(重新做的时候讲xdata改成xkahn) xdata -type=nfs 192.168.73.6:/data/web
客户端-重启自动挂载服务 systemctl restart autofs 客户端-查看数据 [root@web1 xdata]# pwd /xdata/xdata [root@web1 xdata]#ls /xdata/xdata/ (重新做的时候将最后的xdata改成xkahn) a71.txt a72.txt a7.txt aaa.txt haha.txt xautomount.txt
-------------------分割线---------------------------------- ■ 自动挂载的绝对路径
客户端-修改自动挂载的主配置文件 vim /etc/auto.master 在【/misc /etc/auto.misc】的下面添加一行配置信息 /- /etc/auto.xkahn
客户端-创建autofs的子配置文件/etc/auto.xkahn vim /etc/auto.xkahn /xdata -type=nfs 192.168.73.6:/data/web
客户端-重启自动挂载服务 [root@web1 xdata]# systemctl restart autofs 客户端-查看是否自动挂载了 [root@web1 xdata]# ls /xdata a71.txt a72.txt a7.txt aaa.txt haha.txt xautomount.txt 客户端-检验是否能写操作 [root@web1 xdata]# echo "chaojifeixia" > /xdata/chaojifeixia.txt [root@web1 xdata]# ls a71.txt a72.txt a7.txt aaa.txt chaojifeixia.txt haha.txt xautomount.txt [root@web1 xdata]#
七、应知应会的扩展知识 1.如果想简单粗暴的共享nfs,不建议这么做,太不安全 ● [服务器]可以在写/etc/exports时只写个如【/data/web *(rw)】; ● 给共享文件夹/data/web赋予777权限,如【chmod 777 /data/web】 ● [服务器]重启nfs服务 ● [客户端]客户端建挂载点文件夹、挂载共享文件夹、使用共享文件夹(具体步骤略) ● [客户端]客户端往挂载点里写点东西(可随意切换身份,但必须用户对挂载点有写权限) ● [服务器]服务器端使用ll /data/web命令检查客户端传上来的文件所属者,发现客户端用什么身份写的文件,在nfs服务器端看到的就是什么用户写的文件。
2.服务器端使用exportfs -v看到的部分策略的解释
#如下展示 [root@xserver ~]# exportfs -v /data/web (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) ● /data/web ----->代表的共享的文件夹的绝对路径 ● ----->代表*,代表所有主机,该位置可以写成网段192.168.66.0/24 ●sync -->代表同步写入磁盘,性能低,不丢数据。另外对应参数是async代表异步写入磁盘,性能高,断电时可能丢数据。 ●rw ----->代表读写权限。与之对称的是ro只读权限 ●root_squash --->代表客户端若用root身份写文件后,在nfs上自动压榨成nfsnobody用户。与之对称的是no_root_squash ●no_all_squash --->代表不压缩所有用户。与之对称的是all_squash
3.NFS共享策略的举例(/etc/exports的写法)
/data/web *(rw,no_root_squash) 不压榨root,不压榨任何用户 /data/web *(rw,root_squash,no_all_squash) 只压榨root,不压榨其他用户 /data/web *(rw,no_root_squash,all_squash) 压榨所有用户 /data/web *(rw,anonuid=1001,anongid=1001,no_root_squash,all_squash) 压榨所有用户成本nfs服务器上的id为1001的用户,组为1001的组 /data/web *(ro) 192.168.73.7(rw) 除了192.168.73.7主机是可写,其余主机都是只读 /data/web *(ro) 192.168.73.0/24(rw) 192.168.73.7(ro) 73.0/24是可写的,但73.7主机是只读的,剩余其他主机默认都是只读的 4.在nfs服务器上给文件夹赋予facl权限的时候,centos7赋予的是nfsnobody,而centos8的是nobody
5.客户端NFS挂载 NFS相关的挂载选项: man 5 nfs ● fg (默认)前台挂载 ● bg后台挂载 ● hard (默认)持续请求 ● soft 非持续请求 ● intr 和hard配合,请求可中断 ● rsize和wsize -次读和写数据最大字节数,rsize=32768 ● _netdev无网络不挂载,即网络不健康的时候就不挂载 提示:基于安全考虑,建议使用nosuid,nodev,noexec挂载选项
范例:临时挂载NFS共享
mount -o rw,nosuid,fg,hard,intr 192.168.0.1/testdir /mnt/nfs/
范例:开机挂载(测试前先把之前的临时挂载给取消掉umount /mnt/nfsread)
vim /etc/fstab
192.168.73.6:/data/web /mnt/nfsread/ nfs _netdev 0 0
mount -a
df -hT
八、总结 1.centos7上的nfs共享的文件夹,默认来访者都是nfsnobody,centos8的来访者默认都是nobody
2.nfs共享出来的文件夹必须修改文件夹权限,否则客户端是无法写的,必须给相应的用户设置权限。
3.确保安全的情况下,可以粗暴的使用chmod 777对nfs服务器端的共享文件夹赋予权限,这是最快最方便的,但不推荐。
4.若不用777修改文件夹权限,可以使用setfacl的方式给用户远程客户端的用户赋权限。
5.使用nfs建议全网建用户的时候都指定同样的用户id,同样的用户名,然后在nfs给用户再赋予写权限到共享文件夹。
6.nfs共享策略中sync代表同步写数据到磁盘,这样最高保证数据不丢,但效率低。async是异步写入数据,先放到缓存中,等到合适的时间才把数据写到磁盘,这样效率高,但当nfs服务器当机或意外重启时可能会丢失一些缓存中的最新数据。
测试非常顺利。
------------------------------------END---------------------2020年7月9日----------------------------