今天折騰了一天,安裝minix3。
我用的硬盤是之前裝了linux的,用minix安裝光盤進入,setup一路走過去,在分區那里把之前的linux分區刪除,然后安裝minix3。安裝結束之后,重啟進入grub。折騰許久,排除了主板、硬盤、CD以及安裝方式的問題,最后發現是MBR的問題。
因為原來安裝了linux,所以磁盤MBR有grub的部分代碼,但是安裝minix時候,刪除分區并不會重寫MBR,所以開機后就無法正確引導了。后來用disk genius重寫MBR,然后再安裝就好了。之后再官方查到一個解決方案,沒有嘗試,可能也有效。
http://wiki.minix3.org/doku.php?id=usersguide:installationtroubleshooting
把MBR和grub的一些知識總結下吧。
MBR(Main Boot Record)是磁盤最前邊的一段主引導記錄(一段程序),由于在硬盤的第一個扇區,所以也把該扇區做主引導扇區,它在硬盤上的位置是(0柱面,0磁頭,1扇區)。因此,談到MBR時,有時候是指主引導記錄(扇區前面446字節),有時候是指主引導扇區(512字節)。(該扇區后面部分是4個16字節的磁盤分區表,以及2字節的結束標志)。
當系統加電后,系統收線讀取硬件固化在主板ROM上的bios程序,并開始執行。bios首先檢查硬件,初始化基礎中斷向量和寄存器等,然后根據bios中設置的啟動順序將控制器交給下一階段,即到MBR。
MBR載入到內存,開始執行。MBR的主要作用是檢查分區表是否正確并且將控制權交給硬盤主分區(活動分區)上的引導程序(如GNU GRUB)。
一個磁盤只能支持4個主分區,每個分區表結構如下:
由于最后分區總扇區號是4字節,所以一個分區最大是2^32個扇區,如果每個扇區是512字節,那么一個最大的主分區就是2TB。如果考慮到,扇區號(邏輯地址)也是4字節的,那么一個磁盤最大就是2TB,所以每個主分區只能有1/4磁盤大小。磁盤還可以把某個區設置擴展分區,理論上該擴展分區可以劃分無數個邏輯分區。
控制權到活動分區后,主要有兩種情況,一是卷引導記錄,計算機會讀取激活分區的第一個扇區,叫做卷引導記錄(Volume boot record,縮寫為VBR),其作用是告訴計算機,操作系統在這個分區里的位置。然后,計算機就會加載操作系統了。另一種情況是,有啟動管理器(boot loader)的情況,如grub。在這種情況下,執行MBR后將控制器交給grub,在grub中可以由用戶選擇啟動哪個分區的哪個系統。
控制器到操作系統后,加載內核。以Linux系統為例,先載入/boot目錄下面的kernel。內核加載成功后,第一個運行的程序是/sbin/init。它根據配置文件(Debian系統是/etc/initab)產生init進程。這是Linux啟動后的第一個進程,pid進程編號為1,其他進程都是它的后代。然后,init線程加載系統的各個模塊,比如窗口程序和網絡程序,直至執行/bin/login程序,跳出登錄界面,等待用戶輸入用戶名和密碼。
至此,全部啟動過程完成。
補充,GRUB是GRand Unified Bootloader的縮寫,它是一個多重操作系統啟動管理器。用來引導不同系統。GRUB是一個系統引導程序,分為兩個階段,第一階段它保存在MBR中。用匯編語言編寫,也就是MBR中的引導程序部分。①基本的硬件設備初始化(屏蔽所有的中斷、關閉處理器內部指令/數據cache 等)。②為加載 Bootloader 的Stage2 準備空間。③如果是從某個固態存儲媒質中,則拷貝 Bootloader 的stage2 到RAM 空間中。④設置好堆棧。⑤跳轉到 stage2 的C 程序入口點。GRUB引導程序的第二階段,通常用C語音編寫,這個階段的任務有: ①初始化本階段要使用到的硬件設備。②檢測系統內存映射。③將kernel 映像和根文件系統映像從flash 上讀到RAM 空間中。④為內核設置啟動參數⑤調用內核。它通常保存在/boot/grub/中。 當我們啟動系統進入GRUB界面時,會看到有選擇信息,如果我們自己編譯了系統內核的話,你可以選擇從某個內核啟動。同時要注意的是GRUB的配置文件和內核在/boot分區。從前面分析我們可以看出,/BOOT和MBR不存在包含關系。GRUB第一階段需要去MBR中去讀引導程序,GRUB第二階段需要到/boot分區讀系統內核和配置文件。
附:
grub第二階段,根據/boot/gurb/grub.cfg中的內容,找到kernel和initrd,并拷貝到內存中。initrd是Initial RAM Disk的縮寫,這個文件是在安裝系統時產生的,是一個臨時的根文件系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模塊,因此,Kernel上并沒有各種硬件的驅動程序,也就無法識rootfs所在的設備,故產生了initrd這個文件,該文件裝載了必要的驅動模塊,當Kernel啟動時,可以從initrd文件中裝載驅動模塊,直到掛載真正的rootfs,然后將initrd從內存中移除。
Kernel會以只讀方式掛載根文件系統,當根文件系統被掛載后,開始裝載第一個進程(用戶空間的進程),執行/sbin/init,之后就將控制權交接給了init程序。
參考:
http://www.blogfshare.com/mbr-dpt-ebr.html
http://blog.csdn.net/dale_chenjiawen/article/details/44282673
http://www.cnblogs.com/codecc/p/boot.html