Ubuntu系统下QEMU环境搭建
<p>(这篇文章是在搭建QEMU环境时,在网上找到了一些教程资料,并在实际操作中遇到的一些问题的整理)</p><h1>下载Linux内核</h1>
<p>下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发。另一种是直接到内核社区下载稳定版本(详见:https://www.kernel.org/pub/linux/kernel/v4.x/)。</p>
<p><strong>下面演示从Linux kernel主线下载代码进行编译。</strong></p>
<p>使用命令:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git</p>
<p>但是亲测这条命令超级慢,因此又百度得到了以下的解决办法:</p>
<p><strong>方法一</strong></p>
<p class="a">第一步:使用nslookup查找github对应的IP地址</p>
<p class="a">nslookup github.com</p>
<p class="a">nslookup github.global.ssl.fastly.Net</p>
<p class="a">第二步:将第一步中的结果加入/etc/hosts文件中</p>
<p class="a">#用vim打开hosts文件</p>
<p class="a">sudo vim /etc/hosts</p>
<p class="a">在下图位置上加入两行,保存并退出。</p>
<p class="a"> <img src="https://img2018.cnblogs.com/i-beta/1523946/202002/1523946-20200210104100702-1619828395.png"></p>
<p class="a">第三步:刷新DNS缓存</p>
<p class="a">sudo /etc/init.d/networking restart</p>
<p class="a">第四步:重启系统</p>
<p class="a">sudo reboot</p>
<p class="a">但是以上方法还是挺慢的,又找到了以下方法。</p>
<p class="a"><strong>方法二</strong></p>
<p class="a">使用wget命令,看下自己需要的linux内核版本,然后在下边的链接中可以进行更改:</p>
<p>sudo wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.82.tar.xz</p>
<p>sudo xz -d linux-4.19.82.tar.xz</p>
<p>sudo tar -xvf linux-4.19.82.tar</p>
<p> </p>
<h1>安装arm的交叉编译工具链</h1>
<p>“想必做嵌入式开发的朋友,对交叉编译工具链不陌生。”行吧,我没做过嵌入式开发,也不晓得交叉编译工具链是个啥。网上找到了如下参考资料,写的很详细,格式一目了然,赞赞赞。</p>
<p>交叉编译工具链(详解):https://www.cnblogs.com/coolYuan/p/9037660.html</p>
<p>了解清楚之后,继续干正事。</p>
<p>如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。</p>
<p>但在这里建议直接安装arm的交叉编译工具链:</p>
<p>sudo apt-get install gcc-arm-linux-gnueabi</p>
<p class="a">在执行apt-get install命令时遇到了以下问题:</p>
<p class="a"> <img src="https://img2018.cnblogs.com/i-beta/1523946/202002/1523946-20200210105255276-773376176.png"></p>
<p>这表示有进程占用,解决方法有两个:</p>
<p class="a">第一:强制解锁,输入以下两条命令即可(注意顺序)</p>
<p class="a">sudo rm /var/lib/dpkg/lock</p>
<p class="a">sudo rm /var/cache/apt/archives/lock</p>
<p class="a">第二:使用命令ps -e | grep apt查看哪个进程在使用命令apt-get,找到之后将这个进程杀死即可。sudo kill ****(进程号)。</p>
<p> </p>
<h1>编译Linux内核</h1>
<p>生成vexpress开发板子的config文件:</p>
<p class="a">(等等,这里要插一句为啥是这个板子,因为qemu模拟得最好的arm芯片,就是ARM公司的vexpress A9开发板了)</p>
<p class="a">首先<strong>进入到Linux内核的安装路径</strong>,打开终端,输入以下命令:</p>
<p>make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig</p>
<p>编译:make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm</p>
<p>生成的内核镜像位路径arch/arm/boot/zImage下,后续qemu启动时需要使用该镜像。</p>
<p> </p>
<h1>下载和安装qemu模拟器</h1>
<p><strong>方法一:</strong></p>
<p>下载高版本qemu:可以根据自己的情况自行选择需要的qemu的版本</p>
<p>wget http://wiki.qemu-project.org/download/<span style="background-color: rgba(255, 255, 0, 1)">qemu-2.0.2</span>.tar.bz2</p>
<p>配置qemu前,需要安装几个软件包:</p>
<p>sudo apt-get install zlib1g-dev</p>
<p>sudo apt-get install libglib2.0-0</p>
<p>sudo apt-get install libglib2.0-dev</p>
<p>配置qemu,支持模拟arm架构下的所有单板:./configure --target-list=arm-softmmu --audio-drv-list=</p>
<p>编译和安装:</p>
<p>make</p>
<p>make install</p>
<p><strong>方法二:</strong>两条命令完事。不过可能也有其他问题,自行百度。</p>
<p>sudo apt-get update</p>
<p>sudo apt-get install qemu</p>
<p>即可。</p>
<p>测试是否安装成功:qemu-arm --version</p>
<p> </p>
<h1>测试qemu和内核能否运行成功</h1>
<p>到这里,恭喜你,qemu已经安装好了,内核也编译成功了,所以现在需要测试一下,看看编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。</p>
<p>运行命令很简单:</p>
<p>qemu-system-arm -M vexpress-a9 -m 512M -kernel <span style="background-color: rgba(255, 153, 204, 1)">/path/to/kernel/dir/</span>arch/arm/boot/zImage -dtb <span style="background-color: rgba(255, 153, 204, 1)">/path/to/kernel/dir/</span>arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"</p>
<p>这里的/path/to/kernel/dir/是内核的下载目录,或者编译目录。</p>
<p>如果看到内核启动过程中的打印,说明前面的搭建是成功的。</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1523946/202002/1523946-20200210105926776-983383415.png"></p>
<p> </p>
<p> 这里简单介绍下qemu命令的参数:</p>
<p>-M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板</p>
<p>-m 512M 单板运行物理内存512M</p>
<p>-kernel /path/to/kernel/dir/arch/arm/boot/zImage 告诉qemu单板运行内核镜像路径</p>
<p>-nographic 不使用图形化界面,只使用串口</p>
<p>-append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是哪个tty。</p>
<p>如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。</p>
<p> </p>
<h1>制作根文件系统</h1>
<p>上边内核启动最后报了一个panic,意思是说不能挂载根文件系统,所以咱们这不就开始搞一搞根文件系统的事情了么。首先,根文件系统是啥呀?</p>
<p>根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。</p>
<p>参考链接:https://blog.csdn.net/yym6789/article/details/88194329</p>
<p><strong>第一步:下载、编译、安装busybox</strong></p>
<p>wget http://www.busybox.net/downloads/busybox-1.31.1.tar.bz2</p>
<p>make defconfig #注意,要进入busybox的下载路径</p>
<p>make CROSS_COMPILE=arm-linux-gnueabi-</p>
<p>make install CROSS_COMPILE=arm-linux-gnueabi-</p>
<p>安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。</p>
<p><strong>第二步:形成根目录结构</strong></p>
<p>先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1523946/202002/1523946-20200210110152374-1423206756.png"></p>
<p>1. 创建rootfs目录(根目录),根文件系统内的文件全部放到这里</p>
<p>mkdir -p rootfs/{dev,etc/init.d,lib}</p>
<p>2. 拷贝busybox命令到根目录下:sudo cp busybox-1.31.1/_install/* -r rootfs/</p>
<p>3. 从工具链中拷贝运行库到lib目录下</p>
<p>sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/</p>
<p>4. 创建4个tty端终设备</p>
<p>sudo mknod rootfs/dev/tty1 c 4 1</p>
<p>sudo mknod rootfs/dev/tty2 c 4 2</p>
<p>sudo mknod rootfs/dev/tty3 c 4 3</p>
<p>sudo mknod rootfs/dev/tty4 c 4 4</p>
<p><strong>第三步:制作根文件系统镜像</strong></p>
<p>1. 生成32M大小的镜像 :dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32</p>
<p>2. 格式化成ext3文件系统mkfs.ext3 a9rootfs.ext3</p>
<p>3. 将文件拷贝到镜像中</p>
<p>sudo mkdir tmpfs</p>
<p>sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop</p>
<p>sudo cp -r rootfs/* tmpfs/</p>
<p>sudo umount tmpfs</p>
<p><strong>第四步:系统启动运行</strong></p>
<p>完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:</p>
<p>qemu-system-arm -M vexpress-a9 -m 512M -kernel <span style="background-color: rgba(255, 153, 204, 1)">/path/to/kernel/dir/</span>arch/arm/boot/zImage -dtb <span style="background-color: rgba(255, 153, 204, 1)">/path/to/kernel/dir/</span>arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3</p>
<p>最后是这样的:应该是成功了吧。</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1523946/202002/1523946-20200210110359952-2007476570.png"></p>
<p> </p>
<p> </p>
<p><strong>以上内容主要参考以下两个教程:</strong></p>
<p>1,https://www.cnblogs.com/edver/p/6001786.html</p>
<p>2,https://blog.csdn.net/linyt/article/details/42504975</p>
<p>Linux文件系统详解:</p>
<p>https://www.cnblogs.com/alantu2018/p/8461749.html</p><br><br>
来源:https://www.cnblogs.com/from-zero/p/12290170.html
頁:
[1]