私はCyanogenmod ROMのカーネルソースコードに基づいてカスタムAndroidカーネルを構築しています。私のオペレーティングシステム()のルートフォルダにフォルダとファイルを追加したいです/
。たとえば、カーネルをコンパイルした後toto
(絶対パス=)という追加のフォルダを作成したいと思います。/toto
どのファイルを編集するのか、どのように作業するのかわかりません。
rootfs
注: ROM開発者以外のAndroidユーザーで、コンピュータにファイルを追加する場合関連するAndroid.SEの問題代わりに。
答え1
Androidでは、多くのLinuxベースのシステムと同様に、カーネルは最初に次のものをインストールします。ファイルシステムの初期化存在する/
。 initramfsはRAMに保存され、カーネル自体(またはブートローダが見つけることができる他の場所)と共に保存されているCPIOアーカイブからロードされます。
ほとんどのデスクトップLinuxシステムには、実際のルートファイルシステムをマウントするのに十分なプログラムと設定ファイルを含む小さなinitramfsがあり、これは/
initramfsを置き換えるためにマウントされています。一部の組み込みLinuxシステムと同様に、Androidは常にinitramfsをインストールしたままにします。 Androidのinitramfsには、いくつかの設定ファイルのみが含まれてい/init
ますadbd
。
Cyanogenmodの場合、ビルドのガイドラインは以下にあります。移行ガイド。より多くのファイルをRAMディスク(Android用語でinitramfsイメージ)にコピーしたいので、そのファイルをRAMディスクPRODUCT_COPY_FILES
に追加する必要があります。device_*.mk
デバイスの makefile を作成します。
答え2
カーネルドキュメントでは、イメージをカーネル自体にパッケージする方法について説明します。 ~からkernel.org:
rootfsとは何ですか?
Rootfs
特別なケースですramfs
(またはtmpfs
、有効な場合)、つまり 2.6 システムには常に存在します。 あなた削除できません。rootfs
ほとんど同じ理由でinitプロセスを終了できません。カーネルは空のリストをチェックして処理するために特別なコードを使用する必要はありませんが、特定のリストが空にならないようにするためにはるかに小さくて簡単です。ほとんどのシステムは他のファイルシステムをマウントします。
rootfs
そしてそれを無視してください。 ramfsの空のインスタンスが占めるスペースの量は次のとおりです。非常に小さい。もしCONFIG_TMPFS活性化、
rootfs
使用するtmpfs
変えるramfs
基本的に。力ramfs
、次へ追加"rootfstype=ramfs"
カーネルコマンドラインで。initramfsとは何ですか?
すべての2.6 Linuxカーネル圧縮されたgzipが含まれています。
"cpio"
形式アーカイブ、つまりrootfs
カーネルの起動時に抽出します。 解凍後、カーネルは以下を確認します。rootfs
ファイルが含まれています"init"
、その場合は、次のように実行されます。PID 1. 見つかったらinit
このプロセスは、実際のルートデバイスの検索やインストールなど、システムの実行を維持する役割を果たします。(もしそうなら)。 もしrootfs
含まれていませんinit
組み込みプログラムcpio
アーカイブが抽出され、カーネルは前のコードでルートパーティションを見つけてマウントし、いくつかのバリエーションを実行します。/sbin/init
それから。これはすべて多くの点で以前のinitrdとは異なります。
以前のinitrdは常に別々のファイルでした。initramfs アーカイブは Linux カーネルイメージにリンクされています。 (linux- * / usrディレクトリは、ビルドプロセス中にこのアーカイブを生成するために特に使用されます。)
古いinitrdファイルはgzipで圧縮されたファイルシステムイメージ(ext2などの一部のファイル形式ではカーネルにドライバが組み込まれている必要があります)でしたが、新しいinitramfsアーカイブはgzipで圧縮されたcpioアーカイブ(tarに似ていますがより単純です)です。 、cpio(1))、およびドキュメント/early-userspace/buffer-format.txt)を参照してください。カーネルのcpio抽出コードが非常に小さいだけでなく、ブートプロセス中に破棄される可能性がある__initテキストとデータです。
以前のinitrd(/ initではなく/ initrdと呼ばれる)はいくつかの設定を実行してからカーネルに戻るプログラムを実行しましたが、initramfsのinitプログラムはカーネルに戻るとは予想されませんでした。 (/init が制御権を渡す必要がある場合は、/ を新しいルートデバイスで上書きし、別の初期化プログラムを実行できます。下記の switch_root ユーティリティを参照してください。)
別のルートデバイスに切り替えるときは、initrdivov_rootを実行してRAMディスクを取り外します。しかし、initramfs は rootfs です。 rootfsをピボットルートまたはマウント解除できません。 代わりに、rootfsのすべてのエントリを削除してスペースを解放し(-xdev / -exec rm '{}' ';'を探す)、rootfsを新しいルートで上書きし(cd /newmount; mount --move . /; .), stdin /stdout/stderr 新しい /dev/console に接続し、新しい初期化を実行します。
これは非常にトリッキーなプロセスであるため(コマンドを実行する前にコマンドを削除する必要があるため)、klibcパッケージにはこれらすべての操作を実行するヘルパープログラム(utils / run_init.c)が導入されました。他のほとんどのパッケージ(たとえば、busybox)は、このコマンドの名前を「switch_root」と指定しました。
initramfsを埋めます。
2.6 カーネル構築プロセス常にgzipで圧縮されたcpio形式のinitramfsアーカイブを作成し、生成されたカーネルバイナリにリンクします。 デフォルトでは、アーカイブは空です(x86の場合は134バイト)。
構成オプションCONFIG_INITRAMFS_SOURCE(存在する一般設定in
menuconfig,
とliveusr/Kconfig
)を使用してinitramfs
アーカイブのソースを指定できます。生成されたバイナリに自動的にマージされます。 このオプションは*を指すことができます。既存のgzippedcpio
*アーカイブ、a目次アーカイブするファイルが含まれているか、テキストファイルの仕様は次のとおりです。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つの例の "file"エントリは、-2.6.*ディレクトリの下の ""ディレクトリに""および""
init.sh
ファイルを見つけることを期待しています。バラよりbusybox
initramfs
linux
ドキュメント/初期ユーザースペース/Readme詳細については。 )カーネルがそうだったいいえ外部
cpio
ツールに頼ってください。設定ファイルの代わりにディレクトリを指定すると、カーネルのビルドインフラストラクチャはそのディレクトリから設定ファイルを生成します。(usr/Makefile
呼ぶscripts/gen_initramfs_list.sh
)、構成ファイルを使用してディレクトリをパッケージ化し続けます。(に入力するusr/gen_init_cpio
とから生成されますusr/gen_init_cpio.c
。) カーネルのビルド時間cpio
生成コードは完全に独立しており、カーネルのブート時間抽出も(明らかに)独立しています。