Linux 之从硬件硬盘到文件系统的全面过渡
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会一个个扇区地读取,这样 效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。一个”块”的大小是由格式化的时候确定的,并且不可 以更改,最常见的是4KB,即连续八个扇区组成一个”块”。但是CHS模式支持的硬盘容量有限,因为系统用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个
前提引入
文件=内容+属性,这是从单个文件的角度。但是有很多文件,我们可以在宏观上把文件分为被打开的文件(在前面基础IO讲过)和没有被打开的文件;而被打开的文件在内存中方便管理,没有被打开的文件在磁盘里。
没有打来的文件肯定是很多的,那这么多的文件在磁盘中怎么被我们找到呢?从现阶段的认知,文件是一种目录结构,目录结构是树状的,需要路径(绝对、相对),文件存到磁盘上,最基本的诉求就是:就是被找到。而研究上面这些需求,要完成以特定的结构组织管理文件和帮我们找到文件就是文件系统做的事情!!!
1. 理解硬件
磁盘-服务器-机柜-机房

磁盘物理结构
磁盘存储结构
磁道是同心圆
三片六面,六个磁头,磁头在传动臂的带动下,共进退!!!
磁盘写入的时候,是向柱面进行批量写入的!!!

扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节。磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同圆盘(platter)数:就是盘片的数量磁盘容量=磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数细节:传动臂上的磁头是共进退的(柱面(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS寻址方式。📌 CHS寻址对早期的磁盘非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就可以读到数据了。但是CHS模式支持的硬盘容量有限,因为系统用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是8.4GB)
磁盘的逻辑结构
理解过程

真实过程



CHS && LBA地址
2. 引入文件系统
引入"块概念"
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会一个个扇区地读取,这样 效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。 硬盘的每个分区是被划分为一个个的”块”。一个”块”的大小是由格式化的时候确定的,并且不可 以更改,最常见的是4KB,即连续八个扇区组成一个”块”。”块”是文件存取的最小单位。
注意:
• 磁盘就是一个三维数组,我们把它看待成为一个"一维数组",数组下标就是LBA,每个元素都是扇 区
• 每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。
• 知道LBA:块号=LBA/8 • 知道块号:LAB=块号*8+n.(n是块内第几个扇区)
引入"分区"概念

引入"inode"概念


hu@hcss-ecs-6579:~/test$ stat code.c
File: code.c
Size: 1744 Blocks: 8 IO Block: 4096 regular file
Device: fc01h/64513d Inode: 547045 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1002/ hu) Gid: ( 1002/ hu)
Access: 2025-08-13 16:25:18.011548344 +0800
Modify: 2025-08-13 16:25:18.011548344 +0800
Change: 2025-08-13 16:25:18.015548373 +0800
Birth: 2025-08-13 16:25:18.011548344 +0800
hu@hcss-ecs-6579:~/test$

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)
备注:EXT2_N_BLOCKS = 15
结束语
我们已经知道硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,读取的基本单位是”块”。“块”又是硬盘的每个分区下的结构,难道“块”是随意的在分区上排布的吗?那要怎么找到“块”呢?还有就是上面提到的存储文件属性的inode,又是如何放置的呢?⽂件系统就是为了组织管理这些的!!!下节小编将对文件系统进行讲解,欢迎大佬们评论区发表见解!!!
更多推荐
所有评论(0)