QEMU学习笔记

1 篇文章 0 订阅

声明
====
    这是QEMU2.5.0,高版本不一定适用。
    宿主机用的ubuntu18。


源码安装
========
    $ mkdir build     # 直接在根目录编译会产生大量的配置文件
    $ cd build
    $ ../configure
    $ make
    $ sudo make install

    可能需要:
        $ sudo apt-get install libpixman-1-dev
        $ sudo apt-get install libglib2.0-dev


安装QEMU需要的网络功能
======================
    $ sudo apt-get install uml-utilities
    $ sudo apt-get install bridge-utils

    确保这些文件是存在的:(Ubuntu默认是存在的)
        /dev/net/tun
        /etc/qemu-ifup
        /etc/qemu-ifdown

    修改/etc/network/interfaces
        auto lo
        iface lo inet loopback
        auto ens33
        auto br0
        iface br0 inet dhcp
        bridge_ports ens33
        # 注意ens33可能不是你的网卡名,你得填你自己的网卡名

    重启Ubuntu

    virtualbox需要设置成桥接模式(我不确定是不是真的需要这个)


安装交叉编译器
==============
    $ sudo apt-get install gcc-arm-linux-gnueabihf


安装TFTP服务器
==============
    $ sudo apt-get install xinetd
    $ sudo apt-get install tftp tftpd
    $ vim /etc/xinetd.d/tftp        # 把下面的内容写入这个文件,别忘了创建/home/sam/Work/tftp_share这个目录
        service tftp
        {
            socket_type = dgram
            protocol    = udp
            wait        = yes
            user        = root
            server      = /usr/sbin/in.tftpd
            server_args = -s /home/sam/Work/tftp_share
            disable     = no
            per_source  = 11
            cps         = 100 2
            flags       = IPv4
        }
    $ sudo /etc/init.d/xinetd restart


编译u-boot
==========
    $ make vexpress_ca9x4_defconfig
    $ make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm  # 编译会生成u-boot.bin

启动u-boot
==========
    sudo qemu-system-arm     \
            -M vexpress-a9  \
            -nographic  \
            -kernel u-boot  \
            -net nic,vlan=0 \
            -net tap,vlan=0,ifname=tap0
    不建议加上-m 512M增大它的内存,可能会破坏它的内存layout

    如果是较新的qemu(2.11.1)
    sudo qemu-system-arm     \
            -M vexpress-a9  \
            -nographic  \
            -kernel u-boot  \
            -net nic \
            -net tap,ifname=tap0


编译linux
==========
    $ make ARCH=arm vexpress_defconfig
    $ make LOADADDR=0x60003000 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage
    $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs     # 编译设备树


u-boot从tftp下载内核镜像并启动
==============================
    > setenv ipaddr xxx
    > setenv serverip xxx
    > setenv bootargs 'root=/dev/mmcblk0 console=tty0'      # 如果没有文件系统,添加这句会死机
    > saveenv
    > tftp 0x60003000 uImage
    > tftp 0x60500000 vexpress-v2p-ca9.dtb
    > bootm 0x60003000 - 0x60500000


制作BUSYBOX文件系统
====================
    $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
    $ make ARCH=arm menuconfig
    $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
    $ make install


制作文件系统镜像
================
    $ dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32  # bs不能设太大,不然待会ubuntu可能跑不起来
    $ mkfs.ext3 a9rootfs.ext3
    $ sudo mount -t ext3 a9rootfs.ext3 /mnt -o loop
    $ sudo cp -r $BUSYBOX/_install/* /mnt
    $ sudo mkdir /mnt/lib
    $ sudo cp -p $CROSS_COMPILE_LIB_PATH/* /mnt/lib
    $ sudo mkdir -p /mnt/dev
    $ cd /mnt/dev
    $ sudo mknod -m 666 null c 1 3
    $ sudo mknod -m 666 console c 5 1
    $ cd ~
    $ sudo umount /mnt

    BUSYBOX是BUSYBOX的编译目录。可以这样设置:BUSYBOX='/home/sam/Work/busybox-1.24.2'

    CROSS_COMPILE_LIB_PATH是交叉编译器的库目录,可以使用这个命令获取:
    arm-linux-gnueabihf-gcc -print-file-name=libc.a
    意思是获取libc.a的路径,从输出打印中去掉"libc.a"就是lib路径了。可以这样设置:
    CROSS_COMPILE_LIB_PATH='/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/lib/../lib/'


QEMU启动内核
==============

    qemu-system-arm                         \
        -M vexpress-a9                         \
        -m 1024M                             \
        -smp 4                                 \
        -kernel <zImage路径>                 \
        -nographic                             \
        -append "root=/dev/mmcblk0 rw rootfstype=ext4 console=ttyAMA0,115200" \
        -sd <文件系统路径>                     \
        -dtb <设备树路径>                     \
        -net nic,vlan=0                     \
        -net tap,vlan=0,ifname=tap0

    待虚拟机启动以后,你的宿主机上会多出tap0这么一个网卡,给它配IP,虚拟机再配一个同网段IP就能通信了


坑点
====
    qemu对电脑的性能是有要求的(我也不知道具体是多少),性能不够可能会产生一些奇奇怪怪的问题


其他
====
    - qemu退出:ctrl+a x
    - qemu跑ubuntu有时会发生莫名其妙的错误无法启动,建议换别的,比如别的版本,或者debian试试
    - 记住要使用sudo运行,不然可能会出现这个错误:
        qemu-system-arm: -net nic,vlan=0: 'vlan' is deprecated. Please use 'netdev' instead.
        qemu-system-arm: -net tap,vlan=0,ifname=tap0: could not configure /dev/net/tun (tap0): Operation not permitted

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值