Linux——ext2文件系统(一)
文件系统ext2
- 文件系统
- 理解磁盘物理结构
- 磁盘图片
- 磁盘具体物理结构
- 磁盘的逻辑结构
- 掌握CHS和LBA地址
- 一、CHS地址
- 二、LBA地址
- 三、CHS与LBA的比较
- 引入⽂件系统
- 引入块的概念
- 一、块(Block)的定义
- 二、块的作用
- 三、块与扇区的关系
- 四、块大小的选择
- 理解分区,格式化,路径解析,挂载等过程和操作
- 理解分区
- 一、分区的基本概念
- 二、分区的类型
- 三、逻辑分区与文件系统
- 四、分区工具
- 五、分区建议
- 理解inode
- 一、inode的定义与功能
- 二、inode的内容与结构
- 三、inode的作用与重要性
- 四、inode的使用与管理
- 五、inode与文件系统对象的关系
- 六,node的结构
文件系统
理解磁盘物理结构
磁盘图片
磁盘具体物理结构
磁盘的物理结构主要包括盘片、读写臂、磁头、电机等部件。
- 盘片:磁盘中的数据是存储在盘片上的。每个盘片都有两个表面(即正反两面),每个表面都能读写数据。盘片的材质通常是铝合金或玻璃,表面涂有磁性物质,用于记录二进制数据。这些磁性物质使得驱动器即使断电也能持久存储数据位。
- 读写臂:读写臂负责在不同的磁道之间移动,以便于读取或写入数据。它由一套电机和传动机构控制,能够精确地定位到指定的磁道。
- 磁头:磁头是读写数据的设备,位于读写臂的末端。它能够在盘片表面进行磁性材料的磁化和反磁化操作,从而读取或写入数据。磁头的数量通常与盘片的表面数相等,即每个盘面对应一个磁头。
- 电机:磁盘的电机主要用于控制盘片的旋转速度和读写臂的移动速度,保证磁头能够准确读写数据。
磁盘的逻辑结构
磁盘的逻辑结构主要包括扇区、磁道和柱面,这些结构有助于操作系统对磁盘上的数据进行管理和访问。
- 扇区:扇区是磁盘的最小读写单位。每个扇区的大小一般为512字节(也有部分厂商设定为4096字节),用于存储数据。扇区的编号通常由0开始递增。
- 磁道:磁道是由若干同心圆组成的环状区域,每个磁道上有固定数量的扇区。磁道的数量通常由内到外递增,形成一条条半径不同的同心圆环。这些磁道用于存储数据,并且每条磁道的宽度相等。
- 柱面:柱面是垂直于盘片的一组磁道,它们在不同的表面上具有相同的标号。具体来说,所有盘面中半径相同的磁道组成柱面。柱面的数量通常由盘片的数量决定,且一个柱面上的磁道数等于一个盘面上的磁道数。
掌握CHS和LBA地址
一、CHS地址
CHS地址由三个参数组成:柱面(Cylinder)、磁头(Head)、扇区(Sector),这三个参数共同确定了磁盘上每个扇区的位置。
- 柱面(Cylinder):柱面是由所有盘片中半径相同的磁道组成的。柱面号通常从0开始编号,表示磁盘上不同半径的同心圆环。
- 磁头(Head):磁头是读写数据的设备,位于读写臂的末端。由于每个盘片都有两个表面(即正反两面),因此每个盘面对应一个磁头。磁头号通常也从0开始编号,表示磁盘上不同的读写头。
- 扇区(Sector):扇区是磁盘的最小读写单位。每个磁道都被划分成若干个扇区,扇区号从1开始编号(也有从0开始的,但通常是从1开始更常见),表示磁盘上不同位置的扇区。
CHS地址的寻址方式是通过指定柱面号、磁头号和扇区号来定位磁盘上的数据。然而,随着硬盘容量的增加,CHS寻址方式逐渐变得效率低下,因为每个磁道的扇区数可能不相等,导致寻址过程变得复杂。
二、LBA地址
LBA地址(Logical Block Addressing,逻辑块寻址)是一种直接以扇区为单位来寻址的方式。它简化了数据访问过程,支持更大容量的硬盘和更高效的数据访问。
- 线性寻址:LBA使用线性寻址方案,将磁盘上的每个扇区都分配一个唯一的逻辑块地址。这些地址是连续的,从0开始递增。
- 简化访问:通过LBA,操作系统或磁盘控制器可以直接指定从磁盘上的特定扇区读取或写入的LBA值,而无需计算物理CHS值。这大大简化了数据访问过程。
- 支持大容量:LBA寻址方式支持更大容量的硬盘。由于它不再受磁道和磁头的限制,因此可以充分利用磁盘的存储空间。
在操作系统内部,LBA地址被用于对磁盘进行管理。操作系统将磁盘逻辑抽象成一个数组,每个元素为扇区,元素大小通常为512字节(也有部分厂商设定为4096字节)。数组的下标作为扇区的编码,即LBA地址。这样,对磁盘的管理就变成了对数组的管理,大大提高了效率。
三、CHS与LBA的比较
- 寻址方式:CHS地址通过柱面、磁头和扇区三个参数来定位数据,而LBA地址则直接以扇区为单位进行寻址。
- 效率:CHS寻址方式在硬盘容量较小时是有效的,但随着容量的增加,其效率逐渐降低。LBA地址则简化了数据访问过程,提高了效率。
- 容量支持:CHS寻址方式支持的硬盘容量有限,而LBA地址则支持更大容量的硬盘。
引入⽂件系统
引入块的概念
一、块(Block)的定义
块是操作系统与磁盘交互的最小数据单元。在Linux系统中,通常称之为“块”(block),而在Windows系统中,则称之为“簇”(cluster)。块的大小在硬盘格式化时被指定,常见的有1KB、2KB、4KB(最常用)等。
二、块的作用
数据读写的基本单位:操作系统从硬盘中读取或写入数据时,是以块为单位进行的。这意味着,无论文件的大小如何,操作系统都会将其拆分成多个块进行存储或读取。
提高磁盘I/O效率:由于磁盘读写的基本单位是扇区(一般512B或4096B),而块通常包含多个扇区,因此以块为单位进行读写可以减少磁盘I/O操作的次数,从而提高效率。
简化文件系统管理:通过引入块的概念,操作系统可以更加简化地管理磁盘上的数据。例如,文件系统可以基于块来分配和回收存储空间,而无需关心底层的扇区结构。
三、块与扇区的关系
扇区是磁盘的最小物理存储单元:每个磁盘都有多条同心圆似的磁道,磁道被分割成多个部分。每部分的弧长加上到圆心的两个半径,恰好形成一个扇形,所以叫做扇区。扇区是磁盘中最小的物理存储单位,通常情况下每个扇区的大小是512字节(部分厂商可能设定为4096字节)。
块是多个扇区的组合:由于操作系统无法对数目众多的扇区进行寻址,因此将相邻的扇区组合在一起形成一个块(或簇),然后再对块进行管理。每个块可以包括2、4、8、16、32或64个扇区等。
四、块大小的选择
块大小的选择需要考虑多个因素,包括文件系统的类型、磁盘的容量、存储效率以及访问速度等。较大的块可以提高存储效率,但可能会浪费空间(特别是当文件较小时);而较小的块则可以减少空间浪费,但可能会降低访问速度。因此,在实际应用中,需要根据具体的需求和场景来选择合适的块大小。
理解分区,格式化,路径解析,挂载等过程和操作
理解分区
一、分区的基本概念
分区是将硬盘划分为逻辑单元的过程,每个分区可以独立管理和操作。Linux系统通过分区来组织和管理磁盘空间,使得用户可以更加灵活地存储和管理数据。
二、分区的类型
Linux系统中主要有两种类型的分区:主分区和扩展分区。
主分区(Primary Partition):
主分区是硬盘上的基本分区,用于安装操作系统和存储重要数据。
一个硬盘最多可以有四个主分区,或者如果有扩展分区,则最多有三个主分区和一个扩展分区。
每个主分区都可以独立安装操作系统和存储数据。
扩展分区(Extended Partition):
扩展分区是用来容纳多个逻辑分区的容器,它本身不能直接存储数据。
一个硬盘上只能有一个扩展分区。
在扩展分区内,可以创建多个逻辑分区,逻辑分区的数量没有限制。
三、逻辑分区与文件系统
逻辑分区是在扩展分区内创建的分区,用于进一步划分硬盘空间。在创建逻辑分区后,需要选择文件系统类型进行格式化,以便存储数据。常见的文件系统类型包括ext4、xfs等,用户可以根据具体需求选择适合的文件系统。
四、分区工具
Linux系统提供了多种工具来进行分区操作,包括:
fdisk:一个命令行分区工具,可以创建、删除、修改和显示分区。fdisk适用于MBR分区表。
gdisk:用于GPT分区表,功能类似于fdisk。
parted:一个功能强大的分区工具,支持MBR和GPT分区表。parted具有图形化界面和易于使用的命令行模式,提供了分区大小调整、移动和复制的功能。
gparted:基于parted的图形化分区工具,提供了用户友好的界面,可以轻松进行分区和分区大小调整的操作。此外,gparted还支持文件系统的创建、格式化和检查。
五、分区建议
在进行Linux分区时,可以考虑以下建议:
/boot分区:通常建议大小为100MB~500MB,用于存放操作系统的引导文件和内核。这个分区对于系统的启动至关重要。
swap分区:作为虚拟内存使用,其大小通常是物理内存的1~2倍。当物理内存不足时,系统会将一部分硬盘空间作为虚拟内存使用。
根分区(/)**:存储系统核心文件和应用程序,以及用户数据(如果没有单独划分/home分区)。建议大小为15GB以上,具体大小取决于系统需求。
/home分区:可选分区,用于存储用户个人数据和配置文件。如果用户数据较多,可以考虑将此分区适当增大。
/var分区:可选分区,用于存放系统日志文件。如果系统需要经常进行日志分析,建议划分此分区以避免日志文件膨胀塞满根分区。
理解inode
在Linux中,inode(索引节点)是一个重要的文件系统概念,用于描述文件系统中的文件和目录的元数据信息。以下是Linux中inode的详细解释:
一、inode的定义与功能
inode是Linux文件系统中用于存储文件和目录元数据信息的数据结构。每个文件和目录在文件系统中都有一个唯一的inode与之关联。这个inode包含了文件的各种属性信息,如文件大小、文件类型、权限、所有者、用户组、时间戳等,但不包括文件内容本身。文件内容存储在数据块(block)中,而inode则包含了指向这些数据块的指针。
二、inode的内容与结构
inode中存储的元数据信息具体包括:
- 文件的字节数:表示文件的大小。
- 文件拥有者的User ID:表示文件的所有者。
- 文件的Group ID:表示文件所属的用户组。
- 文件的读、写、执行权限:表示文件的访问权限。
- 文件的时间戳:包括ctime(inode上一次变动的时间)、mtime(文件内容上一次变动的时间)、atime(文件上一次打开的时间)。
- 链接数:表示有多少文件名指向这个inode。
- 文件数据block的位置:inode中包含了指向存储文件实际数据的数据块的指针。
三、inode的作用与重要性
- 快速检索文件:由于inode中记录了文件的元数据信息,操作系统可以通过读取inode来获取文件的属性,而无需读取整个文件,从而提高了文件系统的性能。
- 实现硬链接:inode中的链接数属性可以用来记录有多少个文件名指向同一个inode,从而实现了硬链接的功能。硬链接允许一个文件有多个路径名,这些路径名都指向同一个inode。
- 管理文件数据块:inode中还包含了指向存储文件实际数据的数据块的指针,使得操作系统可以快速定位文件的数据块并进行读取或写入操作。
四、inode的使用与管理
- 查看inode信息:可以使用stat命令查看某个文件的inode信息,包括inode号码、文件大小、权限等。使用ls -i命令可以查看文件的inode号码。
- 检查inode使用情况:可以使用df -i命令检查文件系统内的inode使用情况,包括已用inode、可用inode和总计inode数量。
- inode耗尽问题:当文件系统中的inode数量耗尽时,即使磁盘上还有可用的存储空间,也无法再创建新的文件或目录。因此,管理员需要关注inode的使用情况,及时删除不必要的文件以释放inode。
五、inode与文件系统对象的关系
- 文件与目录:在Linux文件系统中,文件和目录都是文件系统对象,每个对象都有一个唯一的inode与之关联。
- 文件名与inode:文件名是记录在目录的block中的,而inode中不包含文件名。因此,在新增、删除或重命名文件时,实际上是在修改目录的block中的信息,而不影响inode本身。
- 硬链接与软链接:硬链接是指多个文件名指向同一个inode,而软链接(符号链接)则是指向另一个文件的路径名。硬链接通过inode实现,而软链接则是一个独立的文件,其inode中包含了目标文件的路径名。
六,node的结构
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 */
};