根文件系统移植与调试指南

文档信息

  • 平台: RV1126B (ARM Cortex-A53, 64位)
  • Linux版本: Linux 6.1
  • 根文件系统工具: Buildroot
  • SDK路径: /home/alientek/atk_dlrv1126b_linux6.1_sdk

目录

  1. 根文件系统的作用
  2. Buildroot简介
  3. 根文件系统移植步骤
  4. 根文件系统定制
  5. 应用程序集成
  6. 根文件系统调试
  7. 常见问题与解决方案

一、根文件系统的作用

1.1 什么是根文件系统

根文件系统(Root Filesystem, RootFS)是Linux系统启动后挂载的第一个文件系统,包含了系统运行所需的所有文件、目录、库文件和应用程序。

在系统启动流程中的位置:

上电 → MiniLoader → U-Boot → Linux Kernel → 根文件系统 → 应用程序
                                              ↑
                                    用户空间的基础

启动流程详解:

阶段 名称 主要功能
1 U-Boot 加载内核和设备树
2 Linux Kernel 初始化硬件,挂载根文件系统
3 根文件系统 提供用户空间环境
4 Init进程 启动系统服务
5 应用程序 执法记录仪应用

1.2 根文件系统的核心内容

根文件系统包含以下核心目录和文件:

/(根目录)
├── bin/          # 基本命令(ls, cp, mv等)
├── sbin/         # 系统管理命令(ifconfig, mount等)
├── lib/          # 共享库文件(libc.so, libm.so等)
├── usr/          # 用户程序和库
│   ├── bin/      # 用户命令
│   ├── sbin/     # 系统管理命令
│   └── lib/      # 库文件
├── etc/          # 配置文件
│   ├── init.d/   # 启动脚本
│   ├── fstab     # 文件系统挂载表
│   └── inittab   # init配置文件
├── dev/          # 设备文件节点
├── proc/         # 进程信息(虚拟文件系统)
├── sys/          # 系统信息(虚拟文件系统)
├── tmp/          # 临时文件
├── var/          # 可变数据(日志等)
├── home/         # 用户主目录
├── root/         # root用户主目录
└── mnt/          # 挂载点

1.3 根文件系统的类型

常见的根文件系统格式:

类型 特点 适用场景
ext4 可读写,支持日志 eMMC/SD卡存储
squashfs 只读,高压缩比 固件分区
ubifs 针对NAND Flash优化 NAND Flash存储
initramfs 内存文件系统 临时根文件系统
NFS 网络文件系统 开发调试

本项目使用的文件系统:

  • rootfs分区: ext4格式,可读写
  • 存储介质: eMMC (8GB)

二、Buildroot简介

2.1 什么是Buildroot

Buildroot是一个用于构建嵌入式Linux系统的自动化工具,可以生成交叉编译工具链、根文件系统和内核镜像。

Buildroot的优势:

  1. 自动化构建: 一键生成完整的根文件系统
  2. 软件包管理: 内置2000+软件包,易于集成
  3. 配置灵活: 通过menuconfig图形化配置
  4. 交叉编译: 自动处理交叉编译工具链
  5. 可重复构建: 配置文件可保存和复用

Buildroot在SDK中的位置:

atk_dlrv1126b_linux6.1_sdk/
├── buildroot/              # Buildroot源码
│   ├── configs/            # 配置文件
│   ├── package/            # 软件包定义
│   ├── board/              # 板级配置
│   └── output/             # 编译输出
├── kernel/                 # Linux内核
├── u-boot/                 # U-Boot
└── device/rockchip/        # Rockchip平台配置

2.2 Buildroot的工作流程

配置阶段 (make menuconfig)
    ↓
下载源码 (自动下载软件包)
    ↓
交叉编译 (使用工具链编译)
    ↓
安装到staging (临时安装目录)
    ↓
生成rootfs (打包根文件系统)
    ↓
生成镜像 (rootfs.ext4, rootfs.tar等)

2.3 Buildroot配置文件

关键配置文件:

文件 路径 作用
defconfig buildroot/configs/alientek_rv1126b_defconfig 板级默认配置
.config buildroot/.config 当前配置(make menuconfig生成)
Config.in buildroot/package/*/Config.in 软件包配置选项
*.mk buildroot/package/*/*.mk 软件包编译规则

三、根文件系统移植步骤

3.1 环境准备

3.1.1 系统要求

开发主机要求:

  • 操作系统: Ubuntu 20.04 LTS (推荐)
  • 磁盘空间: ≥ 100GB
  • 内存: ≥ 8GB (建议16GB)
  • CPU: 多核处理器 (编译速度更快)
3.1.2 安装依赖工具
# 更新软件源
sudo apt-get update

# 安装编译工具链
sudo apt-get install -y git ssh make gcc libssl-dev liblz4-tool \
    expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
    qemu-user-static live-build bison flex fakeroot cmake gcc-multilib \
    g++-multilib unzip device-tree-compiler ncurses-dev

# 安装Python相关工具
sudo apt-get install -y python3 python3-pip python3-dev python3-setuptools

# 安装其他工具
sudo apt-get install -y rsync bc libncurses5-dev libgmp-dev libmpc-dev \
    cpio rsync wget

# 安装gettext(Ubuntu 20.04需要)
sudo apt-get install -y gettext

3.2 获取SDK源码

方式一:从正点原子获取
# 解压SDK
cd ~/
tar xf atk_dlrv1126b_linux6.1_sdk_release_v1.0.0_20251202.tar.gz
cd atk_dlrv1126b_linux6.1_sdk/
方式二:使用repo同步(如果有git仓库)
# 初始化repo
repo init -u <SDK_URL> -b master

# 同步代码
repo sync -c -j10

3.3 配置Buildroot

步骤1:进入Buildroot目录
cd ~/atk_dlrv1126b_linux6.1_sdk/buildroot
步骤2:加载默认配置
# 查看可用的defconfig
ls configs/ | grep alientek

# 加载正点原子提供的配置
make alientek_rv1126b_defconfig

输出示例:

#
# configuration written to /home/alientek/atk_dlrv1126b_linux6.1_sdk/buildroot/.config
#
步骤3:图形化配置(可选)
# 打开menuconfig配置界面
make menuconfig

menuconfig界面说明:

┌─────────────────── Buildroot Configuration ───────────────────┐
│  Arrow keys navigate the menu.  <Enter> selects submenus      │
│  Highlighted letters are hotkeys.  Pressing <Y> includes,     │
│  <N> excludes, <M> modularizes features.  Press <Esc><Esc>    │
│  to exit, <?> for Help, </> for Search.  Legend: [*] built-in │
│  [ ] excluded  <M> module  < > module capable                 │
│                                                                │
│    Target options  --->                                        │
│    Build options  --->                                         │
│    Toolchain  --->                                             │
│    System configuration  --->                                  │
│    Kernel  --->                                                │
│    Target packages  --->                                       │
│    Filesystem images  --->                                     │
│    Bootloaders  --->                                           │
│    Host utilities  --->                                        │
│    Legacy config options  --->                                 │
└────────────────────────────────────────────────────────────────┘

关键配置项说明:

  1. Target options - 目标平台配置

    • Target Architecture: ARM (little endian)
    • Target Architecture Variant: cortex-A53
    • Target ABI: EABIhf
  2. Toolchain - 工具链配置

    • Toolchain type: External toolchain
    • Toolchain: Custom toolchain
    • Toolchain path: SDK提供的工具链路径
  3. System configuration - 系统配置

    • System hostname: ATK-DLRV1126B
    • Root password: (设置root密码)
    • Init system: BusyBox
    • /dev management: Dynamic using devtmpfs + eudev
  4. Target packages - 软件包选择

    • Networking applications (网络工具)
    • Audio and video applications (音视频工具)
    • Libraries (库文件)
  5. Filesystem images - 文件系统镜像

    • ext2/3/4 root filesystem
    • tar the root filesystem

3.4 编译根文件系统

步骤1:开始编译
# 使用多核编译(-j8表示使用8个CPU核心)
make -j8

编译过程说明:

编译阶段                    时间估计
├── 下载软件包源码          10-30分钟(取决于网络)
├── 编译工具链              30-60分钟
├── 编译软件包              1-3小时
├── 生成根文件系统          5-10分钟
└── 打包镜像文件            5分钟

编译输出示例:

>>> host-pkgconf 1.6.3 Extracting
>>> host-pkgconf 1.6.3 Patching
>>> host-pkgconf 1.6.3 Configuring
>>> host-pkgconf 1.6.3 Building
>>> host-pkgconf 1.6.3 Installing to host directory
>>> busybox 1.35.0 Extracting
>>> busybox 1.35.0 Patching
>>> busybox 1.35.0 Configuring
>>> busybox 1.35.0 Building
>>> busybox 1.35.0 Installing to target
...
步骤2:查看编译输出
# 编译完成后,输出文件位于
ls output/images/

# 主要输出文件:
# - rootfs.ext4      # ext4格式根文件系统镜像
# - rootfs.tar       # tar打包的根文件系统
# - rootfs.img       # 最终的rootfs镜像(用于烧录)

输出目录结构:

buildroot/output/
├── build/              # 编译临时文件
├── host/               # 主机工具
├── images/             # 最终镜像文件 ⭐
│   ├── rootfs.ext4
│   ├── rootfs.tar
│   └── rootfs.img
├── staging/            # 库文件和头文件
└── target/             # 根文件系统目录 ⭐
    ├── bin/
    ├── etc/
    ├── lib/
    ├── sbin/
    └── usr/

3.5 使用SDK的build.sh脚本

SDK提供了便捷的编译脚本,可以一键编译整个系统。

build.sh脚本使用
# 进入SDK根目录
cd ~/atk_dlrv1126b_linux6.1_sdk/

# 查看帮助信息
./build.sh help

# 编译buildroot(根文件系统)
./build.sh buildroot

# 编译完整固件(包括u-boot、kernel、buildroot)
./build.sh all

build.sh常用命令:

命令 功能 说明
./build.sh lunch 选择板级配置 交互式选择defconfig
./build.sh uboot 编译U-Boot 单独编译U-Boot
./build.sh kernel 编译内核 单独编译内核
./build.sh buildroot 编译根文件系统 单独编译buildroot
./build.sh all 编译所有组件 一键编译完整固件
./build.sh firmware 打包固件 生成update.img
./build.sh cleanall 清理所有编译 删除所有编译输出
选择板级配置
# 执行lunch命令
./build.sh lunch

# 会显示可用的配置列表
# 1. 01_atk_dlrv1126b_automipi_defconfig
# 2. 02_atk_dlrv1126b_mipi720x1280_defconfig
# 3. 03_atk_dlrv1126b_mipi800x1280_defconfig
# 4. 04_atk_dlrv1126b_mipi1080x1920_defconfig
# 5. 05_atk_dlrv1126b_automipi_amp_mcu_defconfig

# 输入数字选择配置(例如选择1)
Which would you like? [1] : 1

配置文件说明:

  • 01_atk_dlrv1126b_automipi_defconfig: 自动检测MIPI屏幕
  • 02_atk_dlrv1126b_mipi720x1280_defconfig: 720x1280分辨率MIPI屏
  • 03_atk_dlrv1126b_mipi800x1280_defconfig: 800x1280分辨率MIPI屏
  • 04_atk_dlrv1126b_mipi1080x1920_defconfig: 1080x1920分辨率MIPI屏
  • 05_atk_dlrv1126b_automipi_amp_mcu_defconfig: 带AMP和MCU的配置

四、根文件系统定制

4.1 添加自定义软件包

方式一:使用Buildroot内置软件包
# 进入buildroot目录
cd ~/atk_dlrv1126b_linux6.1_sdk/buildroot

# 打开menuconfig
make menuconfig

# 导航到 Target packages
# 选择需要的软件包,按Y启用,按N禁用

常用软件包示例:

网络工具:

  • dropbear: 轻量级SSH服务器
  • iperf3: 网络性能测试工具
  • tcpdump: 网络抓包工具
  • wget: 文件下载工具
  • curl: HTTP客户端工具

音视频工具:

  • gstreamer1: 多媒体框架
  • ffmpeg: 音视频处理工具
  • alsa-utils: ALSA音频工具

开发调试工具:

  • strace: 系统调用跟踪
  • gdb: 调试器
  • valgrind: 内存调试工具
  • htop: 进程监控工具
方式二:添加自定义应用程序

步骤1:创建软件包目录

# 在buildroot/package/下创建自定义软件包目录
cd ~/atk_dlrv1126b_linux6.1_sdk/buildroot/package/
mkdir my_app
cd my_app

步骤2:创建Config.in文件

cat > Config.in << 'EOF'
config BR2_PACKAGE_MY_APP
    bool "my_app"
    help
      My custom application for law enforcement recorder.

      https://github.com/yourname/my_app
EOF

步骤3:创建my_app.mk文件

cat > my_app.mk << 'EOF'
################################################################################
#
# my_app
#
################################################################################

MY_APP_VERSION = 1.0.0
MY_APP_SITE = $(TOPDIR)/../app/my_app
MY_APP_SITE_METHOD = local
MY_APP_INSTALL_STAGING = NO
MY_APP_INSTALL_TARGET = YES

define MY_APP_BUILD_CMDS
    $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D)
endef

define MY_APP_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/my_app $(TARGET_DIR)/usr/bin/my_app
endef

$(eval $(generic-package))
EOF

步骤4:将软件包添加到菜单

# 编辑 buildroot/package/Config.in
# 在适当位置添加:
# source "package/my_app/Config.in"

步骤5:重新配置并编译

make menuconfig
# 在Target packages中找到并启用my_app

make my_app

4.2 添加启动脚本

方式一:使用init.d脚本

步骤1:创建启动脚本

# 在buildroot overlay目录创建启动脚本
mkdir -p ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/init.d/

cat > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/init.d/S99myapp << 'EOF'
#!/bin/sh

case "$1" in
    start)
        echo "Starting my application..."
        /usr/bin/my_app &
        ;;
    stop)
        echo "Stopping my application..."
        killall my_app
        ;;
    restart)
        $0 stop
        sleep 1
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit 0
EOF

# 添加执行权限
chmod +x ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/init.d/S99myapp

启动脚本命名规则:

  • S##name: 启动脚本,##为启动顺序(00-99)
  • K##name: 停止脚本
  • 数字越小越先执行

常见启动顺序:

  • S01xxx: 基础服务
  • S20xxx: 网络服务
  • S50xxx: 应用服务
  • S99xxx: 用户应用
方式二:使用systemd(如果启用)
# 创建systemd服务文件
cat > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/systemd/system/myapp.service << 'EOF'
[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/my_app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

4.3 添加配置文件

# 创建配置文件目录
mkdir -p ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/myapp/

# 创建配置文件
cat > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/myapp/config.ini << 'EOF'
[network]
ip=192.168.1.100
port=8554

[video]
resolution=1280x720
framerate=30
EOF

4.4 定制系统配置

修改主机名
# 方式一:通过menuconfig
make menuconfig
# System configuration -> System hostname

# 方式二:直接修改overlay文件
echo "ATK-DLRV1126B" > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/hostname
设置root密码
# 方式一:通过menuconfig
make menuconfig
# System configuration -> Root password

# 方式二:使用post-build脚本
# 在board/rockchip/rv1126/post-build.sh中添加:
# echo "root:password" | chpasswd -R $TARGET_DIR
配置网络
# 创建网络配置文件
cat > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/network/interfaces << 'EOF'
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant.conf
EOF

五、应用程序集成

5.1 集成RTSP服务器

根据项目需求,需要将RTSP服务器程序集成到根文件系统中。

步骤1:准备源码
# 源码位置
~/atk_dlrv1126b_linux6.1_sdk/app/rv1126b_rtsp_server/
步骤2:交叉编译
cd ~/atk_dlrv1126b_linux6.1_sdk/app/rv1126b_rtsp_server/

# 使用交叉编译脚本
./build-cross.sh

# 编译输出
# build-cross/rtsp_server
步骤3:安装到rootfs

方式一:手动复制到overlay

# 创建overlay目录
mkdir -p ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/usr/bin/

# 复制可执行文件
cp build-cross/rtsp_server ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/usr/bin/

# 复制库文件
mkdir -p ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/usr/lib/
cp lib/*.so ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/usr/lib/

方式二:创建buildroot软件包

参考4.1节的方法创建rtsp_server软件包。

步骤4:创建启动脚本
cat > ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/init.d/S99rtsp << 'EOF'
#!/bin/sh

DAEMON=/usr/bin/rtsp_server
PIDFILE=/var/run/rtsp_server.pid

case "$1" in
    start)
        echo "Starting RTSP server..."
        start-stop-daemon -S -q -b -m -p $PIDFILE -x $DAEMON
        ;;
    stop)
        echo "Stopping RTSP server..."
        start-stop-daemon -K -q -p $PIDFILE
        rm -f $PIDFILE
        ;;
    restart)
        $0 stop
        sleep 1
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit 0
EOF

chmod +x ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/etc/init.d/S99rtsp

5.2 集成GStreamer

GStreamer是项目的核心依赖,需要确保正确集成。

在menuconfig中启用GStreamer
make menuconfig

# 导航到:
# Target packages -> Audio and video applications -> gstreamer1

# 启用以下选项:
[*] gstreamer1
[*]   gst1-plugins-base
[*]     plugin: videotestsrc
[*]     plugin: audiotestsrc
[*]   gst1-plugins-good
[*]     plugin: v4l2
[*]     plugin: rtsp
[*]   gst1-plugins-bad
[*]   gst1-plugins-ugly
[*]   gst1-libav
[*]   gst-rtsp-server
验证GStreamer安装

编译完成后,在target目录检查:

ls ~/atk_dlrv1126b_linux6.1_sdk/buildroot/output/target/usr/lib/gstreamer-1.0/

# 应该看到各种插件.so文件

5.3 集成驱动模块

WiFi驱动(RTL8733)
# 复制驱动模块到overlay
mkdir -p ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/lib/modules/6.1.0/

cp ~/atk_dlrv1126b_linux6.1_sdk/external/rkwifibt/drivers/rtl8733bu/8733bu.ko \
   ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/lib/modules/6.1.0/
5G模组驱动(RM500Q)

5G模组使用标准USB驱动,内核已包含,无需额外集成。

陀螺仪驱动(ICM20948)
# 如果有独立的驱动模块
cp ~/path/to/icm20948.ko \
   ~/atk_dlrv1126b_linux6.1_sdk/buildroot/board/rockchip/rv1126/fs-overlay/lib/modules/6.1.0/

六、根文件系统调试

6.1 使用NFS挂载调试

NFS(Network File System)允许通过网络挂载根文件系统,便于快速调试。

步骤1:配置NFS服务器(开发主机)
# 安装NFS服务器
sudo apt-get install nfs-kernel-server

# 配置NFS导出
sudo vim /etc/exports

# 添加以下行:
/home/alientek/atk_dlrv1126b_linux6.1_sdk/buildroot/output/target *(rw,sync,no_root_squash,no_subtree_check)

# 重启NFS服务
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server

# 验证NFS导出
showmount -e localhost
步骤2:配置U-Boot启动参数
# 在U-Boot命令行中设置
setenv bootargs "console=ttyFIQ0,1500000 root=/dev/nfs nfsroot=192.168.1.100:/home/alientek/atk_dlrv1126b_linux6.1_sdk/buildroot/output/target,v3,tcp rw ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off"

saveenv
boot

NFS启动优势:

  • 无需烧录,修改文件立即生效
  • 快速迭代开发
  • 便于调试和日志查看

6.2 串口调试

连接串口
# 使用minicom
sudo minicom -D /dev/ttyUSB0 -b 1500000

# 或使用screen
sudo screen /dev/ttyUSB0 1500000
查看启动日志
# 系统启动后,查看dmesg
dmesg | less

# 查看特定驱动日志
dmesg | grep v4l2
dmesg | grep usb
dmesg | grep i2c
实时查看日志
# 实时查看内核日志
dmesg -w

# 查看系统日志
tail -f /var/log/messages

6.3 文件系统检查

检查磁盘空间
# 查看磁盘使用情况
df -h

# 查看目录大小
du -sh /usr
du -sh /lib
du -sh /etc

# 查看最大的文件
du -ah / | sort -rh | head -20
检查文件权限
# 检查可执行文件权限
ls -l /usr/bin/rtsp_server

# 修改权限
chmod +x /usr/bin/rtsp_server

# 检查库文件
ls -l /usr/lib/*.so
检查符号链接
# 查看符号链接
ls -l /lib/libc.so.6

# 修复损坏的符号链接
ln -sf /lib/libc-2.31.so /lib/libc.so.6

6.4 应用程序调试

使用strace跟踪系统调用
# 跟踪程序执行
strace /usr/bin/rtsp_server

# 跟踪特定系统调用
strace -e open,read,write /usr/bin/rtsp_server

# 跟踪正在运行的进程
strace -p <pid>

# 输出到文件
strace -o /tmp/trace.log /usr/bin/rtsp_server
使用ldd检查库依赖
# 查看程序依赖的库
ldd /usr/bin/rtsp_server

# 输出示例:
# libgstreamer-1.0.so.0 => /usr/lib/libgstreamer-1.0.so.0
# libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0
# libc.so.6 => /lib/libc.so.6

# 如果显示"not found",说明缺少库文件
使用gdb调试
# 在buildroot中启用gdb
make menuconfig
# Target packages -> Debugging, profiling and benchmark -> gdb

# 使用gdb调试
gdb /usr/bin/rtsp_server

# gdb命令:
(gdb) run                    # 运行程序
(gdb) break main             # 设置断点
(gdb) continue               # 继续执行
(gdb) print variable         # 打印变量
(gdb) backtrace              # 查看调用栈

6.5 性能分析

使用top监控系统
# 实时监控
top

# 按CPU使用率排序:按P
# 按内存使用率排序:按M
# 退出:按q
使用ps查看进程
# 查看所有进程
ps aux

# 查看特定进程
ps aux | grep rtsp_server

# 查看进程树
ps auxf
使用free查看内存
# 查看内存使用
free -h

# 输出示例:
#               total        used        free      shared  buff/cache   available
# Mem:           512M        128M        256M        4.0M        128M        350M
# Swap:            0B          0B          0B

七、常见问题与解决方案

7.1 编译问题

问题1:下载软件包失败

现象:

>>> host-pkgconf 1.6.3 Downloading
wget: unable to resolve host address

解决方案:

# 方式一:配置代理
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080

# 方式二:使用本地源码
# 将下载好的源码放到 buildroot/dl/ 目录

# 方式三:修改下载站点
# 编辑 buildroot/package/xxx/xxx.mk
# 修改 XXX_SITE 变量
问题2:编译错误 - 缺少头文件

现象:

fatal error: xxx.h: No such file or directory

解决方案:

# 检查是否启用了相关软件包
make menuconfig
# 在Target packages中搜索并启用相关库

# 清理并重新编译
make clean
make
问题3:磁盘空间不足

现象:

No space left on device

解决方案:

# 清理编译输出
make clean

# 清理下载的源码包(谨慎使用)
rm -rf buildroot/dl/*

# 清理所有编译文件
make distclean

7.2 启动问题

问题1:内核无法挂载根文件系统

现象:

VFS: Cannot open root device "mmcblk0p7" or unknown-block(0,0)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

解决方案:

# 检查U-Boot的bootargs参数
# 在U-Boot命令行:
printenv bootargs

# 确认root参数正确
# root=/dev/mmcblk0p7 rootwait rw

# 检查内核是否包含eMMC驱动
# 在内核配置中启用:
# Device Drivers -> MMC/SD/SDIO card support
问题2:init进程启动失败

现象:

Kernel panic - not syncing: Attempted to kill init!

解决方案:

# 检查init程序是否存在
ls -l output/target/sbin/init

# 检查init程序权限
chmod +x output/target/sbin/init

# 检查init程序依赖
ldd output/target/sbin/init

# 尝试使用/bin/sh作为init
# 在bootargs中添加:init=/bin/sh
问题3:设备节点不存在

现象:

/dev/video23: No such file or directory

解决方案:

# 检查devtmpfs是否挂载
mount | grep devtmpfs

# 手动挂载devtmpfs
mount -t devtmpfs devtmpfs /dev

# 检查udev是否运行
ps aux | grep udev

# 启动udev
/sbin/udevd --daemon
udevadm trigger

7.3 运行时问题

问题1:库文件找不到

现象:

error while loading shared libraries: libxxx.so.0: cannot open shared object file

解决方案:

# 检查库文件是否存在
find / -name "libxxx.so*"

# 添加库路径到LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib:/lib:$LD_LIBRARY_PATH

# 或修改/etc/ld.so.conf
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
问题2:权限不足

现象:

Permission denied

解决方案:

# 检查文件权限
ls -l /path/to/file

# 修改权限
chmod +x /path/to/file

# 修改所有者
chown root:root /path/to/file

# 以root身份运行
sudo /path/to/program
问题3:进程崩溃

现象:

Segmentation fault

解决方案:

# 启用core dump
ulimit -c unlimited

# 运行程序,生成core文件
./program

# 使用gdb分析core文件
gdb ./program core

# 在gdb中查看崩溃位置
(gdb) bt
(gdb) info registers

7.4 网络问题

问题1:网络接口不存在

现象:

ifconfig: eth0: error fetching interface information: Device not found

解决方案:

# 检查网络驱动是否加载
lsmod | grep eth

# 加载网络驱动
modprobe xxx_eth

# 检查设备树配置
cat /proc/device-tree/ethernet@*/status
问题2:无法获取IP地址

现象:

udhcpc: no lease, failing

解决方案:

# 手动配置IP
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1

# 检查DHCP客户端
ps aux | grep udhcpc

# 重启网络服务
/etc/init.d/S40network restart

八、优化建议

8.1 减小根文件系统大小

移除不必要的软件包
make menuconfig
# 在Target packages中禁用不需要的软件包
使用BusyBox替代完整工具
# BusyBox提供了大多数常用命令的精简版本
# 在System configuration中启用BusyBox
裁剪库文件
# 使用strip去除调试符号
find output/target -type f -executable -exec strip {} \;

# 移除静态库
find output/target -name "*.a" -delete

8.2 提高启动速度

并行启动服务
# 修改init脚本,使用&后台启动
/usr/bin/service1 &
/usr/bin/service2 &
wait
延迟加载非关键服务
# 将非关键服务的启动脚本编号调大
# 例如:S99xxx
使用initramfs加速启动
# 在内核配置中启用initramfs
# 将关键文件打包到initramfs中

8.3 安全加固

禁用不必要的服务
# 删除或禁用不需要的启动脚本
rm /etc/init.d/S50telnet
设置强密码
# 修改root密码
passwd root
配置防火墙
# 使用iptables配置防火墙规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 8554 -j ACCEPT
iptables -P INPUT DROP

九、总结

本指南详细介绍了RV1126B平台根文件系统的移植、定制和调试方法,涵盖了从环境准备到问题解决的完整流程。

关键要点:

  1. Buildroot工具: 自动化构建根文件系统的强大工具
  2. overlay机制: 通过overlay目录定制文件系统内容
  3. NFS调试: 快速迭代开发的有效方法
  4. 模块化设计: 将应用程序打包成buildroot软件包
  5. 启动脚本: 使用init.d脚本管理服务启动

下一步:

  • 深入学习Buildroot软件包开发
  • 优化根文件系统大小和启动速度
  • 实现OTA升级功能
  • 集成更多应用程序和服务

参考资料:

  • Buildroot官方文档: https://buildroot.org/docs.html
  • Rockchip SDK文档: device/rockchip/docs/
  • Linux根文件系统标准: https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐