Linux文件系统相关知识整理

1.      磁盘的物理结构

盘面:磁盘是由一叠盘面组成

磁头(Heads):每个磁头对应一个盘面,负责该盘面上的数据的读写

磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道

柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面

扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区

磁盘容量的大小一般和磁道的密集程度有关,扇区数一般是不变的

2.      磁盘I/O的过程

首先是磁头径向移动来寻找数据所在的磁道->寻道时间

找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方->旋转延迟

向目标扇区读取或者写入数据->存取时间

到此为止,一次磁盘IO完成。

所以 单次磁盘IO时间 =
寻道时间 +
旋转延迟 +
存取时间

 

3.      Linux文件系统

a)        superblock

记录文件系统的整体信息,包括inode/block的总量,使用量,以及剩余量和文件系统格式的相关信息

b)        inode

记录文件的权限和属性,一个文件会占用一个inode,同时记录文件的数据所在的block号

c)        block

实际记录文件的内容,如果文件内容很大,会占用多个block

由于每个inode和block都有编号,而每个文件只会占用一个inode,inode中记录了文件的block号.这样我们只需要找到文件对应的inode,自然就可以找到这个文件的block号,那么就可以拿到该文件的数据了.

      

4.      创建一个目录

当我们在Linux下创建一个目录的时候,系统会分配一个inode和至少一个block给该目录(如果该目录下文件过多,可能会分配多个block块用来记录文件信息).其中inode记录了该目录的相关权限与属性,并记录了分配的block块号.block中则保存了这个目录下的文件名与该文件名对应的inode号,这样访问一个目录中的文件的过程如下描述

读取当前目录的inode数据->判断是否有权限对该目录进行相关操作->如果有权限->读取该目录的block的数据->获得当前目录下的文件名和文件对应的inode号->读取对应文件的inode号的信息->判断是否有权限对该文件进行相关操作->如果有权限->读取该inode中保存的block块的数据->读取过程完成

5.      创建一个文件

当我们在Linux下创建一个文件的时候,系统会分配一个inode和相对于该文件大小的block块的数量(size/block上取整).如果超过inode的直接指向,系统还会分配额外的间接block哦.创建文件和目录的时候,我们首先会进行权限判断,然后根据bitmap寻找空闲的inode和block.

6.      文件共享

在Linux的进程中,当我们打开一个文件时,返回的是一个文件描述符。这个文件描述符是一个数组的下标,对应数组元素为一个指针。有趣的是,这个指针并没有直接指向文件的inode,而是指向了一个文件表格,再通过该表格,指向加载到内存中的目标文件的inode。如下图,一个进程打开了两个文件

如果进行dup/dup2的话,例如fd = 4为dup(1)产生, 那么结构如下图所示:

7.      软链接与硬链接

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,而软链接相当于Windows下的快捷方式,其实只是保存了原文件的文件名而已。

有了以上的知识后,理解软链接与硬链接就是小菜一碟了.给出一张图即可说明.

主要内容摘自<鸟哥私房菜> 部分内容来自网络.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 20:27:14

Linux文件系统相关知识整理的相关文章

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign

Linux 动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序,动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //elf

Linux进程管理知识整理

Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) TASK_INTERRUPTIBLE(可中断等待状态) TASK_UNINTERRUPTIBLE(不可中断等待状态) TASK_STOPPED(进程被其它进程设置为暂停状态) TASK_TRACED(进程被调试器设置为暂停状态) TASK_DEAD(退出状态) 进程由于所需资源得不到满足,从而进入

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

链表的相关知识整理

链表的相关知识整理 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 链表与数组的区别 回忆下数组的概念 ,所谓数组,是相同数据类型的元素按一定顺序排列的集合.根据概念我们可以知道数组在内存中连续,链表不连续:由于不同的存储方式导致数组静态分配内存,链表动态分配内存,数组

MFC相关知识整理

按:在该文档中整理我在做MFC相关编程时遇到的问题以及当时解决时所参考的资料.标准C/C++相关的问题不会放在这个帖子中,请移步:http://blog.csdn.net/edychang/article/details/37561701 1._T/_L宏:http://blog.csdn.net/panjean/article/details/6011090 2.CListCtrl: http://blog.csdn.net/bingxuewujian/article/details/7050

Linux 文件系统相关的基本概念

本文介绍 Linux 文件系统相关的基本概念. 硬盘的物理组成 盘片硬盘其实是由单个或多个圆形的盘片组成的,按照盘片能够容纳的数据量,分为单盘(一个硬盘里面只有一个盘片)或多盘(一个硬盘里面有多个盘片)的硬盘.下面是一张盘片的示意图(此图来自互联网): 磁道和柱面硬盘中有磁头在盘片上读写数据,磁头固定在机械臂上,机械臂上有多个磁头(每个盘片的两侧各一个).当磁头固定不动时(假设机械手臂不动),盘片转一圈所画出来的圆就是磁道(track).所有盘片上相同半径的那个磁道就组成了柱面(cylinder

Redis相关知识整理

Redis相关知识整理 1. Redis和MySQL的区别?a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库.mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在缓存中,读取速度快,但是保存时间有限,最后按需要可以选择持久化到硬盘. b).mysql作为持久化数据库,每次访问都要在硬盘上进行I/O操作.频繁访问数据库会在反复连接数据库上花费大量时间.redis则会在缓存区存储大量频繁访问的数据,当浏览器访问数据的时候,先访问缓存,如果访问不到再进入数据库.

OpenCV&amp;Qt学习之四——OpenCV 实现人脸检测与相关知识整理

开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV. 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV 1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程运行起来.如果是新版的OpenCV跑旧的例程,编译运行出错的话,需要确保: #include