一、文件下载
交叉编译工具链下载地址
wget -c https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-i686_arm-linux-gnueabihf.tar.xz
beagleboneblack内核kernel下载地址,切换到tag为4.19.94-ti-r42的分支下载
git clone -b 4.19.94-ti-r42 git://github.com/beagleboard/linux.git
uboot下载地址,切换到v2021.01-bb.org-am335x-am57xx或者v2021.10-bbb.io-am335x分支进行下载
git clone -b v2021.10-bbb.io-am335x https://github.com/beagleboard/u-boot.git
根文件系统下载地址
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.3-minimal-armel-2020-02-10.tar.xz
以上四个文件,我是通过windows直接去网站下载的,因为直接通过ubuntu下载的速度很慢。下载完成之后使用FileZilla传输到ubuntu上面。
解压文件
tar -xvf debian-10.3-minimal-armhf-2020-02-10.tar.xz
unzip linux-4.19.94-ti-r42.zip
unzip u-boot-2021.01-bb.org-am335x-am57xx.zip
二、安装交叉编译工具链
linux下arm交叉编译工具链的安装_wang@xing的博客-CSDN博客
三、编译uboot
进入uboot目录
cd u-boot-2021.01-bb.org-am335x-am57xx
am335x_evm_defconfig配置
sudo apt-get update
sudo apt-get install flex bison lib32z1 libssl-dev
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_defconfig
编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
至此,uboot编译完成
四、编译内核kernel源码
进入内核源码目录
cd ../linux-4.19.94-ti-r42/
配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig
编译生成uImage和zImage,设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs LOADADDR=0x80008000 -j8
编译模块
sudo apt-get install lzop u-boot-tools
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j8
至此,内核编译完成
五、NFS配置
创建NFS挂载的文件夹,以后所有的需要使用NFS服务的文件都放在这个文件夹里面,路径自己指定
cd ~/study/linux
mkdir nfs
mkdir nfs/rootfs
安装NFS服务
sudo apt-get install nfs-kernel-server rpcbind
配置NFS
sudo vi /etc/exports
添加上图白色字体的内容,其中/home/lemonhack/study/linux/nfs为刚才自己创建的NFS文件夹目录
如果是ubuntu18版本,在之后开发板挂载NFS根文件系统时,串口打印信息会提示VFS: Unable to mount root fs via NFS, trying floppy.或者或者报错 Loading:*ww ERROR:File lookup fail 的,或者 mount.nfs: mount system call failed。使得NFS根文件系统挂载不成功,所以还需要修改NFS文件。第一张图片为原始内容,第二张图片为修改后的内容
sudo vi /etc/default/nfs-kernel-server
重启NFS服务
sudo /etc/init.d/nfs-kernel-server restart
至此,NFS服务配置完成
六、TFTP配置
创建TFTP文件夹以存放TFTP文件
cd ~/study/linux/
mkdir tftpboot
chmod 777 tftpboot
搭建TFTP服务器
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
配置TFTP
新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建
sudo vi /etc/xinetd.d/tftp
然后在里面输入如下内容
server tftp
{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /home/lemonhack/study/linux/tftpboot/disable = noper_source = 11cps = 100 2flags = IPv4
}
启动TFTP服务
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件
sudo vi /etc/default/tftpd-hpa
将其修改为如下所示内容
# /etc/default/tftpd-hpaTFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/lemonhack/study/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
重启TFTP服务器
sudo service tftpd-hpa restart
至此,TFTP服务搭建完成
七、解压根文件系统到NFS文件夹下面,并安装模块,同时将内核镜像与设备树复制到TFTP文件夹下面
进入根文件系统文件夹
cd ~/study/linux/bbb/
cd debian-10.3-minimal-armhf-2020-02-10/
解压根文件系统到NFS下的指定目录,使用-C命令来指定目录
sudo tar -xvf armhf-rootfs-debian-buster.tar -C ~/study/linux/nfs/rootfs/
进入内核源码目录
cd ~/study/linux/bbb/linux-4.19.94-ti-r42/
安装模块到根文件系统,找不到交叉编译器的时候,使用source命令来导入交叉编译器的路径,比如我的交叉编译器安装路径为/usr/local/arm/gcc-linaro-6.5.0-2018.12-i686_arm-linux-gnueabihf/bin/,并且将路径变量写入/etc/profile文件的末尾,那么使用source /etc/profile来导入。
su
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig//如果不做这一步,则会找不到交叉编译器
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/lemonhack/study/linux/nfs/rootfs/ modules_install
复制内核镜像与设备树到tftp文件夹下面
su lemonhack
cd ~/study/linux/bbb/linux-4.19.94-ti-r42/
sudo cp arch/arm/boot/zImage arch/arm/boot/dts/am335x-boneblack.dtb ~/study/linux/tftpboot/
八、SD格式化并分区
这里使用从外网找到的脚本来对SD卡进行格式化与分区,脚本内容如下
#! /bin/sh
# mkcard.sh v0.5
# (c) Copyright 2009 Graeme Gregory <dp@xora.org.uk>
# Licensed under terms of GPLv2
#
# Parts of the procudure base on the work of Denys Dmytriyenko
# http://wiki.omap.com/index.php/MMC_Boot_Formatexport LC_ALL=Cif [ -z `which bc` ]; thenecho "no bc binary found"exit 1;
fiif [ $# -ne 1 ]; thenecho "Usage: $0 <drive>"exit 1;
fiDRIVE=$1dd if=/dev/zero of=$DRIVE bs=1024 count=1024SIZE=`fdisk -l $DRIVE | grep Disk | grep bytes | awk '{print $5}'`echo DISK SIZE - $SIZE bytesCYLINDERS=`echo $SIZE/255/63/512 | bc`echo CYLINDERS - $CYLINDERSsudo sfdisk $DRIVE << EOF
8192,63MiB,0x0C,*
137216,4GiB,,-
EOFsleep 1if [ -b ${DRIVE}1 ]; thenumount ${DRIVE}1mkfs.vfat -F 32 -n "boot" ${DRIVE}1
elseif [ -b ${DRIVE}p1 ]; thenumount ${DRIVE}p1mkfs.vfat -F 32 -n "boot" ${DRIVE}p1elseecho "Cant find boot partition in /dev"fi
fiif [ -b ${DRIVE}2 ]; thenumount ${DRIVE}2mkfs.ext4 -L "rootfs" ${DRIVE}2
elseif [ -b ${DRIVE}p2 ]; thenumount ${DRIVE}p2mkfs.ext4 -j -L "rootfs" ${DRIVE}p2elseecho "Cant find rootfs partition in /dev"fi
fi
创建脚本,输入脚本内容
cd ~/study/linux/bbb
vi mkcard.sh
赋予权限
chmod 777 mkcard.sh
插入SD卡,并使用脚本,其中/dev/sdb为sd卡设备,根据自己实际情况设定
sudo ./mkcard.sh /dev/sdb
打开文件夹可以看见SD创建了两个分区,分别为boot分区用来存放uboot启动文件。rootfs分区用来存放根文件系统,在本文中不使用这个分区,因为我打算使用NFS挂载根文件系统。
查看SD卡自动挂载的位置,可以看到SD卡被分为两个分区/dev/sdb1、/dev/sdb2。boot分区所在的位置为/media/lemonhack/boot
df -h
将uboot编译生成的MLO、u-boot.img放在SD卡的boot分区里面。
cd ~/study/linux/bbb/u-boot-2021.01-bb.org-am335x-am57xx/
sudo cp MLO /media/lemonhack/boot/
sudo cp u-boot.img /media/lemonhack/boot/
至此,SD卡可以拔下,然后插入到beagleboneblack里面。
九、ubuntu设置静态ip地址
修改网络文件
sudo netplan generate
自动生成的文件可能在桌面,服务器,云实例等(例如01-network-manager-all.ymal或01-netcfg.yaml)上有不同的文件名,但是/etc/netplan/*.yaml下的所有文件将被netplan读取,sudo vim /etc/netplan/xxxx.ymal
sudo vi /etc/netplan/01-network-manager-all.yaml
输入一下内容
network:ethernets:ens33:addresses:- 192.168.123.150/24dhcp4: falsegateway4: 192.168.123.1nameservers:addresses:- 8.8.8.8search: []version: 2
使用以下netplan命令应用最近的网络更改
sudo netplan apply
ifconfig查看ens33网卡,发现ip地址已经变更成我们想要的地址
关闭VMware,将虚拟机内的网卡设置为桥接模式(主要为了使得开发板能ping通虚拟机)
重启虚拟机即可,
十、串口启动beagleboneblack(BBB)开发板
所需硬件如下:
beagleboneblack开发板
购买beagleboneblack开发板自带的USB线
配置好的SD卡
网线一根
杜邦线三根
USB转TTL模块,这里使用CH340芯片
因为直接使用购买beagleboneblack开发板自带的USB线来作为串口终端的话,看不见uboot的启动画面。作为一个小白的我猜测,应该是没启动内核,所以USB串口的驱动没有加载,无法显示uboot启动画面。使用CH340作为串口可以看见uboot的启动过程。串口连接如下
J1 = GND (Ground)
J4 = RXD (Receive Data)
J5 = TXD (Transmit Data
使用网线的作用是设置开发板ip地址,实现从ubuntu挂载根文件系统和下载内核、设备树。
打开MobaXterm,MobaXterm使用串口的设置参考,不过这里使用的CH340芯片,而不是参考文章中的直接使用购买beagleboneblack开发板自带的USB线来作为串口终端。
串口连接电脑,USB线作为电源,按住beagleboneblack开发板的S2按键,给开发板上电。
设置开发板网络信息
ipaddr:开发板ip地址,可随意指定,只要和ubuntu服务器处于同一个网段
gatewayip:网关
netmask:子网掩码
serverip:ubuntu的ip地址
setenv ipaddr 192.168.123.100
setenv gatewayip 192.168.123.1
setenv netmask 255.255.255.0
setenv serverip 192.168.123.150
saveenv
使用ping命令查看是否能ping通虚拟机
ping 192.168.123.150
设置bootcmd与bootargs环境变量
setenv bootcmd 'tftp 80008000 zImage;tftp 80F80000 am335x-boneblack.dtb;bootz 80008000 - 80F80000'
setenv bootargs 'root=/dev/nfs nfsroot=192.168.123.150:/home/lemonhack/study/linux/nfs/rootfs ip=192.168.123.100:192.168.123.150:192.168.123.1:255.255.255.0::eth0:off console=ttyS0,115200n8'
saveenv
启动内核
boot
不知道为什么,使用debian这个用户无法登录。无奈只有使用root登录。
arm login:root
Password:root
至此,beagleboneblack(BBB)开发板使用NFS挂载根文件系统,tftp下载镜像与设备树成功完成。祝你好运!
参考教程
Beaglebone black 上手教程--uboot_风摇烨的博客-CSDN博客_beaglebone black uboot
制作beagleboneblack系统镜像并从SD卡启动_星空下的夜行的博客-CSDN博客
make modules 和 make modules_install_hello_courage的博客-CSDN博客_make modules_install
Ubuntu 18.04 Server 设置静态IP 的方法 - 腾讯云开发者社区-腾讯云 (tencent.com)