根文件系统移植与调试指南
根文件系统移植与调试指南
文档信息
- 平台: RV1126B (ARM Cortex-A53, 64位)
- Linux版本: Linux 6.1
- 根文件系统工具: Buildroot
- SDK路径:
/home/alientek/atk_dlrv1126b_linux6.1_sdk
目录
一、根文件系统的作用
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的优势:
- 自动化构建: 一键生成完整的根文件系统
- 软件包管理: 内置2000+软件包,易于集成
- 配置灵活: 通过menuconfig图形化配置
- 交叉编译: 自动处理交叉编译工具链
- 可重复构建: 配置文件可保存和复用
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 ---> │
└────────────────────────────────────────────────────────────────┘
关键配置项说明:
-
Target options - 目标平台配置
- Target Architecture: ARM (little endian)
- Target Architecture Variant: cortex-A53
- Target ABI: EABIhf
-
Toolchain - 工具链配置
- Toolchain type: External toolchain
- Toolchain: Custom toolchain
- Toolchain path: SDK提供的工具链路径
-
System configuration - 系统配置
- System hostname: ATK-DLRV1126B
- Root password: (设置root密码)
- Init system: BusyBox
- /dev management: Dynamic using devtmpfs + eudev
-
Target packages - 软件包选择
- Networking applications (网络工具)
- Audio and video applications (音视频工具)
- Libraries (库文件)
-
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平台根文件系统的移植、定制和调试方法,涵盖了从环境准备到问题解决的完整流程。
关键要点:
- Buildroot工具: 自动化构建根文件系统的强大工具
- overlay机制: 通过overlay目录定制文件系统内容
- NFS调试: 快速迭代开发的有效方法
- 模块化设计: 将应用程序打包成buildroot软件包
- 启动脚本: 使用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
更多推荐

所有评论(0)