☰
自学Linux第12天:从零掌握磁盘分区、格式化与挂载实战
2026/10/18 4:04:21 网站建设 项目流程

自学Linux到第十二天,说实话已经过了最劝退的阶段了。前两周基本是把Linux当“另一个操作系统”去适应,到了第十二天,我开始觉得自己像个“管理员”了,因为今天接触的东西,是真正决定一台Linux服务器能不能稳定跑业务的核心环节——磁盘与文件系统。这篇文章不聊太虚的概念,就讲我今天在闲置笔记本上从零做磁盘分区、格式化、挂载、以及模拟了一次“磁盘故障”排查的全过程。里面有几个坑是我自己踩的,花了不少时间才绕出来,写下来给和我一样靠自学硬啃Linux的人做个参考。


1. 为什么第十二天要死磕磁盘管理:基础命令之后的第一道分水岭

1.1 前十一天的进度回顾

之前十一天,我基本完成了这些内容:Linux目录结构、文件与目录操作(ls、cd、cp、mv、rm、find)、文本处理三件套(grep、sed、awk)、用户与权限管理(useradd、chmod、chown、su、sudo)、进程管理(ps、top、kill)、网络基础排查(ping、curl、ss、tcpdump)、以及包管理器的日常使用。看起来覆盖得挺广,但真要我独立部署一个服务,比如搭个Nginx或者装个数据库,我心里是没底的。

原因很简单:我所有的操作都停留在“使用别人已经准备好的资源”这个层面,一旦涉及给系统加一块新硬盘、重新调整分区、修复一个因为空间不足挂掉的目录,我完全不知道从哪下手。第十二天选磁盘与文件系统,就是为了补上这个短板。

磁盘管理在Linux知识体系里的位置很特殊。它不像vim那样属于“纯操作技能”,也不像网络协议那样偏理论。它更像是地基工程——你上面跑的软件再花哨,只要底层磁盘划分不合理、挂载逻辑混乱、空间用尽不预警,系统随时会以最难看的姿势挂掉。而且磁盘管理的命令(lsblk、fdisk、mkfs、mount、df)彼此串联性极强,学的时候能同时复习到设备文件、内核设备驱动、开机启动流程、文本解析等多块知识,性价比很高。

1.2 学习实验环境与重要提醒

我这次用的是一台闲置的旧笔记本,配置很低,但用来折腾Linux正合适。系统是某个主流发行版的最小化安装版,内核版本比较新,磁盘是一块120GB的SATA固态。为了做实验,我把原来的系统压缩了空间,腾出一块未分配的磁盘区域专门用来练习。正式分区之前,我先把所有重要数据备份到了另一块移动硬盘上。

这里必须多说一句:磁盘管理实验千万不能在存有重要数据的机器上直接操作,分区表和文件系统不像普通文件,误操作之后几乎没有恢复的可能性。如果你也想跟着练手,最靠谱的方式是虚拟机里挂一块单独的虚拟磁盘,或者找一台完全不用的旧电脑。我见过有人在公司的开发机上直接执行了错误的分区命令,结果整个部门共享目录消失的惨案,后续花了一整天找回滚备份,这个教训不值得再验证一遍。

另外还有一点容易被忽略:尽量选用较新版本的系统镜像。老版本系统对新硬盘、新分区表类型的支持不完善,实验中会出现一些因为工具链太旧产生的兼容性问题,这些报错信息容易把新手带偏,让你以为是自己的操作有问题。

1.3 实验目标清单

在动手之前我先列了一个本次实验的目标清单:

  • 学会用lsblk和df -h看清当前系统的磁盘结构;
  • 使用fdisk对一块空白磁盘完成分区(含主分区、扩展分区和逻辑分区的区别验证);
  • 用mkfs系列命令格式化成指定文件系统,并对比ext4与xfs的适用场景;
  • 掌握临时挂载和永久挂载(/etc/fstab)的方法与注意事项;
  • 模拟一次“分区无法挂载”的故障,完整走一遍排查链路。

这个清单基本是服务器管理员日常维护磁盘的完整闭环。走完一遍之后,我对后面学习LVM逻辑卷管理、RAID磁盘阵列、磁盘配额这些进阶内容就有了实际抓手,不会只是在概念里打转。


2. 磁盘管理的核心心法:从设备文件到分区表的完整认知链

2.1 一切从“一切皆文件”说起

Linux哲学里最核心的一句话是“一切皆文件”。磁盘这个硬件,在系统里同样以文件的形式暴露,这类文件集中在/dev目录下。SATA接口的硬盘一般命名为sda、sdb这种,NVMe固态则是nvme0n1、nvme1n1这种,字母和数字分别代表磁盘序号和分区号。比如/dev/sda1就是第一块硬盘的第一个分区。

我刚开始学的时候对着一堆设备文件名完全摸不着头脑,后来找到了一个记忆方法:设备命名就是“接口类型+物理序号+分区序号”的拼接。物理次序不是固定不变的,它还取决于主板上的接口顺序和系统识别顺序,所以在实验环境里加了第二块硬盘之后,它可能显示为sdb,但如果换一个接口位置重启,名字可能变成sdc。这也是为什么生产环境里挂载磁盘更推荐用UUID(文件系统的唯一标识符)而不是设备名,具体的后面讲fstab时细说。

查看当前系统磁盘结构,最常用的命令是lsblk,它会以树状结构输出磁盘和分区的对应关系。下面是我本次实验的原始输出:

$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 500M 0 part /boot ├─sda2 8:2 0 117.7G 0 part / └─sda3 8:3 0 1G 0 part [SWAP] sdb 8:16 0 20G 0 disk

sda是原来系统的系统盘,已经分配好了三个分区;sdb是我添加的新空白盘,此时还没有任何分区,所以下面没有子项,也没有挂载点。lsblk输出的关键信息就这么几列:设备名、主次设备号、是否可移动、容量、是否为只读、类型(disk/part)和当前挂载点。

2.2 分区表类型:MBR与GPT的现代选择

分区表的本质是磁盘的目录页,记录磁盘上有哪些分区、每个分区从哪里开始到哪里结束。目前主流的分区表有两种:MBR和GPT。MBR是上个世纪八十年代的产物,最多支持4个主分区,单分区容量上限约2TB,在现代大容量硬盘面前明显力不从心。GPT作为替代方案,支持128个分区、单个分区容量基本没有实际限制,并且自带冗余分区表头和数据校验,可靠性高很多。

新磁盘建议一律使用GPT分区表。只有极老的主板或特殊引导需求才需要MBR。本次实验使用的fdisk工具默认操作逻辑已经适配了GPT,不需要额外设置。顺带说一句,如果用的是老工具parted,创建分区表时记得显式执行mklabel gpt,否则默认可能是msdos即MBR。

2.3 文件系统:磁盘上的图书管理系统

分区完成后,磁盘还是一个“什么都没有的空白院子”,文件系统就是在这个院子里建图书管理系统的过程,我们平时说的“格式化”就是这个动作。Linux里最常用的两种文件系统是ext4和xfs,我这次特意都实践了一遍。

ext4是目前Linux发行版兼容性最广的文件系统,几乎任何发行版都能读取,特性稳定,支持在线扩容、日志恢复,当你不确定选什么的时候,ext4是最不容易出错的选择。xfs的特点是处理大文件和大容量场景下性能出色,被称为“大型文件系统”,但xfs不支持缩容——分区建大了就建大了,想缩小只能重新格式化。如果你的业务涉及海量小文件(比如消息队列的积压数据),xfs的小文件吞吐表现也要配合具体场景测试。

另外还有一个必须掌握的底层概念是inode。inode是文件系统管理文件的元数据结构,记录了文件的权限、属主、大小、时间戳以及数据块的指针。在格式化的时候,文件系统会分配固定数量的inode,这个数量决定了整个分区最多能存放多少文件。有时候磁盘明明还有大量剩余空间,却无法创建新文件,报“No space left on device”,大概率就是inode耗尽了。检查方法是用df -i查看inode使用率。


3. 动手实测:用fdisk完成分区、格式化和挂载的完整过程

3.1 开始分区前的安全检查

正式对/dev/sdb做分区之前,我做了两步确认:第一步,用lsblk再次确认识别到的设备名,防止把系统盘误当成新盘;第二步,用df -h查看当前所有已挂载的文件系统,确保没有任何生产目录挂载在目标设备上。

还有一个细节:确认新磁盘没有存放在用的数据。我这块12磁盘是从旧机器上拆下来的,里面有一些藏得很深的旧分区残留,lsblk阶段看起来是空盘,但其实只是分区表坏了,某些文件系统工具扫到残留元数据会报警。稳妥起见我执行了一次wipefs -af /dev/sdb,这个命令会擦除磁盘上的文件系统签名、分区表签名等所有魔术数字,相当于把院子推平重来。注意这是一条非常危险的操作,绝对不能对正在使用的系统盘执行。

3.2 fdisk交互式分区操作全记录

执行sudo fdisk /dev/sdb进入交互式界面。fdisk的操作方式是通过单字母命令完成,初见时有点反直觉,但记住下面这几个核心指令就够用了:n新建分区,p打印当前分区表,d删除分区,t修改分区类型,w保存退出,q不保存退出。

我按照规划创建一个GPT分区表,然后新建一个20GB的主分区。过程中的关键交互如下:

Command (m for help): n Partition number (1-128, default 1): First sector (2048-41943039, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +15G Created a new partition 1 of type 'Linux filesystem'

第一个扇区直接回车使用默认值2048,可以保证分区对齐到现代存储的最佳访问边界;容量输入+15G表示创建15GB大小的分区,fdisk会自行计算出结束扇区。接着我按同样的方式把剩余空间划成第二个分区(约5GB)。最后输入p打印分区表确认无误,再输入w保存退出。

退出后立刻用partprobe(或重启)让内核重新读取分区表,然后检查lsblk,此时应当能看到sdb1和sdb2两个分区。如果没出现,可能是这个发行版的内核没有自动刷新分区表,重跑一遍partprobe /dev/sdb基本都能解决。

3.3 格式化为ext4和xfs并分别挂载

分区只是划分区域,格式化才是真正“创造文件系统”的动作。我把第一个15GB分区格式化为ext4,第二个5GB分区格式化为xfs:

sudo mkfs.ext4 /dev/sdb1 sudo mkfs.xfs /dev/sdb2

mkfs.ext4执行时会输出一堆创建文件系统时的参数摘要,包括块大小(block size)、inode数量、块组数量等。新手可以不用急着深究每个参数,但有两点值得建立常识:块大小通常默认4096字节,适合大多数业务场景;inode数量远大于默认的文件数量需求,一般不需要手动干预。

格式化完成后,需要创建两个挂载点目录,分别是/mnt/data和/mnt/log,然后执行挂载:

sudo mkdir -p /mnt/data /mnt/log sudo mount /dev/sdb1 /mnt/data sudo mount /dev/sdb2 /mnt/log sudo df -hT

df -hT的T参数会额外显示文件系统类型,输出里新增了两行,/dev/sdb1和/dev/sdb2分别出现在对应的挂载点下,容量显示为15G和5G。到这里,我最开始验证“日常操作文件”的目标就完成了:在/mnt/data下新建任意文件后,数据其实已经落到新磁盘的ext4文件系统中了。

3.4 开机自动挂载fstab的正确姿势与致命细节

临时挂载只能管到当前开机状态,重启之后挂载关系会全部消失。要让系统每次开机自动挂载,需要修改/etc/fstab文件。fstab里每一行描述一个挂载关系,共六个字段:设备标识、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。

这里最大的坑是设备标识。很多人想当然地写/dev/sdb1这种设备路径,但设备名会随硬件识别顺序变化,重启后可能就变成别的名字,导致系统启动失败。可靠的方案是用UUID,获取方式如下:

sudo blkid /dev/sdb1 /dev/sdb2

输出结果类似UUID="8a9d..." TYPE="ext4",把这段UUID复制到fstab里。我最后写入的内容是:

UUID=8a9d... /mnt/data ext4 defaults 0 2 UUID=b7c3... /mnt/log xfs defaults 0 0

关于最后一个字段,ext4分区建议填2,表示系统启动时用fsck检查该文件系统;xfs建议填0,因为xfs的元数据一致性校验是在挂载时自动进行的,不需要启动期的fsck扫描。/根分区通常填1,其余非根分区填2或0。这个字段乱填的后果是每次开机都多等几十秒甚至更久。

改完fstab之后,有个必须执行的验证步骤:

sudo findmnt --verify --verbose

这个命令会逐行检查fstab语法和挂载点的可达性。如果输出没有报错,再执行sudo mount -a让系统立即按fstab重新挂载所有条目,确认无报错后重启验证。千万不要在没验证的情况下直接重启,一旦fstab里有错误,系统会尝试挂载失败导致进入紧急模式,对新手处理起来很麻烦。


4. 一晚上的故障排查:我在挂载过程中踩到的三个坑

4.1 第一个坑:df能看到挂载点,但写入报“Read-only file system”

这个坑出现得很有趣。我完成挂载、往/mnt/data写了个测试文件之后,一切正常。可当我再次尝试写入时,系统突然报错“Read-only file system”。用df -hT /mnt/data查看,挂载点还在,文件系统显示为ext4,也没有显示ro。

排查这一步我纠结了很久。后来用mount | grep /mnt/data看详细信息,发现挂载参数里出现了ro字样。这个现象说明文件系统被内核以只读方式挂载了,通常是文件系统检测到了某些异常,内核为了自我保护强制切换成只读模式。

再往下排查,dmesg | tail -n 50里看到有多条与/dev/sdb1相关的I/O错误,集中在“Buffer I/O error on device”。这才想起来,我这块旧笔记本的SATA接口有一个接触不良的隐患,之前就偶尔出现磁盘掉盘。检查物理连接后重新插紧数据线和电源线,重启机器再挂载一次,故障消失。

这个坑给我的经验是:遇到“只读文件系统”先不要怀疑权限设置,先查dmesg的系统日志,看底层设备有没有报I/O错误。很多时候问题不在文件系统层,而在物理链路层。

4.2 第二个坑:fstab写错一行,开机直接进入emergency mode

理论上,经过findmnt --verify验证之后不应该再出问题,但我还是踩了雷。原因是我手动修改fstab时把第二行的UUID复制错了,少了一个字符,人工根本没看出来。findmnt --verify那次验证是通过了,但实际挂载时因为UUID不匹配,分区挂载不上,重启后系统直接进入了emergency模式。

进入emergency模式后屏幕提示“Cannot open access the console, the root account is locked”之类的信息,输入root密码也没用。处理方法是用mount -o remount,rw /把根文件系统重新以读写方式挂载,然后立刻查看fstab,把错误的UUID改成正确的,再执行findmnt --verify和mount -a,最后重启。

这里推荐一个更保守的做法:在那种系统刚能进启动菜单的情况下,选择内核的高级选项,进入带网络的单用户模式。单用户模式里网络和多数服务都不启动,但根文件系统默认已经以读写方式挂载,可以直接改fstab。如果手头有系统安装U盘,也能用镜像自带的救援模式挂载根分区后修复,两条路都能走通,选哪条看哪个对你更顺手。

4.3 第三个坑:mkfs.xfs在非交互终端里报“cannot open the device”

我是在SSH会话里执行格式化命令的,结果是mkfs.xfs抛出一长串错误信息,大意是无法打开设备。排查后发现问题是这样一个细节:部分工具要求设备不能被系统其他进程占用,而我当时刚好有一个终端会话的当前工作目录位于/mnt/data,挂载点虽然还没挂上,但目录句柄残留,导致设备忙。

解决方法很简单,切换到一个与目标设备完全无关的目录(比如/root),再执行格式化就通过。在SELinux或AppArmor开启的发行版上,这条报错还有可能是设备上下文策略拦截,不过那个概率较低。如果以后执行分区/格式化时报“Device or resource busy”,第一反应就是用lsof或fuser查看哪些进程正在占用该设备或挂载点。


5. 磁盘维护的日常操作:空间监控、inode排查与性能观察

5.1 空间告急不再是猜测:df与du组合定位占用大户

磁盘不是挂上就完事了,真正考验操作习惯的是日常监控和故障前的预判。我每天都会执行一遍df -hT看整体使用率,这条命令能同时看到文件系统类型、容量、已用、可用和挂载点,一眼扫过去就能发现哪个分区接近红线。

当某个分区使用率超过80%时,就要进入排查阶段了。定位“是谁吃掉了空间”就是du的专长,常用组合是:

sudo du -h --max-depth=1 /mnt/data | sort -hr | head -20

--max-depth=1表示只统计一层目录,输出每个一级子目录占用的空间大小,然后按容量从大到小排序。这样从大到小逐层深入,通常几轮就能锁定占空间最多的文件。我这次实验中发现一个隐藏很深的情况:某个软件把日志写到了/mnt/log下但只保留了最近两周的文件,周旋文件已经积累了数GB,通过du一层层挖出来之后,配合logrotate轮转策略就解决了。

5.2 空间充足却写不进文件:inode耗尽实战

有一次我在/mnt/data下批量创建了十几万个测试小文件,随后再创建文件就报No space left on device。但df -h明明显示还有好几个GB的可用空间。这时就需要df -i看一下inode使用率:

$ df -i /mnt/data Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb1 1000000 999999 1 100% /mnt/data

看到IUse%显示100%,问题立刻明确了——不是空间不够,而是这个文件系统预分配的inode被用完了。ext4在格式化时会按容量和预期文件数量预留inode数量,小文件海量写入会把inode迅速耗尽。解决办法常规来说是重新调整格式化参数(比如增加inode占比)重新格式化分区,或者删除一些不再需要的小文件释放inode,如果分区是LVM且文件系统支持扩容,还能在线增加文件系统大小来扩充inode池。

这个经历给我的教训是:如果业务会产生海量小文件,最好在设计之初就规划合适的文件系统类型和inode比例,或者尽量使用支持动态inode分配的文件系统。亡羊补牢虽然可行,但数据迁移的成本不低。

5.3 一秒定位性能瓶颈:iostat与iotop的使用时机

磁盘性能排查比空间排查更隐蔽,因为系统卡顿的原因可能是CPU也可能是磁盘。我用的工具是iostat和iotop,前者看全局,后者看进程级明细。

iostat -x 1会每秒输出一次磁盘扩展统计,重点看%util(磁盘繁忙度)和await(平均I/O等待时间)。%util到90%以上,说明磁盘基本处于饱和状态;await如果经常超过100毫秒,大概率是机械盘寻道延迟过高,或者有大量小文件随机读写。iotop则能实时显示每个进程的磁盘读写速率,当系统突然变卡时,多数原因是某个进程正在疯狂读写磁盘,用iotop一眼就能把它抓出来。

我在实验过程中曾启动一个数据库实例,%util长期维持在85%左右,用isotop查到是垃圾回收线程频繁刷盘导致,之后通过调整数据库的批量提交参数解决了。磁盘问题的定位思路和网络、CPU其实是一样的,先用观察命令缩小范围,再去针对性地调参数。


6. 第十二天复盘:这段时间的学习法、笔记法,以及避开的坑

6.1 为什么用“最小可闭环”的方式推着学

回头看这十二天,我最大的体会不是哪个命令记牢了,而是摸索出了一套比较适合自己的自学节奏。Linux的知识点之间关联性强、层级深,如果单纯按命令表背,背一百个命令在真实问题面前还是无从下手。我现在的做法是:每个阶段定一个“最小可闭环”的目标,围绕这个目标串联相关命令。

比如第十二天这个闭环就是“新磁盘发现-分区-格式化-挂载-开机自动挂载-故障排查”。为了完成这个闭环,我需要用到lsblk、fdisk、mkfs、mount、blkid、fstab、df、du、dmesg这一整套命令,它们不是孤立的,而是被一条完整的故事线串在了一起。闭环完成之后,这些命令才真正内化成了我自己的东西,而不是背下来的知识碎片。

6.2 我如何整理命令手册:不追求大而全,只记录“判断逻辑”

现在网上各种Linux命令大全很多,但我发现原样抄下来一点用都没有,因为没有上下文的命令清单在关键时刻根本调不出来。我的笔记方式分三栏:症状、排查命令、判定逻辑。比如“磁盘可用空间满”这一条,我会记录:先用df -h确认挂载点使用率,再用du逐层定位大文件,最后考虑是否要清理日志或扩容。这样记下来的不是孤立的命令,而是面对一个具体问题时的决策路径。

另一个习惯是给容易混淆的命令做对比表。比如df和du的区别,我看过很多遍,但真正会混用。现在笔记里专门有一块写:df统计的是文件系统层面的块使用情况,du统计的是目录树的文件实际占用。前者更接近底层块设备的空间状态,后者更接近用户“我有哪些文件夹占了多大”的认知。这种区分一旦用笔记写清楚,后面排查时就不会出错。

6.3 未来十天的大致规划:LVM、RAID、配额与自动化

第十二天把磁盘的地基打完,接下来的方向我也有了初步规划。第十三到第十五天,我打算专门学LVM逻辑卷管理,把物理卷、卷组、逻辑卷、快照这些概念从头捋一遍,目标是实现“在线扩容”和“在线缩容”的完整实验。第十六天到第十七天,研究软件RAID,重点理解RAID0/1/5/10在冗余和性能上的取舍,以及mdadm的日常管理命令。第十八天到第十九天,做磁盘配额(quota)和日志轮转(logrotate)的实验,这两个功能在生产环境里几乎是标配。第二十天开始尝试编写Shell脚本,把磁盘监控、日志清理这些日常工作自动化,算是从“手动管理员”往“自动化管理员”方向迈一步。

这次的磁盘实验让我对Linux的信任感增加了很多:当你理解了设备的命名方式、分区的组织逻辑、挂载的配置文件之后,系统启动过程中那些看似神秘的环节变得透明了。哪怕以后遇到更复杂的存储架构,只要底层这块基石是坚实的,就有底气一层层往上查。下一步的实验我准备换个更硬核的主题,把LVM和RAID组合在一起,模拟一次“数据盘满了但业务不能停”的紧急扩容场景,到时候再回来分享。

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

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

立即咨询