1.设备文件:
Linux系统中每个设备都有设备驱动程序,是内核的一部分。由驱动程序提供的api是固定的,一般都包括open,close,read,write,mmap,ioctl等,这样可以保证IO借口的通用性。IOCTL可以提供对特定设备的特定操作,可以自己定义ioctl命令,来实现对设备的特殊操作。不管是真实的设备还是虚拟的设备,都有一样的设备驱动程序。设备驱动程序可以分为两类:字符型设备基于每个字符来处理数据。终端和键盘都属于字符型设备。块设备则每次处理一块数据。块大小取决于设备类型,通常为512字节的倍数,磁盘和磁带都属于块设备。设备名称位于/dev目录下。超级用户可以使用mknod命令来创建设备。设备ID:每个设备都有主辅ID号各一。主ID号标识一般的设备等级,内核会使用主ID号查找与该类设备相应的驱动程序。辅ID号能够在一般等级中确定唯一标识特定设备。ls -l命令可以显示设备文件的主辅ID号。
2.磁盘和分区:
可以将磁盘划分为一个或多个分区,内核则将各个分区视为位于/dev路径下的单独设备。可以使用fdisk命令来决定磁盘分区的编号,大小和类型。命令fdisk -l会列出磁盘上的所有分区。Linux特有的文件/proc/partitions记录了系统中每个磁盘分区的主辅设备编号,大小和名称。每个分区可以存放文件系统,数据区域或者交换区域。
3.文件系统:
利用mkfs命令创建文件系统。在文件系统中,用来分配空间的基本单位是逻辑块,一般为1024,2048,4096等字节。每个分区上可以建立一个文件系统,文件系统包括引导块,超级块,i节点表,数据块
引导块:文件系统的首块,不为文件系统所用,用来包含引导操作系统的信息。操作系统只需要一个引导块,但每个文件系统都有引导块,所以大部分文件系统的引导块没有被用到。
超级块:包含文件系统有关的信息,包括i节点表容量,文件系统逻辑块的大小,以逻辑块计,文件系统的大小。
i节点表:
文件系统中的每个文件或者目录在i节点表中都对应着唯一一条记录。记录了关乎文件的各种信息。
数据块:存放数据。
4.i节点:
i节点就是索引节点,每个文件都有一个i节点,文件系统的i节点表维护了很多i节点的信息。每个i节点都有一个i节点号,就是
ls -li命令所显示的第一列。
i节点维护的信息如下:
a.文件类型,比如常规文件,目录,符号链接,字符设备等。
b.文件属主,即UID
c.文件数组,即GID
d.3类用户的访问权限
e.3个时间戳,文件的最后访问时间,文件的最后修改时间,文件状态的最后改变时间。
f.指向文件的硬链接数量
g.文件的大小,字节为单位
h.实际分配的块数量,512字节为单位。因为文件可能有空洞,所以实际分配的数量可以小于文件大小。
i.指向文件数据块的指针(有一组指针,因为文件的数据存储的位置可能不是连续的。)
5.虚拟文件系统VFS
因为Linux支持多种文件系统,各种文件系统实现原理存在差异,所以在用户层和实际文件系统之间抽象了一层虚拟文件系统,定义一套通用的接口,然后用户层就通过通用的标准接口访问操作各种文件系统。
7.单根目录层级和挂载点
Linux上的文件系统都是单根目录系统,树根就是/,也就是根目录。
mount device directory 这个directory就是挂载点。
8.文件系统的挂载和卸载
系统调用mount()and umount()运行特权级进程可以挂载和卸载文件系统。/proc/mount可以查看已经挂载文件系统的列表。
mount和umount命令自动维护/etc/mtab文件的信息,里面的信息和mount信息差不多,只不过稍微详细一点,但是mount()和umount()系统调用不会维护该文件,所以造成和mount信息有出入。
/etc/fstab包含了对系统支持的所有文件系统的描述。
以上三个文件的内容格式相同,比如:
/dev/sda9 /boot ext3 rw 0 0
包含了六个字段,分别为 已挂载文件名,设备的挂载点,文件系统类型,挂载标志权限,一个数字,一个数字。
a.挂载文件的系统调用:
#include<sys/mount.h>
int mount(count char *source, const char *target, const char *fstype, unsinged long mountflags, const void *data);
mountflags标志位参见P217 fstype是一个字符串,用来表示文件系统,比如ext4,btrfs等。source是设备名称,target是挂载点。
b.卸载文件系统:
#include<sys/mount.h>
int umount(const char *target)//target为文件系统的挂载点
int umount(const char *target, int flags);//umount系统调用的扩展,flags参数是一些位掩码组成。
9.高级挂载特性:
a.在多个挂载点挂载文件系统:
从内核2.4开始,一个文件系统可以同时挂载到多个位置。每个挂载点下显示的内容都是一样的,修个一个挂载点的内容,其他挂载点同样可见。
b.多次挂载同一挂载点
Linux允许针对同一挂载点执行多次挂载。每次的新挂载都会隐藏之前的挂载。卸载后,挂载点下上次的挂载就会显现。
c.绑定挂载:
绑定挂载有些类似于硬链接,就是将两个目录或文件绑定起来,在一个目录下的修改,在其绑定的目录下同样可见。可以跨越多个文件系统挂载点。绑定挂载也分递归和非递归,具体见P226
10.虚拟内存文件系统
LInux同样支持驻留于内存的文件系统,一般mount在/tmp目录下,如果没有,可以利用mount命令或者mount系统调用来挂载。
mount -t tmpfs newtmp /tmp
挂机或者系统崩溃,该目录下的所有数据将丢失。
14.获得与文件系统有关的信息
#include<sys/statvfs.h>
int statvfs(const char *pathname, struct statvfs *statvfsbuf)
int fstatvfs(int fd, strcut statvfs *statvfsbuf);
P228