1. 设备专用文件(设备文件)
设备专用文件与系统的某个设备相对应。在内核中,每种设备类型都有阈值向对应的设备驱动程序,用来处理设备的所有I/O请求。可以将设备划分为字符设备和块设备两种。
每个设备文件都有主、辅id号各一个。主id号标识一般的设备等级,内核会使用主ID号通过一颗设备相应的红黑树来找到相应的驱动程序。辅id号能够标识特定设备。
设备文件的inode中记录了设备文件的主、辅id。每个设备驱动程序都会将自己与特定主设备号的关联关系向内核注册(上面说的红黑树),一次建立设备专用文件和设备驱动程序之间的关系。内核是不会使用设备文件名来查找驱动程序的。
2. 磁盘和分区
磁盘分区可以容纳任何类型的信息,但通常只会包含以下之一:
-
文件系统:用来存放常规文件
-
数据区域:可以作为裸设备来对其进行访问
-
交换区域:供内核的内存管理之用
3. 文件系统
在文件系统中,用来分配空间的基本单位是逻辑块,即文件系统所在磁盘设备上若干连续的物理块
-
引导块:总是作为文件系统的首块,不为文件系统所用,只包含用来引导操作系统的信息
-
超级块:包含用于文件系统有关的参考信息:inode表容量、文件系统中逻辑块的大小、以逻辑块计,文件系统的大小
-
文件系统中的每个文件或目录在inode表中都对应着唯一一条记录。这条记录登记关乎文件的各种信息
-
数据块:文件系统的大部分空间都用于存放数据
5. inode
针对驻留于文件系统上的每个文件,文件系统的inode表会包含一个inode,inode所维护的信息如下:
-
文件类型
-
文件属主
-
文件属组
-
三类用户的访问权限
-
三个时间戳(文件的最后访问时间a,文件最后修改时间m、文件状态的最后改变时间c)
-
指向文件的硬链接数量
-
文件的大小,以字节为单位
-
实际分配给文件的块数量,以512字节块为单位
-
指向文件数据块的指针
6. 虚拟文件系统
linux所支持的各种文件系统,其实现细节均不相同。虚拟文件系统是一种内核特性,通过为文件系统操作创建抽象层来解决问题:
-
vfs针对文件系统定义了一套通用接口。所有与文件交互的程序都会按照这一接口来进行操作
-
每种文件系统都会提供vfs接口的实现
7. 日志系统
系统崩溃之后,为了确保文件系统的完整性,充气式就必须对文件系统的一致性进行检查fsck。如果过大,就会非常玛法。
采用日志文件系统,则无需在系统崩溃后对文件进行漫长的一致性检查。在实际更新元数据前,日志文件系统会将这些更新操作记录与专用的磁盘日志文件中,对元数据更新的记录是按照其相关性分组进行的。在事务处理过程中,一旦系统崩溃,系统重启时便可以利用日志重做(redo)任何不完整的更新,同时为文件系统恢复一致性状态。
借用数据库的说法,日志文件系统能够确保总是将文件元数据事务作为一个完整丹玉来提交。
8. 文件系统的挂载和卸载
-
#include <sys/mount.h>
-
int mount(const char *source, const char *target, const char *fstype, unsigned long mountflags, const void *data);
-
/*returns 0 on success, or -1 on error*/
fstype是一个字符串,用来标识设备所含文件系统的类型
data是一个指向信息缓冲区的指针,对其的解释则取决于文件系统,就大多数文件系统而言,该参数就是一个字符串,包含了以逗号分隔的选项设置
-
#include <sys/mount.h>
-
int umount(const char *target);
-
/*returns 0 on success, or -1 on error*/
-
int umount2(const char *target, int flags);
-
/*returns 0 on success, or -1 on error*/
9. 获得与文件系统 有关的信息:statvfs()
-
#include <sys/statvfs.h>
-
int statvfs(const char *pathname, struct statvfs *statvfsbuf);
-
int fstatvfs(int fd, struct statvfs *statvfsbuf);
-
/*both return 0 on success, or -1 on error*/
-
struct statvfs{
-
unsigned long f_bsize;/*file-system block size*/
-
unsigned long f_frsize;/*fundamental file-system block size*/
-
fsblkcnt_t f_blocks;/*total number of blocks in file system(in units of f_frsize)*/
-
fsblkcnt_t f_bfree;/*total number of free blocks*/
-
fsblkcnt_t f_bavail;/*number of free blocks available to unprivileged process*/
-
fsfilcnt_t f_files;/*total number of i-nodes*/
-
fsfilcnt_t f_ffree;/*total number of free i-nodes*/
-
fsfilcnt_t f_favail;/*number of i-nodes available to unprivileged process*/
-
unsigned long f_fsid;/*file-system ID*/
-
unsigned long f_flag;/*mount flags*/
-
unsigned long f_namemax;/*maximun length of filenames on this file system*/
-
};
以上两个函数能够获得与已挂载文件系统有关的信息
阅读(9972) | 评论(0) | 转发(0) |