【Linux系统】理解硬件 | 引入文件系统

📅 发布时间:2026/7/16 17:15:04 👁️ 浏览次数:
【Linux系统】理解硬件 | 引入文件系统
1. 理解硬件1.1 磁盘、服务器、机柜、机房1.磁盘机械磁盘是计算机中唯一的机械设备机械磁盘是计算机系统中唯一的机械设备因为它包含盘片、磁头等物理运动部件而其他组件如CPU或内存是纯电子设备。这使其在计算机中独特但也导致其速度较慢。是外设磁盘被归类为外部存储设备外设因为它位于计算机主系统之外负责永久性数据存储与内存等内部组件不同。作为外设它通过接口如SATA与主机连接。慢机械磁盘的读写速度较慢主要原因是其机械结构盘片需要旋转由马达驱动磁头需要物理移动来定位数据。这导致延迟较高毫秒级远低于固态硬盘或内存的速度。企业虽常用其存储数据但其性能是瓶颈之一。容量大价格便宜机械磁盘的存储容量大常见从数百GB到数TB且单位存储成本低适合存储大量数据如企业备份或冷数据。价格优势源于成熟技术和磁性材料的使用而固态硬盘虽快但成本更高。2.服务器服务器是高性能计算机用于运行应用和服务如网站或数据库。它们通常安装在机柜中并放置在机房内。服务器运行时产生大量热量需要高效散热如风扇或空调且依赖稳定电力供应以避免中断。服务器“运行起来就不会轻易关闭”因此机房需确保散热和电力稳定。服务器机架和机柜行业涉及这些设备的部署和管理。3.机柜机柜或机架是用于集中存放和保护服务器、网络设备等的物理框架。它提供结构支撑、散热管理和电缆整理功能。机柜的设计影响设备密度和散热效率是企业数据中心的基础设施。机柜行业专注于优化这些设备以支持高密度服务器部署。4.机房机房是专门设计用于放置服务器、机柜等设备的房间。关键考虑因素包括散热效果服务器运行时发热量大必须通过空调、通风系统等散热管理防止设备过热损坏或性能下降。电力供应需要稳定且冗余的电力如UPS或发电机避免停电导致数据丢失或服务中断。机房建设成本高但对企业至关重要尤其用于数据中心。题外话关于机房如上所述机房的核心需求是散热和电力。详细解释了原因服务器热量积累可能导致硬件故障而电力中断会引发服务不可用。因此机房位置需优先考虑这些因素以确保设备可靠运行。关于磁盘和磁铁磁盘使用磁性材料存储数据类似于磁铁原理。说明磁盘“用磁来存储”盘片上的磁性颗粒通过磁头电磁铁改变极性N/S极来记录0/1二进制数据。删除数据时磁性状态未立即改变因此数据可恢复。磁盘“由亿个小磁铁构成”磁头通过改变NS极与计算机交互。磁头“充放电改变盘面南北极”写入数据但磁头与盘面不直接接触以防刮伤。磁盘在某些语境中被称为“磁盘”因其磁性存储本质。总结机械磁盘是计算机唯一的机械设备和外设以容量大、价格便宜为优势但速度慢。服务器是核心计算设备依赖机柜和机房环境。机柜提供物理支撑和散热机房确保稳定运行环境散热和电力。磁盘的磁性存储原理类似磁铁利用极性变化记录数据。1.2 磁盘物理结构盘片Platter由铝制或玻璃基板覆盖磁性材料制成如铁磁性涂层用于存储数据 。多个盘片叠放组成磁盘组围绕主轴高速旋转典型转速为5400/7200/15000 RPM 。磁头Read/Write Head每个盘面对应一个磁头采用“读写合一”的电磁感应设计写入磁头传统感应式通过电流改变磁性颗粒极性N/S极 。读取磁头现代磁盘多使用MR磁阻磁头灵敏度更高 。磁头悬浮于盘面纳米级高度不直接接触通过传动臂移动定位 。传动系统Actuator Assembly传动臂承载磁头沿盘片半径方向移动定位目标磁道 。电动机驱动主轴旋转盘片保持恒定转速 。1.3 磁盘的存储结构磁道Track盘片表面的同心圆环数据沿磁道存储 。相邻磁道间保留间隙避免磁性干扰 。扇区Sector磁道被等分的弧段是最小读写单元传统大小为512B现代磁盘支持4KB 。每个扇区含数据区存储数据和间隙区标识扇区边界 。柱面Cylinder所有盘面上相同半径的磁道组成的圆柱体如0号磁道在所有盘面构成0号柱面 。数据读写优化同一柱面的数据无需移动传动臂即可通过切换磁头访问减少寻道时间 。1.4 磁盘的工作机制数据读写流程寻道Seeking传动臂移动磁头至目标磁道耗时3~15ms 。旋转延迟Rotation盘片旋转至目标扇区下方耗时2~4ms 。数据传输磁头读取/写入数据速度极快可忽略 。数据存储顺序柱面优先先写满同一柱面的所有磁道切换磁头再移动至下一柱面移动传动臂 。扇区顺序同一磁道按扇区编号顺序写入 。性能瓶颈机械延迟寻道与旋转延迟占访问时间90%以上合计5~15ms远低于内存/CPU的纳秒级速度 。优化策略批量读写连续扇区减少寻道次数 。磁盘调度算法如电梯算法优化磁头移动路径 。如何定位一个扇区呢一、扇区定位的核心原理CHS寻址CHS寻址Cylinder-Head-Sector是一种通过物理坐标定位磁盘扇区的方法其核心步骤如下定位磁头Head选择具体盘面。每个盘面对应一个磁头双面盘片有2个磁头磁头号从0开始编号如0号磁头对应上盘面。定位柱面Cylinder确定磁道位置。所有盘面上相同半径的磁道构成一个柱面编号从外圈向内递增最外圈为0号柱面。传动臂上的磁头共进退因此同一时刻所有磁头位于同一柱面。定位扇区Sector在磁道上精确定位。每个磁道被划分为多个扇区通常512字节扇区编号从1开始非0。示例CHS地址(0,0,1)表示0号柱面最外圈磁道0号磁头第一个盘面1号扇区该磁道起始扇区二、CHS寻址的物理基础与数据结构1.磁盘物理结构关联性组件作用与CHS的关联磁头Head读写数据每盘面一个直接对应H参数选择盘面柱面Cylinder所有盘面同半径磁道的集合对应C参数定位磁道半径位置扇区Sector最小存储单元512字节对应S参数确定磁道内具体位置2.寻址过程的技术细节物理寻址流程传动臂移动至目标柱面半径位置耗时3~15ms。激活目标磁头等待盘片旋转至目标扇区下方旋转延迟2~4ms。读写数据纳秒级。地址表示规则柱面号C、磁头号H、扇区号S构成三元组早期系统用24位二进制存储CHS10位柱面号最大1024柱面8位磁头号最大256磁头6位扇区号最大63扇区/磁道。三、多扇区定位与文件存储的实现1.文件数据的物理存储逻辑文件属性与内容均以二进制形式存储占用一个或多个连续/离散扇区。多扇区定位能力CHS可定位任意单个扇区通过组合多个CHS地址即可读写跨扇区文件。示例读取占用10个扇区的文件时操作系统按顺序访问10组CHS地址。2.磁盘容量的计算与限制容量公式代码语言javascriptAI代码解释容量 磁头数 × 柱面数 × 每磁道扇区数 × 512字节举例256磁头 × 1024柱面 × 63扇区 × 512B ≈8.4GB按1MB1,000,000B计。CHS的容量瓶颈24位地址空间上限仅支持8.4GB柱面数≤1024磁头数≤256扇区数≤63。根源寄存器位数限制1086无法表示更大地址。以上CHS寻址前提是每个磁道上有同样数量的扇区 早期硬盘上也的确遵循这个。不过随着硬盘容量增加盘面的数据密度也随之增加单位面积中理论能容纳的二进制位数量有限。 理论 上如果保持相同密度的话盘片外圈能比内圈容纳更多数据。因此硬盘厂商们开始在盘面上将磁道划分出 区块zone外圈区块中的磁道可以比内圈区块中的磁道多放入一些扇区。这种方式生产出的硬盘叫 区位记录硬盘Zone bit recoding, ZBR1.5 磁盘的逻辑结构为解决CHS的容量限制现代磁盘采用LBALogical Block Addressing原理将整个磁盘抽象为线性扇区数组扇区从0开始连续编号。操作系统直接使用LBA号磁盘控制器自动转换为物理CHS地址柱面是一个逻辑上的概念它由每个盘面上相同半径的磁道组合而成。虽然磁盘物理上由多个盘面组成但从逻辑角度来看整个磁盘可以被视为由这些柱面卷绕而成。实际上磁盘的工作原理是这样的磁道结构将盘面上的单个磁道展开来看即一维数组柱面整个磁盘所有盘面的同一个磁道即柱面展开每个柱面的磁道包含相同数量的扇区这不就是二维数组吗整盘整个磁盘本质上是由多张二维扇区表组成的可以理解为三维数组结构。要定位一个扇区需要三步首先确定柱面位置Cylinder然后在选定柱面上确定磁道位置即磁头位置Head最后确定具体扇区Sector——这就是CHS寻址方式的由来。正如我们学习C/C数组时所了解的从程序的角度来看所有数组本质上都是一维结构。每个扇区都有一个对应的编号称为LBALogical Block Address地址实际上就是线性地址。那么这个LBA地址是如何计算出来的呢现代操作系统只需使用LBA逻辑块地址即可完成磁盘访问磁盘固件包括硬件电路和伺服系统会自动处理LBA与CHS柱面-磁头-扇区地址之间的双向转换无需操作系统介入。1.6 CHS LBA地址一、CHS 与 LBA 寻址的本质差异特性CHS柱面-磁头-扇区LBA逻辑块地址定位方式三维物理坐标柱面号、磁头号、扇区号一维线性地址连续编号的扇区索引抽象层级直接对应磁盘物理结构屏蔽物理细节提供逻辑扇区视图起始编号扇区号从 1 开始柱面/磁头从 0 开始所有地址从 0 开始连续编号容量限制最大 8.4GB24位地址限制支持 TB 级及以上如 48位LBA使用场景早期 BIOS/MBR 引导、磁盘控制器内部转换现代操作系统、文件系统、UEFI 固件核心矛盾 CHS 依赖磁盘物理参数磁头数、柱面数、每磁道扇区数而不同磁盘参数差异巨大导致操作系统需适配无数硬件型号。LBA 通过逻辑抽象解决此问题使上层软件仅关注线性扇区数组CHS与LBA转换公式CHS转LBA单个柱面扇区数 磁头数 × 每磁道扇区数LBA 柱面号(C) × 单个柱面扇区数 磁头号(H) × 每磁道扇区数 扇区号(S) - 1注扇区号从1开始计数而LBA地址从0开始编号柱面和磁道编号均从0开始示例Western Digital 硬盘参数磁盘总磁头数每柱面磁头数16, 每磁道扇区数63 CHS(2, 3, 4)→ LBA (2×16×63) (3×63) (4-1)2016 189 32208LBA转CHS柱面号(C) LBA ÷ 单个柱面扇区数取整磁头号(H) (LBA % 单个柱面扇区数) ÷ 每磁道扇区数取整扇区号(S) (LBA % 每磁道扇区数) 1示例参数同上LBA2208C 2208 // (16×63) 2208 // 1008 2余数R1 2208 % 1008 192H 192 // 63 3S (192 % 63) 1 3 1 4→ CHS(2, 3, 4)注意磁盘内部自动维护总柱面数、磁道数和扇区总数等参数系统启动时会获取这些信息。层 级角色使用地址说明硬件层磁盘控制器CHS/LBA自动转换 LBA → 物理CHS对上层透明固件层UEFI/GPTLBA分区表直接记录起始/终止 LBA操作系统层文件系统ext4/NTFSLBA通过块设备接口读写逻辑扇区应用层数据库/虚拟机LBA直接调用 read/write 系统调用最终结论CHS 是磁盘物理结构的直接映射LBA 是面向逻辑的抽象层。转换公式的数学本质是三维坐标与一维线性空间的映射受限于磁盘参数。现代系统中磁盘 扇区的一维数组LBA 是数组下标CHS 仅存在于控制器内部转换层。操作系统通过 磁盘总磁头数每柱面磁头数、每磁道扇区数 等参数初始化磁盘驱动后续完全使用 LBA 操作设备 。2. 引入文件系统2.1 引入块概念其实硬盘是典型的块设备操作系统读取硬盘数据的时候并不是直接以扇区为单位进行读取的。这是因为现代硬盘的扇区大小通常为512字节较新的硬盘可能使用4KB扇区如果以单个扇区为单位进行读取会导致大量的I/O操作严重影响系统性能。为了提高效率操作系统会一次性连续读取多个扇区即读取一个块block。在大多数现代文件系统中块大小的典型值为4KB即8个512字节的扇区块是文件系统进行I/O操作的最小单位块大小在格式化时确定之后不可更改从磁盘寻址的角度来看磁盘可以视为一个三维数组柱面、磁头、扇区但为了简化我们可以将其抽象为一个一维数组每个扇区都有唯一的LBALogical Block Addressing地址块地址可以通过LBA计算得出已知LBA求块号块号 LBA / 8当块大小为4KB时已知块号求LBALBA 块号 * 8 nn表示块内第n个扇区2.2 引入分区概念磁盘可以被划分为多个分区partition这是对硬盘进行逻辑划分的一种方式。分区的本质是对硬盘的格式化不同分区可使用不同文件系统如NTFS、EXT4。从用户角度来看在Windows系统中分区表现为不同的驱动器如C:、D:、E:等我们常说的盘在Linux系统中分区表现为特殊的设备文件如/dev/sda1、/dev/sda2等分区的基本原理分区的最小单位是柱面由多个磁道组成的圆柱形区域每个分区通过起始柱面号和结束柱面号来定义分区信息记录在磁盘的分区表中如MBR或GPT从寻址角度来看操作系统通过分区表如MBR记录各分区的起止柱面进而映射到LBA地址。由于柱面大小固定且每个柱面包含的扇区数相同只要知道分区的起始柱面号结束柱面号每个柱面包含的扇区数就可以计算出分区的大小分区内任意位置的LBA地址这种分区方式使得磁盘空间管理更加灵活不同的分区可以使用不同的文件系统也可以用于不同的用途如系统分区、数据分区等。2.3 引入inode概念在Linux系统中文件由两部分组成文件数据内容和文件属性元数据。当我们使用ls -l命令时就能看到这些文件属性信息。让我们通过一个更详细的例子来理解代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~$ ls -l total 16 -rw-rw-r-- 1 ltx ltx 71 Jul 8 16:45 code.c drwxrwxr-x 2 ltx ltx 4096 Jul 20 12:31 Linux_network drwxrwxr-x 10 ltx ltx 4096 Jul 23 23:07 Linux_system drwxr-xr-x 3 root root 4096 Jul 7 14:21 mydir这个输出实际上展示了7个关键属性文件类型和权限模式如-rw-rw-r--表示普通文件所有者可读写组用户可读写其他用户只读硬链接数表示有多少个文件名指向这个inode文件所有者通常是创建该文件的用户所属组决定哪些用户可以访问该文件文件大小以字节为单位最后修改时间文件内容最后一次被修改的时间文件名用户可见的文件标识符ls -l读取存储在磁盘上的文件信息然后显示出来更详细的信息可以通过stat命令查看它展示了文件系统中更底层的元数据代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~$ stat code.c File: code.c Size: 71 Blocks: 8 IO Block: 4096 regular file Device: fc01h/64513d Inode: 142886 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ ltx) Gid: ( 1000/ ltx) Access: 2025-07-16 19:13:03.446155686 0800 Modify: 2025-07-08 16:45:26.024247415 0800 Change: 2025-07-08 16:45:26.028247456 0800 Birth: 2025-07-08 16:45:26.024247415 0800这里引出了inode的核心概念在文件系统中文件数据存储在块中而元信息包括上述所有属性则存储在称为inode索引节点的数据结构中。每个文件都有一个对应的inode其中包含以下关键信息文件类型和权限(i_mode)所有者ID和组ID(i_uid, i_gid)文件大小(i_size)时间戳访问/创建/修改时间链接计数(i_links_count)文件数据块的位置(i_block[])其他文件系统相关信息可以通过ls -i命令查看文件的inode编号代码语言javascriptAI代码解释ltxhcss-ecs-d90d:~$ ls -li total 16 142886 -rw-rw-r-- 1 ltx ltx 71 Jul 8 16:45 code.c 148723 drwxrwxr-x 2 ltx ltx 4096 Jul 20 12:31 Linux_network 148728 drwxrwxr-x 10 ltx ltx 4096 Jul 23 23:07 Linux_system 150851 drwxr-xr-x 3 root root 4096 Jul 7 14:21 mydir每一个文件都有对应的inode里面包含了与该文件有关的一些信息。为了能解释清楚inode我们需要深入了解一下文件系统。inode在文件系统中的组织形式可以用以下结构体表示以ext2文件系统为例代码语言javascriptAI代码解释/* * Structure of an inode on the disk */ struct ext2_inode { __le16 i_mode; /* File mode */ __le16 i_uid; /* Low 16 bits of Owner Uid */ __le32 i_size; /* Size in bytes */ __le32 i_atime; /* Access time */ __le32 i_ctime; /* Creation time */ __le32 i_mtime; /* Modification time */ __le32 i_dtime; /* Deletion Time */ __le16 i_gid; /* Low 16 bits of Group Id */ __le16 i_links_count; /* Links count */ __le32 i_blocks; /* Blocks count */ __le32 i_flags; /* File flags */ union { struct { __le32 l_i_reserved1; } linux1; struct { __le32 h_i_translator; } hurd1; struct { __le32 m_i_reserved1; } masix1; } osd1; /* OS dependent 1 */ __le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ __le32 i_generation; /* File version (for NFS) */ __le32 i_file_acl; /* File ACL */ __le32 i_dir_acl; /* Directory ACL */ __le32 i_faddr; /* Fragment address */ union { struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ __u16 i_pad1; __le16 l_i_uid_high; /* these 2 fields */ __le16 l_i_gid_high; /* were reserved2[0] */ __u32 l_i_reserved2; } linux2; struct { __u8 h_i_frag; /* Fragment number */ __u8 h_i_fsize; /* Fragment size */ __le16 h_i_mode_high; __le16 h_i_uid_high; __le16 h_i_gid_high; __le32 h_i_author; } hurd2; struct { __u8 m_i_frag; /* Fragment number */ __u8 m_i_fsize; /* Fragment size */ __u16 m_pad1; __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ }; /* * Constants relative to the data blocks */ #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK 1)核心字段字段含义示例stat命令输出i_mode文件类型和权限如-rw-r--r--Access: (0664/-rw-rw-r--)i_uid/i_gid所有者和所属组IDUid: (1000/ltx)i_size文件大小字节Size: 71i_atime最后访问时间Access: 2025-07-16 19:13:03i_mtime最后修改时间Modify: 2025-07-08 16:45:26i_ctime属性最后变更时间Change: 2025-07-08 16:45:26i_links_count硬链接数量Links: 1i_blocks占用的磁盘块数Blocks: 8i_block[]文件数据块的指针数组-i_generation文件版本用于NFS-关于inode需要特别注意的几点文件名并不存储在inode中。文件名和inode编号的映射关系保存在目录文件中。inode大小通常是固定值128或256字节与文件内容大小无关。每个inode都有一个唯一的编号通过这个编号可以快速定位文件的元信息和数据块位置。inode中存储了指向文件数据块的指针包括12个直接指针、1个一级间接指针、1个二级间接指针和1个三级间接指针EXT2_N_BLOCKS15。文件系统通过inode实现了高效的文件管理通过inode编号可以快速定位文件属性和数据块位置硬链接机制允许多个文件名指向同一个inode权限管理基于inode中的用户/组ID和权限位文件访问时间等信息都记录在inode中理解inode是理解Linux文件系统工作原理的关键它解决了文件属性存储、快速访问和数据块定位等核心问题。