本文简单搭建 NFS 与 Backup 服务器

=====================================================

环境:

CentOS6.8-x86_64  2.6.32-642.el6.x86_64 

系统为最小化安装,也做了基础优化。


NFS:

IP 192.168.0.81/24  eth0

Backup:

IP 192.168.0.82/24  eth0

安装测试用这两台机器互动。

=====================================================


1.NFS服务


  1.1 服务简介

        NFS(network file system)网络文件系统,NFS服务提供小型网络文件共享服务。

        生产场景中用来存储用户上传的共享视频、图片、头像、附件等静态文件。


  1.2 工作原理

      首先服务端启动 rpcbind 服务,之后启动 NFS 服务,NFS服务启动时会向 rpcbind 服务注册端口;

      客户端 只启动 rpcbind 服务,用于跟服务端的 rpcbind 服务沟通;

      当客户端进行数据操作时,本地 rpcbind 服务会连接服务端的 rpcbind 获取 NFS 注册的可用端口,拿到端口后客户端就直接与服务端的 NFS 服务进行数据传输。


  1.3 配置参数、权限分析、相关命令(摘自网络)

    1.3.1 NFS配置的3类选项

  a. 访问权限选项:

设置输出目录只读:ro

设置输出目录读写:rw


  b. 用户映射选项:

all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);

no_all_squash:与all_squash取反(默认设置);

root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);

no_root_squash:与rootsquash取反;

anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);

anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);


   c. 其它选项:

secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);

insecure:允许客户端从大于1024的tcp/ip端口连接服务器;

sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;

async:将数据先保存在内存缓冲区中,必要时才写入磁盘;

wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);

no_wdelay:若有写操作则立即执行,应与sync配合使用;

subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);

no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;


    1.3.2 权限的分析

  1) 客户端连接时候,对普通用户的检查


    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;


    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;


    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;


  2.)客户端连接的时候,对root的检查


    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;


    b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;


    c. 如果没有明确指定,此时root用户被压缩为nfsnobody;


    d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;


    1.3.3 相关命令

1、exportfs


如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:


  # exportfs [-aruv]


  -a 全部挂载或卸载 /etc/exports中的内容 

  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab

  -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)

  -v 在export的时候,将详细的信息输出到屏幕上。


具体例子: 

  # exportfs -au 卸载所有共享目录

  # exportfs -rv 重新共享所有目录并输出详细信息


2、nfsstat


查看NFS的运行状态,对于调整NFS的运行有很大帮助。


3、rpcinfo

查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。


4、showmount


  -a 显示已经于客户端连接上的目录信息

  -e IP或者hostname 显示此IP地址分享出来的目录


5、netstat


可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。


最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。


NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)


 1.4 服务安装配置

[root@NFS-server ~]# yum install nfs-utils rpcbind -y

[root@Backup-server ~]# yum install nfs-utils rpcbind -y      # 服务端客户端都装


[root@NFS-server ~]# vim /etc/exports        # 编辑配置文件,6.6 的好像没有这个文件的

/data      192.168.0.0/24(rw,sync,all_squash)


[root@NFS-server ~]# mkdir /data              # 创建共享挂载目录及改权限

[root@NFS-server ~]# chown -R nfsnobody:nfsnobody /data/


[root@NFS-server ~]# /etc/init.d/rpcbind start     # 必须先启动 rpcbind

Starting rpcbind:                                          [  OK  ]

[root@NFS-server ~]# /etc/init.d/nfs start             # 再启动 nfs

Starting NFS services:                                     [  OK  ]

Starting NFS quotas:                                       [  OK  ]

Starting NFS mountd:                                       [  OK  ]

Starting NFS daemon:                                       [  OK  ]

Starting RPC idmapd:                                       [  OK  ]


[root@NFS-server ~]# rpcinfo -p localhost       # 看到以下信息说明端口注册成功

   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

    100011    1   udp    875  rquotad

    100011    2   udp    875  rquotad

    100011    1   tcp    875  rquotad

    100011    2   tcp    875  rquotad

    100005    1   udp  59063  mountd

    100005    1   tcp  18557  mountd

    100005    2   udp  12702  mountd

    100005    2   tcp  51384  mountd

    100005    3   udp  62641  mountd

    100005    3   tcp  52345  mountd

    100003    2   tcp   2049  nfs

    100003    3   tcp   2049  nfs

    100003    4   tcp   2049  nfs

    100227    2   tcp   2049  nfs_acl

    100227    3   tcp   2049  nfs_acl

    100003    2   udp   2049  nfs

    100003    3   udp   2049  nfs

    100003    4   udp   2049  nfs

    100227    2   udp   2049  nfs_acl

    100227    3   udp   2049  nfs_acl

    100021    1   udp  32821  nlockmgr

    100021    3   udp  32821  nlockmgr

    100021    4   udp  32821  nlockmgr

    100021    1   tcp  31852  nlockmgr

    100021    3   tcp  31852  nlockmgr

    100021    4   tcp  31852  nlockmgr


[root@NFS-server ~]# showmount -e 127.0.0.1     # 本地测试一下

Export list for 127.0.0.1:

/data 192.168.0.0/24               # 如果配置多个目录都会列出来


[root@NFS-server ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local   # 加入开机启动

[root@NFS-server ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local

[root@NFS-server ~]# tail -2 /etc/rc.local  

/etc/init.d/rpcbind start

/etc/init.d/nfs start


以上服务端配置完成,接下来操作客户端:


[root@Backup-server ~]# /etc/init.d/rpcbind start     # 只需要启动 rpcbind

Starting rpcbind:                                          [  OK  ]


[root@Backup-server ~]# showmount -e 192.168.0.81   # 测试一下

Export list for 192.168.0.81:

/data 192.168.0.0/24


[root@Backup-server ~]# mkdir /data                     # 建个目录然后挂载 

[root@Backup-server ~]# mount -t nfs 192.168.0.81:/data /data

[root@Backup-server ~]# df -h

Filesystem          Size  Used Avail Use% Mounted on

/dev/sda3           6.6G  1.6G  4.7G  26% /

tmpfs               179M   12K  179M   1% /dev/shm

/dev/sda1           190M   33M  147M  19% /boot

192.168.0.81:/data  6.6G  1.6G  4.7G  26% /data      # 看到挂载成功


[root@Backup-server ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local     # 加入开机启动 

[root@Backup-server ~]# tail -1 /etc/rc.local 

/etc/init.d/rpcbind start


[root@Backup-server ~]# umount /data                 # 卸载命令



测试:

[root@Backup-server ~]# touch /data/test1            # 客户端创建文件 test1

[root@Backup-server ~]# ll /data/

total 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1


[root@NFS-server ~]# ll /data/                  # 服务端可以看到

total 0 

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1


[root@NFS-server ~]# touch /data/test2                  # 服务端创建文件 test2

[root@NFS-server ~]# ll /data/        

total 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1

-rw-r--r-- 1 root      root      0 Feb 24 05:40 test2


[root@Backup-server ~]# ll /data/               # 客户端同样可以看到

total 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1

-rw-r--r-- 1 root      root      0 Feb 24 05:40 test2


[root@Backup-server ~]# rm -f /data/test2              # 客户端可以删除服务端创立的文件 test2

[root@Backup-server ~]# ll /data/        

total 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1


[root@NFS-server ~]# ll /data/

total 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1

[root@NFS-server ~]# rm -f /data/test1                  # 服务端同样可以删除客户端创建的文件 test1

[root@NFS-server ~]# ll /data/         

total 0

[root@Backup-server ~]# ll /data/

total 0


通过测试说明 NFS 服务安装配置成功。


  • 关于挂载的问题

  客户端开机挂载设置,把挂载命令加入 /etc/rc.local,前提是服务端NFS服务要先启动, 不然客户端开机时无法找到挂载点,系统会 hung 住开不了机。

[root@Backup-server ~]# echo "mount -t nfs 192.168.0.81:/data /data" >>/etc/rc.local 

[root@Backup-server ~]# tail -2 /etc/rc.local 

/etc/init.d/rpcbind start

mount -t nfs 192.168.0.81:/data /data


  测试开机挂载加入 /etc/fstab,服务端NFS服务是开启状态。

[root@Backup-server ~]# vim /etc/fstab

192.168.0.81:/data      /data                   nfs     defaults        0 0        # 加入这一行

[root@Backup-server ~]# reboot

[root@Backup-server ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       6.6G  1.6G  4.7G  26% /

tmpfs           179M   12K  179M   1% /dev/shm

/dev/sda1       190M   33M  147M  19% /boot

  可以看到没有挂载成功。这是因为,系统开机执行 /etc/fstab 里面的挂载项是在网络服务启动之前的,所以依靠网络进行挂载的客户端当然就挂载失败了。


  • 关于挂载的一些优化

    1)安全挂载  

    mount -t nfs -o nosuid,noexec,nodev,rw 192.168.0.81:/data /data


    2)性能优化,禁止更新目录和文件的时间戳挂载

    mount -t nfs -o noatime,nodirtime 192.168.0.81:/data /data


  • 关于内核的优化建议

[root@NFS-server ~]# vim /etc/sysctl.conf         # 加入以下参数

net.core.wmem_default = 8388608        #发送缓存区大小的缺省值 

net.core.rmem_default = 8388608        #接受套接字缓冲区大小的缺省值(以字节为单位) 

net.core.rmem_max = 16777216           #最大接收缓冲区大小的最大值 

net.core.wmem_max = 16777216           #发送缓冲区大小的最大值 


[root@NFS-server ~]# sysctl -p            # 生效



2. Backup 服务


  2.1服务简介

    集群中的备份服务器可以通过搭建 rsync 服务来实现。    

    rsync(remote synchronize)它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好。

    rsync 包括如下的一些特性:

  能更新整个目录和树和文件系统;

  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;

  对于安装来说,无任何特殊权限要求;

  对于多个文件来说,内部流水线减少文件等待的延时;

  能用rsh、ssh 或直接端口做为传输入端口;

  支持匿名rsync 同步文件,是理想的镜像工具;


  2.2 服务搭建

[root@Backup-server ~]# rpm -aq rsync

rsync-3.0.6-12.el6.x86_64                  # 系统默认已经有安装这个包


[root@Backup-server ~]# vim /etc/rsyncd.conf     #  创建配置文件

#Rsync server
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/lock/subsys/rsyncd
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.0.0/24
hosts deny = 0.0.0.0/32

[web_backup]
comment = for website data
path = /web_backup
auth users = www_user
secrets file = /etc/www.password

[sql_backup]
comment = for mysql data
path = /sql_backup
auth user = sql_user
secrets file = /etc/sql.password



[root@Backup-server ~]# useradd rsync -s /sbin/nologin -M     # 创建系统用户


[root@Backup-server ~]# mkdir /web_backup                            # 创建目录

[root@Backup-server ~]# chown -R rsync:rsync /web_backup/

[root@Backup-server ~]# echo "www_user:123" >/etc/www.password

[root@Backup-server ~]# chmod 600 /etc/www.password 


[root@Backup-server ~]# mkdir /sql_backup

[root@Backup-server ~]# chown -R rsync:rsync /sql_backup/

[root@Backup-server ~]# echo "sql_user:123" >/etc/sql.password

[root@Backup-server ~]# chmod 600 /etc/sql.password 


[root@Backup-server ~]# rsync --daemon          # 启动服务,默认端口 873

[root@Backup-server ~]# lsof -i:873

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   1712 root    3u  IPv4  12479      0t0  TCP *:rsync (LISTEN)

rsync   1712 root    5u  IPv6  12480      0t0  TCP *:rsync (LISTEN)


[root@Backup-server ~]# echo "/usr/bin/rsync --daemon" >>/etc/rc.local    # 配置开机启动


客户端配置:

[root@NFS-server ~]# echo "123" >/etc/www.password          # 创建对应的密码文件

[root@NFS-server ~]# chmod 600 /etc/www.password            # 全线必须 600

[root@NFS-server ~]# echo "123" >/etc/sql.password

[root@NFS-server ~]# chmod 600 /etc/sql.password 


[root@NFS-server ~]# touch /tmp/test01           # 建个测试文件

[root@NFS-server ~]# rsync -avz /tmp/test01 www_user@192.168.0.82::web_backup/ --password-file=/etc/www.password            # 测试推送本地文件到服务端的 web_backup 目录

sending incremental file list                           对应的虚拟用户是 www_user

test01

sent 63 bytes  received 27 bytes  180.00 bytes/sec

total size is 0  speedup is 0.00


[root@Backup-server ~]# ll /web_backup/          # 服务端查看

total 0

-rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01



[root@NFS-server ~]# rsync -avz /tmp/test01 sql_user@192.168.0.82::sql_backup/ --password-file=/etc/sql.password                   #  sql_user 推送文件到服务端的 sql_backup 目录

sending incremental file list

test01

sent 65 bytes  received 27 bytes  184.00 bytes/sec

total size is 0  speedup is 0.00


[root@Backup-server ~]# ll /sql_backup/             # 服务端看到推送成功

total 0

-rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01



以上backup服务器搭建完成。