解决树莓派硬盘挂载失败问题

自从给树莓派装上openwrt以后,我观察到它的温度一直在70多度徘徊不定,最高飙到过80度。于是咬咬牙在淘宝下单了一个新的带风扇的壳,9块8包邮。

拿到货当晚兴冲冲给它换上,重新开机,温度稳定在了50度上下。

但是新的问题出现了,重启后我的移动硬盘挂载不上去了,一直在报未知错误,我尝试用mount命令手动挂载,却出现:

ntfs-3g-mount: mount failed: 设备或资源忙

高高兴兴换壳中

排查

一开始怀疑是硬盘有损坏,插到台式电脑上进行检测、修复、测试,发现读写功能一切正常。

然后怀疑是进程占用,但是却查不到任何占用磁盘的进程号。

接着怀疑是电压不足的原因,因为新插了一个风扇在板子上,于是拆下来重启,依然挂载失败。

怀疑ntfs挂载有问题……

……

最后怀疑是usb接口坏了,弄了个u盘插到b口上,果然也挂载不上去。

/var/log下面翻看了下系统日志,发现有一行打印 usb device is blocked.

那什么东西会去block usb口呢?我把目光瞄向了上一次新增的,一个自启的容器:openwrt。

使用docker rmi 和 docker rm命令清理掉openwrt 的镜像和容器后,树莓派自动重启了,随之硬盘也能正常挂载了。

解决

回想了一下,整个事情是这么个回事:

树莓派启动 –> docker启动 –> openwrt容器拉起 –> 磁盘挂载

因为磁盘挂载速度慢于容器启动速度,且openwrt会锁usb口设备,所以会有上面这么蛋疼的一幕。

虽然还不清楚根因,但解决思路已经很清晰了:让openwrt容器在磁盘挂载后再启动。

这边先按照上一篇博文《树莓派自制UU加速盒》中重新搞了一下openwrt容器,但有几点不一样的:

  1. 启动时去掉命令里的--restart always

  2. 进容器配置好网络和UU插件,并把家里设备都加速好

  3. 退出容器并把当前这个配置好的容器创建成我们自己的镜像:

    1
    sudo docker commit openwrt myopenwrt
  4. 移除当前容器,并使用我们自己的镜像运行,这次带上自启参数:

    1
    2
    sudo docker rm openwrt --force
    sudo docker run --restart always --name myopenwrt -d --network macnet --privileged myopenwrt:latest

这样容器重启,也不需要我们重新配置了,它会自动去拉我们已经配置好的镜像。

接下来就是让docker开机的时候延迟启动:

1
sudo vim /usr/lib/systemd/system/docker.service

[Service]下面添加一行配置:

1
ExecStartPre=sleep 30s

重启树莓派进行测试,磁盘挂载、openwrt运行一切正常。

运行正常


解决树莓派硬盘挂载失败问题
https://honosv.github.io/2023/09/09/解决树莓派硬盘挂载失败问题/
作者
Nova
发布于
2023年9月9日
许可协议