| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux系统开发: 搭建NFS服务器实现文件共享 -> 正文阅读 |
|
[系统运维]Linux系统开发: 搭建NFS服务器实现文件共享 |
一、NFS服务器介绍1.1 什么是NFS服务器NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。 NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的。 1.2 NFS挂载原理NFS最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。 ? 当我们在NFS服务器设置好一个共享目录/home/public后,其他有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端1与客户端2挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。 挂载后,NFS客户端可以通过#df –h命令查看挂载的磁盘信息。 既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有相对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢? 基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了! 查看/etc/services文件可以看到NFS服务器的端口号。 ? 1.3 什么是RPC? 为什么要用RPC?RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。 RPC就是要像调用本地的函数一样去调远程函数。 在研究RPC前,我们先看看本地调用是怎么调的。假设我们要调用函数Multiply来计算lvalue * rvalue的结果。
那么在第8行时,我们实际上执行了以下操作: 将 lvalue 和 rvalue 的值压栈 进入Multiply函数,取出栈中的值10 和 20,将其赋予 l 和 r 执行第2行代码,计算 l * r ,并将结果存在 y 将 y 的值压栈,然后从Multiply返回 第8行,从栈中取出返回值 200 ,并赋值给 l_times_r 以上5步就是执行本地调用的过程。 在远程调用时,我们需要执行的函数体是在远程的机器上的,也就是说,Multiply是在另一个进程中执行的。这就带来了几个新问题: Call ID映射。我们怎么告诉远程机器我们要调用Multiply,而不是Add或者FooBar呢? 在本地调用中,函数体是直接通过函数指针来指定的,我们调用Multiply,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。序列化和反序列化。 客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。网络传输。远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而GRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。 所以,要实现一个RPC框架,其实只需要把以上三点实现了就基本完成了。Call ID映射可以直接使用函数字符串,也可以使用整数ID。映射表一般就是一个哈希表。 1.4 RPC与NFS如何通讯因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。 那么RPC又是如何知道每个NFS功能的端口呢? 首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。 提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs? reload或exportfs –rv即可使修改的/etc/exports生效。 1.5 NFS客户端和NFS服务端通讯过程简图? ? 1)首先服务器端启动RPC服务,并开启111端口 2)服务器端启动NFS服务,并向RPC注册端口信息 3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口 4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。 5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。 1.6 RPC服务工作原理简图? ? ? ? ? 二、部署NFS服务器2.1 查看内核版本信息先查看系统版本和内核参数。同一个软件在不同版本,内核之间是有差异的,所以部署的方法也不一样。
2.2 安装NFS服务器Ubuntu 系统在线安装NFS服务器:
Centos系统在线安装NFS服务器:
RedHat6.3系统,可以在系统安装光盘映像里得到NFS服务器的安装包: ? 2.3 启动NFS服务Ubuntu系统操作步骤:
CentOS系统操作步骤:
RedHat6.3系统操作步骤:
三、编写NFS服务器的配置文件3.1 NFS服务器配置文件NFS服务的配置文件为/etc/exports,系统没有默认值,所以这个文件不一定会存在,可以使用vim手动建立,然后在文件里面写入配置内容。 配置实例:
NFS服务器共享/home/wbyq/rootfs目录给所有NFS客户端访问,权限为读写。 3.2 指定 NFS客户端地址的配置详细说明
3.3 NFS配置参数说明
3.4 NFS服务器配置文件常见编写案例
四、NFS服务器挂载实例4.1 启动NFS服务器实例以Redhat6.3系统为例: 1. 编写NFS配置文件
2. 手动(静态)设置服务器端IP地址
也可以通过系统右上角的小电脑或者setup命令进行设置。
? 3. 关闭防火墙
也可以通过setup命令,打开图形配置页面关闭。 4. 重新NFS服务器
4.2 exportfs 命令在NFS服务器端,exportfs很常用,比如你想要重新修改/etc/exports 文件,当重新设定完 /etc/exports 后 需不需要重新启动 nfs ? 不需要 ,如果重新启动 nfs 的话,要得再向 RPC 注册! 很麻烦~这个时候我们可以透过 exportfs 这个指令来帮忙。 exportfs命令用法如下:
实例操作: 1. 重新挂载一次 /etc/exports 文件的设定内容
2. 将已经分享的 NFS 目录资源,通通都卸除
4.3 NFS的联机观察在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以联机!就是利用 showmount 这个指令来查阅!
示例:
当你要扫瞄某一部主机他提供的 NFS 分享的目录时,就使用showmount -e IP (或 hostname) 即可!非常的方便!这也是 NFS client 端最常用的指令。 4.4 客户端访问实例客户端访问服务器前,需要知道NFS服务器的IP地址和共享的目录路径。 如果是局域网访问,那么需要保证客户端与服务器在同一网段下,如果是公网访问,需要保证客户端这个能过正常连接外网网络。 1. NFS客户端挂载实例: 挂载NFS服务器的目录到本地目录
将192.168.10.11服务器的/home/wbyq/project目录,挂载到本地/home/wbyq/mnt/目录下。 如果挂载服务器时,提示mount命令卡住了,或者报错提示无法加锁等提示时,需要在挂载命令上加一个-o nolock参数。
2. 取消目录挂载
如果不再使用服务器的目录,一定要取消挂载。 4.5 查看客户端的挂载情况/var/lib/nfs/etab、/var/lib/nfs/rmtab这两个文件就能够查看服务器上共享了什么目录,到底有多少客户端挂载了共享,能查看到客户端挂载的具体信息。 1、etab这个文件能看到服务器上共享了哪些目录,执行哪些人可以使用,并且设定的参数为何。 2、rmtab这个文件就是能够查看到共享目录被挂载的情况。
? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 16:53:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |