【Linux】详解文件系统以及周边知识

一、磁盘基础知识

磁盘可以划分为多个环,每个环称为一个磁道。每个磁道又被均分为多个扇区,扇区是磁盘I/O操作的基本单位(如果要修改扇区中的一个比特位,必须将整个扇区加载到内存中)。磁盘的盘面、磁道和扇区都有各自的编号。要访问某个扇区的内容,必须通过磁头先定位到特定的磁道(柱面cylinder),然后确定盘面(磁头head),最后确定磁道上的扇区(sector),这种方法称为CHS定位法。

【Linux】详解文件系统以及周边知识1.1、磁盘逻辑结构的理解 我们可以将磁盘盘面上的每个磁道想象成拉直成一个线性结构。如果将所有磁道和所有盘面拼接在一起,就形成了一个类似磁带的长线性结构。假设磁盘每个盘面的大小为200GB,总共有四个盘面,每个扇区大小为512KB,那么800GB可以被分成1677721600个扇区。如果将这个线性结构视为一个数组,我们可以通过访问扇区对应的数组下标,并通过算法转换为CHS地址来访问该扇区。这种转换工作由磁盘完成。因此,操作系统需要知道磁盘有多少个盘面,每个盘面的大小是多少,每个扇区的大小是多少,每个磁道有多少个扇区。这样,操作系统就可以统一使用线性地址来进行编程,并在访问磁盘数据时将线性地址交给磁盘,由磁盘将其转换为CHS地址,从而实现数据的读取和写入。

【Linux】详解文件系统以及周边知识 二、文件系统底层的实现原理2.1、系统层面的数据块 然而,在操作系统层面上,单次交互一个扇区的数据量被认为过小。文件系统认为I/O操作的基本单位是4KB,即8个扇区(假设)。因此,操作系统和磁盘之间一次最小交换的数据量为8个扇区。操作系统可以将800GB的磁盘重新分块,以8个扇区为一个数据块,第一个数据块的数组下标编号为1,第二个为2,以此类推,这种编址称为LBA地址(Logical Block Address)。当操作系统需要读取或写入某个数据块时,只需将数据块的数组编号乘以8,再加上[0,1,2,3,4,5,6,7],即可找到对应的8个连续扇区。然后将这8个扇区的线性地址交给磁盘,转换为CHS地址,就可以对这8个扇区进行读取或写入。

【Linux】详解文件系统以及周边知识2.2、分区和分组 我们已经讨论了磁盘和操作系统对存储空间的分块问题,接下来探讨操作系统如何管理这800GB的空间。在实际操作中,操作系统不会将这800GB的空间视为一个整体,而是将其划分为多个分区(如我们常见的C盘、D盘、E盘)。每个分区下又有多个分组,通过对一个分组的管理经验应用到其他分组中(当然也可以应用其他管理经验),从而有效管理所有分区和分组。

【Linux】详解文件系统以及周边知识 Linux磁盘文件特性包括文件内容和文件属性,文件属性包括类型、大小、权限、时间、inode编号等(文件名不属于文件属性)。一个文件的inode编号在其所属分区内是唯一的,系统通过inode编号而非文件名来标识文件。文件的内容和属性是分开存储的。在磁盘中,文件属性存储在struct inode结构体中,大小为128字节。操作系统的数据块大小为4KB(如上所述),因此一个数据块可以存储32个struct inode结构体。

2.3、组的管理模式 为了有效管理每个分组中的10GB空间,系统对其进行了模块化管理。

【Linux】详解文件系统以及周边知识 创建文件时,需要在组的inodeBitmap中从左到右遍历,找到第一个非1的比特位,将其置1,并通过该比特位索引到inodeTable中申请一个struct inode结构体,填写相应的属性。然后在Block Bitmap中找到非1的比特位,置1,并将数据填入对应的Data blocks数据块中。删除文件时,只需将其在inode Bitmap和Block Bitmap中占用的比特位置0,而不需要在磁盘中删除所有数据,这是删除文件比下载文件快得多的原因。每个分区的每个分组都有一个起始编号,struct inode结构体的inode编号可以理解为该分组的起始编号加上在inode Bitmap中的偏移量。这样可以确保一个文件的inode编号在其所属分区内是唯一的。

为了将文件的属性和内容建立联系,struct inode结构体中包含一个int block[15]数组,用来表示该分组内哪些数据块属于该文件。block数组下标[0,11]直接保存Data blocks中的编号(一级索引);[12,13]保存的是其他保存数据的数据块编号(二级索引),[14]保存的是三级索引,这样可以有效增加保存文件数据的数据块数量,从而使一个文件能够保存更多的数据。

三、文件的增删查改 在Linux系统中,目录也是文件,其内容中保存了目录中文件的inode编号和文件名之间的映射关系。这就是为什么如果我们对一个目录没有写入权限,就无法在这个目录中创建文件的原因。因为创建文件需要将文件的inode编号和文件名之间的映射关系写入目录的内容中,本质上是修改目录的内容,而操作系统不允许我们进行这种修改。删除文件时,首先通过文件名在当前目录中进行字符串匹配,匹配成功后,将所在分组的inodebitmap和blockbitmap中对应的比特位置0,然后从目录的内容中删除文件名和inode的映射关系,这样文件就被删除了。

四、文件路径 查找文件时,内核会递归地帮助我们找到根目录,从根目录开始解析路径。因为要获取文件的内容,首先需要获取其inode编号,但我们只有文件名。文件名和inode编号存储在文件所在的目录中,因此需要在目录的内容中查找。但是我们也只知道目录名,所以需要继续查找上级目录的inode编号,依此类推,直到找到根目录。根目录的inode编号是系统已知的,因此我们可以逆向找到所有目录的inode编号,从而找到目标文件的inode编号,进而获取文件内容。这就是文件路径最根本的作用。

五、挂载的理解 挂载(Mounting)是指操作系统使存储设备(如硬盘、CD-ROM或网络共享)上的文件和目录可供用户通过文件系统访问的过程。一个写入文件系统的分区要被Linux操作系统使用,必须挂载到一个目录下。分区的访问都是通过挂载路径进行的。通过文件路径的前缀可以知道文件所在的分区。

以上就是【Linux】详解文件系统以及周边知识的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/10138.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
研发需求管理平台盘点:jira、Doors等8款主流产品对比
上一篇 2025年11月12日 17:57:53
doors需求管理工具怎么样?对比主流7大需求管理系统
下一篇 2025年11月12日 17:58:05

相关推荐

  • VSCode的代码格式化快捷键是什么?

    VSCode代码格式化快捷键为Shift+Alt+F(Windows/Linux)或Shift+Option+F(macOS),需安装对应语言的格式化工具;若无效,可能是未安装扩展、文件类型不支持或快捷键冲突;可右键选择“格式化文档”或通过命令面板执行,也可在键盘快捷方式中自定义。 VSCode的代…

    2026年9月21日
    000
  • Linux怎么踢出指定的登录用户

    要踢出指定登录用户,首先使用w或who命令识别其TTY或会话ID,再通过pkill -KILL -t 强制终止会话,或用loginctl terminate-session 优雅结束;若需防止重新登录,可临时锁定账户(passwd -l)或将用户shell改为/sbin/nologin。 在Linu…

    2026年9月21日
    000
  • 如何配置mysql初始用户和密码

    答案:MySQL安装后默认用户为root,密码为空或自动生成。需先确认服务运行,再登录并设置密码;若为空密码则直接登录后用ALTER USER修改,若为临时密码需从日志获取并强制修改;可创建远程用户并授权;推荐运行mysql_secure_installation进行安全加固,包括设密码、删匿名用户…

    2026年9月21日
    000
  • Linux如何查看默认网关

    使用ip route命令可查看默认网关,如ip route | grep default显示default via 192.168.1.1 dev eth0,其中192.168.1.1为网关地址。 在Linux系统中,查看默认网关是网络排查中的常见操作。可以通过命令行工具快速获取当前系统的默认路由信…

    2026年9月21日
    200
  • Linux如何设置虚拟网卡并分配IP

    Linux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IP

    可通过创建虚拟网卡为同一物理网卡绑定多个IP,临时使用ip addr add加label方式,永久配置则需修改对应系统网络配置文件,CentOS修改ifcfg-eth0:0,Ubuntu在interfaces文件中添加iface eth0:0,最后重启网络服务并验证接口状态。 在Linux系统中,可…

    2026年9月21日 用户投稿
    000
  • 协程调试与性能分析工具

    我们需要协程调试和性能分析工具是因为协程的异步特性使得传统工具难以应对调试和性能优化挑战。1) pycharm 适合基本调试,但处理大量协程时可能变慢。2) aiodebug 适用于检测协程问题,但会增加性能开销。3) asyncio-profiler 用于分析协程性能,但可能难以解读大量协程的结果…

    2026年9月21日
    100
  • Win7系统信息查询

    Win7系统信息查询Win7系统信息查询Win7系统信息查询Win7系统信息查询

    通过按下 Win+R 组合键打开“运行”对话框,输入 cmd 并按回车,可以打开命令提示符窗口。在此界面中执行特定指令可获取 Windows 7 的系统详情,这是一种常见的查询方式。 在命令提示符中输入 systeminfo 命令,即可显示包括操作系统版本、系统架构(32位或64位)、安装日期以及网…

    2026年9月21日 用户投稿
    200
  • Windows10C盘的Windows.old文件夹可以删除吗_Windows10Windows.old删除方法

    升级Windows 10后C盘空间不足,很可能是系统生成的Windows.old文件夹占用所致。该文件夹用于保留旧系统备份以便回滚。可通过三种方法安全删除:一是使用磁盘清理工具,进入系统属性选择“清理系统文件”,勾选“以前的 Windows 安装”进行删除;二是通过设置中的存储感知功能,手动勾选“以…

    2026年9月21日
    200
  • Linux如何创建新用户并设置初始密码

    Linux如何创建新用户并设置初始密码Linux如何创建新用户并设置初始密码Linux如何创建新用户并设置初始密码Linux如何创建新用户并设置初始密码

    创建新用户并设初始密码需用useradd加passwd命令,如sudo useradd -m -s /bin/bash devuser创建用户,sudo passwd devuser设置密码;通过sudo usermod -aG sudo devuser赋予sudo权限;密码策略应包含长度、复杂度、…

    2026年9月21日 用户投稿
    100
  • LINUX怎么判断一个文件是否存在_Linux判断文件是否存在方法

    1、使用test命令或[ ]、[[ ]]结构结合-f选项可判断文件是否存在,返回0表示存在;2、通过if语句实现条件判断;3、使用-d、-L等选项可检测目录、符号链接等类型。 如果您需要在脚本或命令行中确认某个文件是否存在于系统中,可以通过多种方式检查其状态。这类操作常用于条件判断和自动化流程控制。…

    2026年9月21日
    100
  • Java中浮点数比较的陷阱:理解double类型的不精确性与正确比较方法

    java中`double`类型因其二进制浮点表示的固有不精确性,即使在相同java版本和架构下,也可能在不同环境中产生微小的数值差异。直接使用`==`比较浮点数是不可靠的,因为它无法容忍这些细微的舍入误差。正确的做法是采用基于容差(epsilon)的比较方法,通过判断两数之差的绝对值是否小于一个预设…

    2026年9月21日
    200
  • 如何下载豆包电脑网页版_豆包电脑网页版正版链接

    豆包AI电脑及网页版可通过官网和官方应用商店安全获取。1、访问https://www.doubao.com登录使用网页版;2、官网下载电脑客户端,支持Windows和macOS;3、通过Microsoft Store或App Store搜索“豆包 AI”,认准北京字节跳动网络技术有限公司开发,确保正…

    2026年9月21日
    200
  • Linux目录结构与文件系统设计理念

    Linux目录结构以根目录为起点,遵循“一切皆文件”理念,通过标准化层级划分(如/bin、/etc、/home等)实现资源统一管理,结合FHS标准、灵活挂载机制与权限模型,提升系统可维护性、安全性和跨发行版兼容性,体现简洁高效的设计哲学。 Linux的目录结构与文件系统设计体现了简洁、统一和高度模块…

    2026年9月21日
    200
  • mysql如何配置默认存储引擎

    首先查看当前默认存储引擎,通过SHOW VARIABLES命令确认;然后编辑my.cnf或my.ini文件,在[mysqld]下添加default-storage-engine=InnoDB;接着重启MySQL服务使配置生效;最后验证更改结果并检查建表默认引擎。 MySQL 默认存储引擎的配置可以通…

    2026年9月21日
    100
  • Linux怎么使用systemctl管理服务

    Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务

    systemctl是Linux中管理systemd服务的核心工具,提供统一命令集来启动、停止、重启、查看服务状态及设置开机自启,支持并行启动、依赖管理与Cgroups资源控制,相比SysVinit更高效;通过创建/etc/systemd/system/下的.service文件可自定义服务,包含[Un…

    2026年9月21日 用户投稿
    200
  • Linux如何查看命令别名alias使用方法

    直接输入 alias 命令可列出当前会话所有别名,如需查看特定命令是否为别名可用 type 命令;别名通过简化常用命令提升效率并减少错误,临时别名在当前会话生效,永久别名需写入 ~/.bashrc 或 ~/.zshrc 文件,删除则用 unalias 命令;别名适用于简单命令替换,函数支持参数与逻辑…

    2026年9月21日
    100
  • 如何设计统一的API响应格式?

    统一的api响应格式可以通过以下步骤设计:1. 使用包含状态码、消息和数据的基本结构;2. 定义标准的错误码和消息;3. 加入版本字段以支持版本控制和扩展性。这样可以提高api的可读性、简化错误处理和增强可扩展性,提升整体开发效率和用户体验。 统一的API响应格式是构建可靠和用户友好的API的关键。…

    2026年9月21日
    100
  • 如何在服务器上优化mysql安装

    优化MySQL需从系统环境、配置参数、存储引擎到日常维护多层面入手,首先确保内存合理分配、选用XFS等高性能文件系统、关闭非必要服务并调整内核参数;其次在MySQL配置中优先使用InnoDB引擎,科学设置innodb_buffer_pool_size、innodb_log_file_size、max…

    2026年9月21日
    100
  • Linux怎么监控特定进程的运行状态

    Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态

    监控Linux进程需综合使用ps、top、htop、pgrep和systemctl等工具,结合资源占用、进程状态、日志输出和进程数量判断是否异常,并通过systemd的Restart机制或看门狗脚本实现自动重启,同时利用journalctl、sar、atop及Prometheus+Grafana等方…

    2026年9月21日 用户投稿
    100
  • 为什么VSCode的语法高亮有时会失效?

    语法高亮失效通常由语言模式识别错误、扩展冲突或配置问题导致。1. 检查右下角语言模式并手动切换为正确类型,确保文件有正确扩展名;2. 禁用近期安装的扩展或以 code –disable-extensions 启动排查冲突;3. 切换至默认主题并检查 settings.json 是否覆盖颜…

    2026年9月21日
    600

发表回复

登录后才能评论
关注微信