Linux开发起步学习笔记(9)----文件系统
根文件系统:是整个文件系统的基础,不可拆卸。
子文件系统:包括硬盘、软盘、CD-ROM、USB盘、网络文件系统NFS,以根文件系统中某一子目录的身份出现。
独立的存储结构:两系统有自己独立的文件系统存储结构,甚至连文件系统的格式也不同。
文件系统的创建和安装
mkfs /dev/sdb 在块设备文件/dev/sdb上创建文件系统
mount /dev/sdb /mnt /mnt可以是任何一个事先建好的空目录名,允许处于根文件系统的任何目录中,此后,操作子目录/mnt就是对子文件系统的访问。若不带参数,就列出已创建的子文件系统。
umount文件系统的卸载
df:文件系统空闲空间 -h (human-readable)
文件系统的存储结构
把整个逻辑设备以块(扇区)为单位划分,编号为0,1,2
引导块(0号块),用于启动系统,只有根文件系统的引导块有效
专用块(1号块):也叫管理块、超级块,存放文件系统的管理信息
i节点区:存放i节点(索引节点,index-node),由若干块构成,在mkfs命令创建文件系统时确定。每个文件对应一个i节点,i节点中的信息包括:指向文件存储区数据块的一些索引指针(组成文件的逻辑块与硬盘的物理块之间的映射)、文件类型、属主、组、权限、link数、大小、时戳等,不含文件名
文件存储区:用于存放文件数据的区域,包括目录表
linux目录结构是树形带交叉勾连的目录结构。目录表:每个目录表也作为一个文件来管理,存于文件存储区当中,有其自己的i节点和数据存储块。目录表由若干个目录项构成,目录项包含文件名和i节点号,用ls命令列出的目录大小是目录表文件本身的长度。
目录表和索引i节点信息分级存储的目的:提高读取效率
硬链接
每个目录项指定的“文件名-i节点号”映射关系,叫做一个硬链接。只限于同一文件系统中的普通文件进行链接。
硬链接数目:同一i节点被目录项引用的次数
ln chapt0 intro普通文件的硬链接:将intro的i节点链接到chapt0上去
ls -i chapt0 intro 列出不同文件的i节点号
不允许用ln对目录进行硬链接,一般来说目录的link数=直属子目录数+2
符号链接(软链接)
用特殊文件“符号链接文件”来实现。可以实现给一个文件起多个名字,将不同文件名对应的i节点指向同一个符号链接文件,该文件链接到实际上的同一个文件。
文件中包含了一个路径名。
命令:ln -s user_on sym.link。
若符号链接包含相对路径名,是相对于符号链接文件的位置。若符号链接包含绝对路径名,引用绝对路径名。eg.ln -s d1/d1b d1/dx在d1目录下创建dx作为符号链接文件,将d1/d1b抄到符号链接文件中去,是一个相对路径名,故链接位置为d1/d1/d1b。
系统调用
以C语言函数调用的方式提供,是操作系统内核提供的编程界面。应用程序(ap)和操作系统(kernel)进行交互的唯一手段。
库函数和系统调用不同,库函数是对系统调用的封装(API)。
系统调用有返回值:0或1表示成功,-1表示失败。
整型变量errno:系统保留存储空间, 系统调用失败后填写错误代码和失败原因。在头文件errno.h中有相关宏定义定义错误原因代码。
在系统调用失败时,使用errno打印错误信息, strerrno(errno)将错误信息转换成对应的字符串输出便于阅读。
访问i节点和目录
系统调用stat/fstat:从i节点获得文件的状态信息。
stat(const char *pathname, struct stat *buf)
fstat(int fd, struct stat *buf)得到已打开文件的i节点,从内存中获取i节点.
两个函数将信息放入指定的结构体中。
目录访问方法
<dirent.h>
DIR *dir(char *dirname);
struct dirent *readdir(DIR *dir);
int closedir(DIR *dir);
struct dir中记录的是文件名和对应的i节点号