资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2011-6-7,#,嵌入式开发教程之自己定制软盘上的,Linux,系统方案,引言,一,.,前言,二,.Linux,启动过程,三,.,定制,Grub,引导程序,四,.,定制,Linux,内核,五,.,制定,initrd,六,.,定制根文件系统,七,.,其他方法,八,.,前景,嵌入式,Linux,是由一个几百,KB,的,Linux,内核和一个根据需要制定的文件系统所构成了,由于,Linux,是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多手机、,PDA,、,MP3,播放器等许多电子产品中。,本文将介绍一种两张软盘上的,Linux,系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。,引言,嵌入式,Linux,是由一个几百,KB,的,Linux,内核和一个根据需要制定的文件系统所构成了,由于,Linux,是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多手机、,PDA,、,MP3,播放器等许多电子产品中。本文将介绍一种两张软盘上的,Linux,系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解。,一,.,前言,所有的,PC,机在加电之后,,BIOS,会寻找到启动盘第一个扇区,并将其复制到,RAM,中来执行它,对于两种不同的启动方式,这个扇区通常含有两种不同的代码:引导程序,(,比如,Lilo,或,Grub,等,),的代码,引导程序会帮助定位内核的位置。内核的代码,这通常是从软盘启动时使用的引导的方式。对于前者,通常需要内核支持,initrd,。如果是后者,使用的,Boot Loader,就是,arch/i386/boot/bootsect.S,。当内核被编译的时候,这段执行代码就被链接到内核,image,的最开始的地方。这样很容易就能只要把内核复制到起始位置为第一个扇区的软盘上就能得到可自启动的软盘。内核会初始化设备驱动和内部的数据结构,之后它会到一个特定的位置,Ramdisk Word,来获得根文件系统的位置。内核必须知道去那里寻找这个根文件系统,否则它将停机。,二,.,嵌入式开发教程,:,Linux,启动过程,在使用软盘启动的方式时,内核可以把一个压缩的文件系统释放到,RAM,中,称之为,Ramdisk,,这是一个内存区域,但内核会把它当作磁盘一样使用。,本文中介绍的例子使用,Grub,做为引导程序,并使用,initrd,来辅助,Linux,的启动。两张软盘分别命名为,bootldr,盘和,rootfs,盘,在,bootldr,盘中内容为,grub,、内核、,initrd,,,rootfs,盘中是压缩过的根文件系统。系统启动时,bootldr,盘的,Grub,定位并执行内核,然后内核解开,initrd,,并执行,linuxrc,文件,这个文件负责提示用户更换,rootfs,盘并将其中内容解压至内存中,然后执行刚刚解压的,init,继续启动过程。,嵌入式开发教程,插入一张软盘,然后将其格式化,然后加载到,/mnt/floppy,#mke2fs/dev/fd0,#mount-t ext2/dev/fd0/mnt/floppy-o loop,在其中创建,/boot/grub,目录,#mkdir-p/mnt/floppy/boot/grub,将系统中,/boot/grub,下的,device.map,stage1,stage2,复制到,/mnt/floppy/boot/grub,中,然后在,/mnt/floppy/boot/grub,目录下创建,grub.conf,文件:,default=0,timeout=10,title Floppy Linux,kernel(fd0)/bzImage root=/dev/ram0,initrd(fd0)/initrd.gz,三,.,嵌入式开发教程,:,定制,Grub,引导程序,然后创建一个链接,#ln-s grub.conf menu.lst,执行,/sbin/grub-batch-device-map=/dev/null /dev/null,echo ,将第二章软盘上的内容解压到,sysroot,目录,(,内存,),中。,echo Loading root-archive from floppy.,dd if=/dev/fd0 bs=1k|bzip2-d|cpio-idv,嵌入式开发教程,下面将,initrd,中的文件,copy,到,sysroot/bin,目录下,这样可以把根文件系统中一部分内容放到,initrd(,第一张软盘,),中,因为软盘容量有限,当第一张软盘空间有剩余,而第二章软盘空间紧张的时候这会非常有用。,echo Copying:,for file in bzip2 chroot cp cpio echo readkey;do,echo-en ;echo-n$file,cp/bin/$file./bin/$file,done,下面将,/,目录设定为当前目录,即,sysroot,,并执行刚刚从,rootfs,盘中解压出来的,init,。,嵌入式开发教程,echo ,echo Pivoting/.,pivot_root.mnt/initrd,echo Starting init process.,exec chroot./sbin/init/dev/console 2&1,echo-enSomething went wrong.,/bin/sh|/mnt/initrd/bin/sh,当,initrd,所有必须的文件都放到,bootldr/initrd/local,目录下之后,就可以执行,bootldr/initrd/mkinitrd.sh,来创建,initrd,镜像文件。,mkinitrd.sh,的内容为:,#!/bin/sh,mount-t ext2/dev/fd0/mnt/floppy,rm-f/mnt/floppy/initrd.gz,rm-f initrd.gz,取,4M,大小的内存块格式化为,ext2,格式,并将其,mount,到,bootldr/initrd/ramdisk,上。,dd if=/dev/zero of=/dev/ram9 bs=1k count=4096,mke2fs/dev/ram9,mount-t ext2/dev/ram9 ramdisk/,把,local,中的文件复制到,ramdisk,目录中,也就是那块内存中。,cp-R local/*ramdisk/,umount ramdisk,将内存中的内容压缩为,initrd.gz,,并复制到,bootldr,盘中,dd if=/dev/ram9 bs=1k|gzip-v9 initrd.gz,cp initrd.gz/mnt/floppy/,umount/mnt/floppy,这样,,bootldr,盘就完成了。,一个根文件系统需要包含支持,Linux,系统运行的所有文件。通常包括:,基本的文件系统结构,基本的目录:,/dev,/proc,/bin,/sbin,/etc,/usr,/tmp,等。,基本的工具:,sh,ls,cp,cd,mv,等。,基本的配置文件:,rc,inittab,fstab,等。,设备:,/dev/hd*,/dev/tty*,/dev/fd0,/dev/ram*,/dev/console,等,.,基本的运行库。,Busybox,和,Tinylogin,是在嵌入式系统上常用的工具包,它们包含了上面提到的常用的工具和目录结构等,而且经过重新改写后所生成的代码比普通的,Linux,系统上的工具要小的多。,六,.,定制根文件系统,编辑,Busybox,的,Config.h,文件,选择自己需要的工具。修改,Busybox,和,Tinylogin,的,Makefile,文件,制定它们使用静态链接方式,(DOSTATIC=true),,这样就不需要在生成的系统中添加运行库了。将编译好的,Busybox,和,Tinylogin,文件放到,rootfs/local,中。,在,rootfs/local,中在自己创建下面几个目录:,dev/,tmp/,etc/,proc/,可以将系统中,/dev,下的设备复制到这个目录下,只需要复制必要的就可以了,例如:,#cp-dpR/dev/tty0-9/mnt/rootfs/dev,#cp-dpR/dev/ram*/mnt/rootfs/dev,但是要注意一定要包含必要的接各设备,/dev/console,/dev/kmem,/dev/mem,/dev/tty,/dev/ram0,/dev/null,等。,etc/,目录下包含了目标系统运行所必须的配置文件,它包括的内容依赖与目标系统所要运行的程序。最低限度,它包括下面几个文件:,inittab,、,rc,、,fstab,、,passwd,、,group,、,shadow,、,termcap,等。做为,init,进程的参数,,inittab,可以非常简单,仅需要包括下面几行即可:,:sysinit:/etc/rc,:askfirst:/bin/login,tty2:askfirst:/bin/login,tty3:askfirst:/bin/login,tty4:askfirst:/bin/login,:ctrlaltdel:/sbin/reboot,:restart:/sbin/init,:shutdown:/bin/umount-a-r,:shutdown:/sbin/swapoff-a,其中,sysinit,指明系统初始化脚本,rc,。,rc,所包含内容也可以非常少:,#!/bin/sh,/bin/mount-av,/bin/umount/mnt/initrd,/bin/hostname papaya,fstab,的内容为:,none/proc proc defaults 0 0,none/tmp tmpfs defaults 0 0,其他的配置文件可以从原来的系统中获得,然后修剪掉不必要的内容即可。,现在在,/mnt/rootfs,中已经包含了运行一个最低限度,Linux,系统所必须的所有文件和工具,,下面需要将它们压缩成一个文件系统了。插入,rootfs,软盘并执行,bootldr/rootfs/mkrootfs.sh,#!/bin/sh,rm-f rootfs.cpio.bz2,dd if=/dev/zero of=/dev/ram0 bs=1k count=4096,mke2fs/dev/ram0,mount-t ext2/dev/ram0 ramdisk/,cp-R local/*ramdisk/,cd ramdisk/,find.-depth-print|cpio-o ./rootfs.cpio,cd.,bzip2 rootfs.cpio,umount ramdisk,dd if=rootfs.cpio.bz2 of=/dev/fd0 bs=1k,OK,,,rootfs,盘也完成了,可以重启机器验证了。,将内核与文件系统进行整合,如果不用,Grub,引导还有两种选择,不过根文件系统就不能象上面那样打包再压缩,也不再使用,initrd,。把所有根文件系统文件放到一个目录中,(,比如上面的,rootfs/local),,然后执行,dd if=/dev/zero of=/dev/ram0 bs=1k count=4096,mke2fs/dev/ram0,mount-t ext2/dev/ram0 ramdisk/,cp-R local/*ramdisk/,umount ramdisk,dd if=/dev/ram0 bs=1k|gzip-v9 rootfs.gz,七,.,其他方法,1.,将内核与文件系统放置在一张软盘上,确定内核的大小和
展开阅读全文