Mac 系统下配置 Tee 开发环境 - tearust/tee-on-mac GitHub Wiki

安装 Ubuntu 18.04

安装qemu:

$ brew install qemu

查看版本:

$ qemu-system-x86_64 --version

QEMU emulator version 4.2.0
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

下载 Ubuntu 18.04 镜像

https://ubuntu.com/download/desktop

创建磁盘镜像

$ qemu-img create -q -f qcow2 ubuntu.img 80G

启动虚拟机并载入 ISO 文件

$ qemu-system-x86_64 -m 4096 -cdrom ubuntu-18.04.4-desktop-amd64.iso --enable-kvm -accel hvf ubuntu.img

参数说明:

-m 4096:为虚拟机分配 4G 内存

--enable-kvm -accel hvf:启用mac环境下硬件加速功能

安装 ubuntu

选择最小化安装即可,具体可参考: https://graspingtech.com/ubuntu-desktop-18.04-virtual-machine-macos-qemu/

安装完成后,关闭系统,去掉 ISO 文件挂载再次启动:

$ qemu-system-x86_64 -m 4096 --enable-kvm -accel hvf ubuntu.img -vga virtio -show-cursor -net user,hostfwd=tcp::2222-:22 -net nic -smp 8,sockets=1,cores=4

参数说明:

-vga virtio: 启用图形界面加速

-net user,hostfwd=tcp::2222-:22 -net nic:虚拟机内 22 端口映射到 host 2222端口

-smp 4,sockets=1,cores=2:模拟一个双核4线程 cpu

配置 ssh

虚拟机启动后,安装 openssh 服务:

$ sudo apt update
$ sudo apt install openssh-server

在 host 上面 ssh 到虚拟机:

$ ssh user@localhost -p 2222

编译内核

安装依赖项

登录到 ubuntu

$ sudo apt update
$ sudo apt install build-essential libncurses5-dev flex bison libssl-dev

下载内核

$ mkdir kernel
$ cd kernel
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.109.tar.xz
$ tar xvf linux-4.19.109.tar.xz

编译

$ cd linux-4.19.109

配置编译选项

$ make menuconfig 

开启 DHCP 功能,如下:

-- Networking support       
     Networking options  --->
        [*]   IP: kernel level autoconfiguration 
         [*]     IP: DHCP support 
         [*]     IP: BOOTP support 
         [*]     IP: RARP support

选择 e1000 网卡驱动,这个没有在 menuconfig 中找到,可以手动来配置一下:

$ vi .config

将下面选项改成y

CONFIG_E100=y
CONFIG_E1000=y
CONFIG_E1000E=y
CONFIG_E1000E_HWTS=y

开始编译

$ make -j8

拷贝编译好的内核到 ~/kernel 目录

$ cp linux-4.19.109/arch/x86_64/boot/bzImage .

内核上跑 rust 程序

安装 rust 环境

$ sudo apt install curl
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ rustup toolchain install nightly

创建 helloworld

$ mkdir rust
$ cd rust
$ cargo --version
cargo 1.42.0 (86334295e 2020-01-31)
$ cargo new --bin hello
$ cd hello
$ cargo build
$ ldd ./target/debug/hello
	linux-vdso.so.1 (0x00007ffe0c9b4000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0712ee6000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0712cde000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0712abf000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f07128a7000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f07124b6000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f071331c000)

可以看到 rust 默认编译的程序依赖动态库。这样不能运行在内核上,需要静态编译。

静态编译

使用MUSL编译,首先需要安装musl环境:

$ sudo apt install musl-tools
$ rustup target add x86_64-unknown-linux-musl
$ rustup target add x86_64-unknown-linux-musl --toolchain=nightly
$ cargo +nightly build --release --target=x86_64-unknown-linux-musl
$ ldd ./target/x86_64-unknown-linux-musl/release/hello
	not a dynamic executable

制作 initrd

拷贝静态编译的二进制 hello 到 ~/kernel

$ cd ~/kernel
$ cp ../rust/hello/target/x86_64-unknown-linux-musl/release/hello .
$ echo hello | cpio -o --format=newc > rootfs

这时~/kernel里面有有 bzImagerootfs 文件。

使用 Qemu 启动内核

这一步在 Mac 系统上。首先拷贝编译好的内核与rootfs。

$ mkdir kernel
$ cd kernel
$ scp -P2222 user@localhost:~/kernel/bzImage .
$ scp -P2222 user@localhost:~/kernel/rootfs .
$ qemu-system-x86_64 -m 1024 -kernel ./bzImage -initrd ./rootfs -append "rdinit=/hello"

制作根文件系统

重新ssh进入Ubuntu虚拟机

安装 busybox

$ mkdir busybox
$ cd busybox
$ wget https://busybox.net/downloads/busybox-1.30.1.tar.bz2
$ tar xvf busybox-1.30.1.tar.bz2
$ cd busybox-1.30.1
$ make menuconfig

注意配置静态编译,如下:

Settings  --->  
     [*] Build static binary (no shared libs)

配置 DHCP 工具,如下:

Networking Utilities  --->
    [*] udhcpd (21 kb)
    [*] udhcpc (24 kb)

编译,安装:

$ make -j8
$ make install

制作根文件系统

$ cp -rf busybox-1.30.1/_install rootfs
$ cd rootfs
$ mkdir proc sys dev etc etc/init.d usr/share usr/share/udhcpc
$ cp ../busybox-1.30.1/examples/udhcp/simple.script usr/share/udhcpc/default.script
$ vi etc/init.d/rcS

输入以下内容:

#!/bin/sh

mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s

ifconfig lo 127.0.0.1
ifconfig eth0 up
udhcpc

修改权限

$ chmod +x etc/init.d/rcS

拷贝 hello 到 rootfs

$ cp ../../kernel/hello .

制作文件系统

$ find . | cpio -o --format=newc > ../rootfs.img

启动kernel与文件系统

先拷贝制作好的 rootfs.img 到 mac 系统

$ scp -P2222 -o Compression=no user@localhost:~/busybox/rootfs.img .
or
rsync -avzhe "ssh -p 2222" --progress  user@localhost:~/busybox/rootfs.img .

启动

$ qemu-system-x86_64 -m 1024 -kernel ./bzImage -initrd ./rootfs.img -append "root=/dev/ram rdinit=sbin/init"

busybox 内运行 hello

# ./hello

开启 http 服务

启动,映射 host 8080 到 qemu 80,如下:

$ qemu-system-x86_64 -m 1024 -kernel ./bzImage -initrd ./rootfs.img -append "root=/dev/ram rdinit=sbin/init" -net user,hostfwd=tcp::8080-:80 -net nic

开启 httpd 服务,busybox 自带 httpd:

# httpd
# echo "Hello Kernel!" >> index.html

host 访问 http 服务:

$ curl localhost:8080
Hello Kernel!

参考

mac上使用 qemu 安装ubuntu:https://graspingtech.com/ubuntu-desktop-18.04-virtual-machine-macos-qemu/

qemu cpu 配置:https://www.cnblogs.com/pengdonglin137/articles/5023994.html

kernel 上跑hello world 程序:https://blog.csdn.net/sinat_22597285/article/details/53783221

kernel 消息打印到窗口:https://blog.csdn.net/zinnc/article/details/81351170

搭建 qemu kernel 开发环境:https://blog.csdn.net/weixin_38227420/article/details/88402738

rust 静态编译:https://blog.csdn.net/castellan/article/details/86063775