跟鸟哥学NFS

NFS 的由来与其功能

NFS (Network FileSystem)最早是由Sun公司所发展出来的,最大的功能是可以透过网络,让不同的机器、不同的操作系统彼此分享个别的档案 (share files)。NFS 服务器可以让 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!

NFS 服务器分享目录与 Client 挂载示意图

如同上图所示,当我们的 NFS 服务器设定好了待分享的/home/sharefile目录后,其他的 NFS 客户端可以将这个目录挂载到自己系统上面的某个挂载点 (挂载点可以自定义),例如前面图示中的NFS client 1 与NFS client 2 挂载的目录就不相同。只要在NFS client 1 系统中进入/home/data/sharefile内,就可以看到NFS服务器系统内的/home/sharefile 目录下的所有数据了 (前提是权限要足够)!只要权限对了,可以使用 cp, cd, mv, rm... 等等磁盘或档案相关的指令!

NFS是透过网络来进行数据的传输,由第二章谈到的socket pair的概念你会知道NFS应该会使用一些端口吧?NFS 使用哪个端口来进行传输呢?一般情况下 NFS 服务的端口是 2049 ,但是由于文件系统非常复杂,因此 NFS 还有其他的程序去启动额外的端口,但这些额外的端口是多少? 这个是不知道的!因为预设 NFS 用来传输的端口是随机选择小于1024以下的来使用。咦!那么客户端怎么知道服务器端使用那个端口啊?此时就得采用远程调用 (Remote Procedure Call, RPC) 的协定来辅助!

ps: ftp服务一般是固定21端口进行控制连接,数据连接下根据主动模式和被动模式由ftp客户端或ftp服务端某一端决定端口。思考下:nfs的端口为什么要通过RPC远程调用呢?不用行不行?

什么是RPC (Remote Procedure Call )

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

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

Tips:注意,要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此RPC重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。

NFS 与 RPC 服务及文件系统操作的相关性

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

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

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

3) 客户端得到正确的端口后,可以直接与 NFS daemon 来联机。

由于NFS的各项功能都必须向RPC来注册,如此一来RPC才能了解NFS服务的各项功能的port number, PID, NFS在服务器所监听的 IP 等等,而客户端才能够透过RPC的询问找到正确对应的端口。 也就是说,NFS必须要有 RPC 存在时才能成功的提供服务,因此我们称NFS为RPC server的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是RPC server的一种呢。此外,由上图所示,不论是客户端还是服务器端,要使用NFS时,两者都需要启动RPC才行!

NFS启动的 RPC daemons

NFS服务器在启动时就要向RPC注册,所以 NFS服务器也被称为RPC server之一。 NFS 服务器主要的任务是进行文件系统的分享,文件系统的分享则与权限有关。 所以 NFS 服务器启动时至少需要两个 daemons ,一个管理客户端是否能够登入, 一个管理客户端能够取得的权限。如果还想要管理quota 的话,那么NFS还要再加载其他的RPC程序。我们以较单纯的 NFS 服务器来说:

rpc.nfsd:

最主要的NFS服务器服务提供商。这个 daemon主要的功能是在管理客户端是否能够使用服务器文件系统挂载信息等, 其中还包含登入者ID的判别!

rpc.mountd

这个 daemon 主要的功能是管理 NFS 的文件系统!当客户端顺利的通过 rpc.nfsd 登入服务器后,在使用 NFS 服务器提供的档案前,还会经过档案权限 ( -rwxrwxrwx 与 owner, group 那几个权限) 的认证程序!rpc.mountd会去读NFS的配置文件 /etc/exports来比对客户端的权限。

rpc.lockd (非必要)

用于在管理档案的锁定 (lock) 。为何档案需要『锁定』呢? 因为分享的 NFS 档案可以让客户端使用,当多个客户端同时尝试写入某个档案时, 就可能对于该档案造成一些问题!这个 rpc.lockd 则可以用来解决这个问题。 但 rpc.lockd 必须要同时在客户端与服务器端都开启才行!此外, rpc.lockd 也常与 rpc.statd 同时启用。

rpc.statd (非必要)

用来检查档案的一致性,与rpc.lockd有关!当客户端同时使用同一档案造成档案可能有所损毁时,rpc.statd可以用来检测并尝试恢复复该档案。与 rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效。

上述这几个 RPC 所需要的程序,其实都已经写入到两个基本的服务启动脚本中了,在 /etc/init.d/nfs, /etc/init.d/nfslock,与服务器有关的写入在nfs服务中,而与客户端的rpc.lockd之类的,就设定于nfslock服务中。

NFS 的档案访问权限

不知道你有没有想过这个问题,假如在 NFS client 1上面以dmtsai这个使用者身份想要去存取 /home/data/sharefile/ 来自NFS server 所提供的文件系统时, 请问NFS server所提供的文件系统会让我以什么身份去存取?是 dmtsai 还是?

为什么会这么问呢?因为NFS本身的服务并没有进行身份登入的识别,当客户端以 dmtsai的身份存取服务器端的文件系统时, 服务器端会以客户端的使用者UID与GID等身份来尝试读取服务器端的文件系统。这时有个有趣的问题就产生啦! 那就是如果客户端与服务器端的使用者身份并不一致怎么办?

NFS 的服务器端与客户端的使用者身份确认机制

当以一般身份使用者dmtsai去存取来自服务器端的档案时,注意到的是: 文件系统的inode所记录的属性为UID, GID而非账号与群组名。 那一般Linux主机会主动的以自己的/etc/passwd, /etc/group 来查询对应的使用者、组名。 当 dmtsai进入到该目录后,会参照 NFS client 1 的使用者与组名。 但是由于该目录的档案主要来自 NFS server ,所以可能就会发现几个情况:

1) NFS server/NFS client刚好有相同的账号与群组

则此时使用者可以直接以dmtsai的身份进行服务器所提供的文件系统之存取。

2) NFS server 的 501 这个 UID 账号对应为 vbird

若NFS服务器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时, 则客户端的 dmtsai可以存取服务器端的vbird这个使用者的档案!只因为两者具有相同的 UID 而已。这就造成很大的问题了!因为没有人可以保证客户端的 UID 所对应的账号会与服务器端相同, 那服务器所提供的数据不就可能会被错误的使用者乱改?

3) NFS server 并没有 501 这个 UID

另一个极端的情况是,在服务器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者, 一般 NFS 的匿名者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的账号名称通常是 nobody ,我们的 CentOS 则取名为 nfsnobody 。但有时也会有特殊的情况,例如在服务器端分享 /tmp 的情况下, dmtsain 的身份还是会保持 501 但建立的各项数据在服务器端来看,就会属于无拥有者的资料。

4) 如果使用者身份是 root 时

有个比较特殊的使用者,每个Linux主机都有的UID 为0的root 。 想一想,如果客户端可以用root的身份去存取服务器端的文件系统时,那服务器端的数据哪有什么保护性? 所以在预设的情况下, root的身份会被主动的压缩成为匿名者。

总之,客户端使用者能做的事情是与 UID 及其 GID 有关的,那当客户端与服务器端的 UID及账号的对应不一致时, 可能就会造成文件系统使用上的困扰,这个就是 NFS 文件系统在使用上面的一个很重要的地方!而在了解使用者账号与 UID 及文件系统的关系之后,要实际在客户端以 NFS 取用服务器端的文件系统时, 你还得需要具有:

1) NFS 服务器有开放可写入的权限 (与 /etc/exports 设定有关);

2) 实际的档案权限具有可写入 (w) 的权限。

当你满足了 (1)使用者账号,亦即 UID 的相关身份; (2)NFS 服务器允许有写入的权限; (3)文件系统确实具有 w 的权限时,你才具有该档案的可写入权限!尤其是身份 (UID) 确认的环节部分,最容易搞错啦!也因为如此,NFS 通常需要与NIS (十四章) 这一个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱啊。

总结

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

待学的部分资料链接

1) 鸟叔私房菜部分章节http://cn.linux.vbird.org/linux_server/0330nfs_1.php

2) RFC 1094, NFS 协议解释 http://www.faqs.org/rfcs/rfc1094.html

3) RFC 1813, NFS v3 协议  http://www.faqs.org/rfcs/rfc1813.html

4) Linux NFS-HOWTO:http://www.tldp.org/HOWTO/NFS-HOWTO/index.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • 网络文件系统,英文Network File System(NFS)。是由SUN公司研制的UNIX表示层协议(pre...
    dreamscd阅读 4,069评论 0 0
  • Linux下NFS服务器的搭建与配置 一、NFS服务简介 NFS 就是NetworkFileSystem 的缩写,...
    臣_2f6444阅读 230评论 0 1
  • 什么是NFS NFS就是Network FileSystem的缩写。它最大的功能就是可以透过网络,让不同的机器、不...
    reworthYan阅读 566评论 0 0
  • ** 本文的实验环境为 CentOS6.9 ** NFS 是Network File System的缩写,即网络文...
    JSON_NULL阅读 12,854评论 1 4
  • 《鸟哥Linux私房菜》《老男孩Linux运维》 NFS介绍 NFS维基百科:网络文件系统(英语:Network ...
    Zhang21阅读 3,717评论 0 13