硬盘是由一个个圆形的盘片组全起来的,从物理特性上看,硬盘盘片的转速越快,它的性能就越好,而且我们的磁道越靠外部,它的读写性能就越高,这是因为,磁道越靠外部,单位时间内读到的信息越多,所以一般把系统装在硬盘的最外层分区中。
为了更直观了解硬盘的分区及内容,我们先看如下一张图:
如下是对图中每个字段的含义解释
一个硬盘从外面到圆心画一个个同心圆,不同的同心圆就是不同的磁道,一个磁道按512字节为单位,划分为一个个的扇区,多个盘片的同一位置的同心圆组成一个柱面,分区时以柱面为单位
扇区:一个扇区为512节,为最小的物理存储单位
磁道:磁盘的同心圆
block:用文件系统格式化后,一个块的大小,一般有1k,2k,4k为单位。
第0个盘面,0个柱面,0个扇区
MBR
硬盘的第0个盘面,第0磁道,第0扇区,这一个512字节最重要,MBR和操作系统无关,它是独立于操作系统之外独立存在的。它分为三段:
A.Bootloader,占前面446字节,是引导程序,引导你硬盘上的操作系统进行启动
B.接下来64字节存储分区表(partition table)信息,每16字节标识一个分区
C.Magic number,占两个字节,用来标识此MBR是否有效
partition table:
因为这个只占64byte,每个分区占16byte,所以可以有四条分区记录,这四条记录为主分区或扩展分区,其中扩展分区还可以再分出逻辑分区
主分区与扩展分区之和最多是4个(硬盘的分区表64byte限制)
扩展分区最多只能有一个(操作系统限制)
逻辑分区是由扩展分区再分出来的分区
boot sector
一个分区的最前面1024个字节为boot sector,后面才是接superblock,它可以安装引导装载程序,利用它可以作出多重引导的环境
super block
记录整个文件系统的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式与相关信息
File system Description
描述每个block group的开始与结束的block号码
block bitmap
通过block bitmap来记录每个block的状态,如是否被使用,这样操作系统可以很快去找到空的block分配给新文件,删除文件的过程只是标记这个block没有并使用,实际的文件内容还是在的。
inode bitmap
与block bitmap类似,记录每个inode的状态,如是否已经被使用,这样操作系统可以很快去找到空的inode分配给新文件,删除文件的过程只是标记该inode为未使用
inode table
由多个inode组成,一个文件占用一个inode,一个inode占用128byte,记录文件的属性,如
对应文件的权限,对应文件的属主属组,对应文件的时间戳,对应文件的大小,
对应文件内容所存储的block号码
inode记录一个block号需要花掉4byte,有12个直接指向block号码,一个指向间接,一个指向双间接和一个指向三间接
所以如果一个block有1k,它的文件内容最大值为:
12个直接指向:121k=12K
一个间接:1k256=256k (记录一个block需要4byte,故一个block能记录256个block)
双间接:1K256256=256^2K
三间接:1K256256*256=256^3k
所以总额为12+256+2562+2563=16843020K=16G
注意: 这面的inode并没有保存文件名,文件名保存在目录文件的inode所对应的block中,目录也是一种文件。
block的大小有1k,2k,4k等,它实际记录文件的内容,大文件会占用多个block
用dumpe2fs命令可以查看superblock及每个block group的信息,如下:
Inode count: 128016
Block count: 512000
Free blocks: 453079
Free inodes: 127977
Block size: 1024
Inode size: 128
Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
Checksum 0x5210, unused inodes 2014
Primary superblock at 1, Group descriptors at 2-3
Reserved GDT blocks at 4-259
Block bitmap at 260 (+259), Inode bitmap at 276 (+275)
Inode table at 292-545 (+291)
3820 free blocks, 2014 free inodes, 2 directories, 2014 unused inodes
Free blocks: 4373-8192
Free inodes: 19-2032
Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x7f25, unused inodes 2032
Backup superblock at 8193, Group descriptors at 8194-8195
Reserved GDT blocks at 8196-8451
Block bitmap at 261 (+4294959364), Inode bitmap at 277 (+4294959380)
Inode table at 546-799 (+4294959649)
1090 free blocks, 2032 free inodes, 0 directories, 2032 unused inodes
Free blocks: 15295-16384
Free inodes: 2033-4064
Group 2: (Blocks 16385-24576) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x1d68, unused inodes 2032
Block bitmap at 262 (+4294951173), Inode bitmap at 278 (+4294951189)
Inode table at 800-1053 (+4294951711)
0 free blocks, 2032 free inodes, 0 directories, 2032 unused inodes
Free blocks:
Free inodes: 4065-6096
Group 3: (Blocks 24577-32768) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x4ef8, unused inodes 2032
Backup superblock at 24577, Group descriptors at 24578-24579
Reserved GDT blocks at 24580-24835
Block bitmap at 263 (+4294942982), Inode bitmap at 279 (+4294942998)
Inode table at 1054-1307 (+4294943773)
1789 free blocks, 2032 free inodes, 0 directories, 2032 unused inodes
Free blocks: 24836-26624
Free inodes: 6097-8128
因为super block损坏的话相当于整个分区都用不了,所以可以看到superblock不仅在第一个block group有存在,它也同时备份在其它的block group中,达到更安全的备份机制。
目录树
Linux是树状的文件结构,每个都从根开始,当我们创建一个目录时,系统会分配给它一个inode,及一个data block,inode记录了文件的属性及data block的位置,而目录data block则记录着目录下文件的inode及文件名对照表,大约如下
当我们ll -d 目录时,会发现很多目录的大小都写着4096
[root@zejin240 /]# ll -d / /bin/ /etc/ /usr/ /boot
dr-xr-xr-x. 23 root root 4096 Oct 12 09:13 /
dr-xr-xr-x. 2 root root 4096 Oct 22 03:39 /bin/
dr-xr-xr-x. 5 root root 1024 Jul 15 2015 /boot
drwxr-xr-x. 124 root root 12288 Oct 31 10:48 /etc/
drwxr-xr-x. 14 root root 4096 Jun 23 17:40 /usr/
我们发现/boot目录是1024,那是因为这个分区的块大小为1k,而其它目录的分区大小为4k的缘故,而/etc的大小为12288,说明这个目录下文件很多,系统分配了三个block给它存存储inode-文件名对照表。
那么当我们读取一个文件时,系统是怎样找到我们的文件的呢?
[root@zejin240 /]# ll -id /
2 dr-xr-xr-x. 23 root root 4096 Oct 12 09:13 /
[root@zejin240 /]# ll -id /var/
912129 drwxr-xr-x. 22 root root 4096 Jun 12 11:18 /var/
[root@zejin240 /]# ll -id /var/log/
913100 drwxr-xr-x. 15 root root 4096 Oct 31 10:48 /var/log/
[root@zejin240 /]# ll -id /var/log/messages
924361 -rw-------. 1 root root 147 Oct 31 10:48 /var/log/messages
例如当我们要访问/var/log/message这个文件时
首先系统通过挂载点找到/dev/sda2根目录/的inode,读取到它的inode为2,然后查找inode为2对应的data block块,查找/var对应的inode为912129
接下去读取912129这个inode对应的datablock,发现/var/log这个文件的inode为913100,
接下再去读取913100这个inode对应的datablock,发现/var/log/message对应的inode为924361,接着读取inode为924361对应的datablock,最终获得文件的内容,
当然每步在读取inode对应的datablock前都会验证用户的权限信息。
当我们创建一个文件时
系统会去分区中的inode bitmap找到一个未使用的inode,然后再扫描block bitmap找到一个示使用的data block,将两者的对应关系存储在目录的data block中,供文件系统查询调用
当我们复制一个文件时
首先创建一个新的文件,并将原文件的data block的数据复制一份到新的文件的data block中
当我们移动一个文件时
文件的移动只是路径名改动了,如果在同一个分区中,文件的inode及对应的data block都没有变动,所以速度极快。当然如果跨不同的文件系统移动就会很慢了。
当我们删除一个文件时
只是将目录对inode-文件名对应关系删除,并且在inode bitmap及block bitmap标记相应的inode及block未使用,实际的data block内容并没有删除,这也是为什么删除的文件能够找回的原因。
当我们硬链接一个文件时
只是在链接文件所在的目录下多增加一条inode-文件对应记录,inode与原文件的inode一样,并不会分配新的data block给硬链接文件。
特性:
1.不能跨文件系统创建
[root@localhost src]# ln redis-3.0.6.tar.gz /home/chenzejin/aa
ln: creating hard link /home/chenzejin/aa' =>
redis-3.0.6.tar.gz': Invalid cross-device link
2.不能链接目录
3.创建硬链接增加文件被硬链接的次数
当我们软链接一个文件时
在文件下新建一个文件,会分配一个inode及data block给新文件,而在data block中存放着原文件的路径名,故该链接文件的大小为原文件路径命名的字节大小。符号链接的数字权限都为777,这样是为了保证任何用户都可以找到该链接,但不是任何人都可以访问它所指向的文件,由原文件的权限限定。
特性:
1.可以应用于目录
2.可以跨文件系统创建
3.不会增加被链接文件的链接次数
4.其大小为指向的路径所包含的字符个数
其它总结
文件系统
分区后我们需要对它进行管理操作,它是由文件系统这个软件来完成的,用来管理磁盘上的内容,包括怎么写,如何读的问题,一个分区对应一个文件系统,或者说一个文件系统就是一个分区。
磁盘分区
告诉操作系统该分区是在A柱面到B柱面之间的块
各种接口在Linux的文件名为:
/dev/sd[a-p][1-15] 为SCSI,SATA,USB,FLASH等接口的磁盘文件名
/dev/hd[a-d][1-63] 为IDE接口的磁盘文件名
文件的block记录文件的实际数据
目录的block记录该目录下面文件名与其inode号码对照表
硬链接只是在该目录对应的block增加一条记录,记录该文件名与链接文件的inode号码,该inode与原文件相同,不会消耗新的block
软链接也是在该目录新建一个文件,这个文件的inode与原文件不同,该文件对应的data block存储了原文件名,所以软件链接文件的大小就是原文件路径名的长度