BeagleBone Black更新系统及交叉编译(C++/Go)
A. 烧写官方镜像
上官方BeagleBoard.org Latest Firmware Images下载镜像。在此选择:AM3358 Debian 10.3 2020-04-06 4GB eMMC IoT Flasher。
由于购买的BBB板为4G版本,且需要从SD卡烧录到eMMC中,故选择此版本。
- 下载的.xz压缩包解压之后,使用Win32DiskImage烧录进SD卡;
- 更新源为中科大源
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
B. 交叉编译器
编译样例,编译一个gperftools:
git clone https://github.com/gperftools/gperftools
cd gperftools
./autogen.sh
./configure --host=arm-linux-gnueabihf CXX=arm-linux-gnueabihf-g++ CC=arm-linux-gnueabihf-gcc --prefix=<dir>
make -j && make install
sudo cp -d <dir>/lib/* /usr/lib
C. 自制镜像
1. 准备工作
sudo apt-get install flex bison
# download and compile install
http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
http://www.lzop.org/download/lzop-1.04.tar.gz
# 镜像烧录工具
sudo apt install u-boot-tools
# NFS服务
sudo apt install nfs-kernel-server
2. 编译u-boot
git clone https://github.com/beagleboard/u-boot.git
cd u-boot
git checkout v2021.04-bbb.io-am335x-am57xx
# 导入bbb配置文件到 .config,并编译得到u-boot.img及MLO
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j
3. 编译linux kernel
git clone https://github.com/beagleboard/linux.git
cd linux & git checkout 4.14
cp arch/arm/configs/bb.org_defconfig .config
配置kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- Device Drivers -> Block device -> RAM block device support (即选择Y,用于支持ramfs)
- File systems -> 选择Network File Systems (即选择Y)
注意,内核对ramfs大小有限制,默认为16M,自行修改 Default RAM disk size大小。如果后面选择的文件系统不是ramfs,不选1。
编译内核,在arch/arm/boot/dts找到设备树am335x-boneblack.dtb,在arch/arm/boot找到zImage内核映像:
# 编译生成zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs -j
# 编译生成uImage及zImage
# 生成的dtb文件为arch/arm/boot/dts/am335x-boneblack.dtb,uImage/zImage在arch/arm/boot目录
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs LOADADDR=0x80008000
4. busybox制作文件系统 (跳过,暂不制作ramfs)
wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xvf busybox-1.35.0.tar.bz2 && cd busybox-1.35.0
# 配置busybox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
4.1 开始编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j
make install # 安装在./_install目录下
5. 制作SD卡,拷贝文件到SD卡
5.1 制作启动分区,拷贝uboot、kernel等文件到该分区
使用的 USB 读卡器,插入后 Linux /dev/ 目录会显示 /dev/sd* 设备。例如本次操作显示为 /dev/sda,/dev/sda1 两个设备文件;其中 /dev/sda 为整个物理磁盘,/dev/sda1 为分区1。
使用命令 sudo fdisk /dev/sdb 管理磁盘,子命令有:
- a : toggle a bootable flag(设置或取消启动表示)
- b : edit bsd disklabel(编辑 bsd disklabel)
- c : toggle the dos compatibility flag
- d : delete a partition (删除一个分区)
- l : list known partition types (列出已知的分区类型)
- m : print this menu (打印次列表)
- n : add a new partition (增加一个新分区)
- o : create a new empty DOS partition table (建立一个新的空 DOS 分区表)
- p : print the partition table (打印分区表)
- q : quit without saving changes (不保存退出)
- s : create a new empty Sun disklabel
- t : change a partition’s system id
- u : change display/entry units
- v : verify the partition table (验证分区表)
- w : write table to disk and exit (把分区表写入磁盘)
- x : extra functionality (experts only) (额外的功能)
命令(输入 m 获取帮助): p
Disk /dev/sda:7.41 GiB,7948206080 字节,15523840 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3244345d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 8192 7372799 7364608 3.5G c W95 FAT32 (LBA)
命令(输入 m 获取帮助): d
已选择分区 1
分区 1 已删除。
命令(输入 m 获取帮助): n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p): p
分区号 (1-4, 默认 1):
第一个扇区 (2048-15523839, 默认 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15523839, 默认 15523839): +100M
创建了一个新分区 1,类型为“Linux”,大小为 100 MiB。
命令(输入 m 获取帮助): t
已选择分区 1
Hex 代码(输入 L 列出所有代码): L
0 空 24 NEC DOS 81 Minix / 旧 Linu bf Solaris
1 FAT12 27 隐藏的 NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏 或 In c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 ea Rufus 对齐
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC
12 Compaq 诊断 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f4 SpeedStor
16 隐藏的 FAT16 63 GNU HURD 或 Sys af HFS / HFS+ f2 DOS 次要
17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fd Linux raid 自动
1c 隐藏的 W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e 隐藏的 W95 FAT1 80 旧 Minix be Solaris 启动 ff BBT
Hex 代码(输入 L 列出所有代码): b
已将分区“Linux”的类型更改为“W95 FAT32”。
命令(输入 m 获取帮助): p
Disk /dev/sda:7.41 GiB,7948206080 字节,15523840 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3244345d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 2048 206847 204800 100M b W95 FAT32
命令(输入 m 获取帮助): a
已选择分区 1
分区 1 的 可启动 标志已启用。
命令(输入 m 获取帮助): w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
此时,创建第一个分区完成并退出fdisk命令,这个创建的分区100M,为可引导(通过子命令a)的FAT32分区。
随后对 /dev/sda1 进行分区格式化,并设置名称(不然SD卡启动识别不了):
sudo mkfs.vfat -F 32 -n boot /dev/sda1
随后创建挂载点挂载刚创建的boot分区/dev/sda1,并拷贝uboot文件到该分区。
sudo mkdir /media/bbb
sudo mkdir /media/bbb/boot
sudo mount /dev/sda1 /media/bbb/boot
sudo cp u-boot/u-boot.img /media/bbb/boot/
sudo cp u-boot/MLO /media/bbb/boot/
# 进入linux目录
sudo cp arch/arm/boot/uImage /media/bbb/boot/
sudo cp arch/arm/boot/dts/am335x-boneblack.dtb /media/bbb/boot/
ls /media/bbb/boot/
>> MLO am335x-boneblack.dtb u-boot.img uImage
sync
sudo umount /media/bbb/boot
5.2 继续制作rootfs分区,并解压文件系统到该分区
sudo fdisk /dev/sda
命令(输入 m 获取帮助): p
Disk /dev/sda:7.41 GiB,7948206080 字节,15523840 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3244345d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 2048 206847 204800 100M b W95 FAT32
命令(输入 m 获取帮助): n
分区类型
p 主分区 (1个主分区,0个扩展分区,3空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p): p
分区号 (2-4, 默认 2):
第一个扇区 (206848-15523839, 默认 206848):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (206848-15523839, 默认 15523839):
创建了一个新分区 2,类型为“Linux”,大小为 7.3 GiB。
命令(输入 m 获取帮助): p
Disk /dev/sda:7.41 GiB,7948206080 字节,15523840 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3244345d
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 2048 206847 204800 100M b W95 FAT32
/dev/sda2 206848 15523839 15316992 7.3G 83 Linux
命令(输入 m 获取帮助): w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
对 /dev/sda2 进行分区格式化,并设置卷标(设置为ext4格式,在uEnv.txt中写的文件系统格式需要与此相同):
sudo mkfs.ext4 -L rootfs /dev/sda2
最终看到SD卡已经分成一个100M FAT32分区,一个Linux分区,且FAT32分区为启动分区。
查看 /dev/sda1,/dev/sda2 分区后的信息:
sudo file -sL /dev/sda1
>> /dev/sda1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", Media descriptor 0xf8, sectors/track 62, heads 245, hidden sectors 2048, sectors 204800 (volumes > 32 MB), FAT (32 bit), sectors/FAT 1576, serial number 0xcd5e6dfe, label: "boot "
sudo file -sL /dev/sda2
>> /dev/sda2: Linux rev 1.0 ext4 filesystem data, UUID=6b7f9d99-b495-48a2-8f73-b4f937d1fa73, volume name "rootfs" (extents) (64bit) (large files) (huge files)
5.3 文件系统下载
sudo mkdir /media/bbb/rootfs
sudo mount /dev/sda2 /media/bbb/rootfs
sudo chown root:root /media/bbb/rootfs/
sudo chmod 0755 /media/bbb/rootfs/
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-9.8-minimal-armhf-2019-02-16.tar.xz
tar -xvf debian-9.8-minimal-armhf-2019-02-16.tar.xz
cd debian-9.8-minimal-armhf-2019-02-16
sudo tar -xvf armhf-rootfs-debian-stretch.tar -C /media/bbb/rootfs
sync
ls /media/bbb/rootfs
>> bin boot dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var
sudo umount /dev/sda2
5.4 设置uEnv.txt
适用于从SD卡启动kernel及rootfs:
setenv loadaddr 0x80008000;
setenv fdtaddr 0x80F80000;
args=setenv bootargs 'console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait';
loadimage=fatload mmc 0:1 ${loadaddr} uImage;
loadfdt=fatload mmc 0:1 ${fdtaddr} am335x-boneblack.dtb;
uenvcmd=run args; run loadfdt; run loadimage; bootm ${loadaddr} - ${fdtaddr};
适用于从NFS启动:
console=ttyO0,115200n8
ipaddr=192.168.23.2
serverip=192.168.23.1
rootpath=/exports/rootfs
netargs=setenv bootargs console=${console} ${optargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},${nfsopts} rw ip=${ipaddr}:${serverip}:192.168.23.1:255.255.255.0:beaglebone:eth0:none:192.168.23.1
netboot=echo Booting from network ...; tftp ${loadaddr} ${bootfile}; tftp ${fdtaddr} ${fdtfile}; run netargs; bootz ${loadaddr} - ${fdtaddr}
uenvcmd=run netboot
- 启动:插上SD到到BBB板。接上串口,按住S2键,上电,系统会自动启动(接上串口查看)。
搭建NFS
参考
- 硬件开源平台--Beaglebone Black
- beaglebone black 编译buildroot和kernel(SD启动和emmc烧写方法)
- Beaglebone Black 最小Linux从零系统编译
- BeagleBone Black 从零到一 (2 MLO、U-Boot)_spl
- BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)
D. Go项目的编译
GOARCH=arm GOARM=5 go build
E. htop交叉编译
# 交叉编译ncurses
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=/home/hxf0223/work/htop_arm --with-shared
# 交叉编译htop
CC=arm-linux-gnueabihf-gcc ./configure --prefix=/home/hxf0223/work/htop_arm --disable-unicode --host=arm-linux-gnueabihf CPPFLAGS=-I/home/hxf0223/work/ncurses-6.3/include LDFLAGS=-L/home/hxf0223/work/ncurses-6.3/lib
# 传送到BBB,密码 temppwd
scp htop debian@192.168.2.100:/home/debian/
补充:在精简Linux系统中,可能没有terminfo信息,打开htop时ncurses会报错。处理办法:
export TERM=vt100
export TERMINFO=/usr/share/terminfo
mkdir -p /usr/share/terminfo/v
# 从ubuntu系统中的拷贝vt100到目标机器
cp vt100 /usr/share/terminfo/v/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构