今天起床打開電腦,Ubuntu 跳出 Warning 訊息,boot 磁區剩下 84MB,所以我手殘進去 /boot/ 目錄,把舊的 Kernel 清除,不小心砍掉 initrd.img-2.6.35-32-generic Linux Image 開機所需要的檔案,結果之後開機出現
You need to load the kernel first 大家好像都是升級 Kernel 之後才會出現上述狀況,網路上找到的解答都不符合我的需求,所以我又往 GRUB2 開機 Boot 去瞭解,新的 GRUB 2 跟原先的 GRUB 的解法已經完全不同了,沒有 /boot/grub/menu.list,而被 /boot/grub/grub.cfg 取代,所以不應該在手動編輯此檔案。grub.cfg 會在有更新 Kernel 版本時,手動執行 update-grub 的時候被修改覆寫。這次發生的原因是在我把舊版 Kernel 刪除,而忘記執行 update-grub,這時候的最佳解法就是透過 Live CD 來救援。
Ubnutu Live CD 救援
先把 Ubuntu Live CD 放入,直接先選 Try Ubuntu,接著就會進入桌面,將 Terminal 打開 (Applications -> Accessories -> Terminal),之後只要按照底下步驟就可以成功還原 boot loader。
首先確定系統的根目錄以及 boot 磁區代號,大致上都是 sda1, sda5 等等,可以透過 fdisk -l 來瞭解這些資訊。
$ fdisk -l
輸出底下結果
Device Boot Start End Blocks Id System /dev/sda1 * 1 13 96256 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 13 38914 312471553 5 Extended /dev/sda5 13 499 3905536 82 Linux swap / Solaris /dev/sda6 499 5362 39061504 83 Linux /dev/sda7 5362 38914 269502464 83 Linux
將 / 跟 /boot mount 到任意目錄
$ sudo mkdir /mnt/root $ sudo mount -t ext4 /dev/sda6 /mnt/root $ sudo mount /dev/sda1 /mnt/root/boot
建立 /mnt/root 目錄,用來掛載自己的 Linux 系統,/dev/sda6 是原先 / 磁區,而 /dev/sda1 則是 /boot 區域
掛載 critical virtual filesystems,請執行底下 command
$ for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt/root$i; done
用 chroot 指令切換到 system device
$ chroot /mnt/root /bin/bash
重新將 Kernel 安裝
$ sudo apt-cache search linux-image
找到您要的版本後重新安裝
$ sudo apt-get install linux-image-x.x.x-xx
更新 /boot/grub/grub.cfg
$ update-grub
重新安裝 GRUB 2
$ grub-install /dev/sda
重新確認是否安裝成功
$ grub-install --recheck /dev/sda
按 CTRL-D
離開 chroot
卸載全部虛擬系統
$ for i in /sys /proc /dev/pts /dev; do sudo umount /mnt/root$1; done
卸載 boot 及 / 系統
$ sudo umount /mnt/root/boot $ sudo umount /mnt/root
重新開機
$ sudo reboot
結論
因為不小心砍一個系統開機檔案,所以花了一些時間找資料,以及瞭解 GURB2,這樣也是不錯啦 XD,底下是參考的一些資料
Reference: [SOLVED] Can’t start ubuntu (WUBI) : You need to load the kernel first Clean up your grub menu and the kernels you do not use Ubuntu Wiki Grub2 How to Restore Grub 2 As The Main Bootloader How to create edit/extract initrd in Ubuntu/Debian and Redhat/Fedora Linux ? Howto: Upgrade Linux Kernel Clean Up the New Ubuntu Grub2 Boot Menu
See also
- Debian/Ubuntu 的 update-rc.d 使用教學
- OpenSSH 安全性漏洞 CVE-2016-0777 and CVE-2016-0778
- 在 Debian 7.8 安裝 Gitlab 筆記
- Docker 救了 Debian SSH terminal
- Debian 7.x Install PHP 5.5 或 5.6 版本
- 解決在 Ubuntu 系統下 Chrome 瀏覽器亂碼
- 在 Debian 安裝 Percona Xtradb Cluster 5.5.34 注意事項
- 在 Ubuntu 建置 OpenWrt 編譯環境
- 修復 Ubuntu 開機 boot loader
- 在 Ubuntu 底下查詢記憶時脈體資訊