⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0330nfs.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 5 页
字号:
	另外,NFS 的启动需要透过所谓的远端程序呼叫 (RPC),也就是说,我们并不是只要启动 NFS 就好了,
	还需要启动 RPC 这个服务才行啊!因此,你必须要拥有的基础知识有∶<br />
	<ul>
	<li>必须要了解档案系统的权限概念,可以参考
	<a href="../linux_basic/0210filepermission.php">基础篇的 Linux 档案属性与目录配置</a></li>
	<li>了解<a href="0110network_basic.php">网路基础</a>,防火墙与<a
	href="0240network-secure-1.php#packet_flow_protect">关闭 SELinux 模组</a>等等。
	</ul>
</div>

<hr /><a NAME="What_NFS_0"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">NFS 的由来与其功能</span><br />
<div class=block1>
	在开始进行 NFS 的设定之前,我们得先来了解一下,什么是 NFS 呢?不然讲了一堆也没有用,对吧! ^_^!
	底下就来谈一谈什么是 NFS ,且 NFS 的启动还需要什么样的协定啊!<br /><br />

	<hr /><a NAME="What_NFS_NFS"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">什么是
	NFS (Network FileSystem)</span><br />
	<div class=block2>
		NFS 就是 <b>N</b>etwork <b>F</b>ile<b>S</b>ystem 的缩写,最早之前是由 
		<a href="http://www.sun.com/" target="_blank">Sun</a> 这家公司所发展出来的。
		他最大的功能就是<span class=text_import2>可以透过网路,让不同的机器、不同的作业系统、可以彼此分享个别的档案 
		(share files)</span>。所以,您也可以简单的将他看做是一个档案伺服器 (file server) 呢!这个 NFS 
		伺服器可以让您的 PC 来将网路远端的 NFS 主机分享的目录,挂载到本地端的机器当中,
		在本地端的机器看起来,那个<span class=text_import2>远端主机的目录就好像是自己的一个磁碟分割槽一样 
		(partition)!使用上面相当的便利!</span><br /><br />

		<a name="fig_01"></a><center><img src="0330nfs/nfs_server_client.png" 
		title="NFS 主机分享目录与 Client 挂载示意图"
		alt="NFS 主机分享目录与 Client 挂载示意图"><br />
		图一、NFS 主机分享目录与 Client 挂载示意图</center><br />

		就如同上面的图示一般,当我们的 NFS Server 设定好了分享出来的 /home/sharefile 这个目录后,其他的 
		NFS Client 端就可以将这个目录挂载到自己系统上面的某个挂载点 (挂载点可以自订),例如前面图示中的 
		NFS client 1 与 NFS client 2 挂载的目录就不相同。我只要在 NFS client 1 系统中进入 
		/home/data/sharefile 内,就可以看到 NFS Server 系统内的 /home/sharefile 目录下的所有资料了 
		(当然,权限要足够啊!^_^)!这个 /home/data/sharefile 就好像 NFS client 1 自己机器里面的一个 
		partition 喔!只要权限对了,那么您可以使用 cp, cd, mv, rm... 
		等等磁碟或档案相关的指令!真是他X的方便呐!<br /><br />

		好的,既然 NFS 是透过网路来进行资料的传输,那么经由 
		<a href="0110network_basic.php#protocol_tcp_socket">socket pair</a> 的概念你会知道
		NFS 应该会使用一些 port 吧?那么 NFS 使用哪个 port来进行传输呢?答案是....不知道! @_@ !
		<span class=text_import2>因为 NFS 用来传输的 port 是随机选择小于 1024 以下的埠口来使用的</span>。
		咦!那用户端怎么知道你伺服器端使用那个 port 啊?此时就得要
		<span class=text_import2>远端程序呼叫 
		(Remote Procedure Call, RPC)</span> 的协定来辅助啦!底下我们就来谈谈什么是 RPC?<br /><br />
	</div>

	<hr /><a NAME="What_NFS_RPC"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">什么是
	RPC (Remote Procedure Call)</span><br />
	<div class=block2>
		因为 NFS 支援的功能相当的多,而不同的功能都会使用不同的程式来启动,
		每启动一个功能就会启用一些 port 来传输资料,因此, NFS 的功能所对应的 port 才没有固定住,
		而是采用随机取用一些未被使用的小于 1024  的埠口来作为传输之用。但如此一来又造成用户端想要连上伺服器时的困扰,
		因为用户端得要知道伺服器端的相关埠口才能够连线吧!<br /><br />

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

		<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen">		所以你要注意,要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。
		另外,RPC 若重新启动时,原本注册的资料会不见,因此 RPC 
		重新启动后,他管理的所有程式都需要重新启动以重新向 RPC 注册。
		</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div>
		<a name="fig_02"></a><center><img src="0330nfs/nfs_rpc.png" 
		title="NFS 与 RPC 服务及档案系统操作的相关性"
		alt="NFS 与 RPC 服务及档案系统操作的相关性"><br />
		图二、NFS 与 RPC 服务及档案系统操作的相关性</center><br />

		如上图所示,当用户端有 NFS 档案存取需求时,他会如何向伺服器端要求资料呢?<br />
		<ol><span class=text_import2>
		<li>用户端会向伺服器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
		<li>伺服器端找到对应的已注册的 NFS daemon 埠口后,会回报给用户端;
		<li>用户端了解正确的埠口后,就可以直接与 NFS daemon 来连线。
		</span></ol>

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

		更多的 NFS 相关协定资讯你可以参考底下网页∶<br />
		<ul>
		<li><a href="http://www.faqs.org/rfcs/rfc1094.html" 
		target="_blank">http://www.faqs.org/rfcs/rfc1094.html</a></li>
		<li><a href="http://www.tldp.org/HOWTO/NFS-HOWTO/index.html" 
		target="_blank">http://www.tldp.org/HOWTO/NFS-HOWTO/index.html</a></li>
		</ul>
	</div>

	<hr /><a NAME="What_NFS_daemons"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">NFS
	启动的 RPC daemons</span><br />
	<div class=block2>
		我们现在知道 NFS 伺服器在启动的时候就得要向 RPC 注册,所以 NFS 伺服器也被称为 RPC server 之一。
		那么 NFS 伺服器主要的任务是进行档案系统的分享,档案系统的分享则与权限有关。
		所以 NFS 伺服器启动时至少需要两个 daemons ,一个管理 client 端是否能够登入的问题,
		一个管理 client  端能够取得的权限。如果你还想要管理 quota 的话,那么 NFS 
		还得要再载入其他的 RPC 程式就是了。我们以较单纯的 NFS 主机来说∶<br />

		<ul>
		<li><span class=text_import1>rpc.nfsd</span>∶<br />
		这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其中还包含这个登入者的 ID 的判别喔!
		</li><br />

		<li><span class=text_import1>rpc.mountd</span><br />
		这个 daemon 主要的功能,则是在管理 NFS 的档案系统哩!当 Client 端顺利的通过 rpc.nfsd 
		而登入主机之后,在他可以使用 NFS 伺服器提供的档案之前,还会经过档案使用权限 
		(就是那个 -rwxrwxrwx 与 owner, group 那几个权限啦) 的认证程序!他会去读 NFS 的设定档 
		<span class=text_import2>/etc/exports</span> 来比对 Client 的权限,当通过这一关之后 Client 
		就可以取得使用 NFS 档案的权限啦!
		(注∶这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方哩!)</li><br />

		<li><span class=text_import1>rpc.lockd (非必要)</span><br />
		这个玩意儿可以用在管理档案的锁定 (lock) 用途。为何档案需要『锁定』呢?
		因为既然分享的 NFS 档案可以让用户端使用,那么当多个用户端同时尝试写入某个档案时,
		就可能对于该档案造成一些问题啦!这个 rpc.lockd 则可以用来克服这个问题。
		但 rpc.lockd 必须要同时在用户端与伺服器端都开启才行喔!此外, rpc.lockd 
		也常与 rpc.statd 同时启用。</li><br />

		<li><span class=text_import1>rpc.statd (非必要)</span><br />
		可以用来检查档案的一致性,与 rpc.lockd 有关!若发生因为用户端同时使用同一档案造成档案可能有所损毁时,
		rpc.statd 可以用来检测并尝试回复该档案。与 rpc.lockd
		同样的,这个功能必须要在伺服器端与用户端都启动才会生效。
		</ul>
	</div>
	<hr /><a NAME="What_NFS_perm"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">NFS 的档案存取权限</span><br />
	<div class=block2>
		不知道你有没有想过这个问题,在<a href="#fig_01">图一</a>的环境下,假如我在 NFS client 1 上面以
		dmtsai 这个使用者身份想要去存取 /home/data/sharefile/ 这个来自 NFS server 所提供的档案系统时,
		请问 NFS server 所提供的档案系统会让我以什么身份去存取?是 dmtsai 还是?<br /><br />

		为什么会这么问呢?这是<span class=text_import2>因为 NFS 本身的服务并没有进行身份登入的识别</span>,
		所以说,当你在用户端以 dmtsai 的身份想要存取伺服器端的档案系统时,
		<span class=text_import2>伺服器端会以用户端的使用者
		UID 与 GID 等身份来尝试读取伺服器端的档案系统</span>。这时有个有趣的问题就产生啦!
		那就是<span class=text_import2>如果用户端与伺服器端的使用者身份并不一致怎么办?</span><br /><br />

		我们以底下这个图示来说明一下好了∶<br /><br />

		<a name="fig_03"></a><center><img src="0330nfs/nfs_auth.png" 
		title="NFS 的伺服器端与用户端的使用者身份确认机制"
		alt="NFS 的伺服器端与用户端的使用者身份确认机制"><br />
		图三、NFS 的伺服器端与用户端的使用者身份确认机制</center><br />

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

		<ul>
		<li><span class=text_import1>NFS server/NFS client 刚好有相同的帐号与群组</span><br />
		则此时使用者可以直接以 dmtsai 的身份进行伺服器所提供的档案系统之存取。<br /><br />

		<li><span class=text_import1>NFS server 的 501 这个 UID 帐号对应为 vbird</span><br />
		若 NFS 伺服器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时,
		则用户端的 dmtsai 可以存取伺服器端的 vbird 这个使用者的档案喔!<span class=text_import2>只因为两者具有相同的
		UID 而已。</span>这就造成很大的问题了!因为没有人可以保证用户端的 UID 所对应的帐号会与伺服器端相同,
		那伺服器所提供的资料不就可能会被错误的使用者乱改?<br /><br />

		<li><span class=text_import1>NFS server 并没有 501 这个 UID</span><br />
		另一个极端的情况是,在伺服器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者,
		一般 NFS 的匿名者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的帐号名称通常是
		nobody ,我们的 CentOS 则取名为 nfsnobody 。<br /><br />

		<li><span class=text_import1>如果使用者身份是 root 时</span><br />
		有个比较特殊的使用者,那就是每个 Linux 主机都有的 UID 为 0 的 root 。
		想一想,如果用户端可以用 root 的身份去存取伺服器端的档案系统时,那伺服器端的资料哪有什么保护性?
		所以<span class=text_import2>在预设的情况下, root 的身份会被主动的压缩成为匿名者</span>。
		</ul>

		总之,用户端使用者能做的事情是与 UID 及其 GID 有关的,那当用户端与伺服器端的 UID 及帐号的对应不一致时,
		可能就会造成档案系统使用上的困扰,这个就是 NFS 档案系统在使用上面的一个很重要的地方!
		而在了解使用者帐号与 UID 及档案系统的关系之后,要实际在用户端以 NFS 取用伺服器端的档案系统时,
		你还得需要具有∶<br />
		<ul><span class=text_import2>
		<li>NFS 伺服器有开放可写入的权限 (与 /etc/exports 设定有关);
		<li>实际的档案权限具有可写入 (w) 的权限。
		</span></ul>
		当你满足了 (1)使用者帐号,亦即 UID 的相关身份; (2)NFS 伺服器允许有写入的权限; 
		(3)档案系统确实具有 w 的权限时,你才具有该档案的可写入权限喔!
		尤其是身份 (UID) 确认的环节部分,最容易搞错啦!也因为如此,
		<span class=text_import2>所以 NFS 通常需要与 <a href="0430nis.php">NIS</a> 
		这一个可以确认用户端与伺服器端身份一致的服务搭配使用,</span>以避免身份的错乱啊! ^_^<br />
	</div>
</div>


<hr /><a NAME="nfsssrver"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">NFS Server 端的设定</span><br />
<div class=block1>
	既然要使用 NFS 的话,就得要安装 NFS 所需要的套件了!底下让我们查询一下系统有无安装所需要的套件,
	NFS 套件的架构以及如何设定 NFS 主机吧! ^_^<br /><br />

	<hr /><a NAME="nfsserver_need"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">所需要的套件</span><br />
	<div class=block2>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -