qemu-system启动命令


背景

在调试iot系统的时候只运行一个服务软件会运行失败,这是需要用到系统模式,运行起来一个系统,这样程序运行的环境更充足,成功的概率也更大。

之前调试mips架构程序,用这个可以满足,现在改成arm的,启动的时候仅仅换磁盘镜像,内核这些东西还是会启动失败,这里介绍一下这些命令都是干嘛的。

qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -nographic -append "root=/dev/sda1 rw console=tty0 init=/linuxrc ignore_loglevel" -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -redir tcp:2333::2333 -redir tcp:8080::80

命令介绍

qemu-system-mips

qemu分好几个版本

  • qemu-mips 是运行mips架构程序的qemu
  • static 这个是静态链接的版本,一般用来chroot ./ ./qemu-mips-static /bin/busybox (chroot ./ 是把本目录当做根目录运行程序)
  • qemu-system 是系统模式版本,可以开启一个虚拟系统。

-M malta

-M参数是指示仿真的硬件

-kernel

指定内核镜像,最好使用比较新的内核镜像

-hda

设置虚拟硬盘驱动并为其使用指定的映像文件,更高级的使用 -driver

参考https://wiki.gentoo.org/wiki/QEMU/Options

-nographic

没有图形化界面

-append

传入linux内核的参数

root=/dev/sda1

内核认为的根文件系统的位置,sda、hda等是由内核进行逻辑命名的和硬件无关。如果boot分区就是根分区就是/dev/sda1(注:grep显示的root(hd0,0)和这个指令的含义是一样的)

参考https://blog.51cto.com/fuwenchao/1337471

console=tty0

console即控制台,linux内核通过consle参数来选择控制台,console=tty0 console=lp0 console=ttyS0同时存在是可以工作的(console=ttyS0 console=ttyS1这样是不行的),输出传递给每个consle,输入只从最后一个获取。ttyS表示串口,tty表示虚拟终端,lp表示平行端口(咱也不懂),ttyUSB表示usb端口

参考https://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/configure-kernel.html

init=/linuxrc

linuxrc所做的事情

  • /linuxrc文件决定在挂载真正的文件系统之前所需完成的事情(譬如加载必要的网络驱动或者加载ext3文件系统).
  • /linuxrc加载必要的模块.
  • /linuxrc挂载根文件系统
  • /linuxrc调用pivot_root来改变根目录

主要是加载木块用的,如果内核没有动态模块是不需要加此选项的,在linux操作系统里可以加入noinitrd告诉boot loader不使用initrd
参考https://blog.csdn.net/s651665496/article/details/50773073

-net,-netdev

默认是Pass-through
这种方法只适用于TCP和UDP链接,ping是ICMP不行

  • -netdev user qemu进程将会为VM中的每个进程创建TCP和UDP连接,虚拟机没有可以从外界访问的地址
  • -device virtio-net,netdev=vmnic -netdev user,id=vmnic (被推荐),带有VirtIO支持的Pass-Through
  • -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 让qemu监听9001端口,该端口将会被转发到端口22的VM。ssh -p 9001能够登录到VM 只能实现向虚拟机中拷贝文件,不能从虚拟机拷出来文件
  • -device virtio-net,netdev=vmnic -netdev tap,id=vmnic,ifname=vnet0,script=no,downscript=no虚拟网络(TAP) 在qemu主机上创建一个新设备(vnet0),’cable’的另一端在vm上

上面那种写法是要是使用网桥的方式,配置网桥比较麻烦

参考https://wiki.gentoo.org/wiki/QEMU/Options

注:谷歌上搜索qemu -net是直接搜不到的(谷歌会过滤) 应该搜索 qemu ‘-net’

总结

一般没有输出的问题都是-append里面传递的参数有问题,按照官方镜像的说明即可

这里提供了编译好的镜像

一个一个手动下载比较麻烦,这里整理了一个简单的脚本

https://github.com/tower111/iot/blob/master/%E6%95%B4%E7%90%86/qemu%E4%BD%BF%E7%94%A8.md


评论
 上一篇
漏洞查找之比较补丁 漏洞查找之比较补丁
搜索camara找到一个类似二进制漏洞文件(缓冲区溢出) 双击进来之后有一些简单的描述 下载到了有和没有漏洞的固件,用bindiff比较了一下,发现区别最大的函数 ghidra打开跳转到对应地址(L快捷键可以重命名变量,;(英文的分号
2020-12-10
下一篇 
CVE-2017-11882分析 CVE-2017-11882分析
参考文档https://github.com/houjingyi233/office-exploit-case-study/tree/master/CVE-2017-11882%26CVE-2018-0802%26CVE-2018-0798
2020-12-07
  目录