You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SD卡在Windows可正常识别格式化,但Linux系统提示“mmc0: card never left busy state”无法使用,求解决方案

SD卡在Windows可正常识别格式化,但Linux系统提示“mmc0: card never left busy state”无法使用,求解决方案

嘿,我之前帮朋友处理过几乎一模一样的问题,给你几个针对性的办法,应该能搞定这个棘手的状况:

第一步:先在Windows彻底清除SD卡的分区表信息

Windows能识别是因为它的SD卡驱动对异常状态容错性更强,但残留的分区表或控制器状态可能在Linux里卡壳。我们先把卡的底层信息清干净:

  • 以管理员身份打开命令提示符,输入diskpart进入磁盘工具
  • 输入list disk,找到你的SD卡(一定要核对容量,别选错本地硬盘!
  • 输入select disk X(X是你SD卡的编号)
  • 输入clean,这个命令会彻底擦除卡上所有分区表和引导信息,相当于把卡还原成“刚出厂”的空白状态
  • 之后可以简单创建一个FAT32分区(也可以不创建,留空就行),退出diskpart

第二步:在Linux里重置MMC控制器模块

有时候Linux的MMC驱动会因为之前的异常操作卡住状态,重新加载驱动能强制重置:

  • 比如在Steam Deck的桌面模式打开终端,先输入sudo lsblk确认SD卡的设备名(比如/dev/mmcblk0
  • 输入sudo rmmod mmc_block,再输入sudo rmmod mmc_core(如果提示“模块正在使用”,就先重启机器,重启后再执行这两步)
  • 重新加载驱动:sudo modprobe mmc_core,然后sudo modprobe mmc_block
  • 现在拔插SD卡,输入dmesg | tail -20看看还会不会出现mmc0: card never left busy state的错误

第三步:用Linux工具彻底擦除卡的开头区域并重建分区

如果上面的方法没效果,我们直接擦除卡的开头部分(这里面可能残留了导致驱动异常的信息):

  • 确认SD卡设备名(还是用lsblk,别搞错!),比如/dev/mmcblk0
  • 执行命令:sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=10,这个会擦除开头10MB的内容,把所有残留的引导信息、分区表都清掉
  • 然后重建分区表:sudo fdisk /dev/mmcblk0
    • 输入g创建GPT分区表(Steam Deck推荐用GPT)
    • 输入n创建新分区,一路按回车用默认设置就行
    • 输入w保存分区表
  • 格式化分区为Steam Deck兼容的ext4:sudo mkfs.ext4 /dev/mmcblk0p1
  • 挂载测试:sudo mkdir /mnt/sdtest && sudo mount /dev/mmcblk0p1 /mnt/sdtest,如果能成功挂载,就说明问题解决了

第四步:更新Linux系统内核(针对Steam Deck)

SteamOS的内核有时候会有特定的MMC驱动bug,更新系统可能直接修复这个问题:

  • 在Steam Deck桌面模式打开Konsole,输入sudo pacman -Syu,跟着提示完成系统更新(包括内核)
  • 重启后再插入SD卡测试

为什么会出现这种情况?

简单说,Windows和Linux的SD卡驱动逻辑不一样:Windows的驱动对卡的异常状态容忍度更高,能自动重置卡的控制器;但Linux的MMC子系统对卡的状态检测更严格,之前你中断格式化、用dd擦写的操作可能让卡的控制器在Linux驱动里留下了错误的状态标记,导致驱动认为卡一直处于忙碌状态。

备注:内容来源于stack exchange,提问作者Piotrus Watson

火山引擎 最新活动