为什么分区后还要进行格式化呢?
所谓的分区就是指定分区的起始柱面和结尾柱面,将将分区的信息记录到磁盘的第个扇区当中,也就是说分区只是指定了某个分区在磁盘上可以使用哪些区域而已。系统想要将数据存放在分区当中,需要按照一定的格式,因为只有按照一定的格式存放,我们在读取的时候才方便,这就像书架一样,我们按照书架上的格子对书进行拿取是比较方便的,如果没有书架,我们把很多书都扔到空箱子里面,这样在拿取的时候很不方便,所以最好按照一定的方式进行拿取。
至于格式化成什么文件系统,这取决于系统,系统支持什么的文件系统我们就格式化成什么样文件系统。至于买什么样的书架,这取决于我们自己,我们喜欢什么样的就格式化成什么样的。
过去的时候一个分区也就对应一个文件系统,但是现在就不一样了,比如LVM(逻辑卷管理器),可以实现将多个分区整合成一个分区(卷组),在这一个分区上再划分子分区(逻辑卷),然后每一个子分区(逻辑卷)对应一个文件系统,这样就实现了一个分区对应多个不同的文件系统。
文件系统由三部分构成:
- 超级块:记录文件系统的整体信息,包括inote/block的总量、使用量、剩余量等。
- Inode区域:inote区域就由inode块组成的区域,每个文件都会占用一个inode块,inote块当中记录了此文件的元数据和blcok号码。
- Block区域:block区域就由block块组成的区域block块里面存放的就是文件真实的数据了,这没什么好说的。
硬链接:
其实在学到这里面的时候我是有一个疑问的,就是为什么一个文件只会占用一个inode块?一个小文件元数据和block块记录只占用一个inode块我是可以理解的,但是一个1G的文件它要引用的block块那就多了,一个inode肯定是存不下呀!难道不会占用更多的inode块吗?后来我专门查了《鸟哥的私房菜》之后才知道,如果一个文件要引用的block号码实在太多了,一个inode存放不下,也不会再浪费一个inode块,而是专门拿出一个block块来存放block号码,这是第一级引用,如果需要的话,可以有二级和三级引用,所谓的二级引用就是第一级的block也存放不下block号码了,第一级block本身可以再引用一级,这就是第二级,第三级以此类推。
我们上面所述的是ext2文件系统,ext2文件系统是这样进行数据存放的,但并不所有的文件系统在存放文件的时候都是这样,比如FAT文件系统,FAT文件系统是windows上的一种文件系统,我们新买的U盘一般就是样的文件系统,这种文件系统在在存放大量的block号码的时候并不像ext2文件系统那样借用多级引用,而是不断的跳转?什么意思呢?FAT文件系统并没有inode块区域,FAT文件系统里面全都是block块区域,也就是说FAT文件系统并不能够像ext2文件系统那样通过读取inode块得知这个文件占用了多少block块,FAT文件系统上的一个文件只会连接一个block块,而每个block块都会空余出一点空间,指向下一个block块,至少会连接多少了块取决于文件的大小,当我们查看这个文件的时候就像是不断的跳转那样来读取每一个block块当中的内容,如果说,每一块他们距离的比较远,以至于跨越了多个柱面,那么在不断跳转的同时,磁头也会多次移动,可想而知这样会大大耽误数据读写的效率,所以又有了磁盘碎片整理这么一项技术。磁盘碎片整理就是将同一个文件所占用的block块尽量放到相邻的地方,比如相邻的扇区和磁道,以其通过这样的手段加快数据读取的速度。磁盘碎片整理对于FAT文件系统有很大的作用,但是对于ext系列的文件系统是没有太大意义的。
有了上面的见解,我们再去理解硬链接就简单多了。一个文件只有一个inode号码,在操作系统当中可以创建多个指向这个inode号码的链接,这就是硬链接,也就是说文件自己其实也是一个硬链接,这就是为什么我们新创建的文件,明明没有给它创建硬链接,他的硬链接数已经是1了的原因。同时,我们也应该了解,只要不把所有的硬链接全部删除干净,我们总能够通过某一个硬链接找到inode块,进而找到文件内容,所以硬链接是可以做一为一种备份的手段。
当我们创建一个目录的时候,硬链接数就是2,为什么一个新的目录硬链接就是2呢?
[root@localhost tmp]# mkdir test.dir ; ll -d test.dir drwxr-xr-x 2 root root 6 10月 17 19:05 test.dir
目录也是文件,目录也占用了文件系统的一个inode块,当我们创建这个目录的时候要给一个文件名吧!这个文件名难道不是一个硬链接吗?是的,当然是,那这也就一个硬链接,为什么是2呢?
[root@localhost tmp]# cd test.dir ; ll -a drwxr-xr-x 2 root root 6 10月 17 19:05 . drwxrwxrwt. 9 root root 142 10月 17 19:05 ..
发现了没有,在新创建的目录里面竟然有两个目录,这不是我创建的,而是默认就有的,一个叫点,另一个叫点点,而点就代表当前目录,当前目录就是test.dir,这又是一个硬链接,所以test.dir目录的硬链接数就是2.
还有一个有趣的点,如下所示,/etc/目录的硬链接数竟然高达138个!怎么会这么多呢?
[root@localhost ~]# ll -d /etc/ drwxr-xr-x. 138 root root 8192 10月 17 18:50 /etc/ [root@localhost ~]# ll /etc/ | grep '^d' | wc –l # 136
/etc/目录下面有136个目录,每个目录下面都有点点,这就是136个硬链接,另外两个就就/etc/目录名字自己和/etc/目录里面的点。
块组:
如果我们的一个文件系统很大,高达几百个G,现在这很常见呀,我现在一个windows桌面系统的D盘就有1T大小,如果这个文件系统(D盘)的block区域和inode区域都放置在一起的话,block块的号码就会被排非常大,而且在inode块引用block块的时候因为block的号码太大了也会占用太多的空间,所以实际上真实的文件系统并不是这样的,而是进一步划分了区域,真实的文件系统在创建的时候首先创建的是块组,也就是将文件系统分成一个又一个的区域,然后在区域里面再划分出block块区域、inode块区域、超级块区域这三个区域,这样一来,每一个块组内block块号码不会变得非常大,做引用的时候也不会占用太多的空间。
面试题:
在ext2文件系统当中,block块要划分多大有三个标准:1KB、2KB、4KB,而且一个数据一旦被占用即使有剩余也没能被其它的文件占用了,也就是说假装你的文件系统有1G,但实际存放的数据绝不会大于或等于1G,只会小于,因为你不可能正好把每一个block块都占满呀!除非重新格式化,否则block块的大小是固定的。
假设你的ext2文件系统使用的是4KB的block,而文件当中有10000个小文件,每个文件是500B,请问磁盘浪费多少容量?
其实这个问题,只要先算一算一个文件浪费多少空间,然后乘以10000不就好了吗?我们先来算算一个文件浪费多少空间?
4KB=4096B
也就说一个文件会浪费4046B,10000个文件浪费40460000B=39511KB,39511KB=3.85MB。