对Linux目录和文件系统的理解

来源:互联网 发布:美国类似知乎的网站 编辑:程序博客网 时间:2024/06/01 09:49

Linux里最重要的理念是“一切对象都是文件

所有的目录,文件,命令(也是一种可执行文件),设备等,归根结底都是一种文件,被分成若干个基本的存储单元,存放在磁盘的不同物理地址上,并具有特定的读,写,执行权限。

Linux中文件类型只有以下这几种: 
1.-,普通文件。 
2.d,目录文件,d是directory的简写。 
3.l,软连接文件,亦称符号链接文件,s是soft或者symbolic的简写。 
4.b,块文件,是设备文件的一种(还有另一种),b是block的简写。 
5.c,字符文件,也是设备文件的一种(这就是第二种),c是character的文件。


所以用户在Linux系统里做的一切操作,本质上就是从磁盘读取文件到内存,再由CPU处理。


既然是文件,就需要由文件系统来进行管理了,Linux常用的文件系统有:ext2,ext3,ext4,reiserFS,Fat32,NFS等。

但不管采用哪种文件系统,都是由Linux内核里的一个VFS(虚拟文件系统交换器)功能来统一管理的(启动时会加载到内存),存放在磁盘上去的机制都是一样的,这里说明几个概念:

磁盘:是一个设备,如下图的 /dev/sda

如图1


分区:从磁盘上划出的一块空间,如下图的 /sda1,/sda2等

如图2

分区是从磁盘上划出来的,可以是整块磁盘那么大,也可以是部分磁盘空间


在传统意义上,一个分区只能格式化为一个文件系统,所以通常认为一个文件系统就是一个分区;不过随着现在LVM和软raid等技术的出现,可以将一个分区格式化成多个文件系统(如LVM),也可以将多个分区合并成一个文件系统(LVM,软Raid),所以现在都淡化了这种说法


Block(块):是文件系统读写,存放数据的最小单位,可以自己设置,在EXT2文件系统里只有1KB,2KB,4KB三种可选,别的文件系统情况略有不同,这里按EXT2来理解这个概念。每个Block里只能存放一个文件的数据。如果文件大于Block大小,则该文件会占用多个Block;如果文件小于Block大小,他也会完全占用该Block,剩余的空间也不会再被使用(磁盘空间会浪费)。

因此,在对Block大小进行设置的时候要考虑当前系统存放的数据的特点,如果有很多小于Block大小的文件,格式化的时候却把Block设置成较大,这样会造成很多的磁盘空间浪费;反之,如果系统里以大文件居多,这时却把Block设置成较小,固然不会浪费磁盘空间,但也导致Block较多,影响读写性能。


Sector(扇区):是磁盘控制器每次对磁盘进行读写的最小单位,如下图


如图3

磁盘的机械臂每次落下升起所能读写到的一段数据,是最小的物理存储单位,一般为512字节,这个大小是由磁盘生产厂家设定好的,用户更改不了。磁盘读到的Sector数据会先存放在磁盘的缓存里(现在的硬盘一般都有64M的缓存芯片,服务器的阵列卡也有缓存),直到整个Block的所有Sector都缓存到了才会传输给内存,交由文件系统处理(由于每个Block对磁盘来说都是连续写入连续读取的,故读写效率较高)


inode:注意,这是Linux里非常重要的一个设计,将文件的属性,权限等和文件的实际数据分开存放;其中,inode用来记录文件的属性,一个文件占用一个inode,同时记录该文件数据所在的Block号码,所以可以认为,inode是一个文件的索引,具有如下属性:

1.记录如下内容:文件的访问权限(读/写/执行);文件的所有者和组;文件的大小;文件的ctime,atime和mtime;定义文件特性的标志(flag),如SetUID等;文件真正内容的指向(pointer)

2.每个inode大小为128B,每个文件都会且仅会占用一个inode

3.文件系统在格式化的时候会自动分配inode和Block的数量

4。inode每记录一个Block要花费4B空间,一个inode里最多只能直接记录12个Block地址,如果文件所占用Block数量超过了12个,inode将会将其他信息写在间接,双间接,三间接记录Block里

5.系统读写文件时先找到inode,再比对inode所记录的权限与用户是否符合,若符合才能实际读写Block内的数据

6.文件系统根目录的inode号码一般为第二个inode

7.inode里不记录文件名,文件名是记录在目录(也是一种普通文件)里的


因此,Linux通过inode就可以实现对不同用户的文件权限管理,一般来说文件系统初始格式化的时候会把磁盘分成两部分,一部分是inode,一部分是block,其中inode数量是小于block数量的(因为很多文件要占用不只一个block),极端情况下出现inode用完了,但block还有剩余,这时候也不能继续新建文件了


目录:也是文件的一种,自然也有自己的inode和block,目录的inode主要记录目录的属性,权限等,目录的block主要记录目录下的文件名和对应的inode

目录有以下属性:

1.创建的时候会分配一个inode给目录,如果目录是空的,则不占用block,如果目录下文件过多,可能会占用多个block

2.访问文件时,先访问文件所在目录的inode,验证是否有权限,如果有则访问对应父目录的block,获得该文件对应inode,验证是否有该文件的权限,若有则访问该文件的block

3.那么父目录的inode位置从哪里获得呢?当然是父目录的父目录啦!这样层层递推,Linux对所有文件的访问都是从最上层的根目录开始的

4.根目录的inode是固定的,一般是2号inode,根目录的上层目录就是他自己


super block:也是一个block,用来记录文件系统的整体信息,包括 inode/block总量,使用量,剩余量,以及文件系统的格式与相关信息等


boot  sector:每个分区的第一个扇区,可以(如果是启动分区可能)安装该分区的引导记录,占1024B(1KB)


MBR:主引导记录,占446B,与分区表(记录每个分区是从第几个柱面到第几个柱面,占64B)一起共占有512B,位于整块磁盘的第一个sector


主引导记录(MBR)与引导扇区(Boot Sector)是两种不同而又有联系的概念。
引导扇区是引导设备上面的特定存储区域,主引导记录是一些代码和一些数据。主引导记录是存储在主引导扇区里面的数据内容,每个分区引导扇区里也可能存储了该分区的分区引导记录。

每个分区都有一个boot sector,但是一个设备仅有一个MBR,存放在主引导扇区上


boot sector和superblock之间的关系:由于boot sector和superblock均为1024B大,如果文件系统设置的Block大小为1KB的话,那么刚好占满,因此superblock会位于第二个block上;如果设置Block的大小为2K,4K或者更大的话,可以同时位于第一个block中


block group:EXT2文件系统在格式化的时候会把所有的块划分成几个块组,每个块组有自己独立的inode/block系统,一个文件系统(分区)有一到若干个block group,第一个块组的第一个block为boot sector,随后是superblock(有可能在第一个或者第二个block),紧接着几个block是File system Description(文件系统说明,用来记录block bitmap和inode bitmap等),再后面才是data block

除了第一个块组外的其他块组也可能有superblock,作为第一个块组的superblock的备份








0 0