通常は1つのファイルのみが変更されるさまざまなLinuxディストリビューションからのinitramfs
アーカイブの束を変更しています。
Rootユーザーに切り替えずにプロセスを自動化し、initramfs
イメージ内のすべてのファイルを抽出して再度パックします。
最初に、gen_init_cpio
のファイルのリストを生成しようとしましたなしinitramfs
アーカイブのすべてのコンテンツを抽出します。つまり、cpio -tvn initrd.img
の出力を解析します( ls -l
出力)スクリプトを使用して、すべての権限を8進数に変更し、出力をgen_init_cpio
が望む形式に配置します。
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
これにはいくつかの置換が含まれ、スクリプトを書くのが難しい場合があるので、より良い方法を見つけて、安全性と移植性がどの程度かについて質問します。
一部のディストリビューションでは、パーツが連結されたinitramfs
ファイルがあり、カーネルはファイル全体を解析して、1バイト境界にパックされたすべてのパーツを抽出しているため、各パーツを512の倍数に埋める必要はありません。バイト。この「機能」は、アーカイブ内のファイルを変更するときにアーカイブを再作成しないようにするのに役立つと思いました。実際、少なくともDebian
とCloneZilla
については機能します。
たとえば、Debian 8.2.0の/init
のinitrd.gz
ファイルを変更した場合、次のコマンドを使用してinitrd.gz
イメージに追加できます。
$ echo ./init | cpio -H newc -o | gzip >> initrd.gz
そのため、initrd.gz
には、元のアーカイブとその変更の2つのアーカイブが連結されています。 binwalk
の結果を見てみましょう:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 gzip compressed data, maximum compression, has original file name: "initrd", from Unix, last modified: Tue Sep 1 09:33:08 2015
6299939 0x602123 gzip compressed data, from Unix, last modified: Tue Nov 17 16:06:13 2015
それは完全に動作します。しかし、それは信頼できますか? initfamfs
ファイルにデータを追加する場合、どのような制限がありますか?元のアーカイブに512バイトの倍数までパディングしないで追加しても安全ですか?この機能はどのカーネルバージョンからサポートされていますか?
これは非常に信頼性が高く、initrd、AFAIKをサポートするすべてのカーネルバージョンでサポートされています。これは、cpio
が構成されているinitramfs
アーカイブの機能です。 cpio
は、その入力を抽出し続けます...ファイルが2つのcpioアーカイブであることがわかっている場合がありますが、cpioはそれを単一の入力ストリームとして認識します。
Debianは、この方法(別のcpioをinitramfsに追加する)を使用して、binary-blobファームウェアをインストーラーのinitramfsに追加することを推奨しています。例えば:
DebianInstaller/NetbootFirmware | Debian Wiki
Initramfsは、本質的にはgzipで圧縮されたcpioアーカイブを連結したもので、ramdiskに抽出され、Linuxカーネルによって初期のユーザー空間として使用されます。 Debianインストーラのinitrd.gzは、実際には、インストーラがブート時に必要とするすべてのファイルを含む単一のgzip圧縮されたcpioアーカイブです。別のgzip圧縮されたcpioアーカイブを追加するだけで-欠落しているファームウェアファイルが含まれます-ショーが始まります!