追加のファイルをAndroid ROMのルートディレクトリにコンパイルする方法


8

Cyanogenmod ROMのカーネルソースコードに基づいてカスタムAndroidカーネルを構築しています。OSのルートフォルダーにフォルダーとファイルを追加したい(/)。たとえば、カーネルをコンパイルした後、toto(absolute path = /toto)という名前の追加のフォルダーを作成します。

どのファイルを編集する必要があるのか​​、そしてどのように作業するのか、私にはまったくわかりません。


注:ファイルをに追加したいAndroidユーザー(ROM開発者ではない)の場合は、代わりに関連するAndroid.SEの質問rootfsを参照しください。


3
AndroidはLinuxシステムですが、質問はすべてのUnixではなく、Androidに固有なので、それのためのより良い場所はandroid.stackexchange.comにあります
enedil

@enedil一般的に言えば、Androidは一般的な意味でのLinuxではないため、Androidの質問はここでは話題から外れています(Linuxカーネルを使用するだけです)。ただし、同じ質問が他の組み込みLinuxシステムにも当てはまるので、ここでは問題ないと思います。
Gilles「SO-邪悪なことをやめなさい」

@Graeme実際、ルートファイルシステムはすべてのカーネルにコンパイルされています。通常は空で、cpioアーカイブを解凍します-私たちのinitramfsイメージ。コンパイル時にも好きなように置くことができます。
mikeserv 2014

@enedilこの場合、私はこの質問が完全に話題になっていると思います。Androidは他のUNIXと最も異なりますuserspace,が、他のLinuxとはin-kernel異なり、その違いはほんの一部のパッチにすぎません。実際、Androidの人気はカーネル開発の主な原動力であり、数年前から存在しています。kernel.orgの変更ログを見て、モバイルシステム(特にAndroid)にどれだけ関連性があるかを自分で判断してください。
mikeserv 2014

Android.SEでの同様の質問:ROM移植のために解凍して編集する方法はboot.imgboot.imgデバイスのルートディレクトリの内容を永続的に変更できるように、ファイルをフェッチして編集する方法を説明する回答。
WhiteWinterWolf 2016

回答:


7

Androidでは、多くのLinuxベースのシステムと同様に、カーネルは最初にinitramfsをにマウントし/ます。initramfsはRAMに格納されます。カーネル自体(またはブートローダーがそれを見つけることができる他の場所)に格納されているCPIOアーカイブからロードされます。

ほとんどのデスクトップLinuxシステムには、実際のルートファイルシステムをマウントするのに十分なプログラムと構成ファイルが含まれている小さなinitramfsがあり、それをにマウントし/てinitramfsを置き換えます。Androidは、一部の組み込みLinuxシステムと同様に、initramfsを永久にマウントしたままにします。Androidのinitramfsには/initadbdといくつかの構成ファイルのみが含まれています。

Cyanogenmodの場合、ビルド手順は移植ガイドに記載されています。さらに多くのファイルをramdisk(Android用語ではinitramfsイメージ)にコピーしたいので、デバイスのmakefile のPRODUCT_COPY_FILESリストにそれらを追加する必要がありdevice_*.mkます。


実際、私たちのinitramfs イメージファイルはそれらの設定ファイルを含むものであり、initramfs ファイルシステムはすべてのカーネルにコンパイルされています。
mikeserv 14

1
@mikeserv 換喩の概念に慣れるように勧めます。テクニカルライティングは通常のスピーチよりも使用頻度が低くなりますが、時々使用されます。
Gilles「SO-邪悪なことをやめなさい」

そうしますが、最初に辞書で確認する必要があります...
mikeserv

あなたは非常に良い点を述べています、そして前に言ったように、私がこれについて断固たる唯一の理由は、それがあまり理解されていないようですが、それは本当に非常に簡単ですので、私はこのトピックについて少し間違える傾向があります-申し訳ありません。上記の詳細が明確になった場合、カーネルから独自のシステムを設計することがいかに簡単であるかを他の人に示すほうが簡単だと思います。繰り返しますが、申し訳ありません、Gilles、私は侮辱を一切意味しません。
mikeserv 2014

@mikeservアドバイスありがとうございます。blobのコピーに使用するファイル(blbs.mk)を見つけました。rootfs(/)にフォルダーフォルダーを追加するためにどのファイルを編集する必要があるのか​​、まだわかりません。私はromのinit * .rcファイルにアクセスできますが、(たとえばmkdir / titiを追加して)これらのファイルを編集すると、フォルダー(/ titi)を永久に追加できるようになります。その後、ファイルPRODUCT_COPY_FILES + = / titi / myfile:<localpath> / myfilesに追加します。どんな手掛かり ?再びありがとう
デッドイート14

1

カーネルのドキュメントには、カーネル自体にイメージをパックする方法が説明されています。kernel.orgから:

rootfsとは何ですか?

Rootfsの特別なインスタンスramfs(またはtmpfs有効になっている場合)であり 、2.6システムに常に存在します。initプロセスを終了できないのとほぼ同じ理由で、マウントrootfs解除 することはできません。空のリストをチェックして処理する特別なコードを用意するのではなく、特定のリストが空にならないようにするだけの方がカーネルにとっては小さくて簡単です。

ほとんどのシステムでは、別のファイルシステムをマウントしrootfsて無視します。ramfsの空のインスタンスが占めるスペースの量はごくわずかです。

CONFIG_TMPFSが有効な場合、デフォルトでrootfstmpfsなくが使用ramfsされます。力にramfs追加"rootfstype=ramfs"のカーネルコマンドラインに。

initramfsとは何ですか?

すべての2.6 Linuxカーネルに、カーネルの起動時に抽出される gzip圧縮された"cpio"形式のアーカイブが含まれています。 抽出した後ならば、カーネルかどうかを確認し、ファイルが含まれているとしてそれを実行している場合、PID 1. もしが見つかっ、このプロセスは、位置と実際のルートデバイスを取り付け、システムの道までの残りの部分をもたらすなどのために責任があります(存在する場合)。埋め込まれたアーカイブがそこに抽出された後にプログラムが含まれていない 場合、カーネルはルートパーティションを見つけてマウントするために古いコードにフォールスルーし、その中からいくつかのバリアントを実行します。rootfsrootfs"init"initrootfsinitcpio/sbin/init

これはすべて、いくつかの点で古いinitrdとは異なります。

  • 古いinitrdは常に個別のファイルでしたが、initramfsアーカイブはLinuxカーネルイメージにリンクされています。 (ディレクトリlinux-* / usrは、ビルド中にこのアーカイブを生成するために使用されます。)

  • 古いinitrdファイルはgzipで圧縮されたファイルシステムイメージ(ext2など、カーネルに組み込まれたドライバーが必要なファイル形式)でしたが、新しいinitramfsアーカイブはgzipで圧縮されたcpioアーカイブです(tarの方が単純です、cpio(1)を参照)。およびDocumentation / early-userspace / buffer-format.txt)。カーネルのcpio抽出コードは非常に小さいだけでなく、ブートプロセス中に破棄される__initテキストおよびデータでもあります。

  • 古いinitrd(/ initではなく/ initrdと呼ばれていました)によって実行されたプログラムは、いくつかの設定を行ってからカーネルに戻りましたが、initramfsからのinitプログラムはカーネルに戻ることが期待されていません。(/ initが制御を渡す必要がある場合、新しいルートデバイスで/をオーバーマウントし、別のinitプログラムを実行することができます。以下のswitch_rootユーティリティを参照してください。)

  • 別のルートデバイスを切り替えるとき、initrdはピボットルートを作成してから、ラムディスクをアンマウントします。しかし、initramfsはrootfsです。pivot_rootrootfsもアンマウントもできません。 代わりに、rootfsからすべてを削除してスペースを解放し(find -xdev / -exec rm '{}' ';')、rootfsを新しいルートでオーバーマウントします(cd / newmount; mount --move。/; chroot。)、 stdin / stdout / stderrを新しい/ dev / consoleにアタッチし、新しいinitを実行します。

これは非常に細心の注意を要するプロセスであるため(そして、コマンドを実行する前にコマンドを削除する必要があるため)、klibcパッケージには、これをすべて行うためのヘルパープログラム(utils / run_init.c)が導入されています。他のほとんどのパッケージ(busyboxなど)では、このコマンドに「switch_root」という名前が付けられています。

initramfsへの入力:

2.6カーネルビルドプロセスでは、常にgzip圧縮されたcpio形式のinitramfsアーカイブが作成され、結果のカーネルバイナリにリンクされます。 デフォルトでは、このアーカイブは空です(x86では134バイトを消費します)。

コンフィグオプションCONFIG_INITRAMFS_SOURCE(で一般的なセットアップmenuconfig,との生活ではusr/Kconfig)のソースを指定するために使用することができ initramfsますアーカイブ、自動的に生成されたバイナリに組み込むことを。 このオプションは、* 既存の gzip圧縮されたcpio*アーカイブ、アーカイブされるファイルを含むディレクトリ、または次の例のようなテキストファイル指定を指すことができます。

 dir /dev 755 0 0
 nod /dev/console 644 0 0 c 5 1
 nod /dev/loop0 644 0 0 b 7 0
 dir /bin 755 1000 1000
 slink /bin/sh busybox 777 0 0
 file /bin/busybox initramfs/busybox 755 0 0
 dir /proc 755 0 0
 dir /sys 755 0 0
 dir /mnt 755 0 0
 file /init initramfs/init.sh 755 0 0

(カーネルのビルド後に)" usr/gen_init_cpio"を実行して、上記のファイル形式を説明する使用方法メッセージを取得します。

構成ファイルの利点の1つは、rootアクセス許可を設定したり、新しいアーカイブにデバイスノードを作成したりする必要がないことです。

これらの2つの「ファイル」エントリの例では、「init.sh」および「busybox」という名前のファイルinitramfslinux-2.6。*ディレクトリの下の「」というディレクトリにあると想定しています。詳細については、Documentation / early-userspace / READMEを参照してください。)

カーネルは外部ツールに依存しませcpio。構成ファイルの代わりにディレクトリを指定すると、カーネルのビルドインフラストラクチャはそのディレクトリから構成ファイルを作成し(をusr/Makefile呼び出しscripts/gen_initramfs_list.sh)、構成ファイルを使用してそのディレクトリをパッケージ化しますusr/gen_init_cpioから作成されるにフィードすることによりusr/gen_init_cpio.c)。 カーネルのビルド時cpio作成コードは完全に自己完結型であり、カーネルのブート時抽出も(明らかに)自己完結型です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.