2008-08-03

「親愛的」我把核心刪光了,核心kernel刪光了免重灌(非正規方法)

這一篇寫好久才寫好,中間過程一直不斷的重試,不斷的找資料有幾度灰心不想寫哩,有些地方不是很理解,所以有什麼錯誤的地方請指正囉

事情是這樣的,我為了要裝amdk8的專用核心,想說用專用核心來講的話,速度會比較好,也比較穩定,那我就不斷的嘗試,後來不幸的事發生了,我把舊核心刪掉新核心又沒有裝好,重開機後出現grub 15的錯誤,本人抱著能不重灌就不重灌的心態,拿起了ubuntu安裝光硬進入了下面的旅程。



dpkg --get-selections|grep linux
為了還原當時的情形,我又把核心都給刪光了,只剩下這些有安裝

libselinux1 install
libselinux1-dev install
linux-libc-dev install
linux-sound-base install
llk-linux install
util-linux install
util-linux-locales install

在來就是插入你的ubuntu-desktop光碟,使用光碟開機試用ubuntu進入桌面環境了

  1. 好了之後開啟終端機應用程式→附屬應用程式→終端機
    sudo -i
    使用root權限,下面我很懶不想每個指令都用sudo
  2. mkdir /mnt/root
    在/mnt/新增一個root資料夾
  3. sudo vol_id /dev/sdb1
    我是裝在sdb1,忘記分割格式可以用這個指令查看哦,ID_FS_TYPE=ext3我的格式是用ext3
    ID_FS_USAGE=filesystem
    ID_FS_TYPE=ext3
    ID_FS_VERSION=1.0
    ID_FS_UUID=5c967975-9ba3-4dc4-8adc-70098da10d18
    ID_FS_UUID_ENC=5c967975-9ba3-4dc4-8adc-70098da10d18
    ID_FS_LABEL=
    ID_FS_LABEL_ENC=
    ID_FS_LABEL_SAFE=
  4. mount -t ext3 /dev/sdb1 /mnt/root
    我ubuntu是裝在sdb1使用ext3格式,用mount掛載到/mnt/root
  5. chroot /mnt/root
    虛擬根目錄,以下會開始修改sdb1硬碟
  6. mount -t devpts none /dev/pts
    掛載devpts
  7. mount -t proc none /proc
    掛載proc
  8. aptitude update
    升級資料庫,哦要可以上網哦,我是用dhcp不用設定就可以上網囉
  9. aptitude install linux-image
    安裝linux-image,他是meta包含最新核心
  10. cp /boot/grub/menu.lst /boot/grub/menu.old
    備份menu.lst有需要可以在還原
  11. update-grub
    這會更新你的grub開機選單,使其更正到你原本安裝的路徑
  12. reboot
    重開機後就正常用硬碟開機,看看是否正常了
  • 小講解一下為什麼要執行update-grub這指令

  1. 每個磁碟分區都有一個uuid代號,要查你硬碟的uuid可以用
    ls -l /dev/disk/by-uuid/
    總計 0



    lrwxrwxrwx 1 root root 10 2008-08-02 03:31 2ed563d5-fd74-4306-81b9-72f3f1d94004 -> ../../sdb2
    lrwxrwxrwx 1 root root 10 2008-08-02 03:31 5303e00e-7a69-4901-b350-79310b6a9c8d -> ../../sda1
    lrwxrwxrwx 1 root root 10 2008-08-02 03:31 5c967975-9ba3-4dc4-8adc-70098da10d18 -> ../../sdb1
    lrwxrwxrwx 1 root root 10 2008-08-02 03:31 97cf4110-a0d7-4961-8729-4c152c8968f7 -> ../../sdb3
    lrwxrwxrwx 1 root root 10 2008-08-02 03:31 f207ae60-e1b2-4df0-8bae-8f41769648aa -> ../../sda2



  2. 我是裝在sdb1他的uuid是5c967975-9ba3-4dc4-8adc-70098da10d18,接下來打開開機選單
    sudo gedit /boot/grub/menu.lst



    ## ## Start Default Options ##
    ## default kernel options
    ## default kernel options for automagic boot options
    ## If you want special options for specific kernels use kopt_x_y_z
    ## where x.y.z is kernel version. Minor versions can be omitted.
    ## e.g. kopt=root=/dev/hda1 ro
    ## kopt_2_6_8=root=/dev/hdc1 ro
    ## kopt_2_6_8_2_686=root=/dev/hdc2 ro
    # kopt=root=UUID=5c967975-9ba3-4dc4-8adc-70098da10d18 ro

    kopt=root就是你的/boot位置UUID=你看後面就是我/dev/sdb1的uuid代號5c967975-9ba3-4dc4-8adc-70098da10d18



    ## Setup crashdump menu entries
    ## e.g. crashdump=1
    # crashdump=0
    ## default grub root device
    ## e.g. groot=(hd0,0)
    # groot=(hd0,0)

    groot=為你當初安裝開機選單的磁碟機,我是裝在(hd0,0)等會更新的話唯持不變



    ## ## End Default Options ##
    title Ubuntu 8.04.1, kernel 2.6.24-20-generic
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.24-20-generic root=/dev/hda1 ro quiet splash

    用chroot安裝後,他的開機位置會跟你原本的不同,執行update-grub會讀取# kopt=後面的值,並以你預設的值更新開機選單
    更新完之後他會變成以下內容



    title Ubuntu 8.04.1, kernel 2.6.24-20-generic
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.24-20-generic
    root=UUID=5c967975-9ba3-4dc4-8adc-70098da10d18 ro quiet splash
    initrd /boot/initrd.img-2.6.24-20-genericquiet





=================================

  • 我們先來瞭解以下hd0,0與hd0所代表的關係吧!

    hd代表硬碟
    0,0代表第幾顆磁碟機的第幾個分區,改一下數值會比較好理解用0,1代替好了,前面的0代表的是第一顆硬碟,後面的1代表第二個分區,我想你會問為什麼?
    hd0,0=第一顆硬碟的第一個分區
    hd0,1=第一顆硬碟的第二個分區
    hd1,2=第二顆硬碟的第三個分區
    hd1,3=第二顆硬碟的第四個分區

    這樣有看出他的規律嗎?這樣好了,第一個數值+1,第二個數值-1,你照這樣對照下看就很容易懂了。

=================================

  • 正規的安裝grub選單方法為
  1. sudo grub
    記得要加sudo哦否則,你不行更新grub選單,除非你是用root登入
  2. find /boot/grub/stage1
    (hd0,0)
    尋找/boot/grub/stage1在那個硬碟的什麼分區裡,每個人安裝/boot的位置可能不一樣,他顯示的位置也跟著不一樣了
  3. root (hd0,0)
    我裝在hd0,0里你要依照你剛剛所出現的位置打哦
  4. setup (hd0)
    開始安裝boot選單
  5. quit
    好了之後離開安裝grub

=================================

我本來也想用正規的方法安裝grub可惜始終出錯,只好用update-grub叫他讀取之前的預設值下去更新,沒想到還真的可以嘿嘿!

有人或許會說,直接重灌不是比較快,可是我不想像用windows一樣,出什麼問題都以重灌來解決,既然換ubuntu他是開源的,那我的心也要跟著打開換新,學習處理各種問題!為什麼我都用終端機都打指令,這也是學習的一種方式,下指令有錯誤他也會提示你是那錯,如果你懂他(英文)的話很快就能修正哩!可惜他都跟我不太熟,常常打錯指令哇哈哈,還好可以用方向鍵的↑找之前打過的指令