Linux文件管理.docx
- 文档编号:6258404
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:32
- 大小:81.12KB
Linux文件管理.docx
《Linux文件管理.docx》由会员分享,可在线阅读,更多相关《Linux文件管理.docx(32页珍藏版)》请在冰豆网上搜索。
Linux文件管理
第5章Linux文件管理
●每种操作系统都有自己独特的文件系统,如MS-DOS文件系统、UNIX文件系统等。
●文件系统包括了文件的组织结构、处理文件的数据结构、操作文件的方法等。
●Linux自行设计开发的的文件系统称为EXT2。
●Linux还支持多种其它操作系统的文件系统,例如minix、ext2、hpfs、msdos、umsdos、iso、nfs、sysv、affs、ufs、efs等达二十几种。
●Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。
§5.1Linux文件系统概论
一.Linux文件系统的树型结构
●Linux文件系统采用了多级目录的树型层次结构管理文件。
●树型结构的最上层是根目录,用/表示。
在根目录之下是各层目录和文件。
●在每层目录中可以包含多个文件或下一级目录。
●每个目录和文件都有由多个字符组成的目录名或文件名。
●系统在运行中通过使用命令或系统调用进入任何一层目录,
这时系统所处的目录称为当前目录
●Linux使用两种方法来表示文件或目录的位置,
绝对路径和相对路径。
●绝对路径是从根目录开始依次指出各层目录的名字,
它们之间用”/”分隔,如/usr/include。
●相对路径是从当前目录开始,指定其下层各个文件及目录的方法,如系统当前目录为/usr,bin/cc。
●Linux的一个目录是一个驻留在磁盘上的文件,称为目录文件。
系统对目录文件的处理方法与一般文件相同。
●目录由若干目录项组成,每个目录项对应目录中的一个文件。
●在一般操作系统的文件系统中,目录项由文件名和属性、位置、大小、建立或修改时间、访问权限等文件控制信息组成。
●Linux继承了UINX,把文件名和文件控制信息分开管理,
●文件控制信息单独组成一个称为i节点(inode)的结构体。
inode实质上是一个由系统管理的“目录项”。
●每个文件对应一个inode,它们有唯一的编号,称为inode号。
●Linux的目录项只由两部分组成:
文件名和inode号。
二.文件的类型
1.普通文件
计算机用户和操作系统用于存放数据、程序等信息的文件。
一般都长期地存放在外存储器(磁盘、磁带等)中。
普通文件一般又分为文本文件和二进制文件。
2.目录文件
是文件系统中一个目录所包含的目录项组成的文件。
目录文件只允许系统进行修改。
用户进程可以读取目录文件,但不能对它们进行修改。
两个特殊的目录项”·”代表目录本身,”··”表示父目录。
3.设备文件
用于与I/O设备提供连接的一种文件,分为字符设备文件和块设备文件,对应于字符设备和块设备。
Linux把对设备的I/O做为普通文件的读取/写入操作内核提供了对设备处理和对文件处理的统一接口。
每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器:
/dev/fd0。
4.管道文件
主要用于在进程间传递数据。
管道是进程间传递数据的“媒介”。
某进程数据写入管道的一端,另一个进程从管道另一端读取数据。
Linux对管道的操作与文件操作相同,它把管道做为文件进行处理。
管道文件又称先进先出(FIFO)文件。
5.链接文件
又称符号链接文件,它提供了共享文件的一种方法。
在链接文件中不是通过文件名实现文件共享,是通过链接文件中包含的指向文件的指针来实现对文件的访问。
普通用户可以建立链接文件,并通过其指针所指向的文件。
使用链接文件可以访问普通文件,还可以访问目录文件和不具有普通文件实态的其它文件。
它可以在不同的文件系统之间建立链接关系,
●从对文件内容处理的角度,无论是哪种类型的文件,Linux都把它们看做是无结构的流式文件,即把文件的内容看做是一系列有序的字符流,
三.文件的访问权限
●为了保证文件信息的安全,Linux设置了文件保护机制,其中之一就是给文件都设定了一定的访问权限。
●当文件被访问时,系统首先检验访问者的权限,只有与文件的访问权限相符时才允许对文件进行访问。
●Linux中的每一个文件都归某一个特定的用户所有,而且一个用户一般总是与某个用户组相关。
●Linux对文件的访问设定了三级权限:
文件所有者,与文件所有者同组的用户,其他用户。
●对文件的访问主要是三种处理操作:
读取、写入和执行。
●三级访问权限和三种处理操作形成了9种情况:
§5.2EXT2文件系统
●Linux最初引进了Minix文件系统。
Minix文件系统有较大的局限性。
●1992年4月推出EXT(EXTendedFilesystem)
●1993年推出了EXT2文件系统。
●EXT2已经成为Linux的标准文件系统。
一.EXT2文件系统的构造
●文件是存储在块设备上的。
●在块设备中文件的组织和管理是以物理块为单位的。
物理块是块设备上划分的大小相同的存储区域,如磁盘的扇区。
●当文件存储在块设备上时也被划分成与物理块大小相等的逻辑块。
文件在存储设备中是由一系列的逻辑块序列组成的。
●一个文件系统一般使用块设备上的一个独立的逻辑分区。
●在文件的逻辑分区中除了表示文件内容的逻辑块(称为数据块)外,还设置了若干包含管理和控制信息的逻辑块。
●EXT2文件系统也是由逻辑块序列组成的。
●EXT2文件系统把所使用的逻辑分区划分成块组(BlockGroup),并从0开始依次编号。
●每个块组中包含若干数据块,数据块中就是目录或文件内容。
●块组中包含着几个用于管理和控制的信息块:
●
超级块、组描述符表、块位图、inode位图和inode表。
二.EXT2超级块(superblock)
●超级块是用来描述EXT2文件系统整体信息的数据结构主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。
●超级块对于文件系统的维护是至关重要的。
●超级块位于每个块组的最前面,每个块组中包含的超级块内容是相同的。
●在系统运行期间,需要把超级块复制到内存的系统缓冲区内。
只需把块组0的超级块读入内存,其它块组的超级块做为备份。
●在Linux中,EXT2超级块定义为ext2_super_block结构。
成员项
意义
s_inodes_count
inode的总数量
s_blocks_count
块的总数量
s_r_blocks_count
保留块的数量
s_free_blocks_count
空闲块的数量
s_free_inodes_count
空闲inode数量
s_first_data_block
第一个数据块的块号
s_log_block_size
逻辑块长度
s_log_frag_size
片(fragment)长度
s_blocks_per_group
每个块组包含的块数
s_frags_per_group
每个块组包含的片(fragment)数
s_inodes_per_group
每个块组包含的inode数
s_mtime
安装时间
s_wtime
最后一次写入时间
s_mnt_count
安装计数,每安装一次其值增1
s_max_mnt_count
安装最大数,达到此数将显示警告信息
s_magic
文件系统署名,EXT2为0xEF53
s_state
文件系统状态
s_errors
出错时文件系统的动作
s_minor_rev_level
改版标志
s_lastcheck
最后一次文件系统检测时间
s_checkinterval
两次检测相隔的最大时间间隔
s_creator_os
可以使用该文件系统的操作系统的ID
s_rev_level
版本标志,系统以此识别是否支持某些属性
s_def_resuid
可以使用保留块的默认用户uid
s_def_resgid
可以使用保留块的默认用户组gid
二.内存中超级块的映像
●ext2_super_block结构是超级块在磁盘中的形态。
●在系统运行期间磁盘上的超级块要读入到内存,
在内存建立一个超级块的映像。
●内存中的超级块映像定义为ext2_sb_info结构,
在/include/linix/ext2_fs_sb.h中定义如下:
structext2_sb_info{
unsignedlongs_frag_size;/*fragment片的长度,以字节为单位*/
unsignedlongs_frags_per_block;/*每块中fragment片数*/
unsignedlongs_inodes_per_block;/*每块中inode数*/
unsignedlongs_frags_per_group;/*每一块组中fragment数*/
unsignedlongs_blocks_per_group;/*每一块组中块数*/
unsignedlongs_inodes_per_group;/*每一块组中inode数*/
unsignedlongs_itb_per_group;/*每一块组中inod表占用的块数*/
unsignedlongs_db_per_group;/*每一块组中描述符占用的块数*/
unsignedlongs_desc_per_block;/*一块中组描述符数*/
unsignedlongs_groups_count;/*整个文件系统中的块组数*/
structbuffer_head*s_sbh;/*指向内存中包含超级块的缓冲区的指针*/
structext2_super_block*s_es;/*指向缓冲区中超级块的指针*/
structbuffer_head**s_group_desc;/*指向缓冲区组描述符数组的指针*/
structbuffer_head**s_group_desc;/*指向缓冲区组描述符数组的指针*/
unsignedshorts_loaded_inode_bitmaps;/*装入缓冲区的inode位图块数*/
unsignedshorts_loaded_block_bitmaps;/*装入缓冲区的块位图块数*/
unsignedlongs_inode_bitmap_number[EXT2_MAX_GROUP_LOADED];
/*inode位图数组*/
structbuffer_head*s_inode_bitmap[EXT2_MAX_GROUP_LOADED];
/*inode位图指针数组*/
unsignedlongs_block_bitmap_number[EXT2_MAX_GROUP_LOADED];
/*块位图数组*/
structbuffer_head*s_block_bitmap[EXT2_MAX_GROUP_LOADED];
/*块位图指针数组*/
ints_rename_lock;/*重命名时的锁信号量*/
structwait_queue*s_rename_wait;/*重命名时的等待队列指针*/
unsignedlongs_mount_opt;/*安装选项*/
unsignedshorts_resuid;/*可以使用保留块的用户uid*/
unsignedshorts_resgid;/*可以使用保留块的用户组gid*/
unsignedshorts_mount_state;/*超级用户使用的安装选项*/
unsignedshorts_pad;/*填充*/
ints_addr_per_block_bits;/*块地址(编号)的位(bit)数*/
ints_desc_per_block_bits;/*块描述符的位(bit)数*/
ints_inode_size;/*inode长度*/
ints_first_ino;/*第一个inode号*/
};
四.组描述符
组描述符表的每个表项是一个组描述符。
组描述符是一个ext2_group_desc结构,用来描述一个块组的有关信息,
定义在/include/linix/ext2_fs.h中:
structext2_group_desc
{
__u32bg_block_bitmap;/*本组中块位图的位置*/
__u32bg_inode_bitmap;/*本组中inode位图的位置*/
__u32bg_inode_table;/*本组中inode表的位*/
__u16bg_free_blocks_count;/*本组中空闲块数*/
__u16bg_free_inodes_count;/*本组中空闲inode数*/
__u16bg_used_dirs_count;/*本组中所含目录数*/
__u16bg_pad;/*填充*/
__u32bg_reserved[3];/*保留*/
};
●Linux的组描述符为32字节,
●每一个块组有一个组描述符。
●所有的组描述符集中在一起依次存放,形成组描述符表。
●描述符表中的组描述符的顺序与块组在磁盘上的顺序对应。
●组描述符可能占用多个物理块。
●具有相同内容的组描述符表放在每个块组中做为备份,
五.块位图
●EXT2文件系统中数据块的使用状况由块位图来描述。
●每个块组都有一个块位图,位于组描述符表之后,用来描述本块组中数据块的使用状况。
●块位图的每一位(bit)表示一个数据块的使用情况,为1表示对应的数据块已占用,为0表示数据块空闲。
●各位(bit)的顺序与块组中数据块的顺序一致。
●块位图一般占用一个逻辑块。
●EXT2块位图装入一个高速缓存中。
●高速缓存容纳EXT2_MAX_GROUP_LOAD个块位图,该值目前定义为8。
●系统并采用类似LRU的算法管理高速缓存。
●在超级块的内存映像ext2_sb_info结构中,
s_loaded_block_bitmaps表示装入高速缓存的块位图的数目。
s_block_bitmap_number[]存放装入高速缓存的块位图的块组号,
s_block_bitmap[]数组中是相应块位图在高速缓存的地址。
§5.3EXT2的inode和目录结构
一.EXT2文件系统inode结构
●在EXT2文件系统中inode是基本的构件,它表示文件系统树型结构的节点。
每一个节点是一个文件或目录。
●EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。
●在Linux中EXT2文件系统的inode
定义为structext2_inode。
该定义在/include/linux/ext2_fs.h中。
成员项
意义
i_mode
文件类型和访问权限
i_uid
文件所有者用户uid
i_size
文件大小,以字节为单位
i_atime
文件最后一次访问时间
i_ctime
该inode最后修改时间
i_mtime
文件内容最后修改时间
i_dtime
文件删除时间
i_gid
文件的用户组标识gid
i_links_count
文件的链接数
i_blocks
文件所占块数(每块512字节)
i_flags
文件标志(属性)
i_block[]
数据块指针数组
i_version
文件版本(用于NFS)
i_file_acl
文件访问控制链表(Linux2.0以后版本不再使用)
i_dir_acl
目录访问控制链表(Linux2.0以后版本不再使用)
i_faddr
Fragment地址
i_frag
每块中的片数
i_fsize
片大小
i_pad1
填充
i_reserved2
保留
①i_mode指定了inode文件的类型和访问权限:
S_IFREG普通文件S_IFBLK块设备文件S_IFDIR目录文件S_IFCHR字符设备文件FIFO文件S_IFLNK符号链接文件
S_ISUID访问权限设定为用户id
S_ISGID访问权限设定为用户组id
②i_block[]指针数组,指向文件内容所在的数据块。
i_block[]数组共有15个指针,
前12个指针直接指向数据块称为直接块指针。
第13个元素是一次间接块指针。
第14个元素是二次间接块指针。
第15个元素是三次间接块指针。
③i_flags是文件属性的标志:
EXT2_SECRM_FL完全删除标志。
。
EXT2_UNRM_FL可恢复删除标志。
EXT2_COMPR_FL文件压缩标志。
EXT2_SYNC_FL同步更新标志。
EXT2_IMMUTABLE_FL不允许修改标志。
EXT2_APPEND_FL追加写标志。
EXT2_NODUMP_FL非转储标志。
EXT2_NOATIME_FL不变更文件访问时间atime
二.EXT2inode在内存中的映像
●EXT2文件系统的inode与文件一起存放在外存,
●在系统运行时,把EXT2的inode写入内存建立映像,
●该内存映像定义为ext2_inode_info结构,
在include/linux/ext2_fs_i.h中,如下所示:
structext2_inode_info{
__u32i_data[15];/*数据块指针数组*/
__u32i_flags;/*文件标志(属性)*/
__u32i_faddr;/*Fragment(片)地址*/
__u8i_frag_no;/*Fragment(片)号*/
__u8i_frag_size;/*Fragment(片)大小*/
__u16i_osync;/*同步标志*/
__u32i_file_acl;/*文件访问控制链表*/
__u32i_dir_acl;/*目录访问控制链表*/
__u32i_dtime;/*文件删除时间*/
__u32i_version;/*文件版本*/
__u32i_block_group;/*inode所在块组号*/
__u32i_next_alloc_block;/*下一个要分配的块*/
__u32i_next_alloc_goal;/*下一个要分配的对象*/
__u32i_prealloc_block; /*预留块首地址*/
__u32i_prealloc_count;/*预留计数*/
inti_new_inode:
1;/*标志,是否为新分配的inode*/
};
三.inode表和inode位图
●一个块组中所有文件的inode形成了inode表。
●表项的序号就是inode号。
●inode表存放在块组中所有数据块之前。
●inode表在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。
●inode位图反映了inode表中各个表项的使用情况,它的一位(bit)表示inode表的一个表项,若某位为1表示对应的表项已占用,为0表示表项空闲。
●inode位图也装入一个高速缓存中。
●在ext2_sb_info结构中,
s_loaded_inode_bitmaps:
装入高速缓存的inode位图的数目。
s_block_inode_number[]:
装入高速缓存的inode位图的块组号,
s_inode_bitmap[]:
相应inode位图在高速缓存中的地址。
●两个数组大小EXT2_MAX_GROUP_LOAD(当前值为8)。
四.EXT2的目录结构
●在EXT2中,目录是一个特殊的文件,称为目录文件。
●在目录文件中,目录项是ext2_dir_entry结构体,它们前后连接成一个类似链表的形式。
structext2_dir_entry{
__u32inode;/*inode号*/
__u16rec_len;/*目录项长度*/
__u16name_len;/*文件名长度*/
charname[EXT2_NAME_LEN];/*文件名*/
};
其中:
#defineEXT2_NAME_LEN255
§5.4虚拟文件系统VFS
●Linux除了自己的文件系统EXT2,
还支持多种其它操作系统的文件系统。
●Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,
为处理各种不同文件系统提供了统一的接口。
●在VFS管理下,Linux不但能够读写各种不同的文件系统,
而且还实现了这些文件系统相互之间的访问。
一.VFS的工作原理
●Linux支持的各种实际文件系统,
如EXT2、minix、msdos、sysv等称为物理文件系统。
●不同物理文件系统具有不同的组织结构和不同的处理方式。
●操作系统必须把各种不同的物理文件系统的所有特性进行抽象,
建立起一个面向各种物理文件系统的转换机制,通过这个
转换机制,把各种不同物理文件系统转换为一个具有
统一共性的虚拟文件系统。
这种转换机制称为
虚拟文件系统转换VFS(VirtualFilesystemSwitch)
●VFS实际上向Linux内核和进程提供了一个处理
各种物理文件系统的公共接口,通过这个接口使得
不同的物理文件系统看来都是相同的。
●VFS并不是一种实际的文件系统
●EXT2等物理文件系统是存在于外存空间的,而VFS仅存在于内存
●VFS是在系统启动时建立,在系统关闭时消失的,物理文件系统是长期存在于外存。
●在VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块、VFS的inode等,各种操作函数的转换入口。
二.文件系统的注册
●Linux支持的文件系统必须注册后才能使用,文件系统不再使用时则予以注销。
●向系统内核注册有两种方式,一种是在系统引导时在VFS中注册,在系统关闭时注销。
另一种是把文件系统做为可装卸模块,在安装时在VFS中注册,并在模块卸载时注销。
●文件系统的注册由VFS中的注册链表进行管理。
●每个注册的文件系统登记在file_system_type结构体中,
●file_system_type结构体组成一个链表,称为注册链表,
●链表的表头由全局变量file_system给出。
structfile_system_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 文件 管理