RK3288 Debian/Ubuntu系统rootfs镜像定制打包

本文介绍如何使用QEMU模拟器加载ARM系统镜像,安装所需软件,然后重新打包成新镜像,适用于批量部署。涉及rootfs提取、QEMU配置、脚本创建、新镜像制作与修复等步骤。

前言

近来开始接触ARM版,了解到瑞芯微RK3288上的Linux方案已经很成熟,分别有Debian 9Ubuntu 18.04这两个系统,都是基于Linaro(由ARM公司发起,其他ARM Soc公司共同投资的非营利组织)。其发布存储服务器地址为:https://releases.linaro.org/,在上面有很多版本的系统镜像、软件包等。这两个系统使用上和PC平台上的系统没有区别,都可以通过apt命令安装必要的软件包。测试移植完软件后,就开始着手系统定制打包,用于批量部署。本博文主要内容为:基于厂家提供的roofts镜像,通过QEMU模拟器加载系统文件,安装所需要的软件后,再重新打包成新的镜像。

打包环境

  • Ubuntu 18.04 AMD64
  • RK3288 ARM v7 板卡

安装QEMU

在Ubuntu系统下执行一下命令,安装QEMU模拟器

sudo apt-get install qemu-user-static

rootfs系统文件提取

将厂家或自行下载的系统镜像rootfs.img,拷贝到系统,这里我放置到用户目录下的RK3288文件夹:
RK3288文件夹内容
执行如下命令新建文件夹,并加载镜像(这里我打包的是Debian系统):

sudo mkdir Debian-mount # 镜像挂载目录
sudo mkdir Debian # 定制系统目录
sudo mount rootfs.img Debian-mount # 挂载原始镜像

拷贝镜像内的所有文件,到本机文件夹,用于定制系统

sudo cp -frp Debian-mount/* Debian/ # 拷贝时连带文件价权限一块递归复制

取消挂载原始rootfs镜像

sudo umount Debian-mount # 取消镜像挂载

配置QEMU

进入到Debian文件夹,并拷贝qemu-arm-static可执行程序到要打包的系统可执行文件夹usr/bin下面:

cd Debian # 切换到要定制系统根目录
sudo cp /usr/bin/qemu-arm-static usr/bin # 拷贝模拟器arm可执行文件到定制系统bin文件夹下
cd .. # 配置后切换到上一级路径

创建根文件系统脚本

拷贝完模拟器ARM平台可执行程序后,新建一个切换根目录系统的脚本ch-mount.sh,对应的脚本内容如下:

#!/bin/bash

function mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc ${2}proc
    sudo mount -t sysfs /sys ${2}sys
    sudo mount -o bind /dev ${2}dev

    sudo chroot ${2}
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    sudo umount ${2}dev

}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo ""
    echo "Either 1'st, 2'nd or both parameters were missing"
    echo ""
    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    echo ""
    echo "For example: ch-mount -m /media/sdcard/"
    echo ""
    echo 1st parameter : ${1}
    echo 2nd parameter : ${2}
fi

切换到新系统根目录

执行以下命令挂载切换到指定的根文件系统(Debian文件夹):

./ch-mount.sh -m Debian/

挂载切换到指定的跟文件系统
可以看到执行后,终端显示的用户名变为了root用户,机器名为当前系统的机器名。通过ls命令可以看到已经挂在了指定文件夹的文件,其中md5sum.txt文件为我这边系统的镜像内的校验文件。

安装所需要的软件包

这里演示给新系统安装一个nginx软件包:

apt-get update # 更新可获取软件机器版本信息
apt-get install nginx # 安装nginx软件包

执行结果如下:
安装nginx执行结果
部分软件安装可能启动异常,这是由于在模拟器运行的缘故,只要安装成功即可。

创建新镜像

执行exit命令退出系统,并执行./ch-mount.sh -u Debian/取消挂载系统目录。使用如下命令创建新的镜像文件:

dd if=/dev/zero of=rootfs_new.img  bs=1M count=3000 # 这里要注意根据新系统目录的大小创建镜像
sudo mkfs.ext4 -F -L linuxroot rootfs_new.img # 格式化镜像文件,并加入linuxroot卷标

执行结果如下:
创建新镜像

制作新镜像

挂载镜像,并拷贝修改后的文件系统进去:

sudo mount  rootfs_new.img Debian-mount # 挂载新镜像文件
sudo cp -rfp Debian/* Debian-mount/ # 拷贝时连带文件价权限一块递归复制

拷贝完成后,卸载镜像:

sudo umount Debian-mount

修复新镜像

由于创建的新镜像文件大小和里面的新系统文件大小不一致,需要通过命令检查并修复新镜像

e2fsck -p -f rootfs_new.img

检查新镜像
修复新镜像并进行4k对齐

resize2fs -M rootfs_new.img

修复新镜像
完成后,就可以通过AndroidTool工具,将新系统文件刷入板卡对应分区,实现批量部署定制后的新系统。

参考文献

Firefly Ubuntu开发入门之(6)制作Ubuntu Rootfs镜像

<think>我们面对的任务是将启动脚本部署或打包RK3568开发板的/usr/bin目录。根据引用[1][2][3]提供的上下文,我们知道RK3568是基于ARM架构的Linux开发板,并且引用中提到了构建根文件系统(如ubuntu-base)和移植系统的过程。因此,部署脚本到开发板的/usr/bin目录,本质上是将文件放入开发板根文件系统的对应目录中。步骤:1.**准备启动脚本**:确保启动脚本已经编写好,并具有可执行权限(通常使用chmod+xscript.sh)。2.**访问开发板根文件系统**:根据引用[2]和[3],构建根文件系统时,我们可以在宿主机(编译主机)上操作根文件系统的目录。因此,我们有两种方法:a.如果开发板正在运行,可以通过网络(如scp)或U盘将脚本复制到开发板的/usr/bin目录。b.如果正在构建根文件系统(尚未部署到开发板),则可以直接将启动脚本复制到根文件系统目录的对应位置(即ubuntu_rootfs/usr/bin/)。我们考虑两种情况:**情况一:在构建根文件系统时添加脚本(推荐在系统构建阶段)**-在构建根文件系统(如使用ubuntu-base)的目录(例如ubuntu_rootfs)中,将启动脚本复制到ubuntu_rootfs/usr/bin/目录下。-确保脚本具有可执行权限(在复制后,在宿主机的根文件系统目录中执行:`chmod+xubuntu_rootfs/usr/bin/script.sh`)。-然后按照引用[2]或[3]的方式打包或部署整个根文件系统到开发板。**情况二:在已运行的开发板上部署脚本**-如果开发板已经运行了系统(如通过SSH可以连接),则可以直接使用scp命令将脚本复制到开发板的/usr/bin目录(需要root权限):```bashscpscript.shuser@devboard_ip:/usr/bin/```然后通过SSH登录到开发板,赋予可执行权限:```bashsshuser@devboard_ipsudochmod+x/usr/bin/script.sh```-或者使用U盘等存储设备将脚本复制到开发板,然后移动到/usr/bin目录。3.**注意事项**:-/usr/bin目录通常需要root权限才能写入,所以在情况二中,scp命令可能需要使用root账户(或者先复制到用户目录,然后用sudo移动)或使用sudoscp(需要配置)。-在构建根文件系统阶段(情况一),由于是在宿主机操作,所以复制后要确保脚本的权限正确(可执行且所有者等)。-如果启动脚本有依赖,需要确保依赖在根文件系统中已经安装。4.**验证**:部署后,在开发板上执行脚本名称,检查是否能够正常运行。根据引用[2]中提到的qemu-aarch64-static,如果我们是在x86主机上构建aarch64的根文件系统,并且需要执行aarch64的二进制程序(例如测试脚本),则可以使用qemu-user-static来模拟执行。但这里我们只是复制脚本(脚本通常是文本文件,不依赖于架构,除非包含二进制内容),所以无需模拟。但是,如果启动脚本中调用了其他二进制程序,那么需要确保这些程序在目标板上存在,或者在构建根文件系统时一起打包。总结:根据当前开发板的状态(是正在构建根文件系统还是已经运行系统),选择上述情况之一进行操作。生成相关问题:1.如何在宿主机上构建RK3568开发板的根文件系统?2.如何给启动脚本添加可执行权限?3.如何将宿主机上的文件通过SCP传输到开发板?4.RK3568开发板启动脚本应该放在哪个目录?5.如何测试部署到开发板上的启动脚本是否正常运行?</think> ### 如何将启动脚本部署到 RK3568 开发板的 /usr/bin 目录 #### 方法 1:通过根文件系统直接集成(推荐) 适用于 **开发阶段/系统构建阶段** 1. **挂载根文件系统** 在编译主机上挂载开发板的根文件系统镜像: ```bash sudo mount -o loop ubuntu_rootfs.img /mnt/rootfs ``` 2. **复制启动脚本** 将脚本复制到挂载点的目标目录并设置权限: ```bash sudo cp your_script.sh /mnt/rootfs/usr/bin/ sudo chmod +x /mnt/rootfs/usr/bin/your_script.sh # 添加可执行权限 ``` 3. **卸载并烧写系统** ```bash sudo umount /mnt/rootfs # 将修改后的镜像烧写到开发板 ``` > **优势**:永久生效,适用于预置系统服务或常用工具[^2][^3] #### 方法 2:在已运行系统中部署 适用于 **设备已启动时** ```bash # 通过 ADB 或 SSH 连接开发板 adb push your_script.sh /tmp/ adb shell # 在设备终端执行 sudo mv /tmp/your_script.sh /usr/bin/ sudo chmod +x /usr/bin/your_script.sh sudo chown root:root /usr/bin/your_script.sh # 设置所有权 ``` #### 方法 3:创建 Debian 软件包 适用于 **批量部署/版本管理** 1. 创建包结构: ``` your_package/ └── usr/bin/your_script.sh ``` 2. 添加控制文件 `DEBIAN/control`: ``` Package: your-script Version: 1.0 Architecture: arm64 Maintainer: Your Name Description: Custom startup script ``` 3. 打包并安装: ```bash dpkg-deb -b your_package your_script.deb adb install your_script.deb ``` #### 验证脚本 ```bash # 在开发板上执行 which your_script.sh # 应返回 /usr/bin/your_script.sh your_script.sh --version # 测试执行 ``` > **注意**:/usr/bin 属于系统保护目录,操作需 root 权限。建议脚本命名添加前缀(如 `myapp_startup`)避免与系统命令冲突[^1] --- ### 相关问题 1. RK3568 如何设置开机自启动脚本? 2. 如何在 RK3568 上创建系统服务单元(service unit)? 3. 如何为 RK3568 的启动脚本添加环境变量依赖? 4. RK3568 根文件系统构建时有哪些必要目录结构? 5. 如何远程调试 RK3568 上的部署脚本? [^1]: RK3568 Linux 开发文档 http://www.openedv.com/docs/boards/arm-linux/RK3568Linux.html [^2]: Ubuntu-base 根文件系统构建指南 [^3]: 桌面版 Ubuntu 移植到 RK3568 的软件安装流程
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值