Linux文件系统---用户与内核的交互接口
从磁盘到数据,从数据到文件,从文件到目录,从目录到文件系统,从文件系统到操作系统。构成了计算机中的IO读写机制。
整个磁盘可以分为1个MBR(Master Boot Record)和4个partitions。一个分区,其实就是一个文件系统,文件系统就是管理组织硬盘上数据的一堆数据结构程序,一个文件系统由许多block块组成。块是文件系统读写存放数据的最小单位,一般是4KB。每个Block里只能存放一个文件的数据。如果文件大于Block大小,则该文件会占用多个Block。对于文件来说,分为目录项、inode、数据块。对于操作系统和应用程序来说,都是通过文件系统来访问硬盘上的文件。
1、硬盘读写原理
大多数永久性或半永久性电脑数据都是将磁盘上的一小片金属物质磁化来实现。然后再将这些磁性图可被转换成原始数据。这便是磁存储的原理。
我们知道信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1(磁化为1),凹的地方代表数字0。因此硬盘可以以二进制来存储表示文字、图片等信息。
硬盘,我们可以把它比喻成是我们电脑储存数据和信息的大仓库。一般说来,无论哪种硬盘,都是由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。
磁头是硬盘中最昂贵的部件,也是硬盘技术中最重要和最关键的一环。
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。这些磁道用肉眼是根本看不到的,因为它们仅是盘面上以特殊方式磁化了的一些磁化区,磁盘上的信息便是沿着这样的轨道存放的。磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的山区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。1.44MB3.5英寸的软盘,每个磁道分为18个扇区。
磁盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘单面上的磁道数是相等的。无论是双盘面还是单盘面,由于每个盘面都只有自己独一无二的磁头,因此,盘面数等于总的磁头数。所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数*磁头数*扇区数*512B。
2、文件
Linux中有个哲学,一切皆文件。那么,在Linux文件系统下,有哪些文件类型呢?文件又是怎样存储在文件系统中的呢?
在Linux下,常用的七种文件类型如下:
1)、普通文件regular file,用 - (破折号)标示, 比如 -rwxr--r-- ,rxw前面的 - 表明这个是普通文件。
2)、目录文件directory,用 d 标示 ,比如drwx------ 目录也是一个文件,其中存放着文件名和文件索引结点之间的关联关系。
3)、块设备文件block deivce ,用 b 标示,实际表示硬件设备 ,可以在/dev 目录访问,包含磁盘驱动光盘驱动等。
4)、字符设备文件character device,用 c 标示,也表示硬件设备,但数据是以字节流发送的,设备包括终端设备和串口设备。
5)、链接 link 设备用 l 标示,就是ln 创建的链接,分为软和硬链接。
6)、命名管道文件 pipe 用 p 标示,管道也是一个文件,作为数据管道方便程序之间的通信,也称为FIFO。
7)、套接字文件socket 用 s 标示,与管道不同,套接字能使通过网络连接的不同计算机的进程之间进行通信。
当执行一个文件时候,进程通过文件名直接访问文件本身。这样,每次读取文件的时候,过程如下:
文件名----(通过目录项)---->inode编号----(通过inode)----->得到文件的地址(数据块号数组)---->读取文件。
在Linux的文件系统(如ext2、ext3、ext4)中,一个文件由目录项、inode和数据块组成。
1)、目录项:包括文件名和inode节点号。
2)、Inode:又称文件索引节点,是包含了文件基本信息的和数据块的指针。
Linux正统的文件系统下,将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
3)、数据块:文件的具体内容存放地。
3、文件目录
目录,实际上是文件下系统的访问各个文件组合的映射。在LInux下,设备和硬盘都是挂载到某个目录,最原始的是挂载到根目录。然后用户通过进入目录去访问硬盘上的数据,也就是文件。所以说,目录是一个访问硬盘文件数据的实际入口。在Linux下的目录结构如下:
/bin:系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限),chown、date、mv、mkdir、cp、bash等等常用的指令。
/boot:主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
/dev:在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null、 /dev/zero、/dev/tty、/dev/lp*、 / dev/hd*、/dev/sd*等等
/etc:系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 另外,其下重要的目录有:/etc/init.d/ 。所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop。
/homt:这是系统预设的使用者家目录(home directory)。在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号:~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
/lib:系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
/media:media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy、/media/cdrom等等。
/mnt:如果想要暂时挂载某些额外的装置,一般建议可以放置到这个目录中。
/opt:这个是给第三方协力软体放置的目录 。
/root:系统管理员(root)的家目录。
/sbin:Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。
/srv:srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
/tmp:这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以定期清理。
4、文件系统
文件系统,是操作系统中用于明确磁盘或者分区上的文件的方法和数据结构,即磁盘上组织文件的方法。文件系统的存在,使得数据可以被有效而透明地进行存储访问。在传统意义上,一个分区只能格式化为一个文件系统,所以通常认为一个文件系统就是一个分区。在计算机中,DOS、Windows、OS/2、Macintosh和UNIX-based操作系统都有文件系统,在此系统中文件被放置在分等级的(树状)结构中的某一处。文件被放置进目录或子目录,在树状结构中你希望的位置中。
磁盘或分区和它所包括的文件系统的不同是很重要的。少数程序(包括最有理由的产生文件系统的程序)直接对磁盘或分区的原始扇区进行操作;这可能破坏一个存在的文件系统。大部分程序基于文件系统进行操作,在不同种文件系统上不能工作。
在Linux系统下,可以通过df -Th 查看Linux下硬盘分区以及文件系统信息,而du -sh是查看文件大小信息:
在安装 Linux 系统时,根据服务器的用途,需要对硬盘进行合理分区规划。在系统运行的过程中,随着业务的发展变化,不断增长的数据存储的要求,也需要对磁盘存储进行调整和管理。目前在服务器上使用得最多,技术最成熟可靠的仍然是传统的机械硬盘。随着技术的发展,在相当多的领域也使用了基于闪存技术的 SSD 硬盘。硬盘当然是用来存储数据,即存放系统和用户的文件,而分区的文件系统就规定了数据存储单元在硬盘上排列的规则。
不同的文件系统,存储数据的方式不一样,这些不同的文件系统可以共存于同一个系统的硬盘之上,但不能共存于同一个磁盘分区之上。Linux 最重要的特性之一就是支持多种文件系统。
而 Linux 通过 VFS(Virtual File System)支持多个不同的文件系统,能够与不同的操作环境实现资源共享。关于文件系统,在Linux下有一个重要的哲学,就是一切皆文件。其实现的原理,就是通过VFS。虚拟文件系统(VFS)作为内核的子系统,为用户空间程序提供了文件系统接口,系统中的所有文件系统依靠VFS系统协调工作。通过虚拟文件系统,可以利用标准的UNIX系统调用对不同介质的不同文件进行读写操作,而不需要考虑具体的文件系统和实际物理介质。
所有,总的来说。从磁盘到数据,从数据到文件,从文件到目录,从目录到文件系统,从不同的文件系统到操作系统,这其中蕴含了复杂的实现原理,但是底层设计思路构成了计算机中的IO读写机制的基础。
Linux文件系统---用户与内核的交互接口的更多相关文章
- [apue] linux 文件系统那些事儿
前言 说到 linux 的文件系统,好多人第一印象是 ext2/ext3/ext4 等具体的文件系统,本文不涉及这些,因为研究具体的文件系统难免会陷入细节,甚至拉大段的源码做分析,反而不能从宏观的角度 ...
- 深入理解Linux网络技术内幕——内核基础架构和组件初始化
引导期间的内核选项 Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整. start_kernel中调用两次parse_args,用于引导期间配置用 ...
- 深入理解Linux网络技术内幕——用户空间与内核空间交互
概述: 内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求. 用户空间与内核有多种交互方式,最常 ...
- 24小时学通Linux内核之有关Linux文件系统实现的问题
有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来 ...
- 十天学Linux内核之第五天---有关Linux文件系统实现的问题
原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...
- Linux文件系统应用---系统数据备份和迁移(用户角度)
1 前言 首先承诺:对于从Windows系统迁移过来的用户,困扰大家的 “Linux系统下是否可以把系统文件和用户文件分开到C盘和D盘中” 的问题也可以得到完满解决. 之前的文章对Linux的文 ...
- linux 用户态 内核态
http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...
- 42.Linux应用调试-初步制作系统调用(用户态->内核态)
1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...
- 磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]
1.磁盘基础知识 1.1 物理结构 硬盘的物理结构一般由磁头与碟片.电动机.主控芯片与排线等部件组成:当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁 ...
随机推荐
- 前端canvas合并图片两种实现方式
---恢复内容开始--- 需求: 有一个固定的背景图,还有一个是随机生成的二维码,合并成一张图,让用户下载. 实现一:纯手写,这里为了省事生成图片我直接给的base64,其实使用qrcode.js生成 ...
- lr总结
最近一直在用Loardrunner做性能测试,记录下自己在工作中遇到的问题. LR的基本设置 首先是录制,在录制前选择TOOLS-recording options 在General中选择record ...
- LR 报错误: C interpreter run time error: Error -- Unresolved symbol : vuser_end解决方法
Action.c(33): Error: C interpreter run time error: Action.c (33): Error -- Unresolved symbol : vuse ...
- Java 中可变参数
可变参数 Java 中可变参数 现在需要编写一个求和的功能,但是不知道有几个参数,在调用的时候才知道有几个参数,请问这如何实现呢? Java 给我们提供了一个 JDK 1.5 的新特性---可变参数 ...
- HTML5实战与剖析之字符集属性(charset和defaultCharset)
HTML5对字符集属性也进行了更新,其中charset和defaultCharset属性就是HTML5中新添加的字符集属性.有关charset和defaultCharset属性的具体讲解尽在HTML5 ...
- 洛谷P3459 [POI2007]MEG-Megalopolis [树链剖分]
题目传送门 MEG 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postma ...
- SpringBoot学习(六)
1.pom 文件 <?xml version="1.0" encoding="utf-8"?> <dependencies> <d ...
- 深入理解javascript作用域系列第二篇
前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作 ...
- python __str__ , __repr__区别
Python 有办法将任意值转为字符串:将它传入repr() 或str() 函数. 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式 (如果没有等价的语法,则会 ...
- Varnish与Squid的对比
Varnish与Squid的对比 说到Varnish,就不能不提Squid.Squid是一个高性能的代理缓存服务器,它和Varnish相比较有诸多的异同点,下面进行分析. 下面是Varnish与Squ ...