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中,故选择此版本。

  1. 下载的.xz压缩包解压之后,使用Win32DiskImage烧录进SD卡;
  1. 更新源为中科大源
sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

B. 交叉编译器

arm-linux-gnueabihf

编译样例,编译一个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
  1. Device Drivers -> Block device -> RAM block device support (即选择Y,用于支持ramfs)
  2. 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

参考

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/
posted @   山岚2013  阅读(724)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示