操作系统磁盘管理实验:从裸盘分区到文件系统挂载全攻略
2026/9/18 11:15:32 网站建设 项目流程

操作系统这门课,前面几个实验做完进程调度和内存管理,到了实验五基本就是跟磁盘正面硬碰硬了。磁盘管理实验说白了就是让你在真实环境里,把一块裸盘从分区、格式化到挂载使用的完整流程走一遍,顺手把文件系统、设备管理这些课堂上的抽象概念落到实机上。我在帮学生梳理这个实验的时候发现,很多人不是不会敲命令,而是完全不清楚自己在干什么——对着错误的分区表一顿操作,把系统搞到进不去的例子,我见过不止一次。这篇文章就围绕广州大学2020操作系统实验五的磁盘管理实验来写,把这套东西掰开揉碎了讲清楚。

1. 实验在考什么:先弄懂磁盘管理实验的设计思路

1.1 磁盘管理在操作系统五大管理中的位置

操作系统课程通常把核心工作划分为五大管理:进程管理、内存管理、文件管理、设备管理和作业管理。磁盘管理这个实验,正好落在设备管理和文件管理的交界处。磁盘本身是一个典型的块设备,属于设备管理的研究对象;而在磁盘上建立文件系统、按目录结构组织文件,则是文件管理负责的事情。换句话说,这个实验是要求你亲手把“设备管理”和“文件管理”两章的知识串起来。

我见过不少同学把实验五做成纯命令记录:fdisk、mkfs、mount各敲一遍,抄在报告里就算是完成了。这种做法说实话有点浪费。真正的实验目标,是理解“操作系统如何把物理存储资源抽象成逻辑的、方便使用的文件系统”。从一块裸设备变成用户能自由读写文件的目录,中间的分区、格式化、挂载三个动作,每一步都对应着一个抽象层次。亲手走一遍流程,比背书有效得多。

1.2 实验环境选型:虚拟机是最优解

2020年这个时间点,大多数高校的操作系统实验都开始引入Linux环境。磁盘管理实验在Windows上也能做,比如用磁盘管理工具压缩卷、新建简单卷,但很多底层概念比如分区表类型、文件系统inode、挂载点,在Windows图形界面里被藏得太深,学生点完鼠标还是不知道发生了什么。

所以我更建议在Linux环境下做,并且优先选择虚拟机方案。虚拟机的优势在于:操作失误不会造成不可挽回的后果,快照一恢复就回到正常状态,可以放心大胆地反复测试;同时可以在虚拟机上挂载多块虚拟磁盘,实验场景不受限于物理机磁盘数量。发行版方面,Ubuntu或者CentOS都可以,教程和资料相对丰富,遇到问题容易查到解决方案。这篇博文以Ubuntu为例,CentOS/RHEL系列的命令差异我会在关键地方补充说明。

1.3 实验目标的拆解与考核点

从课程考核的角度看,磁盘管理实验通常覆盖四个维度:对磁盘结构概念的理解、分区操作是否熟练、文件系统创建与挂载是否正确、以及是否了解系统启动时自动挂载的机制。进阶一点的实验还会加入磁盘配额(quota)的设置,验证某个用户能使用的空间和文件数量上限。

明确考核点之后再动手,就不会出现“敲完命令不知道验证结果”的情况。比如做完分区,用lsblk确认分区是否生成;做完格式化,用blkid确认文件系统类型和UUID;做完挂载,用df -h确认挂载点是否生效。每一步都有对应的验证命令,实验报告里把验证结果截图放进去,比空口说“我成功了”有说服力得多。

2. 动手前必须啃透的底层原理:分区、文件系统与挂载

2.1 从物理扇区到块设备:磁盘的抽象过程

磁盘的内部物理结构是磁头、磁道、扇区、柱面那一套。磁头在盘片上寻道,盘片旋转,数据在扇区上读写。这套物理模型在硬盘容量很小的时候还行得通,但今天一块硬盘动辄数TB,再让操作系统直接用“柱面-磁头-扇区”去访问数据,显然不现实。

现代操作系统引入了LBA(Logical Block Address,逻辑块地址)寻址方式,把整块磁盘抽象成一个从0开始编号的逻辑扇区数组。操作系统、驱动、应用都不需要关心数据到底在盘片的哪个物理位置,只需要告诉磁盘控制器“我要读第N个逻辑扇区”,剩下的事情由磁盘内部完成。这个抽象是整个磁盘管理的地基,分区表就建立在LBA之上。

顺带提一句,磁盘在Linux里被表示为块设备文件,比如sda、sdb、nvme0n1。sda中的sd代表SCSI Disk的一种演变,后面的a表示第一块磁盘,b表示第二块。系统中的设备文件一般在/dev目录下,平时用lsblk命令能直接看到这些设备的层级关系。

2.2 MBR与GPT分区表:现代实验为什么绕不开GPT

分区表是磁盘上用来记录分区布局的元数据。经典的分区表方案是MBR(Master Boot Record,主引导记录),它位于磁盘最开始的扇区,同时包含引导代码和分区表项。MBR分区表只有64个字节存放分区信息,每个分区表项占16字节,所以最多只能记录4个主分区。要突破4个分区的限制,只能把其中一个主分区改成扩展分区,再在里面划分逻辑分区,操作起来比较绕。

GPT(GUID Partition Table)是替代MBR的新一代方案,配合UEFI引导使用。GPT的分区数量默认可以到128个,单个分区容量上限达到EB级别,还带冗余分区表,可靠性更强。在2020年的实验环境里,如果新添加的虚拟磁盘用来做数据盘,直接给它建GPT分区表是更合理的选择。

实操时有一个小细节:如果你只想简单完成实验,用MBR也完全可行,毕竟实验观察的是分区、格式化、挂载这套流程是否打通。但如果是新装的虚拟机,系统本身用的是UEFI+GPT引导,那么新磁盘也建议保持GPT分区表,保证整体风格一致。用fdisk工具默认会创建DOS(即MBR)分区表,使用gdisk或fdisk里的g选项可以创建GPT分区表。

2.3 文件系统与挂载机制:理解“接进目录树”

分完区之后,磁盘分区还是空壳,需要在其上建立文件系统才能存放文件。Linux常见文件系统类型包括ext4、xfs、btrfs等,这几种在不同发行版中的默认选择不一样。以ext4为例,它把分区划分为若干块组,每个块组里有超级块副本、inode表、数据块等结构。inode保存文件的元数据(权限、属主、大小、时间戳、数据块指针等),文件名存储在目录项中,目录项再指向对应的inode。不理解这个结构,后面遇到“磁盘显示满了但du查不到大文件”的情况就会一头雾水。

挂载(mount)是Linux中一个核心动作。Windows会把每个分区映射成一个盘符(C盘、D盘),Linux则把所有文件系统接入到根目录(/)这个树状结构里。mount的作用是把某个设备上的文件系统,关联到目录树中一个指定的目录上,这个目录一般称为挂载点。挂载之后,你访问这个目录,实际上就是在访问该设备上的文件系统。

系统启动时,内核首先挂载根文件系统,然后读取/etc/fstab文件,按照里面的配置自动挂载其余文件系统。fstab每一行有6个字段:设备标识、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。关于fstab,后面实操部分我会专门讲它为什么是最容易出问题的环节。

3. 实操全流程:从一块裸盘到配额生效

3.1 环境准备:添加一块新的虚拟磁盘

在VirtualBox或VMware中创建一个Ubuntu虚拟机之后,需要给虚拟机添加第二块虚拟磁盘,专门用来做破坏性实验。打开虚拟机的存储设置,添加一块新的SATA或SCSI磁盘,大小建议10GB左右,存放在外部文件并选择动态分配。动态分配意味着虚拟磁盘文件一开始很小,随着使用逐渐增长,对宿主机磁盘空间的占用比较友好。

进入系统后,先确认系统是否识别到新磁盘:

lsblk

输出中应该能看到sda(系统盘)和sdb(新添加的磁盘)。sdb因为没有分区、没有文件系统,lsblk显示时没有子项目,而且默认不挂载。再确认一下当前系统磁盘信息:

sudo fdisk -l

这个命令能显示磁盘的容量、扇区大小等信息。新磁盘显示没有分区表,这是正常的,接下来我们将对它进行分区。

3.2 fdisk分区实战:以GPT分区表为例

虽然fdisk在传统意义上默认操作MBR分区表,但较新版本的util-linux已经支持GPT。使用fdisk操作磁盘前,先明确目标:在这块10GB磁盘上建立一个分区,后续全部空间分配给这个分区。实际操作如下:

sudo fdisk /dev/sdb

进入fdisk交互界面后,依次输入以下指令:

g # 创建新的GPT分区表 n # 新建分区 # 分区号直接回车,使用默认1 # 起始扇区直接回车,使用默认2048 # 结束扇区直接回车,使用默认最大值 p # 打印当前分区表,确认结果 w # 写入分区表并退出

关于起始扇区为什么默认是2048,这是为了对齐到4K物理扇区边界,有助于提升磁盘性能。手工计算时,一个扇区通常是512字节,2048扇区起始刚好是1MB的整数倍,这个对齐方式在现代SSD和机械硬盘上都推荐。分区表写入后,用lsblk复查:

lsblk

此时应该能看到sdb下面出现了sdb1。如果lsblk没有立即显示新分区,可以执行sudo partprobe /dev/sdb让内核重新读取分区表,这个问题后面在踩坑部分还会展开。

3.3 mkfs格式化:创建ext4文件系统

分区已经生成,现在要在sdb1上创建文件系统。这一步是实验的分水岭,格式化之后分区上的数据就无法通过普通方式恢复了,操作前务必确认设备路径没有写错。

sudo mkfs.ext4 /dev/sdb1

mkfs.ext4支持很多参数,实验场景常用的是-b指定块大小,比如-b 4096。块大小决定了文件系统的最小分配单位,块越大,存取大文件性能越好,但小块文件会浪费更多空间。默认块大小由文件系统创建工具根据分区大小自动决定,大多数情况下直接回车即可。

格式化完成后,用blkid查看分区的元数据:

blkid

输出中会包含分区的UUID、TYPE等字段。UUID是文件系统的全局唯一标识,后面配置开机自动挂载的时候,我们更推荐用UUID而不是设备名,因为设备名可能在系统重启后发生变化,这个问题到时候也会细说。

3.4 手动挂载与开机自动挂载配置

创建挂载点并手动挂载,这一步直观地展示了“把文件系统接到目录树”的过程:

sudo mkdir -p /mnt/data sudo mount /dev/sdb1 /mnt/data

挂载之后,df -h能看到/dev/sdb1挂载在/mnt/data。尝试在这个目录下创建文件、写入数据,整个过程和操作普通目录没有任何区别。但重启之后,这个挂载关系会消失,因为mount只对当前会话生效。

要开机自动挂载,就得修改/etc/fstab。建议先备份一份:sudo cp /etc/fstab /etc/fstab.bak。然后编辑文件,在末尾添加一行:

UUID=你的UUID /mnt/data ext4 defaults 0 2

这里千万不要手抖把UUID写错,或者把挂载点写成了不存在的目录。改完之后,推荐先执行一次:

sudo mount -a

mount -a会按照fstab配置把所有条目挂载一遍。如果这条命令执行后没有报错,说明fstab基本没有大问题。如果不报错但心里还是不踏实,可以重启再验证一次。fstab的坑在后面单独开一节讲,因为它是整个实验里翻车概率最高的环节。

3.5 扩展内容:磁盘配额quota配置

磁盘配额是很多实验的加分项,它用来限制用户或组可以使用的磁盘空间和文件数量。配额的限制分为软限制和硬限制:软限制是警告阈值,超过之后系统会提示但仍然允许继续写入(只到硬限制为止);硬限制是绝对上限,一旦达到就无法再分配空间或inode。

配置配额时,需要先将配额相关的选项加到fstab中对应条目的挂载选项字段,然后重新挂载:

sudo vim /etc/fstab # 找到 /mnt/data 对应行,把 defaults 改为 defaults,usrquota,grpquota sudo mount -o remount /mnt/data

接着生成配额数据库并开启配额:

sudo quotacheck -cum /mnt/data sudo quotaon /mnt/data

quotacheck的-c表示创建配额文件,-u检查用户配额,-m表示强制以读写方式检查,避免只读挂载时无法创建配额文件。生成了aquota.user和aquota.group文件之后,用edquota给某个用户设置配额:

sudo edquota -u testuser

这个命令会打开一个文本编辑器界面,可以看到blocks(已用块数)、soft、hard、inodes几个字段。把soft限制设置为5000(单位是KB),hard限制设置为6000,保存退出。用sudo quota -vs testuser验证配额是否生效。

4. 踩坑实录:我做磁盘管理实验时遇到的典型问题与修复方案

4.1 危机现场:fstab写错导致无法开机

这是磁盘管理实验里最经典的翻车场景。fstab里写错UUID、挂载点不存在、文件系统类型写错,重启后系统就可能无法正常进入,卡在emergency mode或者直接启动失败。有个同学在做实验时把UUID抄错了,重启之后系统报错,找不到根目录逻辑卷,当时他以为是系统直接崩溃了,其实只是fstab里多了一个不存在的条目。

遇到这种情况不要慌。系统提示进入维护模式时,输入root密码进入单用户或者emergency mode,然后执行:

mount -o remount,rw / vim /etc/fstab

先把错误的行注释掉或修正,保存退出,再重启就能恢复。如果系统连维护模式都进不去,可以在引导界面按e进入内核参数编辑,在linux那一行末尾加上systemd.unit=rescue.targetsingle,进入单用户模式后做同样的修改。总之,最稳妥的做法是改fstab之前先备份,改完后用mount -a做语法级验证,能有效避免绝大多数重启翻车。

4.2 卸载设备提示target is busy

执行umount /mnt/data时,系统可能提示target is busy,意思是还有进程正在使用这个挂载点下的文件。最常见的原因是当前shell的工作目录正好在/mnt/data里,shell自身占用了这个目录。解决办法是切换目录到别的位置,比如cd ~,再执行umount。

如果确实有其他进程占用,可以用以下命令定位:

lsof /mnt/data fuser -v /mnt/data

lsof列出的PID和进程名就是元凶。强行卸载的工具是umount -l,它执行延迟卸载,立即断开文件系统与目录树的关联,等占用进程退出后再真正完成卸载。这个参数在实验环境里能救急,但在生产环境中要慎用,因为正在读写数据的进程可能因为文件系统突然消失而崩溃。

4.3 新分区没出现:分区表没有刷新

用fdisk创建完分区、按w退出之后,lsblk里看不到sdb1。这种情况在2020年的Ubuntu版本和一些CentOS环境中经常出现,原因是内核的内存中还缓存着旧的分区表信息。用partprobe让内核重新读取分区表即可:

sudo partprobe /dev/sdb

如果partprobe之后还是不行,可以用udevadm settle等待设备管理器处理完事件,或者重启虚拟机。有个小经验:在虚拟机里,如果在创建磁盘后立刻分区,偶尔会遇到设备节点还没完全就绪的情况,稍微等一下再操作一般就正常了。

4.4 磁盘空间“神秘消失”与inode耗尽

有同学发现df -h显示某个分区使用率已经100%,但du -sh把目录里的文件大小加起来,发现远没有“满”。这种情况多半是已经删除的文件仍然被进程占用,空间没有真正释放。用lsof查看被删除但仍在使用的文件:

lsof | grep deleted

把这些进程重启或者结束后,空间才会真正释放。

另一种“空间消失”的原因是inode耗尽。ext4文件系统的inode数量是格式化时固定的,如果有海量的小文件(比如几百万个1KB的日志文件),即使总容量远没到上限,inode也可能被消耗完。这时候磁盘表现为无法创建新文件,提示No space left on device,但df -h显示的剩余空间却很充足。用df -i查看inode使用率,基本能一眼定位。

4.5 配额命令失效的排查路径

配置好配额后,发现quota命令查不到任何信息,或者设置了软限制但超过之后仍然能写入,这是配额实验里最常见的两个问题。

排查路径从检查挂载选项开始。mount | grep /mnt/data确认usrquota是否真正生效。如果fstab改了但没重新挂载,配额当然不会生效,这里别忘了执行mount -o remount。接着确认配额数据库是否存在,如果/etc/mtab和quota文件对不上,quotacheck再跑一次并重启quotaon即可。

还有一个隐藏较深的问题:某些系统版本中配额内核模块没有加载,或者虚拟磁盘的队列调度与配额模块存在兼容性问题。这时可以先lsmod | grep quota看看模块是否加载,没有的话使用modprobe加载相应模块后重试。

4.6 磁盘管理常用命令速查

命令用途示例
lsblk列出块设备树lsblk
fdisk -l查看磁盘分区信息sudo fdisk -l /dev/sdb
blkid查看分区UUID和文件系统类型blkid
df -h查看文件系统空间使用情况df -h
df -i查看inode使用情况df -i /mnt/data
du -sh查看目录总大小du -sh /var/log
mount挂载文件系统sudo mount /dev/sdb1 /mnt/data
umount卸载文件系统sudo umount /mnt/data
quotacheck扫描并创建配额数据库sudo quotacheck -cum /mnt/data
quotaon开启磁盘配额sudo quotaon /mnt/data
edquota编辑用户配额sudo edquota -u testuser

5. 最后分享一点个人体会

我做这个实验的时候已经工作两年了,当时是带学生重温了一遍整个流程。最大的体会是:磁盘管理这条路,课堂上讲一百遍真不如自己分区挂载一次,尤其是fstab那个坑,几乎每个第一次做实验的人都要踩一遍。

如果你正在做这个实验,我的建议是别急着在实验报告里堆命令,先把分区表原理、文件系统结构和启动挂载流程这三块看明白,然后找一台虚拟机放手去操作。哪怕真的把系统搞挂几次也没有关系——在虚拟机里挂掉系统,比以后在服务器上挂掉系统要划算太多了。

另外有一个小技巧可以说一下:实验过程中如果遇到奇怪的问题,大多数情况下都能靠dmesg日志找到线索。比如磁盘I/O错误、文件系统损坏,内核都会往dmesg里打信息。学会看dmesg,基本就掌握了一套排查磁盘问题的通用武器。磁盘管理实验做完之后别急着卸掉虚拟机,后面再学LVM、RAID还能接着用这套环境练手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询