.. | .. |
---|
1 | | -Explaining the dreaded "No init found." boot hang message |
---|
| 1 | +Explaining the "No working init found." boot hang message |
---|
2 | 2 | ========================================================= |
---|
| 3 | +:Authors: Andreas Mohr <andi at lisas period de> |
---|
| 4 | + Cristian Souza <cristianmsbr at gmail period com> |
---|
3 | 5 | |
---|
4 | | -OK, so you've got this pretty unintuitive message (currently located |
---|
5 | | -in init/main.c) and are wondering what the H*** went wrong. |
---|
6 | | -Some high-level reasons for failure (listed roughly in order of execution) |
---|
7 | | -to load the init binary are: |
---|
| 6 | +This document provides some high-level reasons for failure |
---|
| 7 | +(listed roughly in order of execution) to load the init binary. |
---|
8 | 8 | |
---|
9 | | -A) Unable to mount root FS |
---|
10 | | -B) init binary doesn't exist on rootfs |
---|
11 | | -C) broken console device |
---|
12 | | -D) binary exists but dependencies not available |
---|
13 | | -E) binary cannot be loaded |
---|
| 9 | +1) **Unable to mount root FS**: Set "debug" kernel parameter (in bootloader |
---|
| 10 | + config file or CONFIG_CMDLINE) to get more detailed kernel messages. |
---|
14 | 11 | |
---|
15 | | -Detailed explanations: |
---|
| 12 | +2) **init binary doesn't exist on rootfs**: Make sure you have the correct |
---|
| 13 | + root FS type (and ``root=`` kernel parameter points to the correct |
---|
| 14 | + partition), required drivers such as storage hardware (such as SCSI or |
---|
| 15 | + USB!) and filesystem (ext3, jffs2, etc.) are builtin (alternatively as |
---|
| 16 | + modules, to be pre-loaded by an initrd). |
---|
16 | 17 | |
---|
17 | | -A) Set "debug" kernel parameter (in bootloader config file or CONFIG_CMDLINE) |
---|
18 | | - to get more detailed kernel messages. |
---|
19 | | -B) make sure you have the correct root FS type |
---|
20 | | - (and ``root=`` kernel parameter points to the correct partition), |
---|
21 | | - required drivers such as storage hardware (such as SCSI or USB!) |
---|
22 | | - and filesystem (ext3, jffs2 etc.) are builtin (alternatively as modules, |
---|
23 | | - to be pre-loaded by an initrd) |
---|
24 | | -C) Possibly a conflict in ``console= setup`` --> initial console unavailable. |
---|
25 | | - E.g. some serial consoles are unreliable due to serial IRQ issues (e.g. |
---|
26 | | - missing interrupt-based configuration). |
---|
| 18 | +3) **Broken console device**: Possibly a conflict in ``console= setup`` |
---|
| 19 | + --> initial console unavailable. E.g. some serial consoles are unreliable |
---|
| 20 | + due to serial IRQ issues (e.g. missing interrupt-based configuration). |
---|
27 | 21 | Try using a different ``console= device`` or e.g. ``netconsole=``. |
---|
28 | | -D) e.g. required library dependencies of the init binary such as |
---|
29 | | - ``/lib/ld-linux.so.2`` missing or broken. Use |
---|
30 | | - ``readelf -d <INIT>|grep NEEDED`` to find out which libraries are required. |
---|
31 | | -E) make sure the binary's architecture matches your hardware. |
---|
32 | | - E.g. i386 vs. x86_64 mismatch, or trying to load x86 on ARM hardware. |
---|
33 | | - In case you tried loading a non-binary file here (shell script?), |
---|
34 | | - you should make sure that the script specifies an interpreter in its shebang |
---|
35 | | - header line (``#!/...``) that is fully working (including its library |
---|
36 | | - dependencies). And before tackling scripts, better first test a simple |
---|
37 | | - non-script binary such as ``/bin/sh`` and confirm its successful execution. |
---|
38 | | - To find out more, add code ``to init/main.c`` to display kernel_execve()s |
---|
39 | | - return values. |
---|
| 22 | + |
---|
| 23 | +4) **Binary exists but dependencies not available**: E.g. required library |
---|
| 24 | + dependencies of the init binary such as ``/lib/ld-linux.so.2`` missing or |
---|
| 25 | + broken. Use ``readelf -d <INIT>|grep NEEDED`` to find out which libraries |
---|
| 26 | + are required. |
---|
| 27 | + |
---|
| 28 | +5) **Binary cannot be loaded**: Make sure the binary's architecture matches |
---|
| 29 | + your hardware. E.g. i386 vs. x86_64 mismatch, or trying to load x86 on ARM |
---|
| 30 | + hardware. In case you tried loading a non-binary file here (shell script?), |
---|
| 31 | + you should make sure that the script specifies an interpreter in its |
---|
| 32 | + shebang header line (``#!/...``) that is fully working (including its |
---|
| 33 | + library dependencies). And before tackling scripts, better first test a |
---|
| 34 | + simple non-script binary such as ``/bin/sh`` and confirm its successful |
---|
| 35 | + execution. To find out more, add code ``to init/main.c`` to display |
---|
| 36 | + kernel_execve()s return values. |
---|
40 | 37 | |
---|
41 | 38 | Please extend this explanation whenever you find new failure causes |
---|
42 | 39 | (after all loading the init binary is a CRITICAL and hard transition step |
---|
43 | | -which needs to be made as painless as possible), then submit patch to LKML. |
---|
| 40 | +which needs to be made as painless as possible), then submit a patch to LKML. |
---|
44 | 41 | Further TODOs: |
---|
45 | 42 | |
---|
46 | 43 | - Implement the various ``run_init_process()`` invocations via a struct array |
---|
47 | 44 | which can then store the ``kernel_execve()`` result value and on failure |
---|
48 | 45 | log it all by iterating over **all** results (very important usability fix). |
---|
49 | | -- try to make the implementation itself more helpful in general, |
---|
50 | | - e.g. by providing additional error messages at affected places. |
---|
| 46 | +- Try to make the implementation itself more helpful in general, e.g. by |
---|
| 47 | + providing additional error messages at affected places. |
---|
51 | 48 | |
---|
52 | | -Andreas Mohr <andi at lisas period de> |
---|