1 虚拟文件系统
1.Linux 内核核心作用
Linux 内核是操作系统的核心底层程序,介于硬件和应用程序之间,是整个系统的「大管家」,核心作用分 7 大类:
1. 进程管理(任务调度)
1.负责创建、销毁、暂停、恢复进程/线程2.时间片轮转调度,让CPU同时跑多个程序3.进程优先级、抢占式调度、进程间通信(IPC)2. 内存管理
1.管理整机物理内存、虚拟内存2.实现分页、分段、内存交换(Swap)3.给每个进程分配独立虚拟地址空间,隔离互不干扰4.内存回收、缓存/缓冲区管理3. 设备驱动管理
1.对接硬件:硬盘、网卡、显卡、USB、外设等2.提供统一驱动框架,屏蔽硬件差异3.向上给应用提供标准接口,向下控制硬件寄存器4. 文件系统管理
1.支持多种文件系统:Ext4、XFS、NTFS、FAT32等2.统一虚拟文件系统VFS抽象层3.管理文件读写、权限、目录、挂载、磁盘配额5. 网络协议栈
1.内置完整TCP/IP协议栈2.处理网卡收发包、路由、端口、套接字(Socket)3.支持网桥、虚拟网卡、VPN、防火墙(Netfilter/iptables)6. 系统调用接口
1.给上层应用提供系统调用(open/read/write/fork 等)2.应用不能直接操作硬件,必须通过内核系统调用陷入内核态执行7. 权限与安全、资源隔离
1.用户/权限管理、UID/GID、文件权限2.支持Namespace、Cgroup容器隔离(Docker底层依赖)3.系统资源限制(CPU、内存、IO配额)4.内核安全机制、地址空间随机化、权限管控2.文件系统
2.1 什么是文件系统?
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问。 文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。 它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进行统一的管理与组织。2.2 Linux文件系统
Linux将文件系统分为了两层:VFS(虚拟文件系统)、具体文件系统,如下图所示:
VFS(Virtual Filesystem Switch)称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。
VFS并不是一种实际的文件系统,它只存在于内存中,不存在任何外存空间,VFS在系统启动时建立,在系统关闭时消亡。
VFS由超级块、inode、dentry、vfsmount等结构来组成。
Linux系统中存在很多的文件系统,例如常见的ext2,ext3,ext4,sysfs,rootfs,proc…等等。
2.3 VFS
VFS在linux架构中的位置
从用户的使用角度,Linux下的文件系统中宏观上主要分为三层:
1.上层的文件系统的系统调用(System-call ); 2.虚拟文件系统VFS(Virtual File System)层, 3.挂载到VFS中的各种实际文件系统。VFS在整个Linux系统中的架构视图如下:
Linux系统的User使用GLIBC(POSIX标准、GUN C运行时库)作为应用程序的运行时库,然后通过操作系统,将其转换为系统调用SCI(system-call interface),SCI是操作系统内核定义的系统调用接口,这层抽象允许用户程序的I/O操作转换为内核的接口调用。
2.3.1 用户如何透明的去处理文件?
我们知道每个文件系统是独立的,有自己的组织方法,操作方法。那么对于用户来说,不可能所有的文件系统都了解,那么怎么做到让用户透明的去处理文件呢?
例如:我想写文件,那就直接read就OK,不管你是什么文件系统,具体怎么去读!这里就需要引入虚拟文件系统。
所以虚拟文件系统就是:对于一个system,可以存在多个“实际的文件系统”,例如:ext2,ext3,fat32,ntfs…例如我现在有多个分区,对于每一个分区我们知道可以是不同的“实际文件系统”。
例如现在三个磁盘分区分别是:ext2,ext3,fat32,那么每个“实际的文件系统”的操作和数据结构肯定不一样,那么,用户怎么能透明使用它们呢?
这个时候就需要VFS作为中间一层!用户直接和VFS打交道。
VFS是一种软件机制,只存在于内存中,每次系统初始化期间Linux都会先在内存中构造一棵VFS的目录树(也就是源码中的namespace)。
VFS主要的作用是对上层应用屏蔽底层不同的调用方法,提供一套统一的调用接口,二是便于对不同的文件系统进行组织管理。
VFS提供了一个抽象层,将POSIX API接口与不同存储设备的具体接口实现进行了分离,使得底层的文件系统类型、设备类型对上层应用程序透明。
例如read,write,那么映射到VFS中就是sys_read,sys_write,那么VFS可以根据你操作的是哪个“实际文件系统”(哪个分区)来进行不同的实际的操作!这个技术也是很熟悉的“钩子结构”技术来处理的。
其实就是VFS中提供一个抽象的struct结构体,然后对于每一个具体的文件系统要把自己的字段和函数填充进去,这样就解决了异构问题(内核很多子系统都大量使用了这种机制)。
2.4 Linux虚拟文件系统四大对象
为了对文件系统进行统一的管理与组织,Linux创建了一个公共根目录和全局文件系统树。要访问一个文件系统中的文件,必须先将这个文件系统挂载在全局文件系统树的某个根目录下,这一挂载过程被称作文件系统的挂载,所挂载的目录称为挂载点。
传统的文件系统在磁盘上的布局如下:
