Linux磁盘文件系统

硬盘是由一个个圆形的盘片组全起来的,从物理特性上看,硬盘盘片的转速越快,它的性能就越好,而且我们的磁道越靠外部,它的读写性能就越高,这是因为,磁道越靠外部,单位时间内读到的信息越多,所以一般把系统装在硬盘的最外层分区中。

为了更直观了解硬盘的分区及内容,我们先看如下一张图:


磁盘文件系统.png

如下是对图中每个字段的含义解释

一个硬盘从外面到圆心画一个个同心圆,不同的同心圆就是不同的磁道,一个磁道按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
一个间接:1k
256=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及文件名对照表,大约如下

clipboard.png

当我们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存储了原文件名,所以软件链接文件的大小就是原文件路径名的长度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容