(这篇文章是在搭建QEMU环境时,在网上找到了一些教程资料,并在实际操作中遇到的一些问题的整理)

下载Linux内核

下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发。另一种是直接到内核社区下载稳定版本(详见:https://www.kernel.org/pub/linux/kernel/v4.x/)。

下面演示从Linux kernel主线下载代码进行编译。

使用命令:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

但是亲测这条命令超级慢,因此又百度得到了以下的解决办法:

方法一

第一步:使用nslookup查找github对应的IP地址

nslookup github.com

nslookup github.global.ssl.fastly.Net

第二步:将第一步中的结果加入/etc/hosts文件中

#用vim打开hosts文件

sudo vim /etc/hosts

在下图位置上加入两行,保存并退出。

第三步:刷新DNS缓存

sudo /etc/init.d/networking restart

第四步:重启系统

sudo reboot

但是以上方法还是挺慢的,又找到了以下方法。

方法二

使用wget命令,看下自己需要的linux内核版本,然后在下边的链接中可以进行更改:

sudo wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.82.tar.xz

sudo xz -d linux-4.19.82.tar.xz

sudo tar -xvf linux-4.19.82.tar

安装arm的交叉编译工具链

“想必做嵌入式开发的朋友,对交叉编译工具链不陌生。”行吧,我没做过嵌入式开发,也不晓得交叉编译工具链是个啥。网上找到了如下参考资料,写的很详细,格式一目了然,赞赞赞。

交叉编译工具链(详解):https://www.cnblogs.com/coolYuan/p/9037660.html

了解清楚之后,继续干正事。

如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。

但在这里建议直接安装arm的交叉编译工具链:

sudo apt-get install gcc-arm-linux-gnueabi

在执行apt-get install命令时遇到了以下问题:

这表示有进程占用,解决方法有两个:

第一:强制解锁,输入以下两条命令即可(注意顺序)

sudo rm /var/lib/dpkg/lock

sudo rm /var/cache/apt/archives/lock

第二:使用命令ps -e | grep apt查看哪个进程在使用命令apt-get,找到之后将这个进程杀死即可。sudo kill ****(进程号)。

编译Linux内核

生成vexpress开发板子的config文件:

(等等,这里要插一句为啥是这个板子,因为qemu模拟得最好的arm芯片,就是ARM公司的vexpress A9开发板了)

首先进入到Linux内核的安装路径,打开终端,输入以下命令:

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

编译:make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

生成的内核镜像位路径arch/arm/boot/zImage下,后续qemu启动时需要使用该镜像。

下载和安装qemu模拟器

方法一:

下载高版本qemu:可以根据自己的情况自行选择需要的qemu的版本

wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

配置qemu前,需要安装几个软件包:

sudo apt-get install zlib1g-dev

sudo apt-get install libglib2.0-0

sudo apt-get install libglib2.0-dev

配置qemu,支持模拟arm架构下的所有单板:./configure --target-list=arm-softmmu --audio-drv-list=

编译和安装:

make

make install

方法二:两条命令完事。不过可能也有其他问题,自行百度。

sudo apt-get update

sudo apt-get install qemu

即可。

测试是否安装成功:qemu-arm --version

测试qemu和内核能否运行成功

到这里,恭喜你,qemu已经安装好了,内核也编译成功了,所以现在需要测试一下,看看编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。

运行命令很简单:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

这里的/path/to/kernel/dir/是内核的下载目录,或者编译目录。

如果看到内核启动过程中的打印,说明前面的搭建是成功的。

这里简单介绍下qemu命令的参数:

-M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板

-m 512M 单板运行物理内存512M

-kernel /path/to/kernel/dir/arch/arm/boot/zImage  告诉qemu单板运行内核镜像路径

-nographic 不使用图形化界面,只使用串口

-append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是哪个tty。

如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。

制作根文件系统

上边内核启动最后报了一个panic,意思是说不能挂载根文件系统,所以咱们这不就开始搞一搞根文件系统的事情了么。首先,根文件系统是啥呀?

根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。

参考链接:https://blog.csdn.net/yym6789/article/details/88194329

第一步:下载、编译、安装busybox

wget http://www.busybox.net/downloads/busybox-1.31.1.tar.bz2

make defconfig    #注意,要进入busybox的下载路径

make CROSS_COMPILE=arm-linux-gnueabi-

make install CROSS_COMPILE=arm-linux-gnueabi-

安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

第二步:形成根目录结构

先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录

1. 创建rootfs目录(根目录),根文件系统内的文件全部放到这里

mkdir -p rootfs/{dev,etc/init.d,lib}

2. 拷贝busybox命令到根目录下:sudo cp busybox-1.31.1/_install/* -r rootfs/

3. 从工具链中拷贝运行库到lib目录下

sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

4. 创建4个tty端终设备

sudo mknod rootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2 c 4 2

sudo mknod rootfs/dev/tty3 c 4 3

sudo mknod rootfs/dev/tty4 c 4 4

第三步:制作根文件系统镜像

1. 生成32M大小的镜像 :dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

2. 格式化成ext3文件系统mkfs.ext3 a9rootfs.ext3

3.  将文件拷贝到镜像中

sudo mkdir tmpfs

sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

sudo cp -r rootfs/*  tmpfs/

sudo umount tmpfs

第四步:系统启动运行

完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

最后是这样的:应该是成功了吧。

以上内容主要参考以下两个教程:

1,https://www.cnblogs.com/edver/p/6001786.html

2,https://blog.csdn.net/linyt/article/details/42504975

Linux文件系统详解:

https://www.cnblogs.com/alantu2018/p/8461749.html

Ubuntu系统下QEMU环境搭建的更多相关文章

  1. Ubuntu系统下lnmp环境搭建和Nginx多站点配置

    最近需要使用Ubuntu作为服务器搭建Lnmp环境,顺便将操作过程写下来,与大家分享.如有不足之处,欢迎大家提出不同意见.(本文默认读者已经熟悉相关linux命令的使用,比如创建文件和文件夹,编辑文件 ...

  2. centos7系统下 docker 环境搭建

    运行环境: VMware Workstation Pro 在虚拟机中安装centos7系统, 选择最小安装, 网络连接方式选择的桥接(与宿主机在同一IP段)centos7一定要安装64位, docke ...

  3. Ubuntu下qemu环境搭建

    在查找资料过程中,发现自己搭建虚拟的arm环境的话,有一个比较好的软件就是qemu了,当然还有其他的,大家各投所好就好. 接下来说一下qemu环境搭建过程. 其实搭建很简单,作为小白,我还是捣鼓了两三 ...

  4. Ubuntu下qemu环境搭建vexpress开发平台

    在查找资料过程中,发现自己搭建虚拟的arm环境的话,有一个比较好的软件就是qemu了,当然还有其他的,大家各投所好就好. 接下来说一下qemu环境搭建过程. 其实搭建很简单,作为小白,我还是捣鼓了两三 ...

  5. php手动搭建wamp环境(一)--之 Windows系统下PHP环境搭建

    1.PHP环境搭建的前提是 Apache HTTP Server (Apache 服务器)已经安装部署成功,并可以正常访问到服务器的主页面.Apache HTTP Server 的安装部署已经在上一篇 ...

  6. node在Fedora 22系统下开发环境搭建

    事实上,环境搭建在linux系统还是比較简单的,下载已经编译好的包,配置一下环境变量. 或者下载源代码,自己编译. 这里记录一下,主要是node版本号变化节奏很块的情况下.怎样配置一次环境变量就不要再 ...

  7. windows系统下jenkins环境搭建与基本使用

    一. windows 系统下搭建jenkins环境 1.1 jenkins环境搭建和构建job流程图 1.2 安装jdk JDK下载地址:  http://www.oracle.com/technet ...

  8. PHP环境搭建-Windows系统下PHP环境搭建

    1.PHP环境搭建的前提是 Apache HTTP Server (Apache 服务器)已经安装部署成功,并可以正常访问到服务器的主页面.Apache HTTP Server 的安装部署已经在上一篇 ...

  9. OpenCV 3.4.2 Windows系统下的环境搭建(附带opencv_contrib-3.4.2)

    前言 当前需要回到Windows平台下进行开发,在win10系统上搭建了编译opencv3.4.2的环境,并添加opencv_contrib-3.4.2的模块,以下是本文所需要的软件以及源码. 系统: ...

随机推荐

  1. HashMap之Hash碰撞源码解析

    转自:https://blog.csdn.net/luo_da/article/details/77507315 https://www.cnblogs.com/tongxuping/p/827619 ...

  2. JS:利用for循环进行数组去重

    <script> var a = [1, 3, 2, 4, 5, 3, 2, 1, 4, 6, 7, 7, 6, 6]; //示例数组    var b = []; for(var i = ...

  3. 学生选课数据库MySQL语句练习题45道

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. select Sname,Ssex,Class from Student;2. 查询教师所有的单位即不重复的Depart列 ...

  4. html5移动端主流适配方案

    1.流式布局(百分比布局)    案例:京东移动端 优点:简单方便,只需要固定高度,宽度自适应: 缺点:大屏幕手机实际显示的不协调. 2.响应式布局 优点:可以节约成本,不用再做专门的web app网 ...

  5. ②初识spring

    一:基础搭建 需要:eclipse.spring插件(确认版本号并下载对应插件详见:https://blog.csdn.net/a1150499208/article/details/87988392 ...

  6. MQTT 协议学习:Retained(保留消息) 与 LWT(最后遗嘱)

    背景导入 让我们来看一下这个场景: 你有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度.那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个订阅端什么时候能 ...

  7. Golang的变量定义及使用案例

    Golang的变量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.变量的定义 package main import "fmt" func m ...

  8. Android之UI适配

    LinearLayout为线性布局按照垂直或者水平来进行排列,默认是按照水平来进行排列的,其中orientation属性是指定当前布局排列的方向 wrap_content为包裹内容   match_p ...

  9. C#不显示在任务栏

    在我用c#写一些小程序是总是希望,程序窗体不在任务栏上显示程序的窗体,c# Form提供了一个 属性值可以很好的解决这个问题 这个属性就是 ShowInTaskbar 在微软的官方声明格式为: pub ...

  10. Centos 7 x86_64 环境Python2.7升级Python3.7.4

    升级Python3.7.4 #安装补丁包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...