很多年前做的针对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. python - class类 (三) 类的组合

    类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...

  2. Android避免OOM(内存优化)

    Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...

  3. ubuntu 14.04 安装 eclipse

    在安装 eclipse 之前必须先安装 jdk 1. 卸载默认的 jdk,以防安装出错 sudo apt-get purge openjdk* 2. 安装 jdk1.8.0_111 下载jdk1.8. ...

  4. Latex 算法Algorithm

    在计算机科学当中,论文当中经常需要排版算法.相信大家在读论文中也看见了很多排版精美的算法.本文就通过示例来简要介绍一下 algorithms 束的用法.该束主要提供了两个宏包,包含两种进行算法排版的环 ...

  5. 基于theano的降噪自动编码器(Denoising Autoencoders--DA)

    1.自动编码器 自动编码器首先通过下面的映射,把输入 $x\in[0,1]^{d}$映射到一个隐层 $y\in[0,1]^{d^{'}}$(编码器): $y=s(Wx+b)$ 其中 $s$ 是非线性的 ...

  6. linux 定期清除日志

    clearLog.sh #!/bin/sh find /usr/local/apache/logs -mtime + 30 -name "*.log" -exec rm {} \; ...

  7. linux 查看用户上次修改密码的日期【转】

    1.找到以下文件: cat /etc/shadow 第三段字符就是最近一次密码修改的天数,此数字是距离1970年1月1日的天数.   2.用以下命令计算: date -u -d "1970- ...

  8. [学习笔记]Java代码中各种类型变量的内存分配机制

    程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而 ...

  9. TomCat安装配置教程

    一.JDK的安装与配置 1.从官网下载jdk,注意是jdk不是jre.最好从官网下载,也可以直接度娘. 2.下载完毕后,安装jdk,​直接按照安装向导的提示安装即可,安装时可以自己选择安装路径,我的安 ...

  10. Jmeter接口测试实例图文示例

    以getObjectByCode接口为例,用jmeter2.13来进行接口测试. 测试前准备: 测试工具及版本:jmeter 2.13 r1665067(须包含__MD5函数) 示例接口:8.1根据单 ...