Ubuntu16下QEMU6.1.0安装和使用完整流程
一、测试环境
Ubuntu16.04_x64
qemu-6.1.0.tar.xz
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~16.04)
Python 3.8.17
大概的安装流程:依赖库->python->GCC->QEMU->UBOOT->Linux->Busybox
二、环境搭建
1、安装依赖库
最好提前装这些库,再装后续的python、gcc:
sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev
binutils-dev libboost-all-dev autoconf libtool libssl-dev
libpixman-1-dev libpython2-dev python-pip python-capstone virtualenv
后面有些编译问题,比如"unknow host os (uname -s linux...)"啥的,网上搜不到解决方案,我重装python和GCC才解决,而安装python和GCC,又需要先安装这些库。
而且安装上面的库,python/GCC默认版本好像会变化,所以我推荐先装这些库,再装python和GCC。
有博主说可以去掉"libpython-dev python-pip"这两个包,即:
sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev
binutils-dev libboost-all-dev autoconf libtool libssl-dev
libpixman-1-dev python-capstone virtualenv
后面还会根据实际问题,再安装一些其它的依赖库,每个人遇到的可能不一样,遇到问题可以网上搜解决方案。
2、安装pyhton3.8
参考 https://blog.csdn.net/qq_35743870/article/details/125903040
我的Ubuntu16环境有Python 2.7.12和Python 3.5.2,但是QEMU需要Python >= 3.6,所以安装了Python 3.8.17 。
2.1、下载Python3.8.17
网址下载:https://www.python.org/ftp/python/ ,Python-3.8.17.tar.xz 。
命令下载:wget https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tgz
2.2、创建新版python的安装目录(便于卸载)
cd /usr/local
mkdir python
cd python
mkdir python3.8
建立好的目录:
/usr/local/python/python3.8
2.3、安装依赖库
sudo apt-get install libffi-dev uuid-dev lzma-dev liblzma-dev libncurses5-dev libgdbm-dev sqlite3 libsqlite3-dev openssl tcl8.6-dev tk8.6-dev libreadline-dev zlib1g-dev build-essential bzip2 libbz2-1.0 libbz2-dev libc6-dev libdb-dev libexpat1 libexpat1-dev libgdbm3 libncursesw5-dev libpcap-dev libreadline5 libreadline6 libreadline6-dev libsqlite0 libsqlite0-dev libsqlite3-0 libssl-dev libssl1.0.0 libxml2-dev libxslt1-dev sqlite tcl tk tk-dev xz-utils zlib1g zlib1g-dev make
2.4、解压安装包
在存放安装包的目录直接解压,不用放到 /usr/local/python/python3.8 下
tar -xvf xxx.tar.xz
tar -xf xxx.tgz
2.5、安装
配置安装目录
cd ~/Python-3.8.17
./configure prefix=/usr/local/python/python3.8 --enable-optimizations
编译源码
cd ~/Python-3.8.17
make -j 2
安装,一定要使用altinstall,看过的教程有说明过使用install会覆盖安装,可能会导致Ubuntu崩溃的情况。
cd ~/Python-3.8.17
make altinstall >&1|tee make.log
2.6、添加环境变量
gedit ~/.bashrc
在文件最后面添加以下内容
#[Python3.8]
export PATH=$PATH:/usr/local/python/python3.8/bin
让环境变量生效
source ~/.bashrc
2.7、配置python3默认版本为3.8
使用以下命令,可以看到各命令实际使用的python版本:
python --version
python2 --version
python3 --version
python3.5 --version
python3.8 --version
由于QEMU的需求,需要配置python3默认版本为3.8 。
(1)添加 python & python3 指向选择
最后的序号表示优先级,数字越大,优先级越高,会自动选取优先级高的作为默认指向,可手动更改默认指向,这里将系统默认的指向的优先级设置为100。
python指令可选列表设置:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 99
sudo update-alternatives --install /usr/bin/python python /usr/local/python/python3.8/bin/python3.8 38
python3指令可选列表设置:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 100
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python/python3.8/bin/python3.8 38
(2)查看 python & python3 可选列表
sudo update-alternatives --list python
sudo update-alternatives --list python3
(3)选择 python & python3 实际指向
这里只用把python3指向选为python3.8
sudo update-alternatives --config python
sudo update-alternatives --config python3
3、安装gcc7
QEMU需要gcc7.5.0以上。
我把默认的gcc卸载了,QEMU环境弄好后,我的Ubuntu的桌面样式、背景图、设置都变成默认了,不知道是不是因为卸载了默认的gcc导致的,推荐大家别卸载默认GCC。
3.1、下载安装:
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz
下载后解压,gcc -v查看版本还是旧版本不是7.5.0,看网上教程还要编译gcc,感觉太复杂费时了,放弃该方法。
3.2、指令安装:
下载
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-7
sudo apt-get install g++-7
配置:将gcc7,g++7作为默认选项
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gcc
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++
查看是否成功:
gcc --version
g++ --version
发现gcc版本刚好是7.5.0,QEMU可用。
三、QEMU安装
1、下载解压
官网下载:https://download.qemu.org/ , qemu-6.1.0.tar.xz
命令下载:
wget https://download.qemu.org/qemu-6.1.0.tar.xz
解压
$ mkdir qemu
$ cd qemu
$ mkdir build
$ tar xvJf qemu-6.1.0.tar.xz
$ ls
qemu-6.1.0 qemu-6.1.0.tar.xz build
$ cd build
建立build目录,并进入该目录安装qemu。
2、配置
$ cd build
$ ../qemu-6.1.0/configure
这里遇到了很多问题,有的问题网上找不到答案,后面我重装了PYTHON和GCC发现又没问题了,所以推荐先安装好PYTHON和GCC,再安装QEMU!
参考:
https://blog.csdn.net/qq_36287943/article/details/120061500
https://blog.csdn.net/qq_36393978/article/details/118086216
https://blog.csdn.net/weixin_44681954/article/details/123095796
2.1
ERROR1:ERROR: Cannot use 'xxxx/python/bin', Python >= 3.6 is required. Use --python=/path/to/python to specify a supported Python.
解决办法:需要Python>=3.6,想办法让python3 --version
默认指向python3.8;或者执行configure命令时加参数
--python=/usr/local/python/python3.8/bin/python3.8
2.2
ERROR2:ERROR: You need at least GCC v7.5 or Clang v6.0 (or XCode Clang v10.0)
解决办法:需要GCC>=7.5,想办法让gcc -v
默认使用GCC7.5。
2.3
ERROR3: glib-2.56 gthread-2.0 is required to compile QEMU
解决办法:下载glib2.56编译安装,我在网上 https://www.linuxfromscratch.org/blfs/view/8.3/general/glib2.html 下载的glib-2.56.1.tar.xz 。
编译时错误1:configure: error: Python interpreter is too old
解决办法:PYTHON="/home/zgl/python3.6/bin/python3.6"
编译时错误2:configure: error: *** Could not find libmount
解决办法:--enable-libmount=no
完整编译如下:
sudo PYTHON="/usr/local/python/python3.8/bin/python3.8" ./autogen.sh --enable-libmount=no
make -j 32
sudo make install
2.4
ERROR4:ERROR: Could not detect Ninja v1.7 or newer
sudo apt install re2c
git clone git://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap
sudo cp ninja /usr/bin/
我在Ubuntu下载失败,直接在github.com/ninja-build/ninja.git 下载的ninja-master.zip
2.5
ERROR: Cannot find Ninja
缺少Ninja,安装ninja即可。
$ sudo apt-get install ninja-build
好像用到了re2c-1.0.3.tar.gz ?
2.6
ERROR: pkg-config binary ‘pkg-config’ not found
sudo apt-get install pkg-config
3、进行配置和编译:
$ cd build
$ ../qemu-6.1.0/configure
$ make
$ make install
4、QEMU测试
$ sudo apt install qemu-system-arm
查看QEMU版本
$ qemu-system-arm --version
查看QEMU支持的ARM型号
$ qemu-system-arm -M help
四、uboot
五、Linux
Linux版本任选,参考: https://codeleading.com/article/60103179369/
cd linux-5.19/
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make -j4
make modules -j4
make uImage LOADADDR=0x60000000
make dtbs
cp -f arch/arm/boot/uImage ../image/
cp -f arch/arm/boot/zImage ../image/
cp -f arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../image/device.dtb
编译完成后可用直接单独跑下内核:进入Linux源码目录下
linux$ qemu-system-arm -M vexpress-a9 -m 512 -kernel arch/arm/boot/zImage -nographic -append "console=ttyAMA0" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb
最后打印
[<8010e5c8>] (unwind_backtrace) from [<8010b028>] (show_stack+0x10/0x14)
[<8010b028>] (show_stack) from [<80356200>] (dump_stack+0x84/0x98)
[<80356200>] (dump_stack) from [<801a8d38>] (panic+0xdc/0x248)
[<801a8d38>] (panic) from [<808012ac>] (mount_block_root+0x1c8/0x2a0)
[<808012ac>] (mount_block_root) from [<808014a8>] (mount_root+0x124/0x12c)
[<808014a8>] (mount_root) from [<80801600>] (prepare_namespace+0x150/0x198)
[<80801600>] (prepare_namespace) from [<80800eb4>] (kernel_init_freeable+0x250/0x260)
[<80800eb4>] (kernel_init_freeable) from [<805d276c>] (kernel_init+0x8/0x114)
[<805d276c>] (kernel_init) from [<80107578>] (ret_from_fork+0x14/0x3c)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
目前没有根文件系统,上面报错是正常的。