Linux中的NFS挂载问题

Linux中的NFS挂载问题 在Linux环境中,如果你经常进行mysql的数据备份,可能会遇到备份机挂载在线上环境的问题,今天我们说说NFS备份机目录挂载的问题。

1

NFS服务简介

NFS 是Network File System的缩写,即网络文件系统。它的功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。那么啥是个RPC协议呢,通俗的来讲,就是在一个客户端上访问另外一个服务器的相关服务,如下:

服务器A想要访问服务器B上的一个add函数,然后执行。rpc官方的说法就是:远程过程调用 (Remote Procedure Call)是能使客户端执行其他系统中程序的一种机制,它本身不需要了解底层网络技术的协议。

NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。

总结一下就是:NFS是一个远程文件系统,而RPC是负责远程文件信息的传输。

2

NFS挂载配置过程

NFS服务端配置:

1.安装包检查

NFS的安装通常需要两个软件包即可,这两个软件包一般是系统默认安装的

· nfs-utils-* :包括基本的NFS命令与监控程序

· portmap-* :支持安全NFS RPC服务的连接

CentOS6.5中rpcbind取代了portmap

NFS Server端需要指定的安装包,我们可以通过下面的命令进行安装包的检查:

rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' \rpcbind nfs-utils setup initscripts

命令解释:该命令可以将rpm包按照name-version-release-arch的方式列出来,其中arch是支持的系统架构信息,也就是x86_64或者i386这种的。--qf全称是queryformat,需要注意的是,前面有两个横杠'-',其中rpcbind代替了portmap。

实际的检查结果格式如下:

rpcbind-0.2.0-13.el6_9.1 (x86_64)
nfs-utils-1.2.3-70.el6_8.2 (x86_64)
setup-2.8.14-20.el6_4.1 (noarch)
initscripts-9.03.40-2.el6.centos (x86_64)

如果这些安装包中的某一项没有,需要使用yum的方式进行安装。

2.文件服务器设置

2.1 创建映射用户

创建mysql用户:

useradd -u 500 -s /sbin/nologin mysql

#指定用户mysql的id号为500,只提供服务,-s参数指定用户登录后使用的shell,禁止用户登录

2.2 创建mysql的备份目录

mkdir -p /data/mysql
chown -R mysql.mysql /data/mysql
ls -ldn /data/mysql
drwxr-xr-x     Apr  : /data/mysql

最后的ls -ldn命令可以看到,刚才我们设定的mysql用户的用户id是500。

2.3 配置NFS和iptables(防火墙)

配置NFS

portmap(也就是现有的rpcbind)在NFS服务启动的时候给每一个NFS服务分配了一个动态的端口号,这些服务包含:mountd_port,statd_port,locked_tcpport,locked_udpport等,在配置NFS前,需要将这些NFS服务的端口进行固定。

固定NFS服务所使用的端口:

打开nfs文件,vim /etc/sysconfig/nfs

去掉下面选项前面的注释:

RQUOTAD_PORT=

LOCKD_TCPPORT=

LOCKD_UDPPORT=

MOUNTD_PORT=

STATD_PORT=

STATD_OUTGOING_PORT=

配置iptables

-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport  -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport  -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport  -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport  -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport  -j ACCEPT

就是在防火墙里面开通上面所示端口。

2.4修改配置文件

vim /etc/idmapd.conf

Method = static

否则客户端挂载后都显示为nobody。

2.5导出文件系统

共享的NFS目录在/etc/exports中列出,这个文件会控制共享的目录,这个文件的内容一般如下:

/data/mysql 192.168.10.0/(rw,no_root_squash,async)
/data/mysql 192.168.134.0/(rw,no_root_squash,async)
/data/mysql 192.168.7.0/(rw,no_root_squash,async)
/data/mysql 192.168.60.0/(rw,no_root_squash,async)

其中每一行的意思是:

共享目录 主机/网段(参数)

括号内的参数需要简单说明一下:

rw:指的是对该挂载目录有读写权限

no_root_squash:指的是访问共享目录时,用户如果是root权限,对共享目录也具有root权限(有一定的安全隐患)

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

当我们需要给某个服务器配置NFS挂载时,需要将该服务器的ip地址补充在/etc/exports文件中,从而保证服务器可以对该NFS挂载的文件目录进行访问。

需要注意的是,如果修改了这个NFS的/etc/exports文件,需要使用exportfs命令来使启动立刻生效,命令如下:

exportfs -rv (全部重新export一次)

2.6启动项配置

根据需要设置在相应的运行级别自动启动NFS:

chkconfig --level  rpcbind on

chkconfig --level  nfs on

chkconfig --level  nfslock on

启动NFS:

service nfslock restart

service rpcbind restart

service nfs restart

NFS客户端配置自动挂载NFS:

配置好了NFS服务端之后,我们就可以给我们需要的NFS挂载机器进行相关配置了,一般来讲,挂载有三种方法,较为推荐的是autofs这种自动挂载的方法,其他两种都是开机挂载,不推荐,有兴趣大家可以去了解。autofs自动挂载方法在挂载时会咨询主映射配置文件/etc/auto.master来决定要定义哪些挂载点,然后使用适用于各个挂载点的参数来启动automount守护进程。在开始autofs自动挂载之前,我们需要先进行一些配置,这个配置过程的步骤分为如下几步:

1.查询相关rpm包依赖

这一步类似NFS服务端的检查方法:

rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' autofs nfs-utils nfs-utils-lib

如果没有的话,需要使用下面的命令进行安装:

yum install autofs nfs-utils nfs-utils-lib

2.开通相关防火墙

在客户端的/etc/sysconfig/iptables文件中进行如下配置:

-A OUTPUT -p tcp -d 10.30.121.242   -m state --state NEW -j ACCEPT

3.查看rpcinfo是否互通

rpcinfo实用工具显示那些使用portmap注册的程序的信息,并向程序进行RPC调用,检查它们是否正常运行。

我们常用的命令如下:

rpcinfo- p [host]

其中-p参数的解释如下:

-p (probe,探测) 列出所有在host用portmap注册的RPC程序,如果没有指定host,就查找本机上的RPC程序。

[dba_mysql ~]$ rpcinfo -p XX.XX.XXX.XXX
   program vers proto   port  service
           tcp      portmapper
           tcp      portmapper
           tcp      portmapper
           udp      portmapper
           udp      portmapper
           udp      portmapper
           udp      mountd
           tcp      mountd
           udp      mountd
           tcp      mountd
           udp      mountd
           tcp      mountd
           tcp     nfs
           tcp     nfs
           tcp     nfs
           tcp     nfs_acl
           tcp     nfs_acl
           udp     nfs
           udp     nfs
           udp     nfs
           udp     nfs_acl
           udp     nfs_acl
           udp    nlockmgr
           udp    nlockmgr
           udp    nlockmgr
           tcp    nlockmgr
           tcp    nlockmgr
           tcp    nlockmgr

我们可以看到,这里列出了刚才我们在NFS server端的/etc/sysconfig/nfs当中列出来的那些服务的端口。

4.修改配置文件

主要有两个配置文件: /etc/auto.master /etc/auto.xxx

(这个文件可以自己指定,只要和auto.master中的配置文件名称对应即可)

auto.master:这个文件是NFS配置的主要文件,主映射配置中的每一行都定义一个挂载点,一个分开的映射文件定义在该挂载点下要挂载的文件系统。如/etc/auto.misc文件可能会定义/misc目录中的挂载点,这种关系在/etc/auto.master文件中会被定义。因此,我们需要在auto.master文件里面填上我们真实配置文件的位置,

auto.master文件中的每个项目都有3个字段,第1个字段是挂载点;第2个字段是映射文件的位置;第3个字段可选,可以包括超时数值之类的信息。这里给出一个例子:

#
## Sample auto.master file
## This is a 'master' automounter map and it has the following format:
## mount-point [map-type[,format]:]map [options]
## For details of the format look at auto.master().
##
/misc   /etc/auto.misc
##
## NOTE: mounts done from a hosts map will be mounted with the
##       "nosuid" and "nodev" options unless the "suid" and "dev"
##       options are explicitly given.
##
/net    -hosts
##
## Include central master map if it can be found using
## nsswitch sources.
##
## Note that if there are entries for /net or /misc (as
## above) in the included master map any keys that are the
## same will not be seen as the first read key seen takes
## precedence.
##
+auto.master
/data/backup_zw242      /etc/autozw242.nfs      --timeout 

例如我们要在/data/backup_zw242上面挂载远程机器中的目录,我们需要写入如上面最后一行信息,它的意思是:在/data/backup_zw242目录下挂载相关NFS文件,挂载的文件的信息存储在/etc/autozw242.nfs文件中,超时时间是60s。

此时我们打开这个/etc/autozw242.nfs文件,里面的内容如下:

mysql        -rw,bg,hard,nointr,rsize=,wsize=,timeo=,_netdev,nolock    XX.XX.XXX.242:/data/mysql

其中mysql是/data/backup_zw242下面挂载目录的名字,后面的-rw,bg等是挂载的一些参数(有需要可自行查阅),最后的'IP:目录'是NFS服务端的IP和要挂载的文件目录。

5.NFS客户端挂载

经历了第4步的配置文件修改之后,我们要进行最后一步挂载的操作,挂载操作的命令是:

mount -t nfs -o rw,bg,hard,nointr,rsize=,wsize=,timeo=,_netdev XX.XX.XX.242:/data/mysql /data/backup_zw242/mysql

这个命令包含了几个部分,

第一部分是mount命令加-t参数,其中-t参数是指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。然后是-o参数,这个参数后面跟的内容,就是刚才/etc/autozw242.nfs文件里面的参数;

第二部分是NFS服务器的IP地址和相关目录;

第三部分是NFS客户端的相关目录;

6.设置自启动,重启autofs

chkconfig --level 345 autofs on

service autofs restart

3

常见错误处理

问题1: 如果mount时报错:mount.nfs: Input/output error 解决方案: 增加nolock选项。客户端和服务器的OS版本不一致时(CentOS5和6),可能需要nolock选项。 mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,timeo=600,_netdev,nolock XX.XX.XXX.242:/data/mysql /data/backup_zw242/mysql 问题2:rpcinfo: can't contact portmapper: RPC: Authentication error; why = Client credential too weak 解决方案: 在NFS服务器的/etc/hosts.allow 中加入rpcbind:XX.XX.XXX.XXX

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券