【疑难杂症爆破委员会】
升级Linux时断电,导致开机显示 Warning: /lib/modules/4.10.8-1-ARCH/modules.devname not found - ignoring 无法进入系统
状况说明
首先说明一下,我用的Linux桌面系统是基于Archlinux的发行版Manjaro。由于是笔记本,然后我又是半夜手贱升级,所以就差一点点完成升级的时候,断电关机了。
第二天一开机,表现的症状为:
开机提示 Warning: /lib/modules/4.10.8-1-ARCH/modules.devname not found - ignoring
后边还有一长串,总之是找不到设备之类的。
然后进入了紧急shell,可是并不能正常工作,因为设备都找不到,键盘都用不了。
这时候我发现,哦,出事了。可是并不慌,用Linux这么久了,大风大浪的也都见过了,所以觉得还有救。
马上拿出手机来,搜索了一波,马上就发现了,在下面这个网址上,好像有解决的对策:
https://www.soimort.org/notes/170407/ : Recovering from a Corrupted Arch Linux Upgrade
Or: When Pacman’s “Post-Transaction Hooks” Go Wrong
这篇文章后边还有出现此类问题的详细分析,我也没仔细看,主要是按照如下操作步骤走了一遍,就把系统给弄好了。
所需条件
这篇文章所基于的条件是,你有一个双系统Linux环境。注意,是两个Linux系统,一个Win一个Linux是不行的。然而大多数人正常的环境是,就是一个Win一个Linux,很少有人装俩Linux双系统的。
我也不例外,我也是一个Win一个Linux。不过我有一个archlinux的U盘live系统。我主要是通过这个live系统来修复我损坏的linux系统的。
所以,如果想完成下面要讲的这些操作,
1. 要么你的电脑装了俩Linux系统且另一个还能正常使用
2. 要么你有一个U盘Live Linux系统
这是已知确定能完成下面步骤的环境,其实还有其他的替代方法,比如:
3. 你能把你装有损坏Linux系统的硬盘拆下来,并连接到一个有正常Linux系统的电脑上
4. 你已损坏的Linux默认开机启动了SSH服务,并且现在你能通过SSH连接上它
(此种情况直接跳至步骤5
)
操作步骤
以下操作步骤需要ROOT权限,所以确保你现在已获取ROOT权限
1.定义两个变量
DEV="/dev/sda2"
DIR="/mnt"
DEV变量是你要修复的Linux所在的分区,我的就是在/dev/sda2这,你把它换成你的
DIR变量是你要把这个分区挂载到的位置,可以是任意位置,这个我选择把它挂到/mnt这
2.挂载
mount $DEV $DIR
mount -t proc /proc $DIR/proc
mount --rbind /sys $DIR/sys
mount --rbind /dev $DIR/dev
3.准备必要文件及做相关配置
cp /etc/hosts $DIR/etc
cp /etc/resolv.conf $DIR/etc
chroot $DIR rm /etc/mtab 2> /dev/null
chroot $DIR ln -s /proc/mounts /etc/mtab
4.切换到目标ROOT环境
chroot $DIR
经过以上几个步骤,我们就以ROOT身份进入了已损坏的Linux系统了。(如果是以SSH连接到已损坏的Linux系统的,则不需要这些步骤)
接下来,我们就要修复了。
先不要着急 pacman -Syu
,最好先查看一下pacman的log,究竟是装哪个包时出的问题
5.查看pacman的log,找到出问题的包,然后重装它
less /var/log/pacman.log
用这条命令查看安装出问题的包
然后
pacman -S 包名
重装
其实那篇文章里也说了,导致这种损坏的,最常见的包,其实就是 linux
这个包…
6.重新生成initramfs内核文件(最关键的一步)
mkinitcpio -p linux
这一步也许会出错,提示你找不到文件之类的。
解决方法是,进到 /etc/mkinitcpio.d
这个目录,看里面有什么。
把上边命令的 linux
替换成这里的文件名就OK了,注意不带后缀。
至此,大功告成。重启,基本上就能正常进入系统了。
其他说明
使用pacman是需要联网的,我的电脑用的是wifi,所以不会自动连上。
启用wifi并联网,一般需要如下步骤。如果不行,直接百度“wpa_supplicant连wifi”。
1. 启用网卡
ifconfig wlo1 up
我的无线网卡就叫wlo1,你可用 iwconfig 命令查看网卡到底叫啥
2. 创建wpa_supplicant配置文件。名字随意,内容如下
ctrl_interface=/var/run/wpa_supplicant
update_config=1
我的就在当前目录下,叫wpa.conf
3. 启动wpa_supplicant
wpa_supplicant -i wlo1 -c wpa.conf -B
4. 添加并连接wifi
wpa_cli -i wlo1 add_network
wpa_cli -i wlo1 set_network 0 ssid "wifi名字"
wpa_cli -i wlo1 set_network 0 psk "密码"
wpa_cli -i wlo1 enable_network 0
5. 获取IP地址
dhclient wlo1
然后就能上网了