15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
08.10.2024

使用Linux中的`mkfs`命令:格式化磁盘和分区的完整指南

`mkfs`(创建文件系统)命令是用于将文件系统结构写入块设备的主要 Linux 工具——无论是原始磁盘、分区还是逻辑卷。它会初始化超级块、inode 表、块组以及日志结构,这些都是在向设备写入任何数据之前所必需的。

在操作任何磁盘之前,请务必了解:`mkfs` 是一项破坏性且不可逆的操作。它不仅仅是擦除分区表条目——它会覆盖磁盘上的关键元数据。即使短暂地对错误设备执行此操作,也会导致现有数据在不借助取证工具的情况下无法恢复。在每次执行前,请使用 `lsblk` 或 `blkid` 验证目标设备。

`mkfs` 的底层工作原理

当您执行 `mkfs -t ext4 /dev/sdb1` 时,内核并不是简单地像 Windows 那样”格式化”分区。该命令会调用相应的文件系统专用二进制文件(在本例中为 `mkfs.ext4`,实际上是带有 ext4 默认参数的 `mke2fs`),并执行以下操作:

  • 在固定块组偏移处写入超级块及其备份副本
  • 在所有块组中分配并初始化 inode 表
  • 创建块组描述符表
  • 初始化日志(适用于 ext4 和 XFS 等日志文件系统)
  • 写入根目录 inode(ext4 中为 inode 2)
  • 在文件系统上标记 UUID 以实现持久标识

这一区别在大型驱动器上尤为重要。对 4 TB 的 ext4 分区进行完整 inode 表初始化格式化可能需要数分钟。相比之下,XFS 将大部分此类工作推迟到运行时处理,使其 `mkfs.xfs` 几乎可以瞬间完成,与卷大小无关。

格式化前确认正确设备

切勿凭猜测确定设备名称。请使用以下工具将物理硬件映射到内核设备节点。

使用 `lsblk`

“`bash

lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINT

“`

示例输出:

“`

NAME SIZE FSTYPE LABEL UUID MOUNTPOINT

sda 100G

├─sda1 20G ext4 a1b2c3d4-… /

└─sda2 80G ext4 e5f6a7b8-… /home

sdb 500G

└─sdb1 500G

“`

空的 `FSTYPE` 字段确认 `/dev/sdb1` 没有现有文件系统——可以安全格式化。

使用 `blkid`

“`bash

sudo blkid /dev/sdb1

“`

如果命令没有返回任何输出,则该分区不包含任何可识别的文件系统签名。如果返回了类型,则表示您即将覆盖现有数据。

使用 `fdisk -l`

“`bash

sudo fdisk -l /dev/sdb

“`

这将显示分区边界、分区类型以及磁盘使用 MBR 还是 GPT。如果 `/dev/sdb` 显示根本没有分区表,您可能需要先使用 `fdisk`、`gdisk` 或 `parted` 对其进行分区,然后再运行 `mkfs`。

`mkfs` 核心语法与调用模式

标准语法为:

“`bash

mkfs -t <filesystem_type> [options] <device>

“`

然而,`mkfs` 本身只是一个轻量级封装器。每种文件系统类型都有其专用的二进制文件:

`mkfs` 别名底层二进制文件文件系统
`mkfs.ext4``mke2fs`第四扩展文件系统
`mkfs.xfs``mkfs.xfs`XFS
`mkfs.btrfs``mkfs.btrfs`B 树文件系统
`mkfs.vfat``mkdosfs`FAT16/FAT32
`mkfs.exfat``mkfs.exfat`exFAT
`mkfs.ntfs``mkntfs`NTFS
`mkfs.f2fs``mkfs.f2fs`闪存友好文件系统

调用 `mkfs -t ext4` 与直接调用 `mkfs.ext4` 在功能上完全相同——前者只是解析为后者。在生产脚本中,建议使用明确的别名(`mkfs.ext4`)以使意图清晰无歧义。

文件系统类型选择:技术对比

为工作负载选择错误的文件系统是一个常见且代价高昂的错误。下表将文件系统特性与实际使用场景进行了对应。

文件系统最大卷大小最大文件大小日志最佳使用场景跨操作系统支持
**ext4**1 EiB16 TiB是(有序/回写)通用 Linux 根卷和数据卷Linux 原生;在 macOS/Windows 上通过驱动程序只读
**XFS**8 EiB8 EiB是(默认仅元数据)大文件、数据库、高吞吐量存储、NFS 导出Linux 原生
**Btrfs**16 EiB16 EiBCoW(无传统日志)快照、RAID、子卷、NAS 工作负载Linux 原生
**vFAT/FAT32**2 TiB4 GiBUSB 驱动器、EFI 系统分区(ESP)、跨操作系统可移动媒体通用
**exFAT**128 PiB16 EiBFAT32 文件大小限制成为约束时的大型可移动媒体通用(现代操作系统)
**NTFS**256 TiB256 TiB双启动 Windows 数据分区Windows 原生;通过 `ntfs-3g` 在 Linux 上完全支持
**F2FS**16 TiB3.94 TiB日志结构SSD、eMMC、SD 卡、Android 内部存储Linux 原生

关键边缘情况——EFI 系统分区:ESP 必须格式化为 `vfat`(具体为 FAT32)。在此处使用任何其他文件系统都将导致 UEFI 固件无法找到引导加载程序。请始终使用以下命令格式化 ESP:

“`bash

sudo mkfs.vfat -F 32 /dev/sda1

“`

`-F 32` 标志明确强制使用 FAT32 而非 FAT16,这对于大于 32 MiB 的 ESP 分区至关重要。

实用 `mkfs` 示例与生产级选项

示例 1:创建带调优参数的 ext4 文件系统

“`bash

sudo mkfs.ext4 -L "data_vol" -m 1 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb1

“`

各标志的作用:

  • `-L "data_vol"` — 分配持久标签,允许 `/etc/fstab` 条目使用 `LABEL=data_vol` 而非原始设备路径(在设备枚举顺序可能发生变化的系统上更安全)
  • `-m 1` — 将保留块百分比从默认的 5% 降低至 1%;在 2 TB 数据卷上,默认设置会浪费约 100 GB 仅 root 用户可用的空间
  • `-E lazy_itable_init=0,lazy_journal_init=0` — 强制在格式化时完整初始化 inode 表,而非推迟到后台 I/O;对于生产服务器至关重要,因为后台初始化可能在部署数小时后引发意外的 I/O 峰值

示例 2:为数据库服务器创建 XFS 文件系统

“`bash

sudo mkfs.xfs -L "pg_data" -f /dev/sdb1

“`

  • `-f` — 即使检测到现有文件系统签名也强制创建;仅在确认设备可被覆盖时使用
  • XFS 不支持缩小;在格式化前请仔细规划卷大小

对于 XFS 上的 PostgreSQL 或 MySQL 工作负载,还应在 `/etc/fstab` 中设置挂载选项 `noatime`,以消除每次读操作时 inode 访问时间的写入开销。

示例 3:跨两个设备创建 RAID-1 Btrfs 文件系统

“`bash

sudo mkfs.btrfs -L "btrfs_mirror" -d raid1 -m raid1 /dev/sdb /dev/sdc

“`

Btrfs 可以原生跨多个块设备。`-d raid1` 镜像数据;`-m raid1` 镜像元数据。对于同时需要快照和子卷功能的环境,这是 mdadm 软件 RAID 的合理替代方案。

示例 4:为 USB 驱动器创建 vFAT 文件系统

“`bash

sudo mkfs.vfat -F 32 -n "BACKUP_USB" /dev/sdc1

“`

  • `-n "BACKUP_USB"` — 设置卷标(FAT32 标签限制为 11 个字符,大写)
  • `-F 32` — 明确选择 FAT32 而非 FAT16

示例 5:在 SSD 上创建 F2FS 文件系统

“`bash

sudo mkfs.f2fs -l "ssd_cache" /dev/sdb1

“`

F2FS 专为 NAND 闪存存储设计。它在文件系统层面减少写入放大并管理磨损均衡。在以 NVMe 存储为后端的 VPS 托管实例上,F2FS 在高写入频率的临时缓存卷上可优于 ext4。

无分区表时直接格式化整个磁盘

在特定场景下——LVM 物理卷、Ceph OSD 或单用途存储设备——您可能需要直接将文件系统写入整个磁盘而非分区:

“`bash

sudo mkfs.ext4 /dev/sdb

“`

适用场景:

  • 磁盘专用于单一用途,不需要分区灵活性
  • 您正在为 LVM 准备磁盘(`pvcreate` 处理方式不同,但概念类似)
  • 您正在创建回环文件系统镜像

不适用场景:

  • 任何需要启动的磁盘(需要带启动标志的分区表)
  • 在多个文件系统或操作系统之间共享的磁盘
  • udev 规则或云基础设施工具期望存在分区表的系统上的磁盘

挂载已格式化分区并使其持久化

格式化创建文件系统;挂载使其可访问。在 `/etc/fstab` 中始终使用基于 UUID 的引用而非设备名称,因为在具有多个磁盘或热插拔存储的系统上,设备名称(`/dev/sdb1`)在重启后不能保证稳定。

“`bash

Create the mount point

sudo mkdir -p /mnt/data_vol

Mount temporarily to verify

sudo mount /dev/sdb1 /mnt/data_vol

Retrieve the UUID

sudo blkid /dev/sdb1

Output: /dev/sdb1: LABEL="data_vol" UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

Add a persistent, UUID-based fstab entry

echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data_vol ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab

Validate the fstab entry without rebooting

sudo mount -a

“`

fstab 条目末尾的 `0 2` 控制 `dump`(备份工具,设为 0 禁用)和 `fsck` 检查顺序(2 表示在根文件系统之后检查;根文件系统应为 1)。

格式化后验证文件系统完整性

不要在未经验证的情况下假设格式化已成功。

“`bash

Check filesystem type, label, and UUID

lsblk -f /dev/sdb1

For ext4: run e2fsck in read-only check mode

sudo e2fsck -n /dev/sdb1

For XFS: verify the filesystem structure

sudo xfs_repair -n /dev/sdb1

Check available space after mounting

df -hT /mnt/data_vol

“`

`e2fsck` 和 `xfs_repair` 上的 `-n` 标志执行干运行检查而不修改文件系统。这可以安全地在已挂载的文件系统上运行以进行诊断,但完整修复需要先卸载。

高级选项参考

选项适用于效果
`-L <label>`所有分配人类可读的文件系统标签
`-b <block_size>`ext4、XFS设置块大小(512、1024、2048、4096 字节);较大的块可提高大文件吞吐量,但对小文件会浪费空间
`-m <percent>`ext4为 root 保留的块百分比(默认 5%);在大型数据卷上降至 1% 以回收可用空间
`-i <bytes-per-inode>`ext4控制 inode 密度;对于存储数百万小文件的文件系统可降低此值
`-N <inode-count>`ext4设置明确的 inode 数量;在已知预期文件数量时有用
`-E lazy_itable_init=0`ext4禁用延迟 inode 初始化;格式化速度较慢,但消除部署后的后台 I/O
`-f`XFS即使存在文件系统签名也强制格式化
`-d su=,sw=`XFS为 RAID 对齐 I/O 配置条带单元和宽度
`-F 32`vFAT强制使用 FAT32(而非 FAT16)
`-q`ext4静默模式;抑制进度输出(在脚本中有用)

常见陷阱及规避方法

格式化已挂载的文件系统:Linux 并不总是会阻止此操作。在已挂载的分区上运行 `mkfs` 会立即损坏文件系统,并可能导致内核崩溃。在继续操作前,请始终使用 `mount | grep /dev/sdb1` 验证挂载状态。

ext4 上的 inode 耗尽:如果您在将存储数百万个小文件(邮件假脱机、会话缓存)的卷上设置了较大的块大小(例如 4096 字节),您将在磁盘空间耗尽之前先耗尽 inode。使用 `-i 4096` 或 `-i 2048` 来增加 inode 密度。这在电子邮件托管服务器和存储每会话文件的高流量 Web 服务器上尤为常见。

XFS 与缩小:XFS 卷在创建后无法缩小。如果您格式化了一个 2 TB 的 XFS 卷,后来需要回收空间,唯一的选择是备份、重新格式化和恢复。请保守规划 XFS 卷大小,或在其下方使用 LVM 精简配置。

RAID 和 SSD 的条带对齐:在 RAID 阵列或 SSD 上格式化时不指定条带对齐会导致 I/O 未对齐,显著降低性能。对于条带为 512 KB、4 块磁盘的 RAID-5 阵列:

“`bash

sudo mkfs.ext4 -E stride=128,stripe-width=384 /dev/md0

“`

其中 `stride = stripe_size / block_size` 且 `stripe-width = stride * (data_disks)`。

磁盘克隆后的 UUID 冲突:使用 `dd` 克隆磁盘会复制文件系统 UUID。两个具有相同 UUID 的设备会导致挂载失败和数据损坏。克隆后,请重新生成 UUID:

“`bash

sudo tune2fs -U random /dev/sdb1 # ext4

sudo xfs_admin -U generate /dev/sdb1 # XFS

“`

在从磁盘镜像部署独立服务器或从单一模板配置多个节点时,这是一个关键注意事项。

VPS 和云环境的文件系统注意事项

在虚拟机和云实例上,底层存储通常是由分布式存储系统支持的精简配置虚拟磁盘。在此上下文中,若干 `mkfs` 决策的影响更为显著:

  • Discard/TRIM 支持:使用 `-E discard` 格式化 ext4,或添加 `discard` 挂载选项以启用在线 TRIM,这将把释放的块返还给底层存储池,并在以 SSD 为后端的带 cPanel 的 VPS 实例上长期维持性能。
  • 日志模式:对于延迟敏感型应用,可考虑在 `/etc/fstab` 中为 ext4 使用 `data=writeback` 日志模式。这以牺牲严格的数据排序换取更低的写入延迟,对于管理自身预写日志的数据库是可接受的。
  • 避免将交换空间格式化为文件系统:交换分区使用 `mkswap`,而非 `mkfs`。在交换分区上运行 `mkfs` 会销毁交换签名,而不会创建可用的文件系统。

VPS 控制面板上管理存储时,附加磁盘卷通常以未格式化的块设备形式出现。工作流程始终为:使用 `lsblk` 识别,如需要则使用 `fdisk`/`gdisk` 分区,使用 `mkfs` 格式化,挂载,并在 `/etc/fstab` 中持久化。

决策矩阵:选择合适的文件系统

使用此矩阵根据您的主要约束条件选择文件系统:

主要需求推荐文件系统避免使用
通用 Linux 服务器ext4Btrfs(复杂性开销)
大文件、数据库、NFSXFSFAT32(无权限)
快照、子卷、NASBtrfsext4(无原生快照)
跨操作系统 USB/可移动媒体exFAT 或 FAT32ext4(Windows 支持差)
EFI 系统分区FAT32(`mkfs.vfat -F 32`)任何非 FAT 格式
NVMe SSD、高写入频率F2FS 或 XFSFAT32
双启动 Windows 数据卷NTFSext4
数百万小文件带 `-i 2048` 的 ext4XFS(固定 inode 数量)

技术要点检查清单

在任何环境中运行 `mkfs` 之前,请完成以下检查清单:

  • 使用 `lsblk -f` 和 `blkid` 确认目标设备——切勿依赖记忆或假设
  • 使用 `umount /dev/sdXN` 卸载目标并使用 `mount | grep sdX` 验证
  • 备份设备上的所有数据;`mkfs` 不可逆
  • 根据工作负载选择文件系统类型(参见上方决策矩阵),而非习惯
  • 使用 `-L` 设置文件系统标签,以便在日志和 `fstab` 中进行人类可读的标识
  • 在大型数据卷上减少保留块(ext4 使用 `-m 1`)以回收可用空间
  • 在生产服务器上禁用延迟初始化(`-E lazy_itable_init=0`)以防止部署后的 I/O 峰值
  • 在 `/etc/fstab` 中使用 UUID而非设备名称,以实现挂载持久化
  • 编辑 `/etc/fstab` 后使用 `mount -a` 验证,以在重启前捕获错误
  • 格式化后运行 `e2fsck -n` 或 `xfs_repair -n`以确认文件系统完整性
  • 对从模板镜像克隆的任何磁盘重新生成 UUID

常见问题

问:我可以在当前已挂载的分区上运行 `mkfs` 吗?

答:从技术上讲,内核可能允许此操作,但这样做会立即损坏文件系统,并可能触发内核崩溃或数据丢失。请始终先卸载分区,并在运行 `mkfs` 前使用 `mount | grep <device>` 确认。

问:`mkfs.ext4` 和 `mke2fs` 有什么区别?

答:`mkfs.ext4` 是一个符号链接或封装器,它以 `-t ext4` 默认参数调用 `mke2fs`。两者在功能上完全相同。`mke2fs` 是规范工具,接受完整的 ext2/ext3/ext4 创建选项。

问:为什么格式化大型 ext4 分区比 XFS 花费更长时间?

答:ext4 在格式化时会为每个块组初始化 inode 表(除非设置了 `lazy_itable_init=1`)。在 4 TB 卷上,这涉及写入数 GB 的归零 inode 表数据。XFS 将结构初始化推迟到运行时,使 `mkfs.xfs` 无论卷大小如何都能在数秒内完成。

问:如何在不重新格式化的情况下更改格式化后的文件系统标签?

答:对于 ext4,使用 `sudo tune2fs -L "NewLabel" /dev/sdb1`。对于 XFS,使用 `sudo xfs_admin -L "NewLabel" /dev/sdb1`。对于 FAT32,使用 `sudo fatlabel /dev/sdb1 NEWLABEL`。重新标记不会影响任何数据。

问:在 LVM 逻辑卷上使用 `mkfs` 安全吗?

答:是的。LVM 逻辑卷以块设备形式出现(例如 `/dev/mapper/vg0-lv_data` 或 `/dev/vg0/lv_data`),`mkfs` 将其视为与物理分区完全相同。这是生产 Linux 存储的标准工作流程:使用 `lvcreate` 创建逻辑卷,使用 `mkfs` 格式化,挂载,并在 `/etc/fstab` 中持久化。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用