[OS_0xF02] an overview of filesystem

Tears - Dreamtale ` Weeping for our fate Quietly I face pouring rain in the night Washing our faces where we stand Sign of desperation `
stage 0 Basic Workflow

  • 从一个文件是如何被访问到的开始.来阐明inode/硬链接/软链接到底是啥.
    例如,在linux中,访问一个文件,需要给出文件名,得到的结果是获取到该文件的内容.
  • 例如我现在输入 cat /tmp/fuckfs.txt
    整体流程是什么呢?

大致过程如下:
带路径文件名 ---->访问目录文件(directory)---> 目录项(dentry)---->inode ----> blocks ----> disk(请求落盘).
目录也是文件,并且该文件的内容是一堆的目录项表示该目录下的文件,另外目录可以嵌套.
目录文件内容大概是这样:

dentry_0
dentry_1
...
dentry_M

linux 文件类型有这么几种:普通文件(regular)、目录文件(directory)、软链接(symbol link)、块文件、字符文件.

其中一个目录项(dentry)大概是这样:(一个pair关系)

| file name | inode num
|-----------|------
| file1     | 1234
|-----------|------ 

这里根据文件名得到inode编号,接着可以在inode-table中得到具体某个文件的inode.接着根据inode中的数据域可以访问文件的内容.注意这里的inode也可能是目录文件的inode, 要读目录文件内容也需要读其inode得到数据域.
一个inode是一个文件的一些信息描述(权限、大小、修改时间等)及数据域,其大致结构大概像下面这样:

|--------------------+--------------------------...------------------------------------------------|
|mode | size | owner | inlining | direct_blks | indirect_blks | double_ind_blks |  triple_ind_blks |
|--------------------+--------------------------...------------------------------------------------|

其中inode的数据域可能有inlining - 当文件非常小时,文件内容可以直接存在inode节点中,具体需要看哪种特定的fs.
一般(古典)可以认为inode最后几个域有几种不同级别的数据块索引,以支持大文件.(以前经常碰到计算题,计算文件大小的就是这些不同级别的数据块索引在捣鬼)

ok,到了这里可以回答上面的问题了,cat /tmp/fuckfs.txt的流程无非是,

  • 读/目录文件的inode,找到其数据域
  • 在其内容中找到/tmp所在目录项,根据目录项提示的inode编号读/tmp目录文件的inode
  • 找到其数据域,在其内容中找到/tmp/fuckfs.txt的目录项,根据该目录项提示的inode编号读/tmp/fuckfs.txt常规文件的inode
  • 找到其数据域,返回数据块内容.

另外这里还有种问法就是cat /tmp/fuckfs.txt这个命令最多可能访问磁盘几次? 最多就是inode都得来一次,读目录文件的内容也得来一次(虽然现在有些fs可能目录里文件比较少的直接扔inode里面了,但我们考虑最多嘛),最后读该txt文件的数据块再来个几次(当文件比较大的时候,虽然现在的fs一般都会把同一个文件的数据块都尽量放在同一个512bytes之内),反正只要fs设计的足够SB,磁盘可以读很多次.

stage 1 软链接/硬链接

硬链接

  • 硬链接实际上是文件的别名,当为一个文件创建硬链接,实际上就是在文件所在目录的目录文件中增加一个<文件硬链接名,inode编号>的pair关系.

  • 这里的inode编号与原文件inode编号一致,并且该inode上的links域会增加1.

  • 这样,删除原来的文件,则利用创建的硬链接也能访问原始文件的数据.
    实际上是这样的,但其内部如何实现的删除给人好多联想,删除是否都是只把目录项下的dentry删除呢?

软链接

  • 软链接又称符号链接,是一种特殊的文件,文件内容是链接到的文件的路径(? 这个要在查一下?).

  • 给一个文件创建软链接,原始文件的inode的links数不会增加,新创建出来的软链接的inode编号与原始的不同(其实他们就是不同的文件).软链接可以重新指定链接的目的地(dest).(硬的也可以,不过会使links数减1)
    ------->很像c++里ref与ptr的区别吧?
    但仅是很像而已,硬链接这里也可以更改的,例如用ln -f强制更改.只不 过后遗症就是假如原始文件没人链接了,那么原始文件也就读不了了.

root@vm1:~/test_inode# touch testk
root@vm1:~/test_inode# ln testk testk.hard
root@vm1:~/test_inode# stat testk
  File: ‘testk’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 1052967     Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-06-26 20:06:08.253381199 +0800
Modify: 2016-06-26 20:06:08.253381199 +0800
Change: 2016-06-26 20:06:16.537381272 +0800
 Birth: -
root@vm1:~/test_inode# stat testk.hard 
  File: ‘testk.hard’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 1052967     Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-06-26 20:06:08.253381199 +0800
Modify: 2016-06-26 20:06:08.253381199 +0800
Change: 2016-06-26 20:06:16.537381272 +0800
 Birth: -

这在补充一下,所以inode与文件名不是一一对应的.
也有种说法就是inode与文件不是一一对应的,多个文件共享同一个inode也就是硬链接的情况.唉笔试嘛,就是喜欢搞文字游戏.

stage 1.2 what the fuck is VFS


我目前个人的理解就是在文件系统层次进行一种抽象(很像c++ OOP里定义的抽象类),VFS只定义了一套需要实现的接口,具体下面怎么做的是由具体哪一种文件系统被用到来决定的.

stage 2 现代文件系统的实现


妈的这个题目太大,吓尿了.
主要是上面讲的一些都是很基础,面试里才会考的东西,如果接到任务需要搞(定制)一个文件系统呢?

目前的信息 & todo

  • 上面只讨论了最基本的一些逻辑上的处理,还需要了解一下实际中的一些重要的东西例如磁盘的布局(disk layout,描述了哪里放超级块,哪里放inode的bitmap等等)
  • 某些fs带有LSM特性的,自带GC,支持日志,可以减少随机写的落盘.例如xfs,f2fs.
  • 某些fs在inode的实现上除了posix定义的标准之外,还实现了其他的一些机制,比如对小文件的支持(inlining feature)等.
  • 某些(目前大部分)的fs在目录项的获取上做了一定(很多)的优化,例如inode可能会有cache之类的.
  • 某些(大部分)fs可能会把多个inode包起来形成一个extent,用来优化读inode的overhead.

引用一下f2fs的图:

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

推荐阅读更多精彩内容

  • 一个基本的计算机系统由“硬件”和“软件”组成,一台Linux设备,主要的组成如下图所示: 一般情况下,我们所说的L...
    时待吾阅读 1,625评论 0 16
  • 转载自:http://blog.csdn.net/hguisu/article/details/6122513原作...
    miaoiao阅读 1,507评论 0 7
  • Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本...
    偷风筝的人_阅读 3,241评论 1 17
  • Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。 内核、shell和文件系统一起形成了基本...
    请爱护小动物阅读 2,544评论 0 22
  • 人类的悲欢并不相通,我只觉得他们吵闹。”——鲁迅 《而已集·小杂感》 我一直有这样一种毛病,上课迟到了,我不会从...
    牧童说_阅读 537评论 0 0