NFS:Linux中最简单且实用的服务

简介:

相信读者都知道在windows下共享一个文件时相当的容易啦,几个点击操作就OK啦,当然还要注意权限问题,那么如果系统是linux或者是uniux,别着急,samba?nfs?听过了吧,对滴,都可以作为共享,有啥区别呢,samba主要作为linux与linux之间或者linux与windows之间的文件共享,而nfs主要作为linux与linux之间或者linux与uniux之间的文件共享,在这篇博客中小编就要和大家介绍一下如何来使用NFS来完成文件共享。

NFS的由来以及其功能

NFS 这个藉由网络分享文件系统的服务在架设的时候是很简单的,不过,它最需要关注的是权限方面的问题! 因为在客户端与服务器端可能必须要具备相同的账号才能够存取某些目录或档案。 另外,NFS 的启动需要透过所谓的远程过程调用 (RPC),也就是说,我们并不是只要启动 NFS 就好了, 还需要启动 RPC 这个服务才行啦!

因此,在开始进行 NFS 的设定之前,我们得先来了解一下,什么是 NFS 呢?不然讲了一堆也没有用,对吧! ^_^! 下面就来谈一谈什么是 NFS ,以及 NFS 的启动还需要什么样的协议啦!

什么是 NFS (Network FileSystem)

NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun 这家公司所发展出来的 。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!

clip_image002

什么是 RPC (Remote Procedure Call)

因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口没有固定, 而是随机拿一些未被使用的小于 1024 的端口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关端口才能够联机吧!

此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的端口 ,并且回报给客户端,让客户端可以连结到正确的端口上去。 那 RPC 又是如何知道每个 NFS 的端口呢?这是因为当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的端口, 所以当然可以让 NFS 的启动更为轻松愉快了!

clip_image004

如上图所示,当客户端有 NFS 文件存取需求时,它会如何向服务器端要求数据呢?

1.客户端会向服务器端的 RPC (port 111) 发出 NFS 数据存取功能的询问要求;

2.服务器端找到对应的已注册的 NFS daemon 端口后,会回报给客户端;

3.客户端了解正确的端口后,就可以直接与 NFS daemon 来联机。

理论部分就聊这么多啦,接下来就是NFS的配置啦,分为服务器端和客户端

NFS Server 端的设定

所需要的软件

NFS 主程序:nfs-utils

就是提供rpc.statd、rpc.lockd、rpc.gssd、rpc.idmapd(端口注册)、 rpc.nfsd 及 rpc.mountd 等 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件啦!一定要有喔!

这两个软件在linux 企业版5.4的镜像包中都有,直接使用yum安装就是了

NFS 的软件结构

NFS 这个东东真的是很简单,上面小编提到的 NFS 软件中,配置文件只有一个,记录文件就两三个而已啦!赶紧先来看一看吧! ^_^

1.主要配置文件:/etc/exports

这个档案就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个档案不一定会存在,你可能必须要使用 vim 主动的创建这个档案啦!小编等一下要谈的设定也仅只是这个档案而已!

2.NFS 文件系统维护指令:/usr/sbin/exportfs

这个是维护 NFS 分享资源的指令,可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法小编在之后会介绍。

3.分享资源的登录文件:/var/lib/nfs/*tab

在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录文件, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。

4.客户端查询服务器分享资源的指令:/usr/sbin/showmount

这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源啦

/etc/exports 配置文件的语法与参数

    在开始 NFS 服务器的设定之前,你必须要了解的是,NFS 会直接使用到内核功能,所以你的核心必须要有支持 NFS 才行。万一如果你的内核版本小于 2.2 版,或者重新自行编译过内核的话,那么就得要很注意啦!因为你可能会忘记选择 NFS 的内核支持啊!

    至于 NFS 服务器的架设实在很简单,你只要编辑好主要配置文件 /etc/exports 之后,先启动 rpcbind (若已经启动了,就不要重新启动),然后再启动 nfs ,你的 NFS 就成功了! 不过这样的设定能否对客户端生效?那就得要考虑你权限方面的设定能力了。废话少说,我们就直接来看看那个 /etc/exports 应该如何设定吧!某些 distributions 并不会主动提供 /etc/exports 文件,所以请你自行手动建立它吧。

vim /etc/exports
/tmp/test         192.168.110.0/24(ro)   localhost(rw)   *.test.com(ro,sync)
[分享目录]   [第一部主机(权限)]     [可用主机名]    [可用通配符]

    这个配置文件有够简单吧!每一行最前面是要分享出来的目录,注意喔!是以目录为单位啊! 然后这个目录可以依照不同的权限分享给不同的主机,像小编上面的例子说明是: 要将 /tmp/test 分别分享给三个不同的主机或网域的意思。记得主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号 (,) 分开。且主机名与小括号是连在一起的!在这个档案内也可以利用 # 来注释。

至于主机名的设定主要有几个方式:

1.可以使用完整的 IP 或者是网段,例如 192.168.100.10 或 192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以接受!

2.也可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS 找到该名称才行啊!反正重点是可找到 IP 就是了。如果是主机名的话,那么他可以支持通配符,例如 * 或 ? 均可接受。

至于权限方面 (就是小括号内的参数常见的参数则有:

参数值

内容说明

rw
ro

该目录分享的权限是可读写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

sync
async

sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!

no_root_squash
root_squash

客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定转换成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!

all_squash

不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!

anonuid
anongid

anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啦。


这是几个比较常见的权限参数,如果你有兴趣玩其他的参数时,请自行 man exports 可以发现很多有趣的数据。

一个简单的服务器配置的例子

规则:对于服务器的/tmp/test目录只允许192.168.111.20 IP的用户进行同步读写,客户端写文件时的权限非root,其他网段的用户只可读

Step 1:建立相关目录

# mkdir /tmp/test

# chmod o+wt /tmp/test //赋予其他用户写权限,并且只能由其他用户删除

Step 2:编写规则

# vim /etc/exports

/tmp/test 192.168.111.0/24(rw,sync,root_squash) *(ro)

Step 3:启动nfs服务

# service nfs start

Step 4:查看服务启动后模块的状态

# rpcinfo –p

clip_image006

这就算是完事啦,就这么简单,以后每修改exports文件之后,不必要重新启动nfs服务,将exports文件重新加载就是了

# exportfs -rv

NFS 客户端的设定

既然 NFS 服务器最主要的工作就是分享文件系统给网络上其他的客户端,所以客户端当然得要挂载啦! 此外,服务器端可以加设防火墙来保护自己的文件系统,那么客户端挂载该文件系统后,难道不需要保护自己? 呵呵!所以底下小编要来谈一谈几个 NFS 客户端的课题。

手动挂载 NFS 服务器分享的资源

你要如何挂载 NFS 服务器所提供的文件系统呢?基本上,可以这样做:

1. 确认本地端已经启动了 nfs 服务!

2. 扫瞄 NFS 服务器分享的目录有哪些,并了解我们是否可以使用 (showmount);

3. 在本地端建立预计要挂载的挂载点目录 (mkdir);

4. 利用 mount 将远程主机直接挂载到相关目录。

好,现在假设客户端在 192.168.111.10 这部机器上,而服务器是 192.168.111.20, 那么就来实现一下吧

Step 1:

# service nfs start

Step 2:

# showmount -e 192.168.111.10

clip_image008

Step 3:在本地建立挂载点

# mkdir /mnt/test

Step 4:使用mount挂载远程目录

# mount 192.168.111.10:/tmp/test /mnt/test

因为你的主机地址是192.168.111.20,所以拥有读写权限,下面是测试操作

clip_image010

那么非192.168.111.20地址的用户呢,例(192.168.111.30)

挂载远程目录的操作相同

# mount 192.168.111.10:/tmp/test /mnt/test

接下来是操作

clip_image012

开机自动挂载NFS 服务器分享的资源

这个就简单啦,只需修改fstab文件或者将挂载的指令写入到开机启动脚本中去就是了,但是要注意的是,有可能客户端在启动过程中要挂载的服务器并未启动,那就麻烦了,机器就一直在等待服务器启动,等到何时啊,别急,在编写fstab文件的时候多加几个参数就是了

# vim /etc/fstab //加入下面的内容

192.168.111.10:/tmp/test /mnt/test nfs rw,soft,intr 0 0

[资源] [挂载点] [文件系统] [参数]

在参数部分有两个参数估计读者不是很熟悉

soft 允许向用户输出错误信息

与此相对应的

hard 不输出任何信息

intr 挂载不上自动中断

与此相对应的

nointr 挂载不上一直等待

好了完事,使用mount –a指令试试

自动挂载 autofs 的使用

我们知道 NFS 服务器与客户端的联机或许不会永远存在,而 RPC 这个服务又挺讨厌的,如果挂载了 NFS 服务器后,任何一方脱机都可能造成另外一方老是在等待超时~而且,挂载的 NFS 文件系统可能又不是常常被使用,但若不挂载的话,有时候紧急要使用时又得通知系统管理员, 这又很不方便...啊!好讨厌的感觉啊~@_@

所以,让我们换个思考的角度来讨论一下使用 NFS 的情境:

1.可不可以让客户端在有使用到 NFS 文件系统的需求时才让系统自动挂载?

2.当 NFS 文件系统使用完毕后,可不可以让 NFS 自动卸除,以避免可能的 RPC 错误?

如果能达到上述的功能,那就太完美啦!有没有这东西呢?有的,在现在的 Linux 环境下这是可以达成的理想!用的就是 autofs 这个服务啦!

clip_image014

如上图所示,我们的 autofs 主要配置文件为 /etc/auto.master,这个文件的内容很简单, 如上所示,我只要定义出最上层目录 (/mnt/test) 即可,这个目录就是 autofs 会一直持续侦测的目录啦。 至于后续的文件则是该目录底下各次目录的对应。在 /etc/auto.test (这个档案的档名可自定义) 里面则可以定义出每个次目录所欲挂载的远程服务器的 NFS 目录资源!

举例来说:『当我们在客户端要使用 /mnt/test/server 的数据时,此时 autofs 才会去 192.168.111.10 服务器上挂载 /tmp/test !』且『当隔了一段时间(可以自定义)没有使用该目录下的数据后,则客户端系统将会主动的卸除 /mnt/test/server 』。

来实现一下吧:

Step 1:编辑auto.master文件 添加一下内容

# vim /etc/auto.master

/mnt/test /etc/auto.test --timeout=3 //这里为了测试将时间设置成3秒

Step 2:创建auto.test文件

# vim /etc/auto.test 文件内容如下

server -rw,soft,intr 192.168.111.10:/tmp/test //和开机自动挂载很像啦

Step 3:启动autofs服务

# service autofs start

Step 4:测试

先使用mount命令查询一下挂载情况

clip_image016

直接切换进/mnt/test/server目录试试,并且操作一下

clip_image018

然后切换出来等待3秒看看

clip_image020

很神奇吧,相信这个对读者来说一定是很有用的啦。

好啦,东西NFS的东东啰嗦完了,读者自己好好练练吧O(∩_∩)O~



本文转自 chenming421  51CTO博客,原文链接:http://blog.51cto.com/wnqcmq/1202057

相关文章
|
1月前
|
Linux Shell Windows
通过Linux挂载Windows端NFS服务实现板端Linux传输文件到PC
通过Linux挂载Windows端NFS服务实现板端Linux传输文件到PC
|
1月前
|
运维 Linux Apache
Linux Apache服务详解——Apache虚拟目录与禁止显示目录列表实战
Linux Apache服务详解——Apache虚拟目录与禁止显示目录列表实战
22 2
|
1月前
|
域名解析 Linux Apache
Linux Apache服务详解——虚拟网站主机功能实战
Linux Apache服务详解——虚拟网站主机功能实战
34 5
|
1月前
|
Linux 应用服务中间件 Apache
Linux Apache服务详解——Apache服务基础知识
Linux Apache服务详解——Apache服务基础知识
34 2
|
3天前
|
Linux 网络安全
Centos6.5安装并配置NFS服务
该内容描述了在Linux系统中设置NFS服务的步骤。首先挂载yum源,然后安装NFS服务,并编辑配置文件。接着,重启rpcbind和NFS服务,可能需要重复此过程以解决初始可能出现的问题。此外,关闭防火墙策略,并再次重启服务。最终,根目录被共享,特定IP网段被允许访问。
9 0
|
9天前
|
存储 关系型数据库 MySQL
Linux服务详解
Linux服务详解
25 0
|
10天前
|
网络协议 Ubuntu Linux
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
|
18天前
|
监控 Java Linux
linux下监控java进程 实现自动重启服务
linux下监控java进程 实现自动重启服务
|
21天前
|
关系型数据库 MySQL Linux
linux特定服务日志
Linux系统的服务日志在`/var/log`目录下,如系统日志(`/var/log/syslog`或`/var/log/messages`)、认证日志(`/var/log/auth.log`)、SSH日志(`/var/log/auth.log`或`/var/log/secure`)。Web服务器(Apache和Nginx)的访问和错误日志、MySQL错误日志、Postfix及Dovecot邮件服务器日志也在此处。日志位置可能因发行版和服务配置而异,不确定时可查服务配置或用`grep`搜索。使用`logrotate`可管理日志文件大小。
20 6
|
28天前
|
Linux
linux中服务管理
在Linux服务管理中,从传统的System V init到Upstart,再到广泛采用的systemd,管理方式不断发展。systemd以其强大的功能和依赖解决成为现代Linux的核心。`systemctl`是管理服务的关键命令,如启动(`start`)、停止(`stop`)、重启(`restart`)服务及设置开机启动(`enable`)或取消(`disable`)。了解和服务管理,特别是systemd和`systemctl`的使用,对系统管理员至关重要。其他如xinetd用于控制网络服务,而特定环境下有OpenRC等工具。
17 2