固件修改及编译记录
字数 953 2025-08-22 12:22:48
固件修改及编译技术详解
一、固件解包与修改
1.1 固件结构分析
使用binwalk分析固件结构:
binwalk dcs932l_v1.14.04.bin
典型结构组成:
- U-Boot引导程序
- uImage头
- LZMA压缩的内核系统
1.2 固件解包
binwalk -Me dcs932l_v1.14.04.bin
1.3 文件系统修改与重新打包
- 修改文件系统内容
- 打包为cpio格式:
find . | cpio -H newc -o > ../initrd.cpio
- 使用LZMA压缩(注意保持原字典大小):
./lzma e initrd.cpio initrd.cpio.lzma -d20
1.4 内核重组
- 截取内核头部:
dd if=50040 of=kernelHead bs=1 count=4038656
- 合并内核:
cp ./kernelHead ./kernel
cat initrd.cpio.lzma >> kernel
- 压缩内核:
./lzma e ./kernel ./kernel.lzma -d25
1.5 uImage处理
- 截取uImage头:
dd if=dcs of=uImageHeader bs=1 count=64
- 合并uImage:
cp uImageHeader uImage
cat kernel.lzma >> uImage
1.6 CRC校验处理
- 计算data CRC(使用WinHex工具)
- 修改uImage头中的:
- header CRC
- image大小
- data CRC
或使用mkimage自动生成:
sudo apt-get install u-boot-tools
mkimage -A MIPS -O linux -T kernel -C lzma -a 0x80000000 -e 0x803B8000 -n "Linux Kernel Image" -d kernel.lzma uImage
mkimage参数说明:
-A: CPU架构-O: 操作系统-T: 镜像类型-C: 压缩类型-a: 加载地址-e: 入口地址-n: 镜像名称-d: 输入文件
二、固件烧录方法
2.1 通过U-Boot烧录
- 设备启动时进入U-Boot
- 选择TFTP加载选项:
1: Load system code to SDRAM via TFTP. - 输入设备IP、服务器IP和固件文件名
2.2 注意事项
- 建议先加载到内存测试,不要直接刷入Flash
- 刷错固件可能导致设备变砖
三、OpenWrt固件编译
3.1 环境准备
- 获取源码:
git clone https://github.com/openwrt/openwrt
- 安装依赖:
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip zip unrar p7zip p7zip-rar p7zip-full sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk git-core libssl-dev
- 更新feed:
./scripts/feeds update -a
./scripts/feeds install -a
make package/symlinks
3.2 配置与编译
- 默认配置:
make defconfig
- 菜单配置:
make menuconfig
- 编译:
make V=99
编译完成后固件位于:
./bin/targets/ramips/rt305x/
文件系统目录:
./build_dir/target-mipsel_24kc_musl/root-ramips
四、Ralink SDK固件编译
4.1 工具链安装
- 安装编译工具链:
cp RT288x_SDK/toolchain/buildroot-gcc342.tar.bz2 /opt
tar jxvf buildroot-gcc342.tar.bz2
- 安装LZMA:
tar xvfz RT288x_SDK/toolchain/lzma-4.32.7.tar.gz
cd RT288x_SDK/toolchain/lzma-4.32.7
./configure
make
make install
- 安装MKSQUASHFS:
cd RT288x_SDK/toolchain/mksquash_lzma-3.2
make
make install
4.2 内核配置要点
Machine selection --->
System type--> (选择板子型号)
DRAM Size (32M) ---> (选择内存大小)
Kernel NVRAM (启用NVRAM)
Compress ramdisk by lzma instead of gzip (用lzma打包镜像文件)
General setup --->
Kernel->user space relay support
Block layer --->
Enable the block layer
IO Schedulers --->
Default I/O scheduler (No-op) --->
Networking --->
Networking options --->
Packet socket
Unix domain sockets
TCP/IP networking
Generic IEEE 802.11 Networking Stack
IEEE 802.11 WEP encryption (802.1x)
Device Drivers --->
Network device support --->
Network device support
Character devices --->
Ralink GPIO Support
Ralink GPIO LED Support
USB support --->
Support for Host-side USB
USB device filesystem
File systems --->
Kernel automounter support
Kernel automounter version 4 support
Filesystem in Userspace support
Pseudo filesystems --->
/proc file system support
/proc/kcore support
Sysctl support (/proc/sys)
sysfs file system support
4.3 文件系统修改
修改路径:
source/vendors/Ralink/RT3052/
关键文件:
rcS: 启动脚本inittab: init进程配置文件motd: Ralink图标fstab: 文件系统信息RT2860_default_vlan: nvram默认配置文件
添加文件方法:
- 在ROMFS_DIRS后添加目录
- 在Makefile中添加文件引用
五、启动脚本配置示例
#!/bin/sh
# 挂载文件系统
mount -a
# 创建静态设备节点
mounted=`mount | grep mdev | wc -l`
if [ $mounted -eq 0 ]; then
mount -t ramfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
fi
# 创建设备文件
mknod /dev/spiS0 c 217 0
mknod /dev/i2cM0 c 218 0
mknod /dev/rdm0 c 254 0
[...其他设备节点...]
# 设置用户账户
login=`nvram_get 2860 Login`
pass=`nvram_get 2860 Password`
echo "$login::0:0:Adminstrator:/:/bin/sh" > /etc/passwd
echo "$login:x:0:$login" > /etc/group
chpasswd.sh $login $pass
# 网络配置
lan_if="br0"
ifconfig lo up
ifconfig eth2 0.0.0.0
ifconfig ra0 0.0.0.0
brctl addbr br0
brctl addif br0 ra0
brctl addif br0 eth2
brctl setfd br0 1
brctl setmaxage br0 1
# IP配置
ip=`nvram_get 2860 wan_ipaddr`
nm=`nvram_get 2860 wan_netmask`
gw=`nvram_get 2860 wan_gateway`
ifconfig $lan_if $ip netmask $nm
route del default
[...路由配置...]
# 启动服务
web.sh
schedule &
telnetd
六、注意事项
- 保持与原固件相同的压缩参数(如LZMA字典大小)
- 修改uImage时注意CRC校验
- 烧录前先在内存中测试
- 编译环境建议使用低版本make
- 文件系统修改后要确保权限正确
- 关键配置文件备份后再修改