您现在的位置是:首页 >其他 >编译odroid-xu4的Ubuntu系统kernel操作指导网站首页其他
编译odroid-xu4的Ubuntu系统kernel操作指导
1. 下载kernel和gcc
1.1 下载kernel源码
ODROID-XU4的kernel源码下载路径:https://github.com/hardkernel/linux/tree/odroidxu4-4.9.y
下载方式选择Download ZIP或使用git都可;
这里,我尝试通过git clone将kernel源码下载到本地Ubuntu系统,git命令如下:
git clone https://github.com/hardkernel/linux.git -b odroidxu4-4.9.y
但git下载时间很长甚至出现断连的情况,而通过Download ZIP方式会较快下载完成。
1.2 安装配套版本的gcc工具
gcc工具下载链接:
http://dn.odroid.com/ODROID-XU/compiler/arm-eabi-4.6.tar.gz
1.2.1 gcc工具包放入/opt/toolchains
gcc工具包下载到本地Downloads目录后,将其放入到/opt/toolchains目录,操作命令如下:
$ sudo mkdir /opt/toolchains
$ sudo tar xvfz arm-eabi-4.6.tar.gz -C /opt/toolchains
示例:
1.2.2 添加环境变量到~/.bashrc文件中
打开.bashrc文件:
vim ~/.bashrc
或
vim $HOME/.bashrc
在.bashrc文件的末尾添加以下内容,这里是通过vim
打开.bashrc文件的:
export ARCH=arm
export PATH=${PATH}:/opt/toolchains/arm-eabi-4.6/bin
export CROSS_COMPILE=arm-eabi-
示例:
添加完成后,执行<:wq
>保存退出,可以使用cat ~/.bashrc
命令查看环境变量是否添加成功;
之后,使用source命令保留当前shell配置的环境变量(source命令通常用于保留、更改当前shell中的环境变量),命令如下:
source ~/.bashrc
这样,当系统重启之后,先前新增或修改的环境变量依然能够使用。
1.2.3 检查gcc工具是否安装成功
执行如下命令:
arm-eabi-gcc -v
从中可以看到gcc已安装成功,显示当前的path和version
1.2.4 有关安装gcc的其他问题
事实上,在安装完gcc后,也不一定能够完全可以使用,如:
- gcc交叉编译器与系统不兼容,如:64位Linux系统下无法兼容32位交叉编译器;
- 在gcc编译时报错,提示gcc未找到;
- gcc版本过多,需要切换到指定的gcc版本;
上面3个问题的解决方式,均可以在网上找到解决方式,这里不再做过多描述。
2. 编译kernel
2.1 解压kernel并授权777权限
将通过Download ZIP方式下载好的zip压缩文件存放到新建的xu4-kernel目录下,使用unzip命令进行解压:
unzip linux-odroidxu4-4.9.y.zip
解压完成后,再进行文件夹授权:
chmod -R 777 *
2.2 编译kernel源码
进入linux-odroidxu4-4.9.y目录中,configure Kernel:
cd linux-odroidxu4-4.9.y
make odroidxu4_defconfig
修改kernel配置(可选):
make menuconfig
执行上面的make menuconfig
命令后,会跳转至kernel配置界面,如下:
按照自己的需求配置完成之后,选择“Exit”退出该界面
之后,编译kernel:
make -j8/-j16
2.3 编译失败及解决方法
我在编译过程中,碰到编译失败的模块,如下所示:
报错模块出现在drivers/net/wireless/rtl8723du中,排查对应的rtw_cmd.c文件,未能找到报错原因,且该模块在系统中未能用到,最后只好去掉对rtl8723du模块的make操作,操作如下:
进入drivers/net/wireless目录,打开makefile文件,注释掉对rtl8723du模块的编译
之后,kernel编译便通过了
3. 更新kernel到指定存储设备
假设USB存储卡读卡器被分配在/dev/sdb上
3.1 挂载存储卡
3.1.1 若存储卡为eMMC卡
执行如下操作命令:
mkdir -p mount
mount /dev/sdb1 ./mount
cp -f arch/arm/boot/zImage /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu4.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3-lite.dtb /media/boot
sync
之后,取消挂载/dev/sdb1
,重新挂载到/dev/sdb2
上,执行剩余的命令:
umount ./mount
mount /dev/sdb2 ./mount
make modules_install ARCH=arm INSTALL_MOD_PATH=./mount && sync && sudo umount ./mount
rm -rf mount
3.1.2 若存储卡为eMMC卡
执行如下操作命令:
mkdir -p mount
mount /dev/sdb ./mount
make modules_install
cp -f arch/arm/boot/zImage /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu4.dtb /media/boot
cp -f arch/arm/boot/dts/exynos5422-odroidxu3-lite.dtb /media/boot
sync
3.2 确认文件无误后,reboot
在重新启动之前,检查所有必要的文件是否就位,如下所示,文件大小会有所不同:
$ ls -l /media/boot/
total 14756
-rwxr-xr-x 1 root root 9536 Oct 25 23:29 boot.ini
-rwxr-xr-x 1 root root 753 Aug 20 22:38 boot.ini.default
-rwxr-xr-x 1 root root 62565 Nov 2 01:24 exynos5422-odroidxu3.dtb
-rwxr-xr-x 1 root root 61814 Nov 2 01:24 exynos5422-odroidxu3-lite.dtb
-rwxr-xr-x 1 root root 62225 Nov 2 01:24 exynos5422-odroidxu4.dtb
-rwxr-xr-x 1 root root 61714 Oct 25 23:30 exynos5422-odroidxu4-kvm.dtb
-rwxr-xr-x 1 root root 9996513 Nov 2 01:27 uInitrd
-rwxr-xr-x 1 root root 4844744 Nov 2 01:24 zImage
最后,reboot,即可更新系统中的kernel
这里需要注意的是,存储卡中存放的Ubuntu系统版本和kernel版本需要配套,否则可能会出现kernel更新失败的情况。