1 虚拟机安装(以在win10下安装vmware station 16.0 Pro为例)
(1)点击vmware station 16.0 pro安装包,按默认方式安装该安装包
(2)点击帮助->输入许可证密钥选项,并输入激活密钥
(3)若出现以下提示:您无权输入许可证密钥。请使用系统管理员账户重新尝试。
则按以下方式激活:
a 按win + R键,并输入cmd打开命令行窗口
b 在命令行窗口输入以下命令切换工作目录
cd C:\Program Files (x86)\VMware\VMware Workstation\x64
c 输入如下命令激活vmware,其中xxx为激活码
vmware-vmx.exe --new-sn xxx
(4)若出现以下提示:与 vmx86 驱动程序的版本不匹配: 预期为 385.0,实际为 331.0错误。
则进入C:\Windows\System32\drivers目录,将vmx86.sys修改vmx86.zzz,即将其后缀名修改为系统无法识别的类型,然后重启系统后再删除该文件
2 Ubuntu18.04安装
(1)打开vmstation ->创建新的虚拟机 -> 指定os镜像文件,一路next安装操作系统,如ubuntu18.04
(2)设置ubuntu的root密码
sudo passwd
然后输入密码,该密码即为root密码
(3)ubuntu18.04更换国内源
a 备份/etc/apt/sources.list文件
sudo mv /etc/apt/sources.list/etc/apt/sourses.list.backup
b 新建/etc/apt/sources.list文件
sudo vi /etc/apt/sources.list
c 输入以下内容(阿里源)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
(4)若主机ping不通虚拟机,且主机不显示vmnet8网络适配器。则可能是前一次的虚拟机卸载后,注册表未清理干净导致。可用如下方法清理注册表
a 打开CCleaner官网,根据提示安装CCleaner清理软件
b 安装完成后,双击打开CCleaner软件,找到Registry选项
c 点击Scan for Issues,会出现以下problem和data信息
d 点击右下角的Fix selected Issues按照提示步骤清空问题信息
e 重新启动虚拟机,点击编辑 -> 虚拟网络编辑器,勾选将主机虚拟适配器连接到此网络选项
(5)安装vim
sudo apt-get install vim
(6)设置虚拟机静态ip
a&ensp在/etc/netplan目录下打开01-network-manager-all.yaml文件。注意:该文件名不一定与上面一样,需根据实际情况配置
b 在该文件中设置如下内容
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: no
addresses: [192.168.136.135/24]
gateway4: 192.168.136.2
nameservers:
addresses: [192.168.1.1]
其中:网卡名称,ip地址等需根据实际情况配置
网关地址可查看虚拟机的 编辑 --> 虚拟网络编辑器 --> nat设置 获取
dns地址查看 windows cmd -->ipconfig /all --> 默认网关
c yaml语法格式
使用缩进作为不同层次区分,且缩进只能用空格,不能用tab键。
缩进的空格数目没有限制,但同层次的缩进空格数必须相同后面需要加空格
d 使配置生效
netplan apply
(7)安装sshd
a sudo apt-get update
b sudo apt-get install openssh-server
c 启动ssh服务
sudo /etc/init.d/ssh start 或
sudo systemctl start ssh
d 重启ssh服务
sudo /etc/init.d/ssh restart 或
sudo systemctl stop ssh
e 关闭ssh服务
sudo /etc/init.d/ssh stop
f 设置ssh服务为自启动
sudo systemctl enable ssh
g 查看ssh的启动状态
sudo systemctl status ssh
(8)安装samba
a 安装samba服务器
sudo apt-get install samba samba-common
b 创建一个samba分享的目录
mkdir /home/lgj/work
c 设置目录权限
sudo chmod 777 /home/lgj/work
d 添加samba用户
sudo smbpasswd -a lgj
然后设置samba密码。其中lgj为我的用户名
e 配置samba配置文件
sudo vim /etc/samba/smb.conf
添加如下内容
[share]
comment = share folder
browseable = yes
path = /home/lgj/work
create mask = 0700
directory mask = 0700
valid users = lgj
force user = lgj
force group = lgj
public = yes
available = yes
writable = yes
f 重启samba服务器
sudo service smbd restart
g 在windows下映射网络驱动器
输入:\192.168.136.135\share
输入用户名和密码,samba挂载成功
h 开启ufw以后,samba挂载不上问题解决(允许samba端口访问)
sudo ufw allow 137
sudo ufw allow 138
sudo ufw allow 139
sudo ufw allow 389
sudo ufw allow 445
sudo ufw allow 901
3 开发工具安装
(1)make安装
sudo apt-get install make
(2)gcc安装
sudo apt-get install gcc
sudo apt-get install g++
(3)aarch64交叉工具链安装
a 下载
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
b 解压
xz -d gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
tar xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar
(4)编译内核时缺少库问题解决
a /bin/sh: 1: flex: not found问题
sudo apt-get install flex
b /bin/sh: 1: bison: not found
sudo apt-get install bison
c fatal error: openssl/bio.h: No such file or directory
sudo apt-get install libssl-dev
d <stdin>:1:10: fatal error: libelf.h: No such file or directory
sudo apt-get install libelf-dev
4 Jenkins安装
(1)sudo update
(2)安装jdk-8
sudo apt install openjdk-8-jdk
(3)下载jenkins公钥
wget https://pkg.jenkins.io/debian/jenkins.io.key
(4)使用apt-key将公钥添加到系统密钥中
sudo apt-key add jenkins.io.key
(5)将jenkins存储库添加到来源列表中
打开/etc/apt/sources.list文件,将下列内容添加到末尾:
deb https://pkg.jenkins.io/debian-stable binary/
(6)安装jenkins
sudo apt update
sudo apt install jenkins
(7)如果jenkins被正确安装,则会自动启动,可通过下列命令验证其是否已启动
sudo systemctl status jenkins
(8)默认情况下,jenkins仅允许本地访问服务器,因此需配置ufw防火墙以允许传入连接到jenkins服务器的端口。jenkins默认在8080端口工作,必须要允许ufw防火墙访问此端口
sudo ufw allow 8080
(9)检查ufw是否允许8080端口传入流量
sudo ufw status
(10)通过http访问jenkins(端口转发)
a nat方式需要设置端口转发
在虚拟机–>编辑–>虚拟网络编辑器–> nat设置中添加端口转发
b 其中192.168.136.135为虚拟机ip,8080为jenkins端口,9080为主机端口。
c 访问jenkins,其中192.168.1.4为主机ip
https://192.168.1.4:9080
(11)如果防火墙处理关闭状态。可用下列命令开启
sudo ufw allow OpenSSH
sudo ufw enable
(12)获取并输入jenkins密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
da10519418c2446ba1dfb89b1152c450
(13)安装插件
(14)创建管理员账户
设置用户名和密码
5 代码下载及编译
5.1 ATF代码
(1)下载atf
git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
(2)编译atf
cd trusted-firmware-a
export ARCH=arm64
export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
make PLAT=qemu BL33=yyy/u-boot/u-boot.bin all fip DEBUG=1
以上编译方式将编译可在qemu平台运行的atf镜像,并且在启动过程中会加载yyy/u-boot/u-boot.bin作为uboot镜像。
(3)由于atf的qemu配置中默认使用GICv2,若要配置系统使用GICv3,则需修改plat/qemu/qemu/platform.mk中的如下行:
QEMU_USE_GIC_DRIVER := QEMU_GICV2 修改为:
QEMU_USE_GIC_DRIVER := QEMU_GICV3
5.2 Uboot代码
(1)下载uboot
git clone https://source.denx.de/u-boot/u-boot.git
(2)编译uboot
export ARCH=arm64
export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
make qemu_arm64_defconfig
make
以上编译方式将编译可在qemu平台运行的atf镜像
(3)若uboot需用semihosting方式加载内核和dtb,则在configs/qemu_arm64_defconfig中添加以下配置:
CONFIG_SEMIHOSTING=y
5.3 kernel代码
(1)下载kernel
a 进入内核官网
https://www.kernel.org/
b 选择一个希望下载的分支,点击browse,然后点击summary
c 拉到底,复制git地址xxx
d 下载代码
git clone xxx
(2)编译内核
export ARCH=arm64
export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
make defconfig
make
以上编译方式编译的内核可在qemu环境下运行
5.4 rootfs代码
(1)我们选择buildroot来编译我们的rootfs
(2)buildroot下载
从以下地址下载buildroot并解压
https://buildroot.org/download.html
tar zxvf buildroot-2021.05.1.tar.gz
或者采用git下载
git clone git://git.buildroot.net/buildroot
(3)buildroot配置
a 若出现Unable to find the ncurses libraries or the …问题,则安装以下lib
sudo apt-get install libncurses5-dev libncursesw5-dev
(4)buildroot具体配置方式可参考以下链接
buildroot使用详解
5.5 qemu代码
(1)源码下载
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive
(2)相关库安装
sudo apt-get install libcap-dev (–enable-virtfs需要)
(3)编译错误解决
a ERROR: Cannot find Ninja 错误解决
sudo apt-get install re2c
git clone https://github.com/ninja-build/ninja.git
./configure.py --bootstrap
sudo cp ./ninja /usr/bin/
b ERROR: meson setup failed问题解决
sudo apt-get install python3
python3-pip ninja-build
切换到python3
sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.6 /usr/bin/python3
安装meson
pip3 install --user meson
c RROR: Problem encountered: virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel 问题解决
从以下网站下载libcap-ng包:
https://launchpad.net/ubuntu/+source/libcap-ng/0.7.7-3.1
cd libcap-ng-0.7.7
./autogen.sh
./configure
make
sudo make install
(4)编译qemu
./configure --target-list= aarch64-linux-user, aarch64-softmmu --enable-virtfs --enable-debug
make
sudo make install
6 qemu运行
6.1 qemu运行kernel示例
(1)主机安装brctl和tunctl工具
sudo apt install uml-utilities
sudo apt install bridge-utils
(2)主机通过桥接方式配置tap接口,该接口可用于虚拟机与主机之间的网络通信
brctl addbr br0
ip addr flush dev ens33
brctl addif br0 ens33
tunctl -t tap0 -u whoami
brctl addif br0 tap0
ifconfig ens33 up
ifconfig tap0 up
ifconfig br0 up
ifconfig ens33 192.168.136.135
ifconfig br0 192.168.136.110
ifconfig tap0 192.168.136.115
其中ip地址需要根据实际情况配置。
虚拟机启动后可在模拟目标板上使用以下命令配置ip:
sudo ifconfig eth0 192.168.136.226
(2)启动qemu
cur_time=$(date +%Y-%m-%d-%H-%M-%S)
qemu-system-aarch64
-M virt,gic_version=3
-cpu cortex-a53
-smp 2
-m 2048M
-kernel xxx/kernel/arch/arm64/boot/Image
-drive file=xxx/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
-device virtio-blk-device,drive=blk1
-append "console=ttyAMA0 root=/dev/vda"
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no
-device virtio-net-device,netdev=net0
-fsdev local,security_model=mapped-xattr,path=zzz/share,id=fsdev0
-device virtio-9p-device,fsdev=fsdev0,mount_tag=virtshare
-dtb xxx/kernel/arch/arm64/boot/dts/qemu/test-board.dtb
-nographic -d guest_errors,unimp -D log/$cur_time \
其中:
a -d guest_errors,unimp -D log/$cur_time用于将qemu的log导出到文件log/$cur_time中。
b -dtb用于指定内核启动时使用的dtb,该参数可以不指定,此时qemu将会使用指定machine默认创建的dtb。
c -fsdev用于虚拟机与host之间共享目录,即主机上的zzz/share目录可以与虚拟机共享,虚拟机启动后通过以下mount命令挂载该目录即可:
mount -t 9p -o trans=virtio /mnt/host virtshare
其中挂载点可以通过以下sysfs路径查看:
/sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag
6.2 qem启动uboot示例
qemu-system-aarch64
-M virt
-cpu cortex-a53
-smp 2
-m 2048M
-kernel /home/lgj/work/u-boot/u-boot
-nographic
6.3 qemu通过atf启动kernel示例
(1)按第五章的方式分别编译atf、uboot和kernel
(2)按以下命令启动qemu
cur_time=$(date +%Y-%m-%d-%H-%M-%S)
qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3
-cpu cortex-a53
-smp 2 -m 2048
-d guest_errors,unimp -D log/$cur_time
-bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin
-drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
-device virtio-blk-device,drive=blk1
-semihosting-config enable=on,target=native
该命令执行后,qemu会从atf的bl1.bin开始执行,并依次启动其后的bl2、bl31和uboot
(3)由于uboot添加了对semihosting的支持,因此在uboot命令行中执行以下命令,通过semihosting方式从host上加载kernel和dtb
smhload xxx/kernel/arch/arm64/boot/Image 0x40000000
smhload xxx/kernel/arch/arm64/boot/dts/qemu/test-board-smc.dtb 0x43000000
(4)设置bootargs并启动内核
setenv bootargs " console=ttyAMA0 root=/dev/vda"
booti 0x40000000 - 0x43000000
6.4 退出qemu
先按住Ctrl + A,松开后再输入X
7 qemu通过gdb调试目标镜像
(1)在启动qemu时添加-s –S选项,如:
qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3
-cpu cortex-a53
-smp 2 -m 2048
-d guest_errors,unimp -D log/$cur_time
-bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin
-drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
-device virtio-blk-device,drive=blk1
-semihosting-config enable=on,target=native
其中:
-S:表示QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令
-s:表示在1234端口接受GDB的调试连接,其与-gdb tcp::1234参数相同
(2)在另一窗口下通过dgb从atf的bl1开始启动
xxx/bin/aarch64-linux-gnu-gdb yyy/trusted-firmware-a/build/qemu/debug/bl1/bl1.elf
(3)添加uboot和kernel的符号表
add-symbol-file /home/lgj/work/u-boot/u-boot
add-symbol-file /home/lgj/work/linux/vmlinux
若需要调试bl2和bl31,其符号表添加方式类似
(4)gdb通过tcp方式attach到qemu的目标板上
target remote localhost:1234
(5)设置断点
(6)开始代码执行
c
(7)若未设置断点,系统将会进入uboot命令行,此时可采用6.3的方式启动内核
8 qemu monitor的使用
qemu monitor是一个qemu控制台,我们可以通过它实现与qemu或正在运行虚拟机之间的交互。在qemu monitor中我们可以实现很多功能,如查询虚拟机的状态信息,添加删除设备,更改虚拟机的运行时配置等。
(1)进入qemu monitor
先按住Ctrl + A,松开后再输入C
(2)退出qemu monitor
与进入时相同,也是先按住Ctrl + A,松开后再输入C
(3)help命令
其作用是用于显示qemu monitor支持的命令及其相应的用法
示例1:显示其支持的所有命令
示例2:显示特定命令的用法
(4)info命令
该命令用于显示虚拟机的状态
示例1:显示目标系统的cpu
示例2:显示所有cpu的寄存器值
(5)其它命令可参考帮助信息