很多年前做的针对BeagleBone Black开发板的镜像制作,因为当时涉及到非标准化的,所以把基本的kernel、uboot和跟文件系统rootfs都做了一遍,文中只做移植,不作定制化的修改。

如果觉得哪里有问题,或者操作有误,欢迎留言斧正。

码文不易,转载请申明出处和链接。

使用bbb工业版移植内核,主要做的是几个方面:

  • 在linux下安装交叉编译器
  • 下载并编译uboot
  • 下载并编译linux
  • 下载rootfs
  • 制作uEnv.txt给予启动
  • 制作sd卡,把相关的镜像复制卡内,即完工

    以下为具体的操作步骤,本文用的linux操作系统为ubuntu16.04

1.安装交叉编译器

安装交叉编译器

sudo apt-get install gcc-arm-linux-gnueabihf

安装完后可以查看交叉编译器版本

arm-linux-gnueabihf-gcc -v

本文交叉编译器版本为gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)

2.下载并编译uboot

以下假设所有的文件和操作路径都是在~/bb-linux

sudo mkdir ~/bb-linux/

下载u-boot,并把文件传进ubuntu

解压

unzip -d ~/bb-linux/ u-boot-master.zip
cd ~/bb-linux/u-boot-master/
git checkout v2017.03-rc2 -b tmp

下载相应的patch

路径:~/bb-linux/u-boot-master

wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2017.03-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2017.03-rc2/0002-U-Boot-BeagleBone-Cape-Manager.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch

编译u-boot

路径:~/bb-linux/u-boot-master

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_boneblack_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

编译完成后在目录下能看到MLO 和 u-boot.img这两个文件。

关于MLO、u-boot,以及am335x的启动流程,可以看BeagleBone Black 从零到一 (1 启动流程),这篇文章写得很详细。

3.linux内核下载编译

下载linux内核源码,本文的源码版本是4.4.49,并把压缩包传进~/bb-linux/下

路径:~/bb-linux/

sudo unzip linux-4.4.zip
cd linuc-4.4/
cp arch/arm/configs/bb_org.defconfig .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs

编译完成后在./arch/arm/boot/下有zImage文件以及dts文件夹

  • 编译内核模块

因为在后续的使用过程中发现,spi1和sound card的口冲突了导致spi1不能用,所以在编译之前取消sound card模块的加载

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

选择Device Drivers ---> < M > Sound card support ---

使用空格键取消,变成< > Sound card support ---

然后保存退出,编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

4 文件系统rootfs下载

  • Debian 8
User Password
debian temppwd
root root

路径:~/bb-linux

下载debian8系统

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.7-minimal-armhf-2017-01-14.tar.xz
  • 验证sha256sum
sha256sum debian-8.7-bare-armhf-2017-02-14.tar.xz
159e1a6addc35bbfff03b5eafd5cb741086a8a016d5ab9572ab122ce64d63e5e debian-8.7-bare-armhf-2017-01-14.tar.xz
  • 解压
tar xf debian-8.7-bare-armhf-2017-01-14.tar.xz

5 准备烧写sd卡

假设microSD卡插进ubuntu后显示为/dev/sdb1,可以用sudo fdisk -l来查看

擦除microSD卡

sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10
  • 安装u-boot
sudo dd if=~/bb-linux/u-boot-master/MLO of=/dev/sdb count=1 seek=1 bs=128k
sudo dd if=~/bb-linux/u-boot-master/u-boot.img of=/dev/sdb count=2 seek=1 bs=384k
  • 检查sfdisk的版本
sudo sfdisk --version
#sfdisk,来自 util-linux 2.27.1

如果sfdisk >=2.26.x

sudo sfdisk /dev/sdb <<-__EOF__
4M,,L,*
__EOF__

如果sfdisk <=2.25.x

sudo sfdisk --unit M /dev/sdb <<-__EOF__
4M,,L,*
__EOF__

如果命令过程中出现

Checking that no-one is using this disk right now ... FAILED
This disk is currently in use - repartitioning is probably a bad idea.
Umount all file systems, and swapoff all swap partitions on this disk.
Use the --no-reread flag to suppress this check.
sfdisk: Use the --force flag to overrule all checks.

那么先卸载

sudo umount /dev/sdb1
  • 格式化分区

    因为mkfs.ext4 1.43的原因 ,必须确保关掉metadata_csum和64bit
sudo mkfs.ext4 -V
#mke2fs 1.42.13 (17-May-2015)
#使用 EXT2FS Library version 1.42.13

如果mkfs.ext4 >=1.43

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit /dev/sdb1

如果mkfs.ext4 <=1.42

sudo mkfs.ext4 -L rootfs  /dev/sdb1

挂载分区

sudo mkdir -p /media/rootfs/
sudo mount /dev/sdb1 /media/rootfs/

备份一下u-boot

sudo mkdir -p /media/rootfs/opt/backup/uboot/
sudo cp -v ~/bb-linux/u-boot-master/MLO /media/rootfs/opt/backup/uboot
sudo cp -v ~/bb-linux/u-boot-master/u-boot.img /media/rootfs/opt/backup/uboot

如果想清除在eMMC里旧的u-boot,那么增加u-Env.txt一下内容

uEnv.txt

##This will work with: Angstrom's 2013.06.20 u-boot.
loadaddr=0x82000000
fdtaddr=0x88000000
rdaddr=0x88080000
initrd_high=0xffffffff
fdt_high=0xffffffff
#for single partitions:
mmcroot=/dev/mmcblk0p1
loadximage=load mmc 0:1 ${loadaddr} /boot/vmlinuz-${uname_r}
loadxfdt=load mmc 0:1 ${fdtaddr} /boot/dtbs/${uname_r}/${fdtfile}
loadxrd=load mmc 0:1 ${rdaddr} /boot/initrd.img-${uname_r}; setenv rdsize ${filesize}
loaduEnvtxt=load mmc 0:1 ${loadaddr} /boot/uEnv.txt ; env import -t ${loadaddr} ${filesize};
loadall=run loaduEnvtxt; run loadximage; run loadxfdt;
mmcargs=setenv bootargs console=tty0 console=${console} ${optargs} ${cape_disable} ${cape_enable} root=${mmcroot} rootfstype=${mmcrootfstype} ${cmdline}

然后拷贝进

sudo cp ./uEnv.txt /media/rootfs/
  • 安装linux 内核和文件系统

为了bbb用户知道用的是什么版本的系统,那么作如下操作,x为具体的版本号,Z为型号

export kernel_version=4.4.x.Z

拷贝文件系统

~/bb-linux/

sudo tar xfvp ~/bb-linux/*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync
sudo chown root:root /media/rootfs/
sudo chmod 755 /media/rootfs/

在/boot/uEnv.txt里设置uname_r

sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

拷贝内核镜像

sudo cp -v ~/bb-linux/linux-4.4/arch/arm/boot/zImage /media/rootfs/boot/vmlinuz-${kernel_version}

拷贝内核 Device Tree Binaries(dts)

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo cp ~/bb-linux/linux-4.4/arch/arm/boot/dts/am335x-boneblack.dtb /media/rootfs/boot/dtbs/${kernel_version}/
  • 拷贝内核模块Kernel Modules
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/media/rootfs
  • File Systems Table(/etc/fstab)
sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"
  • 网络设置
sudo vim /media/rootfs/etc/network/interfaces

增加以下内容:

/media/rootfs/etc/network/interfaces

auto lo
iface lo inet loopback auto eth0
iface eth0 inet dhcp

为了使能Ethernet为eth0

sudo vim /media/rootfs/etc/udev/rules.d/70-persistent-net.rules

增加以下内容:

/media/rootfs/etc/udev/rules.d/70-persistent-net.rules

# BeagleBone: net device ()
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

更新microSD卡系统的源

sudo vim /media/rootfs/etc/apt/source.list

更改为以下内容

deb http://mirrors.ustc.edu.cn/debian jessie main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie main contrib non-free
deb http://mirrors.ustc.edu.cn/debian jessie-proposed-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie-proposed-updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian jessie-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie-updates main contrib non-free

同步microSD卡,让文件写入microSD卡,并且卸载microSD卡,至此,系统基本能跑通了。

sync
sudo umount /media/rootfs

插入microSD卡后,系统应该正常工作了,登录账户密码

  • 增加capemgr:v4.4.x+
git clone https://github.com/beagleboard/bb.org-overlays.git
cd ./bb.org-overlays

更新dtc:

./dtc-overlay.sh
./install.sh

在/boot/uEnv.txt下增加以下内容,如有需要开机自启动的cape,那么就增加在cape_enable下即可

dtb=am335x-boneblack-overlay.dtb
#cape_disable=bone_capemgr.disable_partno=
#cape_enable=bone_capemgr.enable_partno=
  • 增加usb连网
sudo apt-get install udhcpd
sudo vim /etc/network/interfaces

增加以下内容

/etc/network/interfaces

#Ehternet/RNDIS gadget (g_ether)
#... or on host side, usbnet and random hwaddr
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.252
network 192.168.7.0
gateway 192.168.7.1

下载并且编译脚本

wget -c https://raw.github.com/RobertCNelson/tools/master/scripts/beaglebone-black-g-ether-load.sh
chmod +x beaglebone-black-g-ether-load.sh
sudo ./beaglebone-black-g-ether-load.sh

BeagleBone Black的内核移植-从零开始制作镜像的更多相关文章

  1. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  2. linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号 ...

  3. Linux内核移植

    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核 下面以Linux2.6.30.4内核移植到gec2440为例: 一.准备工作:建立工作目录,下载内核 ...

  4. linux内核移植 I

    根据tx2440的文档, 目标也比较简单, 先编译成功, 再烧录, 根文件系统, busybox 这些. A. 准备 1. 解压tar, 修改根Makefile ARCH ?= arm CROSS_C ...

  5. Docker之commit制作镜像

    一.docker是什么? Docker是一个为开发人员和系统管理员提供分布式应用程序的开放平台.它是一个开源的容器引擎,基于Go语言并遵从Apche2.0协议开源. 功能:Docker可以让开发者打包 ...

  6. 【制作镜像】BCEC制作镜像

    如要制作的新镜像已存在标准版本镜像,即linux发行版本相同(此处指CentOS6.5 64位),可利用BCEC制作. 在BCEC创建centos6.5系统的可联外网的虚机,ssh到此虚机,用yum方 ...

  7. 从零开始制作Minecraft启动器(C++开源)

    从零开始制作Minecraft启动器(C++开源) 新手飙车了~~~,MC启动器源码大放送,随心所欲打造自己的专属MC启动器,这不是易语言,是C++...分析原理,关键源码都有详细的注释,代码编好就打 ...

  8. 【转】 linux内核移植和网卡驱动(二)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708911.html 一,内核移植步骤: 1, 修改顶层目录下的Makefile ARCH       ...

  9. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

随机推荐

  1. Mybatis入门学习笔记

    1.定义别名 在sqlMapConfig.xml中,编写如下代码: <!-- 定义别名 --> <typeAliases> <!-- type: 需要映射的类型 alia ...

  2. Web下文件上传下载的路径问题

    工程结构

  3. 驱动开发--【字符设备、块设备简介】【sky原创】

    驱动开发   字符设备,块设备,网络设备   字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问   EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...

  4. 八大最安全的Linux发行版,具备匿名功能,做服务器的首选,web,企业服务器等

    10 best Linux distros for privacy fiends and security buffs in 2017 Introduction The awesome operati ...

  5. mysql数据库查询库中所有表所占空间大小

    SELECT CONCAT(table_schema,'.',table_name) AS 'TABLE_NAME', CONCAT(, ),'M') AS 'ROW_SIZE', CONCAT( ) ...

  6. Linux清除文件内容的几种方法

    # 清空或删除大文件内容的五种方法: # 法一:通过重定向到 Null 来清空文件内容 $ >test.sh # 法二:使用 ‘true' 命令重定向来清空文件 $ true > test ...

  7. centos7.2环境编译安装mysql5.5.48

    一.安装cmake编译工具 跨平台编译器 查看是否已经安装了gcc # rpm -qa | grep gcc # yum install -y gcc-c++ # yum install -y cma ...

  8. jquery引入

    网络地址:http://code.jquery.com/jquery-2.2.0.min.js 在需要的页面中直接使用网络地址,就不需要本地文件 <script type="text/ ...

  9. GBDT学习

    白话GBDT: https://blog.csdn.net/qq_26598445/article/details/80853873 优点: 预测精度高 适合低维数据 能处理非线性数据,该版本GBDT ...

  10. 服务发现之consul的介绍、部署和使用

    什么是服务发现 微服务的框架体系中,服务发现是不能不提的一个模块.我相信了解或者熟悉微服务的童鞋应该都知道它的重要性.这里我只是简单的提一下,毕竟这不是我们的重点.我们看下面的一幅图片:     图中 ...