ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux磁盘分区实战:从MBR/GPT到fdisk与parted操作指南

Linux磁盘分区实战:从MBR/GPT到fdisk与parted操作指南

1. 磁盘分区到底在解决什么问题

很多人第一次接触Linux磁盘分区,是在装系统的时候。安装界面弹出一个"手动分区"的选项,旁边还有"自动分区""使用整个磁盘"之类的按钮,手一抖选了自动,系统装完了,但心里始终没底——这块盘到底被切成了几块?每块干什么用的?以后想加一块硬盘怎么办?再后来,服务器上挂载点满了,日志写不进去,服务起不来,才意识到当初分区时留下的坑有多深。

磁盘分区这件事,本质上是在一块物理磁盘上划出若干个逻辑区域,每个区域可以被独立格式化、独立挂载、独立管理。它解决的问题很朴素:让操作系统、应用程序、用户数据各占一块地盘,互不干扰。你可以把它想象成一间毛坯房,分区就是砌隔断墙——卧室、厨房、客厅分开,厨房着火不至于烧到卧室,客厅堆满东西也不影响睡觉。

在Linux语境下,分区还有一层更重要的含义:Linux把一切设备都抽象成文件。一块硬盘在系统里就是/dev/sda、/dev/nvme0n1这样的设备文件,分区则是/dev/sda1、/dev/nvme0n1p1。你要对磁盘做任何操作,本质上都是在读写这些设备文件。理解了这一点,后面所有的命令和工具都会变得顺理成章。

这篇文章面向的是需要在实际环境中管理Linux磁盘的人——可能是刚接手一台服务器的运维新手,可能是要在虚拟机上搭实验环境的开发者,也可能是想把自己电脑装成双系统的折腾党。我会从分区的基本概念讲起,把MBR和GPT的区别、fdisk和parted的用法、分区之后要做的格式化与挂载、以及扩容缩容这些容易踩坑的环节都过一遍。全程以命令行实操为主,因为服务器环境里你大概率没有图形界面可用。

需要提前说明的是,磁盘操作是有风险的动作,分区表写错、分区删错,数据可能直接没了。所以下面每个步骤我都会强调"操作前先确认设备名""重要数据先备份"这类习惯,这不是啰嗦,是血泪教训。

2. 动手之前必须搞清楚的几个底层概念

2.1 块设备、分区表与分区的关系

一块物理磁盘插到机器上,Linux内核会把它识别为一个块设备,命名规则大致是这样:老式的SATA/SCSI硬盘通常是/dev/sda、/dev/sdb,第二块就是b;NVMe固态硬盘则是/dev/nvme0n1、/dev/nvme1n1,其中n1表示该控制器下的第一块盘。分区是在块设备之上再切一层,命名上SATA盘的分区是/dev/sda1、/dev/sda2,NVMe盘因为名字里已经有数字,分区会变成/dev/nvme0n1p1、/dev/nvme0n1p2,中间多一个p来区分。

分区表是记录"这块盘被切成了几块、每块从哪个扇区到哪个扇区"的那张表。它本身也占磁盘开头的一小块空间。目前主流的两种分区表格式是MBR和GPT,这个区别非常关键,直接决定了你能分几个区、单区最大能多大。

2.2 MBR和GPT:不是随便选一个就行

MBR(Master Boot Record)是历史遗留方案,它在磁盘第一个扇区里存放分区表,最多只能记录4个主分区。如果你想要更多分区,就得把其中一个主分区做成"扩展分区",再在里面划逻辑分区。MBR还有个硬伤:它用32位记录扇区地址,配合传统的512字节扇区,单块磁盘最大只能认到约2TB。超过2TB的部分,MBR根本看不见。

GPT(GUID Partition Table)是现代方案,它是UEFI规范的一部分。GPT理论上支持的分区数量非常夸张(Windows限制128个,Linux下更多),单分区和整盘容量上限也远超当前任何实际硬盘。GPT在磁盘头部和尾部各存一份分区表,互为备份,头部损坏了还能用尾部的恢复。

对比项MBRGPT
最大分区数4主分区,或3主+1扩展理论上几乎无上限
单盘容量上限约2TB极大,实际无限制
分区表备份无头尾各一份
引导方式传统BIOSUEFI为主
适用场景老机器、小容量盘新机器、大容量盘、UEFI启动

选择逻辑很简单:新装的机器、容量超过2TB的盘、UEFI启动的系统,一律用GPT。只有面对很老的硬件或者必须兼容传统BIOS引导的场景,才考虑MBR。我个人的习惯是,只要不是被硬件逼着,全部上GPT,省心。

2.3 分区之后还有两步:格式化和挂载

很多人以为分完区就完事了,其实分区只是划了地盘,地盘上还没盖房子。格式化是在分区上建立文件系统,比如ext4、xfs、btrfs,这一步决定了数据怎么组织、怎么存取。挂载则是把这个文件系统接到目录树的某个位置,让用户能通过路径访问它。

这三步的顺序是固定的:分区 → 格式化 → 挂载。少一步,分区都用不了。而且挂载是临时的,重启就没了,要让挂载持久化,还得写进/etc/fstab。这个文件写错了,系统可能开不了机,后面会专门讲怎么安全地写。

3. 用fdisk给一块新盘分区

3.1 先确认你要操作的是哪块盘

这是整个流程里最不能省的一步。lsblk命令能以树状结构列出所有块设备和它们的分区,一眼就能看清盘和分区的关系:

lsblk

输出大概长这样:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi └─sda2 8:2 0 238G 0 part / sdb 8:16 0 931.5G 0 disk

这里sdb没有任何子项,说明它是一块还没分区的空盘。如果你不确定,还可以用fdisk -l看更详细的信息,包括分区表类型:

sudo fdisk -l /dev/sdb

输出里会明确写着Disklabel type: gpt或者dos(dos就是MBR)。确认设备名这一步,我见过太多人栽跟头——把sdb看成sda,一条命令下去把系统盘的分区表清了。所以我的习惯是,操作前先把lsblk的输出截图或者复制到记事本里,对着看。

提示:如果这块盘之前用过,里面有旧分区表,可以先清空。用wipefs -a /dev/sdb能抹掉文件系统签名,用sgdisk --zap-all /dev/sdb能清GPT和MBR。清空前务必确认盘里没有要保留的数据。

3.2 fdisk的交互式操作流程

fdisk是最经典的分区工具,几乎所有Linux发行版都自带。它支持MBR和GPT,操作是交互式的,适合手动分一两个区。启动它:

sudo fdisk /dev/sdb

进去之后是Command (m for help):提示符。常用命令有这么几个:

  • m:查看帮助,忘了命令就按它
  • p:打印当前分区表,操作前后都该看一眼
  • n:新建分区
  • d:删除分区
  • t:修改分区类型
  • w:写入并退出(真正生效)
  • q:不保存退出

新建分区的流程是这样的:按n,它会问分区号(Partition number),直接回车用默认值;然后问起始扇区(First sector),回车用默认;再问结束扇区或大小(Last sector),这里可以输入+100G表示分100G,或者+512M表示512M。分完一个,重复n继续分下一个。

假设我要把这块931.5G的盘分成一个200G的数据区和一个剩余空间的备份区:

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

分完之后按p确认一下,没问题再按w写入。注意:在你按w之前,所有操作都只在内存里,按q就能全身而退。这是fdisk给的一道保险,善用它。

3.3 分区类型和分区号的讲究

在GPT盘上,fdisk默认给的分区类型是Linux filesystem,这对大多数场景够用了。但有些特殊情况需要改类型,比如你要做LVM,分区类型应该设成Linux LVM;要做RAID,设成Linux RAID。改类型用t命令,然后选分区号,再输入类型代码。GPT下类型代码是GUID,fdisk会列出可选项,选对应的就行。

分区号本身没有强制含义,但有个约定俗成的习惯:/boot或/boot/efi放前面,根分区/紧随其后,数据分区往后排。这样做的好处是,万一以后要调整分区大小,前面的小分区不容易被后面的操作影响。另外,如果你打算用UEFI启动,必须有一个EFI系统分区(ESP),类型是EFI System,大小一般512M到1G,格式化成FAT32。

4. parted:处理大容量盘和脚本化分区的利器

4.1 什么时候该用parted而不是fdisk

fdisk虽然经典,但有两个局限:一是它对GPT的支持是后来加的,某些老版本功能不全;二是它纯交互,没法直接写进脚本批量执行。parted在这两点上都更强,它原生支持GPT,而且支持命令行参数直接操作,适合自动化。

另一个关键场景是超过2TB的盘。虽然新版fdisk也能处理GPT大盘,但parted在这方面更成熟,而且它创建分区时默认就会做4K对齐,对固态硬盘的性能和寿命都更友好。所谓4K对齐,就是让分区的起始扇区落在物理扇区的整数倍上,避免一次读写跨越两个物理块,导致性能下降和额外磨损。

4.2 用parted一条命令搞定分区

parted的操作可以交互,也可以直接带参数。先看看盘的情况:

sudo parted /dev/sdb print

如果要重新做成GPT分区表:

sudo parted /dev/sdb mklabel gpt

然后创建分区。parted里创建分区要指定文件系统类型(注意这里只是打个标记,真正格式化还得另做)、起始位置和结束位置:

sudo parted /dev/sdb mkpart primary ext4 0% 200GB sudo parted /dev/sdb mkpart primary ext4 200GB 100%

0%和100%这种百分比写法很实用,不用去算具体扇区。primary在GPT下其实没有主分区和逻辑分区的区别,写primary只是习惯,写data之类的标签也行。

4.3 对齐这件事,parted帮你做了但你要知道

前面提到4K对齐,parted默认会按1MiB对齐,也就是每个分区从1MiB的整数倍位置开始。这个1MiB不是随便定的,它同时是4K、8K、64K、512K、1M这些常见物理块大小的整数倍,能兼容绝大多数硬盘。你可以用parted /dev/sdb align-check optimal 1来检查1号分区是否对齐,输出aligned就说明没问题。

如果你用fdisk手动指定起始扇区,默认值2048扇区(512字节扇区下就是1MiB)也是对齐的,一般不用改。但如果你手贱改成了别的值,比如从63扇区开始(这是老式MBR的遗留习惯),那就可能不对齐,固态盘性能会打折。所以我的建议是,起始位置永远用默认值,别动。

5. 分区完成后:格式化与挂载的完整链路

5.1 选文件系统:ext4、xfs还是别的

格式化就是建文件系统。Linux下常见的选择有:

  • ext4:最通用,兼容性最好,工具链成熟,适合大多数场景
  • xfs:大文件和高并发性能好,是很多企业级发行版的默认,适合数据库、大容量存储
  • btrfs:支持快照、压缩、校验,功能丰富,但复杂度也高,适合愿意折腾的人
  • vfat/exfat:用于U盘、EFI分区这类需要跨平台读写的场景

选哪个没有绝对答案。我的经验是,普通服务器和桌面用ext4最省心;如果是跑数据库或者要存大量视频、镜像文件,xfs更合适;EFI分区必须用vfat(FAT32)。

格式化命令很简单,ext4用:

sudo mkfs.ext4 /dev/sdb1

xfs用:

sudo mkfs.xfs /dev/sdb2

格式化前会提示你确认,因为这会清掉分区上所有数据。如果分区之前有文件系统,mkfs会警告,需要加-F强制。这个强制参数要慎用,确认盘里真没数据再敲。

5.2 挂载:临时挂载和永久挂载

格式化完,先建个挂载点目录:

sudo mkdir -p /data

然后临时挂载:

sudo mount /dev/sdb1 /data

用df -h能看到/data已经挂上了。但重启之后这个挂载就没了,要持久化,得写/etc/fstab。fstab的每一行有六个字段:

设备 挂载点 文件系统 挂载选项 备份 检查 /dev/sdb1 /data ext4 defaults 0 2

这里有个大坑:fstab里最好用UUID而不是设备名。因为设备名可能变——你加了一块盘,原来的sdb可能变成sdc,fstab就挂错了,严重时系统起不来。查UUID用:

sudo blkid /dev/sdb1

输出里的UUID="xxxx-xxxx"就是。fstab里写成:

UUID=xxxx-xxxx /data ext4 defaults 0 2

改完fstab,别急着重启,先用sudo mount -a测试一下。这个命令会尝试挂载fstab里所有条目,如果报错,说明写错了,赶紧改,别等到重启才发现。

注意:fstab写错导致系统起不来时,可以在启动时进救援模式,把根分区挂成可写,然后编辑fstab。但这个过程比较折腾,所以改fstab前先备份一份cp /etc/fstab /etc/fstab.bak是好习惯。

5.3 挂载选项里藏着的细节

fstab的第四字段是挂载选项,defaults包含了rw,suid,dev,exec,auto,nouser,async这一组默认值。但有些场景需要调整:

  • noatime:不记录文件访问时间,能减少写入,提升性能,对固态盘尤其友好
  • nodiratime:不记录目录访问时间,配合noatime用
  • discard:固态盘上启用TRIM,但更推荐用定时任务跑fstrim而不是实时discard
  • nofail:即使设备不存在也不阻止系统启动,适合外接盘

比如一块数据盘,我会写成:

UUID=xxxx-xxxx /data ext4 defaults,noatime,nofail 0 2

nofail这个选项特别值得加,尤其是移动硬盘或者可能被拔掉的盘。没有它,设备不在时系统启动会卡住甚至失败。

6. 分区扩容、缩容与那些容易翻车的地方

6.1 扩容:先扩分区,再扩文件系统

磁盘满了要扩容,这是运维日常。假设你把虚拟机的一块盘从100G扩到了200G,但分区还是原来的大小,这时候需要两步:先扩分区,再扩文件系统。

扩分区用growpart最方便:

sudo growpart /dev/sdb 1

这条命令把/dev/sdb的第1个分区扩展到占用所有剩余空间。然后扩文件系统,ext4用:

sudo resize2fs /dev/sdb1

xfs用:

sudo xfs_growfs /data

注意xfs只能扩不能缩,而且xfs_growfs的参数是挂载点不是设备名,这点和ext4不一样,容易搞混。

6.2 缩容:ext4能缩但顺序不能错

缩容比扩容危险得多。ext4缩容的顺序是:先卸载分区,检查文件系统,缩小文件系统,再缩小分区。顺序反了,数据就毁了。

sudo umount /data sudo e2fsck -f /dev/sdb1 sudo resize2fs /dev/sdb1 50G sudo parted /dev/sdb # 在parted里用resizepart把分区改小

而且缩小后的文件系统大小必须小于等于分区大小,不能反过来。xfs则根本不支持缩容,要缩只能备份数据、重建文件系统、再恢复。所以选文件系统时,如果你预见到可能需要缩容,ext4比xfs灵活。

6.3 几个真实踩过的坑

坑一:分区表改了但内核没更新。有时候你用工具分完区,lsblk却看不到新分区。这是因为内核还缓存着旧的分区表。用partprobe /dev/sdb或者partx -u /dev/sdb让内核重新读取。如果还不行,blockdev --rereadpt /dev/sdb也能强制刷新。

坑二:挂载点非空导致挂载后原文件被隐藏。如果你往一个目录里写了文件,然后把这个目录当挂载点挂上新分区,原来的文件不会消失,但会被新分区的根目录"盖住",看起来像丢了。卸载后又能看到。所以挂载点目录最好是空的,或者你清楚知道里面有啥。

坑三:LVM和普通分区的混淆。有些发行版默认用LVM,你看到的/dev/sda2可能是个物理卷,上面还有卷组和逻辑卷。这时候直接对/dev/sda2操作是错的,得用pvdisplay、vgdisplay、lvdisplay去看层次结构,扩容也要按pvresize→lvextend→resize2fs的顺序来。搞不清层次就动手,很容易把逻辑卷搞坏。

坑四:SSD的TRIM没开。固态盘长期不TRIM,写入性能会下降。检查用sudo fstrim -v /data,如果输出显示trim了多少字节,说明有效。持久化可以加个定时任务,每周跑一次fstrim -av。别用fstab里的discard选项做实时TRIM,那个在有些盘上会引入卡顿。

7. 一套可复用的分区操作检查清单

把上面这些串起来,我平时操作一块新盘,会按这个顺序走一遍,你可以直接拿去用:

  1. lsblk和fdisk -l确认设备名和分区表类型,把设备名记下来
  2. 确认盘里没有要保留的数据,有的话先备份
  3. 用parted或fdisk建分区表(新盘建议GPT)和分区
  4. partprobe刷新内核分区表
  5. mkfs.ext4或mkfs.xfs格式化
  6. blkid查UUID
  7. mkdir建挂载点,mount临时挂载测试
  8. 写入/etc/fstab,用UUID,加nofail
  9. mount -a测试fstab,df -h确认
  10. 如果是SSD,配置fstrim定时任务

这套流程看着步骤多,但熟练之后五分钟能走完。真正花时间的是第2步——确认数据安全。我见过太多人跳过这步,直接上手分区,结果把有数据的盘清了。分区工具不会问你"确定要删吗",它只认命令。所以,在敲下任何写操作命令之前,再问自己一遍:设备名对吗?数据备份了吗?

磁盘分区不是什么高深技术,但它是运维的基本功。把这套流程走熟,遇到扩容、迁移、故障恢复这些场景,心里就有底了。我个人的体会是,与其背命令,不如理解"块设备→分区表→分区→文件系统→挂载点"这条链路,命令只是这条链路上的工具,链路清楚了,用哪个工具都只是顺手的事。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进