最近在搞嵌入式开发(比如烧录 uboot 镜像)时,需要把 SD 卡格式化为 FAT32 格式,结果遇到了 “设备已挂载无法格式化” 的报错,踩了几个小坑后终于搞定。今天就把完整流程整理出来,不管是日常用 SD 卡存文件,还是嵌入式开发前置操作,都能直接套用~
一、先划重点:格式化前必须做的事!
备份数据!备份数据!备份数据!
格式化会清空 SD 卡里的所有内容,哪怕是隐藏文件也会被删。如果卡里有重要照片、代码或者镜像文件,先复制到电脑硬盘里,确认备份完成再往下走,别等删了才后悔!
二、第一步:找到 SD 卡的 “身份证”—— 设备名称
Ubuntu 里每个存储设备都有专属名称(比如/dev/mmcblk0),如果选错设备,可能会把电脑硬盘格式化,所以这步一定要仔细!
- 插好 SD 卡:用读卡器把 SD 卡插电脑(如果是笔记本内置 SD 卡槽,直接插就行);
- 打开终端:按Ctrl+Alt+T召唤终端,输入命令查看所有存储设备:
lsblk
或者更详细的信息(需要管理员权限):
sudo fdisk -l
- 识别 SD 卡:看输出结果里的 “大小” 和 “类型”,SD 卡通常是这样的:
举个我之前的例子,lsblk输出里,/dev/mmcblk0p1就是 SD 卡的第一个分区,大小和我的 SD 卡一致(比如 32GB),记好这个名称(后面要用到)。
- 内置卡槽的 SD 卡:名称一般是/dev/mmcblk0(设备),分区是/dev/mmcblk0p1(后面带p1的是分区);
- USB 读卡器的 SD 卡:名称可能是/dev/sdb(设备),分区是/dev/sdb1;
- 重点区分:电脑硬盘通常是/dev/sda,别认错!
三、第二步:解决 “设备已挂载” 报错 —— 卸载 SD 卡
我之前执行格式化命令时,直接报了mkfs.vfat: /dev/mmcblk0p1 contains a mounted filesystem,原因是 SD 卡插上去后 Ubuntu 自动挂载了,必须先卸载才能格式化。
- 查挂载点:先看 SD 卡分区挂载在电脑的哪个目录,输入命令:
mount | grep /dev/mmcblk0p1 # 把/dev/mmcblk0p1换成你的SD卡分区名称
输出会像这样:/dev/mmcblk0p1 on /media/你的用户名/XXX type vfat (…),其中/media/你的用户名/XXX就是 “挂载点”;
- 执行卸载:用umount命令卸载,两种方式选一个就行:
- 用挂载点卸载(更稳妥):
sudo umount /media/你的用户名/XXX # 替换成上一步查到的挂载点
- 用设备名称卸载:
sudo umount /dev/mmcblk0p1 # 替换成你的SD卡分区名称
- 如果卸载失败?:如果提示 “设备正被使用”,说明有程序在占用 SD 卡(比如打开了 SD 卡的文件夹),先关掉所有相关窗口,再试一次。还不行的话,用命令查占用进程并终止:
# 查看哪个进程在占用SD卡
sudo fuser -m /dev/mmcblk0p1
# 终止占用进程(注意:确认不是重要进程再执行!)
sudo fuser -k -m /dev/mmcblk0p1
终止后再重新卸载,一般就能成功了。
四、第三步:格式化 SD 卡分区为 FAT32
卸载完成后,就可以正式格式化了,分两种场景,根据你的需求选:
场景 1:只格式化现有分区(推荐,操作简单)
如果 SD 卡已经有分区(比如之前的/dev/mmcblk0p1),直接格式化这个分区:
sudo mkfs.vfat -F 32 /dev/mmcblk0p1 # 替换成你的SD卡分区名称
- mkfs.vfat:Ubuntu 里格式化 FAT 系列文件系统的命令;
- -F 32:指定格式为 FAT32(必须加,不然可能默认 FAT16);
执行后如果看到mkfs.fat 4.2 (2021-01-31)这样的提示,说明格式化正在进行,等几秒就好。
场景 2:重新分区(适合分区损坏、想调整大小)
如果 SD 卡分区混乱,或者想删掉旧分区重新建,就用fdisk工具(注意:这会删掉 SD 卡所有分区,谨慎!):
- 进入分区工具:输入命令(替换成 SD 卡设备名称,不是分区!比如/dev/mmcblk0):
sudo fdisk /dev/mmcblk0
- 删除旧分区:
- 输入d(delete,删除分区),如果有多个分区,会提示删哪个,按提示输入分区号(比如1),重复d直到所有分区都删掉;
- 创建新 FAT32 分区:
- 输入n(new,新建分区);
- 选分区类型:输入p(primary,主分区,日常用选这个就行);
- 分区号:默认1,按回车;
- 起始扇区:直接回车(用默认值);
- 结束扇区:想占满 SD 卡就直接回车,想指定大小就输入+SIZEG(比如+16G表示分 16GB);
- 设置分区类型为 FAT32:
- 输入t(type,修改分区类型);
- 输入b(W95 FAT32 的代码是b,按回车);
- 保存退出:
- 输入w(write,保存修改并退出),如果提示 “正在同步磁盘”,等完成就好;
- 格式化新分区:刚建的分区还是 “空的”,需要再执行格式化命令(比如新分区是/dev/mmcblk0p1):
sudo mkfs.vfat -F 32 /dev/mmcblk0p1
五、第四步:验证格式化是否成功?3 种方法确认
别以为执行完命令就万事大吉了,最好验证一下,避免后续用的时候出问题。
方法 1:查文件系统类型
用blkid命令看分区类型,是否为 FAT32(Ubuntu 里 FAT32 显示为vfat):
sudo blkid /dev/mmcblk0p1
如果输出里有TYPE=”vfat”,比如:
/dev/mmcblk0p1: UUID="XXXX-XXXX" TYPE="vfat" PARTUUID="XXXX-XXXX"
说明格式对了!
方法 2:挂载测试读写
格式化后,试试能不能正常用,步骤如下:
- 创建临时挂载点:
sudo mkdir -p /mnt/sdtest # /mnt/sdtest是临时目录,随便起名字
- 挂载 SD 卡:
sudo mount /dev/mmcblk0p1 /mnt/sdtest
- 测试读写:
- 进入挂载目录:cd /mnt/sdtest;
- 创建测试文件:touch test.txt;
- 写内容到文件:echo “SD卡格式化测试” > test.txt;
- 读文件:cat test.txt,如果能看到 “SD 卡格式化测试”,说明读写正常;
- 卸载临时目录:
cd ~ # 先退出挂载目录,不然卸不掉sudo umount /mnt/sdtest
方法 3:看分区摘要
用lsblk -f快速看文件系统:
lsblk -f /dev/mmcblk0p1
输出里FSTYPE列显示vfat,就没问题。
六、最后:这些注意事项别忽略!
- FAT32 的限制:单个文件不能超过 4GB,如果要存大文件(比如超过 4GB 的镜像),得用 exFAT(Ubuntu 需要先装exfat-fuse和exfat-utils);
- 嵌入式开发提醒:如果格式化 SD 卡是为了烧录 uboot、Linux 镜像,注意有些镜像需要 SD 卡是 “可引导” 的,单纯格式化 FAT32 可能不够,后续还要用dd命令烧录镜像;
- 别拔太快:格式化、挂载、卸载过程中,别拔 SD 卡,容易损坏分区;
- 设备名称别乱改:每次插 SD 卡,设备名称可能变(比如换读卡器可能从/dev/mmcblk0变成/dev/sdb),每次操作前都用lsblk确认一下!
写在最后
其实 Ubuntu 下格式化 SD 卡不难,关键是 “别认错设备” 和 “先卸载再格式化”,我之前踩的 “设备已挂载” 坑,本质就是没注意 SD 卡被自动挂载了。按照上面的步骤来,不管是日常用还是嵌入式开发,都能搞定~
如果操作中遇到其他问题,比如格式化后 SD 卡不识别、命令报错,欢迎在评论区留言,一起交流解决!