转载请注明原文链接:https://blog.csdn.net/haimo_free/article/details/107677667
文章目录
10. 常见问题和故障排除
10.1 启动网络后引导挂起……
如果boot进程是在显示以下消息后挂起(消息不一定完全相似,具体取决于选择的软件包):
Freeing init memory: 3972K
Initializing random number generator... done.
Starting network...
Starting dropbear sshd: generating rsa key... generating dsa key... OK
那么意味着系统正在运行,但没有在串口控制台上启动shell程序。为了使系统在串口控制台上启动shell程序,必须进入Buildroot配置,在System configuration子菜单中修改Run a getty (login prompt) after boot,并在getty options子菜单中设置适当的端口和波特率。这将自动调整生成的/etc/inittab系统文件,以便shell程序在正确的串行端口上启动。
10.2 为什么目标系统上没有编译器?
Buildroot已经决定从Buildroot-2012.11版本停止对目标系统上本机编译器的支持,原因:
- 此功能既未维护,也未测试,经常出问题;
- 此功能仅适用于Buildroot工具链;
- Buildroot主要针对板载资源(CPU、内存、大容量存储)有限的小型或超小型目标硬件,因此在目标机器上编译没有多大意义;
- Buildroot旨在简化交叉编译,从而无需在目标系统上进行本地编译。
如果仍然需要在目标系统上使用编译器,那Buildroot不适合你的目的。在这种情况下,你需要一个实际的发行版,并且应该选择以下内容:
- openembedded
- yocto
- emdebian
- Fedora
- openSUSE ARM
- Arch Linux ARM
- ……
10.3 为何目标系统上没有开发文件?
由于目标系统上没有可用的编译器(参阅10.2节“为什么目标系统上没有编译器?”),因此浪费空间存储头文件或静态库是没有意义的。
因此,自Buildroot-2012.11版本后,这些文件将会从目标系统删除。
10.4 为何目标系统上没有文档?
由于Buildroot主要针对板载资源(CPU、内存、大容量存储)的小型或超小型目标硬件,因此浪费空间存储文档是没有意义的。
如果仍然需要在目标系统上保留文档数据,那Buildroot不适合你的目的,你需要一个实际的发行版(参阅10.2节“为什么目标系统上没有编译器?”)
10.5 为何有些软件包在Buildroot配置菜单中不可见?
如果某个软件包存在于Buildroot目录树中,但是没有出现在Config菜单中,最有可能的原因是未满足该软件包的依赖关系。
要了解有关软件包依赖项的更多信息,请在配置菜单中搜索该软件包的符号(参阅第8.1节“make技巧”)。
之后,你可能必须递归启用某些选项(与未满足的依赖项对应)才能最终选择该软件包。
如果是由于工具链选项未满足而导致该软件包不可见,那么你需要完全重建才行(有关更多说明,参阅第8.1“make技巧”)。
10.6 为何不将target/目录用作chroot目录?
有很多原因不能将target目录用作chroot目录,其中包括:
- 在target目录中,文件所有者、模式、权限并未正确设置;
- target目录中没有创建设备节点。
由于这些原因,使用target/目录通过chroot命令作为根目录很可能会失败。
如果你通过chroot运行目标文件系统,或将目标文件系统作为NFS根目录,需要以root权限提取images/目录下的tar包镜像。
10.7 为何Buildroot不生成二进制软件包(如.deb、.ipkg……)?
Buildroot列表上经常讨论的一项功能是“软件包管理”。总而言之,该想法是增加对软件包安装了哪些文件进行跟踪,目标是:
当从menuconfig中取消选择某个软件包时,能够删除该软件包安装的文件。
能够生成可以安装在目标系统上的二进制软件包(ipk或其他格式),而无需重新生成新的根文件系统镜像。
通常,大多数人认为这很容易做到:只需跟踪安装了哪个软件包,并在取消选择时将该软件包删除即可。但是,它比这复杂的多:
- 它不仅跟target/目录有关,而且与host//sysroot和host/有关。各种安装包安装到这些目录的文件必须跟踪。
- 从配置中取消选择软件包时,仅删除该软件包安装的文件是不够的。还必须删除其反向依赖关系(即依赖它的软件包)并重新构建这些软件包。例如,软件包A依赖于OpenSSL库。两者都被选中,并且Buildroot被构建。软件包A使用OpenSSL进行加密支持。然后,从配置中取消选择OpenSLL库,但保留了软件包A(OpenSSL是可选依赖项,所所以有这种可能)。如果仅删除OpenSSL的文件,则由软件包A安装的文件将被破坏,它们使用的库已经从目标系统上删除。尽管从技术上讲这是可行的,但它为Buildroot增加了很多复杂性,这与我们一直坚持的简单性原则背道而驰。
- 除了前面提到的问题外,Buildroot甚至不了解可选依赖项。例如,版本1.0的软件包A从未使用过OpenSSL,但是在2.0版本中,它会自动使用OpenSSL(如果有)。如果尚未更新Buildroot的.mk文件以将其考虑在内,则软件包A将不属于OpenSSL的反向依赖关项,在删除OpenSSL时就不会删除并重建软件包A。当然,应该修复软件包的.mk文件添加此可选依赖项,但与此同时,可能出现不可复制的行为。
- 该请求还允许直接将menuconfig中的更改应用于output木,而不必从头开始重新构建所有内容。但是,以一种可靠的方案很难做到这一点:更改包的子选择时会发生什么(我们必须检测到这一点,并从头开始构建,且重建其所有反向依赖项),如果工具链选择改变会发生什么,等等。目前,Buildroot所做的工作既清晰又简单,因为其行为非常可靠,并且易于支持用户。如果在下一次make之后在menuconfig中修改了配置,则它必须保证在所有情况下都能正确地工作,并且不会出现一些异常情况。
基于所有这些原因,得出的结论是,跟踪已安装文件以在取消选择软件包时将其删除或生成软件包的二进制存储库是很难可靠实现的,并且会增加很多复杂性。
在此问题上,Buildroot开发人员发表以下立场声明:
- Buildroot致力于使生成根文件系统变得很容易(顺便提一下,Buildroot因此得名)。这就是我们想要使Buildroot擅长的:构建根文件系统。
- Buildroot并不是要成为发行版(或者说是发行版生成器)。大多数Buildroot开发人员都认为,这不是我们应该追求的目标。我们相信,还有比Buildroot更适合生成发行版的其他工具。例如,Open Embedded或openWRT等。
- 我们倾向于将Buildroot推向易于(甚至更容易)生成完整根文件系统的方向,这就是Buildroot在人群中脱颖而出的原因(当然还有其他事情!)。
- 我们认为,对于大多数嵌入式Linux系统,二进制软件包不是必须的,并且可能有害。使用二进制软件包时,意味着可以部分升级系统,这将产生大量可能的软件包版本组合,在嵌入式设备上进行升级之前应先对其进行测试。另一方面,通过一次性升级整个根文件系统镜像来进行完整的系统升级,可以确保部署到嵌入式系统的镜像确实是经过测试和验证的镜像。
10.8 如何加快构建过程?
由于Buildroot通常涉及对整个系统进行完整重建,这可能耗时很长。因此,我们提供了下面一些技巧来帮助减少构建时间:
- 使用预构建的外部工具链替代默认的Buildroot内部工具链。使用预编译的Linaro工具链(用于ARM平台)或Sourcery CodeBench工具链(用于ARM、x86、x86-64、MIPS等平台),可以在重建时节省构建工具链的时间,大约可节省15到20分钟。请注意,在系统的其余部分正常工作后,临时使用外部工具链不会阻止你切换回内部工具链(这可能会提供更高级别的自定义)。
- 使用ccache编译缓存(参阅第8.13.3节“在Buildroot中使用ccache”)。
了解有关重新构建某个软件包的信息(参阅第8.3节“了解如何重新构建软件包”),但是请注意,有时仍需要完全重建(参阅第8.2节“了解何时需要完全重建”)。 - 确保没有将虚拟机用于运行Buildroot的Linux系统。众所周知,大多数虚拟机技术都会对I/O产生重大的性能影响,这对于构建源代码确实很重要。
- 确保仅使用本地文件,请勿尝试通过NFS进行构建,这会明显减慢构建速度。在本地拥有Buildroot下载文件夹也有帮助。
- 购买新硬件。SSD和大量RAM是加快构建速度的关键。
- 试用顶层并行构建,参阅第8.11节“顶层并行构建”。