以Qemu模拟Linux,学习Linux内核
文章名称:以Qemu模拟Linux,学习Linux内核
作 者:five_cent
文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html
维护日志:2013-02-21 建立文档
(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明。文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖环境)
0.准备
我们所有的工作都在指定目录下工作,使用以下变量来代替相关目录。
$KERNEL 内核工作目录
$LINUX Linux内核源码目录
$BUSYBOX Busybox源码目录
1.编译内核
(1)下载合适的内核
到http://www.kernel.org/上下载合适的内核,我选择的是linux-2.6.32,文件名是linux-2.6.32.60.tar.bz2。(选择使用这个版本是因为自己初学,最好使用低版本,防止新版本引入新的模块导致各种编译问题)
复制linux-2.6.32.60.tar.bz2到$KERNEL,并通过以下命令解开文件
$tar -xf linux-2.6.32.60.tar.bz2
解压的文件保存在$KERNEL目录下的linux-2.6.32.60,为了避免差异化,下文使用$LINUX
(2)编译内核
每个内核都可能有自己的编译条件,为了避免差异化,请参考$LINUX/Documentation/HOWTO.以下是我的步骤
$make help
$make i386_defconfig
$make
2.安装qemu
(1)ubuntu下安装
$sudo apt-get install qemu
我使用这个命令安装的是模拟器是qemu-system-i386和qemu-system-x86_64。因为我之前编译的linux内核是i386的,所以我创建一个软链接。
$ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
(2)源码安装
到http://wiki.qemu.org/Download,下载适合的qemu源码,我下载的是qemu-1.3.1.tar.bz2,拷贝到$KERNEL目录,输入命令解压
$tar -xf qemu-1.3.1.tar.bz2
然后编译
$./configure
$make
$make install
3.编译busybox
(1)下载busybox 源码
到http://www.busybox.net/下载合适的busybox源码,我下载的是busybox-1.20.0.tar.bz2,拷贝到$KERNEL目录,输入命令解压
$tar -xf busybox-1.20.0.tar.bz2
(2)编译busybox
$make defconfig
$make menuconfig
因为Linux运行环境当中是不带动态库的,所以必须以静态方式来编译BusyBox。修改
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary(no shared libs)
$make
$make install
编译过程当中可能遇到
inetd.c:(.text.prepare_socket_fd+0x8a): undefined reference to `bindresvport'
$make menuconfig
去掉不需要的功能,其它模块编译错误做法类似
Networking Utilities --->
[ ] inetd
4.通过Qemu模拟Linux
(1)编写initrd启动脚本
$cd $BUSYBOX/_install
#创建系统运行时的必须目录,其中,/proc用于挂载proc系统,/sys用于挂载sys系统,dev用于mdev创建设备节点,etc/init.d为放置busybox启动脚本的目录
$mkdir proc sys dev etc etc/init.d
$vim $BUSYBOX/_install/etc/init.d/rcS
输入

#!/bin/sh
#将proc文件系统挂载到/proc目录,因为很多应用程序会使用到/proc中的信息,不挂载会导致各种异常
mount -t proc none /proc
#将sys文件系统挂载到/sys目录,因为很多应用程序会使用到/sys中的信息,不挂载会导致各种异常
mount -t sysfs none /sys
#mdev是busybox自带的一个udev,用于系统启动和热插拔或动态加载驱动程序时,自动产生设备节点,这句话如果不加上则需要手动mknod来挂载设备节点
/sbin/mdev -s

$chmod +x $BUSYBOX/_install/etc/init.d/rcS
(注:为什么编辑这个文件呢?因为我们将使用busybox的init作为我们的Linux启动的第一个进程,而busybox的init所使用的启动脚本就是/etc/init.d/rcS,该路径被声明在$BUSYBOX/init/init.c当中)
(2)编写构建initrd镜像脚本
$vim $KERNEL/build-initrd.sh
输入

#!/bin/sh
#定义变量
KERNEL=$(pwd)
BUSYBOX=$(find busybox* -maxdepth 0)
LINUX=$(find linux* -maxdepth 0)
#通过cpio创建镜像
cd $BUSYBOX/_install
find . | cpio -o --format=newc > $KERNEL/rootfs.img
cd $KERNEL
#通过gzip创建zip镜像
gzip -c rootfs.img > rootfs.img.gz

$chmod +x build-initrd.sh
(3)编写快速运行脚本
$vim $KERNEL/run.sh
#!/bin/sh
#定义变量
LINUX=$(find linux* -maxdepth 0)
#启动qemu
qemu -kernel $LINUX/arch/i386/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=sbin/init noapic"
5.其它说明
镜像文件
vmlinux 编译出来的最原始的内核文件,未压缩
zImage 由mlinux经过gzip压缩后的文件
bzImage big zImage。 zImage解压缩内核到低端内存(640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,采用zImage或者bzImage都行,如果比较大应该用bzImage。
uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
vmlinuz 是zImage/bzImage文件的拷贝或者是指向zImage/bzImage的链接。
initrd initial ramdisk。linux系统引导过程当中挂载的一个临时根文件系统,被挂载于/dev/ram,它用于支持Linux第二阶段的引导过程。它是使用gzip进行压缩的cpio文件。
QEMU
qemu-system-i386 QEMU 模拟i386指令CPU的模拟器
qemu-system-x86_64 QEMU 模拟x86_64指令CPU的模拟器
qemu -kernel 参数,使用bzimage作为linux内核
qemu -initrd 参数,指定initrd镜像
qemu -append 参数,附加内核启动参数
内核启动参数
root= 使用哪个设备作为根文件系统。
rdinit= 内核加载完毕之后,即运行initrd中指定路径的程序,来创建linux的第一个进程。
init= 内核加载完毕之后,即运行initramfs中指定路径的程序,来创建linux的第一个进程。
noapic apic,高级可编程中断控制器。这里用于防止发生MP-BIOS BUG 8254 timer not connected。
参考资料
1.Qemu官方网站 http://www.qemu.org
2.简单用Qemu模拟linux运行环境 http://www.linuxidc.com/Linux/2011-07/39373.htm
3.initrd 内核描述文档 http://lxr.linux.no/linux/Documentation/initrd.txt
4.initrd和initramfs http://blog.chinaunix.net/uid-25888519-id-3078218.html
以Qemu模拟Linux,学习Linux内核的更多相关文章
- Linux学习-->linux系统在移动硬盘的安装
由于自己看了一些文章和linux的好奇,想来一窥Linux的奥秘,因此自己准备学习使用Linux系统,这里记录下自己的安装过程,方便以后自己重装系统时进行查阅. 参考的书籍是鸟哥的<Linux私 ...
- Linux学习-Linux历史(总结篇)
Linux之前,Unix的历史 1969年以前,一个伟大的梦想:Bell,MIT与GE的Multics系统 在此之前的计算机主机少,用户从多,程序是在读卡纸上打洞,光是等待.为了更加强化大型主机的功能 ...
- Linux学习---Linux目录结构说明
1./- 根 每一个文件和目录从根目录开始. 只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 2./bin中 - 用户二进制文件 包含二进制可执行文件. ...
- linux学习-Linux系统启动过程
linux系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行init. 系统初始化. 建立终端 . 用户登录系统. 内核引导 电源开机后,首 ...
- linux学习-linux基础和帮助
1.终端terminal (1)设备终端 键盘,鼠标,显示器 (2)物理终端(/dev/console) 控制台concole (3)串行终端(/dev/ttyS#) ttyS (4)虚拟终端(tty ...
- Linux学习-linux系统下安装jdk和tomcat,以及遇到的问题清单
安装JDK 1. 在usr目录下建立java安装目录 cd /usr mkdir java 2.下载jdk包 登录网址:http://www.oracle.com/technetwork/java ...
- Linux学习---linux下的彩蛋和各种有趣的命令
[原文]https://www.toutiao.com/i6596596897392099844/ screenfetch 一个显示系统信息和主题信息的命令 使用方法 输入screenfetch 效果 ...
- Linux学习---linux系统下安装配置Jenkins
1.首先准备java环境,安装JDK 2.下载jenkins至Linux服务器 下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+ ...
- Linux学习-linux系统下python升级到python3.6步骤详解,以及遇到的问题解决
说明:一般linux会自带pyhton2.7 1.首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: wget http://www.python.org/ftp/python/ ...
- Linux学习-Linux 的开机流程分析
开机流程一览 系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置; 读取并执行第一个开机装置内 MBR 的 boot Loader (亦 ...
随机推荐
- C#基础之------进制转换
/************************ File:控制台进制类型转换实现 Time:2014年8月12日 Author:小X ****************************/ 代 ...
- WPF笔记(2.6 ViewBox)——Layout
原文:WPF笔记(2.6 ViewBox)--Layout 在Canvas外面包一层ViewBox,可以使Canvas内的控件填充整个ViewBox,并随着ViewBox的大小变化而同步变化,这是因为 ...
- ###Git 基础图解、分支图解、全面教程、常用命令###
一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...
- http://bassistance.de/jquery-plugins/
http://bassistance.de/jquery-plugins/ Query插件:手风琴 jQuery插件:自动完成 jQuery插件:留言 jQuery插件:密码验证 jQuery插件:P ...
- apache http配置https
<一,Lamp系统搭建> yum install httpd httpd-devel mysql mysql-server mysql-devel php php-mysql php-co ...
- Android移植busybox
Android 的toolbox没有自动补齐,命令少,对于开发人员还是需要busybox,直接移植官方的busybox会有很多问题,主要是因为基于Android的交叉编译工具并没有采用glibc作为C ...
- 擅长排列的小明 II(找规律)
擅长排列的小明 II 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2, ...
- Riak VClock
Riak VClock 关于向量时钟的概念.在这里就多讲了,大家能够參照一下Dynamo的论文了解一下,向量时钟在分布式主要用于解决一致性性问题.能够和CRDTs一起看. 以下的源码是參照riak中的 ...
- Ubuntu+Eclipse+ADT+Genymotion+VirtualBox开发环境搭建
1.Eclispe安装就不说了 2.以下说说怎样安装ADT插件.有两种途径: (1)在线安装: 地址:https://dl-ssl.google.com/android/eclipse/(只是近期天朝 ...
- The Building Blocks- Components of EA Part 2- Process, People, Network and Time
1. Zachman Framework Information (Data) - Answer the Question 'What?' Contextual: List of Things imp ...