【文件系统】
一. 磁盘的物理结构
- 机械硬盘内部有一个或多个高速旋转的盘片,盘片一般由铝合金或玻璃等材料制成,表面涂有一层磁性材料。盘片被划分成许多同心圆,这些同心圆被称为磁道。每个磁道又被进一步划分为多个扇区,扇区是磁盘存储数据的最小单位,通常每个扇区的容量为 512 字节或 4KB。
- 磁头是机械硬盘中用于读写数据的部件,它通过电磁感应原理来实现数据的读写。当需要读取数据时,磁头会感应到盘片上磁性材料的磁场变化,并将其转换为电信号,然后传输给计算机的其他部件进行处理。写入数据时,磁头会根据要写入的数据内容,产生相应的磁场,改变盘片上磁性材料的磁化状态,从而将数据记录在盘片上。
二. 文件系统
- 文件区:保存所有文件内容的数据。记录要保存所有文件内容的块号,块号*8就是该文件的起始扇区,然后就可以转化成CHS地址。
- 块位图:文件区有多少个块,块位图就有多少个比特位,文件区中哪个块保存了数据对应的比特位就为1。(1kb=1024B(字节)=8*1024bit(比特))
- i节点表:保存所有文件属性,文件大小、所有者、最近修改时间。文件属性类型都是一样的,只不过属性类型对应的值不一样,Linux中文件属性定义成结构体变量struct inode,inode类型的结构体变量大小一般为128B。(4*1024)/128 = 32所以1个块可以存储32个文件的属性。
struct indoe
{
int size;
...
int inode_number;
int databack[N];
}
inode位图:一个比特位对应一个inode。
- ll -li xxx:查看inode中文件标识,也就是inode_number。
在磁盘中存储的文件属性和内容都没有存储文件名,但是在用户层是输入文件名,Linux内核如何做到的?
在Linux中目录是文件,Linux将目录下文件名和inode编号的映射关系作为目录文件的内容存储到磁盘中,Linux内核通过inode编号找到该文件属性在磁盘中存储的数据,indoe结构体中的databack数组存储的是该文件所有的块号,将块号转换成CHS地址,然后就能够读取到文件数据。
目录去掉’r’权限,读不到目录文件中的文件名与inode编号的映射关系,也就在磁盘上无法找到该文件;
目录去掉’w’权限,无法向目录文件中写入文件名与inode编号的映射关系,也就无法新建文件。
- 要想找到myshell文件就得知道"myshell"与inode编号映射关系,所以要先找到linux文件,要想找到linux文件先要找到qian文件,要想找到qian文件先要找到home文件,想要找到home文件就要先找到根目录,根目录的inode编号是操作系统设计是制定好的。
三. 软硬链接
3.1软链接
Linux中的软链接和Windows中的快捷方式一样,将软链接文件删除,目标文件不会受影响,因为软连接文件是独立的文件,有自己的inode编号,软链接文件内容是目标文件的路径字符串。但是将目标文件删除,软链接文件会受影响。
软链接意义:可执行程序所处路径很复杂不易找到,这时就可以通过软连接链接目标文件,直接运行软链接文件。
3.2硬链接
硬链接是该目录文件中添加一个新的文件名与目标文件inode编号的映射,目标文件的文件属性struct inode{};中引用计数++。删除目标文件还是硬链接文件并不会互相影响,只是struct inode{};中的引用计数会–。
3.2.1硬链接的意义
dir目录文件引用计数是3,".“代表当前目录,当cd. 时就是要打印dir目录文件内容。”…"代表上级目录,进入到dir下的a目录中,cd…就是要打印dir目录文件内容。在dir目录文件中添加’.‘与dir目录文件inode编号建立映射关系,在dir目录下的a目录文件添加’…'与dir目录文件inode编号建立映射关系。
- Linux系统自己可以给目录建立硬链接,但不允许用户给目录建立硬链接,防止路径成环。
四. 动静态库
- ldd 可执行文件:查看该可执行文件中使用到哪些动静态库
Linux:.so(动态库) .a(静态库)
Windows:.dll(动态库) .lib(静态库)
在软件开发中,库是预先编译好的代码集合,供其他程序调用,有了库可以提高开发效率。动态库在程序运行时才被加载到内存中,并且可以被多个程序共享使用。与之相对的是静态库,静态库在编译时就被完整地复制到可执行文件中。
4.1静态库
- 制作静态库时库名以lib为前缀+名字+.a为后缀
将头文件拷贝到头文件的搜索路径中,库文件拷贝到库文件的搜索路径中
- 将头文件拷贝到头文件搜索路径下、库文件拷贝到库文件的搜索路径下
- 已经将头文件拷贝到头文件搜索路径下、库文件拷贝到库文件的搜索路径下,这里的mylib安装包就可以删掉
- mystdio.h和mymath.h已经是系统文件,所以包含头文件时用’<>'包含
编译链接
- gcc、g++默认是认识C/C++库,但不认识第三方提供的库,编译器编译时-l+名字,告诉编译器指定到那个库中去找
对于第三方提供的库不建议安装到系统路径中。卸载库(删除相关文件)
- -I:指定用户自定义头文件路径
- -L:指定用户自定义哭所在路径
- -l:指定是哪个库
4.2动态库
4.2.1制作动态库
制作动态库中编译.c文件
动态库打包
4.2.2使用动态库
- 编译时不仅要指明头文件和动态库路径,而且运行程序时需要找到动态库加载并运行,所以也要指明动态库路径。
将第三方提供的动态库安装到系统路径中,一般不建议这样做,会影响系统的健康状态
卸载第三方提供的动态库
- 如果卸载了相关动态库,很多相关程序也不能运行
在lib64目录下建立同名的软链接文件
- 是在lib64目录下新建软链接文件,所以需要管理员权限
LD_LIBRARY_PATH环境变量是系统用来查找动态库路径,将第三方提供的动态库路径添加到LD_LIBRARY_PATH环境变量中,这只是暂时的,因为修改的是内存变量。
将第三方提供的动态库路径添加到配置文件中
- 在家目录中存在一个.bashrc的一个用户级配置文件
在/etc/ld.so.conf.d目录下存在系统级的配置文件,在该目录下新建配置文件,将动态库的路径写入到新建的配置文件中。
这里只是添加了配置文件,并没让改配置文件生效
- ldconfig命令使配置文件生效