如何编译树莓派内核

老实说,对于从来没有用过玩过Linux(甚至没有基本的Linux管理经验)的我来说,编译内核实在是一个比较挑战的事情。

不过结果还是好的,最终完成了一次完整的编译,在这里记录一下(参考网页在这里这里

 

主要步骤如下

  1. 虚机:[可选]新建交叉编译平台
  2. 下载:源代码、编译器、固件文件和一些关联工具
  3. 编译:内核、模块
  4. 拷贝:将生成的各种文件替换原树莓派系统的文件

 

  1. 虚机

树莓派上编译内核实在是太慢,所以重装了一个Ubuntu的虚拟机,虚拟机的安装可以参考这里

同时为了后续拷贝文件的方便,需要安装SSH服务,可以参考这里

-install ssh services

sudo apt-get install openssh-server openssh-client

sudo gedit /etc/ssh/sshd_config

sudo /etc/init.d/ssh stop

sudo /etc/init.d/ssh start

sudo /etc/init.d/ssh restart

-examples:

ssh localhost

ssh user@your-server-ip-address

ssh vivek@userver.mydomain.com

 

  1. 下载

在虚拟机中新建目录后,分别下载固件,源码,编译器(分别新建指定的文件夹)

mkdir rasperberrypi

cd raspberrypi

git clone git://github.com/raspberrypi/firmware.git PRiFirmware

git clone git://github.com/raspberrypi/linux.git RpiLinux

git clone git://github.com/raspberrypi/tools.git RpiTools

 

不过,如果在虚拟机中下载太慢也可以在主机中使用下载工具下载,例如使用以下地址下载3.6版本的内核

 

对于虚拟机和树莓派中的文件操作,对于我来说,推荐使用Win SCP,点击这里下载

 

如果网络环境需要代理,虚拟机中可以如下设置

sudo nano /etc/apt/apt.conf

Acquire::http::Proxy "http://web-proxy.corp.company.com:8080";

 

  1. 编译

以下操作都在root用户下执行

 

使用Win SCP递归的方式将源代码文件夹的运行属性添加上

 

清空原先的配置信息

make mrproper

cd /home/andy/raspberrypi/RpiLinux/

 

添加两个环境变量

export KERNEL_SRC=/home/andy/raspberrypi/RpiLinux/

export CCPREFIX=/home/andy/raspberrypi/RpiTools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

 

导出树莓派上的配置信息,并拷贝到内核源代码的根目录

zcat /proc/config.gz > .config

 

在此基础上设置一次树莓派的配置信息(如果不明白意义,直接回车保留默认值即可)

apt-get install libncurses5-dev

ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig

 

对配置还可以进行微调

ARCH=arm CROSS_COMPILE=${CCPREFIX} make menuconfig

 

开始编译内核,如果CPU多核,可以添加-j参数(数字为内核数+1)

ARCH=arm CROSS_COMPILE=${CCPREFIX} make -j5

 

如果需要详细的日志

ARCH=arm CROSS_COMPILE=${CCPREFIX} make -j5 &>log

--undefined reference to 'sin'; add '-lm' to make file command line

 

编译模块

ARCH=arm CROSS_COMPILE=${CCPREFIX} make modules

 

  1. 拷贝

生成内核文件,并拷贝到树莓派根目录的boot文件夹

cd /home/andy/raspberrypi/RpiTools/mkimage

./imagetool-uncompressed.py /home/andy/raspberrypi/RpiLinux/arch/arm/boot/zImage

copy .img to RPI's boot folder

 

生成模块文件,并将这些文件覆盖掉树莓派的/boot/lib文件夹下的文件

export MODULES_TEMP=~/modules

ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} make modules_install

copy and overwrite files from lib to RPI's /root/lib

 

拷贝下载的固件包firmware/boot中文件,替换树莓派中boot文件夹下的文件

bootcode.bin

fixup.dat

start.elf

copy and overwrite files from firmware/boot to RPI's boot folder

 

拷贝下载的固件包firmware/hardfp/opt/中VC文件夹,覆盖树莓派的boot/opt/VC文件夹

VC

copy and overwirte folder from firmware/hardfp/opt/ to RPI's boot opt folder

 

结束

重启树莓派,输入uname –a命令就可以看到编译后内核的版本(我的是越变越小,呵呵呵)

原来的版本

现在的版本

 

Andy Yang

2014-4-18

posted @ 2014-04-18 17:24  Andy Yang  阅读(3703)  评论(0编辑  收藏  举报