RK3568跑Arch Linux全路程指南(以正点原子的RK3568开发板为例子)

RK3568跑Arch Linux全路程指南(以正点原子的RK3568开发板为例子)

前言

终于想起来自己的老本行嵌入式了,最近的话,有些断更主要是在疯狂的梭哈SDK的配置。下面我们就来简单的说一说,如何在RK3568上跑Arch Linux

PS: 有人问过我说会不会不稳定,其实,Ubuntu主要看桌面,X11的话依托底下的硬件驱动,硬件驱动稳定那就不怕,只要是厂商产出的。自己搞的开源硬件驱动另谈;Wayland我没成功过,总是0帧起手爆炸,查半天也不知道为什么就SegFault了。

下面,就让我们在Ubuntu24.04上,配置一下如何在RK3568上跑Arch Linux。

厂商SDK的编译(这个看各自咋操作)

以正点原子为例子,SDK是魔改的RK-SDK的。所以如果你的板子的厂商也是魔改,那太好办了。我们的基本的原理就是------替换打包的Rootfs下的ext2,直接调用内部的updateimg生成update.img文件就好。这里,笔者发现正点原子的Doc里没有对编译Linux5.10的说明,笔者这里单独补充一下。

使用Linux 4.19版本的朋友需要注意

高版本的Ubuntu24.04早就不支持直接下Python2了,啥年代还在用Python2呢?可惜,这个版本的SDK强依赖Python2,笔者之前用默认的Python3编译过去炸了,一看日志一个print xxx,直接无语了,真没招。

遇到这种问题,咱们就需要发挥Ubuntu的独有优势------有update alternative。我们可以自己手动编译Python。(我要说三遍!老SDK这样做可能有风险!老SDK这样做可能有风险!老SDK这样做可能有风险!)方法看下面就好:

复制代码
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xf Python-2.7.18.tgz
cd Python-2.7.18

./configure
make -j$(nproc)
sudo make install

稍微提醒一下,不要想着搞2.7以下的Python,我可以负责任的说,今天的Linux现代发行版很难,很难编译这种上古时期的Python了,别踩坑,我踩过了。

这个时候,我们还需要额外注意请出来update-alternative了。

当你按照源码编译了 Python 2.7 之后,它通常会被安装在 /usr/local/bin/python2.7 目录下。这时,你可以先简单确认一下安装是否成功,执行:

bash 复制代码
ls /usr/local/bin/python2*

你应该能看到两个文件:python2.7python2.7-config。前者是 Python 2 的可执行文件,后者提供编译扩展模块时所需的配置参数。至此,你就拥有了一个独立的 Python2 环境,但是仅仅这样还不够,因为系统默认的 python 命令依然指向 Python3,很多老旧的构建脚本如果直接调用 python 就会失败。

为了在同一台机器上优雅地管理多版本 Python,我们可以使用 Ubuntu 的 update-alternatives 系统。这套机制允许你为同一个命令维护多个候选版本,并且可以随时切换默认使用的版本,避免直接覆盖系统默认的 Python3,从而保证系统和工具链的安全性。

首先,我们为 Python3 注册 alternatives 条目。虽然大多数系统已经自带 Python3,并且 /usr/bin/python3 已经存在,但我们仍然可以手动注册并赋予一个较高的优先级:

bash 复制代码
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 30

接着,我们把刚刚编译的 Python2.7 注册进 alternatives,并赋予一个较低的优先级:

bash 复制代码
sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python2.7 20

这里的优先级数字非常关键:数字越大,系统默认优先使用的版本就越高。通过这种方式,我们让 Python3 成为默认版本,而 Python2 成为备选版本,这样在不破坏系统环境的前提下,就可以随时为老旧的构建脚本切换到 Python2。

切换命令也非常简单,只需要执行:

bash 复制代码
sudo update-alternatives --config python

你会看到一个交互式的选择菜单,列出所有注册的 Python 版本以及对应的优先级,例如:

复制代码
There are 2 choices for the alternative python

  Selection    Path                      Priority
-------------------------------------------------
* 0            /usr/bin/python3           30
  1            /usr/bin/python3           30
  2            /usr/local/bin/python2.7   20

输入数字 2,回车后,系统就会把默认 python 命令切换到你刚编译的 Python2.7。为了确认切换成功,可以执行:

bash 复制代码
python --version

如果一切顺利,你会看到:

复制代码
Python 2.7.18

这样,你就完成了一个干净、安全的 Python 多版本管理:系统默认依然是 Python3,而在需要构建老旧 U-Boot 或其他依赖 Python2 的项目时,你可以随时切换到 Python2,避免对系统环境造成破坏。这种方式比直接用 ln -sf 改写 /usr/bin/python 安全得多,也更容易维护和回退。

但是吧,这样搞,可能是有风险的!我之前强调了三遍了,这样搞说明,你已经觉得你可以承担得起后果了。

在编 RK SDK recovery 的时候,你可能会看到这样的报错:

复制代码
/usr/bin/ld: /usr/local/lib/libpython2.7.a(floatobject.o): relocation R_X86_64_PC32
recompile with -fPIC
collect2: error: ld returned 1 exit status

然后后续一大串模块 _ssl _socket _zlib _sqlite3 ... 都挂掉,整个编译直接崩了。

我们手动装过 Python2:

bash 复制代码
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
./configure
make
sudo make install

哦吼,默认安装到了 /usr/local/lib,这个版本的RK SDK 的老 Buildroot 没有严格隔离 host search path → 优先找到 /usr/local/lib ,好了,炸了。


🛠 解决方案

方案 A(推荐):临时移走冲突库
bash 复制代码
sudo mv /usr/local/lib/libpython2.7.a /usr/local/lib/libpython2.7.a.bak
sudo mv /usr/local/lib/libpython2.7.so /usr/local/lib/libpython2.7.so.bak 2>/dev/null
sudo mv /usr/local/lib/libpython2.7.so.1.0 /usr/local/lib/libpython2.7.so.1.0.bak 2>/dev/null

sudo ldconfig

然后彻底清理 recovery buildroot 的 host-python 并重新编:

bash 复制代码
cd buildroot
make O=output/rockchip_rk356x_recovery host-python-dirclean
make O=output/rockchip_rk356x_recovery host-python

这样就能保证 host-python 只用 buildroot 自己编出来的干净版本,不会再串库。


方案 B(不动 /usr/local):调整链接路径
bash 复制代码
export LDFLAGS="-L/usr/lib/x86_64-linux-gnu"

但老 Buildroot 对这个不一定完全支持,稳定性没方案 A 高。

使用Linux 5.10版本的朋友需要注意

好消息,我这边没遇到什么问题,高版本的编译就会非常的丝滑。SDK的验证还是很稳固的。就是平均等待的时间确实会比较久------我分配了8个核心,10G内存,编译了4-5个小时才搞定。主要是在buildroot编译包才出现的。当然,我建议走一轮流程,后面替换的时候会嘎嘎方便。

制作Arch Linux的Rootfs

Arch Linux的Rootfs比较难搞了,这里的话,我们第一步就是需要下载Arch Linux的标准RootFS,注意的是,这一次咱们没办法那么幸运,有自动化的工具了。

复制代码
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
mkdir rk3568-archlinux-rootfs
cd rk3568-archlinux-rootfs

# 解压bootstrap
sudo tar -xpf ../ArchLinuxARM-aarch64-latest.tar.gz

我们挂载好了必须要的目录之后。就可以进入进行配置了。

需要的驱动文件

一些模块的驱动文件需要被拷贝进来,这一点,笔者建议你lsmod一下运行旧的ubuntu的开发板上挂载了什么模块,自己去复制;或者如果更熟悉SDK流程的朋友可以试着用下module install,笔者没搞清楚SDK包是如何指定下载参数的,也没有看到他是如何进行打包的。所以这里不赘述。(笔者lsmod后发现我就需要拷贝一下蓝牙和WiFi驱动就完事,这一步我直接cv了内核的东西就走了,这个没啥好说的)

教各位一个偷懒技巧:去看看自己的buildroot下面的modules有啥,直接cv就好了。(output/target/lib/modules/<kernel_version>/),不过,Arch Linux的复制

安装必备的东西

咱们下面要做的事情就是进入这个根文件系统。实际上,Arch Linux的Rootfs挂载比较的,额,刁钻。对于一些特殊化裁剪的内容,需要的是先把东西放到这个根文件系统,在做成镜像文件挂载,然后再arch-chroot进去的。

好的,我明白你的需求了 👍

你这是在写一篇教程文档 ,需要我把说明文字无缝接在你给的开头之后,先用"读脚本 → 讲流程 → 解释每一步目的"的方式展开,然后最后自然过渡到:

笔者这里提供了一个自动化脚本......

下面这段内容我已经帮你整理成可以直接粘进 Word / Markdown 的教程正文,风格保持技术博客口吻,并且和你前文语气一致。


安装必备的东西

咱们下面要做的事情就是进入这个根文件系统。实际上,Arch Linux 的 Rootfs 挂载比较的,额,刁钻。对于一些特殊化裁剪的内容,需要的是先把东西放到这个根文件系统,在做成镜像文件挂载,然后再 arch-chroot 进去的。也就是说,我们不会直接在一个普通目录里 chroot,而是要走一套更"像真实系统"的流程:

目录 rootfs → 制作镜像文件 → loop 挂载 → 准备运行环境 → arch-chroot 进入

这样做有几个好处:

  • ✅ 最终产物就是一个可直接刷写 / 挂载的 rootfs.img
  • ✅ 权限、设备节点、ACL、xattr 都可以被完整保留
  • ✅ 和真实板子上的 rootfs 结构一致
  • ✅ 便于后续直接 dd / 烧录 / 打包

第一步:环境与依赖检查

脚本会先检查几个关键工具是否存在:

  • qemu-aarch64-static ------ 让 x86 主机可以执行 ARM64 程序
  • rsync ------ 用于完整复制 rootfs(保留权限/ACL/xattr)
  • arch-chroot ------ Arch 官方 chroot 工具

为什么必须要 qemu?

因为你现在的开发机是 x86_64 ,而 rootfs 是 aarch64 ,咱们需要qemu-aarch64-static翻译一下Arm64的机器码,如果没有这个就会直接报:

复制代码
Exec format error

第二步:清理旧环境

注意,这里建议需要做这样的一些事情:在我们使用镜像文件 + loop 挂载 + chroot 的流程中,有一个非常容易被忽略、但实际上非常关键的步骤:退出 chroot 后必须把所有挂载点干净地卸载掉。否则很容易出现这些问题:

  • ❌ 镜像文件被占用,无法重新格式化
  • ❌ loop 设备无法释放
  • ❌ 下次 mount 报 busy
  • ❌ rsync / mkfs 提示 target in use
  • ❌ Buildroot / 制作镜像阶段莫名失败

特别是当我们绑定挂载了这些目录时:

复制代码
/proc
/sys
/dev
/dev/pts
/run

它们都属于嵌套挂载,必须按顺序卸载,否则主挂载点会一直 busy。这里我们就要说明以下,再我们开始挂载之前,是需要做一些操作的。

  • 卸载所有 bind mount 子挂载点
  • 卸载 rootfs 主 loop 挂载点
  • 检查是否还有残留挂载

在我们通过 loop 挂载镜像文件并使用 arch-chroot 进入系统进行配置之后,还有一个非常关键但经常被忽略的步骤:正确卸载所有挂载点

一个完整、规范的清理流程应该包括:

  • 先检查并卸载所有 bind 挂载目录
  • 再卸载 rootfs 的主挂载点
  • 必要时使用懒卸载或强制卸载作为兜底
  • 最后检查是否还有残留挂载记录

手动逐条执行这些命令既繁琐又容易遗漏。为了避免因为清理不彻底导致镜像被占用,笔者这里同样提供了一个自动化清理脚本,用于一键完成所有卸载与检查工作,这个脚本就是我们的unmount.sh可以看看

shell 复制代码
#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

MOUNT_POINT="/mnt/rootfs_loop"

echo -e "${YELLOW}=== 开始卸载挂载点 ===${NC}"

# 检查并卸载bind mounts
for mount in run sys proc dev/pts dev; do
    TARGET="${MOUNT_POINT}/${mount}"
    if mountpoint -q "$TARGET" 2>/dev/null; then
        echo -e "${YELLOW}正在卸载: ${TARGET}${NC}"
        sudo umount -l "$TARGET" 2>/dev/null || sudo umount -f "$TARGET" 2>/dev/null
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}✓ 卸载成功: ${TARGET}${NC}"
        else
            echo -e "${RED}✗ 卸载失败: ${TARGET}${NC}"
        fi
    fi
done

# 卸载主挂载点
if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
    echo -e "${YELLOW}正在卸载主挂载点: ${MOUNT_POINT}${NC}"
    sudo umount -l "$MOUNT_POINT" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ 主挂载点卸载成功${NC}"
    else
        echo -e "${RED}✗ 主挂载点卸载失败,尝试强制卸载...${NC}"
        sudo umount -f "$MOUNT_POINT" 2>/dev/null
    fi
fi

# 检查是否还有残留挂载
if mount | grep -q "$MOUNT_POINT"; then
    echo -e "${RED}警告: 仍有挂载点未完全卸载${NC}"
    mount | grep "$MOUNT_POINT"
else
    echo -e "${GREEN}✓ 所有挂载点已清理${NC}"
fi

第三步:把 QEMU 静态解释器拷进 rootfs

脚本会执行:

bash 复制代码
cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/

这个步骤非常关键。

因为chroot 进去之后,系统只能看到 rootfs 里的文件。如果里面没有 qemu,就没法执行 ARM 程序


第四步:创建镜像文件(loop image)

bash 复制代码
fallocate -l 6G rootfs.img

创建一个固定大小的镜像文件。

这一步相当于:在文件里"虚拟出一个硬盘"。后续会把它格式化、挂载、写入 rootfs。


第五步:格式化文件系统

bash 复制代码
mkfs.ext2 rootfs.img

为什么选 ext2?

  • 没日志 → 简单
  • 小系统常用
  • boot/rootfs 都很友好
  • 对嵌入式镜像兼容性好

当然你也可以改成:

复制代码
ext4 / f2fs / squashfs(只读)

第六步:loop 挂载镜像

bash 复制代码
mount -o loop rootfs.img /mnt/rootfs_loop

这一步之后,rootfs.img变成一个真实可写目录。就像插上了一块"虚拟硬盘"。


第七步:用 rsync 复制 rootfs

bash 复制代码
    sudo rsync -aAX --info=progress2 \
        --exclude=proc/* \
        --exclude=sys/* \
        --exclude=dev/* \
        --exclude=run/* \
        "$ROOTFS/" "$MOUNT_POINT/" # 从rootfs拷贝到挂载点

参数含义:

  • -a → 保留权限/时间/链接
  • -A → 保留 ACL
  • -X → 保留 xattr

并且排除了:

复制代码
/proc
/sys
/dev
/run

因为这些都是运行时虚拟文件系统,不能复制进去。


第八步:创建系统运行目录

脚本会补齐:

复制代码
/proc
/sys
/dev
/dev/pts
/run

这些目录是 chroot 运行的基础环境结构。


第九步:arch-chroot 进入 ARM rootfs

最后执行:

bash 复制代码
arch-chroot /mnt/rootfs_loop /bin/bash

这时你就已经:

✅ 进入 ARM64 Arch Linux

✅ 在 x86 主机上

✅ 通过 qemu 执行

✅ 文件系统是最终镜像

自动化脚本说明

为了避免大家手工一步一步操作容易出错,笔者这里提供了一个自动化脚本来完成上述全部流程(可能有朋友说:我去不早说,但是我决定还是先把流程说清楚了,再给脚本比较好,省的有人问我说脚本跑不通又看不懂的

脚本如下:

bash 复制代码
#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 配置变量
ROOTFS="./rk3568-archlinux-rootfs"
IMG_FILE="rootfs.img"
MOUNT_POINT="/mnt/rootfs_loop"
IMG_SIZE=6  # MB

# 错误处理函数
error_exit() {
    echo -e "${RED}✗ 错误: $1${NC}" >&2
    ./unmount.sh
    exit 1
}

# 成功提示函数
success_msg() {
    echo -e "${GREEN}✓ $1${NC}"
}

# 信息提示函数
info_msg() {
    echo -e "${CYAN}ℹ $1${NC}"
}

# 警告提示函数
warn_msg() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

# 标题函数
print_title() {
    echo -e "\n${BLUE}================================================${NC}"
    echo -e "${BLUE}  $1${NC}"
    echo -e "${BLUE}================================================${NC}\n"
}

# 检查root权限
check_root() {
    if [ "$EUID" -eq 0 ]; then 
        warn_msg "请不要直接用root运行此脚本,脚本会在需要时使用sudo"
        exit 1
    fi
}

# 检查依赖
check_dependencies() {
    print_title "检查依赖"
    
    local deps=("qemu-aarch64-static" "rsync" "arch-chroot")
    local missing=()
    
    for dep in "${deps[@]}"; do
        if ! command -v $dep &> /dev/null && [ ! -f "/usr/bin/$dep" ]; then
            missing+=($dep)
        else
            success_msg "找到依赖: $dep"
        fi
    done
    
    if [ ${#missing[@]} -ne 0 ]; then
        error_exit "缺少依赖: ${missing[*]}\n请运行: sudo apt install qemu-user-static rsync arch-install-scripts"
    fi
}

# 主流程
main() {
    check_root
    check_dependencies
    
    # 步骤1: 清理环境
    print_title "步骤 1/6: 清理环境"
    info_msg "清理旧的镜像文件和挂载点..."
    
    if [ -f "$IMG_FILE" ]; then
        warn_msg "删除旧的镜像文件: $IMG_FILE"
        rm -f "$IMG_FILE"
    fi
    
    info_msg "执行卸载脚本..."
    ./unmount.sh || warn_msg "卸载脚本执行完成(可能有警告)"
    
    # 步骤2: 复制QEMU
    print_title "步骤 2/6: 复制QEMU静态二进制"
    
    if [ ! -d "$ROOTFS" ]; then
        error_exit "rootfs目录不存在: $ROOTFS"
    fi
    
    info_msg "复制 qemu-aarch64-static..."
    sudo cp /usr/bin/qemu-aarch64-static "$ROOTFS/usr/bin/" || error_exit "复制QEMU失败"
    success_msg "QEMU静态二进制复制完成"
    
    # 步骤3: 创建镜像
    print_title "步骤 3/6: 创建镜像文件"
    info_msg "创建 ${IMG_SIZE}G 的镜像文件..."
    
    fallocate -l ${IMG_SIZE}G $IMG_FILE || error_exit "创建镜像失败"
    success_msg "镜像文件创建完成"
    
    # 步骤4: 格式化
    print_title "步骤 4/6: 格式化文件系统"
    info_msg "格式化为 ext2 文件系统..."
    
    mkfs.ext2 -F "$IMG_FILE" || error_exit "格式化失败"
    success_msg "文件系统格式化完成"
    
    # 步骤5: 挂载和复制
    print_title "步骤 5/6: 挂载镜像并复制rootfs"
    
    info_msg "创建挂载点: $MOUNT_POINT"
    sudo mkdir -p "$MOUNT_POINT" || error_exit "创建挂载点失败"
    
    info_msg "挂载镜像文件..."
    sudo mount -o loop "$IMG_FILE" "$MOUNT_POINT" || error_exit "挂载镜像失败"
    success_msg "镜像挂载成功"
    
    info_msg "复制rootfs内容(这可能需要几分钟)..."
    sudo rsync -aAX --info=progress2 \
        --exclude=proc/* \
        --exclude=sys/* \
        --exclude=dev/* \
        --exclude=run/* \
        "$ROOTFS/" "$MOUNT_POINT/" || error_exit "复制rootfs失败"
    success_msg "Rootfs复制完成"
    
    # 创建必要目录
    info_msg "创建系统目录..."
    sudo mkdir -p "$MOUNT_POINT"/{proc,sys,dev,dev/pts,run}
    success_msg "系统目录创建完成"
    
    # 完成
    print_title "准备进入Chroot环境"
    success_msg "所有准备工作完成!"
    echo ""
    info_msg "即将进入 ARM64 Arch Linux chroot 环境"
    info_msg "在chroot内执行以下命令进行配置:"
    echo -e "${YELLOW}"
    echo "  export PS1='[ARM-RK3568]# '"
    echo "  echo 'DisableSandbox' >> /etc/pacman.conf"
    echo "  pacman-key --init"
    echo "  pacman-key --populate archlinuxarm"
    echo "  pacman -Syu --noconfirm"
    echo -e "${NC}"
    info_msg "配置完成后输入 'exit' 退出chroot"
    echo ""
    
    # 进入chroot
    sudo arch-chroot "$MOUNT_POINT" /bin/bash
    
    # 退出后提示
    print_title "后续操作"
    info_msg "已退出chroot环境"
    echo ""
    echo -e "${YELLOW}选项 1: 继续配置${NC}"
    echo "  重新运行此脚本,它会自动挂载现有镜像"
    echo ""
    echo -e "${YELLOW}选项 2: 完成并卸载${NC}"
    echo "  运行: ./unmount.sh"
    echo "  你的镜像文件: $IMG_FILE"
    echo ""
}

# 运行主流程
main

进入系统之后,做什么?

当然是安装必备的程序咯,来看这里:

bash 复制代码
echo "Init the Key"
pacman-key --init
pacman-key --populate archlinuxarm

echo "System Updates"
# 4. 更新系统(这一步会下载很多东西,耐心等待)
pacman -Syu --noconfirm
echo "Enable the serial-getty@ttyFIQ0.service"
systemctl enable serial-getty@ttyFIQ0.service

echo "Install Requested NetTools..."
pacman -S sudo wpa_supplicant iw dhclient --noconfirm

echo "Install Requested DiskTools..."
pacman -S parted util-linux e2fsprogs --noconfirm

# 安装 Xorg 和显示管理器
# pacman -S --noconfirm xorg-server xorg-xinit

# 安装 KDE Plasma 完整版
# pacman -S --noconfirm plasma-meta kde-applications-meta
# 或安装最小化 KDE(推荐,省空间),真不用都安装
# pacman -S --noconfirm plasma-desktop konsole dolphin kate

# 安装显示管理器
# pacman -S --noconfirm sddm

# 启用 SDDM
# systemctl enable sddm

# 安装必要工具
# pacman -S --noconfirm mesa xf86-video-fbdev

echo "======= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ======="
echo "Please Register the Root Password and Make your own User..."
echo "======= !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ======="

这个是我自己的安装脚本,下面的桌面的部分看需要,是运行的时候安装还是如何。以及老生常谈的,记得创建可以登录的用户和Root的密码,要不然白搞了

卸载流程

可以再跑我们再这个流程前面的unmount.sh

烧录流程

可以检索笔者的文章,我还有烧录Ubuntu24.04的。都一样,本质上都是替换rootfs.ext2,然后调用SDK的打包updateimg脚本

bash 复制代码
#!/bin/bash

# 定义变量
SDK_PATH="$HOME/linux510_sdk"
SDK_IMAGES_DIR="$SDK_PATH/buildroot/output/rockchip_atk_dlrk3568/images"
BACKUP_DIR="$SDK_IMAGES_DIR/backups"
TARGET_NAME="rootfs.ext2"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 显示使用帮助
show_usage() {
    echo "========================================="
    echo "  RootFS 镜像部署脚本"
    echo "========================================="
    echo ""
    echo "用法: $0 <镜像文件>"
    echo ""
    echo "参数:"
    echo "  <镜像文件>    要部署的rootfs镜像文件(相对于当前目录)"
    echo ""
    echo "示例:"
    echo "  $0 ubuntu24-rootfs.ext2"
    echo "  $0 ./images/custom-rootfs.ext2"
    echo "  $0 ../build/rootfs.img"
    echo ""
    exit 1
}

# 检查参数
if [ $# -eq 0 ]; then
    echo -e "${RED}错误: 未指定镜像文件!${NC}"
    echo ""
    show_usage
fi

SOURCE_IMG="$1"

echo "========================================="
echo "  RootFS 镜像部署脚本"
echo "========================================="
echo -e "${BLUE}源镜像: $SOURCE_IMG${NC}"
echo ""

# 检查源文件是否存在
if [ ! -f "$SOURCE_IMG" ]; then
    echo -e "${RED}错误: 源镜像 $SOURCE_IMG 不存在!${NC}"
    echo ""
    echo "当前目录: $(pwd)"
    echo "请检查文件路径是否正确"
    echo ""
    echo "当前目录下的镜像文件:"
    ls -lh *.ext2 *.img 2>/dev/null || echo "  未找到 .ext2 或 .img 文件"
    exit 1
fi

# 检查SDK目录是否存在
if [ ! -d "$SDK_IMAGES_DIR" ]; then
    echo -e "${RED}错误: SDK镜像目录不存在: $SDK_IMAGES_DIR${NC}"
    echo "请检查SDK路径是否正确"
    exit 1
fi

# 显示源文件信息
echo "源镜像文件信息:"
ls -lh "$SOURCE_IMG"
echo ""

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份原有的rootfs.ext2(如果存在)
if [ -f "$SDK_IMAGES_DIR/$TARGET_NAME" ]; then
    TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
    BACKUP_FILE="$BACKUP_DIR/${TARGET_NAME}.backup_${TIMESTAMP}"
    
    echo -e "${YELLOW}正在备份原有的 rootfs.ext2...${NC}"
    cp "$SDK_IMAGES_DIR/$TARGET_NAME" "$BACKUP_FILE"
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ 备份完成: $BACKUP_FILE${NC}"
        # 显示备份文件大小
        BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
        echo "  备份大小: $BACKUP_SIZE"
    else
        echo -e "${RED}✗ 备份失败!${NC}"
        exit 1
    fi
else
    echo -e "${YELLOW}未找到原有的 rootfs.ext2,跳过备份${NC}"
fi

# 复制新镜像到SDK目录
echo ""
echo -e "${YELLOW}正在部署新镜像到SDK...${NC}"
cp "$SOURCE_IMG" "$SDK_IMAGES_DIR/$TARGET_NAME"

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✓ 镜像部署成功!${NC}"
    echo "  源文件: $(pwd)/$SOURCE_IMG"
    echo "  目标位置: $SDK_IMAGES_DIR/$TARGET_NAME"
else
    echo -e "${RED}✗ 镜像部署失败!${NC}"
    exit 1
fi

# 显示文件信息
echo ""
echo "========================================="
echo "部署后的文件信息:"
ls -lh "$SDK_IMAGES_DIR/$TARGET_NAME"
echo "========================================="

# 询问是否立即打包
echo ""
read -p "是否立即调用SDK打包命令?(y/n): " answer

if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
    echo ""
    echo -e "${YELLOW}正在切换到SDK目录并执行打包...${NC}"
    cd "$SDK_PATH"
    
    # 这里根据您的SDK实际打包命令修改
    # 常见的RK SDK打包命令:
    # ./build.sh updateimg
    # 或者
    # ./mkfirmware.sh
    
    echo "执行打包命令: ./build.sh updateimg"
    ./build.sh updateimg
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ 打包完成!${NC}"
    else
        echo -e "${RED}✗ 打包失败,请检查SDK配置${NC}"
        exit 1
    fi
else
    echo -e "${YELLOW}跳过打包,您可以稍后手动执行:${NC}"
    echo "  cd $SDK_PATH"
    echo "  ./build.sh updateimg"
fi

echo ""
echo -e "${GREEN}=========================================${NC}"
echo -e "${GREEN}  所有操作完成!${NC}"
echo -e "${GREEN}=========================================${NC}"

# 显示备份历史
if [ -d "$BACKUP_DIR" ] && [ "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
    echo ""
    echo "历史备份文件 (最近5个):"
    ls -lht "$BACKUP_DIR" | head -6
fi

上板子

烧录完成之后,我们就是进入板子,看到systemd就是大成功了。笔者比较丝滑,一下子就进入了,输入用户和密码之后,我们就是准备开始配置网卡等内容。

挂载模块

记得先挂载下模块,来个例子,比如说我这个就是------

复制代码
set -euo pipefail

[ "$(id -u)" -eq 0 ] || die "must run as root"

log "=== start system_inits ==="

for ko in 8852bs.ko hci_uart.ko; do
    log "Loading $ko"
    insmod "/lib/modules/$ko" >/dev/null 2>&1 || die "failed to load $ko"
    log "insmod $ko ok"
done

挂载下8852bs.ko hci_uart.ko两个模块。

拉起来网络

我们可以先拉起来网络,我是WLAN无线网,所以先要配置以下网络:

复制代码
rm -rf /etc/wpa_supplicant.conf # 我喜欢删除旧的先
wpa_passphrase "你WIFI叫啥" "你的密码" > /etc/wpa_supplicant.conf
cat /etc/wpa_supplicant.conf # 自己看一下

然后拉起来看看------

复制代码
sudo ip link set wlan0 up
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B
sudo dhclient -v wlan0 # 得到动态IP

是牛是马ping 8.8.8.8看看,然后ping下baidu.com就行。

安装桌面或者是其他

网络已经通了,这样的话各位都是高级玩家,想咋搞就咋搞。

完结撒花!

相关推荐
爆米花byh2 小时前
在RockyLinux9环境的Doris单机版安装
linux·数据库·database
非鱼䲆鱻䲜3 小时前
淘晶驰串口屏使用波形图控件,接收单片机或者串口助手数据生成图像的区别
单片机·嵌入式·串口屏
筱白爱学习4 小时前
RestHighLevelClient详细使用手册
linux·服务器·php
若谷老师4 小时前
21.WSL中部署gnina分子对接程序ds
linux·人工智能·ubuntu·卷积神经网络·gnina·smina
ChenYY~5 小时前
入门分享篇:一、工欲善其事,必先利其器
计算机·程序员·机器人·嵌入式·typora·工具·软件开发·obsidian
啊辉的科研6 小时前
植物单细胞RNA-seq分析教程3-2025年版
linux·r语言
Norach7 小时前
ubuntu22.04安装ssh-server与realvnc-server
linux·服务器·经验分享·ubuntu·ssh·vnc
UP_Continue7 小时前
Linux--进程间通信
linux·运维·服务器
kaoa0007 小时前
Linux入门攻坚——67、MySQL数据库-4
linux·运维·数据库·mysql