第二十八讲——磁盘及文件管理 本文共有4374个字,关键词: 磁盘存储是个比较重要的东西,包括磁盘的物理结构,数据管理形式,虽然比较繁复,但是用心整一整还是能够理解的。 磁盘: 磁盘还是比较常见的,现在主流硬盘还是机械硬盘,虽然固态硬盘已经兴起,但是其高价格低容量还是让不少人观望,特别是受产能影响,价格攀升较大。 像我们常见的U盘,光盘,还有以前的软盘,磁带等都属于存储介质 我们常用的机械硬盘有机械结构,像内存等是电子设备,没有机械结构。 硬盘属于I/O设备,机械硬盘中有若干盘片,每个盘片都是双面可读写的,其每一面都有一个磁头,磁头是悬浮在磁盘表面几个微米的地方,所以当机械硬盘受到震动极易损坏。 机械硬盘中将盘片划分为若干个同心圆,每一盘片的每一个同心圆称为磁道,为了方便于数据管理,磁道是划分为扇区的。 扇区:sector,扇区中存储用户的数据和扇区自己的编号(扇区的位置:扇区号,磁头号,磁道号,碟片号等等)。一般来说每一扇区的大小为512bytes Sector size:512bytes 512字节 机械硬盘的发展过程中,容量的变化很大,但是速度上却没有什么变化。 当我们存储较大的数据时,会向所有的盘片上同时写入数据。 所有盘面上相同编号的磁道称为柱面:cylinder。 我们为什么要分区? 分区是在逻辑上将物理磁盘划分为多个分区,每个分区可以是一个单独的文件系统,如果不划分分区,那么一个磁盘上只能存储一个文件系统,分区实际上就是整个磁盘的逻辑边界。 磁盘的分区是按照柱面进行的,而文件系统为了加速存储也是按照柱面进行存储的,所有的磁头都是固定在一个机械臂上的 机械硬盘上的读写延迟: 一是磁头的移动速度 二是盘片的旋转速度(速度越快,散热也就越大) 一般硬盘: 5400r/min 7200r/min 工业级(SCSI) 10k/min 15k/min 衡量磁盘的一个重要指标:平均寻到时间 机械硬盘中是真空的,并且不能有杂质,避免灰尘的干扰,高速运转会产生摩擦。 I/O ps 每秒钟完成的数据读取量,磁道越是靠外,读取速度越是快。 硬盘的格式化分为两种 一是低级格式化,低级格式化是厂商完成的。 二是高级格式化,就是在分区上创建文件系统。 硬盘的第一个扇区我们称为(MBR)master boot record 主引导记录 MBR的大小为一个扇区的大小:512bytes 512bytes划分为三个片段: 第一个片段:446 byte 这一段空间中写入了一段程序,boot loader引导加载器 第二个片段:64 byte 每16 byte标识一个分区,所以一共只能标识四个分区 第三个片段:2 byte 魔数,magic number 用于标记MBR是否有效 当MBR损坏时,操作系统将无法启动。 数据存储方式: 文件系统是一个软件,其本身不是在某个分区上,但是文件系统中的数据是在分区上的,文件系统是一个管理软件。 首先我们在分区上建立一个文件系统,也就是安装一个软件,文件系统在逻辑上将底层的扇区整合成若干个逻辑存储单元(block),方便文件管理,然后再此基础上划分出元数据存储区和数据存储区(为了方便理解这样划分,其实际上比这个复杂得多),数据我们知道,但是元数据是什么? 元数据: 百度百科里是这么说的,为描述数据的数据,主要是描述数据的属性的信息,又称为中介数据,中继数据。元数据是一种电子式目录,为了达到编制目录的目的,必须描述并收藏数据的内容或特色,进而达成协助数据检索的目的。 元数据关于数据的组织,数据域及其关系的信息,简而言之,元数据就是关于数据的数据。在linux中,我们可以认为inode就是元数据。 元数据(inode)中存放了每一文件的属主、属组,扩展属性,权限大小,时间戳和文件数据无关联的数据。 Inode可以直接指定磁盘快,当文件太大的时候,还可以间接指定磁盘快,有二级间接目录,三级间接目录,来制定存放数据的磁盘块在哪个位置,因此这个条目无论是通过直接还是间接,最终能够引用多少个磁盘块决定了单个文件的大小,例如fat32单文件最大限制为4G。 在大型数据库中,单文件达到TB、EB是很常见的,一个文件系统对单个文件大小的支持是一个基本衡量标准,选择文件系统时,要考虑到将来磁盘要扩展到多大。 在linux操作系统中,所有文件都是从根(/)开始,内核会自引用根。 文件名是保存在目录中的,而目录也是文件。 我们需要注意的是inode中是不存储文件名的。 那么问题来了,我们在文件系统划分出来的元数据区域上怎么才能知道哪些块已经使用,哪些没有使用,逐个遍历的方法固然有效,但是每次都去遍历会极大的耗费时间,于是就将元数据区域的一个块拿出来做成元数据位图(bit map),元数据位图中的每一位与一个元数据块对应,并用0或者1标记,已使用为1,未使用为0,然后只需要查看元数据位图就可以知道哪些使用哪些没有使用。相应的,为了方便数据查找数据区的有无,也适用于数据块,在涉及到的时候再详细讲。 我们上面讲到了,文件名是放在目录中的,目录是文件,所以目录也会占据磁盘块,目录不是容器。 目录文件中会存储对应文件的文件名,以及其inode号。目录只是一个路径的映射表。 当我们需要找到/var/log/messages时 先在元数据存储区上找到根所对应的条目,这个条目指向了根的存储空间,在其中找到var及其inode号,再回头从分区上的元数据区通过inode号找到var所对应的条目,找到var的存储空间,在var的存储空间中找到log以及其对应的inode号,返回元数据区通过log的inode号找到log的存储空间,在log的存储空间中找到messages以及对应的inode号,再返回元数据区通过messsges的inode号找到对应的条目指向的存储空间(存储块)。 Linux操作系统会将访问过的条目放入缓存,减少重复操作,提升效率。 好了,我们现在有了数据访问的大概形式,实际上在我们建立好分区后,并不是直接划分出元数据区,位图区,而是将我们的整个磁盘分区划分为几个逻辑组,可以理解为分区下的子分区,但是这个子分区对用户是不可见的,我们称之为 块组(block group),每一个块组的第一个块称为超级块(超级块:全局描述信息),即每一个块组都有自己的块位图,inode位图等等。 我们在目录上新建一个文件,首先要扫描文件的父目录是否存在,扫描inode表的位图,寻找空闲的inode占用,再找到目录对应的inode,通过inode信息找到其指向的存储块,在这个磁盘块上有一个目录表,将刚刚找到的空闲inode和文件名写入目录表,扫描空闲磁盘块(块位图),拿出八个块存储数据,(为保证数据在存储空间上的连续性,避免跳跃读取,避免交叉存放降低访问速度,没有使用的磁盘块会被释放。)当我们不断地创建不断删除文件,会使不连续的空间增多(磁盘碎片)。 删除一个文件: 首先将目录上对应的条目删除 再将对应inode号标记为空。 也就是说,我们删除一个文件,实际上只是删除了其文件名和inode位置零,其数据还是存在,这就使数据恢复成为了可能。 我们可能会用到一个叫做文件粉碎机的软件,它的作用不仅仅是删除对应的条目,还会使用一堆随机数将原来的数据覆盖掉。 我们在同一个文件系统上,剪切比复制快,因为剪切只是将目录对应的路径放到其他相应的地方。其inode磁盘块都不变,只是将文件名和inode号转移到其他目录。 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2016-12-28 评论 1476 次浏览