当前位置:文档之家› Linux网络文件系统(NFS)分析

Linux网络文件系统(NFS)分析

Linux网络文件系统(NFS)分析
Linux网络文件系统(NFS)分析

Linux网络文件系统(NFS)分析

1. 网络文件系统概述_____________________________________________________ 4

1.1 远程文件存取____________________________________________________ 4 1.2 网络文件系统概述________________________________________________ 4 1.3 网络文件系统上层实现____________________________________________ 5 1.3.1 Mount安装协议和NFS远程过程_________________________________ 5 1.3.2 访问文件的具体流程___________________________________________ 5 1.4 网络文件系统下层实现——远程过程调用(RPC) ____________________ 6 1.4.1 RPC的概念模型 _______________________________________________ 7 1.4.2 SUN RPC的定义______________________________________________ 7 1.4.3 SUN RPC的传输层实现机制____________________________________ 8 1.4.3.1 通信语义__________________________________________________ 8 1.4.3.2 动态端口映射______________________________________________ 8 1.4.4 一次RPC远程调用的具体流程 __________________________________ 9 2. Linux的NFS系统框架________________________________________________ 11

2.1 源码分析环境___________________________________________________ 11 2.2 Linux下NFS的体系结构 _________________________________________ 12 2.3 NFS的Client端 _________________________________________________ 12 2.3.1 Client端的VFS层 ____________________________________________ 13 2.3.2 Client端的RPC层 ____________________________________________ 20 2.3.3 Client端的NFS层 ____________________________________________ 27 2.3.3.1 NFS过程层 _______________________________________________ 27 2.4 NFS的Server端_________________________________________________ 33 2.4.1 Server端的RPC层____________________________________________ 33 2.4.2 Server端的NFS层____________________________________________ 37 2.4.3 NFS Server端启动 ___________________________________________ 39 2.4.4 nfsservctl系统调用实现 ________________________________________ 40 2.4.5 RPC鉴别机制 ________________________________________________ 46 3 Mount安装协议的具体实现 _____________________________________________ 48

3.1 NFS Client端Mount协议数据结构 ______________________________ 48 3.2 NFS Client端Mount协议实现 __________________________________ 50 3.2.1Linux根文件系统的NFS Mount协议安装 _______________________ 51 3.2.1.1 nfs_root_setup函数的实现_________________________________ 52 3.2.1.2 nfs_root_mount函数的功能 ________________________________ 54 3.2.2命令行下的动态NFS Mount协议安装__________________________ 60 3.2.2.1 nfs_read_super函数的实现________________________________ 60 4NFS文件操作具体流程________________________________________________ 64 4.1 NFS文件协议的数据结构______________________________________ 64 4.2 打开一个NFS文件的具体流程 _________________________________ 65 4.2.1 VFS层操作分析 ______________________________________________ 65 4.2.2 NFS层操作分析 ______________________________________________ 67 4.2.3 RPC层操作分析 ______________________________________________ 69

4.2.4 Server端操作分析____________________________________________ 69 4.3 读写一个NFS文件的具体流程 _________________________________ 70 4.3.1 sys_read函数 ______________________________________________ 71 4.3.2nfs_file_read函数____________________________________________ 71 4.3.3nfs_readpage nfs_readpage_sync函数 __________________________ 72 5 NFS文件系统FAQ ____________________________________________________ 76 参考文献:______________________________________________________________ 79

1. 网络文件系统概述

1.1 远程文件存取

许多早期的网络系统提供了文件传输(File transfer)服务,它允许用户把某文件的一个副本从一台机器移到另一台机器上。而更多近期的网络则提供了文件存取(File access)服务,即允许某个应用程序从一台远程机器上对某个文件进行存取。

使用远程文件机制对文件进行存取的应用程序,可以同它所要存取的文件驻留在同一台机器上,也可以运行在某台远程机器上。当一个应用程序要存取一个驻留在某台远程机器上的文件时,该程序的操作系统将调用客户机软件,这个客户机软件与远程机器中的服务器联系,执行对该文件执行所请求的操作。与文件传输服务不同,该服务的系统并不立即对整个文件进行传输和存储,而是每次要求传送一小块数据。

为了提供对驻留在某台计算机上的某些或所有文件的远程存取能力,系统管理员必须让该计算机运行一个可以对存取请求进行响应的服务器。这个服务器对每个请求进行检查,以验证该客户是否具有对指定文件进行存取的权利,然后执行所指明的操作,最后向客户机返回一个结果。

1.2 网络文件系统概述

Sun Microsystems公司于1984年推出了一个在整个计算机工业中被广泛接受的远程文件存取机制,它被称为Sun的网络文件系统(Network File System),或者简称为NFS。该机制允许在一台计算机上运行一个服务器,使对其上的某些或所有文件都可以进行远程存取,还允许其他计算机上的应用程序对这些文件进行存取。

它使我们能够达到文件的共享。当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的文件操作上和本地机器的文件没两样。一个应用程序可以打开(Open)一个远程文件以进行存取,可以从这个文件中读取(Read)数据,向该文件中写入(Write)数据,定位(Seek)到文件中的某个指定位置(开始、结尾或者其他地方),最后当使用完毕后关闭(Close)该文件。并且这些操作都是对编程者透明的,操作方法和对本地文件的操作方法完全一样。

下面的两节我们将继续介绍Sun的网络文件系统的具体实现,这对于了解下一章Linux中NFS的实现提供了很好的理论背景。

1.3 网络文件系统上层实现

1.3.1 Mount安装协议和NFS远程过程

NFS的实现被分离成两个独立的程序来实现,分别是Mount安装协议和NFS 远程过程调用。

Mount安装协议是实现文件访问的开端。它的主要功能是获取远程机器上的不同文件系统结构并返回所要访问的文件系统根句柄,作为以后对该文件系统进行操作的根本。

在下一节中我们将介绍PRC(远程过程调用)的基础知识,而关于PRC如何实现NFS的上述两部分功能,我们将在下一章中,结合具体的Linux函数进行分析。相信这样,更能加深这部分知识的理解。

1.3.2 访问文件的具体流程

上面我们看到了NFS文件系统的主要数据结构,以及实现文件系统的两部分重要构成。下面总结一下NFS中怎样实现对一个目标文件的访问。

在NFS中,每次对远程文件系统上的通过一个称之为”文件句柄”(file-handle)的数据结构来实现对远程机器上目标文件的操纵。首先对文件名在本地进行解析。这一过程与传统UNIX中的文件名解析过程类似。即一次解析一个全路径名的一部分。它从分层结构的根及路径的开始出发,重复地从路径中取出下一部分,并找出一个具有该名字的文件或子目录。

在NFS系统中,得到一个目的文件句柄不是一步完成的,而是分多个步骤实现的。首先是由Mount安装协议取得该NFS服务器上的分层文件结构信息,并取得相应文件系统的根句柄。在得到一个远程文件系统的根句柄后,结合本地对文件名字解析的结果,可以调用NFS的远程过程,在当前远程文件系统根句柄下取出各个子目录的文件句柄返回,检查返回的文件句柄,得到最后的所要访问的文件句柄。得到文件句柄的流程图如下所示,它展示了当客户机要在服务器的分层结构中查找一个路径为/a/b/c的文件时,客户机和服务器之间所进行的信息交换。

以后对该文件的各种操作,就通过该文件句柄来实现了。各种操作可以参见前一小节上面所列出的NFS远程过程。

1.4 网络文件系统下层实现——远程过程调用(RPC)

由于NFS的底层实现是采用远程过程调用(RPC)来实现的。因此在这里,我们将先概述一下RPC的基本模型、机制以及SUN RPC的定义。在下一章中,我们将详细介绍NFS的Mount协议以及对文件操作的远程过程是如何用RPC来具体实现的。

1.4.1 RPC的概念模型

远程过程调用模型主要来自于传统编程语言中的过程调用机制。过程调用提供了一个强有力的抽象,它允许程序员将一个程序划分为一些小的、可管理的、易于理解的片段。它可以给出程序执行的概念性模型的简单明了的实现。

个单独的计算机上执行。

根据过程执行模型,单个控制线索流经所有过程。计算机从一个主程序开始执行,它将一直继续下去,直到遇到一个过程调用。这个调用使执行转入到某个指定的过程代码并继续执行,直到遇到一个return语句。因此在RPC中,一个远程过程调用把控制权传递给被调用的过程,把调用过程的执行挂起。而远程的服务器则实现这个过程,当执行完毕,它给客户机一个响应,这对应于过程模型的return。使控制权返回给调用者,被调用过程停止执行。这个过程是可嵌套的。

1.4.2 SUN RPC的定义

Sun Microsystems公司定义了一个特定形式的远程过程调用。它称为Sun RPC。它定义了调用者(客户机)发出的调用服务器中的某个远程过程的报文的格式、参数的格式,以及被调用过程返回给调用者的结果的格式。

Sun RPC通过定义一个远程执行环境而扩展了远程过程调用模型。它定义了一个远程程序,把它作为在远程机器上执行的软件的基本单元。每个远程程序对应于我们所设想的一个服务器,它包括一组远程过程以及全局数据。在一个远程程序中的所有过程都能共享它的全局数据。SUN Microsystems公司设计了一种外

部数据表示,它规定了在网络传输数据时如何表示成公共形式的数据。Sun的外部数据表示XDR已成为大多数客户机-服务器应用的一个事实上的标准。 RPC 远程过程调用的数据传输的数据必须遵循XDR标准。

Sun RPC标准说明,在某个计算机上执行的每个远程程序都必须分配一个唯一的32比特整数,调用者使用该整数来标识这个程序。并且,针对每个远程程序的整数型还有一个版本号,使程序可以不必获得一个新的程序号就能改变某个远程过程的细节。此外,SUN RPC为每一个给定的远程程序中的远程过程分配了一个整数标识符。因此,每个RPC报文通过一个三元组来标识某台给定计算机上的所期望的接受者,这个三元组是:

(prog, vers, proc)

在此,prog标识远程程序,vers表示抱文所要发往的程序的版本号,proc表示该远程程序中的某一个远程过程。

1.4.3 SUN RPC的传输层实现机制

1.4.3.1 通信语义

为保证RPC语义的实现,我们必须在良种可能中进行选择。一方面,为尽量使远程过程调用的行为像一个本地过程调用,RPC应该使用一种像TCP这样可靠的运输,而且应该对程序员保证可靠性。另一方面,为允许程序员使用高效率的、无连接的运输协议,远程过程调用机制应当支持用UDP这样的数据报协议进行通信。因为UDP传输的不可靠性,在传输过程中可能因为报文的丢失,使得调用者无法做出应答,而导致远程过程被多次调用。因此,选择UDP作为PRC应用传输协议的程序员,他们所构建的程序必须要能容忍零或多次执行语义。

在我们下一章的Linux源代码分析中,我们将看到,Linux对于RPC远程过程调用的实现是采用UDP作为它的传输层应用协议来进行的。目前的Linux系统中,并没有采用TCP协议来实现网络文件系统的传输层应用。Linux设计者在这方面的考虑应该是基于实现NFS系统传输的高效性,对于TCP协议的支持相信Linux将会在以后实现。

1.4.3.2 动态端口映射

在使用TCP或UDP协议进行远程数据传输的时候,需要指定一个服务器的

通信端口号。但是,SUN RPC引出了一个有趣的问题:因为它使用32位比特数来标识远程程序,而UDP和TCP运输协议使用16比特数的协议端口号来标识通讯端点,这就有可能超出协议端口的范围。因此,不可能将RPC程序号直接映射到协议端口号,因此RPC不能象其他通讯协议一样使用分配知名端口的协议。但是尽管RPC程序的潜在数量超过了分配知名端口的能力,但RPC和其他服务没有什么不同。在任意给定时间内,单个计算机仅仅执行少量的远程程序。因此,只要端口分配是临时的,每个RPC程序可以获得一个协议端口号,并且使用这个端口号进行通信。

PRC对于协议端口的获得是通过一个称之为端口映射器的机制来实现的。因为服务器端口映射是临时的,每个RPC程序在数据传输前可以获得一个协议端口号,并且使用这个传输端口进行通信。

然而,作为发起远程过程调用的客户机程序,除了知道它所希望与之联系的机器地址以及RPC程序号以外,它还必须在开始执行之后获得一个协议端口,否则不能直接联系远程程序。这种端口映射必须是动态的,因为如果机器重启动或者RPC程序再次开始执行,端口可能会改变。

ONC RPC机制包含了一个动态映射服务。提供RPC程序的每台机器维护着一个端口映射数据库,而且提供了一种允许调用者将RPC端口号映射为协议端口的机制。它在每台机器中用一个服务器维护这一个小数据库,这个服务器被称为RPC端口映射器。一个RPC程序一旦注册了自己,其他机器上的调用者就可以通过向端口映射器发送一个请求来找到它的协议端口。

1.4.4 一次RPC远程调用的具体流程

通过以上两小节的讨论,我们对RPC体系的实现从上到下有了一个概念上的认识。这一小节中,将具体说明一次远程过程调用的具体实现,从而加深对这部分实现机制的认识。

一个RPC远程过程调用的流程如下:

1.需要运行一个远程程序时,本地机器向端口映射器发出注册请求,将一

个三元组加到数据库:(RPC程序号,协议端口号,版本号)并分配

给该远程程序一个通信协议端口。

2.调用方发送RPC查找请求,调用TCP或UDP协议,将请求报文发送到

服务器端口映射器的知名端口,在给定一RPC程序号和版本号时查找其

协议端口。

3.端口映射器返回这个指定程序当前正在使用的协议端口号。

4.调用者在得到了该目标程序正在使用的端口号后,可以直接联系远程程

序了。此后,调用方将调用的远程过程的名称、类型、版本号、一些传

输的XDR数据结构,进行参数的序列化,构成RPC报文。在调用方和服务器之间实现通信传输。

2. Linux的NFS系统框架

NFS是由客户和服务器共同合作实现的:在客户一边,通过一些核心函数调用来使用远程文件系统;在服务器一边,由NFS服务器监听进程来提供文件数据。主要有两个监听进程moutd和nfsd,其中moutd用来监听客户的安装请求,并发送相应的应答信息,如客户端地址和服务器地址等;而nfsd进程用来监听客户端的读写文件请求并返回相应的文件数据。文件的访问对客户来说是完全透明的,并且NFS可以跨越各种服务器和主机平台进行。同其他文件系统在底层是通过访问磁盘不同,NFS在底层是通过RPC(远程过程调用)协议来实现文件访问的。

NFS的主要优点是可以将占用大量磁盘空间的或用户共享的数据只保存在一个NFS服务器上,其它主机要访问这些数据,只需通过NFS将其安装到本地目录进行透明的访问。所谓透明的访问,是指访问这些文件与访问本地的一般文件的用户界面是一致的,并不需要额外的命令。如下图:

2.1 源码分析环境

我们分析的Linux内核代码版本为2.2.5(套装系统为RedHat 6.0)。Linux从2.2.X版本开始,对内核中NFS部分的内容有了重大的改进。增加了很多内容,重写了很多函数,功能有了很大的改进。其中比2.0.34版本的内核的主要改进有:在内核中增加了NFS的Server端内容。而在2.0.34版本中Server端并不在内核中支持,需要外部Server程序。

将NFS与RPC的实现分开,使RPC可以不仅为NFS提供服务,还可以为其他网络协议提供服务。

显著增强了RPC的功能,增加了如RPC调用的调度、权限验证、端口映射器以及支持同步和异步调用两种方式等功能。

在这一章中,我们将主要介绍Linux下网络文件系统所用到的主要数据结构及他们之间的关系。在下一章开始,我们将详细阐述系统运作的流程。

2.2 Linux下NFS的体系结构

Linux下网络文件系统主要分为两个部分:NFS Client端、NFS Server端,即采用Client-Server体系结构。其中Client 方面主要负责处理用户对远程文件的操作请求,并把请求的内容按一定的包格式从网络发给文件所在的Server方面。而Server方面则接受Client方面的请求,调用本机的VFS的函数进行文件的实际操作,并把结果按一定格式返回给Client方面。而Client方面得到Server的返回结果,把它返回给用户。

这是Linux下网络文件系统的基本体系结构:

客户端服务器端

NFS体系结构

2.3 NFS的Client端

由上图所示,Client端从高层到底层由四部分组成:VFS、NFS、RPC、Socket。下面将介绍各个部分的实现以及他们之间的接口。

2.3.1 Client端的VFS层

Linux最大的特点之一是它支持多种文件系统,如:EXT、EXT2、XIA、MINIX、UMSDOS、MSDOS、VFAT、PROC、SMB、NCP、ISO9660、SYSV、HPFS、SFFS和UFS等等,甚至还支持NFS。它之所以能支持这么多的文件系统,是由于它在具体的文件系统上增加了一层抽象层:VFS文件系统。VFS文件系统将独立于具体文件系统的数据和操作集中在自身之中,并通过数据结构中的UNION类型和函数指针将具体的文件系统包容进来。这种分层的概念,使得Linux不仅可以有良好的兼容性,而且也使它有较大的可扩充性。

VFS文件系统是建立在具体文件系统上的一个抽象层次。它必须管理在Linux系统中的每一个具体的文件系统。为此,它维护着众多的数据结构,这些数据结构描述了整个文件系统和实际的安装上的文件系统。其中最主要的数据结构有super_block、inode、file、file_system_type、dentry等。在这些数据结构中,包含了一些与具体文件系统的接口,下面将结合NFS层逐个进行介绍这些数据结构及其和NFS的接口。

NFS的常数和文件模式

定义了六种基本常数来指明协议所用数组的大小。另外,象UNIX一样,NFS 假定每个文件或目录一个指明其类型和存取保护的模式(mode)。图23.7列出了NFS模式整数的单个比特及其含义。定义直接对应于UNIX的stat函数的返回值。

#define NFS_PORT 2049

#define NFS_MAXDATA 8192

#define NFS_MAXPATHLEN 1024

#define NFS_MAXNAMLEN 255

#define NFS_MAXGROUPS 16

#define NFS_FHSIZE 32

#define NFS_COOKIESIZE 4

#define NFS_FIFO_DEV (-1)

#define NFSMODE_FMT 0170000

#define NFSMODE_DIR 0040000 //这是个目录;类型是NFDIR

#define NFSMODE_CHR 0020000 //这是个字符专有文件;类型应该是NFCHR

#define NFSMODE_BLK 0060000 //这是个块专有文件:类型应该是NFBLK

#define NFSMODE_REG 0100000 //这是个普通文件;类型应该是NFREG

#define NFSMODE_LNK 0120000 //这是个符号连接,类型应该是NFLNK

#define NFSMODE_SOCK 0140000 //这是个有名的插口,类型应该是NFSOCK

#define NFSMODE_FIFO 0010000

NFS的调用返回值

协议定义一个常量枚举类型,被用于报告差错状态。每个远程调用都返回其中的一个值。该协议的集合命名为stat,如下:

enum nfs_stat {

NFS_OK = 0,

NFSERR_PERM = 1,

NFSERR_NOENT = 2,

NFSERR_IO = 5,

NFSERR_NXIO = 6,

NFSERR_EAGAIN = 11,

NFSERR_ACCES = 13,

NFSERR_EXIST = 17,

NFSERR_XDEV = 18,

NFSERR_NODEV = 19,

NFSERR_NOTDIR = 20,

NFSERR_ISDIR = 21,

NFSERR_INV AL = 22, /* that Sun forgot */

NFSERR_FBIG = 27,

NFSERR_NOSPC = 28,

NFSERR_ROFS = 30,

NFSERR_OPNOTSUPP = 45,

NFSERR_NAMETOOLONG = 63,

NFSERR_NOTEMPTY = 66,

NFSERR_DQUOT = 69,

NFSERR_STALE = 70,

NFSERR_WFLUSH = 99

};

NFS的文件类型:

NFS使用和UNIX相同的基本文件类型。它定义了服务器在指定文件类型时可使用的枚举值。

enum nfs_ftype {

NFNON = 0, //说明不是一个文件

NFREG = 1, //一般的数据文件

NFDIR = 2, //是一个目录文件

NFBLK = 3, //是一个块设备文件

NFCHR = 4, //是一个字符设备文件

NFLNK = 5, //是一个符号链接

NFSOCK = 6,

NFBAD = 7,

NFFIFO = 8

};

NFS的文件句柄:

在目前的linux版本中,文件句柄定义为一个32字节长度的数组。在Sun MicroSystem的NFS标准中,文件句柄分为许多个字段,其中有必要提及的是其中的随机生成的一个文件索引结点号。

文件生成号的使用主要出于对网络文件访问安全性的考虑出发。因为一旦客户机知道了远程文件系统服务主机的文件目录结构,以及产生文件句柄的方式,可以很容易地构造出某个指定路径上的文件句柄,并通过该句柄对远程文件系统进行访问。这样,就违背了网络访问的安全性原则,因此在标准的NFS文件系统中,当文件系统服务器收到客户机的访问请求时,除了返回相应文件的文件句柄以外,还动态地随机生成此文件对应的文件生成号,一般是一个32字节的字符串,提供给客户机。这样,以后客户机在访问服务器的文件系统时,通过检查文件句柄结构中所带的文件生成号是否匹配,就可以决定是否是一次合法的访问。这种机制保证了NFS文件系统远程访问的安全性。

struct nfs_fh {

char data[NFS_FHSIZE];

};

NFS的远程过程定义:

这里只定义了各个远程过程的程序号,具体每个过程的功能将在后面介绍。

#define NFS_PROGRAM 100003

#define NFS_VERSION 2

#define NFSPROC_NULL 0

#define NFSPROC_GETATTR 1

#define NFSPROC_SETATTR 2

#define NFSPROC_ROOT 3

#define NFSPROC_LOOKUP 4

#define NFSPROC_READLINK 5

#define NFSPROC_READ 6

#define NFSPROC_WRITECACHE 7

#define NFSPROC_WRITE 8

#define NFSPROC_CREATE 9

#define NFSPROC_REMOVE 10

#define NFSPROC_RENAME 11

#define NFSPROC_LINK 12

#define NFSPROC_SYMLINK 13

#define NFSPROC_MKDIR 14

#define NFSPROC_RMDIR 15

#define NFSPROC_READDIR 16

#define NFSPROC_STATFS 17

/* Mount support for NFSroot */

#ifdef __KERNEL__

#define NFS_MNT_PROGRAM 100005

#define NFS_MNT_VERSION 1

#define NFS_MNT_PORT 627

#define NFS_MNTPROC_MNT 1

#define NFS_MNTPROC_UMNT 3

#endif

NFS的文件属性结构:

NFS有一个获得关于某文件的信息的机制。在谈到文件信息时,NFS使用了

术语file attribute。结构nfs_fattr描述了NFS所提供的文件属性。

struct nfs_fattr {

enum nfs_ftype type; //文件类型

__u32 mode; //文件保护位

__u32 nlink;

__u32 uid;

__u32 gid;

__u32 size;

__u32 blocksize;

__u32 rdev;

__u32 blocks;

__u32 fsid;

__u32 fileid;

struct nfs_time atime;

struct nfs_time mtime;

struct nfs_time ctime;

};

file_system_type结构(在fs.h中定义)

在Linux中,当装入一个文件系统模块时,首先要向系统核心注册这个文件系统类型;当卸下一个文件系统模块时,又要向系统核心注销这个文件系统类型。文件系统类型的注册和注销就反映在由结构file_system_type构成的单向链表中——即链表上每一file_system_type节点就反映了一种已注册的文件系统类型的有关信息。它的定义为:

struct file_system_type {

/* 函数指针,当安装此类型的文件系统时,就由VFS调用此例程从设备上将此文件系统的superblock读入内存中*/

struct super_block *(*read_super) (struct super_block *, void *, int);

/* 文件系统类型的名称*/

c onst char *name;

/* 此文件系统类型的属性 */

int fs_flags;;

/* 指向下一个已注册的文件系统类型 */

s truct file_system_type * next;

};

在NFS中,此结构在init_nfs_fs(fs/nfs/inode.c)函数中初始化。其中super_block初始化为指向函数nfs_read_super,负责在mount网络文件系统时读入NSF的SuperBlock信息。fs_flags初始化为0,说明此文件系统不需要设备(~FS_REQUIRES_DEV),需要目录缓存(~FS_NO_DCACHE),需要进行目录缓存的预读(~FS_NO_PRELIM)。

super_block结构(在fs.h中定义)

superblock即文件系统的超级块。它包含了文件系统的许多重要信息,如文件系统的结构、组织、操作以及资源信息等。在super_block数据结构中,主要由两方面和具体文件系统进行接口。以下是super_block与NFS接口的定义:struct super_block {

/* 其他数据项*/

..................

/* 超级块操作 */

struct super_operations *s_op;

union {

/* 其他文件系统的超级块信息 */

..........................

struct nfs_sb_info nfs_sb;

} u;

};

在网络文件系统中,s_op指向函数表nfs_sops(在fs/nfs/inode.c中定义),而nfs_sb_info(在nfs_fs_sb中定义)的定义为:

struct nfs_sb_info {

/* server信息*/

struct nfs_server s_server;

/* 远方根节点的NFS文件句柄*/

struct nfs_fh s_root;

};

inode结构(在fs.h中定义)

文件系统是由单个的文件所构成的,每一个文件都必须由且只能由唯一的

inode来标识,即inode包含了此文件所有的关键信息:所在设备、类型、大小、时间属性、在设备上的位置、用户属性等等。在inode数据结构中,主要由两方面和具体文件系统进行接口。以下是inode与NFS接口的定义:

struct inode {

/* 其他数据项*/

..................

struct inode_operations *i_op;

union {

/* 其他文件系统的inode信息 */

..........................

struct nfs_inode_info nfs_i;

} u;

};

在网络文件系统中,i_op指向函数表nfs_file_inode_operations(在fs/nfs/file.c 中定义),而nfs_inode_info(在nfs_fs_i中定义)的定义为:

struct nfs_inode_info {

/* 此数据结构保证命名管道在NFS中能够正常工作*/

struct pipe_inode_info pipeinfo;

/* 各种属性*/

unsigned short flags;

unsigned long read_cache_jiffies;

unsigned long read_cache_mtime;

unsigned long attrtimeo;

/* 未写回页的链表*/

struct nfs_wreq * writeback;

};

file结构(在fs.h中定义)

一个文件在打开以后,在系统中就要为它建立起相应的数据结构。主要有两个:一是在当前进程的打开文件描述符中为它分配一项,二是分配一个文件结构(file struct,即FILE结构),并将文件描述符与该结构对应起来。FILE结构再指向该文件的inode。因此file相当于在文件描述符和inode结构中加了一层。在file数据结构中,定义了一个指向文件操作的函数表指针f_op。在nfs中,这个指针指向函数表nfs_file_operations。

2.3.2 Client端的RPC层

在讲NFS层之前,首先介绍一下Linux中RPC的实现方法和具体的数据结构。

如前所述,在Linux的2.2.X版本以后,SUN RPC作为单独的一个模块被独立了出来,它的主要代码位于net/sunrpc目录下面。

远程程序、远程过程

在Linux中,远程程序和远程过程主要是由三个数据结构来维护的。他们是:rpc_program、rpc_version和rpc_procedure。下面是他们的结构定义及结构项解释:

struct rpc_program { /*远程程序*/

char * name; /* 远程程序名*/

u32 number; /* 程序号*/

unsigned int nrvers; /* 版本个数*/

struct rpc_version ** version; /* 指向含有各个版本信息的数组指针*/

struct rpc_stat * stats; /* 统计信息*/

};

struct rpc_version { /* 版本信息*/

u32 number; /* 版本号*/

unsigned int nrprocs; /* 远程过程数*/

struct rpc_procinfo * procs; /* 远程过程数组*/ };

struct rpc_procinfo { /* 远程过程信息*/

char * p_procname; /* 远程过程名*/

kxdrproc_t p_encode; /* XDR译码函数*/

kxdrproc_t p_decode; /* XDR 解码函数*/

unsigned int p_bufsiz; /* 请求缓存大小*/

unsigned int p_count; /* 调用数*/

};

RPC客户结构

Linux将关于RPC客户机的高层信息集中在一个rpc_clnt结构(在

NFS文件系统简介及原理

NFS文件系统简介及原理 什么是文件系统,NFS文件系统又是什么?简单的说,文件系统就是通过软件对磁盘上的数据进行组织和管理的一种机制,对其的一种封装或透视。NFS,Network File System。顾名思义,网络文件系统,即通过网络,对在不同主机上的文件进行共享。 为什么需要使用NFS呢?在生产环境,我们很少使用单机部署应用,因为单机存在单点故 障,一旦宕机,将无法为前端业务提供服务,这是客户无法容忍的。现在提倡的高可用及7*24服务,是我们追求的目标。对于一些小的应用,双机成为了主流。我们来看一种简单集群场景,应用分别部署在A及B上,前端通过F5或着web服务器访问应用。如下 图: 那么当客户端发出一个请求时,F5根据一定的机制进行转发,有可能有A服务器进行响应,也有可能由B服务器进行响应。而在web应用中上传一些静态文件是很常见的一种功能,如图片。假设用户在某一时间,上传了一张照片到A服务器上,那么下次访问时,被F5路由到了B服务器上,由于B服务器上并没有存储上传的照片,所以将造成用户无法看到自己上传的照片。 那么很容易想到,是不是可以把文件上传到一个公用的服务器上呢?这样不管访问的是A

还是B,读、取文件都只存在一份。答案是肯定的,这个公用的服务器我们也称之为文件服务器。上面的架构就演变成了下面的架构: 说了这么多,跟NFS又有什么关系呢?NFS提供了一种机制,可以让A、B访问C中的一个共享目录,就像是操作本地文件一样。既然NFS有这么牛逼的能力,又有什么原因不去深入了解一下呢?注:此处当然也可以通过sftp或ftp进行文件上传和下载。 NFS的原理:我们用一个图来进行说明: 首先:NFS包括两部分,服务端及客户端 由于NFS服务功能很多,会有很多端口,这些端口还有可能不固定,那么客户端就无法与服务器进行通信,因为程序间通信必须通过端口(tcp/udp都是端到端通信),那么就需要一个

(完整版)linux文件系统管理-权限管理实验4报告

实验报告 课程Linux系统应用与开发教程实验名称linux文件系统管理-权限管理(高级设置) 一、实验目的 1、掌握Linux文件系统权限的设置 2、掌握linux用户帐号与组管理 3、掌握linux 文件共享的设置方法 4、掌握linux 文件共享的权限设置方法 二、实验内容 1、使用root帐号通过系统提供的6个虚拟控制台登陆到linux,或在x-windows开启一个终端。 2、完成以下的实验内容 (1)、假设你是系统管理员:现要在公司linux服务器系统中新增一些用户与一个用户组。 ?使用groupadd account 添加一个名为account的组 ?使用useradd -G account acc-user1,(该命令将添加一个用户名为acc-user1的用户, 同时会建立一个与用户名同名的私有组(该私有组为用户的默认组,这个组中只有一个用户名),并把该用户将加入account的标准组,同时,按同样的方法建立acc-user2、acc-user3、acc-user4。 ?建立用户后,请使用x-window中的用户与组管理工具查看用户与组建立情况,检查用户与组的归属情况。 (2)、开启多个控制台,分别使用acc-user1、acc-user2、acc-user3登陆系统(可以在控制台分别登陆,也可以在X-windows中多开几个终端程序,默认使用root登陆,然后使用su命令通过切换用户的方式登陆,其语法为“su - user-name”,提示可以在登陆成功后运行命令“id”查看当前登陆的用户属于哪些组,当前的默认组是什么?) (3)、为account组建立一个公共共享目录/home/account-share,满足以下的权限设定要求,以及设置何种的umask: ?该目录的拥有者为acc-user1,所属组为account。 ?在该目录下建立一个/home/account-share/full-share的子目录,修改该目录的权限,使得account组的成员均能在对该目录有完全控制权限,account组外的其他用户没有任何权限,即account组的成员都可以在该目录下建立文件,同时在该子目录full-share下建立的文件,只有文件建立者有权限删除,并且每个用户在该子目录full-share下建立的文件也能自动与该account组成员可读共享。 ?在/home/account-share/为每个用户建立一个与用户名同名的子目录(如/home/account-share/acc-user1为用户acc-user1的目录,其拥有者为acc-user1,所在的组为account),配置该子目录的拥有者有完全控制权限,而同组用户只能读取,同时在用户在该目录下建立的文件,可供同组用户读。 (4)、考虑完成以上的共享目录权限设置,应注意哪些设置。包括目录的权限,目录的拥有者,目录所在的组,具体文件的权限,umask设置等。 (5)、实验报告应体现出使用不同身份的用户对所配置目录的访问测试过程。 三、实验环境 安装有vmware或visual pc软件的window主机,系统中有提供turbolinux或redhat的硬盘

Linux文件系统分析

Linux文件系统分析 一、什么是文件系统 . 文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点;一旦文件系统被挂载。文件系统是在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区组织文件的方法,如NTFS或FAT;文件系统涉及两个非常独特的事情,目录树或在磁盘或分区上文件的排列;文件系统是基于操作系统的,建立在磁盘媒质上的可见体系结构,例如这种结构对于一个Unix用户来说可以用ls 或其它工具可以看到;文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命名、存储、组织及取出的方法;在计算机业,一个文件系统是有组织存储文件或数据的方法,目的是易于查询和存取。文件系统是基于一个存储设备,比如硬盘或光盘,并且包含文件文件物理位置的维护;也可以说文件系统也是虚拟数据或网络数据存储的方法。 二、常见的文件系统 Linux系统核心支持十多种文件系统类型:jfs、 ReiserFS、ext、ext2、ext3、iso9660、xfs、 minx、msdos、umsdos、Vfat、NTFS、Hpfs、Nfs、smb、sysv、proc等。这里我们对最常用的几个文件系统的发展情况和优缺点作详细介绍:ext、ext2、ext3、jsf、、xfs、ReiserFS。一、 ext ext是第一个专门为Linux的文件系统类型,叫做扩展文件系统。它在1992年4月完成的。它为Linux的发展取得了重要作用。但是在性能和兼容性上存在许多缺陷。现在已经很少使用了。二、 ext2 ext2是为解决ext文件系统的缺陷而设计的可扩展的高性能的文件系统。又被称为二级扩展文件系统。它是在1993年发布的,设计者是Rey Card。ext2是Linux文件系统类型中使用最多的格式。并且在速度和CPU利用率上较突出,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。Ext2 可以支持256字节的长文件名,其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的Intel x86兼容处理器的系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 6384GB。尽管Linux可以支持种类繁多的文件系统,但是2000年以前几乎所有的Linux发行版都用ext2作为默认的文件系统。 ext2的缺点:ext2的设计者主要考虑的是文件系统性能方面的问题。ext2在写入文件内容的同时并没有同时写入文件的meta-data (和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的meta- data。这样若出现写入文件内容之后但在写入文件的meta-data之前系统突然断电,就可能造成在文件系统就会处于不一致的状态。在一个有大量文件操作的系统中出现这种情况会导致很严重的后果。另外但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,尽管文件系统的容量上限为 6384G但是实际上能使用的文件系统容量最多也只有 2048GB。三、 ext3 ext3是由开放资源社区开发的日志文件系统,主要开发人员是Stephen tweedie。ext3被设计成是ext2的升级版本,尽可能地方便用户从ext2fs向ext3fs迁移。ext3在ext2的基础上加入了记录元数据的日志功能,努力保持向前和向后的兼容性。这个文件系统被称为ext2

几种Nand flash文件系统的对比

几种Nand flas文件系统的对比 1.来源:NLE-FFS: A Flash File System with PRAM for Non-linear Editing For thesedevices, NAND flash memory has became the most attractive storage medium due to outstanding characteristics such as its increased capacity, low power consumption, small size and light weight. For the efficient management of NAND flashmemory, several flash file systems have been proposed, including JFFS2, YAFFS2, CFFS and PFFS. several file systems such as MNFS,NAMU and ScaleFFS have been designed for real-time recording /playback and large-capacity storage. A. YAFFS2 YAFFS2 is the most widely employed file system for NAND flash memory. YAFFS2 essentially saves the object ID (file ID) and the chunk (page) number in the spare region to show the offset of a page and the owner file of the page. Therefore, YAFFS2 reads the spare regions and object headers to establish the metadata in memory. Although YAFFS2 is designed to support NAND flash memory, it has scalability problems. With YAFFS2, the location of the updated page is saved in NAND flash pages or spare regions, as shown in Fig. 10 (a); hence, the file system

NFS-网络文件系统实现资源共享

NFS -网络文件系统实现资源共享 NFS 会经常用到,用于在网络上共享存储。假如有三台机器 netbook 、myhost1、myhost2,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些图片分别放到netbook 、myhost1、myhost2。但是使用NFS 只需要放到netbook 上的一个目录中(如:/root/netbook ),然后共享给myhost1、myhost2即可。访问的时候,metbook 主机的用户直接访问/root/netbook 目录即可,而主机myhost1、myhost2则可以通过网络间接地访问该目录的。实现方式如下: 一、为三台主机配置网络信息(以提供照片共享的主机为例) 1.分别修改各主机的IP 地址 [root @localhonst ~]#vi /etc/sysconfig/network -scripts/ifcfg-eth0 2.分别修改各主机的机器名 [root @localhonst ~]#vi /etc/sysconfig/network 3.分别修改各主机的本机路由信息 [root @localhonst ~]#vi /etc/hosts 4.重启计算机,以使配置生效 [root @localhonst ~]#init 6 二、配置NFS 服务器 1.启动系统的NFS 服务功能 方法一: [root @netbook ~]#service nfs start 方法二: [root @netbook ~]# /etc/init.d/nfs start

方法三: [root @netbook ~]#rfsysv NFS 服务需要portmap 服务的支持,在启动NFS 之前,需要启动portmap ,否则将会出现如下的提示。 启动portmap : [root @netbook ~]#service portmap start “”如果允许任何访问用户具有读写权限,则exports 文件的内容可配置为:

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

linux中如何挂载NFS文件

如何挂载NFS开发环境的方法步骤 ———mount命令及umount命令的用法详解(附图说明)Step1:设置好网络 主机IP:222.204.59.185 网关:192.168.50.1 子网掩码:255.255.255.0 开发板IP:222.204.59.250 网关:192.168.50.1 子网掩码:255.255.255.0 目的是使得两个处于同一个网段。 Step2:在主机的linux中设置共享目录 运行命令 #gedit /etc/exports 编辑nfs 服务的配置文件(注意:第一次打开时该文件是空的),添加以下内容: /root/share *(rw,sync,no_root_squash) 保存退出 其中: /root/share表示nfs 共享目录,它可以作为开发板的根文件系统通过nfs 挂接; *表示所有的客户机都可以挂接此目录 rw表示挂接此目录的客户机对该目录有读写的权力 no_root_squash表示允许挂接此目录的客户机享有该主机的root 身份 使用showmount –e命令可以查看你的挂载点在哪,不加参数-e显示的是网络地址。 在开发板上的/mnt下建立新的nfs文件(可以放在其他地方,名字除了nfs也可以去其他的名字) Step3:通过命令启动和停止nfs 服务 在命令行下运行: #/etc/init.d/nfs restart 这将启动nfs 服务,可以输入以下命令检验nfs 该服务是否启动。 Step4:在minicom中使用mount命令(也可以在超级终端中使用) 确定 进入minicom界面:

# mount -t nfs 222.204.59.185: /root/share /mnt/nfs 上图为minicom中显示的linux(也即开发板中的) 如果提示:mount:RPC:unable to receive; errno =No route to host 说明你主机linux中的防火墙没关闭在主机linux 中使用一下命令就可以解决:#service iptables stop。在次使用mount命令就ok了。 注意:此处222.204.59.185主机的ip地址,使用mount命令是在超级终端或minicom中使用,而不是在主机的linux系统中。在取消挂载命令时也是在超级终端或minicom中使用,具体用法是:#umount /mnt/ 如果没有出现错误信息, 您将可以浏览到/mnt 目录中的内容和/root/share是一致的。 取消挂载: 使用这个命令可以停止nfs 服务: #/etc/init.d/nfs stop 检查nfs服务器是否开启: #service nfs status 启对应的2个服务:#service portmap restart #service nfs restart 检查防火墙看是否屏蔽了nfs端口:#service iptables stop #service iptables status

NOSLinux 【单元测验】Linux文件系统与磁盘管理(2)

【单元测验】Linux文件系统与磁盘管理(2) 回顾第 1 次试答 结束回顾 开始时间2012年03月 22日星期四 08:18 完成于2012年03月 22日星期四 08:23 耗时 5 分钟 1 秒 分数6/16 成绩37.5超出最大限度 100(38%) 反馈要加油啰 Question 1 分数: 1 以下命令返回的结果是什么?ln file1 file2 选择一个答案 A. file2将成为file1的符号链接 B. 命令格式错误,需要使用参数 C. 无论file1的尺度是多少,file2将固定为5字节 D. file1和file2有相同的索引节点 链接文件分为硬链接(不加参数)和符号链接(加-s参数) 硬链接内容和原文件保持同步,他们具有相同的索引节点信息(磁盘的具体物理位置),移动、删除或修改他们中的任何一个都不影响通过另一个访问该文件 符号链接只是快捷方式,原文件删除,将导致该符号链接失效 正确 这次提交的分数:1/1。 Question 2 分数: 1 以下哪个命令可将file1复制给file2? 选择一个答案 A. cat file1 > file2 B. copy file1 file2 C. cat file1 file2> file1 D. cp file | file2

cp命令可以复制文件,格式为 cp 源文件目标文件,无需加管道符号“|” cat本来是输出文件内容到屏幕,加了“>”重定向符号后也可以将文件内容重定向输出指定文件中,这样就可以实现复制文件的目的 正确 这次提交的分数:1/1。 Question 3 分数: 1 如果newdir/file2文件不存在,但是目录newdir已存在,mv file1 newdir/file2命令将有什么结果? 选择一个答案 A. file1将被复制到newdir并命名为file2 B. 将报错,因为以上不是有效的命令 C. file1将被移动到newdir并重命名为file2 D. file1将被删除 mv可以更名也可以移动,具体看命令参数 mv 文件1 文件2——将文件1更名为文件2 mv 目录1 目录2——将目录1更名为目录2 mv 文件1 目录2——将文件1移动到目录2 mv 文件1 目录1/文件2——将文件1移动到目录1,并更名为文件2 正确 这次提交的分数:1/1。 Question 4 分数: 1 如何从文件中查找显示所有以“#”打头的行? 选择一个答案 A. grep -n "#" file B. find "\#" file C. grep -v "#" file D. wc -l "#" find查找的对象和结果都是文件 grep查找的对象和结果是输出结果中的行 -c 显示符合条件的行数 -i查找时不区分大小写 -n显示行号

嵌入式Linux根文件系统制作

实训项目四-嵌入四Linux系统根文件系统制作一. 项目实施目的 了解 UP-CUP2440 型实验平台Linux 系统下根文件系统结构 掌握根文件系统的搭建过程 掌握busybox、mkcramfs等工具的使用方法 二. 项目主要任务 使用busybox生成文件系统中的命令部分,使用mkcramfs工具制作CRAMFS 格式的根文件系统。 分析根文件系统etc目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程 三. 基本概念 1.文件系统基本概念 Linux的一个最重要特点就是它支持许多不同的文件系统。这使Linux非常灵活,能够与许多其他的操作系统共存。Linux支持的常见的文件系统有:JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。随着时间的推移, Linux支持的文件系统数还会增加。Linux是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。该树形层次结构把文件系统表示成一个整个的独立实体。无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。该个目录被称为装配目录或装配点。在文件系统卸载时,装配目录中原有的文件才会显露出来。在Linux 文件系统中,文件用i节点来表示、目录只是包含有一组目录条目列表的简单文件,而设备可以通过特殊文件上的I/O 请求被访问。 2.常见的嵌入式文件系统 嵌入式Linux系统一般没有大容量的磁盘,多使用flash存储器,所以多采用基于Flash(NOR和NAND)的文件系统或者RAM内存的文件系统。 (1)Flash根据结构不同分为 NOR Flash和NAND Flash。基于flash的文件系统主要有: jffs2:RedHat基于jffs开发的文件系统。

Linux 0.1.1文件系统的源码阅读

Linux 0.11文件系统的源码阅读总结 1.minix文件系统 对于linux 0.11内核的文件系统的开发,Linus主要参考了Andrew S.Tanenbaum 所写的《MINIX操作系统设计与实现》,使用的是其中的1.0版本的MINIX文件系统。而高速缓冲区的工作原理参见M.J.Bach的《UNIX操作系统设计》第三章内容。 通过对源代码的分析,我们可以将minix文件系统分为四个部分,如下如1-1。 ●高速缓冲区的管理程序。主要实现了对硬盘等块设备进行数据高速存取的函数。 ●文件系统的底层通用函数。包括文件索引节点的管理、磁盘数据块的分配和释放 以及文件名与i节点的转换算法。 ●有关对文件中的数据进行读写操作的函数。包括字符设备、块设备、管道、常规 文件的读写操作,由read_write.c函数进行总调度。 ●涉及到文件的系统调用接口的实现,这里主要涉及文件的打开、关闭、创建以及 文件目录等系统调用,分布在namei和inode等文件中。 图1-1 文件系统四部分之间关系图

1.1超级块 首先我们了解一下MINIX文件系统的组成,主要包括六部分。对于一个360K软盘,其各部分的分布如下图1-2所示: 图 1-2 建有MINIX文件系统的一个360K软盘中文件系统各部分的布局示意图 注释1:硬盘的一个扇区是512B,而文件系统的数据块正好是两个扇区。 注释2:引导块是计算机自动加电启动时可由ROM BIOS自动读入得执行代码和数据。 注释3:逻辑块一般是数据块的2幂次方倍数。MINIX文件系统的逻辑块和数据块同等大小 对于硬盘块设备,通常会划分几个分区,每个分区所存放的不同的文件系统。硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。分区表中得信息指明了硬盘上每个分区的类型、在硬盘中其实位置参数和结束位置参数以及占用的扇区总数。其结构如下图1-3所示。 图1-3 硬盘设备上的分区和文件系统 对于可以建立不同的多个文件系统的硬盘设备来说,minix文件系统引入超级块进行管理硬盘的文件系统结构信息。其结构如下图1-4所示。其中,s_ninodes表示设备上得i节点总数,s_nzones表示设备上的逻辑块为单位的总逻辑块数。s_imap_blocks 和s_zmap_blocks分别表示i节点位图和逻辑块位图所占用的磁盘块数。 s_firstdatazone表示设备上数据区开始处占用的第一个逻辑块块号。s_log_zone_size 是使用2为底的对数表示的每个逻辑块包含的磁盘块数。对于MINIX1.0文件系统该值为0,因此其逻辑块的大小就等于磁盘块大小。s_magic是文件系统魔幻数,用以指明文件系统的类型。对于MINIX1.0文件系统,它的魔幻数是0x137f。

网络文件系统

网络文件系统 网络文件系统,英文Network File System(NFS)。是由SUN公司研制的UNIX表示层协议(pressentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。 ①提供透明文件访问以及文件传输; ②容易扩充新的资源或软件,不需要改变现有的工作环境; ③高性能,可灵活配置。 [1]网络文件系统(NFS)是文件系统之上的一个网络抽象,来允许远程客户端以与本地文件系统类似的方式,来通过网络进行访问。虽然NFS 不是第一个此类系统,但是它已经发展并演变成UNⅨ? 系统中最强大最广泛使用的网络文件系统。NFS 允许在多个用户之间共享公共文件系统,并提供数据集中的优势,来最小化所需的存储空间。 NFS与以往一样有用并在不断演变 网络文件系统(NFS)从1984 年问世以来持续演变,并已成为分布式文件系统的基础。当前,NFS(通过pNFS 扩展)通过网络对分布的文件提供可扩展的访问。探索分布式文件系背后的理念,特别是,最近NFS 文件进展。 NFS 的简短历史 第一个网络文件系统—称为File Access Listener —由Digital Equipment Corporation(DEC)在1976 年开发。Data Access Protocol(DAP)的实施,这是DECnet 协议集的一部分。比如TCP/IP,DEC 为其网络协议发布了协议规范,包括DAP。 NFS 是第一个现代网络文件系统(构建于IP 协议之上)。在20 世纪80 年代,它首先作为实验文件系统,由Sun Microsystems 在内部完成开发。NFS 协议已归档

linux总结

1软件通常分为系统软件、应用软件、支撑软件 2 操作系统是用户与计算机硬件之间的界面,它是控制、管理计算机系统内各种硬件和软件资源,有效的组织多道程序运行的系统软件。 3 Linux系统吧计算机系统中的硬件资源和软件资源有机地结合在一起,从而提供丰富的功能,包括:控制硬件、管理资源、提供用户接口,处理输入/输出、监视系统、通信。 4 Linux的优点:1与UNIX系统兼容 2自由软件和源码公开 3 性能高和安全性强 4 便于制定和再开发 5 互操作性高 5 Linux 有俩种版本:核心(Kernel)版本和发行(Distribution)版本 6 Linux核心版本根据约定,若版本号为奇数,则表示该版本加入新内容,但不一定稳定,为测试版本。若版本号为偶数,则表示这是一个可以使用的稳定版本 7 安装红旗Linux需要俩个必备的分区,即一个根文件系统分区(类型为ext3,ext2或reiserfs)和一个交换分区(类型为swap) 8 Linux操作系统支持以下文件类型:普通文件、目录文件、设备文件和符号链接文件。 9 设备文件除了在文件I节点中存放属性信息外,他们不包含任何属性信息外,它不包含任何数据,系统利用它们来标记各个设备驱动器 10 符号链接文件时一种特殊文件,提供对其他文件的参照 11 cp命令将源文件或目录复制到目标文件或目录中 12 rm命令删除文件或目录 13 mv命令对文件或目录重新命令,或者将文件从一个目录移到另一个目录中。 14 wc命令统计指定文件的字节数、字数、行数,并将统计结果显示出来 15 绝对路径名和相对路径名的联系与区别 联系:当为命令指定文件路径名是,要指定俩种路径中一种 区别:绝对路径名总是以斜线字符(/)开头 相对路径不能以斜线字符开头 16 硬链接:建立硬链接时,在别的目录或本目录中增加目标文件的一个目录项,这样的一个文件就登记在多个目录中 17 符号链接(软链接)是将一个路径名链接到一个文件,这些文件是一种特别类型的文件 18 软硬链接的区别:1软链接建立了一个新文件而硬链接没有建立新文件 2 软链接没有硬链接的限制,可以对目录文件建立软链接,也可以在不同文件系统之间建立软链接 19 chgrp命令改变文件或目录所属的用户组 20 chown命令改变某个文件或目录的所有者和所属的组 21 ps命令查看当前系统中运行的进程信息 22 kill命令用来终止一个进程的运行 23 vi编辑器三中工作方式:命令方式、插入方式、ex转义方式 24 退出vi的命令 :wq :ZZ :x :q! 四种 25 执行shell脚本的方式: 1 输入定向到shell脚本 2 以脚本名作为bash 参数 3 将shell脚本的权限设置为可执行 26 名称补全的方法是输入目录或文件名的开头部分,然后按Tab键 27 通配符用于模式匹配(四种 * ? [字符组] !) 27 由双引号括起来的字符除($ ‘ \)均作为普通字符对待

Windows下NFS Server搭建和使用

Windows下NFS Server搭建和使用 Revision History 1.NFS简介 NFS是Network File System的简写,即网络文件系统。NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。NFS就是一种Linux系统或Unix系统下的共享文件服务,类似于windows共享。NFS 服务器可以看作是一个文件服务器,它可以让你的PC通过网络将远端的NFS 服务器共享出来的文件挂载到自己的系统中,在客户端看来使用NFS的远端文件就象是在使用本地文件一样。 2.NFS测试所需设备和条件 Windows2008 PC1台作为NFS server Windows2008系统光盘 Windows7 PC1台作为NFS Client 3.NFS Server搭建 用装有Windows2008系统的PC作为NFS server 3.1安装NFS Server 1)插入Windows2008系统光盘,点击开始->管理工具->服务器管理器,在左边的树中选中” 功能”项,右边的窗口中会列出功能的详细信息,点击”添加功能”,如图1所示

图1 2)进入添加功能向导窗口,远程服务器管理工具->文件服务工具->勾选网络文件系统服务 工具,如图2所示,点击下一步

图2 3)点击安装,开始安装,如图3~4所示 图3

图4 4)安装完成后,点击关闭,如图5所示 图5

5)添加角色服务,在服务器管理器的左边的树中选中”角色”, 右边会列出角色的详细信息, 点击”添加角色”,如图6所示 图6 6)进入添加角色向导,点击下一步,如图7所示 图7

nfs起根文件系统

1为什么要制作nfs起根文件系统 制作用于mini2440开发板使用的内核,并使用nfs起根文件系统。 2应用arm平台的linux2.6.29内核。 首先清理内核中间文件,配置文件 命令#cd /home/guoqian/4-3-1 #cd linux-2.6.29 #make distclean 3选择参考配置文件 为了使制作的内核支持nfs起根文件系统,选择config-mini2440作为配置文件。 修改配置文件CMDLINE,修改代码如下: ******************************************************************************* CMDLINE=”root=/dev/nfs nfsroot=192.168.14.2:/nfsroot/rootfs ip=192.168.1.55 rw console=ttySAC0 mem=64M” ******************************************************************************* 解释:CMDLINE:命令行启动参数定义了内核挂载根文件系统的方式 (1)root=/dev/nfs →表示内核采用nfs方式起根文件系统 (2)nfsroot=192.168.14.2:/nfsroot/rootfs →表示nfs起的根文件系统位于nfs服务器/nfsroot/rootfs目录,服务器IP地址为192.168.14.2 (3)ip=192.168.1.55 →开发板IP地址,要求与服务器IP地址在同一网段 (4)rw →文件系统可读可写 (5)console=ttySAC0 mem=64M →ttySAC0作为控制台,内存64M 4配置内核

使用uboot去挂载根文件系统

1、根文件系统的制作 1)创建根文件系统主目录: mkdir rootfs 2)创建根文件系统的子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp var 3)然后创建usr下的子目录 mkdir usr/bin usr/lib usr/sbin lib/modules 4)创建设备文件 内核在引导时设备节点console,null必须存在 cd dev/ 注:该目录为/mini2440/nfsroot/rootfs 下的dev目录mknod –m 666 console c 5 1 mknod -m 666 null c 1 3 c:表明类型为字符设备 第一个数字(5,1):主设备号 第二个数字(1,3):次设备号 这两个设备文件设备号是固定的 5)安装etc etc目录主要是一些启动时的脚本文件一般不需要修改 tar etc.tar.gz –C /xxx/rootfs

这个命令可能不给用改为: tar xvzf etc.tar.gz –C /xxx/rootfs 6)编译内核模块 内核模块保存在lib下面的module下 配置内核:*直接编译到zimage m不链接到zimage而是编译成模块到.o就停住 进入Linux内核目录(linux-2.6.32.2) make modules ARCH=arm CROSS_COMPILE=arm-linux- 添加了ARCH=arm表示现在编译的是arm架构的内核 CROSS_COMPILE=arm-linux-表示使用交叉编译工具链 安装内核模块到根文件系统: make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs 7)配置busybox 因为Linux很多命令都是通过软连接实现的,所以无法直接将这些命令复制到根文件系统中。Busybox是一个工具集合,根文件系统很多命令都可以通过busybox编译得到,如命令ls,cd,mkdir。 Busybox相当于一个命令解析器,根文件中命令被软连接到 busybox,由busybox进行命令解析。 a) 解压busybox tar xvzf busybox-1.13.3 b) 配置busybox

详细分析Linux文件系统格式优劣

?摘要:Linux支持多种文件系统,包括ext2、iso9660、jffs、ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System) ?标签:文件系统 ?Linux由于其开源安全特性正在被多数企业所接受。Linux支持很多种文件系统,ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了另一个文件系统VFS(Virtual File System)。下面我们就分析一下他的各种文件系统格式的特点 基于RAM的文件系统 (1)Ramdisk Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。 在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。 (2)ramfs/tmpfs Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS 本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。 Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。 Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。 Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。 3.网络文件系统NFS(NetworkFileSystem) NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS 的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。 附录:NOR闪存与NAND闪存比较

Hi3518内核和文件系统烧写以及nfs挂载

Hi3518内核和文件系统烧写以及NFS挂载

修改履历

第一步编译内核和文件系统 文档说明:涉及到目录的请根据自己的实际情况进行更改,本文档仅根据笔者的测试进行举例说明。 1 安装交叉编译器 cd arm-hisiv100nptl-linux ./cross.install 说明:3518e推荐使用100nptl进行编译,arm-hisiv100nptl-linux-(使用uclibc库,uclibc 工具链支持全规格版本和小型化版本 )arm-hisiv200-linux-(glibc 库glibc 工具链只支持全规格版本),实验时没有使用hisiv200,不确定会出什么问题,不推荐使用。 2 编译步骤 cd ./linux-3.0.y ./mk3518.sh mk3518.sh 脚本里面包含了编译linux内核所需的所有的命令,具体看mk3518.sh文件,编译成功将生成在目录arch/arm/boot/uImage文件,这个就是要烧录到板子上的 注意:大小大约为1M。大于1M也许会出问题,在实验前期都是大于1M,烧录的时候出问题。 制作rootfs文件系统,使用的是最新的squashfs只读文件系统,使用的工具为mksquashfs,目录squashfs4.2为这个工具的代码 rm ./rootfs.squashfs //仅仅为了删除之前存在的文件系统,如果没有,可不执行这一步。 ./mksquashfs ./rootfsrootfs.squashfs -b 256K cp ./rootfs.squashfs ./tftpboot //可不用命令,自己拷贝,黏贴,文件夹根据自己实际情况所定。 生成的rootfs.squashfs这个就是要烧录到板子上的文件 注意:生成的文件大约为1.5M 地址空间说明 | 256K | 1M | 1.5M | |------------|---------------|-----------------------| | boot | kernel | rootfs |

相关主题
文本预览
相关文档 最新文档