☰
Linux硬盘分区详解:从MBR与GPT到fdisk和parted实战
2026/10/2 9:00:59 网站建设 项目流程

刚接触Linux的时候,最容易劝退新手的其实不是各种命令,而是“硬盘分区”这四个字。你装个系统,界面上冒出来一个“手动分区”,瞬间就不知道该点哪里;你买了块新硬盘想挂载到服务器上,却连lsblk输出里的/dev/sda1都看不懂。但说穿了,Linux的硬盘分区管理并没有那么玄乎,它无非就是“看清磁盘、规划布局、创建分区、格式化、挂载”这一条链路。这篇文章我会从底层概念讲到实际操作,把MBR和GPT的区别、fdisk和parted的用法、分区规划的思路以及我踩过的那些坑,一次性说清楚。

适合阅读这篇内容的人有几类:刚入门想搞懂Linux磁盘逻辑的新手、需要在服务器上加盘或重装系统的运维同学,以及那些被“分区表损坏”或“设备忙”困扰过的人。我会尽量用大白话和实际命令来讲,保证你看完以后能直接在自己的机器上动手操作。

1. 硬盘分区的基础概念与准备工作

1.1 理解分区表:MBR与GPT的选择

分区这事儿,本质上是给硬盘写一张“目录”。你要把一块硬盘分成几段,每段叫什么、从哪里开始到哪里结束,这些信息都存在硬盘最开头的某个区域里,这个区域就叫分区表。

现在主流的分区表格式只有两种:MBR和GPT。

MBR是老前辈,1983年就出现了。它用64字节来记录分区信息,每个分区表项占16字节,所以最多只能记录4个主分区。想分更多区,就得把其中一个主分区改成“扩展分区”,再在扩展分区里面创建逻辑分区。MBR对容量的支持上限是2TB,超过2TB的硬盘,它就不认识了。现在的新硬盘动辄4TB、8TB,MBR真心跟不上时代。

GPT是后来者,属于UEFI时代的标准。它没有所谓的主分区数量限制(实际上最多支持128个分区),单个分区容量上限更是大到了ZB级别,你完全不需要担心容量瓶颈。另外GPT还在硬盘末尾保存了一份分区表的备份,万一开头的分区表损坏了,系统还能自动从备份恢复,比MBR顽强得多。

所以我的建议很简单:如果你的机器主板支持UEFI启动(2012年以后的基本都支持),请一律用GPT。只有一种情况必须用MBR——你要在非常老的BIOS机器上装传统的Windows/Linux双系统,或者你的硬盘大小还不到2TB且没有任何扩展需求。否则,无脑选GPT就对了。

到了实际操作环节,MBR和GPT分别对应fdisk和parted这两个工具。fdisk是老牌工具,交互式操作,适合新手,但它默认只能处理MBR;parted则同时支持两者,更灵活一些。后面我会演示两种工具的具体用法。

1.2 查看当前磁盘信息:lsblk、fdisk、parted等工具

不管你要对哪块硬盘动手,第一步永远是“先看清家底”。Linux下面查看磁盘信息有几个高频工具,我逐个说一下。

lsblk是我的首选,因为它的输出明明白白,展示的是块设备的树形结构。比如你执行:

lsblk

你会看到类似下面的输出:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 500M 0 part /boot/efi ├─sda2 8:2 0 16G 0 part [SWAP] └─sda3 8:3 0 449.3G 0 part /

这表示有一块叫sda的硬盘(465.8G),下面分了3个区。看到├─和└─就知道它们是sda的孩子。RM为0表示不是可移动设备,TYPE为disk表示整盘,part表示分区。这个命令输出简洁、层级清楚,我几乎每天都要用。

fdisk -l是另一个常用命令,它会把每块磁盘的详细分区表信息打出来,包括每个分区的起止扇区、大小、类型等等。比如:

sudo fdisk -l /dev/sda

它显示的“磁盘标识符”“设备起止扇区”等信息,在硬盘故障排查时很有用。不过对于新手来说,信息量偏大,容易看晕。

parted适合查看分区表的类型。直接执行:

sudo parted -l

它会列出所有磁盘,并且明确告诉你每块盘用的是msdos(MBR)还是gpt分区表。这个信息用lsblk和fdisk都不太好直接看出来,所以当我想确认某块盘是GPT还是MBR的时候,就用它。

还有blkid也很关键,它能显示每个分区的文件系统类型和UUID。UUID是分区在系统中的唯一标识,后面写/etc/fstab自动挂载时会用到:

sudo blkid /dev/sda1

最后是df -h,它看的是“已经挂载”的分区使用情况,不关心未挂载的盘。

这四个工具配合起来,你对机器的存储状况就能做到心里有数。请注意,任何时候都不要在一张有数据且正在使用的硬盘上做破坏性实验。下面所有的实操,我都建议在虚拟机或者全新硬盘上进行。

2. 分区方案设计:怎么分才合理

2.1 常见分区布局:/boot、/、/home、swap等

很多人装Linux时不知道该怎么分区,其实就是没想明白各个目录到底是干嘛的。先说说最常见的分区布局,再解释每个部分的作用。

一个典型的个人桌面分区方案如下:

  • /boot/efi(EFI系统分区):500M左右,GPT+UEFI启动必须要有,存放引导程序文件。
  • /boot:1G左右,存放内核和initramfs。有的发行版把内核放EFI分区就行,所以/boot不是必须的。
  • /(根分区):至少20G,但实际上建议50G往上,因为日常软件都装在/下面。
  • /home:用户数据都放这里,比如文档、下载、桌面文件。独立分区的好处是重装系统时/home可以保留。
  • swap(交换分区):内存不够用的时候,系统会把一部分数据临时换到swap里。大小看内存,如果内存16G以下,建议分和内存一样大;16G以上,可以分8G~16G,或者干脆用swapfile而不是单独分区。

如果是服务器场景,还可能有:

  • /var:日志、邮件、队列数据的位置。高写入的服务器把/var单独分区,可以有效防止日志涨爆根分区。
  • /data或/opt:自己放业务数据的地方。很多公司会把应用和数据都挂到独立的大数据盘上,不跟系统盘混在一起。

每个分区对应一个挂载点,你可以把挂载点理解成“门牌号”。比如把一块盘的分区挂到/home,那么你访问/home时,看到的就是这块分区里的内容。如果根分区满了,但你把/home单独分了区,那/home里的文件不会受影响,这正是独立分区的核心价值所在。

2.2 根据用途确定分区大小:服务器与桌面场景

分区大小没有标准答案,但可以根据场景套用一些经验值。

先看桌面环境。我现在比较推荐这样的说法:如果你没有特殊需求,直接把整块硬盘分一个根分区,然后在根分区下面用swapfile(交换文件)代替swap分区,配合系统自动挂载。为什么这么做?因为现在文件系统支持在线扩容,LVM也能随时加卷,提前把空间切成小块反而容易遇到“根分区满了,/home空着一大片”的尴尬。

如果你确定要手动分多区,另一种稳妥的方案是:

  • /boot/efi:512M
  • /boot:1G
  • swap:和内存一样大或略小
  • /:80G~100G
  • /home:剩下的全部空间

理由如下:/boot和/boot/efi真不需要大,内核文件每个几十M,几个版本加起来也就几百M,给大了纯属浪费。swap给到内存大小就够日常应急,真需要大量swap的服务器,那叫内存规划失误,不该靠swap救场。根分区给80G,装开发工具、Docker镜像、系统缓存都够用,万一以后不够还可以用LVM在线扩容。用户文件通常是最占空间的,所以/home拿剩余容量。

再看服务器场景。服务器讲究“功能分离”。如果你跑一个高访问量的Nginx或MySQL,我会建议把系统盘和数据盘分开:

  • 系统盘(通常一两百G):只放操作系统、软件包、配置目录。
  • 数据盘(剩余的容量):单独分区并挂载到/data或/var/lib/mysql。
  • 日志盘(可选,比如500G):挂到/var/log,防止日志写满撑爆根分区。

数据盘和日志盘之间比例根据业务量定,我经手过的系统一般是数据7成、日志3成。如果业务日志量不大,也可以合并。

有一点容易忽略的是分区对齐。现代硬盘(尤其SSD)的物理扇区是4K,而老的分区工具在创建分区时默认扇区偏移可能不是4K的倍数,这会导致读写性能明显下降。用fdisk和parted分区时,务必确保起始扇区是2048的倍数(2048×512=1MB边界),或者直接用工具默认的align选项。fdisk在较新版本中默认已经对齐到2048扇区,parted记得用align optimal。

3. 实操:用fdisk和parted完成分区

3.1 使用fdisk进行MBR分区完整步骤

假设你的系统里有一块新硬盘/dev/sdb,大小500G,没有分区表,你想把它分成两个分区:一个200G用来当数据盘,剩下300G暂留给以后用。

先用lsblk确认设备名,避免弄混了:

lsblk # 如果输出里看不到sdb,先执行 sudo partprobe

然后进入fdisk交互界面:

sudo fdisk /dev/sdb

进入后,按n创建新分区。它会问你是主分区(primary)还是扩展分区(extended),输入p。分区号直接按回车使用默认值(1)。然后它问你First sector(起始扇区)和Last sector(结束扇区)。如果你不想精确计算扇区号,可以直接用+200G的写法表示“从默认起始位置往后200G的空间”。输入:

+200G

它会自动帮你计算出结束扇区。接着继续按n创建第二个分区,类型默认主分区(2),起始扇区直接回车,结束扇区回车表示“使用剩余全部空间”。这样两个分区就建好了。

此时输入p可以预览分区表,输入w写入并退出。注意,写入之后分区表才真正生效。如果此时系统提示“设备忙”或其他错误,说明有分区已经被挂载,需要先卸载。

创建完分区后,用partprobe让内核重新读取分区表:

sudo partprobe /dev/sdb

然后用lsblk确认新分区是否出现,比如sdb1和sdb2。

补充一个常见问题:如果你创建的分区是sdN序号乱跳(比如本来是sdb1、sdb2,结果出现了sdb3),多数是之前操作残留的分区表条目,或者你中途按了w之后又有其他程序改了分区。遇到这种情况,最保守的办法是在确认无数据的前提下,用fdisk把所有分区删掉重新来一遍。

3.2 使用parted进行GPT分区完整步骤

如果硬盘容量超过2TB,或者你想用GPT分区表,fdisk大部分发行版的版本也都支持GPT(新版fdisk可以处理GPT),但parted更明确一些。下面演示用parted把/dev/sdc(假设是一块4TB的新盘)做成GPT,并分出一个2TB的数据分区。

先把分区表设置成GPT:

sudo parted /dev/sdc mklabel gpt

注意这行命令会擦除整块盘上已有的分区表。执行前务必确认这块盘没有你还需要的数据。

接着创建分区。parted既支持交互模式,也支持非交互模式。为了减少误操作,用非交互模式直接写命令:

sudo parted /dev/sdc mkpart primary ext4 1MiB 2001GB

这条命令的意思是:创建主分区(primary),文件系统类型指定为ext4(其实这个参数只是记录在分区表里的“类型标签”,并不是真正格式化,后面还要用mkfs来格式化),起始位置是1MiB,结束位置是2001GB。从1MiB开始而不是从0开始,是为了分区对齐。

如果你想让分区占满整块盘剩余空间,可以用100%:

sudo parted /dev/sdc mkpart primary ext4 1MiB 100%

创建完成后,查看分区表:

sudo parted /dev/sdc print

你会看到类似输出:

Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdc: 4096GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 2001GB 2000GB primary

注意这里文件系统还是空的,因为我们还没格式化。

parted里还有一个常用的子命令resizepart,用于调整分区大小。比如我想把第一个分区从2001GB扩展到3000GB,可以这样做:

sudo parted /dev/sdc resizepart 1 3000GB

但扩展分区之后,文件系统的大小不会自动跟着变,你还需要用resize2fs去扩展文件系统。这一点请格外注意。

3.3 分区后格式化与挂载

分区创建好了,但它们还是“毛坯房”,不能直接使用。你需要给每个分区装上文件系统,这个过程叫格式化。常用命令是mkfs系列。

格式化成ext4:

sudo mkfs.ext4 /dev/sdb1

格式化成xfs(CentOS/RHEL系统默认推荐):

sudo mkfs.xfs /dev/sdb1

格式化成swap分区:

sudo mkswap /dev/sdb2

至于选ext4还是xfs,我个人的偏好是:如果存小文件多、需要频繁删除创建,用ext4更稳定;如果存大文件多,或者用在数据库日志这类顺序读写场景,xfs更强一些。对于普通个人使用,ext4完全够用。

格式化完成后,把分区挂载到目录:

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

然后通过df -h验证:

df -h /data

如果看到输出中出现/dev/sdb1挂载在/data下,说明挂载成功。

不过这里有一个坑:如果你只是在命令行执行了mount,重启之后这个挂载就没了。要让系统重启后自动挂载,必须把挂载信息写进/etc/fstab。最简单的做法是用blkid拿到分区的UUID,然后追加一行:

sudo blkid /dev/sdb1 # 假设输出是 UUID="a1b2c3d4-..." echo 'UUID="a1b2c3d4-..." /data ext4 defaults 0 2' | sudo tee -a /etc/fstab

注意fstab的格式:设备、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。最后两列,0表示不备份,2表示普通分区在开机时检查。根分区一般是0 1,swap分区写0 0。

写完fstab后,我强烈建议你执行一次验证:

sudo mount -a

这个命令会按照fstab重新挂载所有条目,如果fstab写错了,它会立刻报错。千万不要在没验证的情况下直接重启,否则系统可能因为找不到某个分区而卡在启动界面。

4. 分区调整与常见问题排查

4.1 在线扩容与LVM的取舍

用传统分区方式(fdisk/parted直接建分区),想扩容是一件比较麻烦的事。你还记得分区表里记录的起始扇区吧?如果你扩展分区,通常只能往“后面”扩,不能往“前面”扩。也就是说,如果分区A后面紧跟着分区B,A想扩大,得先把B挪走。这在生产环境里是很痛苦的。

所以服务器上更推荐用LVM(Logical Volume Manager,逻辑卷管理)。LVM把多个分区或整块硬盘变成“物理卷”,再汇总成“卷组”,最后在卷组里划分“逻辑卷”。逻辑卷对上层系统来说就像普通的块设备,但扩容时可以随时从卷组里分一点空间过来,不需要动分区表。

LVM的大致操作如下:把/dev/sdb做成物理卷并加入卷组vgdata,然后创建逻辑卷lvdata:

sudo pvcreate /dev/sdb sudo vgcreate vgdata /dev/sdb sudo lvcreate -L 200G -n lvdata vgdata

之后你格式化/dev/vgdata/lvdata,挂载使用就可以了。想扩容时:

sudo lvextend -L +20G /dev/vgdata/lvdata sudo resize2fs /dev/vgdata/lvdata

LVM的好处一目了然。唯一需要适应的是名字变了,设备路径变成/dev/mapper/vgdata-lvdata或者/dev/vgdata/lvdata,看着不如/dev/sdb1直观。但这个代价换来的是以后不用再为了挪分区而提心吊胆,相当划算。

4.2 常见错误与解决技巧(设备忙、分区表损坏等)

分区管理踩过坑的人不少,我把高频问题整理成一个速查表,希望能帮你少走弯路。

现象可能原因解决办法
执行fdisk写入时提示“设备忙”分区被挂载或被某些服务占用执行umount /dev/sdb1卸载;用lsof或fuser -mv /dev/sdb1找出占用进程并停掉
partprobe后看不到新分区内核没重新读取分区表试sudo partprobe、sudo udevadm settle,或重启系统
挂载时报错“unknown filesystem type”分区未格式化或文件系统类型不对先用blkid查看类型,忘记格式化就执行mkfs.ext4 /dev/sdb1(注意会清空数据)
开机卡在“A start job is running for /dev/sdb1”/etc/fstab里写了不存在的设备进入紧急模式后检查fstab,注释掉错误行,重新mount -a验证
resize2fs报错“No space left on device”文件系统已占满分区空间扩展分区或逻辑卷,再执行resize2fs
误删了分区,数据还没备份分区表被覆盖立即停止所有写入操作,尝试用testdisk恢复分区表;越早操作恢复概率越高

其中“设备忙”这个错误最容易让新手抓狂。我遇到过几次,明明df -h显示分区没有挂载,但umount还是报“target is busy”。这里有一个隐藏原因:某个进程的工作目录就在这个分区里,进程不退出,分区就卸载不了。排查手段是先看谁在用:

sudo lsof /dev/sdb1 sudo fuser -vm /dev/sdb1

如果确认没有重要进程,可以用fuser -km /dev/sdb1强制结束占用该分区的进程,然后再卸载。生产环境别乱用-km,小心把正在跑的服务给断了。

另一个我特别想提醒的是:分区表损坏不等于数据全没了。分区表相当于书的目录,正文内容(文件数据)还在。只要能恢复分区表,数据就能找回来。testdisk是一个强大的分区表恢复工具,它能扫描整个磁盘寻找可能的分区边界。不过这种操作风险很高,建议先给整块盘做镜像(比如用dd把盘复制到另一个文件),在镜像上练习恢复,不要直接对原盘操作。

4.3 实操心得与避坑清单

文章写到这儿,请允许我以个人经验来总结几条重要心得。

第一,动手前先备份分区表。用sfdisk可以一键导出整块盘的分区表到文件,万一搞坏了还能恢复:

sudo sfdisk -d /dev/sdb > sdb-partition-table.txt

恢复:

sudo sfdisk /dev/sdb < sdb-partition-table.txt

注意这只是备份分区表,不是备份数据。数据的备份请另外做。

第二,大容量硬盘分区务必加对齐参数。我曾在老机器上用默认fdisk分一个3TB盘,结果才发现起始扇区不是4K对齐,磁盘读写性能只有正常的一半。后来重分了一次,从1MiB开始,性能立刻正常。SSD上尤其明显,这个小细节能避免很多隐性性能问题。

第三,能不手动分区就别手动分区。很多Linux安装器支持“使用整个磁盘”并自动配置LVM。除了一些特殊需求,用这个默认选项比手动折腾省心一万倍。手动分区适合那些明确知道自己在做什么的人,不适合“先分一个试试”的心态。

第四,测试任何分区命令前,给自己留一条退路。虚拟机是最安全的练习场。你在虚拟机里把分区删了、格了、搞坏了,大不了删掉虚拟机重来。但如果你是拿着生产服务器的硬盘在练手,那后果我都不敢想。所以,本文所有操作示例都请先在虚拟机里完整跑一遍。

第五,记住“先卸载、再操作”的原则。对已挂载的分区做任何fdisk或parted操作前,务必先umount。哪怕你是想扩展分区,也要先卸载对应文件系统才能安全地修改分区表。扩展LVM逻辑卷倒是不需要卸载,这也是我鼓励大家用LVM的原因之一。

最后想说一句真心话:分区管理本身不难,难的是在“操作不可逆”的压力下保持清醒。你会习惯在每次mkfs之前反复检查盘符,也会把lsblk当作条件反射的第一个命令。这些习惯养成之后,你会发现Linux的存储体系其实非常通透。就像是整理房间:一开始总怕动错东西,等你把每个柜子都摸清楚了,后续的收纳、扩容、迁移就都顺理成章了。希望这篇内容能帮你建立起自己的“整理逻辑”,下次面对一块新硬盘时,你不再是手足无措,而是心里已经有了一张清晰的施工图。

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

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

立即咨询