Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« February 2004 | (回到Blog入口) | April 2004 »

March 2004 歸檔

March 5, 2004

最小化 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
lrwxrwxrwx 1 root root 3 May 5 13:07 fb -> fb0
crw-r--r-- 1 root root 29, 0 Aug 15 2000 fb0
crw-r--r-- 1 root root 29, 32 Aug 15 2000 fb1
crw-r--r-- 1 root root 29, 64 Aug 15 2000 fb2
crw-r--r-- 1 root root 29, 96 Aug 15 2000 fb3
crw-r--r-- 1 root root 29, 128 Aug 15 2000 fb4
crw-r--r-- 1 root root 29, 160 Aug 15 2000 fb5
crw-r--r-- 1 root root 29, 192 Aug 15 2000 fb6
crw-r--r-- 1 root root 29, 224 Aug 15 2000 fb7
brw------- 1 root root 2, 0 Jan 7 2000 fd0
brw------- 1 root root 2, 1 Jan 7 2000 fd1
brw-r--r-- 1 root root 100, 0 Mar 5 2001 fla
brw-r--r-- 1 root root 100, 1 Mar 5 2001 fla1
brw-r--r-- 1 root root 100, 2 Mar 5 2001 fla2
brw-r--r-- 1 root root 100, 3 Mar 5 2001 fla3
brw-r--r-- 1 root root 100, 4 Mar 5 2001 fla4
crw-r--r-- 1 root root 1, 7 Jan 7 2000 full
brw-rw---- 1 root root 3, 0 Jan 7 2000 hda
brw-rw---- 1 root root 3, 1 Jan 7 2000 hda1
brw-rw---- 1 root root 3, 10 Jan 7 2000 hda10
brw-rw---- 1 root root 3, 11 Jan 7 2000 hda11
brw-rw---- 1 root root 3, 12 Jan 7 2000 hda12
brw-rw---- 1 root root 3, 13 Jan 7 2000 hda13
brw-rw---- 1 root root 3, 14 Jan 7 2000 hda14
brw-rw---- 1 root root 3, 15 Jan 7 2000 hda15
brw-rw---- 1 root root 3, 16 Jan 7 2000 hda16
brw-rw---- 1 root root 3, 2 Jan 7 2000 hda2
brw-rw---- 1 root root 3, 3 Jan 7 2000 hda3
brw-rw---- 1 root root 3, 4 Jan 7 2000 hda4
brw-rw---- 1 root root 3, 5 Jan 7 2000 hda5
brw-rw---- 1 root root 3, 6 Jan 7 2000 hda6
brw-rw---- 1 root root 3, 7 Jan 7 2000 hda7
brw-rw---- 1 root root 3, 8 Jan 7 2000 hda8
brw-rw---- 1 root root 3, 9 Jan 7 2000 hda9
brw-rw---- 1 root root 3, 64 Jan 7 2000 hdb
brw-rw---- 1 root root 3, 65 Jan 7 2000 hdb1
brw-rw---- 1 root root 3, 74 Jan 7 2000 hdb10
brw-rw---- 1 root root 3, 75 Jan 7 2000 hdb11
brw-rw---- 1 root root 3, 76 Jan 7 2000 hdb12
brw-rw---- 1 root root 3, 77 Jan 7 2000 hdb13
brw-rw---- 1 root root 3, 78 Jan 7 2000 hdb14
brw-rw---- 1 root root 3, 79 Jan 7 2000 hdb15
brw-rw---- 1 root root 3, 80 Jan 7 2000 hdb16
brw-rw---- 1 root root 3, 66 Jan 7 2000 hdb2
brw-rw---- 1 root root 3, 67 Jan 7 2000 hdb3
brw-rw---- 1 root root 3, 68 Jan 7 2000 hdb4
brw-rw---- 1 root root 3, 69 Jan 7 2000 hdb5
brw-rw---- 1 root root 3, 70 Jan 7 2000 hdb6
brw-rw---- 1 root root 3, 71 Jan 7 2000 hdb7
brw-rw---- 1 root root 3, 72 Jan 7 2000 hdb8
brw-rw---- 1 root root 3, 73 Jan 7 2000 hdb9
brw------- 1 root root 22, 0 Jan 7 2000 hdc
brw-rw---- 1 root root 22, 1 Jan 7 2000 hdc1
brw-rw---- 1 root root 22, 10 Jan 7 2000 hdc10
brw-rw---- 1 root root 22, 11 Jan 7 2000 hdc11
brw-rw---- 1 root root 22, 12 Jan 7 2000 hdc12
brw-rw---- 1 root root 22, 13 Jan 7 2000 hdc13
brw-rw---- 1 root root 22, 14 Jan 7 2000 hdc14
brw-rw---- 1 root root 22, 15 Jan 7 2000 hdc15
brw-rw---- 1 root root 22, 16 Jan 7 2000 hdc16
brw-rw---- 1 root root 22, 2 Jan 7 2000 hdc2
brw-rw---- 1 root root 22, 3 Jan 7 2000 hdc3
brw-rw---- 1 root root 22, 4 Jan 7 2000 hdc4
brw-rw---- 1 root root 22, 5 Jan 7 2000 hdc5
brw-rw---- 1 root root 22, 6 Jan 7 2000 hdc6
brw-rw---- 1 root root 22, 7 Jan 7 2000 hdc7
brw-rw---- 1 root root 22, 8 Jan 7 2000 hdc8
brw-rw---- 1 root root 22, 9 Jan 7 2000 hdc9
brw-rw---- 1 root root 22, 64 Jan 7 2000 hdd
brw-rw---- 1 root root 22, 65 Jan 7 2000 hdd1
brw-rw---- 1 root root 22, 74 Jan 7 2000 hdd10
brw-rw---- 1 root root 22, 75 Jan 7 2000 hdd11
brw-rw---- 1 root root 22, 76 Jan 7 2000 hdd12
brw-rw---- 1 root root 22, 77 Jan 7 2000 hdd13
brw-rw---- 1 root root 22, 78 Jan 7 2000 hdd14
brw-rw---- 1 root root 22, 79 Jan 7 2000 hdd15
brw-rw---- 1 root root 22, 80 Jan 7 2000 hdd16
brw-rw---- 1 root root 22, 66 Jan 7 2000 hdd2
brw-rw---- 1 root root 22, 67 Jan 7 2000 hdd3
brw-rw---- 1 root root 22, 68 Jan 7 2000 hdd4
brw-rw---- 1 root root 22, 69 Jan 7 2000 hdd5
brw-rw---- 1 root root 22, 70 Jan 7 2000 hdd6
brw-rw---- 1 root root 22, 71 Jan 7 2000 hdd7
brw-rw---- 1 root root 22, 72 Jan 7 2000 hdd8
brw-rw---- 1 root root 22, 73 Jan 7 2000 hdd9
prw------- 1 root root 0 Jan 7 2000 initctl
crw-r----- 1 root root 1, 2 Jan 7 2000 kmem
brw-rw---- 1 root root 7, 0 Jan 7 2000 loop0
brw-rw---- 1 root root 7, 1 Jan 7 2000 loop1
brw-rw---- 1 root root 7, 2 Jan 7 2000 loop2
brw-rw---- 1 root root 7, 3 Jan 7 2000 loop3
brw-rw---- 1 root root 7, 4 Jan 7 2000 loop4
brw-rw---- 1 root root 7, 5 Jan 7 2000 loop5
brw-rw---- 1 root root 7, 6 Jan 7 2000 loop6
brw-rw---- 1 root root 7, 7 Jan 7 2000 loop7
crw-rw-rw- 1 root root 1, 1 Jan 7 2000 mem
lrwxrwxrwx 1 root root 5 May 5 13:07 mouse -> psaux
crw-rw-rw- 1 root root 1, 3 Jan 7 2000 null
crw-r----- 1 root root 1, 4 Jan 7 2000 port
crw-rw---- 1 root root 10, 1 May 6 1998 psaux
brw-r----- 1 root root 1, 1 Jan 7 2000 ram
brw-rw---- 1 root root 1, 0 Jan 7 2000 ram0
brw-rw---- 1 root root 1, 1 Jan 7 2000 ram1
brw-rw---- 1 root root 1, 2 Jan 7 2000 ram2
brw-rw---- 1 root root 1, 3 Jan 7 2000 ram3
brw-rw---- 1 root root 1, 4 Jan 7 2000 ram4
brw-rw---- 1 root root 1, 5 Jan 7 2000 ram5
brw-rw---- 1 root root 1, 6 Jan 7 2000 ram6
brw-rw---- 1 root root 1, 7 Jan 7 2000 ram7
brw-rw---- 1 root root 1, 8 Jan 7 2000 ram8
brw-rw---- 1 root root 1, 9 Jan 7 2000 ram9
lrwxrwxrwx 1 root root 4 May 5 13:07 ramdisk -> ram0
crw-r--r-- 1 root root 1, 8 Jan 7 2000 random
crw-rw-r-- 1 root root 10, 135 Jan 7 2000 rtc
brw-rw---- 1 root root 8, 0 May 6 1998 sda
brw-rw---- 1 root root 8, 1 May 6 1998 sda1
brw-rw---- 1 root root 8, 2 May 6 1998 sda2
brw-rw---- 1 root root 8, 3 May 6 1998 sda3
brw-rw---- 1 root root 8, 4 May 6 1998 sda4
brw-rw---- 1 root root 8, 16 May 6 1998 sdb
brw-rw---- 1 root root 8, 17 May 6 1998 sdb1
brw-rw---- 1 root root 8, 18 May 6 1998 sdb2
brw-rw---- 1 root root 8, 19 May 6 1998 sdb3
brw-rw---- 1 root root 8, 20 May 6 1998 sdb4
brw-rw---- 1 root root 8, 32 May 6 1998 sdc
brw-rw---- 1 root root 8, 33 May 6 1998 sdc1
brw-rw---- 1 root root 8, 34 May 6 1998 sdc2
brw-rw---- 1 root root 8, 35 May 6 1998 sdc3
brw-rw---- 1 root root 8, 36 May 6 1998 sdc4
brw-rw---- 1 root root 8, 48 May 6 1998 sdd
brw-rw---- 1 root root 8, 49 May 6 1998 sdd1
brw-rw---- 1 root root 8, 50 May 6 1998 sdd2
brw-rw---- 1 root root 8, 51 May 6 1998 sdd3
brw-rw---- 1 root root 8, 52 May 6 1998 sdd4
crw------- 1 root root 4, 0 Jan 7 2000 systty
crw-rw-rw- 1 root root 5, 0 Jan 7 2000 tty
crw------- 1 root root 4, 0 Jan 7 2000 tty0
crw--w---- 1 root root 4, 1 Jan 7 2000 tty1
crw------- 1 root root 4, 2 Jan 7 2000 tty2
crw------- 1 root root 4, 3 Jan 7 2000 tty3
crw------- 1 root root 4, 4 Jan 7 2000 tty4
crw------- 1 root root 4, 5 Jan 7 2000 tty5
crw------- 1 root root 4, 6 Jan 7 2000 tty6
crw------- 1 root root 4, 7 Jan 7 2000 tty7
crw------- 1 root root 4, 8 Jan 7 2000 tty8
crw------- 1 root root 4, 9 Jan 7 2000 tty9
crw------- 1 root root 4, 64 Jan 7 2000 ttyS0
crw------- 1 root root 4, 65 Jan 7 2000 ttyS1
crw------- 1 root root 4, 66 Jan 7 2000 ttyS2
crw------- 1 root root 4, 67 Jan 7 2000 ttyS3
crw-r--r-- 1 root root 1, 9 Jan 7 2000 urandom
crw-rw-rw- 1 root root 1, 5 Jan 7 2000 zero

真正的 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 的方法、步驟與觀念。

關於 March 2004

此頁面包含了在March 2004發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 February 2004

後一個存檔 April 2004

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org