[經驗] win7,ubuntu12.04和redhat 6.4三系統共存遇到的一些問題及解決

導讀:
本文偏重對Linux系統的啓動引導講解,並採用ubuntu的boot loader引導啓動。如果要快速解決三系統共存的引導問題,可參考另一博文:http://blog.csdn.net/xiaolanzao/article/details/19831473


安裝LINUX系統時,分區時一般這樣分:
  1. /boot:第一個要分出100~200M的/boot分區,裏面放着內核文件和boot loader.
  2. /:然後有一個根目錄的分區“/",大小根據你的需要和磁盤大小;
  3. /tmp:如果是企業的系統時,一般會單獨分出/tmp分區,幾G+不等,個人計算機則不需要;
  4. swap:最後有一個swap分區,一般是實際內存大小的1~2倍,如果你的內存很足夠了,可以不需要。

如果沒有選擇”自定義分區”的話:
  • 會默認將系統的引導寫進MBR(MasterBoot Recorder),
  • 如果只有windows 和linux兩個系統的話,可以先裝windows再裝linux,也可以使其和平共處。
  • 如果裝三個系統,則第三個linux系統的boot loader會覆蓋掉之前的linux系統的boot loader,因此無法實現兩個linux的系統自動引導。
因此,就會產生無法自動引導存在兩個linux系統的問題,也就是本文要討論解決的問題。
  • 注:我是先裝win7,再裝ubuntu,最後裝redhat
  • 如果想用ubuntu的boot loader來進行引導,則在裝redhat時,選擇“自定義分區”,最後選擇“不將boot loader寫入MBR”
  • 然後再修改ubuntu的boot loader文件(即grub.cfg),加入redhat的引導選項。
  • 本人裝linux系統時並沒有選擇自定義分區,根據順序,我是用了redhat的boot loader(文件位置/boot/grub/grub.conf),加入ubuntu的引導,所以此博文都是根據這個來寫的。其實都是大同小異,理解其中原理就行。

  • 爲什麼可以先裝windows後裝linux實現雙系統正常引導,而兩個linux卻不行?
    • 如果先裝linuxs後裝windows,windows的引導會直接覆蓋掉MBR,導致無法引導linux,因此要先裝linux
    • linux的引導記錄是寫在MBR,所以會直接去MBR裏尋找,而windows的是寫在PBR(partitionboot recorder),當有激活分區時,就去PBR尋找引導記錄;
    • 當檢測到已經安裝有windows系統時,linux的bootloader可以選擇是否繼續選擇跳轉到windows的boot loader去引導啓動,因此可以實現正常引導
我的安裝過程:
1,原本電腦裏有win7和redhat 5.5。
2,進PE系統,用DiskGenius刪除掉redhat的分區後,裝了ubuntu 12.04。成功後啓動可正常進入兩個系統。
3,裝redhat 6.4,選擇安裝分區時選了從現有linux分區中切割出一部分空間來裝。
4,安裝成功後,重啓,果然只能選擇進入redhat和win7,而沒有ubuntu的選項。

由於丟失了ubuntu引導,所以需要我們手動添加。由於已經有了redhat的grub引導,我決定加入ubuntu的引導選項。以下步驟需要小心操作,避免誤改文件而導致新的系統問題

  1.  進入redhat系統,執行“fdisk -l”查看分區情況。看你的兩個linux系統分別裝在哪裏,一般先裝的會在前面。
  2.  把ubuntu系統掛載到/mnt下。執行“mount /dev/sda7 /mnt”
  3.  進入ubuntu系統查看你的內核文件位置.我的在直接在boot/initrd.img-3.2.0-24-generic和boot/vmlinuz-3.2.0……
  4.  修改redhat下的/boot/grub/grub.conf文件。(ubuntu的引導是/boot/grub/grub.cfg)。
 觀察該文件語法,在適當位置加入代碼(紅色部分):
××××××××××××××××××××××××如下爲/boot/grub/grub.conf文件部分代碼××××××××××××××××××××××××××××××
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
        root (hd0,8)
        kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_lanzaocomputer-lv_root nomodeset rd_NO_LUKS rd_LVM_LV=vg_lanzaocomputer/lv_root rd_NO_MD rd_LVM_LV=vg_lanzaocomputer/lv_swap crashkernel=auto LANG=zh_CN.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-358.el6.x86_64.img
title Windows7
        rootnoverify (hd0,0)
        chainloader +1
title ubuntu                    //在開機啓動引導進系統時顯示的名稱,隨便起一個你自己認得的名字
        root (hd0,6)           //根據你的ubuntu所在分區來填,可以先從本文下個模塊將的步驟裏查看到是hd(0,?)
        kernel /boot/vmlinuz-3.2.0-24-generic root=UUID=cdbf0740-3243-4bd0-bbe6-8fe512660adf ro quiet splash
        initrd /boot/initrd.img-3.2.0-24-generic                      //內核位置,一般來說都是在/boot下
之後保存退出。
5,重啓計算機,可看到3個引導選項,可成功進入win7,ubuntu和redhat,成功在grub引導啓動ubuntu!
附圖1:
[經驗] win7,ubuntu12.04和redhat 6.4三系統共存遇到的一些問題及解決 - zlanzao - lanzao的博客
 BIOS與boot loader及內核加載流程示意圖(from《鳥哥的LINUX私房菜基礎片》)
PS:
第一次操作很容易遇到各種各樣的問題和報錯,可以去網上找相應教程查看,不要輕易放棄和重裝。
涉及硬盤分區的操作要謹慎,不要輕易格式化和刪除分區,避免造成數據丟失。


如果啓動無法進入linux系統,出現"grub>"的解決方法:

  1. grub>find /grub/stage1  會顯示 hd(0,x) x是你的系統的分區號
  2. grub>root  (hd0,x) x是你的系統的分區號,按Tab可以列出選項
  3. grub>setup  (hd0)  回車後會看見……successful,Done.
  4. grub>root  (hd0,x)
  5. grub>kernel (hd0,8)/boot/vmlinuz-3.2.0-24 (按Tab查看提示或補齊) ro root=/dev/sdax(進系統後執行fdisk -l查看)
  6. grub>initrd  (hd0,8)/boot/initrd.img-…… (按Tab補齊)
  7. grub>boot
正常來說是可以進入到系統的,如果不行再放入系統光盤,進入Live系統後再查看相關參數,重複以上步驟。

爲什麼需要initrd?
會需要initrd的原因,是因爲內核模塊放置於/lib/modules/$(uname -r)/kernel/當中,這些模塊必須要根目錄(/)被掛載時才能夠被讀取。但是如果內核本身不具備磁盤的驅動程序時,當然無法掛載根目錄,也就沒有辦法取得驅動程序。
initrd可以將/lib/modules/...內的啓動過程當中一定需要的模塊打包成一個文件(文件名就是initrd),然後在啓動時通過主機的INT13硬件功能將該文件讀出來解壓縮,並且initrd在內存中會仿真成爲根目錄,由於此虛擬文件系統主要包含磁盤與文件系統的模塊,因此我們的內核最後能夠認識實際的磁盤,那就能夠進行實際根目錄的掛載。
發佈了34 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章