笔记 注意事项-ver20251021_hvisor硬盘部署系统用户与维护手册 _LoongArch.pdf
开发
下载仓库:
mkdir workspace && cd workspace
git clone https://github.com/enkerewpo/hvisor
git clone https://github.com/enkerewpo/buildroot-loongarch64
git clone https://github.com/enkerewpo/linux-hvisor-loongarch64 hvisor-la64-linux
git clone https://github.com/enkerewpo/hvisor-tool
git clone https://github.com/enkerewpo/hvboot
下载 loongarch64-unknown-linux-gnu- 工具链
下载并解压到本地,然后请将 cross-tools/bin 目录添加到你的 PATH 环境变量中,
保证 loongarch64-unknown-linux-gnu-gcc 等工具可以被 shell 直接调用。为了保险起见,还可以把 cross-tools/bin 中所有的内容软链接到 /usr/local/bin 中
说明
该项目提供了主要的脚本,在 hvboot 目录下有./make_world ,./make_loongarch64,./ssd_deploy_helper.sh,其中 ./make_world 做的事情最多,详情见 ver20251021_hvisor硬盘部署系统用户与维护手册 _LoongArch.pdf ,下面先执行 ./make_world 之前的准备工作
编译 hvisor :
在 hvisor 目录下执行
make BID=loongarch64/ls3a5000
编译完成后在 target 目录下可以找到 strip 之后的 hvisor.bin 文件
准备 buildroot 环境:
因为 buildroot 在找不到需要编译的 package 时会从各个地方下载源码压缩包,这里我准备好了一个预下载的镜像:
https://pan.baidu.com/s/1sVPRt0JiExUxFm2QiCL_nA?pwd=la64
下载后将 dl 目录放在 buildroot-loongarch64 根目录即可
然后就是配置一下 buildroot-loongarch64 的 config 信息
cd buildroot-loongarch64
make loongson3a5000_hvisor_defconfig #会在当前目录下生成一个默认的 .config 文件,文件内容和 loongson3a5000_hvisor_defconfig 是一样的
make menuconfig # 请将 Toolchain/Toolchain path prefix 设置为你本地的 loongarch64 工具链路径和前缀
# 然后选择右下角 save 保存到 .config 文件
其中我的 Toolchain path 是 /home/fanbao/toolchains/cross-tools/bin/,前缀是loongarch64-unknown-linux-gnu,有一个坑是它的脚本中会把我的地址/home/fanbao/toolchains/cross-tools/bin/ 加上 /bin/ ,所以最终我输入 menuconfig 中的 Toolchain path 应该是 /home/fanbao/toolchains/cross-tools

编译 buildroot
还是在 buildroot-loongarch64 目录下,上一步已经配置好了 .config 的信息,现在执行
sudo make
编译完成后,在 output/images 中可以找到 rootfs.cpio.gz 文件,这是一个基本的
rootfs。下一步请手动将这个路径(设为 ROOTFS_CPIO_GZ_PATH)软连接到
hvisor-la64-linux/rootfs/buildroot/rootfs.cpio.gz
说明:在后续 ./make_world 命令中,buildroot的编译会比较考后,这里提前手动执行的原因可能是为了建立这个软链接
调整 linux 源码目录配置
下面我们来调整一下 linux 的一些配置
修改 config
cd hvisor-la64-linux
echo "6.11.6" > chosen_root # 选择 linux-6.11.6 目录作为 root linux 的编译源码
echo "6.13.7" > chosen_nonroot # 选择 linux-6.13.7 目录作为 nonroot linux 的编译源码,
# 你也可以选择其他版本例如 6.11.6 git,请保证对应的 linux-{suffix} 目录存在
./build def root/nonroot # 生成默认 root linux 的 defconfig
./build menu root/nonroot # 进入 menuconfig 配置 root linux 的配置
./build save root/nonroot
这里我们属于 SSD 部署系统,注意:对于 SSD 部署系统,请不要开启 initramfs 的 rootfs 内嵌选项,否则将会导致系统使用内嵌的 initramfs 而不是硬盘上的 rootfs,所以我们需要把 menuconfig 中的 initramfs 的 rootfs 内嵌选项 关闭,目前仓库的默认 defconfig 均开启了 initramfs 的 rootfs 内嵌选项,需要检查一下 configs 目录中的 root 和 nonroot defconfig 并按你的需求进行修改(通过 ./build def root/nonroot 命令生成后再运行./build menu root/nonroot 进行修改,请注意如果你之后要使用 make world,这里必须保存一次 defconfig ,./build save root/nonroot 将.config 文件保存到 configs 目录下,供后续 make world 使用,因为 make world 会直接从 configs 目录下读取 defconfig,如果不运行 save 的话将会导致你的临时.config 被覆盖),关闭选项如下:
在 General setup 下的 Initial RAM filesystem and RAm disk,这里按 n 键来取消这个选项

修改 dts
在原手册中 make world 的部分有一句话:“如果你希望修改 zone 启动时的 cmdline,请修改对应的设备树中的 bootargs 字段”,没有修改之前,我跑出来的系统会显示 root 和 none root 均未挂载到正确的 rootfs 上,所以我们去修改一下,如下:
linux-6.11.6/arch/loongarch/boot/dts/loongson-3a5000-hvisor-root.dts:
//linux-6.11.6/arch/loongarch/boot/dts/loongson-3a5000-hvisor-root.dts
......
chosen {
stdout-path = "serial:115200n8";
// initramfs
//bootargs = "earlycon console=ttyS0,115200n8 initramfs_async=false rootwait debug nohlt";
// SSD root, on SSD partition 4 with ext4 format
bootargs = "earlycon console=ttyS0,115200n8 root=/dev/nvme0n1p4 rootwait rw nohlt";
};
可以看到对于 SSD root,我们就是应该选择下面这个 bootargs
linux-6.13.7/arch/loongarch/boot/dts/loongson-3a5000-hvisor-nonroot.dts:
//linux-6.13.7/arch/loongarch/boot/dts/loongson-3a5000-hvisor-nonroot.dts
chosen {
// stdout-path = "serial:115200n8";
//bootargs = "earlycon console=ttyS0,115200n8 initramfs_async=false rootwait debug loglevel=8 earlyprintk";
// stdout-path = "/virtio_mmio@30001000";
bootargs = "earlycon console=hvc0 rootwait debug";
};
这里我不太确定,本来是上面那个 bootargs ,因为没有跑通,所以我给换成下面这个了,而且在这个目录下有 linu1/2/3.dts,所以我也不确定 loongson-3a5000-hvisor-nonroot.dts 这个文件有没有其作用
linux1/2/3.dts:
//linux-6.13.7/arch/loongarch/boot/dts/linux1/2/3.dts
chosen {
// initramfs
//bootargs = "earlycon console=ttyS0,115200n8 initramfs_async=false rootwait debug loglevel=8 earlyprintk nohlt";
// SSD root, a {zone_name}-disk.ext4 virtio blk file on SSD root_hvisor partition
bootargs = "earlycon console=ttyS0,115200n8 rootwait root=/dev/vda rw";
};
可以看到对应 SSD 的应该用下面这个 bootargs
hvboot 的配置信息
这里主要配置两个,一个是 menuconfig 的 Cross compiler prefix,一个是仓库源路径信息:
• hvisor 源码路径 HVISOR_SRC_DIR
• hvisor-tool 源码路径 HVISOR_TOOL_DIR
• buildroot 源码路径 BUILDROOT_DIR
• hvisor la64 linux 仓库源码路径 HVISOR_LA64_LINUX_DIR

然后就是配一下 zones.json ,zones.json 是 load_addr ,我不太清楚和 编译 linux 时的 entry addr 有什么关系,反正我是用了 zone_bak.json 的配置
执行 ./make_world
这里,通过 hvboot 执行 make world 流程在原手册中,很详细,有问题再去看就行
编译 UEFI 镜像
./make_loongarch64 # 读取 .config 中配置的相关路径和信息,生成 BOOTLOONGARCH64.EFI
此时会在 hvboot 目录下生成 BOOTLOONGARCH64.EFI
注意:之前我执行 ./make_world ,这个脚本会自动执行 ./build zone {type} {name} {entry},我没有干预这个 entry 具体是多少,但是我第一次执行完 ./make_world ,然后执行 ./make_loongarch64 的时候,它会帮我检查 entry 地址和 linux1/2/3.json 中是否对应写好,很遗憾值只有 root 的值是对应上的,而 linux1/2/3 的 vmlinux 中读取出来的 entry addr(通过readeld -h nonroot的vmlinux) 和 linux1/2/3.json 中填写的 entry addr 没有对应上,所以会报错,所以这里我们需要找到所有 linux1/2/3.json文件,去修改里面的 entry
fanbao@sea:~/workspace-hvisor$ sudo find . -name linux*.json
[sudo] fanbao 的密码:
./hvisor/platform/aarch64/rk3568/configs/linux2.json
./buildroot-loongarch64/board/loongson/ls3a5000/rootfs_ramdisk_overlay/tool/linux1.json
./buildroot-loongarch64/board/loongson/ls3a5000/rootfs_ramdisk_overlay/tool/linux3.json
./buildroot-loongarch64/board/loongson/ls3a5000/rootfs_ramdisk_overlay/tool/linux2.json
./buildroot-loongarch64/output/target/tool/linux1.json
./buildroot-loongarch64/output/target/tool/linux3.json
./buildroot-loongarch64/output/target/tool/linux2.json
./hvisor-tool/examples/nxp-aarch64/gpu_on_root/linux2.json
./hvisor-tool/examples/qemu-riscv64/linux2-aia.json
./hvisor-tool/examples/qemu-riscv64/linux2.json
为了放心,我把2-7条都修改了,后来验证,只需要修改 buildroot-loongarch64/board/loongson/ls3a5000/rootfs_ramdisk_overlay/tool/ 目录下的linux1/2/3.dts即可
编译 hvisor SSD 部署包
在 hvboot 目录下执行:
./ssd_deploy_helper.sh
ssd_deploy_helper.sh 脚本会自动给三个 nonroot 虚拟机生成对应的 virtio-blk 文件系统镜像,并将其打包到部署包 deploy 中
会把标准 hvisor SSD 部署包导出到目录的 deploy 文件夹中,部署包内包含 UEFI 镜
像、root 与 nonroot 的内核模块、辅助脚本等
维护
如何更新 hvisor 系统:这里不用原手册里的脚本 ssd_deploy.sh,而是用示例流程里面的步骤
使用
串口连接
1.串口配置
1.1.2配置ROOTLINUXCOM1串口输出部分,hvisor本身的日志和root linux的交互shell通过主板IO板上的COM1(DB9)接口进行输入和输入,请参 考图2进行连接(波特率115200、无奇偶校验、电平模式RS232)
插上线到我的机器上之后,用 Xshell 进行连接,并不是选择COM1,而是选择COM3,如图


1.1.3 附:配置 UART0 Debug 输出(可选)部分,插上类似U盘的那个东西到我的机器上,然后像上图一样连接,只不过COM3换成COM4即可
2.网络配置部分
原文在 1.3 网口分配信息
主要需要知道的是这些指令:
# 1. 启用网卡
sudo ip link set eth0 up
# 2. 配置静态 IP(示例:192.168.100.1/24)
sudo ip addr add 192.168.100.1/24 dev eth0
# 3. ping 目标 IP(示例:192.168.100.254)
ping -c 10 192.168.100.254
下面我用几个例子展示
例子1:root 下 ping linx 1/2/3
假如我想用 root ping linux3,只需要把网线一头插在root上即0号网口,一头插在linux3上即3号网口,现在网线插上去是不亮的,因为还没有启用网卡
然后配置 root 下的 ip,用到上面的第1条和第2条代码,在root下执行,比如配置 ip 为 192.168.100.1/24
然后进入到 root 下的 / 目录下的由./start.sh X启动的 nonroot 虚拟机,启用网卡和配置静态 ip,加入配置 ip 为 192.168.100.3/24
然后 root 和 虚拟机可以互相 ping 通了,比如
//root ping 虚拟机
[root@dedsec /]# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 6c:b3:11:9a:e8:74 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6eb3:11ff:fe9a:e874/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
[root@dedsec /]# ping -c 1 192.168.100.3
PING 192.168.100.3 (192.168.100.3): 56 data bytes
64 bytes from 192.168.100.3: seq=0 ttl=64 time=1.337 ms
--- 192.168.100.3 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.337/1.337/1.337 ms
//虚拟机 ping root
[root@nonroot-dedsec ~]# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 6c:b3:11:9a:e8:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.3/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6eb3:11ff:fe9a:e877/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
[root@nonroot-dedsec ~]# ping -c 1 192.168.100.1
PING 192.168.100.1 (192.168.100.1): 56 data bytes
--- 192.168.100.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
[root@nonroot-dedsec ~]# ping -c 1 192.168.100.2
PING 192.168.100.2 (192.168.100.2): 56 data bytes
64 bytes from 192.168.100.2: seq=0 ttl=64 time=1.339 ms
--- 192.168.100.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.339/1.339/1.339 ms
例子2:noneroot 下(比如 linux 1/2/3) ping 另一个 noneroot 的 linx
分别进入到虚拟机中,然后插网线,启用网卡,配置ip,然后就可以 ping 通了,比如 linux1 的 ip 是 192.168.100.1/24,linux3 的 ip 是 192.168.100.3/24,结果如下:
[root@nonroot-dedsec ~]# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 6c:b3:11:9a:e8:75 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6eb3:11ff:fe9a:e875/64 scope link
valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
[root@nonroot-dedsec ~]# ping 192.168.100.3
PING 192.168.100.3 (192.168.100.3): 56 data bytes
64 bytes from 192.168.100.3: seq=0 ttl=64 time=136.746 ms
64 bytes from 192.168.100.3: seq=1 ttl=64 time=86.516 ms
64 bytes from 192.168.100.3: seq=2 ttl=64 time=110.807 ms
--- 192.168.100.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 86.516/111.356/136.746 ms

浙公网安备 33010602011771号