树莓派进入紧急模式的解决办法

文章更新

  1. 20160714-初次成文
  2. 20170412-更新内容

为什么会有这篇文章

最近正在折腾用树莓派架设Resilio Sync服务来同步自己的数据,然而晚上11点左右,发现架设在树莓派上的WEB服务挂了,然后再转过头看房间角落里的树莓派,竟然关了~!顿时觉得有点惊诧,拔掉电源重新插,灯还亮,说明树莓派硬件还没挂,然后发现ssh无法登录,PING树莓派的IP没有反应。有点慌了,到群里求助,问树莓派是不是挂了?大家有建议重做SD卡,也有说只要树莓派的LED灯还在闪烁,树莓派就问题不大。然后无奈,我只能使用最原始的方法,接HDMI显示器、USB键盘,然后发现树莓派可以进入系统,顿时安心了,但是好像还没完,开始了一系列的折腾。

紧急模式

进入系统后,有一些提示,很有意思

1
2
3
4
5
6
'Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" to try again
to boot into default mode.'

sulogin: root account is locked, starting shell
root@raspberrypi:~#

看来树莓派是遇到什么问题了,自行进入了紧急模式,系统有几个建议

  1. journalctl -xb 查看日志
  2. systemctl reboot 重启系统
  3. systemctl default 按照默认模式重启系统

使用第一条建议的时候,发现树莓派在开机启动1-2秒内就遇到了错误,关停了所有的服务,准备进入紧急模式。

使用建议2的时候,系统可以重启,但是每次重启后,都进行了一个1分30秒左右的fsck检查,而且检查完了,同样进入紧急模式,没有任何改变.

使用建议3的时候,直接出提示Hangup,同样没有解决。

无奈之下,我就病急乱投医,使用fdisk -l命令,并没有发现什么不妥。但是在使用df -l查看挂载分区和磁盘的时候,发现了奇怪的问题:系统几乎挂载了所有的目录,但是唯独缺少重要的一行

1
tmpfs              88280         0     88280   0% /run/user/1000

这个目录,是root用户的根目录,如果这个目录没有挂载的话,说明root用户应该出现问题了。

果然,我发现cd root进入root目录之后,目录里和记忆中不太一样,但是其他/usr/var目录下并没有发现什么不妥。

莫名其妙的,我使用startx,竟然还能进入GUI环境,但是进入之后,会遇到一个什么GID的错误,我想应该和root目录没加载有关。

试错过程

到了这个地步,我心里稍微踏实了一些,毕竟树莓派应该没有什么问题,只是估计系统盘出了问题。

网上根据上面的错误提示,终于遇到了和我一样错误的人,他的帖子见这里

他提供了两个办法:

办法一(个人失败)

  1. emergency mode 下 用root账户登录
  2. 执行 umount /dev/mmcblk0p2 命令
  3. 再执行 e2fsck -f -y -v -C 0 /dev/mmcblk0p2 命令
  4. reboot 重启

办法二(个人成功)

  1. 把树莓派的SD卡拔出来,放到读卡器里面,插到另外一台 LINUX 电脑上,假设树莓派SD是 /dev/sdb
  2. sudo umount /dev/sdb1
  3. sudo umount /dev/sdb2
  4. sudo fsck /dev/sdb1
  5. sudo fsck /dev/sdb2

我使用这个办法成功的,但过程中遇到了一个小错误

1
2
3
4
5
6
7
8
$ sudo fsck /dev/sdb1
dosfsck 3.0.16, 01 Mar 2013, FAT32, LFN
0x41: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
1) Remove dirty bit
2) No action
? 1 #我选择了选项1,移除脏数据
Leaving file system unchanged.
/dev/sdb1: 3 files, 33/130812 clusters

意思就是分区有错误,定位到了脏脏的数据,你想移除它还是不动它?我选1,删掉他,但是结果却是啥都没有变化。然后继续找解决办法,发现也许这是fsck命令的一个BUG,需要添加参数 -a,来执行 sudo fsck -a /dev/sdb1 ,顺利搞定

峰回路转

以为已经搞定了,TF卡放回树莓派中,启动,依然回到了最开始的状态,又进入了紧急模式,心里顿时万千只草泥马呼啸而过!

此时想想,这次的问题,应该是TF卡出了一些错误,导致树莓派认为系统 “无药可救” 了,所以紧急把自己的服务,能关的都关了,关机了事!

在之前寻找解决办法的过程中,无意中好像看到了一个人提到关于硬盘UUID加载的导致出现了同样的错误,好吧,抱着试试看的心态,我把之前在 /etc/fstab 中那句按照硬盘UUID加载硬盘的命令删掉了,然后。。。重启竟然正常了!

想说的话

经过2个小时的折腾,我发现遇到问题还是应该先求助于网络,QQ群虽然是高手如云,但是高手不一定在啊,就算群里有2000人,谁能保证这2000人中有遇到过同样问题的呢?就算遇到了,人家也不一定在线啊,所以,还是GOOGLE靠谱。

其实,这个错误,我最后也无法确定为什么启动加载UUID会影响到系统的启动,不过其中有一个细节,就是在我试图执行 sudo umount /mnt/hd250g 的时候,系统说该分区忙,并且给出了3个已经挂载的位置,其中一个位置是 /media/PI/A88ER89D90--8E8R90A-8D8F799-8D88F/ ,另外两个是正常挂载的位置,那个长长的目录,引起了我的兴趣。我进去看了下,硬盘在这个目录下竟然有文件,但是应该正确挂载在 /mnt/hd250g 下的却有错误。

如果遇到挂载盘busy的情况,使用sudo umount -lf /dev/sdb1,或者把 -l -f 分拆到两句命令里执行也可以。

这个真心让我想不通,那个 /media/PI 的位置,我查了自己以往的记录,应该只有在 samba 服务配置文件中提到过,那是samba服务 home 用户的一个目录,但是为什么会突然挂载到这个位置?还是因为挂载到 /mnt/hd250g 失败之后,被挂载到了这个位置?我一直没有想明白。

好了,先这样吧,打算换个比较好的 TF 卡,重新做一次系统看看,因为BT SYCN最近实在是让我火大,如果重新刷系统后,还不能解决这个问题,只能考虑从BT SYNC迁移到SYNCTHING了。

参考文章

  1. fsck.vfat fails to remove dirty bit
分享到