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读写机制的基础。

时间: 2024-08-30 11:43:32

Linux文件系统---用户与内核的交互接口的相关文章

Linux基础(三)——交互接口

一.什么是交互式接口 交互式接口就是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换.换句话说,即在启动终端后,在终端设备附加一个交互式应用程序,就叫交互式接口.通常指软件接口,一般有命令行接口.图形接口.程序接口三种.命令行接口命令行接口(command line interface,CLI)是计算机操作系统或应用程序为用户提供的可视提示接口,使用CLI,可以在特定的行中输入命令,从操作系统接收回应等.常见的如:shell程序:sh (bourn 史蒂夫

深入理解Linux网络技术内幕——内核基础架构和组件初始化

引导期间的内核选项 Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整. start_kernel中调用两次parse_args,用于引导期间配置用户输入数据. parse_param是一个函数,用于解析输入的内核配置选项的参数字符串.字符串的格式为:name_variable=value.寻址特定关键字,并调用对应的函数. 注册关键字: 用宏进行定义: __setup(string, fn) string表示关键字,fn表示关联的处理函数.__setup的宏

深入理解Linux网络技术内幕——用户空间与内核空间交互

概述: 内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求. 用户空间与内核有多种交互方式,最常用的有以下四种:通过/proc虚拟文件系统,通过/sys虚拟文件系统,通过ioctl系统调用,通过Netlink socket. 其中编写程序时最常使用ioctl,这四种方式中有两种是通过虚拟文件系统. procfs 与 sysctl procfs挂载/proc  sysctl挂载在/proc/sys(与后面介绍的

Linux入门--用户操作接口

Linux系统提供两种基本的接口,提供给用户来进行操作:命令行和桌面. 一.命令行 Linux系统的中的命令行,常常指的是Shell. Shell接受键盘输入的命令,并将其传递给操作系统来执行. 如此,用户通过 Shell 与类 Unix 操作系统交互. 几乎所有的类 Unix 操纵系统发行版中都包含 Shell . Shell 本身是一个软件.常见的有 Bash Shell, C Shell,K Shell,TCSH. 二.桌面 现行发行的类 Unix 系统桌面版中,常见的桌面环境有:GNOM

十天学Linux内核之第五天---有关Linux文件系统实现的问题

有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来玩玩这块板子,不知不觉也第五天了,感觉代码都有些模糊,连自己都不是很清楚了,担心现在分享起来比较困惑,各路大神多加批评呀,觉得渣渣的尽量指正出来,拉出来批评,今天还是来总结一下有关Linux文件系统的问题吧~ Linux的使用和用户空间程序的编程和文件系统有着密切的关系,文件系统的概念大家应该都有些

Linux文件系统应用---系统数据备份和迁移(用户角度)

1   前言 首先承诺:对于从Windows系统迁移过来的用户,困扰大家的  “Linux系统下是否可以把系统文件和用户文件分开到C盘和D盘中” 的问题也可以得到完满解决. 之前的文章对Linux的文件系统有过粗略的介绍,但是了解文件系统结构后,有什么用途呢?在本章节将围绕 "基于用户角度的Linux下的数据备份和迁移" 的场景,对Linux文件系统相关知识进行实地应用,产生生产力 . 在了解Linux文件系统之后,就可以 艺高人胆大 玩转Linux的文件目录了. 本文案例 --- &

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

嵌入式 Linux根文件系统移植(一)——Linux文件系统简介

嵌入式 Linux根文件系统移植(一)--Linux文件系统简介 本文对文件系统分析的代码来源于linux 2.6.35.7版本. 一.文件系统的体系结构 文件系统是对存储设备上的数据和元数据进行组织的机制,便于用户和操作系统的交互.Linux支持多种文件系统,文件系统接口实现为分层的体系结构,将用户接口层.文件系统实现和操作存储设备的驱动程序分隔开.Linux文件系统的体系结构如下: 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C库(glibc),为文件系统调用(打开.读取.

磁盘、分区及Linux文件系统

1.磁盘基础知识 1.1 物理结构 硬盘的物理结构一般由磁头与碟片.电动机.主控芯片与排线等部件组成:当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁头悬浮在碟面上画出一个与碟片同心的圆形轨道(磁轨或称柱面),这时由磁头的磁感线圈感应碟面上的磁性与使用硬盘厂商指定的读取时间或数据间隔定位扇区,从而得到该扇区的数据内容.所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴.而所有盘片之间是绝对平行的,在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距