1.Linux 系列-系统基础知识介绍(一)
2.深入剖析Linux文件系统之文件系统挂载(一)(超详细~)
3.xfs文件系统:layout与架构、源码分析
4.C++编译失败报错很奇怪,没说错误在哪儿,怎么解决?源代码和报错信息如下。
Linux 系列-系统基础知识介绍(一)
Linux 文件目录介绍 Linux 文件系统的目录结构是Linux系统基础且重要的内容。Linux由于开放源代码特性,vb记事本源码导致各大公司和团体衍生开发出了不同的根目录结构。因此,FHS(Filesystem Hierarchy Standard)机构应运而生,它是由Linux爱好者自发组成的团体,旨在为Linux制定基本要求。FHS的重点在于规范每个特定目录下应放置的数据类型。 FHS针对目录树架构仅定义三个目录的定义: 1. 根目录 (/) 下的内容 FHS认为根目录 (/) 下应包含如下子目录:/lost+found:用于存放档案系统错误时的遗失片段
/proc:虚拟文件系统,记录与核心相关的资讯
/sys:记录硬件相关信息
/etc:配置文件
/bin:重要执行档
/dev:装置文件
/lib:执行档所需的函式库与核心模块
/sbin:重要的系统执行文件
2. /usr 目录下内容 3. /var 目录下的内容 4. 目录树 (directory tree) 在Linux下,所有文件与目录从根目录开始,形成目录树。目录树的主要特性包括:目录树的启始点为根目录 (/, root)
每个目录可使用本地端的partition文件系统或网络上的filesystem挂载
每个文件在目录树中的文件名(包含完整路径)都是独一无二的
目录树可以以图形方式显示,重要文件数据列出来时,目录树架构如图所示。 5. 绝对路径与相对路径 在文件名部分,需注意绝对路径与相对路径的定义。绝对路径由根目录 (/) 开始写起的文件名或目录名称,例如 /home/tianyi/.bashrc。相对路径相对于当前路径的android的gui源码文件名写法,例如 ./home/tianyi。开头不是 / 属于相对路径。 实例 1:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?命令:cd /var/spool/mail cd ../cron。说明:由于/var/spool/mail 与/var/spool/cron 同在/var/spool 目录中,无需从根目录开始。 实例 2:网络文件常常提到类似 ./run.sh 类型文件,指令意义为何?说明:由于指令执行需要变量支持,若执行文件位于本目录且非正规执行文件目录(/bin, /usr/bin 等),需严格指定执行档。./表示本目录。 Linux文件类型与扩展名 Linux文件类型与文件名代表的意义不同。通过应用程序创建的file.txt、file.tar.gz等文件,用不同程序打开,属于常规文件(普通文件)。文件类型常见有:普通文件、目录文件、字符设备文件、块设备文件、符号链接文件等。 1. 文件类型普通文件:属性为 -,用应用程序创建,源码app开发实战如图像工具、文档工具、归档工具等。
目录文件:属性为 d,目录是一个特殊文件,创建用mkdir或cp命令。
字符设备或块设备文件:属性为 c 或 b,如串口、硬盘、光驱等。
符号链接文件:属性为 l,通过ln -s创建。
数据接口文件(sockets):属性为 s,用于网络数据通信。
2. Linux文件扩展名扩展名类型:文件名无扩展名,权限决定文件执行性,与扩展名无关。常用扩展名有:*.sh(脚本文件),*.tar(打包文件),*.html(HTML文件),*.php(PHP文件)。
Linux文件名长度限制:单一文件或目录最大容许为个字符,完整路径和目录名称最长可达个字符。微投28源码
Linux文件名字符限制:避免特殊字符,如:./、-、+、.(隐藏文件)、特殊指令选项。
Linux文件属性 Linux文件或目录属性包含节点、种类、权限模式、链接数量、归属用户和用户组、访问或修改时间等信息。输出命令与说明包括:第一列:inode
第二列:文件种类和权限
第三列:硬链接个数
第四列:属主
第五列:所归属的组
第六列:文件或目录大小
第七列和第八列:最后访问或修改时间
第九列:文件名或目录名
inode:每个存储设备或分区被格式化为文件系统后,包含inode和Block。inode用于存储数据信息,包括文件大小、属主、用户组、权限等,操作系统通过inode值快速找到文件。 目录树(directory tree):从根目录开始,所有文件与目录形成树状结构,具备特定特性。视频系统源码开源 路径类型(absolute and relative):文件名写法决定路径类型,绝对路径从根目录开始,相对路径相对于当前路径。 Linux文件类型与扩展名、文件属性等基础知识对于理解Linux文件系统至关重要。深入剖析Linux文件系统之文件系统挂载(一)(超详细~)
深入剖析Linux文件系统之文件系统挂载(一)(超详细~) 我们知道,在Linux系统中,将一个块设备上的文件系统挂载到特定目录才能访问该文件系统下的文件。本文将详细阐述文件系统挂载的核心逻辑,包括Linux内核为挂载文件系统所执行的操作以及为何必须挂载才能访问文件。本文分为上下两篇,上篇着重于挂载全貌及具体文件系统挂载方法,下篇则详细介绍挂载实例与挂载点、超级块的关系。 在Linux中,虚拟文件系统层VFS通过统一所有具体文件系统的接口,屏蔽差异,向用户提供一致的访问方式。VFS作为接口层,向下连接具体的文件系统,向上提供用户进程访问文件的功能。接下来,我们探讨VFS中几个关键对象的作用。 VFS对象包括: file_system_type:描述文件系统类型,包括磁盘文件系统、内存文件系统、伪文件系统和网络文件系统。磁盘文件系统用于非易失性存储介质上的文件,如ext2、ext4、xfs等;内存文件系统在内存上存储文件;伪文件系统则是内核可见或用户可见的虚拟文件系统,如proc、sysfs等;网络文件系统允许访问远程计算机上的数据。 super_block:用于描述块设备上文件系统整体信息,如文件块大小、最大文件大小、文件系统标识等。磁盘文件系统仅有一个super_block描述整个文件系统。 mount:描述超级块与挂载点之间的联系,建立文件系统挂载的实例。磁盘文件系统可被多次挂载,每次挂载内存中创建一个mount对象。 inode:描述磁盘上文件的元数据,文件系统需要从块设备读取磁盘上的inode,创建内存中的inode对象,通常在文件首次打开时创建。 dentry:用于描述文件层次结构,构建目录树,存储目录或文件的名称和inode号,以便进程访问目录项。 file:描述进程打开的文件,创建文件对象加入进程的文件打开表,通过文件描述符进行读写操作。 挂载流程包括系统调用处理、挂载点路径查找、参数合法性检查、调用具体文件系统挂载方法、以及实例添加到全局文件系统树。挂载实例添加到全局文件系统树涉及vfs_get_tree和do_new_mount_fc函数,ext2对挂载的处理则包括初始化阶段、挂载时调用、以及通过mount_bdev执行实际挂载工作。 具体文件系统挂载方法包括: ext2对挂载的处理:启动阶段初始化,挂载时调用ext2_mount,执行mount_bdev来执行实际挂载,ext2_fill_super读取磁盘上的超级块并填充内存中的超级块。 mount_bdev源码分析:查找块设备描述符,创建或获取vfs超级块,调用具体文件系统的fill_super方法读取并填充超级块。 ext2_fill_super源码分析:读取磁盘上的超级块,填充并关联vfs超级块,读取块组描述符,读取磁盘根inode并建立根inode,创建根dentry关联到根inode。 挂载完成后,文件系统已准备好被访问,用户进程通过文件路径打开文件,但尚未关联至挂载点。为了将文件系统关联到挂载点,需要通过do_new_mount_fc将挂载实例加入全局文件系统树。下篇将详细讲解这一过程。xfs文件系统:layout与架构、源码分析
本文由腾讯工程师aurelian撰写,深入解析Linux内核中xfs文件系统的layout与架构,结合源码剖析其工作原理。首先,xfs的layout包括超级块、AGF管理(空闲空间追踪)、AGI管理(inode管理)、AGFL(空闲链表)以及B+树结构等组成部分,每个部分都有其特定功能,如超级块用于存储关键信息,B+树用于快速查找空间。
在文件操作方面,xfs支持iops、fops和aops三个操作集,分别负责inode元数据、内存级读写和磁盘级读写。创建文件时,会检查quota并预留空间,通过一系列函数如xfs_trans_reserve_quota和xfs_dir_ialloc进行操作。分配inode时,会依据agi信息和ag的空闲情况动态分配,并通过xfs_iget确保inode在核心内存中可用。
磁盘级inode分配涉及agi信息的获取和B+树的查找,xfs_ialloc_ag_alloc会根据空闲inode情况完成连续或非连续的分配。写操作涉及内存和磁盘级别,buffer io通过page cache管理,直接io和DAX write则有特定的处理方式。xfs的映射关系和data区域树管理对于高效读写至关重要。
工具方面,mkfs.xfs用于格式化,xfs_fsr、xfs_bmap、xfs_info等用于维护和监控文件系统,xfs_admin和xfs_copy用于系统参数调整和数据复制,xfs_db则是用于调试的工具。希望本文能帮助读者理解xfs的复杂性,如需了解更多详情,可关注鹅厂架构师公众号。
C++编译失败报错很奇怪,没说错误在哪儿,怎么解决?源代码和报错信息如下。
这个是linux下面的c++编译对吗,它跟挂载属性inode有关系。比较老的交叉编译器,只支持位inode的文件访问,当遇到超过的文件,就会编译出错并提示:Value too large for defined data type。
那么解决方案就有两种:
Ø 升级交叉编译器版本,让其支持inode的源文件。
Ø 交叉编译器版本不变,将文件系统挂载属性从inode改为inode。