目录
方法1:使用友善之臂的主线uboot+linux+buildroot
1.编译说明
1.下载工具链并安装
2.下载uboot源码
3.编译uboot
4.SD卡分区
5.使用dd命令烧写UBoot
6.下载编译linux内核源码
7.下载buildroot-2022.02.8.tar.gz编译根文件系统Buildroot - Making Embedded Linux Easy
方法2: 用buildroot-2022.02.8.tar.gz构建整个系统Buildroot - Making Embedded Linux Easy
1.下载 buildroot-2022.02.8.tar.gz 解压并进入目录配置编译
2.烧写镜像到sd卡
Orange Pi PC Plus与NanoPi NEO使用的都是全志H3这颗4核A7芯片所以可以使用友善之臂官网提供的uboot以及他们维护的linux系统。本文编译使用ubuntu16.04.6.
wiki地址:Building U-boot and Linux for H5/H3/H2+/zh - FriendlyELEC WiKi
根据wiki说明:
链接: https://pan.baidu.com/s/1wEPJx75MICIRptiTW_vV1g?pwd=hkxk 提取码: hkxk
安装方法:
1.解压编译器
mkdir -p /opt/FriendlyARM/toolchain
tar xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/
2.然后将编译器的路径加入到PATH中,用vi编辑vi ~/.bashrc,在末尾加入以下内容:
export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
export GCC_COLORS=auto
3.执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意"."后面有个空格:
. ~/.bashrc
4.测试是否安装成功
输入命令:arm-linux-gcc -v
显示内容包括 gcc version 4.9.3 (ctng-1.21.0-229g-FA) 说明安装成功
git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
apt-get install swig python-dev python3-dev
cd u-boot
make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make ARCH=arm CROSS_COMPILE=arm-linux-
插入SD卡,在ubuntu系统使用 GParted 进行分区一共分两个区,在第一个区之前保留16M字节也就是MBR+Uboot占16字节。
mbr | uboot(无文件系统) | fat16文件系统,256M字节放置boot.cr + 设备树文件 + zImage | ext2分区,剩余所有空间放置文件系统 |
cd u-boot
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
sync && eject /dev/sdX
/dev/sdx请替换为实际的TF卡设备文件名。
sync命令可以确保数据成功写到TF卡中,eject命令用于弹出TF卡。
git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
apt-get install u-boot-tools
cd linux
touch .scmversion
make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
make modules ARCH=arm CROSS_COMPILE=arm-linux-
make modules_install INSTALL_MOD_PATH=./modules ARCH=arm CROSS_COMPILE=arm-linux-
编译完成后会在arch/arm/boot/目录下生成zImage,并且在arch/arm/boot/dts/目录下生成dtb文件,把内核 zImage和 对应设备树 拷贝进SD的第一个区也就是fat16分区(也可以把模块拷贝进去)。
cp arch/arm/boot/zImage /media/SD/boot/
cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb /media/SD/boot/
解压buildroot进入目录执行命令:
make orangepi_pc_plus_defconfig
配置根文件系统
make menuconfig
Toolchain --->
Toolchain type (Buildroot toolchain) --->
(X) External toolchain //选择外部工具链
Toolchain (Arm ARM 2021.07) --->
(X) Custom toolchain //自定义工具链
Toolchain origin (Pre-installed toolchain) --->
(X) Pre-installed toolchain
(/opt/FriendlyARM/toolchain/4.9.3) Toolchain path
External toolchain gcc version (4.9.x) --->
(X) 4.9.x
External toolchain kernel headers series (3.10.x) --->
(X) 3.10.x
External toolchain C library (glibc/eglibc) --->
(X) glibc/eglibc
[*] Toolchain has C++ support?
Kernel --->
[ ] Linux Kernel //取消勾选
Bootloaders --->
[ ] U-Boot //取消勾选
buildroot编译速度很慢需要等比较久,编译完成如图所示:
只要根文件系统编译出来即可,镜像生成错误可以忽略 ,查看镜像的输出文件如图:
把boot.scr放在sd卡的第一个分区,fat16这个分区。挂载rootfs.ext2这个到ubuntu,拷贝里面的内容到sd卡的第二个分区,也就是ext2格式分区,根文件系统制作完了,现在可以把sd插入到orange-pc-plus 板子上了。会发现一直卡在这个地方 Waiting for root device PARTLABEL=rootfs...
打印数据表示没找到根文件系统,回溯启动打印命令发现sd卡是被挂载在系统上的,但是系统并没有把sd卡的第二个分区设定为启动根文件系统分区,所以必须修改启动命令。启动命令在boot.scr这个文件里面,而boot.scr由boot.cmd生成。生成命令为:
mkimage -C none -A arm -T script -d boot.cmd boot.scr
这里的boot.scr是由根文件系统里面的 buildroot-2021.11/board/orangepi/orangepi-pc-plus(因为我们编译使用的是orangepi-pc-plus这个配置文件)boot.cmd生成。
boot.cmd里面默认内容:
setenv fdt_high ffffffff
setenv bootargs console=ttyS0,115200 earlyprintk root=PARTLABEL=rootfs rootwait
fatload mmc 0 $kernel_addr_r zImage
fatload mmc 0 $fdt_addr_r sun8i-h3-orangepi-pc-plus.dtb
bootz $kernel_addr_r - $fdt_addr_r
修改bootarg重新指定启动设备以及初始化程序和文件系统类型:
setenv fdt_high ffffffff
setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk2p2 rootwait init=/linuxrc rootfstype=ext4
fatload mmc 0 $kernel_addr_r zImage
fatload mmc 0 $fdt_addr_r sun8i-h3-orangepi-pc-plus.dtb
bootz $kernel_addr_r - $fdt_addr_r
linux启动完成。
make orangepi_pc_plus_defconfig
make
在 /buildroot-2022.02.8/board/orangepi/orangepi-pc-plus/readme.txt 文件里有说明。
编译完成如下所示:
生成的uboot zimage 设备树 根文件系统roots boot.scr以及可以直接烧写到sd卡的镜像sdcard.img 均在buildroot-2022.02.8/output/images/ 这个文件夹里面:
https://pan.baidu.com/s/17cov-EzUU505lxmUKOY6mA?pwd=sx4a
可以直接把sdcard.img烧写到sd卡里面,使用windows软件 Win32DiskImager 烧写,或者使用命令行烧写到sd卡(也可以使用上面的方式跟sd卡分区分批写入u-boot-sunxi-with-spl.bin ,复制 boot.scr zImage sun8i-h3-orangepi-pc-plus.dtb到fat16分区,挂载rootfs.ext2,把里面的内容拷贝到sd卡的ext2分区):
dd if=sdcard.img of=/dev/sdx //sdx是实际的sd卡映射到ubuntu里面的设备文件名需要修改成自己的sd卡设备文件名。
把sd卡插入到orange pc plus即可启动系统,默认用户名是 root(没有设置密码)。
总结:通过以上内容可以了解linux系统的组成,以及制作这个系统的过程,除了以上方法还可以自行从主线uboot linux下载源码,编译制作启动镜像。
本文uboot linux buildroot相关源码的百度云盘链接:
https://pan.baidu.com/s/17cov-EzUU505lxmUKOY6mA?pwd=sx4a