
(2 安装启动 自己定制软盘上的Linux系统.docx
13页安装启动 - 自己定制软盘上的 Linux 系统一.前言嵌入式 Linux 是由一个几百 KB 的 Linux 内核和一个根据需要制定的文件系统所构成了, 由于 Linux 是开放源代码的操作系统,所以在嵌入式领域有着非常广阔的前景,并已经广泛应用在许多、PDA、MP3 播放器等许多电子产品中本文将介绍一种两张软盘上的Linux 系统,它可以当作系统应急修复盘、路由器或防火墙等许多地方,通过对它的研究,也可以加深对嵌入式系统的理解二.Linux 启动过程所有的 PC 机在加电之后,BIOS 会寻找到启动盘第一个扇区,并将其复制到 RAM 中来执行它,对于两种不同的启动方式,这个扇区通常含有两种不同的代码:引导程序(比如Lilo 或 Grub 等)的代码,引导程序会帮助定位内核的位置内核的代码,这通常是从软盘启动时使用的引导的方式对于前者,通常需要内核支持 initrd如果是后者,使用的Boot Loader 就是 arch/i386/boot/bootsect.S当内核被编译的时候,这段执行代码就被链接到内核 image 的最开始的地方。
这样很容易就能只要把内核复制到起始位置为第一个扇区的软盘上就能得到可自启动的软盘内核会初始化设备驱动和内部的数据结构,之后它会到一个特定的位置 ――Ramdisk Word 来获得根文件系统的位置内核必须知道去那里寻找这个根文件系统,否则它将停机在使用软盘启动的方式时,内核可以把一个压缩的文件系统释放到 RAM 中,称之为Ramdisk,这是一个内存区域,但内核会把它当作磁盘一样使用本文中介绍的例子使用 Grub 做为引导程序,并使用 initrd 来辅助 Linux 的启动两张软盘分别命名为 bootldr 盘和 rootfs 盘,在 bootldr 盘中内容为 grub、内核、initrd,rootfs 盘中是压缩过的根文件系统系统启动时 bootldr 盘的 Grub 定位并执行内核,然后内核解开 initrd,并执行 linuxrc 文件,这个文件负责提示用户更换 rootfs盘并将其中内容解压至内存中,然后执行刚刚解压的 init 继续启动过程为了方便理解这个例子,先介绍目录结构如下:/home/papaya├─bootldr/ │ ├─grub/│ ├─kernel/│ │ ├─images/│ │ └─linux-2.4.21/│ └─initrd/│ ├─mkinitrd.sh│ ├─local/│ └─ramdisk/├─rootfs/│ ├─mkrootfs.sh│ ├─ramdisk/│ └─local/└─lib/三.定制 Grub 引导程序插入一张软盘,然后将其格式化,然后加载到/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=0timeout=10title Floppy Linuxkernel (fd0)/bzImage root=/dev/ram0 initrd (fd0)/initrd.gz然后创建一个链接#ln -s grub.conf menu.lst执行/sbin/grub --batch --device-map=/dev/null /dev/nullecho " "将第二章软盘上的内容解压到 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; doecho -en " "; echo -n $filecp /bin/$file ./bin/$filedone下面将/目录设定为当前目录,即 sysroot,并执行刚刚从 rootfs 盘中解压出来的 initecho " "echo "Pivoting / ..."pivot_root . mnt/initrdecho "Starting init process..."exec chroot . /sbin/init /dev/console 2>&1echo -en"Something went wrong ..."/bin/sh || /mnt/initrd/bin/sh当 initrd 所有必须的文件都放到 bootldr/initrd/local 目录下之后,就可以执行bootldr/initrd/mkinitrd.sh 来创建 initrd 镜像文件。
mkinitrd.sh 的内容为:#!/bin/shmount -t ext2 /dev/fd0 /mnt/floppyrm -f /mnt/floppy/initrd.gzrm -f initrd.gz 取 4M 大小的内存块格式化为 ext2 格式,并将其 mount 到 bootldr/initrd/ramdisk 上dd if=/dev/zero of=/dev/ram9 bs=1k count=4096mke2fs /dev/ram9mount -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.gzcp 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/tty[0-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/logintty3::askfirst:/bin/logintty4::askfirst:/bin/login ::ctrlaltdel:/sbin/reboot::restart:/sbin/init::shutdown:/bin/umount -a -r::shutdown:/sbin/swapoff -a其中 sysinit 指明系统初始化脚本 rcrc 所包含内容也可以非常少:#!/bin/sh/bin/mount -av/bin/umount /mnt/initrd/bin/hostname papayafstab 的内容为: none /proc proc defaults 0 0none /tmp tmpfs defaults 0 0其他的配置文件可以从原来的系统中获得,然后修剪掉不必要的内容即可。
现在在/mnt/rootfs 中已经包含了运行一个最低限度 Linux 系统所必须的所有文件和工具,下面需要将它们压缩成一个文件系统了插入 rootfs 软盘并执行bootldr/rootfs/mkrootfs.sh#!/bin/shrm -f rootfs.cpio.bz2dd if=/dev/zero of=/dev/ram0 bs=1k count=4096mke2fs /dev/ram0mount -t ext2 /dev/ram0 ramdisk/cp -R local/* ramdisk/cd ramdisk/find . -depth -print | cpio -o > ../rootfs.cpiocd ..bzip2 rootfs.cpioumount ramdiskdd if=rootfs.cpio.bz2 of=/dev/fd0 bs=1kOK,rootfs 盘也完成了,可以重启机器验证了七.其他方法 。
