Popcorn系统搭建
参考资料 VM Setup · ssrg-vt/popcorn-kernel Wiki · GitHub , VM network using tap · ssrg-vt/popcorn-kernel Wiki · GitHub
1.概述
该文档用于描述如何使用qemu虚拟机为popcorn linux系统设置测试环境,我们将在x86主机(采用虚拟机)上运行两个虚拟机(一个x86,一个arm),为了简化测试,我们将在主机(不在虚拟机内部)编译内核,并使用主机文件系统上的内核启动虚拟机
-------------- --------------
| Node 0 | | Node 1 |
| | | |
| x86 | | arm |
| 10.2.1.100 | | 10.2.1.101 |
-------------- --------------
| qem-x86 | | qemu-arm |
-------------------------------
| linux-x86 linux-arm |
| | -----------------
| host (x86) | | Gateway |
| 192.168.199.146 |---| 192.168.199.1 |--- Internet
------------------------------- -----------------
2.实验环境
宿主机:ubuntu 18.04(本次实验使用vmware虚拟机模拟ubuntu系统)
磁盘大小:使用虚拟机的话最好不少于60G(非常关键,因为要下载的文件较大,如果磁盘开的不够需要重新安装系统,很麻烦)
RAM:8G (下面的 qemu 脚本为每个 VM 分配 2G RAM。可以在脚本中更改 -m 选项以使用不同大 小的内存)
ps:如果使用虚拟机作为宿主机,需要在vmware中开启虚拟化,否则在启动x86或arm虚拟机时会报错,如下图直接勾选两者即可
3.搭建准备
1安装所需包
$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev libncursesw5-dev git curl bc
2下载内核源码和磁盘镜像
注意:下载之前要翻墙
Item | Filename | URL |
---|---|---|
Kernel source | popcorn-kernel.tar.gz | https://github.com/ssrg-vt/popcorn-kernel/archive/linux-4.4.137.tar.gz |
x86 VM image | x86.img | https://drive.google.com/open?id=0B7RfKPGm2YZsaURxTVh5ZTMyTk0 |
arm VM image | arm.img | https://drive.google.com/open?id=0B7RfKPGm2YZsaF9rdkZTLVAxX3M |
使用共享文件夹的方式将下载的文件复制到虚拟机中,将下以上三个文件放在同一目录下,下载后相应的重命名内核文件,目录下应包含以下三个文件
$ ls
arm.img popcorn-kernel.tar.gz x86.img
解压内核源码
$ tar -xzf popcorn-kernel.tar.gz
或者可以直接从github导入内核源码
$ git clone https://github.com/ssrg-vt/popcorn-kernel.git
4.设置主机网络接口
1.为宿主机创建两个虚拟网卡tap0和tap1,并设置ip规则
sudo ip tuntap add mode tap tap0
sudo ip addr add 10.2.0.1/24 dev tap0
sudo ip link set tap0 up
sudo ip tuntap add mode tap tap1
sudo ip addr add 10.2.1.1/24 dev tap1
sudo ip link set tap1 up
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE //ens33需要替换
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
注意:ens33为我的宿主机的网卡,你需要替换成你的宿主机的网卡
2.打开路由转发功能
$ sudo vim /etc/sysctl.conf
...
net.ipv4.ip_forward = 1 //在sysctl.conf添加这条规则即可,若有这条规则则修改即可
...
$ sysctl -p /etc/sysctl.conf
3.重启网络配置
$ sudo /etc/init.d/networking restart
4.网络配置查看
5.配置并启动x86虚拟机
1.安装qemu包以模拟x86
$ sudo apt-get install qemu-system-x86
2.为x86虚拟机创建工作目录
$ cp -r popcorn-kernel-linux-4.4.137/ linux-x86
$ cp linux-x86/kernel/popcorn/configs/config-x86_64-qemu linux-x86/.config
3.编译内核
make -C linux-x86 -j 4
4.启动x86虚拟机(必须开启vmware的虚拟化,第2节所提到的,否则无法启动)
sudo qemu-system-x86_64 \
-enable-kvm -cpu host -smp 1 -m 2048 -no-reboot -nographic \
-drive id=root,media=disk,file=x86.img \
-net nic,macaddr=a6:5a:0d:31:01:46 -net tap,ifname=tap0 \
-kernel linux-x86/arch/x86/boot/bzImage \
-append "root=/dev/sda1 console=ttyS0"
进入虚拟机后查看网络配置,如不符合预期需要配置tap0网卡(root密码为popcorn)
$ cat /etc/network/interfaces //查看网络配置文件
如果不符合上述预期,则修改网络配置
$ sudo vim /etc/network/interfaces //修改网络配置文件
使用ifconfig命令查看配置,如果不符合预期同样要修改
$sudo ifconfig eth0 10.2.0.100 netmask 255.255.255.0 //修改网络配置
6.配置并启动arm虚拟机
1.安装qemu包和arm交叉编译工具
$ sudo apt-get install qemu-system-arm
$ sudo apt-get gcc-aarch64-linux-gnu //安装交叉编译工具链
2.为arm虚拟机创建工作目录
$ cp -r popcorn-kernel-linux-4.4.137/ linux-arm
$ cp linux-arm/kernel/popcorn/configs/config-arm64-qemu linux-arm/.config
3.交叉编译arm内核
ARCH="arm64" make -C linux-arm -j 4
4.启动arm虚拟机(必须开启vmware的虚拟化,第2节所提到的,否则无法启动)
sudo qemu-system-aarch64 \
-machine virt -cpu cortex-a57 -m 2048 -nographic \
-drive id=root,if=none,media=disk,file=arm.img \
-device virtio-blk-device,drive=root \
-netdev type=tap,id=net0,ifname=tap1 \
-device virtio-net-device,netdev=net0,mac=a6:5a:0d:31:02:13 \
-kernel linux-arm/arch/arm64/boot/Image \
-append "root=/dev/vda console=ttyAMA0"
进入虚拟机后查看网络配置,如不符合预期需要配置tap1网卡
$ cat /etc/network/interfaces.d/eth0 //查看网络配置文件
如果不符合上述预期,则修改网络配置
$ sudo vim /etc/network/interfaces.d/eth0 //修改网络配置文件
使用ifconfig命令查看配置,如果不符合预期同样要修改
$sudo ifconfig eth0 10.2.1.100 netmask 255.255.255.0 //修改网络配置
7.启动Popcorn消息层
1.在主机上同时修改两个内核的linux-x86/msg_layer/config.h(linux-arm/msg_layer/config.h)的配置文件
$ sudo vim linux-x86/msg_layer/config.h
$ sudo vim linux-arm/msg_layer/config.h
2.将以下配置信息添加或修改到配置文件中
const char *ip_addresses[] = {
"10.2.0.100", /* x86 address */
"10.2.1.100", /* arm address */
}
3.编译x86和arm的消息传递模块
$ sudo make -C linux-x86 -j 4 msg_layer/msg_socket.ko //x86
$ sudo ARCH="arm64" make -C linux-arm -j 4 msg_layer/msg_socket.ko //arm
4.将消息传递模块复制到虚拟机中
$ scp linux-x86/msg_layer/msg_socket.ko popcorn@10.2.0.100:
$ scp linux-arm/msg_layer/msg_socket.ko popcorn@10.2.1.100:
5.分别在两个虚拟机中加载相应的模块
popcorn@x86:~$ sudo insmod ./msg_socket.ko
popcorn@arm:~$ sudo insmod ./msg_socket.ko
结果如下
如果加载模块时出现卡住的情况,请检查x86虚拟机和arm虚拟机的通信情况,查看是否第4节网络配置出现问题