beagleboneblack(BBB)开发板使用NFS挂载根文件系统,tftp下载镜像与设备树

一、文件下载

交叉编译工具链下载地址

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 = dgram
        protocol = udp
        wait = yes
        user = root
        server = /usr/sbin/in.tftpd
        server_args = -s /home/lemonhack/study/linux/tftpboot/
        disable = no
        per_source = 11
        cps = 100 2
        flags = IPv4
}

启动TFTP服务

sudo service tftpd-hpa start

打开/etc/default/tftpd-hpa 文件

sudo vi /etc/default/tftpd-hpa

将其修改为如下所示内容

# /etc/default/tftpd-hpa

TFTP_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_Format

export LC_ALL=C

if [ -z `which bc` ]; then
    echo "no bc binary found"
    exit 1;
fi

if [ $# -ne 1 ]; then
    echo "Usage: $0 <drive>"
    exit 1;
fi

DRIVE=$1

dd if=/dev/zero of=$DRIVE bs=1024 count=1024

SIZE=`fdisk -l $DRIVE | grep Disk | grep bytes | awk '{print $5}'`

echo DISK SIZE - $SIZE bytes

CYLINDERS=`echo $SIZE/255/63/512 | bc`

echo CYLINDERS - $CYLINDERS

sudo sfdisk $DRIVE << EOF
8192,63MiB,0x0C,*
137216,4GiB,,-
EOF

sleep 1

if [ -b ${DRIVE}1 ]; then
    umount ${DRIVE}1
    mkfs.vfat -F 32 -n "boot" ${DRIVE}1
else
    if [ -b ${DRIVE}p1 ]; then
        umount ${DRIVE}p1
        mkfs.vfat -F 32 -n "boot" ${DRIVE}p1
    else
        echo "Cant find boot partition in /dev"
    fi
fi

if [ -b ${DRIVE}2 ]; then
    umount ${DRIVE}2
    mkfs.ext4 -L "rootfs" ${DRIVE}2
else
    if [ -b ${DRIVE}p2 ]; then
        umount ${DRIVE}p2
        mkfs.ext4 -j -L "rootfs" ${DRIVE}p2
    else
        echo "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/24
      dhcp4: false
      gateway4: 192.168.123.1
      nameservers:
        addresses:
        - 8.8.8.8
        search: []
  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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值