ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux硬盘格式化实战指南:分区表、文件系统与避坑攻略

Linux硬盘格式化实战指南:分区表、文件系统与避坑攻略

开头就先不客套了。搞 Linux 硬盘格式化这事,说难不难,但翻车的人是真不少。有人把整块盘格成了半残废,有人分区之后系统不认,还有人明明格式化了数据却还在那儿占着空间。这篇文章就专门聊透这个话题:什么时候需要格式化、怎么识别你要动的到底是哪块盘、分区表和文件系统怎么选、命令怎么敲,以及那些文档里根本不会写的坑。不管你是刚入门的运维新手,还是想把自己的移动硬盘、U盘、虚拟机磁盘彻底整理一遍,照着这篇文章的思路来,基本不会再踩雷。

1. 先搞明白:格式化到底在做什么

很多初学者一上来就敲mkfs,但根本没搞懂这命令背后发生了什么。我把它拆成最简单的一句话:格式化就是给硬盘“排版”,让它从一个只能写原始字节的空白状态,变成一种能被操作系统读懂、能按文件来存取的结构。

硬盘本身只是一堆磁性介质(或者闪存颗粒),存储数据的最小单位叫扇区(sector),机械盘一般是 512 字节或 4K 逻辑扇区,固态盘也差不多。问题是,如果没有任何结构,系统根本不知道哪个扇区存了什么文件、文件在哪里结束、哪个空间是空着的。所以我们需要一个“目录系统”,这就是文件系统(filesystem)干的事情。

1.1 分区表和文件系统,一次说清楚

这里有两个概念特别容易混,一个是分区表,一个是文件系统。打个比方:分区表好比给一本书做章节划分,指定了哪几页是第一章、哪几页是第二章;文件系统则是每一章内部的内容排版规则,比如标题用几号字、段落怎么换行。

实际操作中,你既可能只需要做“分区”,也可能只需要做“格式化文件系统”,也可能两者都要。一块全新的硬盘通常完全没有分区表,第一步是给它创建分区表(MBR 或 GPT),第二步是划分出至少一个分区,第三步才是在分区上写入文件系统。这三步做完了,系统才能挂载使用。

还有一个必须分清的区别:格式化不是清空数据。mkfs默认只建立文件系统元数据(超级块、inode 表、目录项等),它并不会把整个硬盘都写一遍零或者 0xFF。也就是说,格式化之后,原本的数据“理论上”还有一部分残留在存储介质上,只是文件系统层面已经不认识它们了。如果你是为了彻底抹除敏感数据,单纯mkfs是不够的,还得用dd 写零或者shred之类的工具覆盖,这一点后文会专门讲。

1.2 搞清楚什么时候才需要格式化

不是所有“硬盘有问题”都需要格式化。我遇到过几次求助,其实盘根本没坏,只是没挂载。所以我建议先分清场景:

  • 新买的硬盘或新加的虚拟磁盘,第一次接入系统 —— 需要分区 + 格式化,然后挂载。
  • 想更换文件系统类型,比如从 ext4 换成 xfs —— 需要重新格式化。
  • 盘上全是乱码、文件系统损坏严重、fsck修不回来 —— 才考虑格式化救急。
  • 只是挂载不上,dmesg显示设备正常 —— 大概率是/etc/fstab写错了,不需要格式化。
  • 目录突然满了,想“彻底清理垃圾” —— 不该格式化,应该删除文件,或者做分区扩容。

我见过有人把/dev/sdb整块盘直接mkfs.ext4,结果没有分区表,Windows 插上去不认,Linux 下容量也显示不对,最后还是要重新分区。这个操作不是不行,但只适用于特别简单的场景(比如某些嵌入式设备、U盘),普通数据盘不建议绕过分区直接格。

2. 格式化前最重要的准备:识别硬盘

这一步看起来多余,其实是最容易踩大坑的地方。我见证过不止一次因为看错盘符,把本来要格式化的 U 盘,变成格式化掉了系统盘或者是数据盘的悲剧。Linux 设备名是动态分配的,/dev/sda、/dev/sdb并不是永远对应固定的物理硬盘。你插拔一块 U 盘,或者 BIOS 里启动了不同的硬盘,设备名就可能交叉换位。

所以在格式化之前,一定要用工具确认:你即将操作的这块/dev/sdX,到底是不是你心里想的那块盘。

2.1 先用 lsblk 看物理拓扑

我第一个推荐的是lsblk,它把块设备按“物理连接”的层次列出来,一眼就能看出整块盘和分区的从属关系,还能看到容量、挂载点。比如:

lsblk

输出可能长这样:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 100G 0 part / └─sda3 8:3 0 365.3G 0 part /data sdb 8:16 0 1.8T 0 disk └─sdb1 8:17 0 1.8T 0 part /mnt/backup

如果看到sdb下面没有挂载点,说明它可能是一块还没有启用的盘。如果它是一个全新的空盘,通常是没有任何分区的,就显示成一个孤零零的disk项,比如:

sdc 8:32 0 931.5G 0 disk

这种最安全也最容易处理,你只需要对它做全流程操作。但这里就要特别注意了:万一sdc其实不是新盘,而是一块有数据但分区表没有被识别的盘,那lsblk也看不出来是否有数据,需要配合下一步继续确认。

2.2 用 blkid 和 fdisk 交叉验证

blkid能显示分区的 UUID 和文件系统类型,对于“我这块盘之前是不是已经格过了”很有用:

sudo blkid

如果一块盘有分区且已经有文件系统,这里会显示TYPE="ext4"、UUID="..."这种信息。如果一块盘没有任何输出,说明它大概率是新盘或者分区表已经丢失。

fdisk -l则能看到更底层的细节,包括磁盘扇区大小、总容量、分区表类型:

sudo fdisk -l /dev/sdc

输出里能看到Disk model和序列号之类的信息,比如WDC WD10EZEX、KINGSTON之类的。拿到这些信息,再和你物理上插的是哪块硬盘对照一遍,就能极大避免格错盘。

再教一个我常用的对照方法:看/dev/disk/by-id/目录。Linux 会为每个磁盘生成基于厂商型号和序列号的持久化链接:

ls -l /dev/disk/by-id/

你会看到形如ata-WDC_WD10EZEX-08M2NA0_WD-WCC6Y...这样的名字,它指向/dev/sdc或/dev/sdd。用这个方式识别物理盘最可靠,因为设备名可能变,但序列号不会变。

2.3 用 df -h 排除“已挂载”的误区

df -h只能看到已经挂载的文件系统,看不到未挂载的新盘。所以如果一个人说“我怎么找不到我的新硬盘”,你先别急着让他格式化,先lsblk看有没有这个设备。如果设备存在但是没有挂载点,那就不需要格式化,只需要挂载。

如果设备名还存在但之前已经格式化过有数据,结果lsblk下看不到容量?那就可能是驱动没加载、线缆松动、虚拟机里没添加磁盘,或者是硬件故障了。这个时候去格式化反而会让问题更严重。

3. 从分区到格式化,一步步教你动手

等确认无误,我们就可以开始操作了。我用一块全新的/dev/sdc(虚拟容量 1TB)作为示例,从头到尾走一遍标准流程。前提是确认这块盘没有数据、没有挂载点。

3.1 创建分区表:MBR 还是 GPT?

如果磁盘容量超过 2TB,或者你的主板支持 UEFI 启动,建议直接用 GPT。MBR 是老一代分区表,最多支持 2TB 容量(严格来说是 2TiB 左右),而且最多只有 4 个主分区,扩展分区的限制也让人头大。现在新买的盘基本都是空盘,直接创建 GPT 是更省事的选择。

用fdisk创建 GPT 分区表:

sudo fdisk /dev/sdc

进入交互界面后输入:

g # 创建 GPT 分区表 n # 新建分区 (按提示直接回车使用默认分区号 1) (按提示直接回车使用默认起始扇区) (按提示直接回车使用默认结束扇区,也就是整块盘) p # 打印看看分区情况 w # 写入并退出

如果想用传统 MBR,把第一条g换成o即可。不过我还是那句话:没有特殊兼容需求,一律 GPT。

分区建好之后,/dev/sdc1就出现了。但此时它还只有“章节”,没有“正文排版”,接下来才是真正的格式化。

3.2 文件系统怎么选:ext4、xfs、btrfs,还是 exFAT?

这个选择直接影响你的使用体验,很多新手在这里凭感觉选。我按实际需求给大家一个参考:

文件系统适用场景特点
ext4绝大多数 Linux 数据盘、系统盘成熟稳定,兼容性强,小文件性能不错,易修复
xfs大文件、大容量存储、数据库备份高并发写入性能好,扩容能力优秀,但缩容很麻烦
btrfs需要快照、子卷、校验和的场景功能丰富但复杂度高,对掉电、异常关机比 ext4 更敏感
exFAT移动硬盘、U 盘,需要在 Windows/macOS 之间互通无单文件 4GB 限制,兼容性好,但没有 Linux 日志特性
swap交换分区专用不是普通数据文件系统,用 mkswap 而不是 mkfs

我的建议很简单:普通用户、单机数据盘,直接无脑用 ext4。存储服务器或者大量媒体文件场景,考虑 xfs。要在 Win/Mac 和 Linux 之间反复插拔的 U 盘或移动硬盘,直接用 exFAT。如果你不确定自己要不要 btrfs 的快照,那就不需要 btrfs。

3.3 执行格式化:mkfs 命令细节和常用参数

现在给/dev/sdc1格式化成 ext4:

sudo mkfs.ext4 /dev/sdc1

这样格式化出来的文件系统,默认会保留 5% 的空间给 root 用户和系统维护用。对于 500GB 以上的大容量数据盘,5% 就是 25GB 起步,说实话有点浪费。数据盘上并不需要那么多预留空间,我通常会在格式化时直接指定预留比例为 0,或者减到 1%:

sudo mkfs.ext4 -m 0 /dev/sdc1

但要注意,如果你这块盘是系统根分区/,千万别设成 0,不然磁盘满的时候系统连日志都写不了,容易出现各种奇奇怪怪的人为问题。我建议根分区保留默认 5%,数据盘再设 0。

另外还可以加上卷标(LABEL),方便以后用卷标识别:

sudo mkfs.ext4 -L DATA01 -m 0 /dev/sdc1

这样以后用lsblk -f就能直接看到LABEL="DATA01",比记一串设备名直观多了。

如果是机械硬盘,格式化大容量盘可能要等一会儿,可以加上进度显示参数,避免干等不知道它在做什么:

sudo mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdc1

这样会把 inode 表的初始化同步完成,虽然格式化时间变长,但后续第一次挂载时不会再有“后台初始化”导致的卡顿。对 SSD 或虚拟机磁盘来说,这个优化不明显;对超大容量机械盘,我反而倾向于采用这个参数,因为同步初始化完之后用起来更安心。

如果你要格式化成 xfs,和老朋友说一句就明白了,xfs 没有-m预留空间这回事,直接:

sudo mkfs.xfs -f /dev/sdc1

-f是强制覆盖已有文件系统的选项,如果有旧文件系统不覆盖会报错。格式化 exFAT 则需要先安装工具,以 Debian 系发行版为例:

sudo apt install exfatprogs sudo mkfs.exfat /dev/sdc1

3.4 分区表写入后没看到设备?

有时候分区创建完,执行lsblk却看不到新分区/dev/sdc1,这通常是因为内核还没重新读取分区表。在物理机上比较常见,虚拟机也会遇到。这时候用partprobe强制内核重新读取:

sudo partprobe /dev/sdc

或者更干脆:

sudo udevadm settle

如果还不行,可能是/dev/sdc1名称没生成,等一两秒再跑一次lsblk就好。

4. 挂载与开机自动挂载,让硬盘真正可用

格式化完成不代表盘就“能用”了。在 Linux 世界里,一个文件系统必须先挂载到一个目录上,系统才能通过这个目录访问里面的文件。这个挂载点是理解 Linux 文件系统树的关键,和 Windows 下每个盘一个盘符的思路完全不同。

4.1 手动挂载和目录规范

先创建挂载点目录,我推荐统一放在/data下:

sudo mkdir -p /data sudo mount /dev/sdc1 /data

挂载后用df -h检查:

df -h /data

如果显示出了/dev/sdc1和对应容量、挂载点,那就成功了。这时候你就可以往里读写文件了:

echo "hello" > /data/test.txt

需要卸载的时候用:

sudo umount /data

这里有个细节:卸载失败提示target is busy,说明有进程正在使用该目录里的文件。用lsof或fuser查一下是哪个进程,别硬umount -l。umount -l是 lazy 卸载,虽然能强制卸掉,但可能导致进程后续读写异常,甚至文件系统损坏,能不用就不用。

4.2 fstab 开机自动挂载全解析

手动挂载只对当前开机有效,重启后就没了。想让每次开机自动挂载,需要修改/etc/fstab。

先用blkid拿到分区的 UUID:

sudo blkid /dev/sdc1

输出类似:

/dev/sdc1: UUID="a1b2c3d4-..." TYPE="ext4" LABEL="DATA01"

然后编辑/etc/fstab:

sudo nano /etc/fstab

添加一行:

UUID=a1b2c3d4-... /data ext4 defaults,noatime 0 2

这六列分别说明一下,很多人在这里翻车:

第一列是设备标识,强烈建议用 UUID 而不是/dev/sdc1,因为设备名会变,UUID 几乎不会变;第二列是挂载点;第三列是文件系统类型;第四列是挂载参数,defaults代表读写的常规参数,noatime表示不更新访问时间,对 SSD 和数据库类负载能明显减少不必要的写入;第五列dump填写 0 表示不使用 dump 备份;第六列fsck顺序,0 表示开机不检查,根分区一般填 1,其他普通数据分区填 2。

改完先别急着重启,先验证一下语法是否正确:

sudo mount -a

如果没有任何报错,说明 fstab 没问题。如果有报错,它会把显示错误的行和挂载点信息打出来,这时候千万别直接重启,否则会进入紧急维护模式。

还有一个零基础容易犯的错误:swap 分区在 fstab 里的第三列类型要写成swap,而不是ext4,四列内容可以写sw,或defaults,第五、六列写0 0。

5. 实操作业中最常见的坑,逐个帮你排掉

这个章节我把工作中真实见过的错误和问题按频率排序,每个都给了排查思路,可以当速查表用。

5.1 格式化时提示“Device or resource busy”

这个提示百分百说明设备正在被占用,可能原因包括:分区已经被挂载了、有进程正在读写、设备被 LVM 或软件 RAID 占用。先跑:

lsblk mount | grep sdc sudo fuser -vm /dev/sdc*

如果看到了挂载点,先卸载再操作。如果没有挂载点,就检查是不是有某个进程正在使用,比如某个虚拟机镜像文件就放在这块盘上。你要是着急,直接fuser -k /dev/sdc1把占用进程杀掉,属于粗鲁但有效的手段,生产环境慎用。

5.2 整块盘“格式化”了,但系统显示不了正常容量

我见过太多次这种操作:直接在/dev/sdb而不是/dev/sdb1上执行mkfs.ext4。对于 U 盘或者某些特殊设备,这么干也许能凑合,但对真正的硬盘会有两个问题:一是没有分区表,很多工具和 BIOS 不识别;二是 Windows 系统根本不认这种没有分区的文件系统。更严重的是,某些主板的“快速启动”功能或者外接 USB 硬盘盒会把这种情况识别为异常。

正确做法永远是先分区,再格式化分区,也就是把文件系统写在/dev/sdb1(或对应分区)上,而不是整个盘上。

5.3 格式化后文件还在?

前面说过,mkfs并不会全盘清零。如果原来的文件系统损坏严重,重新格式化后某些残留目录项还显示有数据,或者用恢复工具还能看到以前的文件,这都是正常的。如果你要的是干净的神清气爽的新盘,用下面命令把整块盘写一遍零,注意这会彻底毁掉所有数据,务必三思:

sudo dd if=/dev/zero of=/dev/sdc bs=4M status=progress

这个操作要花很长时间,容量越大越久。如果是固态硬盘,重度全盘覆写还会消耗寿命,不是必要的敏感数据清理场景,不建议频繁做。

如果你想快速安全地“清空盘”,也可以只删除分区表,让系统认为这是一块全新磁盘:

sudo wipefs -af /dev/sdc

wipefs会擦除文件系统签名、分区表签名、GPT 备份头等各种标签,比纯格式化更彻底,但速度比dd 写零快得多。对于要重做分区表的盘,我特别推荐。

5.4 容量显示“不对”,少了几个 GB

新买的 4TB 盘,lsblk可能显示 3.64T,很多人以为被骗了。其实这是厂商的 4TB 是按十进制(4,000,000,000,000 字节)算的,而 Linux 默认显示的单位是 TiB(Tebibyte,按 1024 的 4 次方计算)。这个差距是正常的,不是格式化产生的损耗。

另外,mkfs.ext4的-m 0如果没有设置,默认预留 5% 空间,也会让df -h看到的可用空间继续缩水。所以前面建议数据盘设成-m 0,就是不想让“降智”的空间损耗发生。

5.5 虚拟机扩容新磁盘后怎么处理?

云服务器或本地虚拟机加了一块新虚拟硬盘后,通常没有分区表,也没有文件系统,就是一块完整的裸设备。此时按照上面的标准流程走:分区(GPT)、格式化(ext4/xfs)、挂载即可。

如果是在现有虚拟机的数据盘上扩容,比如原来 100G 扩到 200G,这时候需要操作的是分区扩容和文件系统扩建,而不是重新格式化。重新格式化会把原数据毁掉。具体扩容步骤是:确认新容量lsblk,用fdisk调整分区大小(或者parted resizepart),最后用resize2fs或xfs_growfs让文件系统认到新空间。千万别在分区和数据还在的时候对整盘执行mkfs。

这个点我专门提一句,因为我收到过两次“扩容后没空间”的求助,细看发现是直接在扩容后的盘上又格式化了一遍,整个数据盘清空了,惨不忍睹。

5.6 挂载目录权限不对,普通用户写不进去

如果你希望普通用户(比如你自己日常登录的账户)能直接往/data里写文件,挂载完之后还要调整属主或权限:

sudo chown -R 你的用户名:你的用户组 /data

或者如果想保持整个团队都能读写,可以在/etc/fstab的挂载参数里加uid=1000,gid=1000,新手我建议直接chown更直观。还有一点要注意:由于fstab里指定的挂载选项会覆盖命令行的默认设置,如果之前手动挂载时能写、重启后突然不能写了,先检查是不是/etc/fstab里少了什么细微选项。

6. 一些实用的周边操作技巧

格式化只是硬盘生命周期里的一个环节。在做格式化前后,有几个习惯性的动作非常有用,长期坚持能避不少雷。

6.1 格式化之前的备份意识

格式化必然会破坏原有数据,这一点再怎么强调都不过分。在动任何盘之前,先想三遍:这块盘里有没有你三年没打开、但某天突然会要的照片、代码、合同?如果有,先备份到另一块盘上,或者至少把关键目录拷贝走。已经格式化的盘,恢复成本非常高,而且没有人能保证 100% 恢复。

备份命令最简单的:

rsync -av /源目录/ /目标目录/

-a归档模式保留权限和时间戳,-v显示过程。首次备份可能耗时很长,但一劳永逸。真的想要保险,就 3-2-1 原则:三份数据、两种介质、一份异地。

6.2 用 smartctl 提前观察硬盘健康状态

在格式化一块旧盘之前,建议先用smartctl看一眼健康状态,因为有些“该丢的数据”本来就该丢,有些盘是物理坏道,格式化也救不了:

sudo apt install smartmontools sudo smartctl -a /dev/sdc

重点关注Reallocated_Sector_Ct(重映射扇区计数)、Current_Pending_Sector(当前待定扇区)、UDMA_CRC_Error_Count等几个关键指标。如果这些数值已经比较大,说明盘有物理损伤,格式化之后它还会坏,不值得复用。

6.3 坏道扫描的必要性

如果怀疑机械盘有物理坏道,可以用:

sudo badblocks -sv /dev/sdc

这个命令不会破坏数据,只是只读扫描,但耗时极长,1TB 的机械盘可能跑几十个小时。时间允许的前提下,新盘做完分区、在格式化之前先扫一遍是最稳妥的。我自己的习惯是,新盘到手先badblocks扫一遍,确认没坏道再写入文件系统。如果是在线服务器,就别这么干了,太耽误事。

扫描完如果发现坏道不多,可以用fsck加-c参数让文件系统尝试把这些坏块标记出来避开:

sudo fsck.ext4 -c /dev/sdc1

注意fsck要在分区挂载前运行,别在挂载状态下硬跑。

6.4 格式化后如何验证:写入回读一把梭

格式化加挂载之后,我的习惯是写个测试文件验证整条链路通不通:

sudo dd if=/dev/zero of=/data/test.bin bs=1M count=1024 sudo sync sudo dd if=/data/test.bin of=/dev/null bs=1M count=1024

先写入一个 1GB 的测试文件,sync确保数据落盘,再从头读一遍。如果读出来都没问题,说明文件系统工作正常。测完记得:

sudo rm /data/test.bin

这里吐槽一句,很多新手格式化完就忘了卸载、忘了删测试文件,发个帖子问“为什么我的盘可用的地方少了 1GB”,这种问题其实自己排查也能想到。

7. 按场景整理一份速查清单

为了方便读者直接抄作业,我把上面讲过的东西压缩成一个场景化速查表,覆盖常见需求。

场景推荐方案关键命令
新硬盘作为 Linux 数据盘GPT 分区 + ext4fdisk建分区;mkfs.ext4 -m 0
大容量存储服务器GPT 分区 + xfsmkfs.xfs
U 盘 / 移动硬盘跨平台单个分区 + exFATmkfs.exfat
系统盘重装后清空直接全盘重分区wipefs -af后重新分区
交换空间建 swap 分区mkswap+swapon
虚拟机新虚拟磁盘标准 GPT + ext4同上标准流程
只需清空盘,不恢复文件系统擦除分区表wipefs -af /dev/sdX
彻底销毁所有数据全盘覆写dd if=/dev/zero of=/dev/sdX

这个表不是万能的,但它覆盖了 90% 的日常场景。当你拿不准时,回来看一眼,先在脑子里过一遍“我是哪一行”,再动手。

8. 最后分享我们操作时的习惯

平时操作时,我还有三个固定习惯,可以说救了我很多次:

第一,任何有数据的盘,格式化之前先拍照。我说的不是拍屏幕,而是用命令把当前状态存成文本:

lsblk -f > /tmp/before_operation.txt sudo blkid >> /tmp/before_operation.txt

这样就算后面操作失误,至少知道原来的分区结构和 UUID 是什么,能恢复的概率会高很多。第二,命令敲完之后、回车之前,再检查一遍设备名。特别是dd和mkfs这类破坏性命令,我习惯把命令先写出来,盯着看十秒钟,确认/dev/sdc还是/dev/sdb。因为在实际运维里,经常出现插拔 U 盘后设备名互换的情况。第三,格式化完成后不要立刻塞满数据,先跑一次挂载、卸载、再挂载的循环,确保fstab自动挂载也正常,再开始大规模写入。

格式化本身不复杂,但它是一刀切的操作,做错了很难回头。希望这篇文章能帮你把这一步走得稳一点。如果后面实际操作中还有拿不准的地方,回到文章里的排查表来对照一遍,很多问题其实都有现成的解法。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进