web-dev-qa-db-ja.com

実際に「run-init」とは何ですか?

Bootintプロセス中に、初期RAMディスクにinitスクリプトがあります。最後の操作では、次のように表示されます。

# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."

Ramdiskコンテンツ内のすべてのスクリプトを検索しますが、そのようなファイル名や関数名が見つかりません。実際にrun-initとは何ですか?

3
naive231

run-initはバイナリ実行可能ファイルで、/ usr/lib/klibc/bin/run-initとinitramfsにあり、提供されますUbuntuのklibc-utilsパッケージ。これはスクリプトではないため、内部を直接確認することはできません。apt source klibc-utilsを実行するか、 https://git.kernel.org/でアップストリームリポジトリを参照することで、ソースコードをチェックアウトできます。 cgit/libs/klibc/klibc.git

したがって、メイン関数は run-init.c にありますが、これはrun_init関数の単なるラッパーであり、ここに runinitlib.c に存在します

run_initは多くの作業を行います:

  1. 新しいルートファイルシステムにジャンプします
  2. これが新しいルートファイルシステムであることを確認します
  3. Initramfsで確認します
  4. すべてのディレクトリを消去します(RAMを無駄にする理由は?)
  5. 新しいルートファイルシステムをマウントします
  6. 新しいルートファイルシステムでinitを実行します

依存関係があるため、このすべての作業をスクリプトで行うのは非常に複雑になると思いますが、バイナリ実行可能ファイルで非常に簡単にできます。

6
rth

dpkg-queryによれば、それはklibc-utilsパッケージの一部です。ソースコードを掘り下げると、execvを呼び出して、実際のファイルシステムでinitプロセスを開始することがわかります。それに失敗すると、run-initが返され、最終行でpanicがトリガーされます。

1
Drew McGowen

Ubuntu 14.04LTS空のフォルダーにファイルを作成[get-it.sh]

#!/bin/sh

cp /boot/initrd* initrd.cpio.gz
mkdir initrd
cd initrd
zcat ../initrd.cpio.gz | cpio -di
find | grep run-init
cd ..

実行します:bash get-it.sh

ファイルrun-initは./bin/run-initにあります

また、インストールCDからinitrdを取得できます

0
Sergey Kovalev