修復Linux開機啟動程序initrd錯誤的問題 / Fixing a Broken initrd in Linux
這篇是解決Linux開機時遇到啟動中找不到開機啟動程序,而出現「mount: could not find filesystem ‘/dev/root’」的解決方法。具體方式都是參考troy’s unix space的「Fixing a Broken initrd in Linux」。以下是記錄我自己的解決方式。
This is the solution when you encounter Linux boot failed with "mount: could not find filesystem ‘/dev/root’". The details are reference "Fixing a Broken initrd in Linux" in troy’s unix space. Following is my problem solved steps.
問題敘述 / Problem
- 作業系統:CentOS 5 (不確定是5.幾版),編號是CentOS (2.6.18-164.15.1.e15)←注意這個編號,這在開機畫面中會看到,之後我們會用到這個編號喔。
- 硬碟:使用PATA的IDE硬碟掛載,編號為hda
- 操作環境:這是我在做P2V當中遇到的問題,修復過程都是在VirtualBox 4.2.6中完成。
我印象中之前是使用Clonezilla把實體機器上的CentOS複製到VirtualBox的VDI,以完成P2V (Physical-toVirtual)的作業。不過不知道是不是Clonezilla複製的過程有些問題,複製到VDI,確認硬碟位置與實體機器相同之後,我把它啟動時遇到了以下的錯誤訊息:
(上面為止的都是正常啟動訊息)
Unable to access resume device (LABEL=SWAP-hda2)
mount: could not find filesystem ‘/dev/root’
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init!
到此為止,系統就不能運作了。
我把錯誤訊息上網Google了一下,馬上就找到「Fixing a Broken initrd in Linux」這篇的解法。以下就是操作的過程。
Step.1 用CentOS光碟進入Linux救援模式 / Ener Linux Rescue Mode By CentOS Installation CD
我之前也有用救援模式(rescue mode)來修復無法啟動的CentOS,不過那時候是用fsck修復檔案系統(filesystem),這次是要修復開機啟動程序(initrd)。
我這次一樣使用CentOS 5.2安裝光碟,從光碟開機之後看到以上畫面,接著輸入以下指令:
linux rescue
接著設定語系、鍵盤與網路。本次修復不需要用到網路,所以網路我就不開啟了。
最重要的是選擇如何掛載原本的系統,畫面如上圖(我借用以前我自己修復過程的圖片)。請選擇「Continue」,救援模式會把原本的系統掛載到「/mnt/sysimage/」中。
接著會進入指令列,輸入以下指令
sh-3.2# chroot /mnt/sysimage/
這樣就進入原本的系統中了。接下來我們要開始修復囉。
Step.2 備份開機映像檔 / Backup Boot Image File
會發生這個問題,是因為CentOS的開機映像檔毀損了。所以這篇文章的目的在於修復CentOS的開機映像檔。
開機映像檔的位置在 /boot 中。依照Linux版本不同,裡面會有不同編號的檔案。我上面有提到要特別注意CentOS的編號「2.6.18-164.15.1.e15」,以這個例子來說,我的檔案就會是「/boot/initrd-2.6.18-164.15.1.e15.img」。
我們在此先備份這個壞掉的開機映像檔,以免待會修壞了無法還原吧。
mv /boot/initrd-2.6.18-164.15.1.e15.img /boot/broken-initrd-2.6.18-164.15.1.e15.img
Step.3 建立開機映像檔 / Using “mkinitrd” Create Boot Image File
接著我們要用mkinitrd指令來建立新的映像檔。指令需要輸入兩個參數,一個是建立開機映像檔的位置,另一個是版本的編號。以我需要的編號「2.6.18-164.15.1.e15」來說,指令如下:
sh-3.2# /sbin/mkinitrd /boot/initrd-2.6.18-164.15.1.e15.img 2.6.18-164.15.1.e15
完成建立之後,你可以用指令「ls /boot/initrd*」來確認開機映像檔是否有正確建立。
沒有問題的話,輸入指令「exit」兩次來重新啟動系統。
重新啟動的時候記得要把CentOS光碟拿起來喔。
通過開機程序 / Pass Statup Process
之後系統就能夠順利開機了。不過來到系統裡面,我發現原本可以運作的Tomcat出了點問題。後來我重新建立一個Apache Tomcat就恢復正常,也設定了自動啟動Tomcat跟PostgreSQL。跟這篇主題不太相關,所以細節我就不多提了。
以上就是整個修復的過程。