.... 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Fall 2010
. Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像
. 编译 Linux 在 QEMU 模拟器上运行 qemu+linux-2.6.26.1. 准备模拟器.2. 编译 Linux 内核..3. 准备根文件系统
. 1 准备模拟器 qemu..1 sudo apt-get install qemu..2 有的源中不带 qemu, 则需要自己编译获得 qemu 源代码 qemu-0.12.3.tar.gz, 并解压缩配置 编译, 并安装到指定的目录下./configure prefix=path TO YOUR QEMU INSTALL DIR target-list=i386-softmmu make su -c make install 编译安装完成之后, 如何使用 qemu? 可以通过指定路径的方式使用 qemu, 此时 qemu 在安装目录下的 bin 目录中可以将安装目录 /bin 加入到 PATH 环境变量中, 此时可以在任何目录下直接使用 qemu
. 编译 Linux 内核 I 获得 linux-2.6.26.tar.gz, 解压缩得到目录 linux-2.6.26, 不妨称之为 Linux 源代码根目录 ( 以下简称源码根目录 ) tar -zvxf linux-2.6.26.tar.gz 进入源代码根目录 可以使用 make help 得到一些编译内核的帮助信息 我们采用 i386 的缺省编译 make i386 defconfig 可以观察一下编译过程中的输出信息, 特别是编译最后阶段的输出信息
. 准备好一个简单的根目录和应用程序 I 准备一个应用程序例如一个 helloworld 输出循环, 使用静态链接的方法编译成一个可执行文件, 命名为 init gcc -static -o init xxx.c 建立目标根目录映像 dd if=/dev/zero of=myinitrd4m.img bs=4096 count=1024 mke2fs myinitrd4m.img mkdir rootfs sudo mount -o loop myinitrd4m.img rootfs 将 init 拷贝到目标根目录下 (linux 启动后期会在根目录中寻找一个应用程序来运行, 在根目录下提供 init 是一种可选方案 ) cp init rootfs/
. 准备好一个简单的根目录和应用程序 II 准备 dev 目录 sudo mkdir rootfs/dev linux 启动过程中会启用 console 设备 sudo mknod rootfs/dev/console c 5 1 另外需要提供一个 linux 根设备, 我们使用 ram sudo mknod rootfs/dev/ram b 1 0 sudo umount rootfs 至此, 一个包含简单应用程序的根目录映像 myinitrd4m.img 就准备好了
. 运行 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像 qemu -kernel PATH TO linux-2.6.26/arch/x86/boot/bzimage -initrd myinitrd4m.img -append root=/dev/ram init=/init 可以看到系统能够启动, 并且在启动后看到 init 的输出结果
. 也可以利用 busybox 建立根文件系统 I 下载 busybox 的源代码, 解压缩 make help 可以得到一些编译 busybox 的帮助信息 我们在缺省编译的基础上, 稍作修改 make defconfig make menuconfig 修改如下配置 : make enable:busybox settings > build options > build busybox as a static binary(no share libs) enable:busybox settings > installation options > dont use /usr 准备根目录映像, 并安装 busybox 到根目录映像中 我们使用前面生成的 myinitrd4m.img sudo mount -o loop myinitrd4m.img rootfs
. 也可以利用 busybox 建立根文件系统 II 运行 在 busybox 目录下 sudo make CONFIG PREFIX=PATH TO rootfs/ install sudo umount rootfs qemu -kernel PATH TO linux-2.6.26/arch/x86/boot/bzimage -initrd myinitrd4m.img -append root=/dev/ram init=/bin/ash 此时可以进入 busybox 提供的 shell 环境
. 在 busybox 的 shell 中运行 helloworld 提供一个 helloworld 程序, 静态编译成 hello gcc -static -o hello xxx.c sudo mount -o loop myinitrd4m.img rootfs sudo cp hello rootfs sudo umount rootfs 运行 qemu -kernel PATH TO linux-2.6.26/arch/x86/boot/bzimage -initrd myinitrd4m.img -append root=/dev/ram init=/bin/ash 进入 shell 后, 运行./hello
. 制作带 grub 启动的磁盘映像..1 获得 grub..2 制作 grub 启动软盘..3 准备磁盘映像..4 将磁盘映像升级为带 grub 启动的
. 获得 grub, 并制作 grub 启动软盘 下载 grub-0.97-i386-pc.tar.gz, 解压缩 查看解压缩得到的目录 建立软盘映像 dd if=/dev/zero of=a.img bs=512 count=2880 添加 grub 启动功能 sudo losetup /dev/loop3 a.img sudo dd if=./grub-0.97-i386-pc/boot/grub/stage1 of=/dev/loop3 bs=512 count=1 sudo dd if=./grub-0.97-i386-pc/boot/grub/stage2 of=/dev/loop3 bs=512 seek=1 sudo losetup -d /dev/loop3 测试是否能进入 grub 界面 qemu -fda a.img
. 准备磁盘映像, 并制作带 grub 启动的磁盘映像 I 准备磁盘映像 dd if=/dev/zero of=32m.img bs=4096 count=8192 sudo losetup /dev/loop3 32M.img 在磁盘映像上建立一个活动分区 sudo fdisk /dev/loop3 sudo losetup -d /dev/loop3 将活动分区格式化成 ext2fs, 并 mount 到 rootfs 目录上 sudo losetup -o 32256 /dev/loop3 32M.img 其中,32256 是分区的起始位置, 为 63 512 其中,63 是通过 file 32M.img 得到的 startsector 信息 sudo mke2fs /dev/loop3 sudo mount /dev/loop3 rootfs 将前面制作的 bzimage 和 myinitrd4m.img 拷贝到 rootfs 中 增加 grub 功能
. 准备磁盘映像, 并制作带 grub 启动的磁盘映像 II 准备相关目录, 并拷贝一些必要的文件 sudo mkdir rootfs/boot sudo mkdir rootfs/boot/grub sudo cp./grub-0.97-i386-pc/boot/grub/* rootfs/boot/grub 在 rootfs/boot/grub 中编写 menu.lst, 具有如下内容 default 0 timeout 30 title linux on 32M.img root (hd0,0) kernel (hd0,0)/bzimage root=/dev/ram init=/bin/ash initrd (hd0,0)/myinitrd4m.img 利用 grub 启动软盘, 在硬盘映像上添加 grub 功能 qemu -boot a -fda a.img -hda 32M.img
. 准备磁盘映像, 并制作带 grub 启动的磁盘映像 III 进入 grub 界面后 root (hd0,0) setup (hd0) 测试从磁盘启动进入 grub 界面 qemu -hda 32M.img
. Thanks!..... The end.