最小化 Linux 建置方法、步驟與觀念

Home Home
引用 | 編輯 cute8161
2005-11-22 19:10
樓主
推文 x0
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

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)。

8. 編譯 Linux kernel
根據 target device 所在的硬體環境編譯 Linux kernel。編譯好後會得到 Linux kernel image (zImage/bzImage)。

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

獻花 x0
引用 | 編輯 mnbmnb5266
2010-08-23 22:36
1樓
  
恩,原來如此,謝謝您的分享了,我會好好學寫的

獻花 x0