tar -jxvf buildroot-2017.02.tar.bz2
make at91sam9g20dfc_defconfig
make menuconfig
Target options --->
Enable VFP extension support
Build options --->
Mirrors and Download locations --->
修改几处源为国内的源,以加快下载速度
│ │ () Primary download site │ │
│ │ (http://sources.buildroot.net) Backup download site │ │
│ │ (http://mirrors.ustc.edu.cn/kernel.org) Kernel.org mirror │ │
│ │ (http://mirrors.ustc.edu.cn/gnu) GNU Software mirror │ │
│ │ (http://rocks.moonscript.org) LuaRocks mirror │ │
│ │ (http://mirrors.ustc.edu.cn/CPAN) CPAN mirror (Perl packages)
工具链配置 Toolchain --->
Toolchain type (Buildroot toolchain)
(buildroot) custom toolchain vendor name
C library (glibc)
Kernel Headers (Linux 3.2.x kernel headers) 版本至少与实际使用的内核的版本一样老才可以,否则启动的时候会提示:
FATAL: kernel too old
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
查看busybox支持的Linux版本:file busybox | grep Linux
glibc version (2.23)
Binutils Version (binutils 2.26.1)
GCC compiler Version (gcc 5.x)
Enable C++ support
注:在使用 Buildroot 自己编译的 toolchian 之前我使用过 gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabi 作为外部 Toolchain,但是遇到了问题,编译的 rootfs 在启动的时候报错:
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
网上说问题可能是 Kernel 与 rootfs 在编译的时候没有同时开启 EABI,但我检查(readelf -hA vmlinux busybox)的结果是都开启了。会不会是浮点数的问题?配置的都是 soft float,也没问题。最后发现是 rootfs 指令集用的是 ARMv7-a,而 CPU 是 AT91SAM9G25(ARM926EJ-S(ARM9)),支持的指令集是 ARMv5t。单 buildroot 中没找到向外部 GCC 传递 CFLAGS(-march=armv5t)的配置,于是放弃使用外部工具链。
System configuration --->
/dev management (Dynamic using devtmpfs + eudev)
不选 Run a getty (login prompt) after boot (具体行为后续再 inittab 中改)
(eth0) Network interface to configure through DHCP
Kernel --->
不选择编译 Kernel
Target packages --->
Show packages that are also provided by busybox
Shell and utilities --->
bash
Debugging, profiling and benchmark --->
gdb
Compressors and decompressors --->
bzip2
gzip
Networking applications --->
pppd
Bootloaders --->
不选
如果需要额外配置 busybox,使用:make busybox-menuconfig
,这里使用默认配置
编译系统:
make -j4
会在 dl 文件夹放置下载到的源码,在 output/image 中生成 rootfs.tar
mkdir rootfs
sudo tar -xvf rootfs.tar -C rootfs
添加 10_usbkey.rules到 /etc/udev/rules.d
/etc/profile
export LD_LIBRARY_PATH=/qtlib
/etc/inittab
ttyS0::respawn:/bin/login -f root
/etc/init.d/S10udev
修改 udevadm trigger --type=devices --action=add
为 udevadm trigger --type=devices
创建 /qtlib 把 QT 的部分动态库库放进去。
将 linux-ppp-scripts_v1.2 的文件放到相应的位置
sudo ./mkubifsimage rootfs/ ubifs.img
发现的问题:
在启动初始化时,执行 init.d/S10udev 中的 udevadm trigger --type=devices --action=add 时,会出现错误信息:
UBI error: ubi_open_volume: cannot open device 0, volume 0, error -16
(估计是操作 /dev/mtd8 时出现的错误,因为 cat /dev/mtd8 时会出现同样的错误信息)
cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "bootstrap"
mtd1: 00080000 00020000 "uboot"
mtd2: 00040000 00020000 "env"
mtd3: 00040000 00020000 "env_redundant"
mtd4: 00040000 00020000 "spare"
mtd5: 00080000 00020000 "dtb"
mtd6: 00600000 00020000 "kernel"
mtd7: 0f800000 00020000 "rootfs"
mtd8: 0eb68000 0001f000 "rootfs"
为什么会有两个 rootfs 呢?mtd8 是怎么来的,留待以后研究。
暂时的解决对策是: 去掉此行中的 --action=add