我们知道目前个人计算机中常见硬盘的接口有两种,一种是IDE接口的,另一种是SATA接口的,SATA接口的硬盘传输速度比IDE接口的硬盘传输速度快。因此SATA接口的硬盘以成为目前主流的硬盘。
当然,我们之前提过,在linux系统中,一切皆文件,所以设备在linux系统中,也是以文件的形式存在的。那么IDE硬盘和SATA硬盘如何在linux中命名的呢?
在IDE硬盘中有2个IDE接口,我们称为IDE1接口和IDE2接口,每一个接口可以接2个IDE设备,其中一个是主设备,另一个称为次设备。
因此,IDE硬盘的文件命名如下:
主设备 | 次设备 | |
第一个IDE接口 | /dev/hda | /dev/hdb |
第二个IDE接口 | /dev/hdc | /dev/hdd |
而每一个设备上存在着多个分区(分割槽),形如windows系统上面的c、d、e盘等等。那么这些分割槽该如何命名呢?
只需要在每一个设备的文件名后面加上数字即可。例如第一个分割槽为/dev/hda1...依次类推。
不过由于硬盘上面有分区的限制,主分区和扩展分区不能超过4个,因此当设备名为/dev/hd5时表示为第一个逻辑分区。关于分区的概念将在后续探讨。
关于SATA接口的硬盘命名与IDE硬盘不同,因为SATA硬盘命名是根据侦测到的设备的先后顺序来命名的。也就是说第一个侦测到的设备命名为/dev/sda,第二个侦测到的设备命名为/dev/sdb...依次类推。
其中SCSI接口的硬盘和USB接口的硬盘命名规则和SATA接口的硬盘命名方式一样。因为这三种接口的硬盘都是用SCSI模块来驱动的。
由上面可以知道,硬盘的类型有多种多样的,也就是说SATA类型的硬盘有/dev/sda,/dev/sdb这两个硬盘;而SCSI类型的硬盘也有/dev/sda,/dev/sdb这两个硬盘,那么我们该如何识别这些硬盘呢?
其实很简单,我们只要给每一个文件加上一个主设备号和次设备号即可。
主设备号:全程为major number,用来标识硬盘类型的,区分不同类型的硬盘的
次设备号:全程为mintor number,用来标识同一种类型下的不同设备文件
因此,给每一个设备加上主设备号和次设备号来区分即可。
那么该如何创建一个设备文件呢?
语法格式:mknod [option] ...NAME TYPE [MAJOR MINTOR]
说明TYPE指的是设备文件类型(包含块设备文件和字符设备文件),而不是指的是硬盘类型。硬盘是属于块设备文件的。
-m MODE:指定文件的权限
NAME:为设备文件名
接下来我们开始谈谈硬盘的组成部分。
硬盘主要由磁盘盘面、机械手臂、磁头、主轴马达组成的。
而磁盘盘面又由扇区和磁柱组成。
扇区:特别是第一扇区里面包含了MBR和分割表,;每一个扇区共512Byte
那么什么是MBR呢?
MBR:全称Master Boot Record,是存放开机管理程序的地方,一共446Byte
分割表:全称partition table:是记录整个磁盘分割的状态,一共64Byte,每16Byte
来标一个分区,因此只可以标识4个分区。
另外2Byte来标识MBR是否有效
磁柱:磁柱是文件系统或者分割槽最小的组成单位,因此,磁柱的范围决定了分割槽的大小。
磁柱分为起始磁柱和结束磁柱。
关于分区的概念
在上面谈到的扇区里面包含有分割槽,而分割槽就是来记录磁盘分区的状态的。那么磁盘上面可以创建多少个分区呢?这些分区又有什么区别的呢?
其实磁盘上面可以最多可以创建4个分区,包括主分区和扩展分区,其中扩展分区最多只能有一个。
而扩展分区又可以划分多个逻辑分区,这就是为什么我们在系统上面看到不只有4个分区的原因。
所以磁盘上分区的组成是这样的:
主分区+[(最多一个)扩展分区]
那么主分区和扩展分区有什么区别呢?
主分区:可以写入数据,可以进行高级格式化,但是不能划分逻辑分区
扩展分区:不能写入数据,不能进行高级格式化,但是可以划分逻辑分区。
逻辑分区:可以写入数据,可以进行高级格式化
所谓高级格式化就是用来创建文件系统的,低级格式化是来创建磁道的
那么什么是文件系统的呢?
刚刚说过主分区和逻辑分区可以进行高级格式化,而格式化后就是一个文件系统。
文件系统的组成结构
为了方便管理inode和block,文件系统在格式化时会划分多个块组。
每一个块组里包含有Superblock 、inode、data block、inode bitmap、block bitmap等信息。
在文件系统的最前面有一个启动扇区(boot sector),里面存放的是开启启动程序bootloader。
文件系统的结构图如下:
每一个block group的组成部分如图所示:
其中蓝色方框为block group(块群组),每一个块群组里面包含了Superblock、Filesystem Description、inode table、data block、inode bitmap以及block bitmap等信息。
Superblock:用来记录整个文件系统的相关信息,包括block和inode的总量及大小,还有文件系统的挂
载时间和、最近一次数据写入的时间和最近一次磁盘检验的时间等相关信息。Superblock
可以有多个,其他的Superblock是第一个Superblock的备份。
inode size为128Bytes
block size=[1024Bytes|2048Bytes|4096Bytes]
Filesystem Description:这个里面记录的是每一个block group的起始block号和结束block号,以及
Superblock、inode table、data block、inode bitmap和block bitmap所在的block号。
Superblock在0或1block中。
data block:其实就是文件实际内容存放的地方
inode table:记录的是指定文件的元数据及该存放该文件实际内容的block号(注意不存放文件名)
文件的元数据:文件的权限(rwx)、文件的大小、文件的时间戳、文件属主和属组。
block bitmap:这个里面记录的是哪些block是没有使用的的,哪些block是已经使用的
inode bitmap:和block bitmap一样,记录的是哪些inode是已经使用的,哪些还没有使用。
其实我们可以把文件系统比喻成一个图书馆,而块群组就是每一个书架,书架上面放着许多的书,而这些书可以看做是data block,而某本书一定存放在某个特定的位置上,因此只要找到这个位置就可以找到这本书,这个位置可以看做是inode。而inode bitmap可以来看作标记哪些位置是空的,哪些不是空的,以便于可以重新放书。而block bitmap可以理解为书架上已经存放了多少本书,还有多少本书没有存放。
inode的特点
1、每一个文件占用一个inode。
2、每一个inode的固定大小均为128bytes。
3、系统能够创建的文件数量和inode的数量有关。
目录树的组成结构
从上面知道每一个文件都对应这一个inode,因此目录也是文件,所以也有一个inode号与之对应。
那么目录下到底存在着什么内容呢?
其实目录下只存放着文件名以及该文件名所对应的inode号。通过文件的inode号,查找inode table就可以知道实际存放该文件内容的block号,找到该block号就可以读取文件中的内容了。
目录下的结构为:
以下示例将演示一个完整文件读取的流程:以/etc/passwd为例
1、首先系统通过自引用,找到/inode,在找到/所对应的block号
2、通过上面的block号,找到该block里面含有etc/文件以及该文件所对应的inode号(如1111)
3、通过上面的1111inode号,可以找到etc/的block号
4、找到etc/block后,发现里面含有passwd文件以及passwd文件所对应的inode号(如2222)
5、通过2222inode号,找到passwd的block号
6.找到passwd的block号,就可以读取passwd里面的实际内容了
了解了上面的文件系统后,再来谈谈文件系统的类型
linux支持的文件系统类型有:
ext2,ext3,ext4,xfs,reiserfs,ifs,nfs,ocfs2,gfs2,swap等
每一种文件系统类型的读取方式可能不一样,所以当我们读取某个文件系统上面的文件时,是不是需要指定特别文件系统呢?当然不是,其实linux整个系统都是透过VFS(virtual FileSystem)的核心功能来读取文件系统的。透过VFS来管理各种各样的文件系统的。当用户读取某个文件系统上面的内容时,VFS可以将其转换成某种特定的文件系统来读取。
硬链接和符合链接
硬链接:就是多个文件占用一个inode,所以删掉其中一个文件时,文件并没有删除。
硬链接具有的特效:
1、只对普通文件有效,对目录无效
2、不能跨越文件系统
3、创建硬链接时被链接的链接次数增加
软连接或者符号链接:就是创建一个新文件,并将数据的读取指向它连接的文件名(不是文件的inode)。
1、可以应用于目录
2、可以跨文件系统
3、不会增加被连接的链接次数
4、文件的大小就是该路径的字符个数
语法格式:
ln [-sv] SRC DES
-s:用于创建软链接,默认为创建硬链接
-v:显示创建过程