Linux 里的分区到底是什么?fdisk、parted、lsblk 怎么用
分区之前,先看清楚哪块盘是哪块盘
一台 Linux 机器里新加了一块硬盘,或者虚拟机扩容之后,第一反应可能是直接开始分区。
先别急。
在 Linux 里,最容易出事故的地方不是命令本身,而是设备名。你可能见过这些名字:
1 | /dev/sda |
它们看起来很像,但差一个字母、多一个数字,含义完全不同。/dev/sda 可能是你的系统盘,/dev/sdb 才是新加的数据盘。如果你把分区表写到了 /dev/sda 上——系统盘的分区信息可能瞬间丢失。
所以:
分区之前,第一件事不是敲
fdisk,而是确认目标磁盘到底是谁。
Linux 为什么没有 C 盘、D 盘
如果你从 Windows 转过来,可能习惯了用盘符理解存储:C 盘装系统,D 盘放数据,E 盘是移动硬盘。
Linux 里没有这个概念。
Linux 的存储模型是一棵从 / 开始的目录树。磁盘和分区首先表现为 /dev 下的块设备文件,然后通过挂载(mount)把它们接到目录树的某个位置上。
1 | Windows 习惯: |
但在挂载之前,我们先看到的是块设备。也就是 /dev/sda、/dev/sdb1 这些名字。
挂载和文件系统是下一篇的内容。这一篇我们只关心一件事:怎么在 Linux 里看到磁盘、理解分区、创建分区。
/dev/sda 和 /dev/sda1 差在哪里
这是全文最重要的一组概念。
/dev/sda—— 通常表示整块磁盘。没有数字后缀,就是一块盘本身。/dev/sda1—— 表示这块磁盘上的第一个分区。后面的数字是分区编号。/dev/sda2、/dev/sda3—— 第二个、第三个分区。
它们的关系可以画成这样:
1 | /dev/sda 整块磁盘 |
分区表记录了”这块盘被切成了几段”。每个分区是其中一段。
这个区分非常重要,因为对整盘操作和对分区操作是完全不同的事情:
parted /dev/sda—— 在操作整块磁盘。写分区表、改分区布局,影响的是整块盘。mkfs.ext4 /dev/sda1—— 是在某个分区上创建文件系统。它只影响这个分区里的内容。
这两个对象不能混淆。如果你对 /dev/sda(整块盘)执行了 mkfs,会直接覆盖分区表,所有分区信息丢失。
简单记:没有数字的是盘,有数字的是分区。
不同类型磁盘的设备名
Linux 对不同接口、不同类型的磁盘,使用不同的命名规则。了解这些,以后看到 /dev/nvme0n1p1 这种名字就不会慌了。
SATA / SCSI / USB 磁盘:
1 | /dev/sda 第一块盘 |
NVMe 磁盘:
1 | /dev/nvme0n1 第一个控制器、第一个命名空间的整块盘 |
NVMe 的命名比 SATA 复杂一些。nvme0 是控制器编号,n1 是命名空间编号,p1 是分区编号。注意分区号前面有个 p,这和 SATA 盘(直接在后面加数字)不同。
VirtIO 虚拟磁盘(常见于 KVM、PVE 虚拟机):
1 | /dev/vda 第一块虚拟磁盘 |
其他可能遇到的:
1 | /dev/xvda Xen 虚拟磁盘 |
有一件事需要注意:设备名可能会变。 每次启动时,内核按检测顺序分配 sda、sdb。如果你拔掉一块盘再插回来,或者调换了 SATA 线,/dev/sdb 可能就变成 /dev/sdc 了。
所以后面写 /etc/fstab 时,更推荐用 UUID 或 LABEL 而不是 /dev/sdX。不过这是第三篇的内容,这里先知道有这回事就行。
第一个命令永远是 lsblk
先看清楚机器上有哪些盘,再动手。
lsblk(list block devices)是最适合干这件事的命令。它只读取系统信息,不会修改磁盘。
1 | lsblk |
默认输出大概长这样:
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS |
不过默认输出的信息不算多。推荐加上几个列,一次看个够:
1 | lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINTS |
输出:
1 | NAME MODEL SIZE TYPE FSTYPE MOUNTPOINTS |
这一眼就能看出来:
sda是 50G 的系统盘,已经有两个分区,分别挂载在/boot/efi和/。sdb是新加的 200G 盘,还没有分区——它只有disk类型,下面没有part。
如果想分辨是机械硬盘还是 SSD,可以加 ROTA 列:
1 | lsblk -o NAME,MODEL,SIZE,ROTA,TYPE,FSTYPE,MOUNTPOINTS |
ROTA 表示是否旋转(Rotational)。1 是机械硬盘,0 是 SSD 或 NVMe。
lsblk是查看命令,不会修改磁盘。可以放心用。
几个常用选项速查:
| 选项 | 作用 |
|---|---|
-o | 指定要显示哪些列 |
-f | 显示文件系统信息(FSTYPE、LABEL、UUID、MOUNTPOINTS) |
-d | 只显示磁盘,不显示分区 |
-p | 显示完整设备路径(如 /dev/sda 而不是 sda) |
-J | JSON 格式输出,方便脚本处理 |
用 fdisk -l 查看分区表
lsblk 能告诉你”有哪些盘、哪些分区”,但它不显示分区表的细节。要看分区表类型、每个分区的起止位置、扇区大小这些信息,用 fdisk -l。
1 | sudo fdisk -l /dev/sdX |
把 /dev/sdX 换成你要查看的设备名。不要直接复制执行,先用 lsblk 确认目标盘。
输出大概长这样:
1 | Disk /dev/sdb: 200 GiB, 214748364800 bytes, 419430400 sectors |
解释几个关键字段:
- Disklabel type: gpt —— 分区表类型。
gpt是 GPT 分区表,dos是传统 MBR 分区表。 - Sector size —— 扇区大小。逻辑扇区通常是 512 字节,物理扇区可能是 4096 字节(4K 扇区)。
- Device —— 分区设备名。
- Start / End —— 分区的起止扇区号。
- Sectors —— 分区占用多少个扇区。
- Size —— 分区大小。
- Type —— 分区类型标记。
重点来了:Type 里的 Linux filesystem 不代表里面已经有 ext4 文件系统。 它只是分区表里的一个类型标记,意思是”这个分区预期用来放 Linux 文件系统”。真正的文件系统信息要用 lsblk -f 或 blkid 来确认。
分区类型 ≠ 文件系统。分区类型是分区表里的标记,文件系统是分区里的实际数据结构。
fdisk -l 不加设备名也行:
1 | sudo fdisk -l |
这会列出系统上所有磁盘的分区表。信息量很大,但有时候排查问题时很有用。
fdisk -l是只读操作,不会修改磁盘。
fdisk 适合什么场景
fdisk 不只能查看,还能交互式地创建、删除、修改分区。它是 Linux 上历史最久的分区工具之一。
1 | sudo fdisk /dev/sdX |
进入交互模式后,用单个字母操作:
1 | p 打印当前分区表 |
fdisk 的好处是:
- 现代
fdisk(来自 util-linux)完全支持 GPT。 不要被它的老名字吓到,它不是 DOS 时代的那个 fdisk 了。 - 交互式操作步骤明确,适合手工创建普通分区。
- 在按下
w之前,所有修改都只是暂存在内存里,不会写入磁盘。
但也有局限:
- 交互式操作不太适合脚本化(需要脚本化的话,可以用
sfdisk)。 - 按
w写入后,fdisk会自动调用sync和BLKRRPARTioctl 通知内核重新读取分区表。
在
fdisk里,按下w之前的操作只是暂存。
但这不代表可以随便试。一旦写入错误的磁盘,恢复会很麻烦。
操作前一定要确认:sudo fdisk /dev/sdX里的设备名是对的。
parted 适合什么场景
parted(GNU Parted)是另一个常用的分区工具。和 fdisk 相比,它在几个场景下更合适:
- GPT 分区表:虽然
fdisk也支持 GPT,但很多发行版文档和教程更习惯用parted演示 GPT 分区操作。 - 大容量磁盘:
parted处理大容量盘时表现稳定。 - 脚本化:
parted支持命令行模式,不用进入交互界面就能执行操作。
1 | sudo parted /dev/sdX print |
这是查看分区信息。输出大概长这样:
1 | Model: ATA Virtual Disk (scsi) |
注意:Partition Table: gpt 或 Partition Table: msdos。在 parted 里,MBR 分区表叫 msdos。这和 fdisk 里叫 dos 是一回事——都是指传统 MBR 分区表。
在 Linux 工具里,
dos和msdos都是指传统 MBR 分区表。
看到这两个名字,不要以为是别的东西。
mklabel:创建分区表,危险操作
1 | sudo parted /dev/sdX mklabel gpt |
这条命令会在 /dev/sdX 上创建一个全新的 GPT 分区表。如果这块盘上已经有分区和数据,原有分区表会被覆盖,分区可能立刻不可见。
这不是”修改”,是”重建”。
不要在有数据的盘上执行
mklabel,除非你非常确定自己在做什么。
mkpart:创建分区,不是创建文件系统
1 | sudo parted /dev/sdX mkpart primary 1MiB 100% |
这条命令创建一个分区,从磁盘的 1MiB 位置开始,到磁盘末尾结束。primary 是分区名称(GPT 下这个参数只是名字,不像 MBR 那样区分主分区和扩展分区)。
你可能会在一些教程里看到这样的写法:
1 | sudo parted /dev/sdX mkpart primary ext4 1MiB 100% |
注意,这里的 ext4 不是创建 ext4 文件系统。它只是给 parted 的一个类型提示,最终写入分区表的是一个类型标记。parted mkpart 创建的是分区,不是文件系统。
真正创建文件系统是下一篇的内容,用 mkfs 命令。
parted mkpart创建的是分区,不是文件系统。
看到命令里有ext4,也不要误以为它已经格式化完成。
parted 和 fdisk 的核心区别
fdisk | parted | |
|---|---|---|
| 交互式操作 | 是 | 是 |
| 命令行模式 | 有限(脚本用 sfdisk) | 是(parted -s 或直接传命令) |
| GPT 支持 | 是 | 是 |
| 调整分区大小 | 否 | 是(resizepart) |
| 修改即时生效 | 按 w 后生效 | 部分操作立即生效 |
注意最后一条:parted 的某些操作(比如 mklabel)是立即写入磁盘的,不会像 fdisk 那样给你一个”暂存、确认、再写入”的过程。所以用 parted 时要更谨慎。
为什么分区通常从 1MiB 开始
你可能注意到了,上面 parted mkpart 的起始位置写的是 1MiB,而不是 0。
这是现代分区工具的常见做法。原因是对齐。
老式 MBR 工具习惯从第 63 扇区开始(31.5 KiB),这是 CHS 寻址时代的遗留。但现代存储设备有不同需求:
- 4K 扇区硬盘:物理扇区 4096 字节。1MiB(1048576 字节)刚好是 4096 的整数倍。
- SSD:擦除块通常是 512KiB、1MiB 或更大。1MiB 起始能对齐大多数擦除块。
- RAID:条带大小通常是 64KiB 到 1MiB。1MiB 起始能对齐所有常见条带大小。
- UEFI 规范:EFI 系统分区(ESP)建议从 1MiB 开始。
从第 2048 扇区开始(2048 × 512 = 1048576 = 1MiB),能同时兼容上面所有场景。
对普通用户来说,遵循工具给出的默认对齐方式就可以。
除非你在做特殊存储性能调优,否则不用手工算扇区。
fdisk 和 parted 默认都会帮你处理对齐。fdisk 的 man page 原话是:”It is always a good idea to follow fdisk’s defaults.”
分区后为什么有时 /dev/sdX1 没出现
创建分区后,工具显示分区已经写入了,但 lsblk 一看,/dev/sdX1 没出来。
这不是 bug,而是 Linux 内核和 udev 的工作机制决定的。
分区表写入磁盘后,内核还需要重新读取分区表,然后 udev 需要在 /dev 下创建对应的设备节点。有时候系统会自动处理,有时候需要手动触发。
几个命令可以帮忙:
partprobe —— 通知内核重新读取分区表:
1 | sudo partprobe /dev/sdX |
它底层调用的是 BLKRRPART ioctl,告诉内核”这块盘的分区表变了,请重新扫描”。
udevadm settle —— 等待 udev 处理完所有设备事件:
1 | sudo udevadm settle |
它会等待 udev 事件队列清空,也就是所有设备节点都创建完成。默认超时 120 秒。
/proc/partitions —— 查看内核当前识别到的分区:
1 | cat /proc/partitions |
这是内核维护的虚拟文件,列出内核看到的所有块设备和分区。
通常的排查顺序:
1 | sudo partprobe /dev/sdX |
如果分区还是没出现,可能是因为磁盘正在被使用。比如有分区被挂载了,或者有进程在读写这块盘。这时候内核可能拒绝重新读取分区表。解决办法是先卸载相关分区、关闭占用的进程,实在不行就重启。
partprobe不是万能命令。如果磁盘正在使用,内核可能拒绝重新读取分区表。
一个完整的新盘分区流程
下面演示给一块新盘创建 GPT 分区的完整过程。假设目标盘是 /dev/sdX。
/dev/sdX 是占位符,操作前必须换成真实设备名。这个操作会修改目标磁盘的分区表。有数据的盘不要照抄。
第一步:确认目标磁盘
1 | lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINTS |
看清楚哪块盘是新盘。看大小、看型号、看有没有已存在的分区和挂载点。
比如你看到:
1 | NAME MODEL SIZE TYPE FSTYPE MOUNTPOINTS |
sdb 是 200G 的新盘,没有分区,没有文件系统,没有挂载点。目标就是它。
真正危险的不是命令,而是你选错了盘。
第二步:查看分区表(可选)
如果盘是全新的,可能还没有分区表。如果有,可以用 fdisk -l 看一下:
1 | sudo fdisk -l /dev/sdb |
第三步:用 parted 创建分区
1 | sudo parted /dev/sdb |
进入 parted 交互界面。注意提示符会变成 (parted)。
1 | (parted) print |
先看一眼当前状态。如果是全新盘,可能提示”未识别的磁盘标签”,这是正常的。
1 | (parted) mklabel gpt |
创建 GPT 分区表。如果盘上已有数据,这一步会破坏原有分区表。
1 | (parted) mkpart primary 1MiB 100% |
创建一个分区,从 1MiB 开始,到磁盘末尾。primary 在 GPT 下只是分区名称。
1 | (parted) print |
确认分区已经创建:
1 | Model: ATA WD Blue (scsi) |
注意 File system 列是空的。这是正常的——我们只创建了分区,还没有创建文件系统。
1 | (parted) quit |
第四步:让系统识别新分区
1 | sudo partprobe /dev/sdb |
第五步:确认分区出现
1 | lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS |
1 | NAME SIZE TYPE FSTYPE MOUNTPOINTS |
sdb1 出现了。注意 FSTYPE 列是空的——这说明分区里还没有文件系统。
到这里,我们只是把硬盘切出了一个分区。它还不能真正存文件。
把整个流程画出来:
1 | lsblk 确认磁盘 |
常见踩坑
把整盘和分区搞混
1 | /dev/sdb 整块盘 |
对 /dev/sdb 执行 mkfs 会覆盖整个盘(包括分区表)。对 /dev/sdb1 执行 mkfs 只影响这个分区。操作前多看一眼设备名有没有数字后缀。
选错盘
/dev/sda 很可能是系统盘。不要凭感觉判断。用 lsblk 看大小、型号、挂载点。有挂载在 / 和 /boot 的盘,不要碰。
以为 parted mkpart ... ext4 ... 已经创建了 ext4
它没有。它只是创建了一个分区。ext4 只是 parted 的一个类型提示参数,不是文件系统操作。要确认分区里到底有没有文件系统,看 lsblk -f 的 FSTYPE 列。
以为分区类型等于文件系统
fdisk -l 输出里的 Type: Linux filesystem 不代表分区里有 ext4。分区类型是分区表里的一个标记字段,告诉系统”这个分区预期用来做什么”。文件系统是实际写入分区的数据结构。这两件事不是一回事。
在已有数据盘上执行 mklabel
parted /dev/sdX mklabel gpt 会重建分区表。原有分区信息会丢失。虽然数据可能还残留在磁盘上,但系统已经找不到那些分区了。恢复很麻烦,而且不一定能成功。
分区后直接写 fstab
还没有文件系统、没有 UUID、没有挂载点,不应该急着写 /etc/fstab。fstab 里引用的 UUID 是在创建文件系统时生成的。分区阶段还没有 UUID 可以写。这是第三篇的内容。
总结:这篇只解决一件事
这篇文章讲的是:在 Linux 里怎么看到磁盘、理解分区、创建分区。
几个核心要点:
- Linux 里先看到的是块设备。
/dev/sda是整块盘,/dev/sda1是分区。没有 C 盘、D 盘的概念。 lsblk用来先看清楚磁盘布局。 它只查看,不修改,是操作前的第一步。fdisk -l用来看分区表和分区边界。 它能显示分区表类型、扇区大小、分区起止位置。fdisk适合交互式分区。 现代fdisk完全支持 GPT。parted适合 GPT、大容量盘和脚本化场景。 但它的某些操作立即生效,要更谨慎。- 创建分区不等于创建文件系统。
parted mkpart只是在分区表里记了一条”这段空间是一个分区”,分区里面还是空的。 - 分区后可能需要
partprobe和udevadm settle让内核和 udev 识别新分区。
分区只是把一块硬盘切出一段空间。这段空间现在还只是”空地”。
下一篇,我们再看怎么在这块空地上建文件系统,让它真正能存文件。
参考资料
- 标题: Linux 里的分区到底是什么?fdisk、parted、lsblk 怎么用
- 作者: Kaku
- 创建于 : 2026-06-09 14:00:00
- 更新于 : 2026-06-09 12:18:49
- 链接: https://www.kakunet.top/2026/06/09/Linux-里的分区到底是什么?fdisk、parted、lsblk-怎么用/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。