以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

时间: 2024-12-17 15:56:58

以Qemu模拟Linux,学习Linux内核的相关文章

马哥——linux学习——Linux系统

Linux(RHEL)5.4/5.5/5.8/6.0/6.3 ISO镜像文件-下载地址 http://blog.csdn.net/sz_bdqn/article/details/43133733 源代码: C --> 编译成二进制 (可交叉编译) ABI:Application Binary Interface(不同CPU的二进制接口不一致) 开源:开放源代码 自由: 自由获取,自由修改,自由学习 内核功能: 进程管理 内存管理 文件系统 网络功能 硬件驱动 安全机制 一.linux的诞生 GN

Linux 学习--Linux mint 安装

最近开始重新系统学习Linux,发行版本比较多,就选择了Linux mint 这个. 学习环境采用虚拟机和真机两种对比的方式. 硬件环境: 虚拟机安装在联想的I5 的机器,安装vmware 12 软件来实现. 真机是利用HP2708  配置3G内存来安装 系统安装: 虚拟机安装 64bit 系统,安装语言采用 中文 真机安装32bit 系统,安装采用英语 安装 这个没有什么难度,不再说, 有一点 64bit安装 联网安装 32bit安装 采用未联网安装 操作: 1.安装 2.更新系统 sudo

Linux学习---Linux目录结构说明

1./- 根 每一个文件和目录从根目录开始. 只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 2./bin中 - 用户二进制文件 包含二进制可执行文件. 在单用户模式下,你需要使用的常见Linux命令都位于此目录下.系统的所有用户使用的命令都设在这里. 例如:ps.ls.ping.grep.cp 3./home - HOME目录 所有用户用home目录来存储他们的个人档案. 例如:/home/john./home/nikita 4./sbin目录

linux学习-Linux系统启动过程

linux系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行init. 系统初始化. 建立终端 . 用户登录系统. 内核引导 电源开机后,首先是BIOS内检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管硬件后,首先读取/boot目录下的内核文件. 运行init init进程是所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动. init 程序首先是需要读取配置文件 /etc/

linux学习 – linux系统管理命令

常用的Linux系统管理命令 whoami 显现当前操作的用户,如下图: hostname 显示主机名,如下图: top 动态显示当前耗费资源的进程信息,如下图: du 查看当前目录下,文件的大小 du -sh * df 查看磁盘大小 df -h 带有单位显示磁盘信息 ps ps -ef|grep java 查询java进程的PID kill 杀死进程,能够先用ps 或 top命令查看进程的id,然后再用kill命令杀死进程.kill -9 pid 未完待续,后续补充~~ 原文链接:http:/

马哥Linux学习——Linux操作系统及常用命令

一.操作系统 window 下的dll (Dynamic Link Library)是动态库 linux 下叫.so  (shared object)共享对象 login: 用户名:系统识别最快的是用户ID. 认证机制:Authentication 授权:Authorization 审计:Audition (日志) prompt,命令提示符: 命令:可以是二进制或脚步文件 magic number: 魔数  二进制文件开头处的特殊的字符,标识二进制文件的执行格式,window和luinx的魔数是

Linux学习(linux就该这么学)7.2

关于ssh ssh服务是用于远程LINUX主机操作,默认服务端口是22 用法: ssh [参数] 主机ip systemctl enable sshd   开机启动 systemctl start sshd      启动SSH服务 /etc/ssh/sshd_config是ssh服务的配置文件 远程传输文件 Scp命令可以将一台主机的文件传输到另一台主机 用法 scp [参数] 文件地址 主机账户@主机IP:传送目录 输入命令,会需要对方主机的账号密码 另外也可以把远程主机的文件传送到本地 s

Linux学习---linux系统下安装Jenkins

1.首先准备java环境,安装JDK 2.下载jenkins至Linux服务器 下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions#InstallingJenkinsonRedHatdistributions-ImportantNoteonCentOSJava 按需选择:最新版 or 稳定版 这里选择最新版 ,使用yum方式下载安装 sudo wget -O /e

linux学习-linux在VMware下的安装

此次安装我们设计分为 /. /boot. /swap ./textdir四个分区. 安装过程如下

Linux学习(linux就该这么学)7.1

nmtui一个图形化网络配置工具.在命令终端输入nmtui就可以配置网络了,比较简单,但是配好之后还是需要到网卡配置文件修改一下,ONBOOT=yes,就是开机启动. nmcli是一款管理网络的工具,可以查看网络状态和信息,如图: 如果需要详细的查看某个网卡的信息,只需要输入命令:nmcli con show 网卡名