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/...ce-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...ects.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 的方法、步骤与观念。