輕量LINUX:利用舊硬體打破軟硬體升級週期(轉)

BSDLite發表於2007-08-11
輕量LINUX:利用舊硬體打破軟硬體升級週期(轉)[@more@]  策略與建議
  我計劃將這臺行動式電腦用於寫作以及遠端訪問我的功能更強大的桌面開發系統。因此,我需要系統具有網路支援、shell、象 vi 這樣的文字編輯器、用於文件版本控制的 CVS 以及用於安全遠端訪問的 SSH。在資源方面,我有 12 MB 記憶體和 540 MB 硬碟可以使用。
  
  因為進入了我還未完全研究過的領域,所以我選擇了有許多小里程碑的途徑。我在本文中採用了這種方法。經常出現的里程碑幫助我確定是否在解決問題方面有所進展;經常出現的里程碑在某一步驟不象所宣稱的那樣有效工作時,可以幫助您除錯過程。我在本文中有好幾處鼓勵您,即使在系統還未完成時,也不妨試用一下您的系統。這些測試可以幫助您判斷到那一點為止的工作是否正確。
  
  我的第一點建議是不要考慮使用任何已建立的 Linux 分發版。我最初也希望透過安裝現有的 Linux 分發版來避免從頭開始工作。但很快發現它們都需要比可用資源更多的資源。即使 Slackware(長久以來一直以支援低記憶體系統著稱)也至少需要 12 MB 記憶體才能安裝分發版,即使在那樣的情況下也工作得非常勉強。
  
  在著手構建系統之前您可能需要考慮的一個可能性是從現有的“單磁碟” Linux 分發版 — 如 tomsrtbt(單磁碟應急軟盤分發版)、Trinux(單磁碟 Linux 安全性工具箱)甚至 Tin Foil Hat Linux(被設計用於加密、簽名和擦除檔案的安全 Linux 分發版)— 開始,然後對其進行擴充套件。
  
  在正式開始構建自己的系統以前,我研究了幾個這樣的迷你分發版本並從中學到了很多。儘管我研究的分發版中沒有一個是專門面向資源有限的硬體(比如我的行動式電腦)的,但它們的確都有一個共同目標 — 將盡可能多的功能塞進儘可能小的空間。儘管它們為實現這一目標所做的許多權衡對我來說是不可接受的,但我注意到了 uClibc 和 BusyBox,最終我使用了這兩者。
  
  uClibc
  每個 Linux 系統都需要一個 C 庫。C 庫提供了常用的檔案操作(開啟、讀和寫)、記憶體管理操作(malloc 和 free)和許多其它使一個 Linux 系統名副其實的函式。大多數 Linux 系統使用 Glibc。Glibc 是成熟的、經過良好測試的,並且正在積極的開發中。遺憾的是,它使用的記憶體數量相對也較多,對於我的機器來說是不可接受的。
  
  我並不建議使用 Glibc,而建議使用 uClibc,這是一個現代的、穩定的、具有高度相容性的 Glibc 替代品。uClibc 是針對嵌入式系統開發的,所以它力圖成為完整但輕量級的 C 庫。速度與大小之間的權衡最後由大小決定。儘管如此,在絕大多數情況下,針對 uClibc 編譯的應用程式和工具與針對 glibc 編譯的沒有分別。uClibc 網站(請參閱參考資料)列出了超過一百個已知或已得到報告使用 uClibc 的應用程式。該列表包括象 Gzip 和 Lilo 這樣的標準實用程式,以及象 Lame(MP3 編碼器)和 Freeswan(VPN 實現)這樣不太常用的實用程式。因為我透過執行在系統上的工具和應用程式的成熟度來衡量一個系統的有效性,所以對我來說,我選擇的 C 庫能支援我需要的工具是很重要的。
  
  Dietlibc 是另一個可替代 Glibc 的 C 庫。我的研究表明:儘管 Dietlibc 需要的記憶體比 uClibc 更少,但它是透過犧牲與 Glibc 的相容性實現這一點的。最後,我選擇使用 uClibc,因為它看起來能支援更多我需要使用的應用程式。
  
  BusyBox
  Linux 系統使用者需要一個由數量豐富的命令列工具集組成的工作環境。因為逐一構建所有必需的工具似乎是一個很耗時間的任務,所以我再次借用嵌入式系統的經驗,選擇了 BusyBox,這是一個“樣樣皆通”的應用程式,它在一個二進位制檔案中提供了您希望在 Linux 系統中看到的大多數工具的實現。
  
  透過使用 BusyBox,我保留了寶貴的資源並節省了大量的時間投入。我找不到象它這樣的其它工具集。
  
  組成部分及準備工作
  要繼續下去,您需要有權使用一個現有 Linux 系統 — 最好該系統執行所用的微處理器與您目標系統的是同一系列。一臺執行 Linux 的老式行動式電腦是用於編寫和編輯的極佳環境,但在編譯軟體包時它是無法與現代硬體競爭的。我們將使用現有的 Linux 系統來構建核心及支援軟體,並建立引導目標系統進入 Linux 所必需的磁碟。將 Linux 安裝在目標系統上之後,在把完成的產品轉移到目標系統之前,我們將繼續使用現有的系統來構建應用程式。我把現有的 Linux 系統稱為“構建系統”,把另外那個 Linux 系統稱為“目標系統”。
  
  首先下載以下軟體包(請參閱參考資料以獲得連結):
  
  linux-2.4.19.tar.gz(核心)
  uClibc-0.9.15.tar.gz(C 庫)
  busybox-0.60.4.tar.gz(有用的命令列工具)
  util-linux-2.11u.tar.gz(fdisk 可執行檔案)
  e2fsprogs-1.27.tar.gz(用於檔案系統的建立)
  lilo-22.3.2.tar.gz(引導裝入程式,boot loader)
  
  為了用 uClibc 構建和連結 BusyBox,您需要在目標系統的 /usr 目錄中安裝 uClibc 開發環境,因此您需要對該目錄的寫訪問權。
  
  該過程的一部分包含構建一個簡單的根檔案系統。我透過提供合適的根檔案系統框架簡化了這一步驟,同時提供的還有必需的配置檔案和裝置檔案。您可以從參考資料下載該檔案框架 skeleton.tar.gz。
  
  您需要閱讀並理解必要的文件,其中包括 README 和 INSTALL 文件。由於有太多的選項和特殊情況,所以無法在本文中介紹所有的排列組合。在以下幾節中,我介紹了我推薦的配置。
  
  讓我們來構建核心。
  
  構建 Linux 核心
  構建一個有效的 Linux 核心而不更改預設配置是可能的。但幾個經過慎重考慮的更改將產生更適合我們需要的系統。特別地,我始終記得網路連線的需求。下表列出了我更改的選項,並就您可能希望對系統作的更改提出了建議。
  
  核心配置

  注:行動式電腦聯網可能需要" PCMCIA 支援。較舊的行動式電腦不能支援較新的 Cardbus(32 位)卡,但那通常不成問題,因為仍有許多 16 位網路卡有售。如果您計劃透過電纜連線到網路,則需要在“PCMCIA network device support”下選擇合適的驅動程式,這沒有包括在上表中。我使用無線連線。許多 16 位 PCMCIA 卡使用 Hermes 晶片組。您可能需要稍稍更改配置以符合您的 PCMCIA 控制器晶片組和 PCMCIA 卡。
  
  應配置核心以專門支援您的 CPU。如果您在新機器上為較舊的機器構建核心,那麼需要選擇適當的處理器,如 Intel 386 或 486。為了節省空間,您可能要禁用您認為不需要的一切選項,特別是 SCSI 支援。
  
  以下是構建核心的步驟:
  
  make xconfig
  make dep
  make bzImage
  make modules
  
  稍後我將描述如何安裝核心。
  
  構建 uClibc
  構建 uClibc 比構建核心更有挑戰性。uClibc 軟體包構建兩個相關元件。第一個元件是支援您目標系統的實用程式和應用程式的執行時庫。第二個元件是一個開發環境。uClibc 開發環境使構建使用 uClibc 的實用程式和應用程式變得簡單,甚至在本身不使用 uClibc 的系統上也是如此。uClibc 建立並安裝用於 gcc 及相關工具的封裝器。一旦安裝了 uClibc 開發環境,您就可以針對 uClibc 而不是 glibc 來編譯並連結大多數應用程式。
  
  uClibc 配置

  上表中的這三個選項使構建和安裝象" SSH 和 NFS 這樣的軟體(如果您以後選擇這麼做的話)成為可能。您還需要指定 Linux 核心原始檔的位置。
  
  下面的步驟概述瞭如何構建 uClibc 軟體包。採用這些步驟的前提是您已將壓縮文件解壓縮到名為 uClibc-0.9.15 的目錄中:
  
  cd uClibc-0.9.15
  ln -s ./extra/Configs/Config.i386 ./Config
  編輯 Config 檔案。啟用上表中指定的選項。
  make
  
  上面的指示資訊假定您正為 Intel 微處理器構建 uClibc。如果您為別的微處理器構建 uClibc,則可在上面的步驟 2 中建立指向適當 Config 檔案的連結。
  
  make 命令構建軟體包。為了用 uClibc 編譯和連結其它實用程式和應用程式,您需要安裝開發環境。make install 命令安裝開發環境。
  
  一旦安裝了開發環境,您就可以透過更改 PATH 環境變數,使用 uClibc 開發工具來替代標準的基於 Glibc 的開發工具,如下所示:
  
  export PATH=/usr/bin:$PATH
  
  一旦更改了 PATH 環境變數,您就會發現大多數開發命令(gcc、ld 和 ldd 等)如今指向 uClibc 封裝器。但是命令仍應照常工作。在構建下面的任何軟體之前正確設定 PATH 環境變數是非常重要的。
  
  在我的 Redhat 7.3 系統上不能原封不動地構建 uClibc 的最新版本(版本 0.9.15)。用於定位 gcc 頭的技術在發行版本 0.9.12 時有了變化。如果在您的系統上不能構建 uClibc,可以應用本文參考資料一節中提供的 uclibc 補丁程式。它將以前的技術移植到 uClibc 的最新發行版。
  
  稍後我將描述如何在引導盤和根檔案系統盤上安裝執行時環境。
  
  構建 BusyBox
  如果有一個任務比其它任務更能簡化從頭構建 Linux 系統的過程的話,那就是構建和安裝 BusyBox 軟體包。BusyBox 是一個可執行檔案,它提供許多其它常用命令列工具的功能,所有這些功能都合為一體。BusyBox 的文件聲稱構建一個有效系統所需要的全部就是 BusyBox 和“/dev、/etc 以及核心”— 而且他們沒有開玩笑。
  
  下表描述了您應對 Config.h 檔案做的更改。
  
  BusyBox 配置

  確保您選擇" ASH 作為預設 shell — 它是 BusyBox 中可用且最能相容 Bourne 的 shell。它將執行大多數 shell 指令碼,包括那些設定聯網所必需的指令碼。
  
  如果您啟用 NFS 掛裝支援,請注意告訴您必須用“-o nolock”選項掛裝的註釋,因為您極有可能不在執行 portmapper 守護程式。
  
  您還必須更改 Makefile 並啟用大檔案支援。將 DOLFS 設定為 true。
  
  用 make 命令構建 BusyBox。
  
  構建 Util-linux
  Util-linux 是一組低層系統實用程式。我們對 fdisk 實用程式感興趣:我們需要它對行動式電腦的硬碟進行分割槽。
  
  Util-linux 易於配置和構建。輸入 configure 然後輸入 make。
  
  構建 E2fsprogs
  E2fsprogs 是用於建立和操作 ext2 和 ext3 格式的檔案系統的實用程式集。一旦使用 fdisk 對硬碟分割槽後,則將使用 e2fsprogs 實用程式來建立檔案系統。
  
  以下是構建 E2fsprogs 軟體包的步驟。
  
  mkdir build
  cd build
  ../configure --enable-elf-shlibs
  make
  make distribution_tar_file
  
  最後一步中未記錄的 makefile 目標建立一個包含必需的庫和可執行檔案的 TAR 檔案。我們將在後面用該檔案安裝軟體包。
  
  構建 LILO
  LILO 是 Linux 引導裝入程式。它負責裝入和啟動 Linux 核心。LILO 有替代品,如 GRUB。我選擇 LILO 是因為我對它及其配置最為熟悉。如果您覺得有風險,可以考慮使用替代品中的一個。
  
  make 命令構建了 LILO。
  
  建立引導盤
  引導盤包含您先前構建的 Linux 核心。當您開機或復位系統時,將使用這個引導盤將核心裝入目標系統。
  
  構建引導盤有幾種不同的方法。Linux 核心可以直接從軟盤引導(如果配置成這樣做的話)。然而,大多數 Linux 使用者透過引導裝入程式(如 LILO 或 GRUB)的幫助來引導系統。Boot Disk HOWTO(請參閱參考資料)描述這兩個方法和其它一兩個方法。我將描述如何構建我的基於 LILO 的引導盤版本。我推薦基於 LILO 的方法,因為它允許在引導期間向核心傳遞引數。這在處理較舊的硬體時非常重要,舊的硬體常常會受到麻煩的特性的困擾。在我的例子中,Linux 軟盤驅動器需要指定引數“floppy=thinkpad”,以便解決我的這一型號 ThinkPad 軟盤驅動器的問題。
  
  LILO 方法需要在您構建軟體的系統上安裝 LILO 可執行檔案以使引導軟盤可引導,因此必須安裝 LILO 才能繼續。如果您不能或不打算安裝 LILO,我建議您嘗試 Boot Disk HOWTO 中描述的建立引導盤的其它方法。
  
  您必須具有 root 使用者身份以便執行以下操作:
  
  將一張軟盤放入軟碟機
  mke2fs -N 24 -m 0 /dev/fd0
  mount -o dev /dev/fd0 /mnt
  mkdir /mnt/boot
  mkdir /mnt/dev
  cp -R /dev/null /mnt/dev
  cp -R /dev/fd0 /mnt/dev
  cp /boot/boot.b /mnt/boot
  
  現在您必須將核心從 /arch/i386/boot 目錄複製到軟盤並設定 ramdisk 字。用您構建核心的目錄替代下面路徑中的 。
  
  cp /arch/i386/boot/bzImage /mnt
  rdev -r /mnt/bzImage 49152
  
  為了製作引導軟盤,您必須執行 LILO。首先,建立名為 /mnt/bdlilo.conf 的 LILO 配置檔案。我建立了一個具有以下資訊的檔案:
  
  Lilo 配置
  boot   =/dev/fd0
  install  =/boot/boot.b
  map    =/boot/map
  read-write
  backup  =/dev/null
  compact
  image   =/bzImage
  label   =Linux
  root   =/dev/fd0
  
  以下命令將引導裝入程式複製到引導盤。
  
  lilo -v -C bdlilo.conf -r /mnt
  
  如果您夠勇敢的話,現在就可以嘗試從引導磁碟引導您的目標系統了。但您不會看到命令提示符,因為我們還遺漏了根檔案系統盤,不過您可以感覺一下是否成功地執行了以上步驟。
  
  建立根檔案系統盤
  如果您嘗試引導目標系統,隨著核心的各個部分被初始化,您將看到一行行熟悉的核心輸出。核心引導過程將以與下面相似的一行結束:
  
  VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER
  
  我們在上一節建立的引導盤只擁有核心。為了建立有效的基於軟盤的 Linux 系統,我們需要一個完整的檔案系統以及先前構建的 BusyBox 軟體。
  
  在本文的參考資料一節中,我提供了一個連結,它指向一個包含檔案系統框架的檔案。該檔案系統框架包含適當的目錄層次結構,並且還在 /dev 目錄中定義了足夠的裝置以使您的系統能夠運轉。我們將把來自先前構建的軟體包的檔案、庫和可執行檔案新增到這個檔案系統。
  
  您需要具有 root 使用者身份才能執行以下操作:
  
  將一張軟盤放入軟碟機
  dd if=/dev/zero of=/tmp/fsfile bs=1k count=4096
  mke2fs -m 0 -N 2000 /tmp/fsfile
  mount -t ext2 -o loop /tmp/fsfile /mnt
  cd /mnt
  tar xvzf
  
  我們將把 uClibc 和 BusyBox 安裝到新的檔案系統上。
  
  cd
  make PREFIX=/mnt install_target
  cd
  make PREFIX=/mnt install
  
  將檔案系統複製到磁碟就完成了這部分的操作。
  
  cd ..
  umount /mnt
  dd if=/tmp/fsfile bs=1k | gzip -v9 > /tmp/fsfile.gz
  dd if=/tmp/fsfile.gz of=/dev/fd0 bs=1k
  
  引導盤和根檔案系統盤是您引導系統進入 Linux 所需的全部。接下來是將 Linux 安裝到行動式電腦的硬碟上。
  
  建立輔助盤
  輔助盤儲存對行動式電腦的硬碟進行分割槽和構建檔案系統所必需的工具。
  
  將一張軟盤放入軟碟機
  dd if=/dev/zero of=/tmp/sufile bs=1k count=1440
  mke2fs -m 0 -N 2000 /tmp/sufile
  mount -t ext2 -o loop /tmp/sufile /mnt
  cd /mnt
  
  我們將把餘下的工具和實用程式安裝到新的檔案系統上。
  
  cd
  mkdir /mnt/sbin
  cp fdisk/fdisk /mnt/sbin
  cd /mnt
  tar -xvzf /build/e2fsprogs-1.27-elfbin.tar.gz
  cd
  make ROOT=/mnt install
  
  將檔案寫到磁碟就完成了這部分的操作。輔助盤將象普通盤一樣掛裝,因此重要的是不要壓縮該映象。
  
  cd ..
  umount /mnt
  dd if=/tmp/sufile of=/dev/fd0 bs=1k
  
  現在您的三張軟盤上有了在行動式電腦上安裝 Linux 需要的所有檔案。
  
  安裝 Linux
  是享受您的勞動成果的時候了。將引導盤放入您目標系統的軟碟機,然後開啟電源。Linux 核心應進行引導。引導後它會要求您插入根檔案系統盤。插入根檔案系統盤。核心將把經過壓縮的檔案系統從根檔案系統盤裝入 ramdisk 並完成系統引導過程。
  一旦" Linux 已經引導,就可以掛裝輔助盤並將檔案從那個磁碟複製到 ramdisk 上的根檔案系統。一旦複製了 fdisk、mke2fs、lilo 及其支援檔案,您就可以著手在目標系統的硬碟驅動器上進行分割槽和構建檔案系統了。
  
  fdisk 是用於建立和操作分割槽表的選單驅動的實用程式。它相對來說易於使用:m 列印可用命令,n 新增新的分割槽,p 列印分割槽表,而 w 則寫分割槽表然後退出。請查閱手冊頁以獲得更詳細的資訊。
  
  當對硬碟驅動器分割槽時,不要忘了新增一個交換(swap)分割槽。我建議建立一個大小為系統記憶體三到四倍的交換分割槽。
  
  mke2fs 在分割槽上建立 ext2 或 ext3 檔案系統。命令 mke2fs -j /dev/hda1 將在 /dev/hda1 上建立一個 ext3 分割槽。我建議使用較新的 ext3 檔案系統而不是 ext2。日誌記錄活動的額外代價換來的是增強的可靠性。
  
  一旦對硬碟進行了分割槽並且構建了檔案系統,就可以掛裝硬碟並將檔案從基於 ramdisk 的根檔案系統複製到新的檔案系統。您需要但卻不在基於 ramdisk 的根檔案系統上的檔案只有 Linux 核心和 LILO 配置檔案。您可以從先前建立的引導盤獲取這些檔案。插入並掛裝引導軟盤,然後將核心及 LILO 配置檔案複製到硬碟驅動器上。將二者都放入硬碟驅動器檔案系統的 /boot 目錄中。將 LILO 配置檔案重新命名為 lilo.conf,然後編輯它,使它與下面的內容相似:
  
  Lilo 配置
  boot   =/dev/hda1
  install  =/boot/boot.b
  map    =/boot/map
  read-write
  backup  =/dev/null
  compact
  image   =/boot/bzImage
  label   =Linux
  root   =/dev/hda1
  
  最後,按以下步驟安裝 LILO(假定硬碟驅動器掛裝到 /hd):
  
  chroot /hd /bin/ash
  /sbin/lilo
  
  那應該能成功。您已經構建了必需的軟體,用它從軟盤引導目標系統進入 Linux,在目標系統上進行分割槽並建立檔案系統,然後設定系統直接從硬碟驅動器引導。一天勞動的結果並不壞!
  
  結束語
  Linux 核心、uClibc 庫與 BusyBox 軟體的結合使從頭構建 Linux 系統變得很容易。以上描述的過程與基本原理非常適合構建恢復盤、建立您自己的定製 Linux 分發版、以及針對較舊的硬體或非傳統的嵌入式應用程式構建佔用資源較少的分發版。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946625/,如需轉載,請註明出處,否則將追究法律責任。

相關文章