为什么有了分区还不能存文件?Linux 文件系统、mkfs、mount 和 fstab

Kaku Lv4

分区有了,为什么还是不能存文件

上一篇我们用 parted 给一块新盘创建了 GPT 分区,lsblk 能看到 /dev/sdb1 了:

1
2
3
NAME   SIZE TYPE FSTYPE MOUNTPOINTS
sdb 200G disk
└─sdb1 200G part

注意 FSTYPE 那一列是空的。

这时候你可能会想:分区都有了,往里存个文件试试?

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

大概率会报错:mount: /data: unknown filesystem type on /dev/sdb1.

问题出在哪里?分区只是把一段空间划出来了,但系统不知道这段空间里的数据应该怎么组织。

分区表记录的是”这段空间从哪里开始、到哪里结束”。但空间里面是空的——没有目录结构,没有文件索引,没有权限信息,什么都没有。

要让这段空间真正能存文件,还需要一步:创建文件系统

1
2
3
4
/dev/sdb      整块硬盘
└─/dev/sdb1 一个分区,但还没有文件系统 ← 现在在这里
└─ ext4 / xfs / btrfs 文件系统 ← 还没做这一步
└─ /data 挂载点 ← 以及这一步

这篇文章就从这里开始:先用 mkfs 创建文件系统,再用 mount 挂载到目录,最后写入 /etc/fstab 让它开机自动生效。

分区和文件系统不是一回事

这两个概念经常被混在一起说,但在底层它们是完全不同的东西。

分区是磁盘上的一段空间。分区表(MBR 或 GPT)记录了这段空间的边界——从哪个扇区开始,到哪个扇区结束。

文件系统是这段空间里的数据组织方式。它决定了文件和目录怎么存放、怎么查找、权限怎么管理、日志怎么写。

打个比方:

分区像是把一块地圈出来。
文件系统像是在这块地上修路、编号、建仓库。
挂载点则是给这块地开一个入口。

再具体一点:

1
2
3
4
5
6
7
8
9
硬盘:/dev/sdb
├── 分区表:GPT
│ └── 分区:/dev/sdb1(空间边界)
│ └── 文件系统:ext4
│ ├── 目录结构
│ ├── 文件索引(inode)
│ ├── 权限信息
│ ├── 日志
│ └── 实际数据块

分区表解决的是”这块空间属于谁”。
文件系统解决的是”文件怎么放进去,又怎么找回来”。

没有文件系统,/dev/sdb1 就是一段原始空间。操作系统不知道怎么在里面创建文件,就像一块空地没有路,车开不进去。

mkfs 到底做了什么

mkfs 是用来创建文件系统的命令。它的名字来自 “make filesystem”。

mkfs 是高危命令。 它会在目标设备上创建全新的文件系统。如果目标分区里原来有数据,这一步通常会让原来的文件系统结构被覆盖,数据变得不可用。

真正危险的是你在错误的分区上执行了 mkfs

mkfs 本身只是一个前端。实际创建文件系统的是各个具体工具:

  • mkfs.ext4 —— 创建 ext4 文件系统
  • mkfs.xfs —— 创建 XFS 文件系统
  • mkfs.btrfs —— 创建 Btrfs 文件系统

用法很简单:

1
sudo mkfs.ext4 /dev/sdX1

/dev/sdX1 是占位符,不要直接复制执行。 执行前必须用 lsblk -f 确认目标分区,确保不是系统盘,也不是已有重要数据的分区。

执行之后,分区里就有了 ext4 文件系统。这时候再看:

1
lsblk -f

示例输出:

1
2
3
4
5
6
NAME   FSTYPE LABEL UUID                                 MOUNTPOINTS
sda
├─sda1 vfat CBB6-24F2 /boot/efi
└─sda2 ext4 0a3407de-014b-458b-b5c1-848e92a327a3 /
sdb
└─sdb1 ext4 1f5d7f37-a3b2-4c5d-8e9f-1a2b3c4d5e6f

注意 FSTYPE 列:之前是空的,现在变成了 ext4UUID 也出现了——这是文件系统的唯一标识符,后面写 fstab 会用到。

到这一步,分区里已经有文件系统了。但它还没有出现在 Linux 的目录树里,你通过 /data 或者任何路径都还访问不了它。

下一步才是挂载。

ext4、XFS、Btrfs 怎么选

创建文件系统之前,要先决定用哪种类型。常见的 Linux 文件系统有三种:ext4、XFS、Btrfs。不要一上来就纠结参数,先搞清楚它们各自适合什么场景。

ext4

ext4 是 Linux 上最常见、最成熟的文件系统之一。从 ext3 演化而来,经过了十几年的生产环境验证。

特点:

  • 稳定,工具链成熟
  • 支持在线扩容(resize2fs 可以在挂载状态下扩大分区)
  • 支持缩容(需要先卸载)
  • 适合系统盘、普通数据盘、小服务器

如果你没有特殊需求,ext4 往往是最省心的选择。

XFS

XFS 在服务器场景很常见,尤其在 Red Hat 系发行版上。它最初由 SGI 开发,针对大文件和高吞吐场景做了优化。

特点:

  • 擅长处理大文件、大容量、高吞吐场景
  • 支持在线扩容(xfs_growfs
  • 不支持缩容。 这是选 XFS 之前最需要注意的一点。一旦创建了 XFS 文件系统,想缩小它?做不到。只能备份数据、重新创建。
  • 很多企业发行版默认使用 XFS

XFS 不是不好用,而是它有自己的脾气。尤其是缩容这件事,选之前最好想清楚。

Btrfs

Btrfs(B-tree filesystem)是新一代的 Linux 文件系统,功能比 ext4 和 XFS 丰富得多:

  • CoW(写时复制):写入数据时不会直接覆盖原位置,而是写到新位置再更新引用。有助于数据一致性。
  • 快照:可以近乎瞬间创建文件系统的快照。
  • 校验:对所有数据和元数据做校验和,能检测静默数据损坏。
  • 压缩:支持透明压缩(zlib、lzo、zstd),可以节省空间,也能减少 SSD 写入量。
  • 子卷:一个 Btrfs 文件系统可以包含多个子卷,管理更灵活。

听起来很好,但也有需要注意的地方:

  • 功能多意味着行为更复杂,新手遇到问题时排查难度更大
  • 某些场景下 CoW 和数据库文件、虚拟机镜像可能产生碎片
  • 部分 RAID 级别(如 RAID5/6)在 Btrfs 上还不算完全成熟

Fedora 33 以后桌面版默认使用 Btrfs,openSUSE 也早已默认使用。它确实是一个有前景的文件系统,但不是”功能多所以一定更适合”。

Btrfs 很有意思,但它不是”更高级所以一定更适合”。功能多,也意味着你需要理解更多行为。

简单建议

1
2
3
4
5
6
7
场景                          推荐
──────────────────────────────────
普通 Linux 数据盘 ext4
大容量服务器数据盘 ext4 或 XFS
大文件、高吞吐场景 XFS
需要快照、压缩、CoW Btrfs
新手不确定 ext4

这个表只是入门建议,不是绝对规则。实际选择还要考虑发行版支持、运维经验、数据重要程度等因素。

mount:把文件系统接到目录树上

文件系统创建好了,但你还不能通过 /data 访问它。因为 Linux 不是通过 C 盘、D 盘来访问磁盘的——它是把不同的文件系统挂到一棵目录树上。

1
2
3
4
5
6
/
├── home
├── var
├── etc
├── data ← 想把新盘挂在这里
└── mnt

挂载点不是硬盘本身。 它只是访问某个文件系统的入口。

mount 命令做的事情就是:把某个设备上的文件系统,接到目录树的某个位置。

1
2
sudo mkdir -p /data
sudo mount /dev/sdX1 /data

/dev/sdX1 是占位符,/data 是示例挂载点。 操作前必须确认目标分区和挂载路径。

挂载之后,/data 目录就变成了那个文件系统的根目录。你往 /data 里写文件,实际上写到了 /dev/sdX1 这个分区上。

有一件事需要注意:如果 /data 目录原来有文件,挂载后那些文件会被”遮住”——不是删除,而是看不见了。卸载之后它们会重新出现。

检查挂载结果:

1
df -Th /data

示例输出:

1
2
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1 ext4 196G 61M 186G 1% /data
  • Type 显示文件系统类型
  • SizeUsedAvail 显示空间使用情况
  • Mounted on 显示挂载点

或者用 findmnt

1
findmnt /data

示例输出:

1
2
TARGET SOURCE    FSTYPE OPTIONS
/data /dev/sdb1 ext4 rw,relatime

findmnt 能更清晰地展示挂载关系。也可以用 lsblk -f 看块设备、文件系统和挂载点的对应关系。

临时挂载和永久挂载

手动执行 mount临时挂载。它只在当前运行期间有效。重启之后,这个挂载关系不会自动恢复。

如果你希望开机后自动挂载,就需要把配置写入 /etc/fstab

mount 解决的是”现在能不能访问”。
fstab 解决的是”下次开机还要不要自动挂上”。

但在写 fstab 之前,有一个重要问题要先解决:用什么来标识设备。

为什么不要在 fstab 里写 /dev/sdb1

你可能觉得 fstab 里直接写 /dev/sdb1 最简单。但这是个坏习惯。

/dev/sdb1 这种名字依赖设备发现顺序。内核按检测顺序分配 sdasdbsdc。如果:

  • 插拔了一块硬盘
  • 调换了 SATA 线
  • 虚拟机磁盘顺序变了
  • 添加了新磁盘

那今天的 /dev/sdb1 下次启动可能就变成 /dev/sdc1 了。如果 fstab 里写的是 /dev/sdb1,系统可能会把错误的分区挂到 /data 上,或者挂载失败导致开机异常。

所以更推荐使用 UUIDLABELPARTUUIDPARTLABEL 来标识设备。

查看 UUID:

1
blkid

或者:

1
lsblk -f

示例输出(blkid):

1
/dev/sdb1: UUID="1f5d7f37-a3b2-4c5d-8e9f-1a2b3c4d5e6f" TYPE="ext4" PARTUUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"

这几个标识符有什么区别?

  • UUID:文件系统的唯一标识。创建文件系统时生成。日常挂载普通文件系统,优先用 UUID。
  • LABEL:文件系统标签。可以用 e2labelxfs_admin 等工具设置。可以人工设置有意义的名字,但可能重复。
  • PARTUUID:分区表里的分区 UUID。GPT 分区表支持。它不随文件系统改变——重新 mkfs 之后 UUID 会变,但 PARTUUID 不变。
  • PARTLABEL:GPT 分区名。在 partedfdisk 里可以设置。

设备名像座位号,可能变。
UUID 更像身份证,稳定得多。

/etc/fstab 每一列是什么意思

修改 /etc/fstab 要小心。 写错可能导致开机等待超时、进入 emergency mode,甚至影响系统启动。修改前建议先备份:

1
sudo cp /etc/fstab /etc/fstab.bak

fstab 是一个纯文本文件,每一行描述一个文件系统的挂载配置。字段之间用空格或 Tab 分隔。

一个典型的 fstab 条目:

1
UUID=1f5d7f37-a3b2-4c5d-8e9f-1a2b3c4d5e6f /data ext4 defaults 0 2

每一列的含义:

1
2
3
4
5
6
7
8
UUID=xxxx  /data  ext4  defaults  0  2
│ │ │ │ │ │
│ │ │ │ │ └─ fsck 顺序
│ │ │ │ └──── dump
│ │ │ └──────────── 挂载参数
│ │ └──────────────────── 文件系统类型
│ └─────────────────────────── 挂载点
└──────────────────────────────────── 设备标识

逐列解释:

第一列:设备标识

可以是 /dev/sdX1UUID=LABEL=PARTUUID=PARTLABEL=。推荐用 UUID。

第二列:挂载点

文件系统要挂载到哪个目录。比如 /data/mnt/disk1。这个目录必须事先存在。swap 分区这里写 none

第三列:文件系统类型

比如 ext4xfsbtrfsvfatswap。要和实际的文件系统类型一致。写错了会挂载失败。

第四列:挂载参数

逗号分隔的选项列表。最常见的写法是 defaults

defaults 等于 rw,suid,dev,exec,auto,nouser,async。简单说就是:可读可写、允许 SUID、允许设备文件、允许执行、允许 mount -a 自动挂载、不允许普通用户挂载、异步 I/O。

几个常用的额外参数:

  • nofail:如果设备不存在,不报错,不影响开机。外置硬盘、非关键数据盘建议加上。
  • noatime:不更新文件访问时间。能减少写入次数,对 SSD 有好处,也能略微提升性能。
  • ro:只读挂载。

可以组合使用,比如 defaults,noatimedefaults,nofail

第五列:dump

dump 备份工具用的字段。现在大多数场景写 0 就行。

第六列:fsck 顺序

fsck(文件系统检查)在开机时的检查顺序。

  • 根分区:1
  • 普通数据分区:2
  • 不检查:0

注意:XFS 和 Btrfs 有自己的检查机制,和 ext4 不完全一样。XFS 使用 xfs_repair,Btrfs 使用 btrfs check。在 systemd 系统上,如果根文件系统是 XFS 或 Btrfs,fsck 顺序通常建议设为 0。普通数据盘用 ext4 写 2 通常没问题。

写完 fstab 后怎么安全验证

不要急着重启。先用 mount -a 测试一下。

1
sudo mount -a

mount -a 会尝试挂载 fstab 中所有配置的条目(除了标记了 noauto 的)。如果 fstab 写错了,这一步就会报错,可以提前发现问题。

检查结果:

1
2
3
findmnt /data
df -Th /data
lsblk -f

如果 mount -a 失败了:

  • 先看错误信息。通常是 UUID 写错、挂载点目录不存在、文件系统类型写错。
  • 不要急着重启。
  • 用之前备份的 fstab 恢复:sudo cp /etc/fstab.bak /etc/fstab
  • 修正问题后重新测试。

远程服务器上改 fstab,尤其要谨慎。
最好保持一个不会断的 SSH 会话,确认 mount -a 没问题后再重启。

一个完整的新硬盘挂载流程

把前面所有步骤串起来。假设:

  • 新硬盘已经用 partedfdisk 创建了一个 GPT 分区
  • 分区是 /dev/sdX1
  • 准备挂载到 /data
  • 使用 ext4 文件系统

下面所有命令中的 /dev/sdX1 都是占位符。操作前必须换成真实设备名。

第一步:确认当前磁盘布局

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

看清楚哪块盘是新盘,哪个分区是目标分区。看大小、看型号、看有没有已存在的文件系统和挂载点。

真正危险的不是命令,而是你选错了盘。

第二步:创建文件系统

高危操作。 下面的命令会在目标分区上创建全新的 ext4 文件系统。如果目标分区中有旧数据,会导致旧数据不可用。执行前必须再次确认 /dev/sdX1 不是系统盘,也不是已有数据盘。

1
sudo mkfs.ext4 /dev/sdX1

第三步:创建挂载点

1
sudo mkdir -p /data

第四步:临时挂载

1
sudo mount /dev/sdX1 /data

第五步:确认挂载结果

1
2
3
df -Th /data
findmnt /data
lsblk -f

确认文件系统类型、空间大小、挂载点都正确。

第六步:获取 UUID

1
sudo blkid /dev/sdX1

记下输出里的 UUID。下面写 fstab 要用。

第七步:备份 fstab

1
sudo cp /etc/fstab /etc/fstab.bak

第八步:写入 fstab

1
sudo vim /etc/fstab

在文件末尾加一行:

1
UUID=你的实际UUID /data ext4 defaults 0 2

不要把 你的实际UUID 原样复制。 用第六步拿到的真实 UUID 替换。文件系统类型要和实际一致。

第九步:测试 fstab

1
2
sudo mount -a
findmnt /data

如果没有报错,说明 fstab 配置正确。

到这里,这块盘才算真正变成了一个开机可自动挂载的数据目录。

1
2
3
4
5
6
7
8
9
/dev/sdb        整块硬盘
↓ parted
/dev/sdb1 分区
↓ mkfs.ext4
ext4 文件系统
↓ mount
/data 挂载点
↓ fstab
开机自动挂载

swap:不是文件系统,但经常一起出现

你可能会注意到磁盘上还有一个 swap 分区。它和普通文件系统不一样。

swap 不存普通文件和目录。它是给内核做内存换页用的空间。当物理内存不够用时,内核会把一些不常用的内存页写到 swap 里,腾出物理内存给当前需要的进程。

初始化 swap 用的不是 mkfs,而是 mkswap

1
sudo mkswap /dev/sdX2

启用 swap:

1
sudo swapon /dev/sdX2

查看 swap 状态:

1
swapon --show

在 fstab 里,swap 的写法也不同:

1
UUID=你的swap-UUID none swap defaults 0 0

注意挂载点是 none,文件系统类型是 swap,fsck 顺序是 0

mkswap 也会改写目标设备。 不要对已有数据的分区执行。本系列后续如有需要可以单独讲 swap 的细节。

常见踩坑

把分区当成文件系统

/dev/sdb1 只是分区。有没有文件系统,要看 lsblk -fFSTYPE 列。如果 FSTYPE 是空的,说明还没有文件系统,不能直接挂载。

对错误的分区执行 mkfs

这是最危险的错误之一。mkfs 会覆盖目标分区的文件系统结构。执行前必须用 lsblk -f 确认目标设备。对系统盘执行 mkfs 可能直接导致系统无法启动。

以为挂载点就是硬盘

挂载点只是一个目录入口。没有挂载时,它就是个普通目录。挂载后,它才变成某个文件系统的入口。你看到的文件在文件系统里,不在目录本身。

挂载后原目录里的文件”不见了”

不是删除。新挂载的文件系统会”遮住”原来目录里的内容。卸载后会重新看到。这是正常的挂载行为。

fstab 里写 /dev/sdb1

设备名可能因为硬件变动、磁盘顺序变化而改变。更推荐 UUID。

fstab 写错后直接重启

应该先 mount -a 测试。写错 fstab 可能导致开机超时等待、进入 emergency mode。远程服务器上尤其危险——fstab 错误可能导致 SSH 连不上。

文件系统类型写错

比如实际是 XFS,fstab 里写成 ext4,会挂载失败。写 fstab 前用 lsblk -fblkid 确认实际类型。

忘记创建挂载点目录

fstab 里的挂载点目录必须存在。如果写了一个不存在的目录,挂载会失败。但更常见的情况是:目录存在,但里面原来有文件——挂载后那些文件会被遮住。

总结:硬盘真正可用,需要走完整条链路

到这里,一块普通数据盘从分区到挂载的流程就完整了。

几个核心要点:

  • 分区只是划出空间。文件系统才让空间能存文件。
  • mkfs 创建文件系统,是高危操作。执行前必须确认目标设备。
  • mount 把文件系统接到 Linux 目录树。临时挂载重启后不会自动恢复。
  • /etc/fstab 让挂载在开机后自动生效。写错可能影响系统启动。
  • UUID 比 /dev/sdb1 更适合写入 fstab。设备名可能变,UUID 更稳定。
  • 改 fstab 后先 mount -a,不要直接重启。
1
2
3
4
5
6
7
8
9
整块硬盘:/dev/sdb

分区:/dev/sdb1

文件系统:ext4 / xfs / btrfs

挂载点:/data

fstab:开机自动挂载

这条链路的每一步都不能跳过,也不能搞反顺序。

在服务器和虚拟化环境里,我们经常还会看到 /dev/mapper、LVM、RAID、LUKS 这些东西。它们不是另一套规则,而是在这条链路中间又加了一层。后面可以再单独讲。

参考资料

  • 标题: 为什么有了分区还不能存文件?Linux 文件系统、mkfs、mount 和 fstab
  • 作者: Kaku
  • 创建于 : 2026-06-09 16:00:00
  • 更新于 : 2026-06-09 12:25:26
  • 链接: https://www.kakunet.top/2026/06/09/为什么有了分区还不能存文件?Linux-文件系统、mkfs、mount-和-fstab/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论