f10f47ff28
This was reviewed in person by Arnout. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
273 lines
12 KiB
Plaintext
273 lines
12 KiB
Plaintext
// -*- mode:doc; -*-
|
|
// vim: set syntax=asciidoc:
|
|
|
|
== Frequently Asked Questions & Troubleshooting
|
|
|
|
[[faq-boot-hang-after-starting]]
|
|
=== The boot hangs after 'Starting network...'
|
|
|
|
If the boot process seems to hang after the following messages
|
|
(messages not necessarily exactly similar, depending on the list of
|
|
packages selected):
|
|
|
|
------------------------
|
|
Freeing init memory: 3972K
|
|
Initializing random number generator... done.
|
|
Starting network...
|
|
Starting dropbear sshd: generating rsa key... generating dsa key... OK
|
|
------------------------
|
|
|
|
then it means that your system is running, but didn't start a shell on
|
|
the serial console. In order to have the system start a shell on your
|
|
serial console, you have to go into the Buildroot configuration, in
|
|
+System configuration+, modify +Run a getty (login prompt) after boot+
|
|
and set the appropriate port and baud rate in the +getty options+
|
|
submenu. This will automatically tune the +/etc/inittab+ file of the
|
|
generated system so that a shell starts on the correct serial port.
|
|
|
|
[[faq-no-compiler-on-target]]
|
|
=== Why is there no compiler on the target?
|
|
|
|
It has been decided that support for the _native compiler on the
|
|
target_ would be stopped from the Buildroot-2012.11 release because:
|
|
|
|
* this feature was neither maintained nor tested, and often broken;
|
|
* this feature was only available for Buildroot toolchains;
|
|
* Buildroot mostly targets _small_ or _very small_ target hardware
|
|
with limited resource onboard (CPU, ram, mass-storage), for which
|
|
compiling on the target does not make much sense;
|
|
* Buildroot aims at easing the cross-compilation, making native
|
|
compilation on the target unnecessary.
|
|
|
|
If you need a compiler on your target anyway, then Buildroot is not
|
|
suitable for your purpose. In such case, you need a _real
|
|
distribution_ and you should opt for something like:
|
|
|
|
* http://www.openembedded.org[openembedded]
|
|
* https://www.yoctoproject.org[yocto]
|
|
* https://www.debian.org/ports/[Debian]
|
|
* https://fedoraproject.org/wiki/Architectures[Fedora]
|
|
* http://en.opensuse.org/Portal:ARM[openSUSE ARM]
|
|
* http://archlinuxarm.org[Arch Linux ARM]
|
|
* ...
|
|
|
|
[[faq-no-dev-files-on-target]]
|
|
=== Why are there no development files on the target?
|
|
|
|
Since there is no compiler available on the target (see
|
|
xref:faq-no-compiler-on-target[]), it does not make sense to waste
|
|
space with headers or static libraries.
|
|
|
|
Therefore, those files are always removed from the target since the
|
|
Buildroot-2012.11 release.
|
|
|
|
[[faq-no-doc-on-target]]
|
|
=== Why is there no documentation on the target?
|
|
|
|
Because Buildroot mostly targets _small_ or _very small_ target
|
|
hardware with limited resource onboard (CPU, ram, mass-storage), it
|
|
does not make sense to waste space with the documentation data.
|
|
|
|
If you need documentation data on your target anyway, then Buildroot
|
|
is not suitable for your purpose, and you should look for a _real
|
|
distribution_ (see: xref:faq-no-compiler-on-target[]).
|
|
|
|
[[faq-why-not-visible-package]]
|
|
=== Why are some packages not visible in the Buildroot config menu?
|
|
|
|
If a package exists in the Buildroot tree and does not appear in the
|
|
config menu, this most likely means that some of the package's
|
|
dependencies are not met.
|
|
|
|
To know more about the dependencies of a package, search for the
|
|
package symbol in the config menu (see xref:make-tips[]).
|
|
|
|
Then, you may have to recursively enable several options (which
|
|
correspond to the unmet dependencies) to finally be able to select
|
|
the package.
|
|
|
|
If the package is not visible due to some unmet toolchain options,
|
|
then you should certainly run a full rebuild (see xref:make-tips[] for
|
|
more explanations).
|
|
|
|
[[faq-why-not-use-target-as-chroot]]
|
|
=== Why not use the target directory as a chroot directory?
|
|
|
|
There are plenty of reasons to *not* use the target directory a chroot
|
|
one, among these:
|
|
|
|
* file ownerships, modes and permissions are not correctly set in the
|
|
target directory;
|
|
* device nodes are not created in the target directory.
|
|
|
|
For these reasons, commands run through chroot, using the target
|
|
directory as the new root, will most likely fail.
|
|
|
|
If you want to run the target filesystem inside a chroot, or as an NFS
|
|
root, then use the tarball image generated in +images/+ and extract it
|
|
as root.
|
|
|
|
[[faq-no-binary-packages]]
|
|
=== Why doesn't Buildroot generate binary packages (.deb, .ipkg...)?
|
|
|
|
One feature that is often discussed on the Buildroot list is the
|
|
general topic of "package management". To summarize, the idea
|
|
would be to add some tracking of which Buildroot package installs
|
|
what files, with the goals of:
|
|
|
|
* being able to remove files installed by a package when this package
|
|
gets unselected from the menuconfig;
|
|
|
|
* being able to generate binary packages (ipk or other format) that
|
|
can be installed on the target without re-generating a new root
|
|
filesystem image.
|
|
|
|
In general, most people think it is easy to do: just track which package
|
|
installed what and remove it when the package is unselected. However, it
|
|
is much more complicated than that:
|
|
|
|
* It is not only about the +target/+ directory, but also the sysroot in
|
|
+host/<tuple>/sysroot+ and the +host/+ directory itself. All files
|
|
installed in those directories by various packages must be tracked.
|
|
|
|
* When a package is unselected from the configuration, it is not
|
|
sufficient to remove just the files it installed. One must also
|
|
remove all its reverse dependencies (i.e. packages relying on it)
|
|
and rebuild all those packages. For example, package A depends
|
|
optionally on the OpenSSL library. Both are selected, and Buildroot
|
|
is built. Package A is built with crypto support using OpenSSL.
|
|
Later on, OpenSSL gets unselected from the configuration, but
|
|
package A remains (since OpenSSL is an optional dependency, this
|
|
is possible.) If only OpenSSL files are removed, then the files
|
|
installed by package A are broken: they use a library that is no
|
|
longer present on the target. Although this is technically doable,
|
|
it adds a lot of complexity to Buildroot, which goes against the
|
|
simplicity we try to stick to.
|
|
|
|
* In addition to the previous problem, there is the case where the
|
|
optional dependency is not even known to Buildroot. For example,
|
|
package A in version 1.0 never used OpenSSL, but in version 2.0 it
|
|
automatically uses OpenSSL if available. If the Buildroot .mk file
|
|
hasn't been updated to take this into account, then package A will
|
|
not be part of the reverse dependencies of OpenSSL and will not be
|
|
removed and rebuilt when OpenSSL is removed. For sure, the .mk file
|
|
of package A should be fixed to mention this optional dependency,
|
|
but in the mean time, you can have non-reproducible behaviors.
|
|
|
|
* The request is to also allow changes in the menuconfig to be
|
|
applied on the output directory without having to rebuild
|
|
everything from scratch. However, this is very difficult to achieve
|
|
in a reliable way: what happens when the suboptions of a package
|
|
are changed (we would have to detect this, and rebuild the package
|
|
from scratch and potentially all its reverse dependencies), what
|
|
happens if toolchain options are changed, etc. At the moment, what
|
|
Buildroot does is clear and simple so its behaviour is very
|
|
reliable and it is easy to support users. If configuration changes
|
|
done in menuconfig are applied after the next make, then it has to
|
|
work correctly and properly in all situations, and not have some
|
|
bizarre corner cases. The risk is to get bug reports like "I have
|
|
enabled package A, B and C, then ran make, then disabled package
|
|
C and enabled package D and ran make, then re-enabled package C
|
|
and enabled package E and then there is a build failure". Or worse
|
|
"I did some configuration, then built, then did some changes,
|
|
built, some more changes, built, some more changes, built, and now
|
|
it fails, but I don't remember all the changes I did and in which
|
|
order". This will be impossible to support.
|
|
|
|
For all these reasons, the conclusion is that adding tracking of
|
|
installed files to remove them when the package is unselected, or to
|
|
generate a repository of binary packages, is something that is very
|
|
hard to achieve reliably and will add a lot of complexity.
|
|
|
|
On this matter, the Buildroot developers make this position statement:
|
|
|
|
* Buildroot strives to make it easy to generate a root filesystem (hence
|
|
the name, by the way.) That is what we want to make Buildroot good at:
|
|
building root filesystems.
|
|
|
|
* Buildroot is not meant to be a distribution (or rather, a distribution
|
|
generator.) It is the opinion of most Buildroot developers that this
|
|
is not a goal we should pursue. We believe that there are other tools
|
|
better suited to generate a distro than Buildroot is. For example,
|
|
http://openembedded.org/[Open Embedded], or https://openwrt.org/[openWRT],
|
|
are such tools.
|
|
|
|
* We prefer to push Buildroot in a direction that makes it easy (or even
|
|
easier) to generate complete root filesystems. This is what makes
|
|
Buildroot stands out in the crowd (among other things, of course!)
|
|
|
|
* We believe that for most embedded Linux systems, binary packages are
|
|
not necessary, and potentially harmful. When binary packages are
|
|
used, it means that the system can be partially upgraded, which
|
|
creates an enormous number of possible combinations of package
|
|
versions that should be tested before doing the upgrade on the
|
|
embedded device. On the other hand, by doing complete system
|
|
upgrades by upgrading the entire root filesystem image at once,
|
|
the image deployed to the embedded system is guaranteed to really
|
|
be the one that has been tested and validated.
|
|
|
|
[[faq-speeding-up-build]]
|
|
=== How to speed-up the build process?
|
|
|
|
Since Buildroot often involves doing full rebuilds of the entire
|
|
system that can be quite long, we provide below a number of tips to
|
|
help reduce the build time:
|
|
|
|
* Use a pre-built external toolchain instead of the default Buildroot
|
|
internal toolchain. By using a pre-built Linaro toolchain (on ARM)
|
|
or a Sourcery CodeBench toolchain (for ARM, x86, x86-64, MIPS,
|
|
etc.), you will save the build time of the toolchain at each
|
|
complete rebuild, approximately 15 to 20 minutes. Note that
|
|
temporarily using an external toolchain does not prevent you to
|
|
switch back to an internal toolchain (that may provide a higher
|
|
level of customization) once the rest of your system is working;
|
|
|
|
* Use the +ccache+ compiler cache (see: xref:ccache[]);
|
|
|
|
* Learn about rebuilding only the few packages you actually care
|
|
about (see xref:rebuild-pkg[]), but beware that sometimes full
|
|
rebuilds are anyway necessary (see xref:full-rebuild[]);
|
|
|
|
* Make sure you are not using a virtual machine for the Linux system
|
|
used to run Buildroot. Most of the virtual machine technologies are
|
|
known to cause a significant performance impact on I/O, which is
|
|
really important for building source code;
|
|
|
|
* Make sure that you're using only local files: do not attempt to do
|
|
a build over NFS, which significantly slows down the build. Having
|
|
the Buildroot download folder available locally also helps a bit.
|
|
|
|
* Buy new hardware. SSDs and lots of RAM are key to speeding up the
|
|
builds.
|
|
|
|
* Experiment with top-level parallel build, see
|
|
xref:top-level-parallel-build[].
|
|
|
|
[[faq-2038]]
|
|
=== How does Buildroot support Y2038?
|
|
|
|
There are multiple situations to consider:
|
|
|
|
* On 64-bit architectures, there is no problem, as +time_t+ has
|
|
always been 64-bit.
|
|
|
|
* On 32-bit architectures, the situation depends on the C library:
|
|
|
|
** With _uclibc-ng_, there is no support for 64-bit +time_t+ on
|
|
32-bit architectures, so systems using _uclibc-ng_ on 32-bit
|
|
platforms will not be Y2038 compatible.
|
|
|
|
** With _musl_, 64-bit +time_t+ has always been used on 32-bit
|
|
architectures, so systems using _musl_ on 32-bit platforms are
|
|
Y2038 compatible.
|
|
|
|
** With _glibc_, 64-bit +time_t+ on 32-bit architectures is enabled
|
|
by the Buildroot option +BR2_TIME_BITS_64+. With this option
|
|
enabled, systems using _glibc_ on 32-bit platforms are Y2038
|
|
compatible.
|
|
|
|
Note that the above only comments about the capabilities of the C
|
|
library. Individual user-space libraries or applications, even when
|
|
built in a Y2038-compatible setup, can exhibit incorrect behavior if
|
|
they do not make correct use of the time APIs and types.
|