Linux 0.1.1文件系统的源码阅读

Linux 0.1.1文件系统的源码阅读
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。

图 1-4 MINIX超级块结构

对于超级块来说有两个特殊之处:

●逻辑位图的最低比特位(位0)闲置不用,并在创建文件系统时会预先置1。

●I节点位图的最低比特位(位0)闲置不用,并在创建文件系统时会预先置1。

因此i节点位图只能表示8191个i节点的状况。

1.2 i节点

I节点则是用来存放文件的相关信息。对于每个文件或者目录名都有一个i节点,各自i节点结构中存放着对应文件的相关信息。其i节点的结构(32个字节)如图1-6所示。

其中i_mode字段的是用来保存文件的类型和访问权限属性。其15-12用于保存文件类型,为11-9保存执行文件时设置的信息,位8-0用于设置范文权限。如图1-5所示。

I节点有一个特殊之处:

●I节点0是闲置不用的,在文件系统创建时被置1。

图 1-5 i节点属性字段内容

图 1-6 MINIX文件系统1.0版的i节点结构其中文件所占用得盘上逻辑块号数组结构如下图1-7所示。

图 1-7 i节点的逻辑块(区块)数组的功能

1.3文件类型、属性和目录项

Linux下文件属性的查看可以通过“ls –l”,具体如下图1-8所示:

图 1-8 linux下“ls –l“显示的文件信息

从上图可以看出来,在linux下通常可以分为六种类型的文件:

●正规文件(‘-’),系统对其不做任何解释,包含有任何长度的字节流。

●目录(‘d’)在linux下也是一种文件,文件管理系统会对其内容进行解释。

●符号链接(‘s’)用于使用不同的文件名来引用另外一个文件。分为软链接和

硬链接。软链接可以跨文件系统进行链接,删除时不会影响到源文件;而硬链

接则不能跨文件系统(或者设备),它和被链接的文件地位相同,被作为一般文件对待,并且会递增文件的链接计数。

●命名管道(‘p’)文件时系统创建有名管道建立的文件,用于无关进程间的

通信。

●字符设备(‘c’)文件用于以操作文件的方式访问字符设备。主要包括tty终

端、内存设备和网络设备。

●块设备(‘b’)文件用于访问硬盘、软盘等设备。在linux下,块设备和字符

设备文件一般存放在/dev目录下。

注释1:每个i节点都有一个链接计数i_nlinks,记录着指向该i节点的目录项数,这就是文件的硬链接计数。在执行删除文件时,只有i_nlinks等于0时才允许删除此数据。

注释2:符号链接(即软链接)类型的文件并不会直接指向对应的文件的i节点,而是在其数据块中存储这一文件的路径名字符串,内核查看这个文件是通过路劲名进行直接解析的。因此可以跨文件系统(或者设备)链接。

文件系统的目录项结构体定义在/include/linux/fs.h的头文件中,其结构如下图1-9所示。

图 1-9 目录项结构体的定义

注释1:一个逻辑块能存储的目录项1024/16=64

注释2:对于i节点的i_zone[0]所对应的逻辑块来说,它在初始化时首先存储了“.”(自己目录的i节点号)和“..”(父目录的i节点号)两个目录,在代码中会有体现,对目录项进行遍历时,会从2开始。

通过文件名从文件系统中获取其数据块的流程图如下图1-10所示。

图 1-10 以文件名获取其数据块

1.4高速缓冲区

高速缓冲区是文件系统访问块设备中数据的必经之道,它的主要作用如下:

●将磁盘块中的数据预读到缓冲区,减少对磁盘的频繁访问,提高系统性能。

●当需要将数据写入到块设备时,则先将数据转存在高速缓冲区中,然后由高速

缓冲区通过设备数据同步来实现写入块设备。

高速缓冲存放着最近使用过得各个块设备中的数据块。当需要从块设备中读取数据时,缓冲管理程序首先会再高速缓冲中寻找数据。如果在缓冲区,则直接返回数据块的指针,反之,则发出读设备的命令,将磁盘块中得数据读入高数缓冲区。如下图1-11所示,显示了高速缓冲区位于内核模块和主内存区之间。

图 1-11 高速缓冲区在整个内存中的位置

注释1:end是内核模块链接期间由链接程序ld设置的一个外部变量,内核代码中没有定义这个符号。当在连接生成system模块时,ld程序设置了end的地址,它等于data_start+datasize+bss_size,即bss段结束后的第一个有效地址。

注释2:高速缓冲区被划分为1024字节大小的缓冲块,正好与块设备上的磁盘逻辑块大小相同。

高速缓冲区从物理角度看主要由缓冲块和指向缓冲块的缓冲头组成。其中缓冲头的结构体为:

struct buffer_head {

char * b_data; //指向该缓冲块中数据区(1024字节)的指针

unsigned long b_blocknr; //块号

unsigned short b_dev; //数据块的设备号

unsigned char b_uptodate; //更新标志,表示设备是否更新

unsigned char b_dirt; //修改标志,0-未修改,1-已修改

unsigned char b_count; //使用该块的用户数,用于清除数据块时。

unsigned char b_lock; //缓冲区上所标识,0-ok,1-locked

struct task_struct * b_wait; //指向等待使用此缓冲块的进程

struct buffer_head * b_prev; //hash队列上一块

struct buffer_head * b_next; //hash队列下一块

struct buffer_head * b_prev_free; //空闲表上一块

struct buffer_head * b_next_free; //空闲表下一块

};

注释1:字段b_dirt是脏标志,说明该缓冲块中得内容是否已修改而与块设备上得对应数据块内容不同(延迟写)。B_uptodate是数据更新标志,说明缓冲块中数据是否有效。初始化或者释放块时这两个标志设置为0,表示该缓冲块此时无效。

注释2:b_dirt=1,b_uptodate=0,数据被写入缓冲块但是还没有被写入设备;b_dirt=0,

b_uptodate=1,数据被写入了设备块或者刚从设备快中读入缓冲块中变成有效;

b_dirt=1,b_uptodate=1,表示缓冲块和设备快上得数据不同,但是数据还是有效的(更新的)。

高速缓冲区采用hash表和空闲缓冲块队列进行操作管理,这也是高速缓冲区从逻辑上的组成。在缓冲区初始化过程中,初始化程序从整个缓冲区的两端开始,分别同时设置缓冲头块和划分对应的缓冲块,如图1-12所示。缓冲头的结构体描述了对应缓冲块的属性,并且用于把所有的缓冲头连接成一个双向链表结构。如图1-13所示。

图 1-12 高速缓冲区的初始化示意图

注释1:高端建立了1024大小的缓冲块,低端建立了对应的缓冲块头

图 1-13 所有缓冲块组成的双向循环链表结构

注释1:free_list指针是该链表的头指针,指向空闲块链表中第一个“最为空闲的”缓冲块,即近期最少使用的块。

为了能够快速而有效地在缓冲区中寻找判断出请求的数据块是否已经被读入缓冲区中,buffer.c使用了具有307个buffer_head指针项的hash数组结构。Hash函数采用了设备号和逻辑块号作为参数,具体函数:(设备号^逻辑块号)Mod307。然后通过b_prev、p_next将hash表中散列在同一项上的多个缓冲块练成一个双向链表。

通过hash数组实现管理缓冲块的好处是保证了同一设备号的块具有相同的散列值,加速对缓冲区中得块的查询。图1-14所示为某一时刻内核中缓冲块散列队列示意图。

图1-14 某一刻内核中缓冲块散列队列示意图

2源码分析

这一部分主要从源码fs/目录下的各个文件进行逐个分析,理清它们之间的调用关系,并通过流程图的形式展现其中关键代码的实现。本章可以划分为五大部分:1)高速缓冲管理;2)文件底层操作;3)文件数据访问;4)文件高层访问控制;5)文件系统的初始化和define变量说明。

2.1高速缓冲管理

高速缓冲管理在fs/buffer.c中得到实现。内核程序在使用高速缓冲区中的缓冲块时,是通过制定需要访问的设备号和数据逻辑块号来调用buffer.c的函数。本文件中主要实现这些接口函数:

●bread(int dev,int block):快读取函数。

●breada(int dev,int block):块提前预读函数。

●bread_page(unsigned long address,int dev,int b[4]):页块读取函数,它

一般可以读取四个缓冲块。

所有这些缓冲块数据存取和管理函数的调用层次关系可以用图2-1所描述。

图2-1 缓冲区管理函数之间的层次关系

其中brelse(struct buffer_head * buf)用来释放指定的缓冲块;

get_hash_table(int dev, int block)查询对应的hash表项。Find_buffer(int dev, int block)通过hash(dev,block)获取缓存头的地址来遍历缓冲头,找到需要的目的缓冲头。

2.1.1 getblk函数

getblk(int dev,int block)这个函数主要实现了取高速缓冲中得指定的缓冲区。其实现的流程如下图2-2所示:

图 2-2 getblk函数的实现流程

Getblk函数的具体实现代码如下:

//这行是个宏定义,用于同时判断缓冲区的修改标志和锁定标志,并且定义修改标志的权重要比锁定标志大(具体是大一倍)。

#define BADNESS(bh) (((bh)->b_dirt<<1)+(bh)->b_lock)

struct buffer_head * getblk(int dev,int block)

{

struct buffer_head * tmp, * bh;

repeat:

//首先判断是否在高速缓冲区中,如果在这直接返回缓冲区指针。

if (bh = get_hash_table(dev,block))

return bh;

tmp = free_list;

//通过while循环搜索空闲的缓冲块,选择比重最小的缓冲头指针指向tmp缓冲区头,如果发现tmp既没有被修改有没有被锁定的情况下,则说明以为指定设备上的块取得对应的高速缓冲区,退出循环。否则知道遍历完整个空闲缓冲块队列。

do {

if (tmp->b_count)

continue;

if (!bh || BADNESS(tmp)

bh = tmp;

if (!BADNESS(tmp))

break;

}

/* and repeat until we find something good */

} while ((tmp = tmp->b_next_free) != free_list);

//如果没有找到空闲的(连比重最小的也没有),直接睡眠,等待有空闲的缓冲区可用。

if (!bh) {

sleep_on(&buffer_wait);

goto repeat;

}

//如果缓冲块加锁,则等待加锁。

wait_on_buffer(bh);

//如果缓冲块被人使用,则直接跳至标志repeat重新执行一遍。

if (bh->b_count)

goto repeat;

//通过while循环等待脏数据被完全同步至设备上。每同步完一次,检查一下是否被人占用,如果占用了,直接返回值repeat开始。

while (bh->b_dirt) {

sync_dev(bh->b_dev);

wait_on_buffer(bh);

if (bh->b_count)

goto repeat;

}

/* NOTE!! While we slept waiting for this block, somebody else might */ /* already have added "this" block to the cache. check it */

//在高速缓冲hash表中检查指定缓冲区是否已经被加入。如果是的话,就跳至repeat处执行。

if (find_buffer(dev,block))

goto repeat;

/* OK, FINALLY we know that this buffer is the only one of it's kind, */

/* and that it's unused (b_count=0), unlocked (b_lock=0), and clean */ bh->b_count=1;

bh->b_dirt=0;

bh->b_uptodate=0;

remove_from_queues(bh); //conghash队列和空闲链表中移除该缓冲头,让该缓冲区用于指定设备和其上的指定块。

bh->b_dev=dev;

bh->b_blocknr=block;

insert_into_queues(bh); //然后根据新的设备号和块号重新插入空闲链表和hash队列新位置处。并最终返回缓冲头指针。

return bh;

}

2.1.2 bread函数

根据对getblk()函数的分析,它最终可能返回了一个新的空闲块,也可能返回的正好使我们需要数据的缓冲块。对于bread()函数来说,通过getblk()获取了新的缓冲块,它就需要判断该缓冲块的更新标志,看看所含数据是够有效,如果有效就可以直接将该数据块返回给申请的程序,否则就需要调用设备的底层读写函数

(ll_rw_block()),并同时让自己进入睡眠状态,等待数据被读入缓冲块。其具体的流程图如下图2-3所示。

图 2-3 bread()函数的实现流程图

注释1:breada()和bread_page()函数与bread()实现方式类型,就暂时不做流程图分析的。 bread()函数的具体实现代码及分析如下:

struct buffer_head * bread(int dev,int block)

{

struct buffer_head * bh;

//判断getblk()是否返回缓冲头指针,如果没有,则打印错误信息。

if (!(bh=getblk(dev,block)))

panic("bread: getblk returned NULL\n");

//判断数据的更新标志,数据有效则返回缓冲头指针

if (bh->b_uptodate)

return bh;

//如果数据无效,则利用底层函数直接从设备上读取数据。

ll_rw_block(READ,bh);

//等待解锁

wait_on_buffer(bh);

//判断更新标志位。如果数据无效,释放bh,返回NULL;反之,则返回bh。

if (bh->b_uptodate)

return bh;

brelse(bh);

return NULL;

}

2.1.3 remove_from_queues、insert_into_queues、find_buffer和get_hash_table 函数

remove_from_queues和insert_into_queues实现了缓冲头的移出和插入的功能,其具体的实现代码在下面分别进行分析。

●remove_from_queues

//这里是以内联函数实现的,可以加速代码执行速度,免去了函数调用的系统代价。static inline void remove_from_queues(struct buffer_head * bh)

{

/* remove from hash-queue */

if (bh->b_next)

bh->b_next->b_prev = bh->b_prev;

if (bh->b_prev)

bh->b_prev->b_next = bh->b_next;

//如果该缓冲区是该队列的头一块,则让hash表的对应项指向本队列中得下一个缓冲区。 by chh

if (hash(bh->b_dev,bh->b_blocknr) == bh)

hash(bh->b_dev,bh->b_blocknr) = bh->b_next; //如果缓冲头是hash队列的链表头,则将hash项指向下一个缓冲头。

/* remove from free list */

if (!(bh->b_prev_free) || !(bh->b_next_free))

panic("Free block list corrupted");

bh->b_prev_free->b_next_free = bh->b_next_free;

bh->b_next_free->b_prev_free = bh->b_prev_free;

if (free_list == bh)

free_list = bh->b_next_free;

}

●insert_into_queues

static inline void insert_into_queues(struct buffer_head * bh)

{

/* put at end of free list */

bh->b_next_free = free_list;

bh->b_prev_free = free_list->b_prev_free;

free_list->b_prev_free->b_next_free = bh;

free_list->b_prev_free = bh;

/* put the buffer in new hash-queue if it has a device */

bh->b_prev = NULL;

bh->b_next = NULL;

if (!bh->b_dev)

return;

//将缓冲头在链表头进行插入。

bh->b_next = hash(bh->b_dev,bh->b_blocknr);

hash(bh->b_dev,bh->b_blocknr) = bh;

bh->b_next->b_prev = bh;

}

对于这两个函数进行分析后发现其插入规则如下:

?插入到空闲缓冲链表中时,是选择插入到free_list之前一个位置。

?插入hash队列中,是直接插入到dev对应的hash行所在的链表的头指针处。

●find_buffer

static struct buffer_head * find_buffer(int dev, int block)

{

struct buffer_head * tmp;

//首先通过hash(dev,block)所在的hash行链表中,然后对联表进行遍历,如果找到了dev和block号都相同的缓冲头,指直接返回tmp指针,反之,则返回NULL。

for (tmp = hash(dev,block) ; tmp != NULL ; tmp = tmp->b_next)

if (tmp->b_dev==dev && tmp->b_blocknr==block)

return tmp;

return NULL;

}

●get_hash_table

struct buffer_head * get_hash_table(int dev, int block)

{

struct buffer_head * bh;

//进入一个循环,首先在高速缓冲区中寻找相应的数据块。如果没有找到,直接返回NULL,否则对其引用递增1,等待此缓冲块的解锁。如

for (;;) {

if (!(bh=find_buffer(dev,block)))

return NULL;

bh->b_count++;

wait_on_buffer(bh);

//由于经过了睡眠状态,因此有必要再验证一下该缓冲区的正确性,并返回缓冲头的指针。这都是由于竞争的原因,并且没有对缓冲区加锁。

if (bh->b_dev == dev && bh->b_blocknr == block)

return bh;

//如果该缓冲区所属的设备号或者块号在睡眠时发生了改变,则撤销对它的引用计数,重新寻找。

bh->b_count--;

}

}

2.2文件底层操作

文件系统的底层处理函数包含在以下5个文件中:

●bitmap.c程序包括对i节点位图和逻辑块位图进行释放和占用处理函数。操作i

节点位图的函数是free_inode()和new_inode(),操作逻辑块为图的函数是

free_block()和new_block()。

●truncate.c程序包括第数据长度截断为0的函数truncate()。它将i节点指定

的设备上文件长度截为0,并释放文件数据占用的设备逻辑块。

●inode.c程序包括分配i节点函数iget()和放回对内存i节点存取函数iput

()函数以及根据i节点信息取文件数据块在设备上对应的逻辑块号函数bmap

()。

●namei.c程序主要包括namei()。该函数使用iget()、input()和bmap()

将给定的文件路径名映射到其i节点。

●super.c程序专门用于处理文件系统超级块,包括函数get_super()、put_super()

和free_super()等。还包括几个文件系统加载/卸载处理函数和系统调用,如

sys_mount()等。

这几个文件中函数的层次关系图如图2-4所示。

图 2-4 文件系统底层操作函数的层次图

下面就根据源码的分析,画出各文件中重要的函数的流程图。

2.2.1bitmap.c

在这个文件中,主要有四个函数:free_block、new_block、free_inode和

new_inode。下面主要分析这四个函数的实现,并画出相应的流程图。

图 2-5 free_block函数的实现流程图

对于其他的几个函数,实现逻辑并不复杂,如new_block函数,首先判断创建新块的条件是否满足(根据dev取超级块等),找寻找空闲的逻辑位图位,找到后创建block,最后通过dev和block号来访问创建的block,用以验证创建是否成功。考虑到逻辑不负责,就没有对其他三个函数(new_block、free_inode和new_inode)一一画出其流程图。

(完整版)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的硬盘

操作系统实验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");

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支持多种文件系统,包括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闪存比较

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。

linux 实验报告 文件系统与文件管理

学生课程实验报告书课程:《linux网络操作系统》 级系 专业班 学号: 姓名: 指导教师:

一、实验项目:用户与组群管理 二、实验日期: 三、实验原理: 1.熟悉Linux下常用的操作指令。 2.加深对文件,目录,文件系统等概念的理解。 3.掌握Linux文件系统的目录结构。 4.掌握有关Linux文件系统操作的常用命令。 5.了解有关文件安全方面的知识。 四、实验仪器: PC机 Redhat网络操作系统 五、实验步骤(纸张不够写可另外加纸并应装订): 进入虚拟机,并在此平台上练习文件管理有关命令.一般在[root @ localhost xxxx]$ 提示符下键入有关命令。 1.浏览文件系统 〈1〉运行pwd命令,确定你当前的工作目录。 〈2〉利用以下命令显示当前工作目录的内容:(理解各字段彻底意义。) 〈3〉运行以下命令:(反馈信息中.代表本身目录,..代表其父目录;选项a可以显示隐藏文件;选项i 可以显示文件的I节点号) ls –ai 〈4〉使用mkdir命令建立一个子目录subdir,并用ls查看当前目录。 〈5〉使用带-d选项的ls命令,你只能看到有关子目录的信息(.表示本身目录)。

〈6〉使用cd命令,将工作目录改到根目录(/)上。 ①用相对路径将工作目录改到根目录。 ②用绝对路径将工作目录改到根目录。 〈7〉使用ls命令列出根目录的内容,再分别列出各子目录的内容,体会各目录作用及访问权限。 〈8〉使用ls-l命令列出/dev的内容。 Ls –l /dev 列出/dev目录的内容,文件太多显示多屏,各行第一个字符为b的表示块特别文件;各行第一个字符为c的表示字符特别文件。 〈9〉使用不带参数的命令cd,然后用pwd命令确定你当前的工作目录是什麽。 〈10〉使用命令cd ../..,你将工作目录移到什麽地方? 2.查看你的文件 〈1〉利用cd命令,将工作目录改到你的主目录上。 〈2〉将工作目录改到你的子目录subdir,然后运行命令: date > file1 将当前日期和时间存放到新建文件file1中。 Ls –l 反馈信息中有新文件 file1。请注意并记下文件长度为:

Linux文件系统管理

实验:Linux文件系统管理 -=-==----------------------------= 实验环境: 安装了Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统。 实验目标: 增加有关分区和文件系统的技能和知识,掌握常见磁盘分区的相关操作及一般步骤。 实验背景: 无论是Windows 还是Linux,我们日常操作与使用几乎都是围绕文件系统而展开的。 有一天你突然发现你的现有的硬盘空间不够用了,巧的是你还有一些的空余空间。遇事你打算把这些空余的空间开辟出来以便使用。 实验要求: 按要求新建磁盘分区: 存储空间文件系统 1024MB ext2 Block size:4K Laber:Music 512MB ext3 512MB vfat ------------------------------------------ 实验详解: 1、以root 用户的身份登录系统。如果你使用的是图形化环境,点击[应用程序(Applications)]->[附件(System Tools)]->[终端(Terminal)]来打开终端: 2、使用fdisk命令查看当前磁盘使用情况: [root@desktop2 ~]# fdisk -l Disk /dev/sda: 10.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks ID System /dev/sda1 * ……其余项省略 /dev/sda2 ……其余项省略 /dev/sda3 ……其余项省略 /dev/sda4 ……其余项省略 3、使用fdisk命令按照实验要求创建3 个新分区: [root@desktop2 ~]# fdisk /dev/sda This number of cylinder for this disk is set to 2610. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) 在Command 命令处输入’n’,开始新建磁盘分区

实验六 LINUX文件系统管理

实验6 Linux文件系统和权限管理 1 实验目的 1、掌握文件系统管理的常用命令。 2、掌握磁盘分区、挂载的方法。 2 实验环境 VMware中已经安装好CentOS6.2版本。 3 实验原理 1、Linux常用文件权限管理命令主要有:chmod、chown两个;而文件系统管理常用命令主要有fdisk、mkfs、mount/umount、df、du等,这些命令的使用可参见教材P86~P104或者帮助手册。 2、Linux常用文件权限管理命令主要有:chmod、chown两个;而文件系统管理常用命令主要有fdisk、mkfs、mount/umount等,这些命令的使用可参见教材P86~P104或者帮助手册。 4 实验任务 1、对硬盘进行分区、格式化操作,挂载和卸载等操作。 2、设置配置文件/etc/fstab实现设备的自动挂载。 5 实验步骤 1、创建硬盘分区sda5,要求其大小为200M,完成后效果 2、创建文件系统ext4,使用命令将sda5格式化的命令是。(自己验证) 3、使用命令将sda5挂载到/data目录下的操作是。完成后验证图,可以使用df命令验证。 4、使用命令卸载sda5的操作为。(自己验证) 5、修改配置文件/etc/fstab,使得系统开机后自动挂载sda5到/data下。(完成后自己验证) 6、使用命令在/etc目录下查找文件名前四个字符为init后面任意的文件。

7、使用命令在/目录下查找大小大于100M的文件。 8、为/etc目录下的inittab文件在root用户家目录下创建符号连接inittab_s和硬连接inittab_i 然后查看inittab_s和inittab_i的i节点号对比符号连接和硬连接的不同。

linux-实验报告-文件系统与文件管理.docx

学生课程实验报告书课程:《linux 网络操作系统》 级系 专业班 学号: 姓名: 指导教师:

一、实验项目:用户与组群管理 二、实验日期: 三、实验原理: 1.熟悉 Linux 下常用的操作指令。 2.加深对文件,目录,文件系统等概念的理解。 3.掌握 Linux 文件系统的目录结构。 4.掌握有关Linux 文件系统操作的常用命令。 5.了解有关文件安全方面的知识。 四、实验仪器: PC机 Redhat 网络操作系统 五、实验步骤(纸张不够写可另外加纸并应装订): 进入虚拟机,并在此平台上练习文件管理有关命令.一般在 [root @ localhost xxxx]$ 提示符下键入有关命令。 1.浏览文件系统 〈1〉运行 pwd 命令,确定你当前的工作目录。 〈2〉利用以下命令显示当前工作目录的内容:(理解各字段彻底意义。 ) 〈 3〉运行以下命令:(反馈信息中 .代表本身目录,..代表其父目录;选项 a 可以显示隐藏文件;选项i 可以显示文件的I 节点号) ls –ai

〈 4〉使用 mkdir 命令建立一个子目录subdir ,并用 ls 查看当前目录。 〈 5〉使用带 -d 选项的 ls 命令,你只能看到有关子目录的信息(.表示本身目录 )。 / )上。 〈 6〉使用 cd 命令,将工作目录改到根目录 (① 用相对路径将工作目录改到根目录。 ②用绝对路径将工作目录改到根目录。 〈 7〉使用 ls 命令列出根目录的内容,再分别列出各子目录的内容,体会各目录作用及访问权限。

〈 8〉使用 ls-l 命令列出 /dev 的内容。 Ls – l /dev 列出 /dev 目录的内容,文件太多显示多屏,各行第一个字符为 b 的表示块特别文件;各行第一个字符为 c 的表示字符特别文件。 〈 9〉使用不带参数的命令cd,然后用pwd 命令确定你当前的工作目录是什麽。 〈 10〉使用命令cd ../.. ,你将工作目录移到什麽地方 2.查看你的文件 〈1〉利用 cd 命令,将工作目录改到你的主目录上。 〈2〉将工作目录改到你的子目录subdir ,然后运行命令: date > file1将当前日期和时间存放到新建文件file1 中。 Ls – l 反馈信息中有新文件file1 。请注意并记下文件长度为:

基于Linux的文件系统设计

无敌 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:学号: 设计题目:基于Linux的模拟文件系统的设计与实现 起迄日期: 指导教师:

1.需求分析 1.1 功能介绍 基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:创建多个用户,输入用户名;每个用户最多可以保存多个文件。 (2)用户登录:手动的登录已经创建的用户,正确输入用户名即可成功登录。 (3)创建二级文件目录(MD):手动的输入目录名称,(即设置主目录(MFD)和用户文件目录(UFD))。 (4)显示目录(show_content):将用户创建的目录显示在界面上。 (5)删除目录(delete_content):手动输入目录的名称即可删除已经创建的目录。 (6)进入目录:进入目录内部,可以进行文件的各种操作。 (7)复制目录(modify_content):在用户登录后,输入要修改的目录名称,对其进行修改,输入新的目录名并保存。 (8)建立一个文件(create):在目录中手动输入文件名,可以创建新的文件,在创建的同时输入文件的保护码,对文件内 容进行保护,防止信息泄露。

(9)删除一个文件(delete):手动输入已经创建的文件的名称,即可删除此文件。 (10)写文件(write):手动的在文件中写入内容。 (11)读文件(read):查看文件中的已经写入的内容。 (12)修改文件属性(modifyfile):通过修改属性改变文件类型。 基于其低廉成本与高度可设定性,Linux常常被应用于嵌入式系统,例如机顶盒、移动电话及行动装置等。在移动电话上,Linux已经成为与Symbian OS、Windows Mobile系统并列的三大智能手机操作系统之一;而在移动装置上,则成为Windows CE与Palm OS 外之另一个选择。目前流行的TiVo数位摄影机使用了经过定制化后的Linux。此外,有不少硬件式的网络防火墙及路由器,例如部份LinkSys的产品,其内部都是使用Linux来驱动、并采用了操作系统提供的防火墙及路由功能。 1.2 目的及意义 Linux以它的高效性和灵活性著称。它能够在PC计算机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux 操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Window图形用户界面,如同我们使用Windows NT一样,允许

实验5 Linux文件管理

实验5 Linux文件管理 一、实验目的 1. 掌握Linux文件系统的基本原理、结构和实现方法 2. 掌握Linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用 3. 学会设计简单的文件系统并实现一组操作 4. 通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握 二、实验内容 设计并实现一个一级文件系统程序,要求实现以下功能: 1. 提供文件创建/删除接口命令create / delete、目录创建/删除接口命令mkdir / rmdir、显示目录内容命令ls等。 2. 创建的文件不要求格式和内容。 三、实验结果 1. 程序源代码 main.cpp #include #include #include #include #include "structure.h" #include "creat.h" #include "access.h" #include "ballfre.h" #include "close.h" #include "delete.h" #include "dir.h" #include "format.h" #include "halt.h" #include "iallfre.h" #include "install.h" #include "log.h" #include "name.h" #include "open.h" #include "rdwt.h" #include "igetput.h" struct hinode hinode[NHINO]; struct dir dir; struct file sys_ofile[SYSOPENFILE]; struct filsys filsys; struct pwd pwd[PWDNUM];

实验项目4 文件系统管理

实验项目4 文件系统管理 一、实验目的 ●掌握Linux下文件系统的创建、挂载与卸载。 ●掌握文件系统的自动挂载。 二、项目背景 某企业的Linux服务器中新增了一块硬盘/dev/sdb,请使用fdisk命令新建/dev/sdb1主分区和/dev/sdb2扩展分区,并在扩展分区中新建逻辑分区/dev/sdb5,并使用mkfs命令分别创建vfat和ext3文件系统。然后用fsck命令检查这两个文件系统;最后,把这两个文件系统挂载到系统上。 三、实验内容 练习Linux系统下文件系统的创建、挂载与卸载及自动挂载的实现。 四、实验步骤 子项目1.创建/dev/sdb1和/dev/sdb5 ●使用fdisk命令创建/dev/sdb1主分区。

●使用fdisk命令创建/dev/sdb2扩展分区。

●使用fdisk命令创建/dev/sdb5逻辑分区。 ●输入子命令w,把设置写入硬盘分区表,退出fdisk并重新启动系统。

●用mkfs命令在上述刚刚创建的分区上创建ext3文件系统和vfat文件系统。 ●用fsck命令检查上面创建的文件系统。 子项目2.挂载/dev/sdb1和/dev/sdb5 ●利用mkdir命令,在/mnt目录下建立挂载点,mountpoint1和mountpoint2。

●把上述新创建的ext3分区挂载到/mnt/mountpoint1上。 ●把上述新创建的vfat分区挂载到/mnt/mountpoint2上。 ●利用mount命令列出挂载到系统上的分区,查看挂载是否成功。 ●利用umount命令卸载上面的两个分区。

相关文档
最新文档