在 Linux 文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间存在着紧密的关系。 如下图:
学到linux上的软连接和硬链接,不得不了解inode,要想知道inode,不得不了解一些文件系统,至少是Linux文件系统
在之前我写过一篇关于linux的虚拟文件系统的博客,不过那篇主要是介绍打开的文件是如何在linux系统中被管理和存储的,那么这篇进阶版文件系统就要介绍一下,当文件没有被打开的时候,它在linux系统中是如何被管理和存储的。
首先我不想和复杂的扇区,设备驱动等细节打交道,因此我先实现了一个简单的功能,将硬盘按逻辑分成一个个的块,并可以以块为单位进行读写。
当我们想在系统里增加一块硬盘的时候,要做以下这四步工作: 对磁盘进行分区 对新建的分区进行格式化,目的是为了创建系统可用的文件系统 对新建的文件系统进行检验 将新建的文件系统挂载到系统的目录树上 磁盘分区:fdisk fdisk [-l] 设备名称 -l:加上这个参数会输出后面接的这个设备的所有分区的信息;如果后面不写设备名称,那么系统中所有设备的分区信息都会被列出来 PS:fdisk这个命令只是一系列磁盘分区功能的入口命令! 例子:给咱电脑的磁盘进行一下分区 //1。找到所有的磁盘设备的名字 [roo
2、在Linux中,元数据中的inode号(inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)才是文件的唯一标识而不是文件名。(例如对一个文件重命名(mv)但inode号仍相同)。
OS的正常工作依赖于存储程序原理、堆栈、中断三个部分。 linux内核从一个初始化上下文环境的函数开始执行,即start_kernel函数,创建多个进程或者fork(创建一个与原来进程几乎完全相同的进程)若干进程,我们为每个进程维护一个进程描述和以及进程间的关系PCB。 当中断发生的时候,如mykernel中就是时钟中断发生之后,接下来OS就会为各进程进行调度,利用Swich_to函数在调度队列中选取出一个适合的进程(系统会根据中断向量号来调用相应的中断异常程序)。由CPU和内核堆栈保存当前进程的各寄存器信息(CPU要做两件工作,一是将当前的eip和esp压入到当前进程的内核栈,二是将esp指向当前进程的内核栈,并将eip指向中断处理入口,进入到内核态。),将eip指向要调度的进程执行的代码区,开始执行。
stat命令用于显示文件或文件系统的详细信息。在显示文件信息时,比ls命令更加详细。
Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。 一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。你可以使用同一套api(read, write)和工具(cat , 重定向, 管道)来处理unix中大多数的资源. 设计一个系统的终极目标往往就是要找到原子操作,一旦锁定了原子操作,设计工作就会变得简单而有序。“文件”作为一个抽象概念,其原子操作非常简单,只有读和写,这无疑是一个非常好的模型。通过这个模型,API的设计可以化繁为简,用户可以使用通用的方式去访问任何资源,自有相应的中间件做好对底层的适配。 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用。在 UNIX 系统中,操作系统为磁盘上的文本与图像、鼠标与键盘等输入设备及网络交互等 I/O 操作设计了一组通用 API,使他们被处理时均可统一使用字节流方式。换言之,UNIX 系统中除进程之外的一切皆是文件,而 Linux 保持了这一特性。为了便于文件的管理,Linux 还引入了目录(有时亦被称为文件夹)这一概念。目录使文件可被分类管理,且目录的引入使 Linux 的文件系统形成一个层级结构的目录树
将磁盘划分分区之后,就需要对磁盘进行格式化才能够进行使用,格式化需要选择一个文件系统来进行格式化,使用cat /etc/filesystems 命令可以查看Linux里支持的文件系统:
在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
在 Linux 中,最直观、最可见的部分就是 文件系统(file system)。下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想。这些思想中有一些来源于 MULTICS,现在已经被 Windows 等其他操作系统使用。Linux 的设计理念就是 小的就是好的(Small is Beautiful) 。虽然 Linux 只是使用了最简单的机制和少量的系统调用,但是 Linux 却提供了强大而优雅的文件系统。
为了提高为文件分配空闲空间的效率,我们需要通过空闲空间管理来维护好现有的空闲空间,避免每次为文件分配空间时去扫描整个磁盘。
但是这些都是文件被进程打开后才有的操作,那么其余文件呢???在我们的系统中有非常多的文件(一切皆文件),被打开的文件只是一小部分。没有被打开的文件实际上是在磁盘上储存的,也就是磁盘文件。 在打开文件之前,我们需要找到文件 -> 就要从磁盘中找到对应文件 -> 通过文件路径与文件名。
翻译成中文大致意思:文件系统主要是管理数据存储以及数据如何检索的,而数据存储在磁盘或内存中。上期我们聊过了漫谈虚拟内存,本期我们就重点介绍磁盘中的机械磁盘的组成以及工作原理,然后引申到文件系统。
文件有很多,但是被打开的文件很少,这些没有被打开的文件在磁盘中,这就叫做磁盘文件。每次先打开一个文件,需要先找到这个文件,需要通过文件路劲及文件名先在磁盘中找到这个文件。本篇文章要研究的是磁盘文件,核心问题是如何存取问题。在研究这些问题之前,需要先认识一下硬件–磁盘
文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。
关于空闲空间的管理,前面提到的是已被占用的数据块的组织和管理。接下来要解决的问题是,当我要保存一个数据块时,应该将其放在硬盘的哪个位置。难道需要扫描所有的块,随意找个空的地方放吗?
在Linux中文件被分为用户数据(user data)与元数据(metadata).
我们知道,日常中我们的台式机、笔记本电脑上的磁盘都会有几百G的容量,这种磁盘一般都是机械磁盘,即使用一些精密的机械部件组成的磁盘。而近几年来,越来越多的笔记本电脑中内置了固态磁盘,固态磁盘又称SSD磁盘。
这次吧,我也实在给自己找不到偷懒的借口了,总之一句话:有好多话现阶段我不能敞开聊。比如有可能在将来某一天,老李也老母鸡翻着跟头生孩子---滚蛋,滚蛋回老家了,滚蛋离开这行业了,就啥也能叨叨了。不过咋说吧,感谢各位的长期关注,这段时间莫名其妙的增长关注量让我觉得我不能太懒惰了寒了大伙儿的心,以后保持周更级别的活跃更新发文的节奏,准备更一个比较简单平时用的比较多的业务方向系列:《API安全指东》。
Linux上的文件系统一般来说就是EXT2或EXT3,但这篇文章并不准备一上来就直接讲它们,而希望结合Linux操作系统并从文件系统建立的基础——硬盘开始,一步步认识Linux的文件系统。
Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所
内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图所示。
UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是程序员。Linux 继承了 UNIX 的设计目标。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux 操作系统无处不在。
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
Linux通过i节点表将文件的逻辑结构和物理结构进行转换。i节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息,在i节点表中最主要的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查询该文件名对应的项,由于此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。
什么是VFS? Linux内核使用工厂的设计模式抽象出实际文件系统统一接口,这个就是虚拟文件系统(VFS),根据应用程序调用虚拟文件系统接口,根据不同的文件系统类型(xfs/zfs/ext4)来调用实
文件管理是操作系统中的一个关键组成部分,它负责文件的存储、检索、组织和保护。文件管理系统提供了用户和程序员与文件系统交互的界面和工具,确保数据的持久存储和高效访问。下面详细介绍文件管理的几个主要方面:
本文描述了为Linux ext2fs文件系统设计和实现事务元数据日志的工作进展。我们回顾了崩溃后恢复文件系统的问题,并描述了一种旨在通过向文件系统添加事务日志来提高ext2fs崩溃恢复速度和可靠性的设计。
块组:Ext4文件系统的全部空间被划分为若干个块组,每个块组内的结构都是大致相同的。 块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。每个块组描述符大小为32字节,其主要描述块位图、i-节点位图及i-节点表的地址等信息。 超级块(Superblock):用于存储文件系统的配置参数(如块大小、总块数、i-节点数)和动态信息(当前空闲块数和i-节点数)。Ext4文件系统的超级块(Superblock)开始于1024字节处,即2号扇区。 i节点:描述文件的时间信息、大小、块指针等信息。 块组描述符和超级块在块中的位置:当块大小为2个扇区时,0号块是引导程序或者保留块,超级块起始于1号块。当块大小为4个扇区时,引导程序或者保留块位于0号块的前两个扇区,超级块位于0号块的后两个扇区。当块大小为8个扇区时,引导程序或者保留块位于0号块的0-1号扇区,超级块位于0号块的2-3号扇区。 Ext4文件系统的整体结构及第一个块组的具体结构如图1所示。
机械磁盘由磁头(head)、磁道(track)、柱面(cylinder)、扇区(sector)和盘片(platter)组成。其中,磁头悬浮在盘片上,并且每张盘片上下各有一个磁头;每张盘片的磁道数是相同的,每张盘片相同位置的磁道组成柱面;而每一个磁道由数量相同的扇区组成,我们知道离主轴越远的扇区面积越大,而扇区大小一般为512B,必然导致存储密度越低,这样做明显浪费空间,为了解决问题,我们将磁盘密度改为等密度结构,这就意味着外围磁道的扇区数量要大于内圈的数量。
本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。
大家知道Linux内核初始发布的时候使用的是Minix文件系统,但是该文件系统基本上就是一个玩具。它有很多限制,比如只能支持64MB的磁盘空间,而文件名最大只能11个字节等等。这些限制对于今天来看似乎是不可思议的。
XFS文件系统进入内核已有15个年头,并且在那之前它就已经被用在运行IRIX的生产系统上5年之久。但是,就像Dave Chinner在他linux.conf.au 2018的演讲上一开始说的那样,现在也许是时候教这条文件系统界的“老狗”一些新的花招了。与一些更加现代的文件系统相比,XFS还缺少不少新特性,比如快照(snapshots)和子卷(subvolumes);但是Dave正在思考如何给XFS增加这些特性并着手编码。
操作系统实现了对系统硬件资源和软件资源的管理,其中软件资源主要是各种系统程序、用户应用程序,还包括大量的文档材料,这些软件资源在操作系统中大多以文件的形式存储。文件系统是操作系统中组织、存取和保护数据的重要部分,文件管理的功能包括:创建、修改、删除文件,按文件名访问文件,决定文件信息的存放位置、存放形式和存取权限,管理文件间的联系以及对文件的共享、保护和保密等。
文件操作的本质是进程与被打开的文件之间的关系。那么没有被打开的文件怎么办?OS如何去管理它们?没有被打开的文件,安安静静地在磁盘里面放着,磁盘中存在大量的文件,这些没有被打开的文件,被OS静态管理起来,方便随时打开。管理被打开文件,叫做文件系统,虚拟文件系统,管理没有被打开的文件,也称为文件系统,躺着的文件系统。
要想理解硬链接和软链接的区别,首先要明白什么是 Inode。Inode 是 Index node,索引节点的意思。每个文件都有一个 inode,里边保存着文件的元数据(meta data),包括:inode 号、文件大小、文件所有者、文件权限、文件类型、创建时间、硬链接数等等,除了文件名以外的所有文件信息都存储在这里。它是文件或者目录在一个文件系统中的唯一标识。
我们知道,Linux系统中我们经常将一个块设备上的文件系统挂载到某个目录下才能访问这个文件系统下的文件,但是你有没有思考过:为什么块设备挂载之后才能访问文件?挂载文件系统Linux内核到底为我们做了哪些事情?是否可以不将文件系统挂载到具体的目录下也能访问?下面,本文将详细讲解Linxu系统中,文件系统挂载的奥秘。
原文链接:https://rumenz.com/rumenbiji/linux-soft-hard-link.html
硬盘的物理结构是比较复杂的,这里我们只需要知道最常用到的几个术语即可,也就是chs寻址中所涉及到的结构
有时,进步难以察觉,特别是当你正身处其中时。而对比新旧资料之间的差异,寻找那些推动变革的信息源,我们就可以清晰地看到进步的发生。在Linux(以及大部分Unix系统)中,都可以印证这一点。
很久以前喜欢捣鼓电脑啊外设什么的,却也没有搞出什么名堂。经常见到标题里的一些术语,却也只是一知半解。最近在复习操作系统,对以往的瞎捣鼓小有感触和总结。故写下此文。
介绍 Linux IO 的一些基本原理。 作者:arraywang,腾讯 CSIG 我们先看一张图: 这张图大体上描述了 Linux 系统上,应用程序对磁盘上的文件进行读写时,从上到下经历了哪些事情。 这篇文章就以这张图为基础,介绍 Linux 在 I/O 上做了哪些事情。 文件系统 什么是文件系统 文件系统,本身是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成不同的文件系统。比如常见的 Ext4、XFS、ZFS 以及网络文件系统 NFS 等等。 但是不同类型的文件系统标准和接
描述:文件元数据(Metadata)是文件的属性,它描述了文件的基本信息,例如文件大小、创建时间、类型、权限等。其通常是存放在inode (index node) 表中,inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
想写一个系列的文章,逐步介绍文件系统的实现原理。采用的是linux0.11版本。这是第一篇文章。首先介绍一下文件系统的基础数据结构。这是后面的基础,需要先熟悉。所谓数据结构决定算法。
之前我写过有关 Linux 文件系统源码分析的文章,但从源码角度分析文件系统略显枯燥(对新手不友好),所以这次主要通过图文的方式来讲解 Linux 文件系统的原理,而不用陷入源代码的深渊之中。
通常我们使用的磁盘和光盘都属于块设备,也就是说它们都是按照 数据块 来进行读写的,可以把磁盘和光盘想象成一个由数据块组成的巨大数组。但这样的读写方式对于人类来说不太友好,所以一般要在磁盘或者光盘上面挂载 文件系统 才能使用。那么什么是 文件系统 呢? 文件系统 是一种存储和组织数据的方法,它使得对其访问和查找变得容易。通过挂载文件系统后,我们可以使用如 /home/docs/test.txt 的方式来访问磁盘中的数据,而不用使用数据块编号来进行访问。
领取专属 10元无门槛券
手把手带您无忧上云