尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Linux fdisk 磁盘分区实战:MBR/GPT 分区表操作与避坑指南

发布时间:2026/9/24 19:23:39

资讯中心
01
ARTICLE

Linux fdisk 磁盘分区实战:MBR/GPT 分区表操作与避坑指南

Linux fdisk 磁盘分区实战:MBR/GPT 分区表操作与避坑指南
1. 为什么 fdisk 至今仍是磁盘管理的首选工具很多人第一次接触 Linux 磁盘管理脑子里冒出来的第一个词就是fdisk。这个工具年纪不小了从早期 Unix 时代一路活到现在界面朴素、交互直接没有花哨的图形化包装但偏偏就是这种老派风格让它在服务器运维场景里经久不衰。你登录一台刚装好的 CentOS 或者 Ubuntu Server手头没有任何图形界面想把一块新挂载的数据盘分区、格式化、挂载fdisk几乎是你唯一能立刻上手的工具。它的核心定位很明确管理磁盘分区表。注意是分区表不是文件系统。很多人会把分区和格式化混为一谈实际上这是两个完全独立的步骤。fdisk负责在物理磁盘上划分出逻辑区域分区而mkfs系列命令才负责在这些区域上建立文件系统。理解这个分界线是掌握磁盘管理的第一课。fdisk能做的事情包括查看现有分区表、创建新分区、删除分区、修改分区类型、调整分区起始位置、写入或放弃更改。它支持两种主流分区表格式——MBR和GPT。MBR 是传统方案最大支持 2TB 磁盘和 4 个主分区GPT 是较新的标准支持超大容量磁盘和几乎无限的分区数量。你在fdisk里用g命令创建 GPT 分区表用o命令创建 MBR 分区表切换非常方便。这篇文章适合谁看如果你刚接触 Linux 运维或者平时用虚拟机做实验需要手动分区又或者你手上有一块新硬盘要挂载到服务器上那这篇内容就是为你准备的。我会从最基础的查看磁盘信息开始一步步带你走完创建分区、删除分区、修改分区类型的完整流程同时把那些文档里不会写的坑和细节一并交代清楚。提示fdisk只能操作 2TB 以下的磁盘分区表MBR 限制。如果你的磁盘超过 2TB必须使用 GPT 分区表或者改用parted/gdisk工具。不过fdisk本身也支持 GPT所以大容量磁盘用fdisk配合 GPT 也是完全可行的。2. 动手之前搞清楚你的磁盘现状2.1 用 lsblk 快速摸清磁盘拓扑在动任何分区操作之前第一件事永远是看清楚当前系统里有哪些磁盘、哪些分区、挂载在哪里。我见过太多人上来就fdisk /dev/sda结果把系统盘的分区表给改了机器直接起不来。这种事故在测试环境里可能只是重装系统的事在生产环境里就是重大故障。最直观的命令是lsblklsblk输出大概长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 48G 0 part / sdb 8:16 0 100G 0 disk sr0 11:0 1 1024M 0 rom这个输出信息量很大。NAME列告诉你设备名SIZE是容量TYPE区分 disk整块磁盘和 part分区MOUNTPOINT显示挂载点。你可以一眼看出sda是系统盘因为它的分区挂载了/和/bootsdb是一块全新的 100G 磁盘没有任何分区这就是我们可以安全操作的目标。lsblk的好处是它以树形结构展示父子关系一目了然。相比fdisk -l那种平铺直叙的输出lsblk更适合快速判断哪块盘是空的、哪块盘不能碰。2.2 fdisk -l 看分区表的细节lsblk给你的是概览要看分区表的细节还得靠fdisk -lfdisk -l /dev/sdb如果sdb是一块全新磁盘输出会是Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes注意这里没有分区表信息说明这块盘还没有被分区。如果是一块已经有分区的磁盘你会看到类似这样的内容Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 12345678-ABCD-EF00-1234-567890ABCDEF Device Start End Sectors Size Type /dev/sda1 2048 4095 2048 1M BIOS boot /dev/sda2 4096 4198399 4194304 2G Linux filesystem /dev/sda3 4198400 104857566 100665167 48G Linux filesystem这里有几个关键信息需要关注。Disklabel type告诉你分区表类型是 gpt 还是 dosMBR。Start和End是分区的起止扇区号Sectors是分区占用的扇区数量。Type列显示分区类型Linux filesystem 是最常见的类型。注意fdisk -l不加设备名会列出所有磁盘的分区表输出可能很长。建议养成指定设备名的习惯避免看花眼。2.3 确认磁盘是否已挂载在操作分区之前必须确认目标磁盘没有被挂载。如果磁盘正在使用中你修改分区表后系统可能无法正确识别甚至导致数据损坏。用mount命令或者findmnt检查mount | grep sdb findmnt /dev/sdb如果没有任何输出说明这块盘没有被挂载可以安全操作。如果有输出你需要先卸载umount /dev/sdb1如果提示 target is busy说明有进程正在使用这个挂载点。用lsof或者fuser找到占用进程lsof /mnt/data fuser -m /mnt/data处理完占用进程后再卸载。这一步千万不能跳过我见过有人强行修改正在使用的分区表结果文件系统直接损坏数据恢复花了好几个小时。3. fdisk 交互模式下的完整操作链路3.1 进入 fdisk 交互界面确认磁盘安全后就可以进入fdisk的交互模式了fdisk /dev/sdb你会看到这样的提示Welcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x12345678. Command (m for help):注意那句 Changes will remain in memory only, until you decide to write them——这是fdisk最重要的安全机制。你所有的操作都先保存在内存里只有执行w命令才会真正写入磁盘。这意味着你随时可以用q命令退出而不保存任何更改。这个设计给了你充分的试错空间不用担心手滑。输入m可以看到所有可用命令Help: DOS (MBR) a toggle a bootable flag b edit nested BSD disklabel c toggle the dos compatibility flag Generic d delete a partition F list free unpartitioned space l list known partition types n add a new partition p print the partition table t change a partition type v verify the partition table Misc m print this menu u change display/entry units x extra functionality (experts only) Save Exit w write table to disk and exit q quit without saving changes Create a new label g create a new GPT disklabel G create a new empty GPT partition table o create a new empty DOS partition table s create a new empty Sun disklabel命令不多常用的就那么几个n新建分区、d删除分区、p打印分区表、t修改分区类型、w保存退出、q不保存退出。下面我按实际操作顺序逐一讲解。3.2 创建新分区n 命令的每一步选择假设我们要在/dev/sdb上创建一个 50G 的主分区。在fdisk提示符下输入nCommand (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p):这里让你选择主分区还是扩展分区。MBR 分区表最多支持 4 个主分区如果你需要超过 4 个分区就需要创建一个扩展分区然后在扩展分区里创建逻辑分区。对于大多数场景直接选p主分区就行按回车使用默认值。Partition number (1-4, default 1):分区编号默认从 1 开始。如果你之前删过分区这里可能会显示其他可用编号。直接回车即可。First sector (2048-209715199, default 2048):起始扇区。默认值 2048 是经过对齐优化的强烈建议直接回车使用默认值。为什么是 2048因为现代磁盘的物理扇区通常是 4096 字节8 个逻辑扇区2048 是 8 的倍数能确保分区起始位置与物理扇区对齐避免读写性能下降。这个细节在机械硬盘时代不太重要但在 SSD 上影响很明显。Last sector, /-sectors or /-size{K,M,G,T,P} (2048-209715199, default 209715199):结束扇区。这里你可以直接输入大小比如50G表示从起始位置往后 50G。也可以用50M、1T等单位。如果不指定默认会占用剩余所有空间。Created a new partition 1 of type Linux and of size 50 GiB.分区创建成功。此时输入p可以查看当前分区表Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x12345678 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 104857599 104855552 50G 83 Linux注意Id列是 83这是 Linux 文件系统的默认类型标识。Boot列是空的说明这个分区没有设置启动标志。如果你需要从这个分区启动系统需要用a命令切换启动标志。3.3 修改分区类型t 命令的实际用途t命令用来修改分区类型。这个操作在什么场景下有用举几个例子你要把某个分区用作 swap需要把类型改成 82你要创建 LVM 物理卷需要改成 8e你要做 RAID需要改成 fd。虽然文件系统的实际内容由mkfs决定但分区类型标识能让系统和其他工具正确识别分区的用途。操作方式Command (m for help): t Selected partition 1 Hex code or alias (type L to list all): 82 Changed type of partition Linux to Linux swap / Solaris.输入L可以列出所有支持的类型代码列表很长常用的就那几个代码类型用途83Linux普通 Linux 文件系统82Linux swap交换分区8eLinux LVMLVM 物理卷fdLinux raid autodetectRAID 成员盘efEFI SystemEFI 系统分区提示如果你用的是 GPT 分区表类型代码的体系不一样t命令会列出 GPT 专用的类型名称比如 Linux filesystem、Linux swap、EFI System 等。操作逻辑相同只是选项不同。3.4 删除分区d 命令与数据不可逆性删除分区用d命令Command (m for help): d Selected partition 1 Partition 1 has been deleted.如果磁盘上有多个分区fdisk会提示你选择要删除哪个Command (m for help): d Partition number (1,2, default 2):删除分区这个操作本身只是修改分区表并不会立即擦除磁盘上的数据。但分区表一旦写入原来的分区结构就不存在了文件系统无法再被正常挂载。数据恢复虽然理论上可行但实际操作非常麻烦需要专业工具逐扇区扫描。所以删除分区之前一定要确认数据已经备份或者不再需要。我个人的习惯是在生产环境中删除分区之前先用dd把分区的前 512 字节备份出来dd if/dev/sdb1 of/root/sdb1_backup.bin bs512 count1这个备份包含了文件系统的超级块信息万一误删了分区可以用它来辅助恢复。当然这只是应急手段不能替代正规备份。3.5 保存与退出w 和 q 的区别所有操作完成后输入w写入磁盘并退出Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.如果不想保存任何更改输入q直接退出Command (m for help): qq命令不会对磁盘做任何修改所有在内存中的操作都会被丢弃。这个设计在你不确定操作是否正确时非常有用——你可以随便试看完p的输出确认无误后再决定是否w。注意在某些情况下w之后系统可能提示 Re-reading the partition table failed这是因为磁盘正在被使用。此时需要重启系统或者用partprobe命令强制内核重新读取分区表partprobe /dev/sdb4. MBR 与 GPT 的选择逻辑与转换实操4.1 两种分区表的本质差异MBRMaster Boot Record和 GPTGUID Partition Table是两种不同的分区表格式它们的差异远不止支持容量大小这么简单。MBR 诞生于 1980 年代设计上有很多历史局限。它的分区表存储在磁盘的第一个扇区512 字节其中 446 字节用于引导代码64 字节用于分区表每个分区表项占 16 字节所以最多只能有 4 个主分区。为了突破这个限制后来引入了扩展分区的概念——用一个主分区的位置来存放扩展分区里面再划分逻辑分区。这种套娃式的设计增加了复杂性也容易出问题。GPTGUID Partition Table是 UEFI 标准的一部分分区表信息存储在磁盘的多个位置头部和尾部各有备份每个分区用 GUID 标识理论上支持无限个分区实际限制通常是 128 个。GPT 还自带 CRC32 校验能检测分区表是否损坏。对于超过 2TB 的磁盘GPT 是唯一选择。对比项MBRGPT最大磁盘容量2TB9.4ZB最大主分区数4128典型值分区表备份无有头部尾部校验机制无CRC32引导方式BIOSUEFI也兼容 BIOS适用场景老系统、小磁盘新系统、大磁盘4.2 在 fdisk 中切换分区表类型在fdisk交互模式下创建 GPT 分区表用g命令Command (m for help): g Created a new GPT disklabel (GUID: 12345678-ABCD-EF00-1234-567890ABCDEF).创建 MBR 分区表用o命令Command (m for help): o Created a new DOS disklabel with disk identifier 0x12345678.这两个操作都会清空现有分区表所以执行前必须确认磁盘上没有重要数据。如果你只是想查看当前分区表类型用p命令看Disklabel type那一行就行。注意从 MBR 切换到 GPT 或者反过来都会导致原有分区信息丢失。如果磁盘上已经有数据不要直接切换分区表类型应该先备份数据再重新分区。4.3 大容量磁盘的分区策略对于超过 2TB 的磁盘必须使用 GPT 分区表。但即使磁盘小于 2TB我也建议优先使用 GPT原因有三第一GPT 有分区表备份万一主分区表损坏可以从备份恢复第二GPT 没有主分区数量限制后续扩展更灵活第三现代操作系统和主板普遍支持 UEFI 引导GPT 是更符合趋势的选择。创建 GPT 分区表的流程和 MBR 基本一致只是在n命令创建分区时fdisk不会问你primary 还是 extended因为 GPT 没有这个概念所有分区都是平等的。分区类型的选择也变成了直接输入类型名称或 UUID。如果你需要把一块已有数据的 MBR 磁盘转换成 GPT不能直接在fdisk里操作需要用gdisk或者sgdisk工具。gdisk的界面和fdisk很像但它专门用于 GPT 分区表支持无损转换有一定风险务必先备份。5. 分区之后的收尾工作格式化与挂载5.1 mkfs 格式化选择正确的文件系统分区创建完成后还需要格式化才能使用。格式化的本质是在分区上建立文件系统结构让操作系统能够读写文件。Linux 下常用的文件系统有 ext4、xfs、btrfs 等。ext4 是最通用的选择兼容性好工具链成熟mkfs.ext4 /dev/sdb1xfs 在高并发和大文件场景下性能更好是 RHEL/CentOS 7 之后的默认文件系统mkfs.xfs /dev/sdb1如果你要创建 swap 分区mkswap /dev/sdb1 swapon /dev/sdb1格式化命令执行前会提示确认因为这会清除分区上的所有数据。如果你确定分区是空的或者数据不需要了可以加-F参数跳过确认mkfs.ext4 -F /dev/sdb1提示格式化时可以用-L参数给文件系统打标签方便后续挂载时用标签代替设备名mkfs.ext4 -L data /dev/sdb1挂载时就可以写成mount LABELdata /mnt/data这样即使设备名变了比如加了新硬盘导致 sdb 变成 sdc挂载配置也不会失效。5.2 挂载与开机自动挂载格式化完成后创建挂载点并挂载mkdir -p /mnt/data mount /dev/sdb1 /mnt/data用df -h确认挂载成功df -h /mnt/data如果要开机自动挂载需要编辑/etc/fstab文件。推荐使用 UUID 而不是设备名因为设备名可能会变blkid /dev/sdb1输出类似/dev/sdb1: UUID12345678-abcd-ef00-1234-567890abcdef TYPEext4 LABELdata然后在/etc/fstab中添加一行UUID12345678-abcd-ef00-1234-567890abcdef /mnt/data ext4 defaults 0 2各字段含义UUID 是设备标识/mnt/data是挂载点ext4是文件系统类型defaults是挂载选项第一个0表示不备份第二个2表示开机时检查文件系统根分区是 1其他分区是 2不检查是 0。注意修改/etc/fstab后先用mount -a测试一下确认没有报错再重启。如果 fstab 写错了导致系统无法启动需要进入救援模式修复非常麻烦。5.3 验证分区对齐与性能分区对齐是容易被忽略但影响性能的细节。用parted可以检查分区是否对齐parted /dev/sdb align-check optimal 1如果输出 1 aligned说明分区 1 是对齐的。如果输出 1 not aligned说明起始扇区没有对齐到物理扇区边界可能会影响读写性能。对于 SSD还可以用fdisk -l查看Sector size那一行。如果physical是 4096 而logical是 512说明磁盘支持 4K 物理扇区分区起始位置应该是 8 的倍数即 4096 字节的倍数。fdisk默认的 2048 起始扇区正好满足这个要求。6. 那些年我踩过的 fdisk 坑6.1 误操作系统盘最危险的操作我刚入行的时候有一次在虚拟机上做实验想给一块新加的磁盘分区结果手快输入了fdisk /dev/sda而sda是系统盘。当时没注意直接n创建了一个新分区然后w写入。结果系统重启后直接进入 grub rescue 模式因为分区表被改了引导程序找不到原来的分区。这个教训让我养成了一个习惯操作分区之前先用lsblk确认目标磁盘并且把系统盘的分区表备份出来。备份命令很简单sfdisk -d /dev/sda /root/sda_partition_backup.txt万一误操作可以用这个备份恢复sfdisk /dev/sda /root/sda_partition_backup.txt6.2 分区表未更新导致挂载失败有时候你在fdisk里创建了分区w保存退出后用lsblk却看不到新分区。这是因为内核还没有重新读取分区表。解决方法有两个一是重启系统二是用partprobe命令partprobe /dev/sdb如果partprobe也报错提示设备忙可以用partx命令partx -a /dev/sdb这个命令会强制内核重新扫描磁盘的分区表通常能立即生效。6.3 删除分区后忘记更新 fstab如果你删除或修改了某个分区但/etc/fstab里还有对应的挂载条目系统启动时会因为找不到设备而进入紧急模式。这种情况在测试环境里很常见——你删了一个测试分区但忘了清理 fstab。避免这个问题的方法是删除分区后立即检查 fstabgrep sdb /etc/fstab如果有对应的条目用#注释掉或者直接删除。然后运行mount -a确认没有报错。6.4 SSD 上的分区对齐问题早期我在 SSD 上分区时没有关注对齐问题直接用了fdisk的默认值。后来用parted检查发现分区没有对齐导致写入性能下降了将近 30%。虽然fdisk现代版本的默认起始扇区 2048 已经是对齐的但如果你手动指定了起始扇区一定要确保它是 8 的倍数对于 512 字节逻辑扇区、4096 字节物理扇区的磁盘。检查方法cat /sys/block/sdb/queue/physical_block_size cat /sys/block/sdb/queue/logical_block_size如果物理块大小是 4096逻辑块大小是 512那么起始扇区应该是 8 的倍数。fdisk的默认值 2048 满足这个条件。6.5 在脚本中使用 fdisk 的注意事项fdisk是交互式工具不适合直接在脚本里用。如果你需要自动化分区应该用sfdisk或者parted的命令行模式。比如用sfdisk创建分区echo 2048,104857599,L | sfdisk /dev/sdb或者用partedparted -s /dev/sdb mklabel gpt parted -s /dev/sdb mkpart primary ext4 1MiB 50GiB这些命令可以直接写在脚本里不需要人工交互。fdisk虽然也可以用echo管道输入命令序列但可读性和可维护性都很差不推荐在生产脚本中使用。7. 从 fdisk 延伸到日常磁盘管理习惯fdisk只是磁盘管理的一个环节。在实际运维中你还需要掌握df、du、lsblk、blkid、mount、umount等命令的配合使用。我个人的习惯是每次动磁盘之前先跑一遍lsblk和df -h把当前状态截图或者记录到笔记里操作完成后再用同样的命令确认结果符合预期。另外对于生产服务器我强烈建议使用 LVM逻辑卷管理而不是直接分区。LVM 可以在不重启的情况下动态调整分区大小灵活性远超传统分区。fdisk创建的分区可以作为 LVM 的物理卷PV然后用pvcreate、vgcreate、lvcreate一步步构建逻辑卷。这套组合拳在需要频繁调整存储的場景下非常实用。最后分享一个我常用的磁盘信息速查命令组合lsblk -f这个命令会列出所有磁盘和分区同时显示文件系统类型、UUID、挂载点一屏就能看完所有关键信息。比单独跑lsblk、blkid、df三个命令高效得多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。