1.3 Linux文件系统基础

文件系统层次

    纵向来理解可以分为:用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层。

  1. 用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。
  2. VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现。用户的这些文件相关操作都有对应的System Call函数接口,接口调用 VFS对应的函数。  
  3. 文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作通过VFS转到各种文件系统。文件系统把文件读写命令转化为对磁盘LBA的操作,起了一个翻译和磁盘管理的作用。 
  4. 缓存层:文件系统底下有缓存,Page Cache,加速性能。对磁盘LBA的读写数据缓存到这里。
  5. 块设备层:块设备接口Block Device是用来访问磁盘LBA的层级,读写命令组合之后插入到命令队列,磁盘的驱动从队列读命令执行。Linux设计了电梯算法等对很多LBA的读写进行优化排序,尽量把连续地址放在一起。
  6. 磁盘驱动层:磁盘的驱动程序把对LBA的读写命令转化为各自的协议,比如变成ATA命令,SCSI命令,或者是自己硬件可以识别的自定义命令,发送给磁盘控制器。Host Based SSD甚至在块设备层和磁盘驱动层实现了FTL,变成对Flash芯片的操作。 
  7. 磁盘物理层:读写物理数据到磁盘介质。
文件系统层次

Linux文件系统结构与原理

    linux的文件大部分存放在硬盘中,与内存不同的是:硬盘的存储能力不会因为断电而消失,存储量大,但是读写速度慢。

    一块硬盘的开始区域是MBR(主引导记录Master Boot Record),MBR分为三个部分:

    一共512个字节    446b的bootloader(引导加载器)用来引导摸个分区加载                                                                                      64b  的partition table(分区表)每16b标识一个分区,只能划分4个分区                                                              2b    的magic nmuber(魔数)用于标记MBR是否有效

    内存分为三个段:BIOS段、内核空间、用户空间。

    开机时硬盘中的系统被启用,过程如下:

开机-->BIOS中的程序对电脑开始自检-->根据BIOS的设定启动次序寻找MBR-->BIOS将bootloader加载到内存中后退出-->内存读取硬盘上的partition table-->在分区中找到内核,并读入内存进行解析-->内核获得控制权-->内核启动自身-->内核找到文件系统的位置后启动文件系统。

    Linux下的分区因为分区表的原因,只能划分4个分区,但都挂载在同一个文件系统树上。


    分区的第一个部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR(MBR:主引导记录 在磁盘的第0盘面0磁道0扇区,大小512个字节),不属于任何文件系统,是全局的,独立于任何文件系统。

    随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。

    随后是多个inode(索引节点),它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。为了顺利的收集齐龙珠,我们需要一个“雷达”的指引:该文件对应的inode。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的"地图",收集起分散的数据块,就可以收获我们的文件了。

    最后一部分,就是真正储存数据的数据块(data block)了。

    文件系统把磁盘分为两片:元数据存储区(metadata)、数据存储区(data)。

    任何文件系统中的数据分为数据和元数据(metadata)。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。但是元数据中不包含文件名,文件名存放在磁盘块上的。

    文件在ext3中由:目录项、inode、数据块组成。

    目录项:包括文件名和inode节点号;                                                                                                               inode :文件索引节点,是文件基本信息的存放地和数据块的指针存放地;                                                       数据块:文件具体内容的存放地。

    

文件存储结构

    文件的inode结构由:inode编号,文件类型,链接数目,属主的UID、GID,文件大小,文件使用的磁盘块数目,最后一次修改、访问、更改的时间。

    当文件过大,对应的数据块数量过多,inode节点本身提供的存储空间不够,会使用其他的数据块来存放数据块位置信息,最多可以有三级寻址结构,所以ext3的单个文件最大为:一级4kb/4b=2^10个数据块,二级2^10*2^10=2^20个,三级2^30个;所以最终大小是(12+2^10+2^20+2^30)*4kB=4TB.

链接的实现

    硬链接共享i节点,和平常的文件一样,只有当所有关联的同一个inode号的文件都被删除,源文件才会被删除;软链接不共享i节点,可以类比与快捷方式,删除快捷方式不影响源文件。 
    硬链接不可以跨文件系统,软链接可以。 

    硬链接不可以链接不存在的文件,软链接可以。

    

    使用stat命令查看

[root@CentOS6 data]#ln Zero.txt /data/Zero.hard
[root@CentOS6 data]#ln -s Zero.txt /data/Zero.soft
[root@CentOS6 data]#stat Zero.txt Zero.hard Zero.soft 
  File: `Zero.txt'
  Size: 31457280  	Blocks: 61440      IO Block: 4096   regular file
Device: 803h/2051d	Inode: 11          Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 13:53:55.977166888 +0800
Modify: 2018-03-31 13:53:56.040165372 +0800
Change: 2018-03-31 13:55:04.373168584 +0800
  File: `Zero.hard'
  Size: 31457280  	Blocks: 61440      IO Block: 4096   regular file
Device: 803h/2051d	Inode: 11          Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 13:53:55.977166888 +0800
Modify: 2018-03-31 13:53:56.040165372 +0800
Change: 2018-03-31 13:55:04.373168584 +0800
  File: `Zero.soft' -> `Zero.txt'
  Size: 8         	Blocks: 0          IO Block: 4096   symbolic link
Device: 803h/2051d	Inode: 12          Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 13:58:37.154165279 +0800
Modify: 2018-03-31 13:55:39.829163402 +0800
Change: 2018-03-31 13:55:39.829163402 +0800

目录结构

/ 根目录

/bin/ 面向所有用户,需要在单用户模式可用的必要命令,例如cat   ls   cp

/boot/ 引导程序文件,例如:kernel   时常是一个单独的分区

/dev/ 设备文件  

/etc/ 配置文件

/home/ 用户的家目录 ‘~’  

/lib/ /bin/和/sbin/下二进制文件必要的库文件

/media/ U盘  CD-ROM等的挂载目录

/mnt/ 临时挂载目录

/opt/ 可选应用软件包

/proc/ 虚拟文件系统,将内核与进程状态归档为文本文件。

/root/ 超级用户的家目录

/sbin/ 必要的系统二进制文件,例如:init ip mount

/tmp/ 临时文件,系统重启的时候将不会被保留。

/usr/ 所有的程序安装在这里,本地安装的程序和其他东西在/usr/local下

/usr/bin 用户命令,这些命令也有可能存在于/usr/local/bin

/usr/sbin 非必要的系统二进制文件,如网络服务,守护进程

/usr/lib 在/usr/sbin和/usr/bin/中的二进制文件所需要的库

/var/ 变量文件:在正常运行的系统中其内容不断变化的文件,例如:日志,脱机文件

/var/cache/ 应用程序的缓存数据

/var/lib/  状态信息。由程序在运行时维护的持久性数据。

/var/log/ 日志文件

/var/run 已经被/run/替代,自最后一次启动以来运行中的系统的信息:如运行中的守护进程,当前登录的用户。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值