NFS服务
Linux中的文件系统
Linux中的文件系统
在inode与软硬连接和关于挂载中学习整理了一些相关的基本概念,在Linux中,我们称呼一个可被挂载的数据为一个文件系统,类似于一个独立的分区的概念,比如一块外接硬盘,或者网络上的其他主机的某个目录(NFS中的文件系统). 每个文件系统都按照inode与软硬连接中介绍的将内部的数据按照inode区块和实际数据区块两部分存储.
虽然在Linux下面,所有的目录和文件都是由根目录开始的,但是不同的目录可以作为不同文件系统的挂载点. 这个图像大概是根目录首先是某个文件系统的挂载点,用它作为一棵目录树的主干. 在这颗树上的某个分支我们指定几个目录作为其他文件系统的挂载点,就像一颗树上挂了一些小树屋🎄一样,虽然需要通过这颗树才能访问各个小屋,但实际上这些小屋和这棵树在某种程度上是独立的,他们每个都是各自独立的文件系统. 以新的小组服务器为例,运行df -T
命令,查看在当前Linux系统上的文件系统,
tmpfs是虚拟文件系统,不是块设备,这里不作讨论. 可以看到/
, /boot
, /opt
, /home
这四个目录分别是/dev/sda3
, /dev/sda1
, /dev/sda2
, /dev/sdb1
这四个块设备文件系统的挂载点. 也就是说虽然/opt
是/
目录的一个子目录,但他们并不属于一个文件系统,而只是经由/
目录这棵树找到了/opt
这个小屋,在/opt
中的所有数据都是属于小屋的数据.
通过查看inode号我们可以对这件事有一个更直观的认识,执行
1 | ls -ldi / /boot /opt /home /etc |
来查看一下一些各个目录的基本信息,其中-l
为long的缩写,列出详细信息;-d
为directory的缩写,只列出目录本身的信息,不列出里面包含内容的信息;-i
为inode的缩写,打印文件的inode信息. 下面这个是在新的小组服务器中运行该命令得到的结果,
左边第一行代表当前目录文件的inode号,可以看到除了/etc
,大家的inode号都是2,这是因为在ext4文件系统中根目录的inode号为2. 除了/etc
,剩下的四个目录都是各个不同文件系统的根目录,因此它们的inode号都是2. 而/etc
目录是属于挂载在/
目录下文件系统的一个目录.
集群的NFS
我们知道不光是某个本地存储设备可以作为某个文件系统,挂载在Linux中的目录树上,也可以将网络中的某个文件系统挂载在目录树上,让我们得以访问该文件系统的数据. 其中一个典型的例子就是使用Network File System (NFS)服务器挂载某个特定目录. 今天师兄在登录节点下某个目录安装matlab在计算节点无法使用,正好有机会调研一下服务器中的这些挂载关系. 新小组服务器由三台计算机构成,一个登录节点和两个计算节点. 我们可以分别查看一下各个节点上包含文件系统的情况,
最上面花花绿绿的是我的登录节点 (master),后两个分别是node1和node2两个计算节点,这两个节点目录结构相同. 其中计算节点中的两个类型为nfs4的目录master:/home
和master:/opt
就是用NFS服务将master节点中的/home
和/opt
目录挂载到计算节点中的/home
和/opt
目录,所以在master节点的/opt
安装软件后,计算节点可以同步到,因为它们本质上就是同一块数据.
清华的“探索100”集群机也是靠统一挂载实现的共享存储,
用户从网络可以直接访问登录节点,通过登录节点,获得计算资源完成计算. 所有的计算节点通过高速网络互联. 每个计算节点的配置相同,目录结构也相同. 相同的目录结构通过计算节点挂载统一文件系统实现. 由于只有一份数据,因此对目录下的任何修改都能同时映射到所有节点. 根据共享目录的不同,分为软件服务节点、作业管理节点、用户目录管理节点和存储管理节点. 这些所谓不同的节点就是不同的挂载目录. 比如软件服务节点就是/apps
目录,下面安装了编译器、并行库以及应用软件;作业管理节点用来放置lsf作业管理软件,/jobmgr/
或/rm_prog
;用户目录管理节点给用户作存储,挂载点为/home
目录;存储管理节点大概是用户扩展目录?大概是/BACK1
这个目录. 实验室好久没有过“探索100”了,也没机会再仔细考察一下.
(以下内容源自于鸟哥的 Linux私房菜和 David_Tang的博客)
NFS的基本图像
NFS为Network File System (网络文件系统)的简称,从名字可以看到,它实际上是文件系统的一种,即一块可以被系统挂载的数据. 这种文件系统的目的就是让不同的机器、不同的操作系统可以分享彼此的数据,所以和挂载本地硬件数据不同的是,NFS是通过网络来实现不同系统中的数据挂载的. 其中一台机器访问或修改另一台机器的共享目录,实际上就是通过网络来进行数据的传输或修改. 因此,这种数据传输一定要满足某种协议,否则大家彼此都不知道对方的发给自己的数据是什么东西呀,也就谈不到数据共享了.
NFS在数据传送过程中依赖的是RPC (Remote Procedure Call,远程过程调用) 协议,具体的内容全部略过,总之就是说NFS是一个文件系统,而RPC负责信息的传输. 在启动NFS服务之前,一定要先启动RPC服务.
NFS的具体实现过程先不管,它的配置很简单,只要修改/etc/exports
文件就好了. /etc/exports
文件内容格式为:
1 | <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] |
小组服务器上master节点下的该文件为
其中输出目录是指NFS系统中要共享的目录,这里把/opt
目录和/home
目录共享出去.
客户端为网络中可以访问这个共享目录的主机,*表示所有主机.
括号里的内容用来设置输出目录的访问权限、用户映射等. rw为将输出目录设置为读写. sync为将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性. no_root_squash为非root用户及其所属组都映射为匿名用户. (不太清楚具体的含义.. 以后用到了再说吧)
一个小实验
在master节点上新建一个/dog
目录,在里面创建一个miaomiao.md文件,把它挂载到计算节点的/cat
目录下. 在master节点的/etc/exports
文件中添加一行,
1 | /dog *(rw,sync,no_root_squash) |
执行
1 | exportfs -arv |
更新NFS文件系统.
在node1上,新建/cat
目录,使用mount
命令将其挂载:
1 | mount master:/dog /cat |
此时就挂载成功啦.