相信读者都知道在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)!使用上面相当的便利!
什么是 RPC (Remote Procedure Call)
因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口没有固定, 而是随机拿一些未被使用的小于 1024 的端口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关端口才能够联机吧!
此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的端口 ,并且回报给客户端,让客户端可以连结到正确的端口上去。 那 RPC 又是如何知道每个 NFS 的端口呢?这是因为当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的端口, 所以当然可以让 NFS 的启动更为轻松愉快了!
如上图所示,当客户端有 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 可以发现很多有趣的数据。