長久以來,我想作成一件事兒,就是在U盤或移動硬盤上安裝Window和linux,這樣我就能夠到任何一臺電腦上使用個人開發平臺了。這件事兒,終於在上週徹底的實驗成功了。linux
將硬盤分紅3個部分,第一部分為FAT32格式的DOS盤,第二部分為Linux分區,最後為Windows分區。ios
我們將DOS盤做為啟動盤,啟動grub程式,加載menu.lst。grub是linux下的一支啓動引導程序,在這裡我們使用他來引導各個系統。對linux和Windows引導方式各有不一樣。linux主要通過加載Linux的內核來進行引導,而Windows則有本身的啟動器,因此事實上我們是通過加載Windows的啟動器(bootmgr)來進行引導。web
硬體:windows
軟體:centos
其餘文件bash
網絡上有不少安裝DOS系統的工具,不過不少都是把整個硬盤變成DOS盤(或許是我找得不夠仔細),而我們須要的是將硬盤分出一部分空間安裝DOS系統。我使用的方法是比較特殊的,使用虛擬機進行DOS系統的安裝。工具
首先,備份好U盤或移動硬盤的全部數據!然後刪除全部分區,將硬盤分出大約100MB的空間格式化為FAT32的格式(沒必要太多,個人加上TC才14M)。移動硬盤只要用Windows的磁盤管理就好了,U盤就須要DiskGenius來分區了(請不要分配驅動號)。post
然後,啟動虛擬機,創建一個windows7虛擬系統。把移動硬盤添加到虛擬機裏面:ui
1.選擇「Edit virtual machine setting」,添加一個硬盤:spa
然後選擇「use a physical disk」,Device選擇你的移動硬盤,一般是最後一個(若是你只接入一個移動硬盤的話)。
剩下的默認就行了。然後就能夠在硬體列表中看到添加的磁盤,容量看對一下,應該就沒錯了。
然後,選擇「Floppy」,選擇下載的DOS img。記得勾上「connect at Power on」。接著把創建虛擬機時創建的虛擬硬盤移除。
然後啟動虛擬機,就會進入DOS系統的安裝,若是提示要插入第二塊軟驅,就「Disconnect」掉Floppy,然後進入「Setting」選擇「DOS71_2.img」,再Connect上繼續就行了。其餘沒啥可說的。
按裝完後,若是不作任何修改,這樣的DOS盤也就只能在虛擬機裏面啟動而已了。在實際的電腦上啟動就會報錯,緣由我還沒找到,不過能夠作一些修改解決這個問題:
PATH=C:\;C:\DOS71\;C:\ghost\;C:\grub\
最後保存。至此,DOS系統就安裝完畢了。
在這一步,我們使用CentOS 7作為示例。
基本上都是Next…Next的事情,就不贅言了。說說特殊的地方。
以下圖:
安裝完成後,當然是進不去Linux系統的~~因此,我們就要——
這個時候啟動應該是進入DOS系統,
啟動DOS後:
bashcd grub grub.exe
這樣就能夠啟動grub了(啟動grub後,切記不要移動鼠標,否則就會死機),啟動後畫面以下:
選擇commandline,現在我們須要去加載Linux的內核,內核是位於boot目錄下,從我們剛才安裝的畫面能夠看出,boot分區是另外獨立一塊空間。
先用cat指令查看硬盤分區(cat後面有空格):
bashcat (hd0,
然後按下Tab鍵,能夠看到有3個xfs分區,第一個一般就是boot分區。
bashcat (hd0,1)/
同樣按下Tab鍵,就能夠看到這個分區下的文件,其中vmlinuz-3.10.0-123.el7.x86_64就是Linux的內核,不一樣版本的Linux應該會有所不一樣。這就說明瞭這個就是boot分區
在用同樣的方法查看其餘分區,找到分區下包含dev文件夾的目錄。
然後將其設置為根目錄
bashroot (hd0,4)
然後用kernel命令加載Linux內核
bashkernel (hd0,1)/vmlinuz-3.10.0-123.e17.x86_64 ro root=/dev/sda5
按Tab能夠補全文件名,上面指令中的sda5,就是最先我們在安裝時記錄根目錄的設備名。
接著設置initrd文件:
bashinitrd (hd0,1)/initramfs-3.10.0-123.el7.x86_64.img
然後就能夠引導了。
bashboot
至此,你就成功引導了linux系統~
但是!難道每次我們進入系統都有打這麼一長串嗎?當然不是。我們現將liunx關機,然後將grub裏面的menu.lst文件拷貝到DOS盤的根目錄,然後在文件最後面加入:
bashtitle CentOS root (hd0,4) kernel (hd0,1)/vmlinuz-3.10.0-123.e17.x86_64 ro root=/dev/sda5 initrd (hd0,1)/initramfs-3.10.0-123.el7.x86_64.img boot
然後在autoexec.bat最後一行加上
bashcall \grub\grub.exe
在啟動DOS時,就能夠看到CentOS選項了。以後只要通過這個選項就能夠啟動CentOS了。
安裝Windows最糟糕的地方就是,他竟然死都要裝引導,因此若是採用和上面linux的方法,就會把DOS的引導給覆蓋掉。因此……我們依然是藉助虛擬機的幫助,快速將Windows安裝到移動硬盤上。
還記得我們最開始時移除的那個虛擬機自動創建的虛擬硬盤嗎?這個虛擬系統叫Window7可不是沒有道理的~嘿嘿嘿~
現在我們要把他從新添加回來,和添加移動硬盤略有不一樣,選擇「Use an existing virtual disk」,然後選那個磁盤文件就能夠了。
然後在CD/DVD選擇一個Windows7的鏡像就能夠了。在那個虛擬系統裏面安裝一個Win7系統便可。
注意:若是啟動時仍然從dos啟動,就把移動硬盤移除後再啟動,另外分區時要預留大約10幾G的空間。
安裝完成後,進入系統,將預留的空間格式化,創建一個盤出來。
為了把在虛擬機安裝好的Windows7轉移到移動硬盤上,我們就須要用Ghost,把Windows7 Ghost下來,然後在移動硬盤上還原。可是,當前Windows7是運行中的,因此必須進入到DOS下再對Windows7進行Ghost,那麼我們能夠在啟動虛擬機時,按下F2鍵,進入BIOS設定,在boot設定DOS盤先啟動:
進入dos後,運行Ghost文件夾裏的ghost11.exe
bashcd ghost ghost11.exe
進入ghost,選擇local>Partition>To Image
再選擇對應硬盤,與磁盤,再選擇保存在剛才新建的盤便可。
注意要把系統保留分區一併Ghost
待Ghost完畢,在進入Windows,在移動硬盤新建一個分區原來存放Windows,啟動DOS盤中的Ghost32將Windows恢復到移動磁盤的分區中。
local>Partition>From Image
選擇恢復時,無需恢復系統保留區的文件,只要選擇系統分區便可:
可是!這樣恢復後,實際上Windows是沒有任何引導的。
因此,我們須要把系統保留區裏的啟動文件提取出來,使用Ghost裏面的Ghostexp.exe打開備份的Ghost文件。將引導文件提取出來,拷貝到恢復的Windows磁盤裏。
然後,我們還須要修改一下裏面的BCD文件,BCD文件記錄的是與Windows啟動相關的信息(當然不會是文本的)。我們要使用bootice來修改:
選擇BCD編輯,選擇其餘BCD文件,瀏覽剛剛恢復的Windows盤,選擇其中Boot的BCD文件:
編輯「啟動磁盤」和「啟動分區」,選中BCD文件所在分區。保存便可。
至此,我們的Windows就安裝好了~那麼,接下來就是——
bootmgr是引導Windows的入口,那麼啟動根目錄就要設置為bootmgr所在的分區,能夠直接使用
bashroot (hd0,6)
設置根目錄,但其實下面這樣會更合理
bashfind --set-root /bootmgr
找到bootmgr然後把其所在分區設置為根目錄。
然後,將bootmgr裝載進來:
bashchainloader /bootmgr
然後就能夠啦~
那麼在menu.lst裏就是添加:
bashtitle Windows 7 find --set-root /bootmgr chainloader /bootmgr
至此,DOS+Linux+Windows移動系統硬盤就搭建完畢啦~*:‧\( ̄▽ ̄)/‧:*
最後,附上個人menu.lst文件
bash# This is a sample menu.lst file. You should make some changes to it. # The old install method of booting via the stage-files has been removed. # Please install GRLDR boot strap code to MBR with the bootlace.com # utility under DOS/Win9x or Linux. color black/cyan yellow/cyan timeout 15 default /default title CentOS 7 root (hd0,4) kernel (hd0,1)/vmlinuz-3.10.0-123.el7.x86_64 ro root=/dev/sda5 initrd (hd0,1)/initramfs-3.10.0-123.el7.x86_64.img boot title Windows 7 find --set-root /bootmgr chainloader /bootmgr title DOS 7.1 savedefault --wait=2 quit title Command Line savedefault --wait=2 commandline title Reboot savedefault --wait=2 reboot title Halt savedefault --wait=2 halt