Linux文件操作 磁盘想知道文件我们需要知道文件的存储地。也就是磁盘机械磁盘是计算机中唯一的一个机械设备。也就是外设磁盘的物理结构扇区磁盘存储数据的基本单位512字节块设备如何定义一个扇区先定位磁头确定磁头要访问哪个柱面。定义一个扇区CHS地址定位文件内容属性为非就是占据扇区数量的问题。能定位一个扇区能定位多个扇区吗磁头数每个盘片一般都头上下两面分别对应一个磁头一共两个磁头磁道数磁道是从盘片外圈往内圈编号0磁道1磁道柱面数磁道构成柱面数量上等同于磁道个数扇区数每个磁道都被切成多个扇形区域圆盘数盘片数量所谓CHS就是柱面cylinder磁头head扇区sector磁盘的逻辑结构磁带上面可以存储数据磁带顺直就形成了线性结构磁盘本质是硬质的但是可以堪称卷在一起的磁带。磁盘的逻辑结构类似于卷每一个扇区都有一个下标我们叫做LBAlogical block address地址就是线性地址LBA转成CHSchs如何转成LBAOS只需要LBA就行LBA转成CHSCHS转成LBA的话磁盘有这个能力CHSLBA磁头数“每磁道扇区数”单个柱面的扇区总数LBA转CHS柱面号CLBA//磁头数每磁道扇区数磁头号H(LBA%(磁头数*每磁道扇区数))//每磁道扇区数扇区号SLBA%每磁道扇区数1引入文件系统引入块的概念其实硬盘是典型的块设备操作系统读取硬盘数据的时候其实不会一个个的读取效率太低而是一次读取多个扇区这多个扇区的集合就是一个块磁盘的每个分区都是被一个个划分出来的块一个块的大小是由格式化的时候决定第最常见的是4Kb连续八个扇区组成一个块块是文件存取的最小单位。磁盘那是一个餐位数组我们看成一维数组下标就是LBA每个元素都是扇区。每个扇区都有LBA。8个扇区一个块每个块的地址都能算出来直到LBA块号LBA/8知道块号LBA块号*8n引入分区概念其实磁盘可以分为多个分区。WIndows来看的话磁盘会分成C,D,E。这就是分区实际上就是格式化。柱面是分区的最小单位。可以利用参考柱面号码的方式进行分区。inode概念文件数据属性我们使用ls -l的时候看到除了看到文件名还能看到文件元数据inode可以成为索引节点这是储存文件元信息的区域ext2文件系统宏观认识所有的准备工作都已经做完我们想要在硬盘上存储文件必须把硬盘格式化为某种格式的文件系统。才能存储文件文件系统的目的就是管理和存储硬盘中的文件。block groupext2文件系统会根据分区大小划分为多个block group。而每个block group都有相同的结构组成。块组内部结构超级块存放文件系统本身的结构信息描述整个分区的文件系统信息记录的信息主要有block和inode的总数量。未使用的block inode的大小。最近一次挂载的时间最近一次写入数据的时间。最近一次检验磁盘的时间等其他文件系统的相关信息super block的信息被破坏可以说整个文件系统结构都被破坏了GDT 块组描述表。描述块属性信息。整个分区分成多个快组就对应有多少个块组描述符每个快组描述符存储一个块组的描述信息。如在这个块组中从哪里开始是inode table。从哪里开始是data blocks空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。块位图block bitmap中俱卢哲data block中哪个数据块已经被占用哪个数据块中没有被占用3-3-4inode位图InodeBitmap• 每个bit表⽰⼀个inode是否空闲可⽤。3-3-5i节点表(InodeTable)• 存放⽂件属性如⽂件⼤⼩所有者最近修改时间等• 当前分组所有Inode属性的集合• inode编号以分区为单位整体划分不可跨分区data block数据区存放文件内容。也就是一个个的block,根据不同的文件类型有以下情况对于普通文件文件数据存储在数据块中block号按照分区进行不能跨分区inode和datablock映射存储属性内阁先找到一个空闲的节点。内核把文件记录在此存储数据该文件需要存储在三个磁盘块。内核找到了三个空闲块。将内核缓冲区的第一块数据复制到300下一块复制到500.以此类推。记录分配情况文件内容按照顺序存放。内核在Inode的磁盘分布区记录了上述快列表添加文件名到目录新的文件名abc。linux如何在当前目录中即在此文件内核将入口添加到目录文件。文件名和indoe之间的对应关系将文件名和文件内容及其属性连接起来目录和文件名访问目录都是用的文件名inode呢目录也是文件磁盘没有目录的概念只有文件属性文件内容的概念目录的属性不用多说内容保存的是文件名和inode的映射关系访问文件必须打开当前目录根据文件名获得对应的inode号。然后进行文件访问。访问文件必须知道当前工作目录。本质是不许能打开当前工作目录。查看目录文件内容路径解析打开当前目录文件查看当前工作目录文件的内容当前工作目录不也是文件吗我们访问当前工作目录也是只知道当前工作目录的文件名。要访问他不也得知道当前工作目录的inode吗所以要打开当前工作目录的上级目录。类似递归。需要把路径中所有的目录全部解析路径缓存linux磁盘中存在目录吗不目录的本质也是文件只保存文件属性文件内容访问热河文件都要从目录开始路径解析吗原则上是但是很慢linux会缓存历史路径结构linux目录的概念是怎么产生的打开的文件是目录的话OS自己在内存中进行路径维护每个文件其实都要有自己的dentry结构包括普通文件这种所有被打开的文件就可以在内存中形成树形结构整个树形节点也会同时隶属于Hash方便快速查找更重要的是这个树形结构整体构成了linux的路径缓存结构打开访问任何文件都会在这棵树下根据路径进行查找。找到就返回属性inode和内容。没找到就从磁盘加载路径添加dentry结构缓存新路径挂在分区inode不能跨分区linux的分区很多啊如何看到自己所在分区分区写入文件系统无法直接使用需要和指定目录关联进行挂载才能用软硬连接硬连接中 我们看到真正找到磁盘上文件的并不是文件名而是inode其实在linux中可以让多个文件名对应同一个Inode软连接硬链接是inode引用另一个文件软连接而是通过名字进行引用另一个文件。但是。新的文件和被引用的文件inode不认同常见上可以看成一个快捷方式软硬连接对比软连接是独立文件硬连接是只是文件名和目标文件Inode的映射关系./…是硬连接 文件备份时硬连接类快捷方式则是软连接