Linux最传统的磁盘文件系统(file system)使用的是【ext2】
文件系统是建立在磁盘上面的
1.磁盘分区完后需要进行格式化(format)后,操作系统(OS)才能使用这个文件系统
为什么需要进行格式化?
因为每种OS所设置的文件属性/权限并不相同,为存放这些文件所需要的数据,需要将分区进行格式化,以成为OS能利用的文件系统格式(file system)
2.每种OS使用的文件系统不同
OS类型 | 文件系统 |
---|---|
Windows 98 | FAT |
Windows 2000 | NTFS |
Linux | ext2 |
3.文件系统的数据存放位置
4.inode / data block 数据存取示意图
某个文件的属性与权限数据是放置到 inode4号,这个 inode 记录了文件数据的实际放置点为 2、7、13、15 这4个区块号码,此时OS能按此排列磁盘的读取顺序,一次性将4个区块内容读出来。这种数据存取的方法称为索引式文件系统(indexed allocation)ext2是索引式文件系统
对比:U盘使用的FAT文件系统
FAT文件系统数据存取示意图
文件系统一开始就将 inode 与 data block 规划好了,除非重新格式化(或利用 resize2fs 等命令修改其大小),否则 inode 与 data block 固定(大小和数量)后就不再变动
间接:再拿一块block来当作记录block号码的记录区,如果文件太大,就会使用间接的block来记录编号,如果文件持续变大,就会利用所谓的双间接,以此类推,三间接就是利用第三层block来记录编号
inode能够指定多少个 block?以较小的 1K block 为例:
Block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
一个文件最大容量 | 16GB | 256GB | 2TB |
文件系统最大容量 | 2TB | 8TB | 16TB |
这个方法不能用在 2K 及 4K block大小的计算中,因为大于 2K 的block将会受到 ext2 文件系统本身的限制,所以计算结果不太符合
ext4文件系统的 inode 容量已经可以扩大到 256B,更大的 inode 容量,可以记录更多的文件系统信息,包括新的 ACL 以及 SELinux 类型等
3.利用【dumpe2fs】查询信息
[root@study ~] dumpe2fs [-bh] 设备文件名
选项与参数:
-b : 列出保留为坏道的部分(一般用不到)
-h : 仅列出superblock的数据,不会列出其他的区段内容
/dev/vda5使用的区块(图中所述为位置)为 4K ,第一个block号码为0号,以Block Group 0为例:
目录的内容是文件名,一般文件的内容是实际的数据
观察root根目录内的文件所占用的 inode 号码,使用【ls -i】来处理
下图中
Linux的ext2文件系统建立一个一般文件时,ext2会分配
范例:
假设一个区块为 4KB,想要建立一个 100 KB的文件,那么Linux将分配一个 inode 与25个区块(25×4K=100KB)来存储该文件。要注意:inode 有12个直接指向(12×4KB=48KB)再使用一个间接指向(256×4KB=1024KB)
文件读取流程
以下图中的【/etc/passwd】为例:
(读取者身份为 aeronautics 这个一般身份用户)
/ 的inode
通过挂载点(mount point)的信息找到 inode 号码为 2 的根目录 inode,且 inode 规范的权限让我们可以读取该区块的内容(用户组权限为r-x,含r和x权限)
/ 的区块
经过上个步骤取得的区块的号码,并找到该内容有【etc/】目录的 inode 号码(6029313)
【etc/】的inode
读取6029313号 inode 得知 aeronautics 具有 r 与 x 权限,因此可以读取 【etc/】的区块内容
【etc/】的区块
经过上个步骤取得区块号码,并找到该内容有 passwd 文件的 inode 号码(6029518)
passwd 的inode
读取 6029518 号inode 得知 aeronautics 具有 r 的权限,因此可以读取 passwd 的区块内容
passwd 的区块
最后将该区块内容的数据读出来
如果文件写入的区块太分散,就会有所谓的文件数据离散的问题。
如果文件系统真的太大,那么当一个文件分别记录在这个文件系统的最前面与最后面的区块号码中,此时会造成磁盘的机械手臂移动幅度过大,也会造成数据读取性能的下降。而且磁头在查找整个文件系统时,也会花费比较多的时间去查找。因此,磁盘分区的规划并不是越大越好,而是要针对主机用途来进行规划。
因为 superblock、inode bitmap、block bitmap的数据经常变动,每次新增、删除、编辑时都可能会影响到这三个部分的数据,因此被称为元数据(metadata)
日志式文件最基础的功能:
当数据的记录过程出现问题时,系统只要去检查日志记录的区块,就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整个文件系统进行检查,这样就可达到快速修复文件系统的目的。
一致性检查的步骤:
所有的数据要加载到内存后,CPU才能处理。
如果编辑大文件,在编辑过程中又频繁地要系统来写入到磁盘中,由于磁盘写入地速度要比内存慢的多,因此你会常常耗在等待磁盘的读写上,导致效率低下。
为解决效率问题,Linux使用异步处理(asynchronously)的方式
如果能将常用文件放置到内存当中,可提高系统性能
Linux系统上面的文件系统与内存间的关系
每个文件系统都有独立的 inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被使用。将文件系统与目录树结合的操作称为挂载(mount)
重点:挂载点一定是目录,该目录为进入该文件系统的入口
同一个文件系统的某个 inode 只会对应到一个文件内容而已(因为一个文件占用一个 inode)
可以通过判断 inode 号码 来确认不同文件名是否为相同的文件
上面的信息中由于挂载点均在 / ,因此三个文件(/、/. 、/…)均在同一个文件系统内,而这三个文件的 inode 号码均为 2 号,因此这三个文件名都指向同一个 inode 号码,当然这三个文件的内容也完全一样。(根目录的上层【/…】就是它自己)
[root@study ~] cat /proc/filesystems
通过VFS的功能来管理所有的文件系统,省去自行设置读取文件系统的行为(什么文件系统的模块应该对应读取什么文件的这种行为)
[root@study ~] xfs_info 挂载点 | 设备文件名