xDroid's Blog

莫名其妙的分区损坏

本来军训回来还拖着一大堆东西没有写,结果今天还撞着这么一件事情,真是快急死人了……

问题的开端是这样的:某次重启Ubuntu之后,始终在开机动画处挂掉,进入root用户的命令行模式(话说这样真的好不安全啊……)。根据前面的出错信息(EXT4-fs (sdc1): group descriptors corrupted!),大概可以判断是 /dev/sda8 无法挂载到 /home ,因此无法进入登陆界面。

老子偏不信这个邪了:

root[~]: mount /dev/sda8 /home
mount: wrong fs type, bad option, bad superblock on /dev/sdc1,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

真是日了**了前面一次既没断电又没摔落,怎么superblock就坏掉了呢?

然后我尝试了一下谷娘告诉我在S/O上的玄学命令:

root[~]: mkfs.ext4 -S /dev/sda8

我也不记得输出什么了,反正还是mount不上去

后来找到了一个靠谱一点的办法(注:我只在LiveCD环境下试过,在原来那个启动到一半挂掉了的环境里猜测是可以的):

root[~]: mke2fs -n /dev/sda8 # '-n' is VERY VERY IMPORTANT!!!
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

如果不加-n你的数据就要真没了……
之后就可以用备份的超级块恢复数据inode信息了,这里选了一个superblock的备份位置(32768):

root[~]: e2fsck -b 32768 /dev/sda8

接下来一路按y就行了。

于是我幸福满满地重启机器,然后发现在开机界面等了很久,又退回到了命令行界面。

(黑人问号???)到底发生了什么? dmesg | grep errordmesg | grep sda8 都没有给出有效的错误原因,于是我试了一下:

root[~]: mount /dev/sda8 /home
root[~]:

真是想要日了狗粮了。

为什么手动挂载就能成功呢?深思熟虑一番以后,我推断出一个异想天开的结论:

分区的UUID号被e2fsck修改过了,因此找不到home分区,也就没有办法读取用户信息。
(其实应该是看到日志里面说找不到UUID以adaa144b开头的分区才想到的……不过找不到原来的日志文件了)

知道这个原因之后就很好办了,于是我一气呵成写下了如下的脚本:

HOME_UUID=`blkid | grep sda8 | awk '{print $2}' | sed 's/.*UUID="\(.*\)".*/\1/'`; sed -i '/home/{s/UUID=[^ ]*/UUID='"$HOME_UUID"'/}' /etc/fstab; unset HOME_UUID

(我想有谁要用的话研究一下应该能研究出来要修改的地方,虽然为了凑出这段脚本试了一百多次……)

然后再重启一下,就能看到久违的登陆界面了。

但是呢!!!这样虽然看上去修好了文件系统,不过它把很多很多的文件夹变成了文件(囧),以至于Telegram、git、node之类都受到了影响,还删掉了一个用户的文件夹(还好不是主账户的)。总之,没有什么事情是重装解决不了的(雾)。

总算修好了电脑,至少一短时间内不会考虑重装系统了,可以定定心心地写blog了。