如何擦除GPT分区表并清除旧分区挂载信息?BeagleBone Black定制板问题
解决GPT分区表擦除后mkfs.ext4报错的问题
我在处理嵌入式存储(尤其是BeagleBone这类板子的eMMC)时经常碰到这个问题——你只擦除了主GPT分区表,但磁盘末尾的备份GPT表、残留的文件系统签名,还有旧分区的挂载信息没清理干净,导致mkfs.ext4误判分区已有文件系统。下面是一步步的根治方案:
1. 彻底清除GPT分区表(主+备份)
默认的分区擦除命令往往只处理开头的主GPT,而eMMC末尾的备份GPT还会残留,这是最常见的原因。推荐用sgdisk工具一次性清空所有GPT相关数据:
sgdisk --zap-all /dev/mmcblk0
这个命令会:
- 清除主GPT分区表
- 清除末尾的备份GPT分区表
- 清除MBR保护分区(如果有的话)
如果你的系统里没有sgdisk,可以用dd直接覆盖开头和结尾的区域:
# 覆盖开头10MB(包含主GPT和可能的文件系统签名) dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=10 # 覆盖末尾10MB(包含备份GPT) dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=10 seek=$(( $(blockdev --getsize64 /dev/mmcblk0)/1024/1024 -10 ))
2. 清除残留的文件系统签名
即使分区表没了,旧文件系统的签名(比如ext4的超级块)还会留在磁盘上,mkfs.ext4会检测到这些签名并报错。用wipefs工具一键清除所有可识别的签名:
wipefs --all /dev/mmcblk0
这个命令会删除ext4、FAT、RAID等所有类型的文件系统签名,确保磁盘是“干净”的。如果没有wipefs,也可以逐个覆盖旧分区的开头区域(假设旧分区是/dev/mmcblk0p1、/dev/mmcblk0p2等):
dd if=/dev/zero of=/dev/mmcblk0p1 bs=1M count=1 dd if=/dev/zero of=/dev/mmcblk0p2 bs=1M count=1 # 所有旧分区都执行一遍
3. 清理挂载信息残留
首先确保旧分区没有被挂载,避免格式化时出问题:
umount /dev/mmcblk0p* 2>/dev/null
然后检查/etc/fstab文件,如果里面有旧分区的挂载条目,一定要注释掉或者删除——否则系统重启后可能会尝试挂载不存在的分区,引发错误。比如:
# 用sed注释掉包含/mmcblk0p的行 sed -i '/\/dev\/mmcblk0p/s/^/#/' /etc/fstab
临时的挂载信息(比如/proc/mounts里的内容)会在重启后自动消失,如果你的脚本是在运行中操作,也可以直接重启板子(嵌入式系统重启成本很低)。
4. 重新分区并格式化
做完上面的步骤后,再重新创建分区并格式化就不会报错了。比如用sgdisk创建分区:
# 清空分区表(保险起见) sgdisk --clear /dev/mmcblk0 # 创建第一个分区:从2048扇区开始,大小512MB,类型为Linux文件系统(8300) sgdisk --new=1:2048:+512M --typecode=1:8300 /dev/mmcblk0 # 创建第二个分区:剩余所有空间,类型为Linux文件系统 sgdisk --new=2:0:0 --typecode=2:8300 /dev/mmcblk0 # 刷新分区表 partprobe /dev/mmcblk0 # 格式化分区 mkfs.ext4 /dev/mmcblk0p1 mkfs.ext4 /dev/mmcblk0p2
注意事项
- 一定要确认设备路径是正确的
/dev/mmcblk0,别误操作其他存储设备! - 如果你的嵌入式系统缺少
sgdisk或wipefs,可以通过包管理器安装(比如Debian/Ubuntu系:apt install gdisk wipefs)。 - 在脚本中执行这些命令时,最好加上错误检查,比如每个命令后判断
$? -eq 0,避免出错后继续执行后续步骤。
内容的提问来源于stack exchange,提问作者ART
相关产品推荐
相关产品推荐

