背景
在调试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