“Linux开发环境搭建/编译/打包”的版本间的差异
(→常见问题) |
|||
(未显示同一用户的13个中间版本) | |||
第4行: | 第4行: | ||
==安装所需组件== | ==安装所需组件== | ||
*同Android部分 | *同Android部分 | ||
+ | ==部署交叉编译工具链== | ||
+ | 用于编译busybox和开发用户应用程序,若不需要这些可忽略此步骤。 | ||
+ | |||
+ | 下载工具链: | ||
+ | |||
+ | [http://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/arm-linux-gnueabihf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz(适用A33/A40i)] | ||
+ | |||
+ | [http://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/aarch64-linux-gnu/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.xz gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.xz(适用A64/A133)] | ||
+ | |||
+ | 解压工具链(以gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf为例): | ||
+ | |||
+ | sudo tar xvf gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz -C /opt | ||
+ | |||
+ | 配置环境变量(以gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf为例): | ||
+ | |||
+ | gedit /etc/profile | ||
+ | |||
+ | 在结尾添加export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin,保存后重启系统。 | ||
+ | |||
=编译步骤= | =编译步骤= | ||
==解压源代码== | ==解压源代码== | ||
第11行: | 第30行: | ||
==源码结构== | ==源码结构== | ||
− | + | 对于A33/A64/A40i: | |
− | + | SPL(底层引导代码):brandy | |
− | + | U-Boot:brandy/uboot-xxxx.xx | |
− | 系统配置(env. | + | Linux内核:linux-3.x |
+ | |||
+ | 系统配置(env.txt和fex文件等):tools/pack/chips/sunxiwxpx/config | ||
+ | |||
+ | |||
+ | 对于A133: | ||
+ | |||
+ | SPL(底层引导代码):brandy | ||
+ | |||
+ | U-Boot:brandy/brandy-2.0/uboot-2018 | ||
+ | |||
+ | Linux内核:kernel/linux-4.9 | ||
+ | |||
+ | 系统配置(env.txt和fex文件等):device/config/chips/a133/config | ||
==编译U-Boot== | ==编译U-Boot== | ||
第28行: | 第60行: | ||
==定制rootfs并打包固件== | ==定制rootfs并打包固件== | ||
+ | Linux系统需要有一套根文件系统(rootfs)来实现相应的应用功能。rootfs的来源: | ||
+ | ===使用第三方的rootfs=== | ||
+ | 可直接下载做好的rootfs包,解压到myrootfs/rootfs目录下即可。例如使用光盘资料中的Ubuntu_LXDE: | ||
+ | |||
+ | $ tar rootfs_ubuntu1604lts_lxde_aarch64.tar.gz -C . | ||
+ | |||
+ | 还有Linaro等第三方开源组织提供的rootfs可用,可自行尝试移植: | ||
+ | [http://releases.linaro.org/archive/ http://releases.linaro.org/archive/] | ||
+ | ===使用debootstrap制作rootfs=== | ||
+ | 使用工具脚本debootstrap可以制作基于Debian/Ubuntu的rootfs,这里不做详细介绍,可参考《[https://blog.csdn.net/qq_36956154/article/details/100606619 debootstrap 制作arm64位根文件系统]》。 | ||
+ | ===使用busybox制作rootfs=== | ||
+ | 若需要体积最小的rootfs,可使用万能工具箱busybox构建最小系统。这里不做详细介绍,可参考《[https://blog.csdn.net/u012247418/article/details/106021389 基于busybox构建rootfs]》 | ||
+ | |||
+ | |||
+ | 注:无论采用哪种方式构建rootfs,必须确认下载/编译出的代码CPU平台是否为对应处理器的:A33/A40i为armel,A64/A133为aarch64。 | ||
+ | |||
+ | 对于A33/A64/A40i: | ||
+ | |||
+ | 制作好rootfs后,修改myrootfs/make_ext4fs.sh中的PARTITION_SIZE的值,使其大于整个rootfs的体积(单位MB)。最后执行: | ||
+ | |||
+ | $ ./pack_linux_firmware.sh | ||
打包好的固件位于lichee/tools/pack下面。 | 打包好的固件位于lichee/tools/pack下面。 | ||
+ | |||
+ | |||
+ | 对于A133: | ||
+ | |||
+ | rootfs为已打包好的形式提供,位置:device/config/rootfs_tar/rootfs_ubuntu_base_1604lts.tar.bz2 | ||
+ | |||
+ | 若需要修改,可将其解压到device/config/rootfs_tar/rootfs中后修改(chroot脚本为当前目录下的ch-mount.sh),改完后再打包起来覆盖原来的rootfs_ubuntu_base_1604lts.tar.bz2。最后执行: | ||
+ | |||
+ | $ ./pack_linux_firmware.sh | ||
+ | |||
+ | 打包好的固件位于out下面。 | ||
+ | |||
+ | (注意:需要确保build/mkcmd.sh脚本中: | ||
+ | |||
+ | fakeroot mkfs.ubifs -m 4096 -e 258048 -c 640 -F -x zlib -r ${ROOTFS} -o ${LICHEE_PLAT_OUT}/rootfs.ubifs | ||
+ | |||
+ | 该行命令中-c参数,设定的值需大于rootfs的实际大小(-c为ubifs块数,需换算为字节数),否则打包rootfs时会报错!) | ||
=常见问题= | =常见问题= | ||
− | + | A:编译内核时提示awk: line 2: function strtonum never defined | |
+ | |||
+ | Q:主机系统缺少gawk,执行下列命令安装: | ||
+ | |||
+ | sudo apt-get install gawk | ||
+ | |||
+ | |||
+ | A:打包后的固件烧录后无法启动,Console打印JBD2: Unrecognised features on journal | ||
+ | |||
+ | Q:出现该问题主要是由于主机系统上新版的mkfs.ext4工具在制作镜像时部分默认的特性在全志的内核上不支持。解决方法为去掉文件系统中的has_journal选项: | ||
+ | |||
+ | 修改myrootfs/make_ext4fs.sh的末尾添加: | ||
+ | |||
+ | tune2fs -O ^has_journal rootfs.ext4 | ||
+ | |||
+ | 保存后重新打包固件即可。 | ||
+ | |||
+ | |||
+ | A:打包后的固件烧录后无法启动,Console打印couldn't mount RDWR because of unsupported optional features (400) | ||
+ | |||
+ | Q:出现该问题主要是由于主机系统上新版的mkfs.ext4工具在制作镜像时部分默认的特性在全志的内核上不支持。解决方法为去掉文件系统中的metadata_csum选项: | ||
+ | |||
+ | 修改myrootfs/make_ext4fs.sh中的第6行,在末尾添加-O ^metadata_csum: | ||
+ | |||
+ | mkfs.ext4 rootfs.ext4 -O ^metadata_csum | ||
+ | |||
+ | 保存后重新打包固件即可。 | ||
+ | |||
+ | |||
+ | A:我的核心板eMMC配置为8GB,但为何系统内显示可用空间只有几百MB了?(df -h查看) | ||
+ | |||
+ | Q:首先bootloader和kernel等会占用一部分空间,实际可用空间肯定不到8GB的。其次打包的ext4卷空间小于等于eMMC中rootfs所在分区的实际大小(分区大小在sys_partition.fex中查看和修改),第一次启动后需要用resize2fs命令扩展ext4卷到满空间才可以,方法为在核心板系统上执行下列命令: | ||
+ | |||
+ | $ resize2fs /dev/mmcblk0p7 | ||
+ | |||
+ | 光盘资料里提供的已经做好的基于Ubuntu的rootfs已经包含了在第一次启动时自动执行此命令的脚本,但如果系统启动时resize_partition报错且分区未能自动扩展时,需要修改rootfs里的resize_partition.sh,在第二行空白添加:<p>sleep 5</p>保存后重新打包即可。 | ||
+ | |||
+ | |||
+ | A: 如何修改rootfs所在分区的大小? | ||
+ | |||
+ | Q: 修改sys_parition.fex文件: | ||
+ | |||
+ | 对于A33/A64/A40i:tools/pack/chips/芯片代号/configs/default/sys_partition_linux.fex | ||
+ | |||
+ | 对于A133:device/config/chips/a133/configs/default/sys_partition.fex | ||
+ | |||
+ | 找到name = rootfs字段,修改下面的size,计算方法:该size的单位为512B,例如eMMC容量为8GB,则8*1024*1024*1024/512=16777216,然后减出上面boot等分区占用的size数后即为这里rootfs的size。修改完成后重新pack生效。 | ||
+ | |||
+ | 若遇到pack报错或无法烧录,请检查这里的分区size设置是否合理! | ||
+ | |||
+ | |||
+ | A:Linux系统登录的用户名和密码? | ||
+ | |||
+ | Q:用户名root密码root(桌面版:用户名hddz密码hd12345678) | ||
+ | |||
+ | |||
+ | A:编译后的固件为什么没有桌面? | ||
+ | |||
+ | Q:使用带LXDE桌面环境的rootfs,屏幕上才会有桌面显示! | ||
+ | |||
− | + | A:为何桌面系统无法使用蓝牙/HDMI等外设? | |
− | + | Q:当前版本的rootfs尚未添加bluez的支持和双屏显示支持。若需要切换到HDMI显示,可参考Android部分定制HDMI显示输出的步骤修改FEX文件实现。未来会完善这些功能,请随时关注更新! | |
− | |||
− | + | A:无桌面的系统如何测试相关功能? | |
− | + | Q:请查阅相关资料学习Linux操作相关外设的方法。例如测试Wi-Fi需要安装和配置wpa_supplicant。 | |
− | + | Ubuntu_Base的rootfs为最小系统,仅附带系统最基础的功能组件,若需增加软件包可通过以太网联网后通过apt-get命令安装。 |
2022年5月16日 (一) 13:39的最新版本
目录
编译环境搭建
安装Ubuntu操作系统
- 同Android部分
安装所需组件
- 同Android部分
部署交叉编译工具链
用于编译busybox和开发用户应用程序,若不需要这些可忽略此步骤。
下载工具链:
gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz(适用A33/A40i)
gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.xz(适用A64/A133)
解压工具链(以gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf为例):
sudo tar xvf gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz -C /opt
配置环境变量(以gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf为例):
gedit /etc/profile
在结尾添加export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin,保存后重启系统。
编译步骤
解压源代码
mkdir HDA64_Linux
tar xvf HDA64_Linux.tar.gz -C HDA64_Linux/
源码结构
对于A33/A64/A40i:
SPL(底层引导代码):brandy
U-Boot:brandy/uboot-xxxx.xx
Linux内核:linux-3.x
系统配置(env.txt和fex文件等):tools/pack/chips/sunxiwxpx/config
对于A133:
SPL(底层引导代码):brandy
U-Boot:brandy/brandy-2.0/uboot-2018
Linux内核:kernel/linux-4.9
系统配置(env.txt和fex文件等):device/config/chips/a133/config
编译U-Boot
默认无需编译。若要修改U-Boot,编译方法同Android部分。
编译内核
直接执行下列命令:
$ ./build.sh
定制rootfs并打包固件
Linux系统需要有一套根文件系统(rootfs)来实现相应的应用功能。rootfs的来源:
使用第三方的rootfs
可直接下载做好的rootfs包,解压到myrootfs/rootfs目录下即可。例如使用光盘资料中的Ubuntu_LXDE:
$ tar rootfs_ubuntu1604lts_lxde_aarch64.tar.gz -C .
还有Linaro等第三方开源组织提供的rootfs可用,可自行尝试移植: http://releases.linaro.org/archive/
使用debootstrap制作rootfs
使用工具脚本debootstrap可以制作基于Debian/Ubuntu的rootfs,这里不做详细介绍,可参考《debootstrap 制作arm64位根文件系统》。
使用busybox制作rootfs
若需要体积最小的rootfs,可使用万能工具箱busybox构建最小系统。这里不做详细介绍,可参考《基于busybox构建rootfs》
注:无论采用哪种方式构建rootfs,必须确认下载/编译出的代码CPU平台是否为对应处理器的:A33/A40i为armel,A64/A133为aarch64。
对于A33/A64/A40i:
制作好rootfs后,修改myrootfs/make_ext4fs.sh中的PARTITION_SIZE的值,使其大于整个rootfs的体积(单位MB)。最后执行:
$ ./pack_linux_firmware.sh
打包好的固件位于lichee/tools/pack下面。
对于A133:
rootfs为已打包好的形式提供,位置:device/config/rootfs_tar/rootfs_ubuntu_base_1604lts.tar.bz2
若需要修改,可将其解压到device/config/rootfs_tar/rootfs中后修改(chroot脚本为当前目录下的ch-mount.sh),改完后再打包起来覆盖原来的rootfs_ubuntu_base_1604lts.tar.bz2。最后执行:
$ ./pack_linux_firmware.sh
打包好的固件位于out下面。
(注意:需要确保build/mkcmd.sh脚本中:
fakeroot mkfs.ubifs -m 4096 -e 258048 -c 640 -F -x zlib -r ${ROOTFS} -o ${LICHEE_PLAT_OUT}/rootfs.ubifs
该行命令中-c参数,设定的值需大于rootfs的实际大小(-c为ubifs块数,需换算为字节数),否则打包rootfs时会报错!)
常见问题
A:编译内核时提示awk: line 2: function strtonum never defined
Q:主机系统缺少gawk,执行下列命令安装:
sudo apt-get install gawk
A:打包后的固件烧录后无法启动,Console打印JBD2: Unrecognised features on journal
Q:出现该问题主要是由于主机系统上新版的mkfs.ext4工具在制作镜像时部分默认的特性在全志的内核上不支持。解决方法为去掉文件系统中的has_journal选项:
修改myrootfs/make_ext4fs.sh的末尾添加:
tune2fs -O ^has_journal rootfs.ext4
保存后重新打包固件即可。
A:打包后的固件烧录后无法启动,Console打印couldn't mount RDWR because of unsupported optional features (400)
Q:出现该问题主要是由于主机系统上新版的mkfs.ext4工具在制作镜像时部分默认的特性在全志的内核上不支持。解决方法为去掉文件系统中的metadata_csum选项:
修改myrootfs/make_ext4fs.sh中的第6行,在末尾添加-O ^metadata_csum:
mkfs.ext4 rootfs.ext4 -O ^metadata_csum
保存后重新打包固件即可。
A:我的核心板eMMC配置为8GB,但为何系统内显示可用空间只有几百MB了?(df -h查看)
Q:首先bootloader和kernel等会占用一部分空间,实际可用空间肯定不到8GB的。其次打包的ext4卷空间小于等于eMMC中rootfs所在分区的实际大小(分区大小在sys_partition.fex中查看和修改),第一次启动后需要用resize2fs命令扩展ext4卷到满空间才可以,方法为在核心板系统上执行下列命令:
$ resize2fs /dev/mmcblk0p7
光盘资料里提供的已经做好的基于Ubuntu的rootfs已经包含了在第一次启动时自动执行此命令的脚本,但如果系统启动时resize_partition报错且分区未能自动扩展时,需要修改rootfs里的resize_partition.sh,在第二行空白添加:sleep 5
保存后重新打包即可。
A: 如何修改rootfs所在分区的大小?
Q: 修改sys_parition.fex文件:
对于A33/A64/A40i:tools/pack/chips/芯片代号/configs/default/sys_partition_linux.fex
对于A133:device/config/chips/a133/configs/default/sys_partition.fex
找到name = rootfs字段,修改下面的size,计算方法:该size的单位为512B,例如eMMC容量为8GB,则8*1024*1024*1024/512=16777216,然后减出上面boot等分区占用的size数后即为这里rootfs的size。修改完成后重新pack生效。
若遇到pack报错或无法烧录,请检查这里的分区size设置是否合理!
A:Linux系统登录的用户名和密码?
Q:用户名root密码root(桌面版:用户名hddz密码hd12345678)
A:编译后的固件为什么没有桌面?
Q:使用带LXDE桌面环境的rootfs,屏幕上才会有桌面显示!
A:为何桌面系统无法使用蓝牙/HDMI等外设?
Q:当前版本的rootfs尚未添加bluez的支持和双屏显示支持。若需要切换到HDMI显示,可参考Android部分定制HDMI显示输出的步骤修改FEX文件实现。未来会完善这些功能,请随时关注更新!
A:无桌面的系统如何测试相关功能?
Q:请查阅相关资料学习Linux操作相关外设的方法。例如测试Wi-Fi需要安装和配置wpa_supplicant。
Ubuntu_Base的rootfs为最小系统,仅附带系统最基础的功能组件,若需增加软件包可通过以太网联网后通过apt-get命令安装。