安裝qemu
命令行下,輸入 sudo apt-get install qemu 命令完成安裝:
這裏我已經安裝過一次,所以提示已經是最新版。
yellow@Ubuntu-yellow:~$ sudo apt-get install qemu
正在讀取軟件包列表… 完成
正在分析軟件包的依賴關係樹
正在讀取狀態信息… 完成
qemu 已經是最新版 (1:2.11+dfsg-1ubuntu7.19)。
升級了 0 個軟件包,新安裝了 0 個軟件包,要卸載 0 個軟件包,有 0 個軟件包未被升級。
安裝完成後,可以嘗試輸入 qemu 命令,如果出現自動補全,證明安裝成功。
yellow@Ubuntu-yellow:~$ qemu-
qemu-aarch64 qemu-ppc qemu-system-mipsel
qemu-alpha qemu-ppc64 qemu-system-moxie
qemu-arm qemu-ppc64abi32 qemu-system-nios2
qemu-armeb qemu-ppc64le qemu-system-or1k
qemu-cris qemu-s390x qemu-system-ppc
qemu-hppa qemu-sh4 qemu-system-ppc64
qemu-i386 qemu-sh4eb qemu-system-ppc64le
qemu-img qemu-sparc qemu-system-ppcemb
qemu-io qemu-sparc32plus qemu-system-s390x
qemu-m68k qemu-sparc64 qemu-system-sh4
qemu-make-debian-root qemu-system-aarch64 qemu-system-sh4eb
qemu-microblaze qemu-system-alpha qemu-system-sparc
qemu-microblazeel qemu-system-arm qemu-system-sparc64
qemu-mips qemu-system-cris qemu-system-tricore
qemu-mips64 qemu-system-i386 qemu-system-unicore32
qemu-mips64el qemu-system-lm32 qemu-system-x86_64
qemu-mipsel qemu-system-m68k qemu-system-xtensa
qemu-mipsn32 qemu-system-microblaze qemu-system-xtensaeb
qemu-mipsn32el qemu-system-microblazeel qemu-tilegx
qemu-nbd qemu-system-mips qemu-x86_64
qemu-nios2 qemu-system-mips64
qemu-or1k qemu-system-mips64el
安裝並編譯busybox
下載busybox源碼
在該網站下載busybox源代碼,選擇一個壓縮包進行下載。
這裏選擇最新版本的 busybox-1.31.1.tar.bz2
輸入 tar -xjvf busybox-1.31.1.tar.bz2 命令完成解壓
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64$ tar -xjvf busybox-1.31.1.tar.bz2
busybox-1.31.1/
busybox-1.31.1/sysklogd/
busybox-1.31.1/sysklogd/syslogd_and_logger.c
busybox-1.31.1/sysklogd/klogd.c
…
編譯busybox生成根文件系統
- 進入 busybox 源碼目錄
cd ./busybox-1.31.1.tar.bz
- 嘗試編譯 busybox
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
注意:
編譯busybox必須提前安裝好工具鏈,我使用的工具鏈爲gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
工具鏈可以在linaro官網下載
- 安裝庫
第一次編譯 busybox 會出現失敗,這是由於缺少庫導致的。
輸入 sudo apt install aptitude 安裝 aptitude
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64/busybox-1.31.1$ sudo apt install aptitude
正在讀取軟件包列表… 完成
正在分析軟件包的依賴關係樹
正在讀取狀態信息… 完成
將會同時安裝下列軟件:
aptitude-common libcwidget3v5
建議安裝:
aptitude-doc-en | aptitude-doc apt-xapian-index debtags tasksel libcwidget-dev
輸入 sudo aptitude install libncurses5-dev 安裝 libncurses5-dev
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/qemu64/busybox-1.31.1$ sudo aptitude install libncurses5-dev
下列“新”軟件包將被安裝。
libncurses5-dev libtinfo-dev{a}
0 個軟件包被升級,新安裝 2 個, 0 個將被刪除, 同時 0 個將不升級。
需要獲取 256 kB 的存檔。 解包後將要使用 1,422 kB。
- 重新編譯 busybox ,此時可以正常編譯
- 修改 busybox 編譯選項選擇靜態庫編譯,編譯完成後保存
Settings -> Build static binary
- 編譯生成根文件系統
首先執行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
-j8代表8覈編譯,需根據自己的cpu情況修改個數,如果不清楚可以直接將-j8刪除
然後執行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install
編譯完成後會在當前目錄生成根文件系統目錄 ./_install
修改文件系統
編譯好後的根文件系統不能直接使用,需要做一些修改。
- 將文件系統文件夾 _install 拷貝到 linux 內核代碼目錄
這裏我拷貝到 linux-5.1.15 目錄下
- 修改生成的文件系統
- 創建etc、dev、mnt、etc/init.d目錄
mkdir etc dev mnt
mkdir -p etc/init.d/
- 修改 etc 下文件內容
創建 etc/init.d/rcS 內容如下
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
創建 etc/fstab 內容如下
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
創建 etc/inittab 內容如下
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::cttlaltdel:/bin/umount -a -r
在 dev 下創建 console 節點
cd dev
sudo mknod console c 5 1
編譯內核
- make ARCH=arm64 defconfig -j8
- make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
- 修改 menuconfig 配置
輸入 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
修改 Initramfs 文件夾目錄,修改爲之前製作並拷貝後的_install目錄
General Setup -> Initramfs source file(s)
- make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 重新編譯
- 編譯後Image路徑爲 arch/arm64/boot/Image
qemu啓動Linux內核
有兩種方式,第一種直接啓動,第二種通過gdb啓動。
直接啓動
輸入如下命令
qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -m 2048 -smp 2 -kernel arch/arm64/boot/Image --append “rdinit=/linuxrc console=ttyAMA0”
如果運行成功,效果如下:
使用GDB連接啓動
在一個terminal窗口輸入如下命令:
qemu-system-aarch64 -s -S -machine virt -cpu cortex-a57 -machine type=virt -nographic -m 2048 -smp 2 -kernel arch/arm64/boot/Image --append “rdinit=/linuxrc console=ttyAMA0”
啓動另外一個terminal連接gdb
aarch64-linux-gnu-gdb vmlinux
出現如下界面後,輸入target remote:1234 即可連接。
連接成功後,按照普通的GDB方式調試即可。
編譯內核中常見問題
問題一
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$ make ARCH=arm64 defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
scripts/Makefile.lib:194: recipe for target ‘scripts/kconfig/lexer.lex.c’ failed
make[1]: *** [scripts/kconfig/lexer.lex.c] Error 127
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$
原因
/bin/sh: 1: flex: not found
缺少 flex 庫
解決方法
sudo apt-get install flex
問題二
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$ make ARCH=arm64 defconfig
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.h
/bin/sh: 1: bison: not found
scripts/Makefile.lib:208: recipe for target ‘scripts/kconfig/parser.tab.h’ failed
make[1]: *** [scripts/kconfig/parser.tab.h] Error 127
Makefile:552: recipe for target ‘defconfig’ failed
make: *** [defconfig] Error 2
yellow@Ubuntu-yellow:~/windows/learn/huangchangwei/rep/kernel/5.1.15/linux-5.1.15$
原因
/bin/sh: 1: bison: not found
缺少 bison 庫
解決方法
sudo apt-get install bison
問題三
DTC arch/arm64/boot/dts/arm/fvp-base-revc.dtb
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: 沒有那個文件或目錄
#include <openssl/bio.h>
^~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.host:92: recipe for target ‘scripts/extract-cert’ failed
make[1]: *** [scripts/extract-cert] Error 1
make[1]: *** 正在等待未完成的任務…
原因
缺少 libssl-dev 庫
解決方法
sudo apt-get install libssl-dev
qemu遇見的問題
問題一
內核啓動失敗,提示unable to open an initial console
解決方法
這個問題是在使用Linux5.1.15時發現的,google了很久都沒有解決。
最後嘗試替換爲老一點的4.1.43內核,之前的所有步驟都是一樣的,沒有出現這個現象。
所以,推測可能是最新的內核在qemu上兼容性不夠好,暫時先放在一邊,之後有空了再看看能不能解決。