Ext2那些事儿(二)

来源:互联网 发布:中国10大网络视频排名 编辑:程序博客网 时间:2024/05/18 17:00

上回讲了inode这个重要的结构,可能inode比较陌生,没关系。下面介绍一个大家肯定熟悉的结构:目录。


目录(directory)

目录我想没人会不知道,经常在Windows里,从网上下个东西,自己建个目录保存起来。过了一段时间,这个目录里面就放满了各式各样的文件。目录这个概念很直观,就像一个抽屉,反正我的东西都能放进去,下回打开抽屉,如果没中病毒啥的,以前的东西应该都还在那儿。看起来是天经地义,顺理成章。但如果你从干活的角度,以文件系统的视角去看待目录,就会发现文件系统其实也不是那么容易,很少有什么活儿是轻轻松松就能完成的。在我们看来,目录里面放了该目录下所有的文件,你要读某个文件的某段内容,进到它所在目录里肯定能找到。这样的话,照我们理解,目录不就是磁盘上的一组文件的集合吗。只要定义,从块m到块n是一个目录,比如说“我的音乐”,然后音乐文件就存在这(n-m+1)个块里,下回要找音乐就在这段块集合里找。而从块j到块k是目录“我的图片”,图片都放在这段块里。虽然这样看上去很美,但问题在于文件系统并不知道该给“我的音乐”目录分配多少空间,如果刚开始分配的空间不够呢,再补一段空间?如果刚开始分配的大了呢,岂不是浪费了那么多空间。


你所看到的并不是你所想像的。其实,文件系统是不需要把文件内容放在目录里的。前面我们已经说过,得inode者得文件。目录只需要知道其中文件的inode们,就可以通过这些inode访问文件。目录只是拥有通往各个房间的门,而不包括这些房间。从实现上讲,目录也是一种文件,这个文件里包含该目录下一系列文件的inode和文件名,它们是一一对应的。这样,我们需找某个文件名的时候,文件系统就吭哧吭哧地通过文件名找到inode,然后根据inode就可以访问该文件了。怎么样组织inode和文件名,是有技巧的。按照列表来组织,实现简单,寻找的时候遍历列表就可以了。目录下只有几个文件还好,但一旦该目录下的文件多起来,比如几千个文件,那遍历就是个苦差事了。


链接(link)

链接是个啥子东东呢?小时候,我们学古文,往往会出现很多诗人,考试的时候不光要考古文的作者是谁,还要考他的小名,比如字啥啊,号啥啊。当时就恨哪,这些诗人起这么多乱七八糟的名字干嘛。Link就是为了解决这种一人多名的问题。有时候,一个inode会关联多个名字(至于为什么这样,有时候确实这样会更加方便,大家可以想想Windows桌面上的那些快捷方式)。


链接分为两种:符号链接和硬链接,还有一种动态链接也算在符号链接里。符号链接指的是,这个链接是采用名字来指向另外一个文件。比如说,一个人叫张三,建了个符号链接“李四”,李四是通过“张三”这个名字指向张三这个人。那么我们找李四,一查原来是张三,那就找到张三了。如果张三某天突然改名了,叫王二,那再通过李四的名字找张三这个人,因为改名了啊,就找不到了。而硬链接呢,就可以解决这个问题。硬链接实际上是通过文件的inode号来找的,而不是通过文件名字。这样即使文件名字改变了,文件的inode号是不会变的,因此也可以顺利找到。就像硬链接“李四”,他记得不是“张三”这个名字,而是他的身份证号(这里假设大家的身份证号是不重复且不改变的),那么即使张三改名叫王二,也能通过身份证号找到他。


每一个inode都会有一个属性,记着有几个硬链接指向它。每增加一个指向它的硬链接,这个属性值就会加1。而每当一个指向它的硬链接被删除了,这个值就会减1,当该值减到0了,就表明系统里没有名字指向该inode了,换句话说,就是没人再需要你了。那内核就会收回该inode,留着下回给新的文件用。


硬链接只能在单一文件系统里用,而不能跨文件系统用(身份证号只能在中国使用,而不能在米国使用)。并且,硬链接只能指向文件,而不能指向目录,这是为了防止在目录数里出现循环。符号链接则能够跨文件系统应用,因为它是通过路径加名字来找的嘛。符号链接可以指向任何文件,包括目录,甚至包括不存在的文件。


设备相关文件(Device special files)

在Unix系统中(当然包括Linux),一切皆文件。也就是说,在Windows里面你看到的那些设备,什么声卡、显卡、USB总线等,在Unix系统看来都是文件。对于它们的访问,是通过这些设备相关文件来实现的。一个设备相关文件并不使用文件系统的任何空间,它仅仅是指向设备驱动的接入点。


存在两类这种文件:字符特定文件和块特定文件。这两种文件其实就对应字符设备和块设备。前者允许I/O系统以字符模式操作(比如说串口、USB、PCI总线),后者则需要通过缓冲缓存(buffer cache)函数以块模式对数据进行操作(比如说软盘、硬盘、光盘)。当出现一个针对某设备相关文件的I/O请求时,该请求会被扔给一个设备驱动。一个设备相关文件是由一个major数加一个minor数构成,major数表示设备类型,minor数表示设备单元。


原创粉丝点击