我们目前的文件都是被打开的,如果没有被打开那,在哪里?
一定不是在内存当中,只能在磁盘等外设当中存在着
磁盘文件,如果没有被打开,如何理解这些文件?没有打开的文件都有什么问题?
磁盘使我们计算机上唯一的一个机械设备,同时它还是外设,它表明了它加载到内存的速度非常慢
盘片一共有两个面,有一摞盘片,一面有一个磁头,一个磁头负责一个面的读取。
磁头和盘面是没有挨着的,距离依旧很近,对数据写入和读取,更改基本元素的南北极,读取南北极
向磁盘写入:N->S
删除磁盘数据:S->N
尝试在硬件上,理解数据的一次读和写
磁盘中的基本存储单元:扇区,一个扇区是512字节或者4kb
一般磁盘,所有的扇区都是512字节。 通半径的所有扇区:磁道
只需要确定用哪一个磁头读取:
首先要定位哪一个面:在一个面上,如何在硬件上定位一个扇区?
柱面就是磁道
磁头(head) 柱面(cylinder) 扇区(sector)
未来定义一个扇区 CHS定位法
一个普通文件(属性+数据)都是0,1数据,无非就是占用一个或者多个扇区,来进行数据存储的,我们既然能够使用CHS定位法定位任意一个扇区,我们就能够定位多个扇区,从而将文件从硬件角度,进行读取和写入
如果操作系统能够得知任意一个CHS地址,就能够访问任意一个扇区,那么操作系统内部是不是直接使用CHS地址那?
不是,这是为什么?
磁盘:块设备,所以OS需要一套新的地址,来进行块级别的访问
这种磁带想必大家都见过,磁带本来是一个圆形的,但是如果我们将它拉直,是不是就是一个线性的
初步完成了一个从物理逻辑到线性逻辑的抽象的过程!!数组是天然有下标的
这个时候要定位一个扇区,只需要一个数组下标就可以了。
假设数组的下标是N, 而其中我们OS是以4kb为单位进行IO的,一个操作系统级别的文件要包括8个扇区!甚至在操作系统角度,并不关心扇区
计算机常规的访问方式:起始地址+偏移量的方式(语言,数据类型)
我们只需要知道数据块的起始地址(第一个扇区的下标地址)+ 4kb的类型,我们把数据块看做一个类型
所以块的本质,就是一个数组的下标,以后我们表示一个块,就可以采用线性下标的方式,定位任何一个块了
OS->N->LBA->逻辑地址块
,可是磁盘只认CHS所以我们要知道
LBA <-----> CHS
的相互转化
这个相互转化,只需要了解就可以了
OS系统要管理磁盘,就将磁盘看成一个大数组,对磁盘的管理,变成了对数组的管理。先描述在组织
我们使用ls -l
的时候除了看到文件名,还看到了文件元数据
每行包含7列:
ls -l
读取存储在磁盘上的文件信息,然后显示出来。
这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息
这个执行结果,我们需要了解几样东西
innode
而文件的内容是变化的,我们使用数据块来进行文件内容的保存的,所以一个有效文件要保存,就需要【1,n】数据块。如果是多个文件需要更多的数据块
Linux要查找一个文件,是根据inode编号来进行查找的,包括读取内容。一个inode对应一个文件,而改文件inode属性和改文件对应的数据块,是有映射关系的
将属性和数据分开存放的想法看起来简单,但实际上是如何工作的?
Linux只认识inode号,文件的inode属性中,并不存在文件名!文件名是用户给的
目录是文件吗?是的,Linux下一切皆是文件,目录也有inode
如何理解文件的增删改查
根据文件名找到inode,再根据inode属性中的映射关系,设置block Bitmap对应的bit位,置为0就可以,最后inode number设置inode Bitmap对应的bit位设为0。删除文件,只需要修改位图就可以了
如果文件被误删了,我们该怎么办?
创建一个文件主要有以下4个操作:
软连接,类似Windows的快捷方式,软连接内部存放的都是自己所指向的文件的路径。软连接是一个独立的连接的文件,有自己的inode number,必有自己的inode属性和内容
建立软连接的命令是 ln -s 源文件 目标文件
,其中 -s
表示创建软链接。例如,将 /home/user1/file1
创建一个软连接到 /home/user2/file2
,可以使用以下命令:
ln -s /home/user1/file1 /home/user2/file2
这样,/home/user2/file2
就成为了 /home/user1/file1
的软链接,对 /home/user2/file2
的操作实际上是对 /home/user1/file1
的操作。
硬连接,硬连接和目标文件公用一个inode number,意味着,硬连接一定是和目标文件使用同一个inode的。那么硬连接究竟是干了什么,?建立了新的文件名和老的inode的映射关系,有多少个文件名指向我硬连接数,本质上是一个引用计数
建立硬连接的命令是 ln 源文件 目标文件
,其中不需要使用 -s
参数。例如,将 /home/user1/file1
创建一个硬链接到 /home/user2/file2
,可以使用以下命令:
ln /home/user1/file1 /home/user2/file2
这样,/home/user2/file2
就成为了 /home/user1/file1
的硬链接,对 /home/user2/file2
的操作实际上是对 /home/user1/file1
的操作。因为硬链接是对同一文件的多个名称,所以在文件系统中只有一个文件,所以无法在不同的文件系统中创建硬链接。
解释一下文件的三个时间: