歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

如何在移動驅動器上安裝Linux

   獲得外置驅動器是一種為較老設備注入生機的極好方法,或者允許您在不能(或不想)改變內置硬盤驅動器的機器上運行Linux。假設您想在雙引導系統中使用Linux,但計算機硬盤驅動器中沒有任何可用空間。一個解決方案就是使用“活動的”Linux發行版,如Knoppix,它可以直接從CD運行。如果是偶爾使用,這種方法確實可行,但是它有許多嚴重的缺點:    您仍需要一些數據文件的永久存儲。如果僅使用非常小的文件,可以使用軟盤;對於中等大小的文件,USB閃存盤可能就足夠了,但是它們都不是理想的方法。    當使用“活動的”CD時,要安裝自己的應用程序或定制現有應用程序會非常困難,甚至不可能。    使用活動發行版會降低性能,最顯著的就是當啟動檢測所有設備時-但運行時也會降低性能(因為所有東西都必須從CD加載,這通常要比從硬盤驅動器加載慢得多)。    自然,還有其他選擇。例如,可以買其他內置驅動器並在其中安裝Linux。但常見的情況是,機器中可能沒有任何可用的驅動器托架(筆記本電腦更是如此,它通常僅允許一個內置硬盤驅動器)。    或者,您可以使用更大的驅動器替代當前的驅動器,並在由此得到的額外空間中安裝Linux。不過,這是一個花費時間的選擇,因為它需要您在新的驅動器上重新安裝現有OS系統,重新安裝和重新配置所有應用程序及還原所有數據。    一種更好的解決方案是購買外置硬盤驅動器,並在其中安裝Linux。這使您可以不更改現有硬件和軟件,僅在想使用Linux的時候連接外置驅動器即可。    可移動驅動器選項    可在其中安裝Linux的移動設備的范圍包括從軟盤驅動器到USB閃存設備,再到USB/FireWire硬盤驅動器等等。    雖然的確可能將Linux安裝在小容量的設備中,如1.44MB軟盤或32MB USB盤,但這些通常(必然)都是專門的經過縮減的發行版,例如,用於拯救損壞的安裝。    不過,外置硬盤驅動器以合理的成本為通用的Linux發行版提供最多的靈活性。    外置驅動器來自許多不同的制造商(Maxtor、Western Digital 等等),可以有各種不同的大小。這些驅動器都包含一個外置盒,放置標准3-1/2英寸或2-1/2英寸IDE驅動器。這些驅動器通常都通過USB或 IEEE1394(FireWire)連接到計算機上。    USB有兩個主要版本,1.1和2.0。版本1.1最大傳輸速度為 12Mbit/s(兆比特/秒),而版本2.0支持最高達480Mbit/s的傳輸速度。雖然大多數兼容2.0的驅動器都可向後兼容1.1,但是一般最好避免使用1.1,除非別無選擇(因為它的速度比較慢)。    FireWire標准還定義了許多不同的可能速度,但是實際上,無論何時人們說到FireWire,他們都是指“FireWire400”,它支持最高達400Mbit/s的傳輸。    從速度來看,在USB 2.0和FireWire之間沒什麼可選擇的:雖然USB 2.0報出的速度較高,實際上因為協議不同,它們都是差不多的。如果您的計算機兩者都有,或許使用USB更好,而不是FireWire(後面我會講明原因),但是如果僅有FireWire,則當然只能選擇FireWire。為了獲得最大的靈活性,從大量支持USB 2.0和FireWire的驅動器中選擇一個(比如,我在本文稍後使用的驅動器)。    對於沒有所需端口、PCI(對於台式電腦)和PCMCIA(對於筆記本電腦)的計算機,可以很便宜地買到FireWire和USB 2.0卡:例如,我在本文後面使用的PCMCIA FireWire卡大概是用10GBP(不到20美元)買到的。    為了完成本文,我購買了5-1/4英寸外置驅動器盒。這是非常靈活的盤盒,它不與任何驅動器一起提供,可以裝入任何標准IDE設備,包括3-1/2英寸硬盤驅動器和5-1/4英寸IDE設備,如CD-RW/DVD-RW驅動器。該盤盒具有USB 2.0和FireWire連接。    為了將盤盒連接到我的IBM Thinkpad T30筆記本電腦,我還購買了PCMCIA FireWire卡(內置USB端口僅支持USB 1.1)。    盤盒和FireWire卡都比較便宜(分別是50GBP和10GBP)。    出於測試目的,我將盤盒與我准備的13GB 3-1/2英寸IDE驅動器連接-在實際使用時,我會購買更大容量的驅動器,這些驅動器現在也非常便宜(大約每GB 50GBP!)    Linux支持    正如您可能期望的那樣,Linux對這些盤盒的支持確實很好。任何遵守“大容量存儲設備”的SBP(Serial Bus Protocol)標准的設備都可以很容易地與Linux一起使用。    一般來說,要啟用對這些設備的支持,內核需要支持許多內容(直接編譯或通過模塊)。    對於USB和FireWire,SBP設備支持都通過SCSI仿真實現-即,設備顯示給Linux就好像它們是SCSI磁盤一樣。這是在Linux中抽象存儲設備的一種通用方法(例如,IDE CD/DVD驅動器也通常使用SCSI仿真連接)。因此,需要下列內核支持:    * SCSI支持    * SCSI仿真    * SCSI磁盤支持    另外,根據連接方法,還會需要下列支持:    對於FireWire:    IEEE1394支持    OHCI1394支持    RAW1394支持    SBP-2支持    對於USB:    (主機端)USB支持    OHCI支持    UHCI支持    USB大容量存儲支持    顯然,您必須完全正常支持其他硬件(顯卡等等),根據您實際的硬件情況,可能還需要一些其他模塊。    例如,我使用PCMCIA(cardbus) FireWire卡,所以需要添加:    PCMCIA支持    cardbus支持    安裝    現在我們有了外置設備,將開始在其中安裝Linux。    現在安裝Linux的最容易的方法(當然是我的觀點)是連接所有硬件(在這裡,包含插入PCMCIA FireWire卡、將FireWire線纜連到PCMCIA卡和驅動器上、打開驅動器的電源開關);然後使用您選擇的發行版的安裝CD來引導計算機。    我選擇的發行版是Gentoo(請參閱參考資料獲得相關鏈接),所以我使用最新的“Universal” x86 Live CD (2004.1)。其他發行版所需的步驟應該會比這裡講述的步驟多或者少。    一旦已經使用安裝CD引導,如果幸運的話,它應該已經識別了您的驅動器。驅動器應該顯示為/dev/sdX下的磁盤,其中X是從“a”開始的小寫字母。在我的系統中,外置驅動器被檢測為/dev/sda,但是如果您有其他SCSI磁盤(模擬的SCSI磁盤),這將發生變化;在那種情況下,它可能是 /dev/sdb或其他字母。如果驅動器沒有被自動檢測,可能需要進一步的步驟-例如,您可能必須通過引導選項來啟用FireWire或PCMCIA,或者可能必須手工加載一些內核模塊或類似的其他項(請參閱參考資料獲得故障排除指南的鏈接)。    一旦驅動器已經被識別,就考慮安裝的其余部分而言,它應該確實像內置硬盤驅動器一樣運轉;所以您應該可以根據需要對其進行分區和像平常一樣安裝Linux。    不過,提醒一句:當決定安裝引導加載程序(通常是GRUB或LILO)的位置時一定要小心-我建議不要將其安裝在Master Boot Record (MBR)(通常默認就是這樣)中。而是應該安裝在外置驅動器的根分區(或引導分區,如果使用單獨的引導加載程序)中。    現在我們已經在設備中安裝了Linux,接著要引導Linux。從這裡可以開始有一些技巧。    引導    在討論引導新的驅動器之前,需要了解一些引導加載程序理論。    引導加載程序通常安裝在計算機第一個硬盤的MBR中。調用引導加載程序時(BIOS自動執行MBR中的代碼),它通常顯示可以引導的OS的菜單。選擇一個給定OS引導。    關於此場景應該注意兩點:    * OS選擇菜單(通常)從磁盤加載。    * 要引導相關OS,引導加載程序需要從磁盤讀取相關內核。    由於以上操作在加載OS之前發生,它意味著所有磁盤讀取都必須通過BIOS調用的方式發生。這會涉及嚴重的問題:即為了直接引導磁盤,您的BIOS必須支持通過FireWire或USB連接的磁盤。這通常可以看作從這些類型的磁盤引導的一個BIOS選項。實際上FireWire BIOS支持當前很少見,但USB支持正在變得相當普遍。因此,如果您在相對較新的計算機中使用USB,應該可以直接在Linux中引導驅動器。    在外置驅動器的MBR中安裝了GRUB之後,當通過USB連接時,我可以直接引導該驅動器。當引導連接的磁盤時很簡單地進入了BIOS設置程序。外置磁盤將顯示為普通的硬盤驅動器:移動該磁盤使它在引導順序中位於內置驅動器之前。    我也可以在內置驅動器的MBR中安裝引導加載程序,並使用它引導USB驅動器(這時它在GRUB中顯示為hd1 in GRUB)。如果您使用FireWire,有可能BIOS不能直接引導驅動器,將需要一些其他操作。    幸運地是,因為Linux的靈活性,如果您不能直接引導(使用PCMCIA FireWire卡,我的情況肯定是這樣!),會有相當簡單的解決方案。可以從支持的設備(如軟盤驅動器、CD、USB key 或主驅動器上的微小分區)執行初始引導步驟,然後使用外置驅動器進行其他操作。    構建引導映像    可以使用兩種方法引導:    * 一階段引導    內核引導、安裝根文件系統,並通過調用初始化腳本(通常是/sbin/init)繼續進行初始化。    * 兩階段(initrd)引導    內核引導、安裝初始ram磁盤(initrd),執行進一步的可定制初始化,然後安裝根文件系統並繼續進行初始化(通常也是通過調用/sbin/init)這兩種方法都有自己的優點和缺點。    一階段引導    為了使用一階段引導,我們需要構建內核,其具有安裝內置根文件系統所需的所有驅動器(其他任何驅動器都可以在正常初始化過程中,在能夠從根分區加載的模塊中構建)。    如果我們要從非常小的設備引導(如軟盤),最好的方法是構建的內核僅具有足夠使我們可以安裝根外置文件系統的內置驅動器-然後將其他所有項構建為模塊。例如,我內置了SCSI支持、PCMCIA支持、IEE1394、SBP和類似支持,但是其他所有項(包括顯卡支持、網絡設備支持等等)都作為模塊構建,這些模塊存儲在根分區(在外置驅動器上)中,而不是軟盤上。    使用簡單(一階段)引導過程,我們應該能夠構建具有所需支持的內核,將其放在軟盤驅動器中,在軟盤中安裝引導加載程序(我使用 GRUB,但還有其他選擇,如LILO),然後使用與此內核(對於GRUB)相似的內核引導:    root (fd0)    kernel (fd0)/boot/bzImage root=/dev/sda1    這種方法基本上可以工作,但有兩個問題:    因為SBP支持使用SCSI仿真,為了檢測磁盤和允許安裝/dev/sda1,需要“重新掃描”仿真的SCSI總線。這種掃描使用一組簡單的命令執行。不過,遺憾的是,使用一階段引導,我們不能運行任何命令,直到內核已經完成引導,而內核直到安裝了根文件系統才能完成引導-典型的自相矛盾困境。令人感到高興的是,對於導致SCSI總線在啟動時被掃描的2.4內核有可用的修補程序(有關更多詳細信息,請參閱參考資料)。通過應用此修補程序,我可以使外置驅動器在引導過程中由內核自動檢測,而不需要任何重新掃描命令。這使我們進入了下一個問題。    內核中有定時窗口,這意味著內核經常在其能夠被正確的監測和初始化之前嘗試安裝根設備。對於此問題,也有可用的修補程序(請參閱參考資料獲得相關鏈接),它只是使內核在啟動時等待很短的時間,並使其在安裝根文件系統失敗時重試(為外置驅動器提供時間識別)。    通過應用這兩個修補程序,我可以成功地在可引導軟盤上構建內核,其將引導,然後使用外置FireWire驅動器作為根。    這種方法的主要問題是需要我們給內核源碼打補丁-這最多是一件痛苦之事(當發行新的內核版本時),嚴重時會是個大問題(如果沒有維護補丁程序與內核發生的其他更改保持一致的話)。    您可能已經想到如果我們的BIOS支持USB或FireWire且我們直接引導,我們就可以避免這兩個問題。不幸的是,情況並不是這樣:雖然此方法在引導過程中使用BIOS調用來訪問磁盤,一旦內核開始初始化,將不再使用BIOS,而是使用內核驅動器訪問磁盤-這樣就會遇到相同的問題。    兩階段引導    到了內核版本2.0.X,向Linux內核添加了一項引人注意的能力-使用“initial RAM disk”(或initrd)提供兩階段引導過程。    簡而言之,內核像平常一樣引導;但不安裝“真實的”根文件系統,而是在RAM中創建微型根文件系統並安裝該系統。在安裝真實的根、切換為使用真實的根並銷毀initial RAM disk之前,任何步驟都可以在此初始環境中執行。    這在各種環境中都有用,但是為了便於說明,我們將僅使用我們的迷你環境重新掃描SCSI總線,等待外置磁盤被識別,然後切換為使用該磁盤作為真實的根繼續引導。    為了使用這種方法,我們需要創建兩項,內核和initrd映像。    內核就是具有內置initrd支持的普通內核。initrd映像是包含我們的迷你根文件系統的回送文件系統映像(此映像可以使用gzip進行壓縮以減少其大小)。    有關創建或定制自己的initrd映像的詳細信息,可以查看參考資料部分。    在initrd映像中,有一個名為linuxrc的文件。當加載initrd時會執行此文件,所以確保其具有執行權限!我們為了進行說明,所以 linuxrc非常簡單:    清單 1. initrd linuxrc      #!/bin/sh  REAL_ROOT=/dev/sda1  # mount the /proc filesystem  mount -t proc none /proc    #for scsi-emulation  # modprobe sd_mod    #for pcmcia  # modprobe pcmcia_core    #for FireWire  # modprobe ieee1394  # modprobe ohci1394  # modprobe raw1394  # modprobe sbp2    #for USB  # modprobe usbcore  # modprobe ohci-hcd  # modprobe uhci-hcd  # modprobe usb-storage    # loop rescanning the scsi bus + rerunning devfsd  retries=5  i=1  until [ -e $REAL_ROOT ]  do  if [ $i -gt $retries ]  then  echo "Unable to mount real root ($REAL_ROOT) - Giving up!"  /bin/ash  exit  fi    echo "Real root ($REAL_ROOT) not found, retrying ($i)"  sleep 1  echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi  echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi  echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi  /bin/devfsd /dev -np  i=$((i+1))  done    #umount /proc as it will be remounted by the normal init process  umount /proc    #now we simply exit, and the normal boot process should continue  exit 0    我們做的所有操作都是加載適當的模塊來支持外置驅動器:它們應該根據需要被解注。(我在內核中構建了所有必需的支持,因此不需要任何模塊。)然後我們進行循環,重新掃描SCSI總線(通過將命令回送到 /proc pseudo-filesystem 中的特殊文件,並調用 devfsd ),直到出現根設備(我的例子中為 /dev/sda1)。在我的例子中,討論的仿真FireWire SCSI總線是100,不過也可以嘗試其他的,而不會有任何負面影響-如果您知道要使用的總線,可以裁剪腳本。同樣,如果您有其他SCSI設備(或仿真 SCSI設備),驅動器可能會有不同的字母(例如,/dev/sdb1)。如果不使用外置驅動器的第一個分區,則需要使用不同的編號(例如, /dev/sda2)。    現在所需要做的就是將相關文件復制到initrd映像中(可以使用mount-o loop 命令安裝未壓縮的映像)。特別地,需要確保具有linuxrc文件、在其中使用的所有命令和那些命令依靠的所有庫。然後,(未裝載的)映像可以進行壓縮。    接著把內核(bzImage)和initrd像(initrd.gz)復制到(bootable,ext3)軟盤中。    最後一步是在軟盤中安裝引導加載程序,並使用下列選項引導內核:kernel bzImage root=/dev/sda1 initrd=initrd.gz。    現在應該可以使用軟盤進行引導:它將從軟盤加載內核,將initrd映像加載到RAM中,等待識別根設備,然後像平常一樣從那裡繼續引導。從此以後,可以移除軟盤。    如果軟盤不適合(例如,如果計算機沒有軟盤驅動器),則可以使用能夠通過BIOS引導的任何設備。就個人而言,為了寫作本文,我使用小的32Mb USB盤。或者,如果您不介意改變內置硬盤驅動器的話,為了更便於引導,可以在其中創建小的分區。






Copyright © Linux教程網 All Rights Reserved