NFS 服务

NFS服务

课程目标

  • 了解NFS服务器的应用场景及特点
  • 掌握NFS服务器实现读/写文件共享
  • 掌握NFS Client访问及挂载

一、NFS服务介绍

NFS(Network File System)网络文件系统

  • 主要用于Linux系统上实现文件共享的一种协议,其客户端主要是Linux
  • 没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用
  • 支持多节点同时挂载及并发写入

企业应用:为集群中的web server提供后端存储

该服务包括的组件:

RPC(Remote Procedure Protocol):

远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。

rpcbind // 负责NFS的数据传输,远程过程调用 tcp协议 端口111

nfs-utils // 控制共享哪些文件,权限管理


二、NFS服务器搭建

[root@server ~]# rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64
[root@server ~]# rpm -qa |grep ^nfs
nfs-utils-1.2.3-39.el6.x86_64   // nfs服务的一个脚本控制工具(服务端与客户端)
nfs-utils-lib-1.1.5-6.el6.x86_64    // nfs库文件
nfs4-acl-tools-0.3.3-6.el6.x86_64   // acl工具包
/etc/exports    man 5 exports

共享目录        共享选项
/share/nfs      *(ro,sync)
共享主机:
* :代表所有主机
192.168.0.0/24:代表共享给某个网段
192.168.0.0/24(rw) 192.168.1.0/24(ro):代表共享给不同网段
192.168.0.254:共享给某个IP
*.itcast.com:代表共享给某个域下的所有主机
共享选项:
ro:只读
rw:读写
sync:实时同步,直接写入磁盘
async:异步,先缓存在内存再同步磁盘
anonuid:设置服务nfs服务的用户的uid,uid需要在/etc/passwd中存在
anongid:设置服务nfs服务的用户的gid
root_squash:默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人server端是它自己,client端是nobody。
no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。
all_squash:不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody

nfs服务端的用户会影响客户端访问。
在文件系统中,区别用户看UID。
no_root_squash,客户端创建了一个文件,在nfs服务端没有对应的用户,那么显示属主的时候显示和客户端文件创建者UID相同的用户为属主。

需求1:共享本地/share/nfs目录给所有人,以读写方式共享

1、mkdir /share/nfs -p
2.vim /etc/exports
/share/nfs  *(rw)
3.启动服务
[root@server ~]# service rpcbind restart
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[root@server ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@server ~]# netstat -nltp|grep rpcbind
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      4428/rpcbind        
tcp        0      0 :::111                      :::*                        LISTEN      4428/rpcbind  

4.客户端测试
[root@client ~]# mkdir /u01
[root@client ~]# mount.nfs 10.1.1.2:/share/nfs /u01     // 挂载到本地/u01
[root@client ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda5             16G  3.7G   12G  25% /
tmpfs                491M   72K  491M   1% /dev/shm
/dev/sda1            194M   30M  155M  16% /boot
/dev/sda3            2.0G   37M  1.8G   2% /home
/dev/sr0             4.2G  4.2G     0 100% /media
10.1.1.2:/share/nfs   16G  3.8G   12G  26% /u01

测试写入
[root@client ~]# cd /u01
[root@client u01]# ls
file1  file2  file3  file4  file5
[root@client u01]# touch file6
touch: cannot touch `file6': Permission denied      // 目录权限拒绝
原因:server端的共享目录权限不够
解决:[root@server ~]# chmod o+w /share/nfs
重新测试,touch file6,在server端ls /share/nfs 显示如下
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 23:04 file6

练习:

1.搭建一个NFS 服务,将本机的/share/nfs 目录共享给192.168.91.0/24网段(以读写方式)和10.1.1.2,10.1.1.3主机(以只读方式)
server端:
1. mkdir /share/nfs
2. vim /etc/exports
/share/nfs  192.168.91.0/24(rw) 10.1.1.2(ro) 10.1.1.3(ro)

client端
1. 创建一个空目录作挂载点 /u01
2. mount.nfs 10.1.1.2:/share/nfs /u01或者
mount -t nfs 10.1.1.2:/share/nfs /u01

示例1:NFS自动挂载目录

首先:
1. A主机上:
需要创建相应的用户user1~3, eg:user1 --> /user1(挂载点)
2. B主机上:
搭建nfs服务,将/share/nfs共享出来
3. A主机上:
挂载B主机上的共享目录到指定挂载点上
测试验证:
在A主机进行

环境:ftp-server:10.1.1.2  (主机名是server,临时作为ftp-server搭建nfs共享目录的挂载点)
nfs-server:10.1.1.3 (主机名是client,临时修改hostname为此)
client:10.1.1.4 (主机名是web2,临时作为客户端测试验证)

第一步.ftp-server:
创建用户并且指定用户家目录
[root@server ~]# useradd -d /rhome/user01 -M user01
[root@server ~]# useradd -d /rhome/user02 -M user02
[root@server ~]# useradd -d /rhome/user03 -M user03
这些用户不能直接登录ftp,没有家目录
[root@server ~]# echo 123|passwd --stdin user01
Changing password for user user01.
passwd: all authentication tokens updated successfully.
[root@server ~]# echo 123|passwd --stdin user02
Changing password for user user02.
passwd: all authentication tokens updated successfully.
[root@server ~]# echo 123|passwd --stdin user03
Changing password for user user03.
passwd: all authentication tokens updated successfully.

第二步.nfs-server
搭建一个nfs服务,共享目录/data
[root@client ~]# mount /dev/sdb /data
[root@client ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5        16G  3.7G   12G  25% /
tmpfs           491M   72K  491M   1% /dev/shm
/dev/sda1       194M   30M  155M  16% /boot
/dev/sda3       2.0G   37M  1.8G   2% /home
/dev/sr0        4.2G  4.2G     0 100% /media
/dev/sdb        9.9G  151M  9.2G   2% /data     //提前准备一块空间来测试
[root@client ~]# cat /etc/exports 
/data   10.1.1.2(rw)
[root@client ~]# service nfs start
[root@client ~]# mkdir /data/user0{1..3}


第三步. ftp-server
[root@server ~]# mkdir /rhome/user0{1..3}
[root@server ~]# mount.nfs 10.1.1.3:/data/user01 /rhome/user01
[root@server ~]# df -h
10.1.1.3:/data/user01  9.9G  151M  9.2G   2% /rhome/user01


测试验证:
[root@web2 ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): user01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,1,1,2,47,71).
150 Here comes the directory listing.
226 Directory send OK.
ftp> 
此时目录里面是空,现在到nfs-server的/data/user01里面创建一个文件
[root@client user01]# echo hello world > file1
[root@client user01]# ll
total 4
-rw-r--r-- 1 root root 12 Apr 23 15:13 file1
再到客户端去查看
ftp> ls
227 Entering Passive Mode (10,1,1,2,21,40).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              12 Apr 23 07:13 file1
226 Directory send OK.
出现file1文件
到ftp-server端查看
[root@server ~]# ls /rhome/user01
file1
[root@server ~]# su - user01
-bash-4.1$ ls
file1
-bash-4.1$ pwd
/rhome/user01
-bash-4.1$ touch file2
touch: cannot touch `file2': Permission denied      // 没有权限
说明:正常情况下,user01只能访问ftp服务器,但是不能上传文件,原因是nfs-sercer的共享目录没有权限

[root@client user01]# ll -d /data/user01            //查看共享存储,对其他人没有写权限
drwxr-xr-x 2 root root 4096 Apr 23 15:13 /data/user01
此时修改/data的权限,(高级权限o+t,加一个粘滞位,一般作用在公共目录上,777,加上后只允许root和文件创建者可以删除,其他人不可以删除不属于自己的文件),再到ftp-server端测试

[root@client user01]# ll -d /data/user01
drwxr-xr-x 2 root root 4096 Apr 23 15:13 /data/user01
[root@client user01]# chmod 1777 /data/ -R
发现能够创建文件
-bash-4.1$ touch file2
-bash-4.1$ 

再去客户端web2测试,发现可以上传文件,文件存在共享存储/data/user01中
ftp> put install.log
local: install.log remote: install.log
227 Entering Passive Mode (10,1,1,2,73,8).
150 Ok to send data.
226 Transfer complete.
51880 bytes sent in 0.0601 secs (863.54 Kbytes/sec)

[root@client user01]# ll
total 56
-rwxrwxrwt 1 root root    12 Apr 23 15:13 file1
-rw-rw-r-- 1  503  503     0 Apr 23 15:25 file2
-rw-r--r-- 1  503  503 51880 Apr 23 15:28 install.log

自始至终,客户端上传文件都是在共享目录中进行的,解决了由于ftp-server空间不够无法服务的情况。

家不完整怎么解决?
创建一个用户后,默认系统会将以下隐藏文件拷贝到家目录,所以第一个猜测是,家不完整的时候,手动拷贝就能解决。
[root@server ~]# ls -a /etc/skel/.
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla
[root@server ~]# cp /etc/skel/. /rhome/user01

拷贝之后会报无权操作错误,但是去nfs-server的共享目录里查看,发现已经有了这些文件,但是返回ftp-server端切换user01还是会报权限拒绝,第二个猜测是因为用root进行cp,隐藏文件权限600,此时在nfs-server端的共享目录给所有隐藏文件修改权限chmod 777 .,在ftp-server切换user01还是不行,第三个猜测大概是属主、属组的问题。

cd /etc/skel --> cp -a .bash* /data/uu1

方式2实现:
ftp-server:10.1.1.2
nfs-server:10.1.1.3
client:10.1.1.4
步骤:
第一步:
ftp-server端:
创建用户
useradd uu1     --> /home/uu1
useradd uu2     --> /home/uu2

nfs-server端:
在data目录里给用户创建相应的目录
mkdir /data/uu1
mkdir /data/uu2
给共享目录设置相应权限
chmod 1777 /data -R
发布共享目录
vim /etc/exports
/data   10.1.1.2(rw)
重启服务
service nfs restart

ftp-server端:
uu1用户为例,挂载
mount.nfs 10.1.1.3:/data/uu1 /home/uu1
这样uu1用户上传文件就到了/data/uu1里面,实现目的



示例2:实现web集群后端存储

NFS-SERVER端:共享目录,并且创建一个首页文件
1. mkdir /share/web -p
2. echo "hello world" > /share/web/index.html
3. vim /etc/exports
/share/web  10.1.1.0/24(ro)
4. 重启服务(nfs)
service nfs restart
或者
exportfs -rv

WEB1和WEB2服务端:必须先关闭防火墙iptables和selinux
1. 安装httpd软件
2. 挂载nfs-server端的共享目录到/var/www/html
mount.nfs 10.1.1.2:/share/web /var/www/html
3. 启动服务
service httpd start

web1测试验证:
(此处client为web1,IP为10.1.1.3,web2为10.1.1.4)
[root@client ~]# 
[root@client ~]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
[root@client ~]# ls /var/www/html
[root@client ~]# mount -t nfs 10.1.1.2:/share/web /var/www/html
[root@client ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda5             16G  3.7G   12G  25% /
tmpfs                491M   72K  491M   1% /dev/shm
/dev/sda1            194M   30M  155M  16% /boot
/dev/sda3            2.0G   37M  1.8G   2% /home
/dev/sr0             4.2G  4.2G     0 100% /media
10.1.1.2:/share/web   16G  3.8G   12G  26% /var/www/html
[root@client ~]# ls /var/www/html
index.html
[root@client ~]# service httpd start
Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory                         [FAILED]

纠错:
[root@client ~]# setenforce 0
[root@client ~]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.1.3 for ServerName
                                                          [  OK  ]

web2测试验证
[root@web2 ~]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
[root@web2 ~]# ls /var/www/html
[root@web2 ~]# mount.nfs 10.1.1.2:/share/web /var/www/html
[root@web2 ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda5             16G  3.7G   12G  25% /
tmpfs                491M   72K  491M   1% /dev/shm
/dev/sda1            194M   30M  155M  16% /boot
/dev/sda3            2.0G   37M  1.8G   2% /home
/dev/sr0             4.2G  4.2G     0 100% /media/CentOS_6.5_Final
10.1.1.2:/share/web   16G  3.8G   12G  26% /var/www/html
[root@web2 ~]# ls /var/www/html/
index.html
[root@web2 ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for web2
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                  [  OK  ]

Windows:
IE:
http://10.1.1.3/
http://10.1.1.4/

猜你喜欢

转载自www.cnblogs.com/liuwei-xd/p/11022111.html