Explaining the dreaded “No init found.” boot hang message

https://www.kernel.org/doc/html/latest/admin-guide/init.html


# Explaining the dreaded “No init found.” boot hang message
恐ろしい"No init found." boot hang messageを説明する。

> OK, so you’ve got this pretty unintuitive message (currently located in init/main.c) and are wondering what the H*** went wrong. Some high-level reasons for failure (listed roughly in order of execution) to load the init binary are:

OK, あなたはこのかなり直感的ではないメッセージ(init/main.cに現在配置されています)を受け取り、H***が何がうまくいかなかった疑問に思っていることでしょう。init binaryをloadするのを失敗した、high-levelの理由がいくつかあります（このリストはざっくりと、実行順番に並べてあります）：

> A. Unable to mount root FS
B. init binary doesn’t exist on rootfs
C. broken console device
D. binary exists but dependencies not available
E. binary cannot be loaded


A. root FSをマウントできなかった。
B. rootfsにinit binaryが存在していなかった。
C. console deviceが壊れている
D. binary は存在するが、依存しているものが有効ではない
E. binary をloadできなかった。

> Detailed explanations:

詳細について述べていきます。

> A. Set “debug” kernel parameter (in bootloader config file or CONFIG_CMDLINE) to get more detailed kernel messages.

更に詳細なkernel messageを取得するために、kernel parameterに"debug"をセットしてください（bootloaderの設定ファイルや、CONFIG_CMDLINEで行えます）

> B. make sure you have the correct root FS type (and root= kernel parameter points to the correct partition), required drivers such as storage hardware (such as SCSI or USB!) and filesystem (ext3, jffs2 etc.) are builtin (alternatively as modules, to be pre-loaded by an initrd)

正しいroot FS typeであること(そして、root= kernel parameterが正しい位置を示していること）、storage hardware(SCSIやUSB等）や、filesystem(ext3, jffs2等)が組み込まれていること（あるいは、moduleとして、initrdで事前にloadされていること）を確認してください。

> C. Possibly a conflict in console= setup –> initial console unavailable. E.g. some serial consoles are unreliable due to serial IRQ issues (e.g. missing interrupt-based configuration). Try using a different console= device or e.g. netconsole=.

おそらく、console= setup –> initial と競合しているconsoleは利用できません。例えばserial IRQの問題（例えば、割り込みベースの設定が存在していない）で、シリアルコンソールの中には信用がないものがあります。他のconsole= device、例えばnetconsole=を使ってください。

> D. e.g. required library dependencies of the init binary such as /lib/ld-linux.so.2 missing or broken. Use readelf -d <INIT>|grep NEEDED to find out which libraries are required.

例えば、init binaryが要求している、/lib/ld-linux.so.2のようなライブラリが存在していない、もしくは破損しているかもしれません。readelf -d <INIT>|grep NEEDEDを利用し、それらのlibraryが要求しているものを確認してください。

> E. make sure the binary’s architecture matches your hardware. E.g. i386 vs. x86_64 mismatch, or trying to load x86 on ARM hardware. In case you tried loading a non-binary file here (shell script?), you should make sure that the script specifies an interpreter in its shebang header line (#!/...) that is fully working (including its library dependencies). And before tackling scripts, better first test a simple non-script binary such as /bin/sh and confirm its successful execution. To find out more, add code to init/main.c to display kernel_execve()s return values.

E. binaryのアーキテクチャが、あなたのハードウェアと一致しているのかを確認してください。例えば、i386とx86_64での不整合、あるいは、ARM hardware上でx86をloadしようとしているのかもしれません。非binary file（shell script?)をloadしようとしている場合には、scriptがそのshebang header line (#!/...) で完全に機能している（ライブラリの依存関係を含む）インタープリターを指定していることを確認する必要があります。 また、scriptに取り組む前に、/bin/shのような単純な非スクリプトで最初にテストをして、実行できることを確認することをお勧めます。詳細を確認するためには、init/main.cのコードを追加し、kernel_execve()の戻り値を表示してください。

> Please extend this explanation whenever you find new failure causes (after all loading the init binary is a CRITICAL and hard transition step which needs to be made as painless as possible), then submit patch to LKML. Further TODOs:

新しい失敗原因を見つけた場合には、この説明を拡張してください。(init binaryを全部loadすることは、重要でありhard transition stepdであるため、それは可能な限り単純化する必要があります)。そして、パッチをLKMLに送信してください。　そのほかのTODO:

> ・Implement the various run_init_process() invocations via a struct array which can then store the kernel_execve() result value and on failure log it all by iterating over all results (very important usability fix).

さまざまなrun_init_process()の呼び出しは、struct配列を介して実装します。これにより、kernel_execve()の戻り値を保存でき、失敗時にすべての結果で繰り返すことで、ログをすべて記録できます（非常に重要な使いやすくなります）。

> ・try to make the implementation itself more helpful in general, e.g. by providing additional error messages at affected places.

>・一般的に、実装自体をより役立つものにするようにしてください。 例えば、影響を受ける場所に追加のエラーメッセージを提供する等。


Andreas Mohr ＜andi at lisas period de＞

---
もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる（はずの認識）。

> https://www.kernel.org/doc/html/latest/index.html
> 
> Licensing documentation
> 
> The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
> 
> https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing