声明
====
这是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