1. 程式人生 > >【疑難雜症爆破委員會】升級Linux時斷電,導致開機顯示 Warning: /lib/modules/4.10.8-1-ARCH/modules.devname not found

【疑難雜症爆破委員會】升級Linux時斷電,導致開機顯示 Warning: /lib/modules/4.10.8-1-ARCH/modules.devname not found

【疑難雜症爆破委員會】

升級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這麼久了,大風大浪的也都見過了,所以覺得還有救。

馬上拿出手機來,搜尋了一波,馬上就發現了,在下面這個網址上,好像有解決的對策


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

然後就能上網了