如何启动 NonRoot Linux(Zone1 Linux)

使用 hvisor-tool 启动 NonRoot Linux。

# Linux 源代码路径
LINUX_PATH="<路径>/linux"

git clone https://github.com/syswonder/hvisor-tool.git
cd hvisor-tool
make all ARCH=arm64 LOG=LOG_WARN KDIR="${LINUX_PATH}"

请务必保证 hvisor 中的 root linux 镜像也是由编译 hvisor-tool 时参数选项中的 Linux 源代码目录编译产生。

请务必保证 hvisor-tool 编译时采用的 linux header 版本与 root linux 的 linux header 版本一致,否则 hvisor-tool 的 driver 可能会无法加载。 可以通过使用 root linux 相同的交叉编译工具链进行编译。

编译完成后,需要将 hvisor-tool 的可执行文件 tools/hvisor 和内核模块 driver/hvisor.ko 复制到 root linux 的根文件系统中启动 zone1 linux 的目录,例如 /root,再同时将 zone1 的根文件系统、内核镜像、以及编译后的设备树放在同一目录。

还需要将 hvisor-tool 的配置文件放入文件系统中,文件名需要保持一致,配置文件位于platform/<架构>/<平台名>/configs/目录下。

以架构为aarch64、平台名为qemu-gicv3为例,则配置文件为platform/aarch64/qemu-gicv3/configs/zone1-linux-virtio.jsonplatform/aarch64/qemu-gicv3/configs/zone1-linux.json

下面命令以aarch64架构为例,若为其他架构请更改命令对应的部分。

# 回到创建的 root linux 根文件系统时的目录
LINUX_PATH="<路径>/linux"
HVISOR_PATH="<路径>/hvisor"
HVISOR_TOOL_PATH="<路径>/hvisor-tool"

# 挂载
sudo mount -t ext4 rootfs1.img rootfs/

# 复制 hvisor-tool 的 driver/hvisor.ko 和 tools/hvisor
sudo cp "${HVISOR_TOOL_PATH}/driver/hvisor.ko" rootfs/root/
sudo cp "${HVISOR_TOOL_PATH}/tools/hvisor" rootfs/root/

# 复制`platform/<架构>/<平台名>/configs/`目录下的 hvisor-tool 的配置文件到 root 路径下
sudo cp "${HVISOR_PATH}/platform/aarch64/qemu-gicv3/configs/zone1-linux-virtio.json" \
    rootfs/root/zone1-linux-virtio.json
sudo cp "${HVISOR_PATH}/platform/aarch64/qemu-gicv3/configs/zone1-linux.json" \
    rootfs/root/zone1-linux.json

# 复制 zone1 linux 的根文件系统、内核镜像、以及编译后的设备树
sudo cp rootfs2.img \
    rootfs/root/rootfs2.ext4
sudo cp "${LINUX_PATH}/arch/arm64/boot/Image" \
    rootfs/root/Image
sudo cp "${HVISOR_PATH}/platform/aarch64/qemu-gicv3/image/dts/zone1-linux.dtb" \
    rootfs/root/zone1-linux.dtb

# 卸载
sudo umount rootfs

之后在 QEMU 上即可通过 root linux 启动 zone1-linux。具体命令如下。

在 hvisor 目录下执行

make ARCH=<架构> LOG=<日志等级> BOARD=<平台名> run

例如

make ARCH=aarch64 LOG=info BOARD=qemu-gicv3 run

接下来启动 root linux

bootm 0x40400000 - 0x40000000

cd root
insmod hvisor.ko
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

rm nohup.out

# 启动 zone1-linux 的 virtio
nohup ./hvisor virtio start zone1-linux-virtio.json &
# 启动 zone1-linux
./hvisor zone start zone1-linux.json && \
cat nohup.out | grep "char device" && \
script /dev/null

如果显示 virtio 出现 WARNING 或者 ERROR,可以查看 nohup.out 查看详细信息,或者使用 dmesg 命令查看内核日志。