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.7 和 python2.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的密码,要不然白搞了
卸载流程
烧录流程
可以检索笔者的文章,我还有烧录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就行。
安装桌面或者是其他
网络已经通了,这样的话各位都是高级玩家,想咋搞就咋搞。
完结撒花!