创建文件系统的含义:就是格式化一个硬盘分区,不同的格式化方式,就是创建了不同的文件系统。
格式化:
- 低级格式化:划分分区前执行,主要是划分硬盘的磁道等。
- 高级格式化:划分分区后执行,创建文件系统
- 创建文件系统时做的目的:当我们在硬盘上创建文件后,以后可以用文件的名字还能找到这个文件。
文件包含2部分:
- 元数据(包括:权限,属主/组,时间戳,大小,数据块指针等)
数据块指针:指向文件内容在数据区的位置(根据文件内容的大小,位置会有多个) - 数据本身的内容。
创建文件系统时,把整个分区划分成2个区域,一大一小。
- 小的区域放每个文件的元数据,叫元数据区(也叫:Inode table)
每个文件的元数据,叫 inode(index node) - 大的区域放文件本身的内容,叫数据区
数据区需要再次划分成一堆block,block的大小一般是扇区的倍数。一个扇区是512bytes。 - 元数据区和数据区图例:
- 元数据区和数据区的大小比例怎么决定呢?
如果文件的size小,而且文件数量多,则会发生元数据区已经满了,但是数据区还有很多空余。
如果文件的size大,而且文件数量少,则会发生数据区已经满了,但是元数据区还有很多空余。 - 一般文件:它的元数据里的数据块指针区域,存放的是数据区的地址。占用分区的数据区域的存储空间。
- 符号链接文件:它的元数据里的数据块指针区域,存放不是是数据区的地址,而是实际文件的路径。所以它不占用分区的数据区域的存储空间。它只占用元数据区域的存储空间。
- 设备文件:它的元数据里的数据块指针区域,存放不是是数据区的地址,而是主设备号和次设备号。所以它不占用分区的数据区域的存储空间。它只占用元数据区域的存储空间。
查看文件的inode编号。
- 使用
ls -i files
,或者stat files
操作系统,如何知道哪些inode别使用了,哪些block被使用了?
搜索整个数据区域,肯定能知道block的使用情况,
搜索整个元数据区域,肯定能知道inode的使用情况,可是性能太低下了。
所以,在元数据区域找块空间,存放2个东西,叫位图索引(bitmap)。
一个是inode的位图索引(Inode bitmap)。
一个是block的位图索引(Block bitmap)。
位图索引的每个bit位对应一个inode/block,0代表此inode/block未被使用,1代表此inode/block已被使用。
搜索位图索引,速度就快多了。
super block
若一个分区里只有一个元数据区,一个数据区的话,即便有位图索引,索引也是太多了,遍历一遍也很费时间,所以实际的文件系统,都是有多个元数据区和数据区,如下图,每个元数据区和数据区组成一个独立的逻辑分区,独立自治,每个逻辑分区里,再建立位图索引。有了逻辑分区的话,还需要一个中央政府,去管理这些逻辑分区,这个中央政府叫【super block】。
super block:记录着逻辑分区的信息。
如果super block损坏了的话,那整个分区就废了,所以super block就必须做冗余处理,所以把super block放到了多个逻辑分区的数据区里。如下图:
inode里没有存放文件的名字,名字放哪里了呢?放目录里了。目录也是文件,可不是windows里的文件夹。
目录的block里放的是:目录里的文件和文件所对应的inode编号。
下图表示了:元数据区,和数据区,和如何找到文件/var/log/messages的
找到硬盘上的文件后,就放到内存的【buff/cache】中,下次用户再访问此文件就能快速的从内存中读取到。
用free命令查看内存情况:
# free -h
total used free shared buff/cache available
Mem: 3.7G 336M 3.0G 13M 429M 3.1G
Swap: 3.9G 0B 3.9G
硬链接和符号链接的区别
操作系统能根据文件路劲,找到它对应的inode编号。
硬链接:
- 创建硬链接命令:
ln src link_file
- 多个硬链接文件,所对应的inode编号相同
- 硬链接不能跨文件系统,因为每个文件系统的inode计数方式不同。
- 创建硬链接会增加inode的引用计数,同样删除硬链接会减少inode的引用技术,当inode的引用计数变成零时,是否数据区对应的空间。
- 目录不支持硬链接,防止循环引用。
符号链接:
- 创建符号链接命令:
ln -s src link_file
- 符号链接文件,有自己独立的inode。
- 可以跨文件系统
- 创建或删除符号链接,不影响inode的引用计数
- 符号链接可以指向目录
- 符号链接的mode是777,但实际的mode还是要取决于它指向的文件的mode
- 符号链接的size是其指定的文件的路径字符串的字节数
$ ls -l
lrwxrwxrwx. 1 ys ys 14 Dec 27 13:25 sl1 -> 符号链接11
-rw-rw-r--. 1 ys ys 0 Dec 27 13:24 符号链接11
Linux支持大部分的文件系统,哪个文件系统最好呢?没有最好只有更好。
不同的文件系统,适应不同的使用场景。
不同的文件系统,对分区的划分方法都不一样。对应读写文件的程序来说,就太难了,不可能针对每种文件系统,写不同的代码。那么,linux是如何解决这个问题的呢?使用VFS。
VFS:virtual FIle System虚拟文件系统。
文件读写程序,只跟VFS打交道,然后VFS和各个文件系统打交道。
VFS给程序员统一的,简洁的API接口。
Linux支持哪些文件系统:
- ext2,ext3,ext4:基本被淘汰了。单个文件的大小有限制
- xfs:红帽7开始好像使用xfs了。centos7好像使用此文件系统。特点:单个文件的大小没有限制
- relserfs:能相对容易找回误删除的文件,但是作者入狱了,所以不是主流了。
- btrfs:特点:单个文件的大小没有限制。性能好,但还是处于测试阶段。
- iso9660:光盘&