最小化 Linux 觀念與實施方法
本文說明最小化Linux的觀念以及實施的方法,這是 Embedded Linux / x86 課程的先備知識,透過這篇文章的說明,同學可以了解到最小化一個 Linux 所應實施的步驟,以有效學習 Embedded Linux 課程。
作者/陳俊宏
www.jollen.org
以觀念寫成的步驟
1. 準備 host computer
一開始我們必須建立一個工作平臺 (即實驗電腦 - host computer),也就是在 IBM PC 上安裝 Linux distribution。建議使用的 Linux distribution 為 Red Hat Linux 6.2 以上的版本,因為我們並不需要使用到 kernel 2.4 的版本,因此選擇安裝 Red Hat Linux 6.2 做為實驗環境。
您應具備的基本知識為:
- 編譯 Linux kernel
- Linux 管理技術
2. 選擇 target device
target device (目的裝置) 的選擇較常見的有 floppy disk、flash memory。現在有很多 floppy disk + Linux (floppy disk) 的 project,要製作能安裝在 floppy disk 上的最小化 Linux 並不難,一般的 Linux 開機磁片都可以稱為最小化的 Linux (利用 mkbootdisk 指令製作開機片)。
不過我們的目的是要建立給 Embedded Systems 用的 Embedded Linux,因此至少要能符合 3 項基本需求:
- 完整 system libraries:為了能執行各種應用程式。
- 標準 filesystem hierarchy:為了能提高程式在不同 Linux 系統的相容性。
- 符合 Red Hat Linux 架構:為了能順利將發展的程式由 host computer 移植到 target device。
在這裡我們選擇以 32M disk-on-Module 的 flash memory 做為 target device。
3. 在 target device 上建立 filesystem hierarchy
根據 Red Hat Linux 的階層檔案架構與 FHS 標準來建立 target device 的 filesystem hierarchy。我們可以在 host computer 上的空目錄建立後再拷貝到 target device,或是直接將 target device mount 到 host computer,直接寫入 target device。另外在 host computer 規劃一個新的分割區也是很好的做法。
若想要使用 RAM disk image,則必須在 host computer 上建立整個系統。
4. 建立 device file
使用 mknod 來建立 device file,device file 應根據 Linux Allocated Devices 文件 (Documentation/devices.txt 或 http://www.lanana.org/docs/device-list/) 來建立。通常我們只要建立會用到的 device file 即可。
在這裡為了方便起見,我們直接拿 PeeWeeLinux 的 device files 套件來使用即可,因此 /dev 裡的 device file 如下:
crw------- 1 root root 5, 1 Jan 7 2000 console |
真正的 Embedded Linux 應用會以 mknod 或是 mkext2fs 指令來建立 device files,並且 /dev 目錄下也只會有真正用到的 device files,不會有這麼多的 device file。
5. 安裝 glibc 至 target device
glibc 是標準 C 程式庫,我們可以直接由 host computer 將 glibc 的檔案拷貝到 target device。如果您想使用與 host computer 不同版本的 glibc,則要注意版本的向下相容性問題;不過建議 target device 與 host computer 的環境最好要一樣,這樣比較容易測試與除錯。
因為 Linux 是支援 shared libraries 的 OS,所以 target device 與 host computer 的 glibc 版本不同也不需要重新編譯所有的程式,除非 target device 不是在 x86 上執行,這時才需要做重新編譯 (corss-compiling) 的動作。
glibc 也可以考慮改用專用給 Embedded Systems 用的 uClibc。
6. 建立 base Linux system
base Linux system 的建立包括安裝其它 system libraries、utilities、compiler、shell ... 等等,至於到底應該要有什麼基本系統,應參考 LSB 標準。另外 LFS 文件也只做為建立 base Linux system 的參考,但建議應以 LSB 標準為主。
另外 Lineo 公司也發展許多專門給 Embedded System 用的高品質軟體,因此請使用底下 2 個專案套件:
(http://opensource.lineo.com/projects.html)
- BusyBox (大量使用中的熱門專案)
- TinyLogin (大量使用中的熱門專案)
uClibc 與有名的 uClinux 也都是 Lineo 公司的貢獻。
7. 設定 init
init 的設定就比較容易了,我們只要根據 runlevel 來設定 /etc/inittab 即可。另外,如果要跟 Red Hat Linux 的 /etc/rc.d 架構相容,可以自行修改 BusyBox 裡的 init.c 程式 (#define INIT_SCRIPT)。
請參考「Embedded Linux 的系統管理,#3: initial scripts」一文。
8. 編譯 Linux kernel
根據 target device 所在的硬體環境編譯 Linux kernel。編譯好後會得到 Linux kernel image (zImage/bzImage)。
我們的課程會為同學事先準備好已編譯完成的 Linux kernel。
9. 設定 boot loader
Linux 下的 boot loader 從老當益壯的 LILO、syslinux,到 grub 都可以使用。使用 DOM 的話,假如 boot loader 發生「not found BIOS drive」的話,只要手動做 BIOS 位址設定即可。以 LILO 為例,則是:
disk = /dev/hdc bios = 0x80 boot = /dev/hdc |
10. (參考) 使用 RAM disk image
前面 (~9.) 我們將 Linux 系統放在 physical 儲存裝置,如果您想讓檔案系統放在 RAM 裡 (例如在 RAM 很多的 PC 上),可以使用 RAM disk 技術,將檔案系統與 Linux kernel image 做成 compressed RAM disk image。
Embedded Linux 解決方案
前面我們介紹純手工打造的最小化 Linux,不過就非特殊用途的場合來講,現在有很多 Embedded Linux distribution 的現成解決方案可以給怕麻煩的人使用,我們可以不必親自從零開始做起。例如 PeeWeeLinux、Embedded Debian 或其它商業性質的產品。
結語
在這裡我們針對建立最小化 Linux 的觀念做了介紹,Embedded Linux 系統的基礎為最小化的 Linux,本文章說明製作最小化 Linux 的方法、步驟與觀念。