Linux 里的分区到底是什么?fdisk、parted、lsblk 怎么用

Kaku Lv4

分区之前,先看清楚哪块盘是哪块盘

一台 Linux 机器里新加了一块硬盘,或者虚拟机扩容之后,第一反应可能是直接开始分区。

先别急。

在 Linux 里,最容易出事故的地方不是命令本身,而是设备名。你可能见过这些名字:

1
2
3
4
5
/dev/sda
/dev/sdb
/dev/sda1
/dev/nvme0n1
/dev/nvme0n1p1

它们看起来很像,但差一个字母、多一个数字,含义完全不同。/dev/sda 可能是你的系统盘,/dev/sdb 才是新加的数据盘。如果你把分区表写到了 /dev/sda 上——系统盘的分区信息可能瞬间丢失。

所以:

分区之前,第一件事不是敲 fdisk,而是确认目标磁盘到底是谁。

Linux 为什么没有 C 盘、D 盘

如果你从 Windows 转过来,可能习惯了用盘符理解存储:C 盘装系统,D 盘放数据,E 盘是移动硬盘。

Linux 里没有这个概念。

Linux 的存储模型是一棵从 / 开始的目录树。磁盘和分区首先表现为 /dev 下的块设备文件,然后通过挂载(mount)把它们接到目录树的某个位置上。

1
2
3
4
5
6
7
8
9
10
11
Windows 习惯:
C:\
D:\
E:\

Linux 习惯:
/
├── home
├── var
├── data
└── mnt

但在挂载之前,我们先看到的是块设备。也就是 /dev/sda/dev/sdb1 这些名字。

挂载和文件系统是下一篇的内容。这一篇我们只关心一件事:怎么在 Linux 里看到磁盘、理解分区、创建分区。

/dev/sda/dev/sda1 差在哪里

这是全文最重要的一组概念。

  • /dev/sda —— 通常表示整块磁盘。没有数字后缀,就是一块盘本身。
  • /dev/sda1 —— 表示这块磁盘上的第一个分区。后面的数字是分区编号。
  • /dev/sda2/dev/sda3 —— 第二个、第三个分区。

它们的关系可以画成这样:

1
2
3
4
5
6
7
/dev/sda            整块磁盘
┌───────────────────────────────────────┐
│ 分区表(MBR 或 GPT) │
├──────────┬──────────┬─────────────────┤
│ /dev/sda1│ /dev/sda2│ /dev/sda3 │
│ 分区 1 │ 分区 2 │ 分区 3 │
└──────────┴──────────┴─────────────────┘

分区表记录了”这块盘被切成了几段”。每个分区是其中一段。

这个区分非常重要,因为对整盘操作和对分区操作是完全不同的事情

  • parted /dev/sda —— 在操作整块磁盘。写分区表、改分区布局,影响的是整块盘。
  • mkfs.ext4 /dev/sda1 —— 是在某个分区上创建文件系统。它只影响这个分区里的内容。

这两个对象不能混淆。如果你对 /dev/sda(整块盘)执行了 mkfs,会直接覆盖分区表,所有分区信息丢失。

简单记:没有数字的是盘,有数字的是分区。

不同类型磁盘的设备名

Linux 对不同接口、不同类型的磁盘,使用不同的命名规则。了解这些,以后看到 /dev/nvme0n1p1 这种名字就不会慌了。

SATA / SCSI / USB 磁盘:

1
2
3
4
/dev/sda        第一块盘
/dev/sdb 第二块盘
/dev/sda1 第一块盘的第一个分区
/dev/sda2 第一块盘的第二个分区

NVMe 磁盘:

1
2
3
/dev/nvme0n1        第一个控制器、第一个命名空间的整块盘
/dev/nvme0n1p1 第一个分区
/dev/nvme0n1p2 第二个分区

NVMe 的命名比 SATA 复杂一些。nvme0 是控制器编号,n1 是命名空间编号,p1 是分区编号。注意分区号前面有个 p,这和 SATA 盘(直接在后面加数字)不同。

VirtIO 虚拟磁盘(常见于 KVM、PVE 虚拟机):

1
2
/dev/vda        第一块虚拟磁盘
/dev/vda1 第一个分区

其他可能遇到的:

1
2
3
/dev/xvda       Xen 虚拟磁盘
/dev/mmcblk0 SD 卡、eMMC 存储
/dev/mmcblk0p1 第一个分区

有一件事需要注意:设备名可能会变。 每次启动时,内核按检测顺序分配 sdasdb。如果你拔掉一块盘再插回来,或者调换了 SATA 线,/dev/sdb 可能就变成 /dev/sdc 了。

所以后面写 /etc/fstab 时,更推荐用 UUID 或 LABEL 而不是 /dev/sdX。不过这是第三篇的内容,这里先知道有这回事就行。

第一个命令永远是 lsblk

先看清楚机器上有哪些盘,再动手。

lsblk(list block devices)是最适合干这件事的命令。它只读取系统信息,不会修改磁盘

1
lsblk

默认输出大概长这样:

1
2
3
4
5
6
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
└─sda2 8:2 0 49.5G 0 part /
sdb 8:16 0 200G 0 disk
sr0 11:0 1 1024M 0 rom

不过默认输出的信息不算多。推荐加上几个列,一次看个够:

1
lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINTS

输出:

1
2
3
4
5
NAME   MODEL             SIZE TYPE FSTYPE MOUNTPOINTS
sda QEMU HARDDISK 50G disk
├─sda1 512M part vfat /boot/efi
└─sda2 49.5G part ext4 /
sdb Virtual Disk 200G disk

这一眼就能看出来:

  • 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
-JJSON 格式输出,方便脚本处理

fdisk -l 查看分区表

lsblk 能告诉你”有哪些盘、哪些分区”,但它不显示分区表的细节。要看分区表类型、每个分区的起止位置、扇区大小这些信息,用 fdisk -l

1
sudo fdisk -l /dev/sdX

/dev/sdX 换成你要查看的设备名。不要直接复制执行,先用 lsblk 确认目标盘。

输出大概长这样:

1
2
3
4
5
6
7
8
9
10
11
Disk /dev/sdb: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: A1B2C3D4-E5F6-7890-ABCD-EF1234567890

Device Start End Sectors Size Type
/dev/sdb1 2048 209715199 209713152 100G Linux filesystem
/dev/sdb2 209715200 419430366 210015167 100G Linux filesystem

解释几个关键字段:

  • Disklabel type: gpt —— 分区表类型。gpt 是 GPT 分区表,dos 是传统 MBR 分区表。
  • Sector size —— 扇区大小。逻辑扇区通常是 512 字节,物理扇区可能是 4096 字节(4K 扇区)。
  • Device —— 分区设备名。
  • Start / End —— 分区的起止扇区号。
  • Sectors —— 分区占用多少个扇区。
  • Size —— 分区大小。
  • Type —— 分区类型标记。

重点来了:Type 里的 Linux filesystem 不代表里面已经有 ext4 文件系统。 它只是分区表里的一个类型标记,意思是”这个分区预期用来放 Linux 文件系统”。真正的文件系统信息要用 lsblk -fblkid 来确认。

分区类型 ≠ 文件系统。分区类型是分区表里的标记,文件系统是分区里的实际数据结构。

fdisk -l 不加设备名也行:

1
sudo fdisk -l

这会列出系统上所有磁盘的分区表。信息量很大,但有时候排查问题时很有用。

fdisk -l 是只读操作,不会修改磁盘。

fdisk 适合什么场景

fdisk 不只能查看,还能交互式地创建、删除、修改分区。它是 Linux 上历史最久的分区工具之一。

1
sudo fdisk /dev/sdX

进入交互模式后,用单个字母操作:

1
2
3
4
5
6
7
8
9
p  打印当前分区表
n 新建分区
d 删除分区
t 修改分区类型
w 写入修改并退出
q 不保存退出
m 查看帮助
g 创建新的 GPT 分区表
o 创建新的 MBR(DOS)分区表

fdisk 的好处是:

  • 现代 fdisk(来自 util-linux)完全支持 GPT。 不要被它的老名字吓到,它不是 DOS 时代的那个 fdisk 了。
  • 交互式操作步骤明确,适合手工创建普通分区。
  • 在按下 w 之前,所有修改都只是暂存在内存里,不会写入磁盘。

但也有局限:

  • 交互式操作不太适合脚本化(需要脚本化的话,可以用 sfdisk)。
  • w 写入后,fdisk 会自动调用 syncBLKRRPART ioctl 通知内核重新读取分区表。

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
2
3
4
5
6
7
8
9
Model: ATA Virtual Disk (scsi)
Disk /dev/sdb: 215GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 107GB 107GB ext4 primary
2 107GB 215GB 108GB ext4 primary

注意:Partition Table: gptPartition Table: msdos。在 parted 里,MBR 分区表叫 msdos。这和 fdisk 里叫 dos 是一回事——都是指传统 MBR 分区表。

在 Linux 工具里,dosmsdos 都是指传统 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,也不要误以为它已经格式化完成。

partedfdisk 的核心区别

fdiskparted
交互式操作
命令行模式有限(脚本用 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),能同时兼容上面所有场景。

对普通用户来说,遵循工具给出的默认对齐方式就可以。
除非你在做特殊存储性能调优,否则不用手工算扇区。

fdiskparted 默认都会帮你处理对齐。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
2
3
sudo partprobe /dev/sdX
sudo udevadm settle
lsblk

如果分区还是没出现,可能是因为磁盘正在被使用。比如有分区被挂载了,或者有进程在读写这块盘。这时候内核可能拒绝重新读取分区表。解决办法是先卸载相关分区、关闭占用的进程,实在不行就重启。

partprobe 不是万能命令。如果磁盘正在使用,内核可能拒绝重新读取分区表。

一个完整的新盘分区流程

下面演示给一块新盘创建 GPT 分区的完整过程。假设目标盘是 /dev/sdX

/dev/sdX 是占位符,操作前必须换成真实设备名。这个操作会修改目标磁盘的分区表。有数据的盘不要照抄。

第一步:确认目标磁盘

1
lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINTS

看清楚哪块盘是新盘。看大小、看型号、看有没有已存在的分区和挂载点。

比如你看到:

1
2
3
4
5
NAME   MODEL             SIZE TYPE FSTYPE MOUNTPOINTS
sda Samsung SSD 50G disk
├─sda1 512M part vfat /boot/efi
└─sda2 49.5G part ext4 /
sdb WD Blue 200G disk

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
2
3
4
5
6
7
8
Model: ATA WD Blue (scsi)
Disk /dev/sdb: 215GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 215GB 215GB primary

注意 File system 列是空的。这是正常的——我们只创建了分区,还没有创建文件系统。

1
(parted) quit

第四步:让系统识别新分区

1
2
sudo partprobe /dev/sdb
sudo udevadm settle

第五步:确认分区出现

1
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
1
2
3
4
5
6
NAME   SIZE TYPE FSTYPE MOUNTPOINTS
sda 50G disk
├─sda1 512M part vfat /boot/efi
└─sda2 49.5G part ext4 /
sdb 200G disk
└─sdb1 200G part

sdb1 出现了。注意 FSTYPE 列是空的——这说明分区里还没有文件系统。

到这里,我们只是把硬盘切出了一个分区。它还不能真正存文件。

把整个流程画出来:

1
2
3
4
5
6
7
8
9
10
11
lsblk 确认磁盘

fdisk/parted 查看分区表

parted/fdisk 创建分区

partprobe 通知内核

lsblk 再次确认

下一篇:mkfs 创建文件系统

常见踩坑

把整盘和分区搞混

1
2
/dev/sdb   整块盘
/dev/sdb1 分区

/dev/sdb 执行 mkfs 会覆盖整个盘(包括分区表)。对 /dev/sdb1 执行 mkfs 只影响这个分区。操作前多看一眼设备名有没有数字后缀。

选错盘

/dev/sda 很可能是系统盘。不要凭感觉判断。用 lsblk 看大小、型号、挂载点。有挂载在 //boot 的盘,不要碰。

以为 parted mkpart ... ext4 ... 已经创建了 ext4

它没有。它只是创建了一个分区。ext4 只是 parted 的一个类型提示参数,不是文件系统操作。要确认分区里到底有没有文件系统,看 lsblk -fFSTYPE 列。

以为分区类型等于文件系统

fdisk -l 输出里的 Type: Linux filesystem 不代表分区里有 ext4。分区类型是分区表里的一个标记字段,告诉系统”这个分区预期用来做什么”。文件系统是实际写入分区的数据结构。这两件事不是一回事。

在已有数据盘上执行 mklabel

parted /dev/sdX mklabel gpt 会重建分区表。原有分区信息会丢失。虽然数据可能还残留在磁盘上,但系统已经找不到那些分区了。恢复很麻烦,而且不一定能成功。

分区后直接写 fstab

还没有文件系统、没有 UUID、没有挂载点,不应该急着写 /etc/fstabfstab 里引用的 UUID 是在创建文件系统时生成的。分区阶段还没有 UUID 可以写。这是第三篇的内容。

总结:这篇只解决一件事

这篇文章讲的是:在 Linux 里怎么看到磁盘、理解分区、创建分区。

几个核心要点:

  • Linux 里先看到的是块设备。 /dev/sda 是整块盘,/dev/sda1 是分区。没有 C 盘、D 盘的概念。
  • lsblk 用来先看清楚磁盘布局。 它只查看,不修改,是操作前的第一步。
  • fdisk -l 用来看分区表和分区边界。 它能显示分区表类型、扇区大小、分区起止位置。
  • fdisk 适合交互式分区。 现代 fdisk 完全支持 GPT。
  • parted 适合 GPT、大容量盘和脚本化场景。 但它的某些操作立即生效,要更谨慎。
  • 创建分区不等于创建文件系统。 parted mkpart 只是在分区表里记了一条”这段空间是一个分区”,分区里面还是空的。
  • 分区后可能需要 partprobeudevadm 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 进行许可。
评论