一、POSIX标准 以及 POSIX文件接口
POSIX(Portable Operating System Interface of UNIX)表示可移植操作系统接口,是IEEE为要在各种UNIX操作系统上运行软件,而定义API接口的一系列互相关联的标准的总称。
POSIX标准意在期望获得源代码级别的软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。微软的Windows NT声称部分实现了POSIX标准。
简单总结:
完成同一功能,不同内核提供的系统调用(也就是一个函数)是不同的,例如创建进程,linux下是fork函数,windows下是creatprocess函数。好,我现在在linux下写一个程序,用到fork函数,那么这个程序该怎么往windows上移植?我需要把源代码里的fork通通改成creatprocess,然后重新编译...
Posix标准的出现就是为了解决这个问题。linux和windows都要实现基本的posix标准,linux把fork函数封装成posix_fork(随便说的),windows把creatprocess函数也封装成posix_fork,都声明在unistd.h里。这样,程序员编写普通应用时候,只用包含unistd.h,调用posix_fork函数,程序就在源代码级别可移植了。
POSIX标准的文件接口有:close、creat、open、read、sync、write、dup、dup2、flock、fcntl、fsync、lseek、mkstemp等。
二、文件系统类型
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。
常见的文件系统类型有:
ext2(Extended file system),ext3,ext4
xfs,brtfs,zfs,UFS、UFS2、HFS等
JFS、JFS2(IBM AIX系统使用的文件系统)
FAT16、FAT32、NTFS
上面除了ext2不支持journal日志功能,其他都持续日志功能,同时支持日志的方式也有所不同,这些方式分别有自己特性,不过总的区别是文件安全和性能之间的取舍。
文件系统简单来说,好比一个停车场,但是比停车场更加复杂,更加有序,读写的文件,就是通过文件系统来管理的。分区必须经过格式化后才可以使用,格式化的过程就是在分区内建立文件系统的过程。
不同文件系统采用不同的方法来管理磁盘空间,根据存储设备的硬件特性、系统需求等有不同的应用场合。
ext2具有极快的速度和极小的CPU占用率,可用于硬盘和移动存储设备
ext3增加日志功能,可回溯追踪
ext4日志式文件系统,支持1EB(1024*1024TB),最大单文件16TB,支持连续写入可减少文件碎片。为rhel6默认文件系统。
xfs可以管理500T的硬盘。为rhel7默认文件系统。
brtfs文件系统针对固态盘做优化。
NTFS:支持最大分区2TB,最大文件2TB,安全性和稳定性非常好,不易出现文件碎片。
JFS2(又称 enhanced journaled file system)是最早期的日志文件系统。很早就被应用于 IBM AIX操作系统。
其他文件系统:
RAMFS:内存文件系统
ISO 9660:光盘
NFS:网络文件系统
SMBAFS/CIFS:支持Samba协议的网络文件系统
Linux swap:交换分区,用以提供虚拟内存。
主要由三类:
基于磁盘
基于网络
虚拟
更多参见:https://docs.oracle.com/cd/E26926_01/html/E25884/fsoverview-51.html
为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。可以肯定的是 文件系统(FS)之下直接面对的就是硬件存储设备(的物理块层,下面还有驱动层)。
Linux系统文件架构:
User层:GLIBC ---> 内核Kernel层:SCI --> VFS --> FS --> Block layer --> Device drivers
参见:https://blog.csdn.net/jinking01/article/details/90669534
https://blog.51cto.com/13570227/2082908
三、VFS(virtual File System)
VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。从VFS的设计原理可知,VFS之下直接面对的是文件系统(FS),这里的文件系统包括网络文件系统(例如NFS、SMBAFS)。
疑问:Windows系统有VFS吗?回答:应该是没有的,VFS按定义来看,是Unix系统采用的一种文件系统管理方式。
四、FUFS和POSIX的关系
FUSE是(Unix)用户空间的文件系统接口,FUSE内核模块为普通应用程序与内核虚拟文件系统VFS的交互提供了一个桥梁。基于FUSE用户空间模块,开发人员可以不必了解VFS内核机制就能快速便捷地开发POSIX兼容的文件系统交互接口。
疑问:FUFS支持Windows吗?应该不支持,Windows下没有FUFS,但是Windows上可以找到功能类似于FUFS的实现函数。
即便是没有安装FUSE模块,通过VFS内核也能够操作各种文件系统。
五、问一个问题:Oracle底层核心存储使用了FUSE和VFS吗?
回答:
首先,Oracle可以不使用OS的文件管理系统,这是肯定的(很多资料都有说明)。
其次,Oracle可以安装在NAS网络存储上,这说明,Oracle可以使用多种文件系统(例如NTFS、JFS2、EXT4、NFS)。
另外,Oracle 11gR2提供了DBFS,可以将Oracle数据库当成文件系统来使用,兼容FUSE接口。这说明Oracle不但能使用多种文件系统,而且还可以把自己伪装成类似于NFS的网络文件系统(支持POSIX标准)。
所以,据我分析,Oracle应该没有使用FUSE,但是在Linux下应该可以直接用VFS接口,当然也不排除Oracle不通过VFS,直接使用底层的FS,甚至FS都不用(直接用裸设备驱动)。
————继续研究
我们知道Linux下在系统(OS)底层,通过LVM(Logical Volume Manager,逻辑卷管理)和LDM,将OS识别到的物理磁盘或虚拟化的逻辑磁盘进行组合,再分配给其他程序使用。而Oracle 10g R2推出了ASM(自动存储管理),这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的LVM,它不仅支持单实例,同时对RAC集群的支持也是非常好。参见:https://blog.csdn.net/nedved_l/article/details/81172575
ASM它提供了以平台无关的文件系统、逻辑卷管理以及软RAID服务。ASM可以支持条带化和磁盘镜像,从而实现了在数据库被加载的情况下添加或移除磁盘以及自动平衡I/O以删除“热点”。
安装Oracle的时候,文件存储方式时有几种选择:
操作系统文件系统,操作系统提供的,如AIX的JFS2,WINDOWS的NTFS等等;
UNIX平台,可以直接使用裸(RAW)设备,比起使用操作系统的文件系统,有利有弊;
集群文件系统
自动存储管理 (ASM)
具体参见这篇文章:Oracle 存储类型
综上,答案显而易见了,Oracle可以用VFS,也可以不用VFS,感叹Oracle真是复杂、技术含量很高,人家买这么贵也是有底气的,包括网络设备F5也是一样,人家有软硬件结合的核心技术。