feat: 新增测试 runtime
This commit is contained in:
Generated
+7
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "hello"
|
||||
version = "0.1.0"
|
||||
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "hello"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
@@ -0,0 +1,9 @@
|
||||
fn main() {
|
||||
println!("Hello from OpenWrt (ARMhf)!");
|
||||
println!("System information (via /proc/version):");
|
||||
if let Ok(version) = std::fs::read_to_string("/proc/version") {
|
||||
println!("{}", version);
|
||||
} else {
|
||||
println!("Could not read /proc/version (running in simulation?)");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
squashfs-root
|
||||
root.squashfs
|
||||
@@ -0,0 +1,47 @@
|
||||
FROM --platform=linux/amd64 ubuntu:20.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# 换成阿里云源
|
||||
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
||||
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
|
||||
|
||||
# 安装必要的依赖
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||
apt-get update && apt-get install -y \
|
||||
curl \
|
||||
git \
|
||||
build-essential \
|
||||
qemu-user-static \
|
||||
pkg-config \
|
||||
libssl-dev \
|
||||
xz-utils \
|
||||
squashfs-tools
|
||||
|
||||
# 配置交叉编译工具链(Linaro GCC 7.5.0)
|
||||
ENV PATH="/opt/toolchain/bin:${PATH}"
|
||||
RUN mkdir -p /opt/toolchain && \
|
||||
curl -fSL -o toolchain.tar.xz https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz && \
|
||||
tar -xJf toolchain.tar.xz -C /opt/toolchain --strip-components=1 && \
|
||||
rm toolchain.tar.xz
|
||||
|
||||
# 安装 Rust
|
||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
||||
RUN rustup target add armv7-unknown-linux-gnueabihf
|
||||
|
||||
# 配置 Cargo
|
||||
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
|
||||
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUSTFLAGS="-C link-arg=-Wl,-dynamic-linker,/lib/ld-linux-armhf.so.3"
|
||||
|
||||
# 设置 CC
|
||||
ENV CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY run.sh /usr/local/bin/run
|
||||
COPY runtime.sh /usr/local/bin/runtime
|
||||
RUN chmod +x /usr/local/bin/run /usr/local/bin/runtime
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
@@ -0,0 +1,9 @@
|
||||
# Open-XiaoAI Runtime(OH2P v1.58.1)
|
||||
|
||||
```bash
|
||||
root@OH2P:~# uname -a
|
||||
Linux OH2P 4.9.61 #1 SMP PREEMPT Fri Jun 27 06:11:47 2025 aarch64 GNU/Linux
|
||||
|
||||
root@OH2P:~# file /lib/libc-2.25.so
|
||||
app/runtime/squashfs-root/lib/libc-2.25.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, stripped
|
||||
```
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 在 macOS 上,使用 host.docker.internal 访问宿主机的代理端口
|
||||
# 如果你的代理软件没有开启 "Allow LAN"(允许局域网连接),请确保它监听的是 0.0.0.0 而不仅仅是 127.0.0.1
|
||||
PROXY="http://host.docker.internal:7890"
|
||||
|
||||
# 1. 构建编译环境镜像
|
||||
# echo "Building Docker image with proxy..."
|
||||
# docker build \
|
||||
# --build-arg http_proxy=$PROXY \
|
||||
# --build-arg https_proxy=$PROXY \
|
||||
# -t open-xiaoai-runtime .
|
||||
|
||||
# # 2. 编译 hello world demo
|
||||
echo "Compiling hello demo..."
|
||||
rm -rf ../hello/target # 先清理旧的构建产物,防止缓存干扰
|
||||
docker run --rm -v $(pwd)/../hello:/app/hello open-xiaoai-runtime \
|
||||
cargo build --manifest-path hello/Cargo.toml --target armv7-unknown-linux-gnueabihf --release
|
||||
|
||||
# # 3. 运行编译出的二进制文件 (通过 QEMU 模拟)
|
||||
echo "Running compiled binary via QEMU..."
|
||||
docker run --rm -v $(pwd)/../hello/target/armv7-unknown-linux-gnueabihf/release/hello:/app/hello \
|
||||
-v $(pwd)/root.squashfs:/app/root.squashfs open-xiaoai-runtime \
|
||||
run /app/hello
|
||||
|
||||
# 4. 交互模式运行
|
||||
# docker run --rm -it --privileged \
|
||||
# -v $(pwd)/root.squashfs:/app/root.squashfs \
|
||||
# open-xiaoai-runtime \
|
||||
# run
|
||||
|
||||
# 5. 上传二进制文件到小爱音箱
|
||||
# dd if=target/armv7-unknown-linux-gnueabihf/release/hello \
|
||||
# | ssh -o HostKeyAlgorithms=+ssh-rsa root@192.168.31.235 "dd of=/data/hello"
|
||||
# ssh -o HostKeyAlgorithms=+ssh-rsa root@192.168.31.235 "dd if=/data/hello" | hello
|
||||
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# 定义 sysroot 目录
|
||||
SYSROOT_DIR="/opt/sysroot"
|
||||
|
||||
# 如果 /opt/sysroot 已经有内容(通过 -v 挂载了 squashfs-root),则跳过解压
|
||||
if [ -d "$SYSROOT_DIR/bin" ] || [ -d "$SYSROOT_DIR/lib" ]; then
|
||||
echo "Using existing sysroot at $SYSROOT_DIR"
|
||||
else
|
||||
mkdir -p "$SYSROOT_DIR"
|
||||
# 优先使用环境变量指定的 squashfs 文件,否则使用默认的 root.squashfs
|
||||
ROOTFS_FILE="${SYSROOT_FILE:-root.squashfs}"
|
||||
|
||||
if [ -f "$ROOTFS_FILE" ]; then
|
||||
echo -e "\n🔥 Unsquashing $ROOTFS_FILE to $SYSROOT_DIR...\n"
|
||||
unsquashfs -d "$SYSROOT_DIR" -f "$ROOTFS_FILE"
|
||||
echo -e "\n✅ Unsquashed rootfs\n"
|
||||
else
|
||||
echo "Error: Sysroot file $ROOTFS_FILE not found and $SYSROOT_DIR is empty."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 检查第一个参数。如果在 sysroot 下存在该文件,则自动补全路径
|
||||
# 比如 `run /bin/sh` 会被转换为 `run /opt/sysroot/bin/sh`
|
||||
if [ -n "$1" ] && [ -f "$SYSROOT_DIR$1" ]; then
|
||||
CMD="$SYSROOT_DIR$1"
|
||||
shift
|
||||
set -- "$CMD" "$@"
|
||||
fi
|
||||
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
# 如果没有提供参数,则默认在 sysroot 中启动 shell
|
||||
exec runtime
|
||||
else
|
||||
exec qemu-arm-static -L "$SYSROOT_DIR" "$@"
|
||||
fi
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
|
||||
SYSROOT="/opt/sysroot"
|
||||
QEMU_BIN="/usr/bin/qemu-arm-static"
|
||||
|
||||
|
||||
echo "正在准备 OpenWrt 模拟环境..."
|
||||
|
||||
# 1. 拷贝 QEMU 静态二进制文件
|
||||
cp "$QEMU_BIN" "$SYSROOT/usr/bin/"
|
||||
|
||||
# 2. 挂载必要文件系统
|
||||
mount_fs() {
|
||||
for dir in proc sys dev dev/pts tmp; do
|
||||
mkdir -p "$SYSROOT/$dir"
|
||||
if ! mountpoint -q "$SYSROOT/$dir"; then
|
||||
if [[ "$dir" == "proc" ]]; then
|
||||
mount -t proc proc "$SYSROOT/$dir"
|
||||
elif [[ "$dir" == "sys" ]]; then
|
||||
mount -t sysfs sysfs "$SYSROOT/$dir"
|
||||
else
|
||||
mount --bind "/$dir" "$SYSROOT/$dir"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
mount_fs
|
||||
|
||||
|
||||
# 3. 执行进入命令
|
||||
# 注意:OpenWrt 默认没有 bash,通常使用 /bin/sh (busybox)
|
||||
echo "------------------------------------------------"
|
||||
echo "成功进入 OpenWrt 环境。输入 'exit' 退出。"
|
||||
echo "------------------------------------------------"
|
||||
|
||||
chroot "$SYSROOT" /usr/bin/$(basename $QEMU_BIN) /bin/sh
|
||||
Reference in New Issue
Block a user