linux教程第06课文件系统

上传人:cl****1 文档编号:577801950 上传时间:2024-08-22 格式:PPT 页数:33 大小:245.50KB
返回 下载 相关 举报
linux教程第06课文件系统_第1页
第1页 / 共33页
linux教程第06课文件系统_第2页
第2页 / 共33页
linux教程第06课文件系统_第3页
第3页 / 共33页
linux教程第06课文件系统_第4页
第4页 / 共33页
linux教程第06课文件系统_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《linux教程第06课文件系统》由会员分享,可在线阅读,更多相关《linux教程第06课文件系统(33页珍藏版)》请在金锄头文库上搜索。

1、第5章 Linux内核简介 linuxlinux教程教程 第第0606课课_ _文件系统文件系统5.3 文 件 系 统操作系统中负责管理和存取文件信息的软件机构称为操作系统中负责管理和存取文件信息的软件机构称为文件管理系统,文件管理系统, 简称文件系统。简称文件系统。文件系统由三部分组成:与文件管理有关的软件、被文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。管理的文件以及实施文件管理所需的数据结构。 从从系统角度来看,文件系统是对文件存储器的存储空间系统角度来看,文件系统是对文件存储器的存储空间进行组织和分配,负责文件的存储并对存入的文件进进行组织和分

2、配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、文件,存入、读出、修改、 转储文件,转储文件, 控制文件的控制文件的存取,存取, 当用户不再使用时撤消文件等。当用户不再使用时撤消文件等。LinuxLinux支持多种不同的文件系统,如:支持多种不同的文件系统,如:ext, FAT, ext2, ext, FAT, ext2, ext3, MINIX, MS DOS, SYSVext3, MINIX, MS DOS, SYSV等。目前,等。目前,LinuxLinux主要使主要使用的文件系统是用的文

3、件系统是ext3ext3。linux教程 第06课_文件系统5.3 文 件 系 统5.3.1 ext2文件系统 ext2文件系统支持标准UNIX文件类型:普通文件、目录文件、特别文件和符号链接。ext2文件系统可以管理特别大的分区。 ext2文件系统支持长文件名,最大长度为255个字符。ext2文件系统为超级用户保留了一些数据块,约为5%。 linux教程 第06课_文件系统1 1ext2ext2文件系统的物理结构文件系统的物理结构linux教程 第06课_文件系统2 2块组的构造块组的构造每个块组中包含超级块、组描述结构、块位图、索引节点位图、每个块组中包含超级块、组描述结构、块位图、索引节

4、点位图、索引节点表和数据块。索引节点表和数据块。(1 1)超级块()超级块(SuperblockSuperblock)超级块中包含有文件系统本身的大小和形式的基本信息。超级块中包含有文件系统本身的大小和形式的基本信息。每个块组都一个超级块。每个块组都一个超级块。超级块中包含超级块中包含: :幻数、修订级别幻数、修订级别 、安装计数和最大安装数、安装计数和最大安装数 、块、块组号码组号码 、数据块大小、数据块大小 、每组数据块的个数、空闲块、每组数据块的个数、空闲块 、空闲索、空闲索引节点引节点 、第一个索引节点、第一个索引节点 (2 2)块组描述结构()块组描述结构(Block Group D

5、escriptorBlock Group Descriptor) 每个数据块组都有一个描述它的数据结构,即块组描述结构。每个数据块组都有一个描述它的数据结构,即块组描述结构。包含以下信息:数据块位示图包含以下信息:数据块位示图 、索引节点位示图、索引节点表、索引节点位示图、索引节点表 、空闲块数、空闲索引节点数和已用目录数。、空闲块数、空闲索引节点数和已用目录数。 linux教程 第06课_文件系统3 3索引节点(索引节点(InodeInode) 索引节点又被称为索引节点又被称为I I节点,每个文件都有惟一一个索引节点。节点,每个文件都有惟一一个索引节点。ext2ext2文件系统的索引节点起着

6、文件控制块的作用,利用这种数文件系统的索引节点起着文件控制块的作用,利用这种数据结构可对文件进行控制和管理。据结构可对文件进行控制和管理。 索引节点有两种形式:盘索引节点索引节点有两种形式:盘索引节点( (如如ext2_inode)ext2_inode)和内存索和内存索引节点引节点( (如如inode)inode)。索引节点包括以下一些主要内容:索引节点包括以下一些主要内容:(1 1)文件模式,描述文件属性和类型。)文件模式,描述文件属性和类型。(2 2)文件属主信息,包括文件主标志号和同组用户标志号。)文件属主信息,包括文件主标志号和同组用户标志号。(3 3)文件大小,即文件的字节大小。)文

7、件大小,即文件的字节大小。(4 4)时间戳,包括索引节点建立的时间、最近访问时间、最后)时间戳,包括索引节点建立的时间、最近访问时间、最后修改时等。修改时等。(5 5)文件链接计数。)文件链接计数。(6 6)数据块索引表。利用多重索引表的结构存放指向文件数据)数据块索引表。利用多重索引表的结构存放指向文件数据块的指针。块的指针。linux教程 第06课_文件系统4 4多重索引结构多重索引结构linux教程 第06课_文件系统ext2文件索引 直接指针有直接指针有1212个,一级、二级、三级间接指针个,一级、二级、三级间接指针各各1 1个,共个,共1515个指针项。每个指针项存储了一个个指针项。

8、每个指针项存储了一个4 4字节的磁盘块指针,每个磁盘块大小为字节的磁盘块指针,每个磁盘块大小为1KB1KB,因,因此文件系统的总大小不超过此文件系统的总大小不超过4TB4TB。求:一个大小为求:一个大小为512KB512KB的文件,共消耗了多少个磁的文件,共消耗了多少个磁盘块?盘块?linux教程 第06课_文件系统5ext2中的目录项当创建一个文件时,就构成一个目录项,并添加当创建一个文件时,就构成一个目录项,并添加到相应的目录文件中。一个目录文件可以包含很到相应的目录文件中。一个目录文件可以包含很多目录项,每个目录项多目录项,每个目录项( (如如ext2ext2文件系统的文件系统的ext2

9、_dir_entry_2)ext2_dir_entry_2)包含的信息有:包含的信息有: 索引节点号索引节点号 目录项长度目录项长度 名字长度名字长度 文件类型文件类型 文件名字文件名字linux教程 第06课_文件系统6位示图利用一串二进位的值来反映该块组中数据块的分利用一串二进位的值来反映该块组中数据块的分配情况,也称作位向量配情况,也称作位向量(Bit Vector)(Bit Vector)法。法。设下列数据块是空闲的:设下列数据块是空闲的:2 2,3 3,4 4,5 5,8 8,9 9,1010,1111,1212,1313,1717,1818,2525,2626,2727,.则块位示

10、图的表示为:则块位示图的表示为:11000.11000.linux教程 第06课_文件系统5.3.2 虚拟文件系统1 1VFSVFS系统结构系统结构VFSVFS是建立在具体文件系是建立在具体文件系统之上的,它为用户程序统之上的,它为用户程序提供一个统一的、抽象的、提供一个统一的、抽象的、虚拟的文件系统界面。这虚拟的文件系统界面。这个抽象的界面主要由一组个抽象的界面主要由一组标准的、抽象的有关文件标准的、抽象的有关文件操作构成,以系统调用的操作构成,以系统调用的形式提供给用户程序形式提供给用户程序 linux教程 第06课_文件系统2.VFS2.VFS超级块超级块每个安装的文件系统都有一个每个安

11、装的文件系统都有一个VFSVFS超级块,其中包含以下超级块,其中包含以下主要信息:主要信息: 设备标识符设备标识符 索引节点指针索引节点指针 数据块大小数据块大小 超级块操作集超级块操作集 文件系统类型文件系统类型 文件系统的特殊信息文件系统的特殊信息3 3VFSVFS索引节点索引节点VFSVFS中每个文件和目录都有一个且只有一个中每个文件和目录都有一个且只有一个VFSVFS索引节点索引节点 linux教程 第06课_文件系统4 4LinuxLinux文件系统的逻辑结构文件系统的逻辑结构linux教程 第06课_文件系统5 5文件系统的安装与拆卸文件系统的安装与拆卸根文件系统一旦安装上,则在整

12、个系统运行过程中是不能卸根文件系统一旦安装上,则在整个系统运行过程中是不能卸载的载的 其他的文件系统(例如,其他的文件系统(例如,由软盘构成的文件系统)由软盘构成的文件系统)可以根据需要(如从硬盘可以根据需要(如从硬盘向软盘复制文件),作为向软盘复制文件),作为子系统动态地安装到子系统动态地安装到主系统中主系统中 linux教程 第06课_文件系统6 6VFSVFS索引节点缓存和目录缓存索引节点缓存和目录缓存其基本思想是,其基本思想是,VFSVFS索引节点在数据结构上被链入不同的散索引节点在数据结构上被链入不同的散列队列,具有相同散列值的列队列,具有相同散列值的VFSVFS索引节点在同一队列中

13、。设索引节点在同一队列中。设置一个散列表,其中每一项包含一个指向置一个散列表,其中每一项包含一个指向VFSVFS索引节点散列索引节点散列队列的头指针。散列值是根据文件系统所在块设备的标志符队列的头指针。散列值是根据文件系统所在块设备的标志符和索引节点号码计算出来的和索引节点号码计算出来的目录缓存也采用散列表的方法目录缓存也采用散列表的方法进行管理。表中每一项都是一进行管理。表中每一项都是一个指针,指向有相同散列值的个指针,指向有相同散列值的目录缓存队列。散列值是利用目录缓存队列。散列值是利用文件系统所在设备的号码和目文件系统所在设备的号码和目录名来计算的录名来计算的 linux教程 第06课_

14、文件系统7数据块缓冲区采用多重缓冲技术,来平滑和加快文件信息从内采用多重缓冲技术,来平滑和加快文件信息从内存到磁盘的传输存到磁盘的传输 一个缓冲区由两部分组成:存放数据的缓冲区和一个缓冲区由两部分组成:存放数据的缓冲区和一个缓冲控制块一个缓冲控制块 缓冲区和缓冲控制块是一一对应的。系统通过缓缓冲区和缓冲控制块是一一对应的。系统通过缓冲控制块来实现对缓冲区的管理冲控制块来实现对缓冲区的管理 所有处于所有处于“ “空闲空闲” ”状态的状态的buffer_head buffer_head 都链入自由链都链入自由链中,它只有一条。具有相同散列值(是由设备的中,它只有一条。具有相同散列值(是由设备的标志

15、符和数据块的块号生成的)的缓冲区组成一标志符和数据块的块号生成的)的缓冲区组成一条散列队列,可以有多个散列队列。条散列队列,可以有多个散列队列。 linux教程 第06课_文件系统文件描述符文件描述符fd是进程打开文件列表中的序号,它是一个0255的整数。文件描述符0、1、2分别用于表示标准输入、标准输出和标准错误文件。进程打开一个文件后就一直使用文件描述符fd来对文件进行标识并进行各种操作,它是文件正在被进程使用的标志。linux教程 第06课_文件系统1. open函数 调用open函数可以打开或创建一个文件。#include #include #include int open(cons

16、t char *pathname, int oflag,./*, mode_tm ode * / ) ;返回:若成功为文件描述符,若出错为- 1我们将第三个参数写为. . .,这是ANSI C说明余下参数的数目和类型可以变化的方法。对于open函数而言,仅当创建新文件时才使用第三个参数。在函数原型中此参数放置在注释中。第一个参数pathname是要打开或创建的文件的名字。linuxlinux教程教程 第第0606课课_ _文件系统文件系统1. open函数 oflag参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成oflag参数(这些常数定义在头文件中): O_RDONLY

17、 只读打开。 O_WRONLY 只写打开。 O_RDWR 读、写打开。在这三个常数中应当只指定一个。下列常数则是可选择的:linuxlinux教程教程 第第0606课课_ _文件系统文件系统1. open函数 O_APPEND 每次写时都加到文件的尾端。 O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。 O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在。 O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。 O_NOCTTY 如果pathname指的是终端

18、设备,则不将此设备分配作为此进程的控制终端。 O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。 O_SYNC 使每次write都等到物理I / O操作完成。linuxlinux教程教程 第第0606课课_ _文件系统文件系统1. open函数 由open函数返回的文件描述符一定是最小的未用描述符数字。使用举例:int fd;/定义一个整型的文件描述符char path=“/proc/version” /记录Linux内核版本的文件fd=open(path,O_RDONLY) /

19、以只读方式打开linuxlinux教程教程 第第0606课课_ _文件系统文件系统2. close函数 可用close函数关闭一个打开文件:#include int close (int fd);返回:若成功为0,若出错为-1关闭一个文件时也释放该进程加在该文件上的所有记录锁。当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显式地用close关闭打开的文件。linuxlinux教程教程 第第0606课课_ _文件系统文件系统3. lseek函数 每个打开的文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操

20、作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0。#include #include off_t lseek(int fd, off_t offset, int whence) ;返回:若成功为新的文件位移,若出错为-1linuxlinux教程教程 第第0606课课_ _文件系统文件系统3. lseek函数 对参数offset 的解释与参数whence的值有关。 若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。 若whence是SEEK_CUR,则将该文件

21、的位移量设置为其当前值加offset, offset可为正或负。 若whence是SEEK_END,则将该文件的位移量设置为文件长度加offset, offset可为正或负。linuxlinux教程教程 第第0606课课_ _文件系统文件系统3. lseek函数 若lseek成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前位移量:off_t currpos;currpos = lseek(fd, 0, SEEK_CUR); 这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或F I F O,则lseek返回-1,并将errno设置为EPI

22、PE。lseek仅将当前的文件位移量记录在内核内,它并不引起任何I / O操作。然后,该位移量用于下一个读或写操作。 文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被读为0。linuxlinux教程教程 第第0606课课_ _文件系统文件系统4. read函数 用read函数从打开的文件中读数据。#include ssize_t read(int fd, void *buff, size_t nbytes) ; 返回:读到的字节数,若已到文件尾为0,若出错为-1 linuxlinux教程教程

23、第第0606课课_ _文件系统文件系统4. read函数 使用举例:int fd,numbyte; char path=“/proc/version”;char buf100;/定义一个字符缓冲区fd=open(path,O_RDONLY);if(numbyte=read(fd,buf,100)=-1) /读100个字符到buf缓冲区printf(“read !n”);printf(“%s”,buf);/显示缓冲区的内容close(fd); linuxlinux教程教程 第第0606课课_ _文件系统文件系统5. write函数 用write函数向打开文件写数据。#include ssize_

24、t write(int fd, const void *buf, size_t nbytes) ; 返回:若成功为已写的字节数,若出错为-1 其返回值通常与参数nbytes的值不同,否则表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。 对于普通文件,写操作从文件的当前位移量处开始。如果在打开该文件时,指定了O_APPEND选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。linuxlinux教程教程 第第0606课课_ _文件系统文件系统应用示例 /* rdwr.c */* rdwr.

25、c */#include #include #include #include #include #include #include #include #include #include #include #include int main(void)int main(void) int fd1,fd2,fd3,nbytes; int fd1,fd2,fd3,nbytes; int int flags=O_CREAT|O_TRUNC|O_WRONLY;flags=O_CREAT|O_TRUNC|O_WRONLY; char buf10; char buf10; if(fd1=open(rdwr

26、.c,O_RDONLY,0644 if(fd1=open(rdwr.c,O_RDONLY,0644)0)0) perror(open rdwr.c); perror(open rdwr.c); exit(EXIT_FAILURE); exit(EXIT_FAILURE); if(fd2=open(/dev/null,O_WRONLY) if(fd2=open(/dev/null,O_WRONLY)0)0) perror(open /dev/null); perror(open /dev/null); exit(EXIT_FAILURE); exit(EXIT_FAILURE); if(fd3=

27、open(/tmp/foo.bar,flags,0644)if(fd3=open(/tmp/foo.bar,flags,0644)0)0) while(nbytes=read(fd1,buf,10)0) if(write(fd2,buf,10)0) if(write(fd2,buf,10)0) perror(write /dev/null); perror(write /dev/null); if(write(fd3,buf,nbytes)0) if(write(fd3,buf,nbytes)0) perror(write /tmp/foo.bar); perror(write /tmp/fo

28、o.bar); write(STDOUT_); write(STDOUT_); close(fd1); close(fd1); close(fd2); close(fd2); close(fd3); close(fd3); exit(EXIT_SUCCESS); exit(EXIT_SUCCESS); linux教程 第06课_文件系统6. fcntl函数 fcntl函数可以改变已经打开文件的性质。#include #include #include int fcntl(int fd, int cmd,./* int arg * / ) ; 返回:若成功则依赖于cmd(见下),若出错为-1 l

29、inuxlinux教程教程 第第0606课课_ _文件系统文件系统fcntl()函数 fcntlfcntl函数有函数有5 5种功能:种功能: 1. 1.复制一个现有的描述符(复制一个现有的描述符(cmd=F_DUPFDcmd=F_DUPFD). . 2. 2.获得设置文件描述符标记获得设置文件描述符标记(cmd=F_GETFD(cmd=F_GETFD或或F_SETFD).F_SETFD). 3. 3.获得设置文件状态标记获得设置文件状态标记(cmd=F_GETFL(cmd=F_GETFL或或F_SETFL).F_SETFL). 4. 4.获得设置异步获得设置异步I/OI/O所有权所有权(cmd

30、=F_GETOWN(cmd=F_GETOWN或或F_SETOWN).F_SETOWN). 5. 5.获得设置记录锁获得设置记录锁(cmd=F_GETLK,F_SETLK(cmd=F_GETLK,F_SETLK或或F_SETLKW).F_SETLKW).linux教程 第06课_文件系统文件共享与文件锁 当多个用户共同使用、操作一个文件也即文件共享的情况当多个用户共同使用、操作一个文件也即文件共享的情况下,下,LinuxLinux通常采用给文件上锁的方法来避免产生竞争。通常采用给文件上锁的方法来避免产生竞争。文件锁的数据结构:文件锁的数据结构:struct flockstruct flock s

31、hort l_type;short l_type; 锁类型,可取值为锁类型,可取值为F_RDLCKF_RDLCK、F_WRLCKF_WRLCK、F_UNLCKF_UNLCK off_t l_start;off_t l_start; 相对偏移量相对偏移量 short l_whence;short l_whence;位移量起点:位移量起点:SEEK_SETSEEK_SET文件开文件开头、头、SEEK_CURSEEK_CUR文件指针当前位置、文件指针当前位置、SEEK_ENDSEEK_END文件尾文件尾 off_toff_tl_len;l_len; 加锁区域长度加锁区域长度 pid_tpid_tl_

32、pid;l_pid; 加锁进程的进程号加锁进程的进程号 linux教程 第06课_文件系统lock_set.c int lock_set(int fd,int type)int lock_set(int fd,int type) struct flock old_lock,lock;struct flock old_lock,lock;lock.l_whence = SEEK_SET;lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_start = 0;lock.l_len = 0;lock.l_len = 0;lock.l_type = typ

33、e;lock.l_type = type;lock.l_pid = -1;lock.l_pid = -1;fcntl(fd,F_GETLK,&lock);fcntl(fd,F_GETLK,&lock);if(lock.l_type != F_UNLCK)if(lock.l_type != F_UNLCK) if(lock.l_type = F_RDLCK)if(lock.l_type = F_RDLCK) printf(Read lock already set by printf(Read lock already set by %dn,lock.l_pid);%dn,lock.l_pid)

34、; else if(lock.l_type = F_WRLCK)else if(lock.l_type = F_WRLCK) printf(Write lock already set by printf(Write lock already set by %dn,lock.l_pid);%dn,lock.l_pid); lock.l_type = type;lock.l_type = type;if(fcntl(fd,F_SETLKW,&lock) 0)if(fcntl(fd,F_SETLKW,&lock) 0) printf(Lock failed:type = printf(Lock f

35、ailed:type = %dn,lock.l_type);%dn,lock.l_type);return 1;return 1; switch(lock.l_type)switch(lock.l_type) case F_RDLCK:case F_RDLCK:printf(Read lock set by printf(Read lock set by %dn,getpid();%dn,getpid();break;break;case F_WRLCK:case F_WRLCK:printf(Write lock set by printf(Write lock set by %dn,getpid();%dn,getpid();break;break;case F_UNLCK:case F_UNLCK:printf(Release lock set by printf(Release lock set by %dn,getpid();%dn,getpid();return 1;return 1;break;break;default:default:break;break; return 0;return 0; linux教程 第06课_文件系统

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号