linux文件系统的运作
我们知道了目录树与文件系统的关系了,但是我们也知道,所有的数据要加载到内存后CPU才能够对数据进行处理。想一想,如果你常常编辑一个很大的档案,在编辑的过程中又频繁的要系统写入磁盘当中,由于磁盘要写入的速度比内存慢很多,因此你常常耗在等待硬盘的写入、读取上。这样真的是没有效率。
为了解决这个问题,因此我们的linux使用的方式是透过一个称为异步处理(asynchronously)的方式,所谓的一步处理就是这样:
当系统加载一个档案到内存以后,如果该档案没有被改动过,则在内存区段的档案数据会被设为干净的。但如果内存中的档案被改动过,此时内存中的数据会被设为脏的(Dirty)。此时所有的动作还在内存中执行,并没有写入到磁盘中。系统会不定时的将内存中设定为(Dirty)的数据写回磁盘,以保磁盘与内存数据的一致性。
我们知道内存的速度要比磁盘快的多,因此如果我们能够将常用的档案放到内存当中,就不会增加系统的性能吗?没错是有这样的想法,因此我们的linux系统上面的文件系统与内存有着非常大的关系奥:
- 系统会将常用的档案数据放置到主存储器的缓存区当中,以加速文件系统的读写;
- 承上,因此linux的物理内存最后会被用光,这是正常的情况,会加速系统效能;
- 你可以手动使用sync来强迫内容中设定为Dirty的档案回到磁盘中;
- 若正常关机时,关机指令会主动呼叫sync来将内存的数据写入磁盘内;
- 但若不正常关机,由于数据尚未回写到磁盘中,因此重新启动后可能会花很多的时间来进行磁盘检测,甚至可能导致文件系统的毁损。
挂载点的意义
每个filesystem都有独立的inode/block/superblock等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的动作我们成为挂载。重点是:挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要挂载到目录树的某个目录后,才能够使用该文件系统的。
举例来说,假设有三个挂载点,分别是/,/boot,/home三个(对应的装置文件名为/dev/hdc2,/dev/hdc1/dev/hdc3).如果观察这三个目录的inode号码,我们可以发现如下情况:
看到了吧!由于filesystem最顶层的目录之inode一般为2号,因此可以发现/,/boot,/home为三个不同的filesystem罗(因为每一行的文件属性并不相同,且三个目录的挂载点也均不相同之故)。
我们曾经提到过.与..是相同的东西,因为权限是一模一样么。如果使用文件系统的观点来看,同一个filsysytem的某个inode只会对应一个档案内容而已(因为一个档案占用一个inode之故)。因此,我们可以通过判断inode号码来确认不同文件名是否为相同的档案喽!所以,我们可以这样来看:
上面的信息中由于挂载点均为/,因此这三个档案(/,/.,/..)均在同一个filesystem内,而这三个档案的inode号码均为2号,因此这三个档案名都指向同一个inode号码,当然这三个档案的内容也就完全一模一样了。也就是说,根目录的上层(/..)就是他自己。