阡陌 发表于 2024-2-21 14:38:58

9G25 使用 Buildroot 创建 rootfs



```
tar -jxvf buildroot-2017.02.tar.bz2

make at91sam9g20dfc_defconfig

make menuconfig
```

![](https://file.mculoop.com/images/2024/01/11/202401112235652.png)

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   erasesizename
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


页: [1]
查看完整版本: 9G25 使用 Buildroot 创建 rootfs