为什么有了分区还不能存文件?Linux 文件系统、mkfs、mount 和 fstab
分区有了,为什么还是不能存文件
上一篇我们用 parted 给一块新盘创建了 GPT 分区,lsblk 能看到 /dev/sdb1 了:
1 | NAME SIZE TYPE FSTYPE MOUNTPOINTS |
注意 FSTYPE 那一列是空的。
这时候你可能会想:分区都有了,往里存个文件试试?
1 | sudo mkdir -p /data |
大概率会报错:mount: /data: unknown filesystem type on /dev/sdb1.
问题出在哪里?分区只是把一段空间划出来了,但系统不知道这段空间里的数据应该怎么组织。
分区表记录的是”这段空间从哪里开始、到哪里结束”。但空间里面是空的——没有目录结构,没有文件索引,没有权限信息,什么都没有。
要让这段空间真正能存文件,还需要一步:创建文件系统。
1 | /dev/sdb 整块硬盘 |
这篇文章就从这里开始:先用 mkfs 创建文件系统,再用 mount 挂载到目录,最后写入 /etc/fstab 让它开机自动生效。
分区和文件系统不是一回事
这两个概念经常被混在一起说,但在底层它们是完全不同的东西。
分区是磁盘上的一段空间。分区表(MBR 或 GPT)记录了这段空间的边界——从哪个扇区开始,到哪个扇区结束。
文件系统是这段空间里的数据组织方式。它决定了文件和目录怎么存放、怎么查找、权限怎么管理、日志怎么写。
打个比方:
分区像是把一块地圈出来。
文件系统像是在这块地上修路、编号、建仓库。
挂载点则是给这块地开一个入口。
再具体一点:
1 | 硬盘:/dev/sdb |
分区表解决的是”这块空间属于谁”。
文件系统解决的是”文件怎么放进去,又怎么找回来”。
没有文件系统,/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 | NAME FSTYPE LABEL UUID MOUNTPOINTS |
注意 FSTYPE 列:之前是空的,现在变成了 ext4。UUID 也出现了——这是文件系统的唯一标识符,后面写 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 | 场景 推荐 |
这个表只是入门建议,不是绝对规则。实际选择还要考虑发行版支持、运维经验、数据重要程度等因素。
mount:把文件系统接到目录树上
文件系统创建好了,但你还不能通过 /data 访问它。因为 Linux 不是通过 C 盘、D 盘来访问磁盘的——它是把不同的文件系统挂到一棵目录树上。
1 | / |
挂载点不是硬盘本身。 它只是访问某个文件系统的入口。
mount 命令做的事情就是:把某个设备上的文件系统,接到目录树的某个位置。
1 | sudo mkdir -p /data |
/dev/sdX1 是占位符,/data 是示例挂载点。 操作前必须确认目标分区和挂载路径。
挂载之后,/data 目录就变成了那个文件系统的根目录。你往 /data 里写文件,实际上写到了 /dev/sdX1 这个分区上。
有一件事需要注意:如果 /data 目录原来有文件,挂载后那些文件会被”遮住”——不是删除,而是看不见了。卸载之后它们会重新出现。
检查挂载结果:
1 | df -Th /data |
示例输出:
1 | Filesystem Type Size Used Avail Use% Mounted on |
Type显示文件系统类型Size、Used、Avail显示空间使用情况Mounted on显示挂载点
或者用 findmnt:
1 | findmnt /data |
示例输出:
1 | TARGET SOURCE FSTYPE OPTIONS |
findmnt 能更清晰地展示挂载关系。也可以用 lsblk -f 看块设备、文件系统和挂载点的对应关系。
临时挂载和永久挂载
手动执行 mount 是临时挂载。它只在当前运行期间有效。重启之后,这个挂载关系不会自动恢复。
如果你希望开机后自动挂载,就需要把配置写入 /etc/fstab。
mount解决的是”现在能不能访问”。fstab解决的是”下次开机还要不要自动挂上”。
但在写 fstab 之前,有一个重要问题要先解决:用什么来标识设备。
为什么不要在 fstab 里写 /dev/sdb1
你可能觉得 fstab 里直接写 /dev/sdb1 最简单。但这是个坏习惯。
/dev/sdb1 这种名字依赖设备发现顺序。内核按检测顺序分配 sda、sdb、sdc。如果:
- 插拔了一块硬盘
- 调换了 SATA 线
- 虚拟机磁盘顺序变了
- 添加了新磁盘
那今天的 /dev/sdb1 下次启动可能就变成 /dev/sdc1 了。如果 fstab 里写的是 /dev/sdb1,系统可能会把错误的分区挂到 /data 上,或者挂载失败导致开机异常。
所以更推荐使用 UUID、LABEL、PARTUUID 或 PARTLABEL 来标识设备。
查看 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:文件系统标签。可以用
e2label、xfs_admin等工具设置。可以人工设置有意义的名字,但可能重复。 - PARTUUID:分区表里的分区 UUID。GPT 分区表支持。它不随文件系统改变——重新
mkfs之后 UUID 会变,但 PARTUUID 不变。 - PARTLABEL:GPT 分区名。在
parted或fdisk里可以设置。
设备名像座位号,可能变。
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 | UUID=xxxx /data ext4 defaults 0 2 |
逐列解释:
第一列:设备标识
可以是 /dev/sdX1、UUID=、LABEL=、PARTUUID=、PARTLABEL=。推荐用 UUID。
第二列:挂载点
文件系统要挂载到哪个目录。比如 /data、/mnt/disk1。这个目录必须事先存在。swap 分区这里写 none。
第三列:文件系统类型
比如 ext4、xfs、btrfs、vfat、swap。要和实际的文件系统类型一致。写错了会挂载失败。
第四列:挂载参数
逗号分隔的选项列表。最常见的写法是 defaults。
defaults 等于 rw,suid,dev,exec,auto,nouser,async。简单说就是:可读可写、允许 SUID、允许设备文件、允许执行、允许 mount -a 自动挂载、不允许普通用户挂载、异步 I/O。
几个常用的额外参数:
nofail:如果设备不存在,不报错,不影响开机。外置硬盘、非关键数据盘建议加上。noatime:不更新文件访问时间。能减少写入次数,对 SSD 有好处,也能略微提升性能。ro:只读挂载。
可以组合使用,比如 defaults,noatime 或 defaults,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 | findmnt /data |
如果 mount -a 失败了:
- 先看错误信息。通常是 UUID 写错、挂载点目录不存在、文件系统类型写错。
- 不要急着重启。
- 用之前备份的 fstab 恢复:
sudo cp /etc/fstab.bak /etc/fstab - 修正问题后重新测试。
远程服务器上改 fstab,尤其要谨慎。
最好保持一个不会断的 SSH 会话,确认mount -a没问题后再重启。
一个完整的新硬盘挂载流程
把前面所有步骤串起来。假设:
- 新硬盘已经用
parted或fdisk创建了一个 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 | df -Th /data |
确认文件系统类型、空间大小、挂载点都正确。
第六步:获取 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 | sudo mount -a |
如果没有报错,说明 fstab 配置正确。
到这里,这块盘才算真正变成了一个开机可自动挂载的数据目录。
1 | /dev/sdb 整块硬盘 |
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 -f 的 FSTYPE 列。如果 FSTYPE 是空的,说明还没有文件系统,不能直接挂载。
对错误的分区执行 mkfs
这是最危险的错误之一。mkfs 会覆盖目标分区的文件系统结构。执行前必须用 lsblk -f 确认目标设备。对系统盘执行 mkfs 可能直接导致系统无法启动。
以为挂载点就是硬盘
挂载点只是一个目录入口。没有挂载时,它就是个普通目录。挂载后,它才变成某个文件系统的入口。你看到的文件在文件系统里,不在目录本身。
挂载后原目录里的文件”不见了”
不是删除。新挂载的文件系统会”遮住”原来目录里的内容。卸载后会重新看到。这是正常的挂载行为。
fstab 里写 /dev/sdb1
设备名可能因为硬件变动、磁盘顺序变化而改变。更推荐 UUID。
fstab 写错后直接重启
应该先 mount -a 测试。写错 fstab 可能导致开机超时等待、进入 emergency mode。远程服务器上尤其危险——fstab 错误可能导致 SSH 连不上。
文件系统类型写错
比如实际是 XFS,fstab 里写成 ext4,会挂载失败。写 fstab 前用 lsblk -f 或 blkid 确认实际类型。
忘记创建挂载点目录
fstab 里的挂载点目录必须存在。如果写了一个不存在的目录,挂载会失败。但更常见的情况是:目录存在,但里面原来有文件——挂载后那些文件会被遮住。
总结:硬盘真正可用,需要走完整条链路
到这里,一块普通数据盘从分区到挂载的流程就完整了。
几个核心要点:
- 分区只是划出空间。文件系统才让空间能存文件。
mkfs创建文件系统,是高危操作。执行前必须确认目标设备。mount把文件系统接到 Linux 目录树。临时挂载重启后不会自动恢复。/etc/fstab让挂载在开机后自动生效。写错可能影响系统启动。- UUID 比
/dev/sdb1更适合写入 fstab。设备名可能变,UUID 更稳定。 - 改 fstab 后先
mount -a,不要直接重启。
1 | 整块硬盘:/dev/sdb |
这条链路的每一步都不能跳过,也不能搞反顺序。
在服务器和虚拟化环境里,我们经常还会看到 /dev/mapper、LVM、RAID、LUKS 这些东西。它们不是另一套规则,而是在这条链路中间又加了一层。后面可以再单独讲。
参考资料
- Linux man-pages: mkfs(8)
- Linux man-pages: mount(8)
- Linux man-pages: fstab(5)
- Linux man-pages: blkid(8)
- Linux man-pages: findmnt(8)
- Linux man-pages: mkswap(8)
- Linux Kernel Documentation: ext4
- Linux Kernel Documentation: Btrfs
- Arch Wiki: Fstab
- Arch Wiki: File systems
- Red Hat Documentation: Introduction to file systems
- 标题: 为什么有了分区还不能存文件?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 进行许可。