第5章 文件系统基本管理 本章首先介绍磁盘分区和格式化的概念,以ext2文件系统为例分析文件系统的工作原理。接着以案例的形式介绍文件系统的管理——包括传统的MBR分区和GPT分区。最后简单介绍LVM的概念。 5.1 磁盘分区和格式化简介 5.1.1 磁盘分区的概念 磁盘必须经过分区,操作系统才能读取分区中的文件系统。目前在Linux系统下的磁盘分区主要有两种格式,分别是MBR分区与GPT分区。MBR分区的历史较为悠久,不足之处在于分区有2TB容量的限制,而当前的磁盘容量已经超过2TB,所以MBR分区就不适用了,GPT分区应运而生,GPT分区支持大容量分区。不过GPT分区并没有完全取代MBR分区。例如在虚拟机环境中,大部分磁盘的容量还是小于2TB的,因此MBR分区也还有存在的价值。 1. MBR磁盘分区 在MBR分区表中,第1个扇区最重要,包含以下两部分: (1)主引导记录(MBR)446字节(Byte)。 (2)分区表(Partition Table)64字节(Byte)。 注意:扇区(Sector)是磁盘中最小的物理存储单位,目前主要有512B(字节)和4KB两种格式。 由于MBR分区表中仅有64字节用于分区表,因此默认分区表只能记录4项分区信息。这4项分区信息记录主分区(Primary)与扩展分区(Extend)。主分区被格式化后可以直接存取数据,但是扩展分区不能直接写入数据,仅相当于一个容器,必须从扩展分区中分出逻辑分区(logical),对逻辑分区格式化后才能存取数据。通常使用P代表主分区,使用E代表扩展分区,L代表逻辑分区,这三者之间的关系总结如下: (1)主分区与扩展分区最多可以有4个,其中扩展分区最多只能有一个。分区的数量可用数学公式表示,即0<NP+NE≤4,且NE=0或者1。 (2)逻辑分区是在扩展分区上分出的分区。 (3)主分区和逻辑分区都可以被格式化后用作数据存取。扩展分区无法格式化。 (4)逻辑分区的数量依操作系统而不同。 2.?GPT磁盘分区 1)什么是GPT GPT是全局唯一标识磁盘分区表,其全称是GUID Partition Table,是源自EFI标准的一种全新磁盘分区表标准结构,与普通的MBR分区相比,更加灵活,更加强大。 常见的磁盘扇区有512B和4KB两种容量。为了解决兼容性问题,通常使用逻辑区块地址(Logical Block Address,LBA)来处理扇区的定义。GPT将磁盘所有区块以LBA(默认为512B)来规划,第1个LBA称为LBA0。 与MBR只使用第1个512B区块记录分区信息不同,GPT使用了多个LBA区块记录分区信息。LBA2~LBA33实际记录分区表,每个LBA记录4项数据,所以一共可以记录32×4=128项以上的分区信息。因为每个LBA为512B,所以每条记录可占用512/4=128B,因为每条记录主要记录开始和结束两个扇区的位置,因此记录的扇区位置最多可达64位(bit),若每个扇区容量是512B,则单个分区的最大容量是8ZB(1ZB=230TB)。另外,分区区域结束后就是分区表备份,分区表备份是对分区表32个扇区的完整备份。 值得一提的是,每个GPT分区都属于主分区,可以直接进行格式化。 2)GPT分区的优点 (1)分区数量无限制,但是受到Windows系统的限制,最多只允许创建128个分区。一般够用了。 (2)分区容量支持超过2TB的硬盘。GPT采用64位的整数表示扇区号,支持的容量非常大,而传统的MBR最高支持到2TB。 (3)分区表有容灾功能,如果分区表坏了,系统则将自动读取分区表备份保证正常识别分区。 3)什么时候使用GPT分区 (1)如果硬盘容量大于2TB,则无论是数据盘还是系统盘,直接选用GPT分区。 (2)若新买的计算机主板是集成UEFI BIOS,GPT分区和UEFI是一对好搭档,建议直接选用GPT分区。 5.1.2 格式化的概念 磁盘经过分区后,下一个步骤就是要对磁盘分区进行格式化。格式化是指根据用户选定的文件系统类型(如ext4或xsf),在磁盘的特定区域写入特定数据,在分区中划出一片用于文件管理的磁盘空间,也就是说,将inode和block规划好。格式化的目的就是为了写入文件系统,但是需要注意,格式化操作会导致现有分区中的所有数据被清除,因此要慎重。 格式化的命令为mkfs,在后面章节将详细介绍该命令。 5.1.3 Linux的ext2文件系统简介① ext2是Linux早期比较流行的文件系统,很多文件系统的设计源自它。只要掌握了ext2文件系统,其他文件系统大同小异。 在ext2文件系统中,需要了解以下几个概念。 (1)block:即区块,实际记录文件的内容,如果文件比较大,则会占用多个block。 (2)inode:即索引节点,记录文件的属性。一个文件占用一个inode,并记录此文件数据所在的block号码。 (3)Super Block:又叫超级区块,记录文件系统的整体信息,包括inode/block的总量、已经使用的量、剩余的量,以及文件系统的格式和一些相关信息。 1.?ext2文件系统布局 ext2文件系统的布局如图5-1所示。 图5-1?ext2文件系统示意图 1)Boot Block(引导块) 每个硬盘分区的开头1024字节,即0Byte到1023Byte是分区的启动扇区。存放由ROM BIOS自动读入的引导程序和数据,但这只对引导设备有效,而对于非引导设备,该引导块不含代码。这个块与ext2没有任何关系。如果这个块损坏,则整个文件系统也就启动不起来了。 2)Super Block(超级块) Super Block是整个文件系统的综合概要信息。超级块在每个块组的开头都有一份备 份。要读取文件系统一定要从Super Block读起。Super Block主要记录的数据如下: (1)block与inode的总量。 (2)已经使用或者还尚未使用的inode/block数量。 (3)block与inode的大小(block可以是1KB、2KB、4KB,inode可以是128B或 256B)。 (4)文件系统的挂载时间、最近一次写入数据的时间等相关信息。 (5)一个Valid Bit(有效位)。Valid Bit标记该文件系统是否已经被挂载,若Valid Bit值为0,则表示已挂载;若Valid Bit值为1,则表示没有挂载。 3)Group Descriptors(块组描述符) 整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,包括inode表从哪里开始,数据块从哪里开始,空闲的inode和数据块还有多少个等。块组描述符表在每个块组的开头也都有一份备份,这些信息是非常重要的,因此它们都有多份备份。 4)Data Block Bitmap(块位图) Data Block Bitmap是用来描述整个块组中哪些块已用及哪些块空闲的,本身占一个块,其中的每个bit代表本块组中的一个块,如果这个bit为1,则表示该块已用,如果这个bit为0,则表示该块空闲可用。假设块大小为b字节,则可以区别的块数为b×8个。 5)Inode Bitmap(inode索引节点位图) 和Data Block Bitmap类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。 6)Inode Table(inode索引节点表) Inode Table由若干个inode数据结构组成,需要占用若干个块。每个inode即对应一个文件或目录。inode的内容是对除文件名(目录名)外的所有属性的描述,包括文件类型(普通文件、目录、符号链接等)、权限、文件创建时间/修改时间/访问时间、文件所占数据块的个数及指向数据块的指针。 7)Data Block(数据块) 原则上,Data Block的大小与数量在格式化完成后就不能再修改了;如果需要修改,则必须重新进行格式化。 每个block内最多只能存放一个文件的数据。如果文件较大,则一个文件会占用多个block。如果文件的大小小于block,则该block的剩余容量也不能被其他文件使用了。这样方便管理,但也一定程度上使磁盘空间浪费了。 2.?ext2文件系统原理 对于一个文件来讲,除了它的数据保存在数据块中,其他信息都保存在自己的inode表中,但需要注意的是,inode表和数据块都不保存文件的名字,它的名字保存在目录的数据块中(当然目录也有自己的inode表)。 对于目录来讲,目录的数据块中存储的就是文件名及其这些文件名的inode地址。 其他文件系统会通过虚拟文件系统的方法,演绎出和ext2相似的做法。 1)普通文件相关操作 一般而言,当读取文件系统中的一个文件时,大致流程如下: (1)读出文件的inode编号。 (2)根据inode内的权限判定用户能否存取该文件。 (3)若用户有足够的权限,则开始读取inode内所记录的数据存放在哪些编号的block中。 (4)读出这些编号block内的数据,将这些数据按逻辑次序组合起来即为一个文件的实际内容。 新建文件的大致流程如下: (1)当需要新建一个文件时,先到metadata区块找到尚未使用的一个inode。 (2)将权限和属性相关数据写入该inode,并在metadata区块将该inode设置为已使 用,同时更新Super Block信息。 (3)到metadata区块找到尚未使用的block,将实际数据写入block,若文件内容较多,则继续在metadata区块找尚未使用的block,持续写入,直到写完数据为止。 删除文件的大致流程如下: (1)将要删除文件的inode编号与所属相关的block编号抹除取消。 (2)将metadata区块相对应的inode与block设置为尚未使用,并同步更新Super Block的数据。 2)目录相关操作 当用户创建一个目录时,文件系统会分配一个inode与对应的至少一块block给该目录,其中,inode用于记录该目录的权限与属性,并记录分配到的block的编号;block则记录在这个目录下的文件的文件名和这些文件对应的inode编号。 前面提到,读取文件数据时,最重要的一步是要先读到该文件的inode编号,而我们在实际操作时,是通过“文件名”来读写数据的,并没有直接用inode编号,因此,目录的重要意义就在于此——记录文件名与该文件名对应的inode编号。 5.2 文件系统的管理 某同学在使用虚拟机做openEuler系统实验的过程中发现硬盘容量不足,他考虑增加新硬盘,但是自己又刚接触openEuler系统,所以不知如何下手。下面为这位同学提供解决问题的思路。 (1)首先,为名为openEuler-server的openEuler虚拟机增加一块新硬盘,硬盘大小为20GB,如图5-2所示,选择【编辑虚拟机设置】或者双击【设备】列表中的任一设备打开虚拟机设置对话框。 (2)在虚拟机设置对话框中,如图5-3所示,单击【添加(A)】按钮,接着依次按照如图5-4~图5-9所示完成新硬盘的设置。 注意:若指定的虚拟磁盘大小超过硬盘上实际可用磁盘空间,则会出错,从而导致创建磁盘失败。 在图5-8中,指定磁盘文件使用默认文件名即可,然后单击【完成】按钮就完成了新硬盘的创建。磁盘创建成功后即可出现在虚拟机的主页上,如图5-9所示。 图5-3?虚拟机设置对话框 图5-4?添加硬盘 图5-5 选择硬盘类型 图5-6 创建新虚拟磁盘 图5-7 设置磁盘容量 图5-8 指定磁盘文件 图5-9 新硬盘出现在虚拟机主页 (3)重复步骤(2)中的操作,再创建一个大小为20GB的新硬盘。 (4)重启虚拟机。以上两块新硬盘将分别被系统识别为/dev/sdb和/dev/sdc。 (5)/dev/sdb?和/dev/sdc?分别使用了不同的分区方式。具体规划如下:/dev/sdb?使用 MBR分区,共划分为5个分区,容量分别为2GB、2GB、5GB、5GB、6GB;/dev/sdc使用GPT分区,共分为5个分区,容量分别为2GB、2GB、5GB、5GB、6GB。 (6)以普通用户chen身份登录系统,启动虚拟终端,切换至root用户,工作目录为root的家目录。 5.2.1 MBR分区管理 1. 创建磁盘分区 使用fdisk命令可以对磁盘进行MBR分区操作,包括增加分区、删除分区、查看分区,以及转换分区类型等。命令语法如下: fdisk [选项] [设备] fdisk命令的常用选项及含义见表5-1。 表5-1?fdisk命令的常用选项及含义 选??项 含??义 -b 显示扇区计数和大小 -l 列出指定磁盘的分区表信息 -s 显示分区大小,单位为块 -v 显示命令版本信息 fdisk命令采用传统的问答式界面,需要用户输入子命令,fdisk命令的常用子命令的功能见表5-2。 表5-2?fdisk命令的常用交互子命令 子命令 功??能 m 显示fdisk的子命令 n 创建一个新分区,通常接下来系统会询问创建新分区类型:p表示主分区;e表示扩展分区;l表示逻辑分区 d 删除磁盘分区 T 更改分区类型 v 检查校验分区表 p 打印分区表,显示磁盘分区信息 q 退出fdisk而不保存磁盘分区配置 w 保存磁盘分区配置并退出fdisk 注意:为了方便读者理解,本节对fdisk命令的使用进行分步骤讲解,但实际上这是一个连贯的fdisk命令。如果中途退出fdisk命令,则前面的操作可能无效。 使用fdisk命令为/dev/sdb创建磁盘分区。下面fdisk命令代码中的<--表示后面为用户输入,起提示作用,实际中不存在。 (1)进入fdisk界面,显示磁盘分区信息。 [root@server ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-Linux 2.36.1)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0x62b675ce 的新 DOS 磁盘标签。 命令(输入 m 获取帮助):<--m 帮助: DOS (MBR) a 开关可启动标志 b 编辑嵌套的 BSD 磁盘标签 c 开关DOS兼容性标志 常规 d 删除分区