目录
  1. 1. qemu 简介
  2. 2. ubuntu下载
  3. 3. 用户模式使用
    1. 3.0.1. 用户模式下的二进制文件
    2. 3.0.2. 使用
      1. 3.0.2.1. (x86为例)
        1. 3.0.2.1.1. 命令行选项
      2. 3.0.2.2. (mips)
        1. 3.0.2.2.1. 命令格式
  • 4. 系统模式使用
    1. 4.0.1. 调用
    2. 4.0.2. 网络配置
  • qemu安装使用

    qemu 简介

    官方使用文档

    qemu是一款可执行硬件虚拟化的虚拟机,与他类似的还有Bochs、PearPC,但qemu具有高速(配合KVM)、跨平台的特性
    qemu主要有两种运行模式:qemu-user 和 qemu-system

    1. 用户模式(User Mode),亦称使用者模式。qemu能启动那些为不同中央处理器编译的Linux程序。
    2. 模拟模式(System Mode),亦成为系统模式。qemu能模拟整个计算机系统,包括中央处理器及其他周边设备,它使能为跨平台编写的程序进行测试及排错工作变得容易。其亦能用来在一部主机上虚拟数个不同的虚拟计算机,类似我们平常使用的Vmare、VirtualBox等。

    ubuntu下载

    官方下载说明

    • apt-get安装

      apt-get install qemu

    1
    2
    3
    4
    5
    6
    7
    8
    #安装 qemu-user
    $sudo apt-get install qemu qemu-user qemu-user-static

    #此时可以运行静态链接的arm程序,而要运行动态链接的arm程序,需要安装对应架构的动态链接库:
    $ apt search "libc6-" | grep "arm"

    #安装 qemu-system
    $ sudo apt-get install qemu qemu-user-static qemu-system uml-utilities bridge-utils
    • 源代码安装

    要下载并构建QEMU 5.1.0:

    1
    2
    3
    4
    5
    wget https://download.qemu.org/qemu-5.1.0.tar.xz
    tar xvJf qemu-5.1.0.tar.xz
    cd qemu-5.1.0
    ./configure
    make

    要从git下载并构建QEMU:

    1
    2
    3
    4
    5
    6
    git clone https://git.qemu.org/git/qemu.git
    cd qemu
    git submodule init
    git submodule update --recursive
    ./configure
    make

    用户模式使用

    为了启动Linux进程,QEMU需要进程可执行文件本身以及它使用的动态库。

    即用户模式要下载运行文件对应的链接库

    用户模式下的二进制文件

    • 用户模式(x86) qemu-i386

    • 用户模式(Arm) qemu-arm

    • 用户模式(MIPS) qemu-mips执行32位大端序MIPS二进制文件(MIPS O32 ABI)。

      qemu-mipsel 执行32位小端序 MIPS二进制文件(MIPS O32 ABI)。

      qemu-mips64 执行64位大端MIPS二进制文件(MIPS N64 ABI)。

      qemu-mips64el 执行64位小端序(Little Endian) MIPS二进制文件(MIPS N64 ABI)。

      qemu-mipsn32 执行32位大端序MIPS二进制文件(MIPS N32 ABI)。

      qemu-mipsn32el 执行32位小端序(Little Endian) MIPS二进制文件(MIPS N32 ABI)。

      image-20200818211143754

    使用

    (x86为例)

    在x86上,您可以尝试使用本机库启动任何进程

    在非x86 CPU上,首先需要至少下载一个x86 glibc(qemu-runtime-i386-XXX-.tar.gz在QEMU网页上)。

    确保 LD_LIBRARY_PATH未设置:

    1
    unset LD_LIBRARY_PATH

    然后,您可以启动预编译的ls可执行文件:

    1
    qemu-i386 tests/i386/ls

    您可以查看一下scripts/qemu-binfmt-conf.sh以便在尝试启动x86可执行文件时Linux内核自动启动QEMU。它需要Linux内核中的binfmt_misc模块。

    命令行选项
    1
    qemu-i386 [-h] [-d] [-L path] [-s size] [-cpu model] [-g port] [-B offset] [-R size] program [arguments...]
    • -h 打印帮助
    • -L path 设置x86 elf解释器前缀(默认= / usr / local / qemu-i386)
    • -s size设置x86堆栈大小(以字节为单位)(默认值= 524288)
    • -cpu model选择CPU型号(-cpu帮助以获得列表和其他功能选择)
    • -E var=value将环境变量设置为值。
    • -U var从环境中删除var。
    • -B offset将来宾地址偏移指定的字节数。当来宾应用程序所需的地址区域保留在主机上时,这很有用。当前仅在某些主机上支持此选项。
    • -R size预分配给定大小的访客虚拟地址空间(以字节为单位)。指定大小时,可以使用“ G”,“ M”和“ k”后缀。

    调试选项:

    • -d item1,...激活指定项目的日志记录(使用“ -d帮助”获取日志项目列表)
    • -p pagesize就像主机页面大小是’pagesize’字节一样
    • -g port等待gdb连接到端口
    • -singlestep在单步模式下运行仿真。

    (mips)

    共有两种模拟程序,分别是运行大端机格式的qemu-mips和小端机格式的模拟执行程序qemu-mipsel,它们的执行参数是一样的。

    命令格式
    1
    qemu-mipsel [options] program [arguments...]
    • “program”是需要qemu运行的其他处理器编译的程序;
    • “arguments”是“program”的参数;
    • “options”是qemu-mipsel或qemu-mipsel的选项。
    选项 说明
    -E  var=value 为program进程设置环境变量
    -g  port QEMU开启调试模式,等待GDB连接PORT
    LD_PRELOAD=newlib 使用新的动态库newlib劫持系统调用

    系统模式使用

    系统模式要下载对应的镜像

    下载并解压缩安装了Linux硬盘映像(例如 linux.img),然后键入:

    1
    qemu-system-x86_64 linux.img

    调用

    1
    qemu-system-x86_64 [选项] [disk_image]

    系统模式命令的格式为”$qemu-system-mipsel [options] [disk_image]”。”disk_image”是一个原始的IDE硬盘镜像。选项如表所示。

    常用选项 说明
    -kernel bzImage 使用“bzImage”作为内核镜像
    -hda/-hdb file 使用“file”作为IDE硬盘0/1镜像
    -append cmdline 使用“cmdline”作为内核命令行
    -nographic 禁用图形输出,重定向串行I/O到控制台
    -initrd file 使用“file”作为初始化的RAM磁盘

    官方具体选项

    网络配置

    配置qemu-system网络

    qemu-system模式配置网络常见的方法是tap桥接

    • 安装网络配置的依赖文件:
    1
    $ sudo apt install uml-utilities bridge-utils
    • 修改Ubuntu主机网络接口配置文件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sudo vim /etc/network/interfaces

    ###################内容如下##########################

    # interfaces(5) file used by ifup(8) and ifdown(8)

    auto lo
    iface lo inet loopback
    auto ens33
    iface ens33 inet dhcp
    iface br0 inet dhcp
    bridge_ports ens33
    bridge_maxwait 0
    • 创建并编写qemu网络接口启动脚本:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ sudo vim /etc/qemu-ifup

    ###################内容如下##########################
    #!/bin/sh
    sudo qemu-system-arm \
    -M vexpress-a9 \
    -kernel vmlinuz-3.2.0-4-vexpress \
    -initrd initrd.img-3.2.0-4-vexpress \
    -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
    -append "root=/dev/mmcblk0p2 console=ttyAMA0" \
    -net nic,macaddr=52:54:00:12:34:56 \
    -net tap \
    -nographic
    • 保存文件后使用如下命令修改qemu-ifup的权限:

      1
      $ sudo chmod a+x /etc/qemu-ifup
    • 重启网络使配置生效:

      1
      $ sudo /etc/init.d/networking restart
    • 启动桥接网络:

      1
      $ sudo ifdown ens33 && sudo ifup br0

      运行之后,桥br0代替ens33接管了ubuntu虚拟机的网口

    • 启动 qemu
      ./start.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    sudo qemu-system-arm \
    -M vexpress-a9 \
    -kernel vmlinuz-3.2.0-4-vexpress \
    -initrd initrd.img-3.2.0-4-vexpress \
    -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
    -append "root=/dev/mmcblk0p2 console=ttyAMA0" \
    -net nic,macaddr=52:54:00:12:34:56 \
    -net tap \
    -nographic

    系统模式使用

    文章作者: zzl
    文章链接: https://www.zzl14.xyz/2020/08/18/qemu安装使用/
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 try
    打赏
    • 微信
    • 支付宝

    评论