开头就先不客套了。搞 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/sdc13.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/sdcwipefs会擦除文件系统签名、分区表签名、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 分区 + ext4 | fdisk建分区;mkfs.ext4 -m 0 |
| 大容量存储服务器 | GPT 分区 + xfs | mkfs.xfs |
| U 盘 / 移动硬盘跨平台 | 单个分区 + exFAT | mkfs.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自动挂载也正常,再开始大规模写入。
格式化本身不复杂,但它是一刀切的操作,做错了很难回头。希望这篇文章能帮你把这一步走得稳一点。如果后面实际操作中还有拿不准的地方,回到文章里的排查表来对照一遍,很多问题其实都有现成的解法。