web-dev-qa-db-ja.com

initrd.imgを再パックする方法は?

元の/boot/initrd.img-kernel_verbinwalkには次の構造が表示されます。

enter image description here

から22528バイトまでCPIOアーカイブにはGenuineIntel.binのみが含まれます特定のフォルダー階層のファームウェア。
From22528バイトにはgzipがありますarchiweには適切なファイルシステムが含まれ、このgzipもCPIOでアーカイブされます

解凍して変更した後、同じ方法で(同じフォルダー階層で)initrd.imgを圧縮するにはどうすればよいですか?この元の構造のように:

enter image description here

コメントからの提案の後:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

binwalk

enter image description here

これは完全に異なる構造です。

8
EdiD

再パッケージする

cd your_working_directory_with_modifications
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

2番目のコマンドはinitrdの名前を変更します。grubで起動するときに使用するinitrdを指定します。

移動または名前を変更する前に、カスタムinitrdをテスト(ブート)することをお勧めします。

コメントの議論からの追加情報:

まず、cpio/tarの役割を理解しているとは思わない。 cpioとtarの両方がいくつかのファイルやディレクトリを取り、それらを1つのファイルまたはアーカイブにします。

第二に、圧縮の役割を理解していないと思います。圧縮すると、結果のアーカイブが小さくなります。圧縮には任意のツールを使用できます。

見る

https://wiki.ubuntu.com/CustomizeLiveInitrd

https://wiki.gentoo.org/wiki/Initramfs/Guide

第三に、Linuxカーネルはtarではなくcipoを使用します。

見る

https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

「tarではなくcpioを使用する理由」を参照してください。セクション

なぜtarではなくcpioなのですか?

この決定は2001年12月に行われました。議論はここから始まりました。

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

そして、ここから始まる2番目のスレッド(具体的にはtar対cpio)を生成しました。

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

クイックでダーティな要約バージョン(上記のスレッドを読む代わりになりません)は次のとおりです。

1)cpioは標準です。それは数十年前(AT&T時代から)であり、すでにLinux(RPM内、Red Hatのデバイスドライバーディスク)で広く使用されています。 1996年からのLinux Journalの記事は次のとおりです。

  http://www.linuxjournal.com/article/1213

従来のcpioコマンドラインツールは_truly_hideous_コマンドライン引数を必要とするため、tarほど一般的ではありません。しかし、それはアーカイブ形式については何も言わず、次のような代替ツールがあります:

 http://freecode.com/projects/afio

2)カーネルによって選択されたcpioアーカイブ形式は、さまざまなtarアーカイブ形式(文字通り数十)のどれよりも単純でクリーンです(したがって、作成および解析が容易です)。完全なinitramfsアーカイブ形式は、usr/gen_init_cpio.cで作成され、init/initramfs.cで抽出されたbuffer-format.txtで説明されています。 3つすべてを合わせると、合計で26k未満の人間が読めるテキストになります。

3)tarで標準化するGNUプロジェクトは、Zipで標準化するWindowsとほぼ同じくらい関連しています。 Linuxはどちらの一部でもないため、技術的な決定を自由に行うことができます。

4)これはカーネルの内部形式であるため、簡単に変更できます。
真新しいもの。カーネルは、とにかくこの形式を作成および抽出するための独自のツールを提供します。既存の標準を使用することが望ましいですが、必須ではありません。

5)Al Viroが決定しました(引用:「tarは地獄のようにく、カーネル側ではサポートされません」):

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

彼の推論を説明した:

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html
  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

そして、最も重要なのは、initramfsコードを設計および実装したことです。

3
Panther

まったく同じinitrd.imgアーカイブを作成する方法を見つけました。

Bodhi.zazenの回答は、これが一般的に知られているソリューションであるため、おそらく機能します。

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

しかし、質問は異なっていました。この回答は、cpioアーカイブにgzip圧縮されたファイルシステムが1つある場合に適していますが、この状況では、特定のフォルダー構造にIntelファームウェアがあり、これを保持する必要があります。

同じフォルダ階層を維持するには、3つの手順が必要です。

  1. CPIOファイルシステムアーカイブを、newc形式なしのシンプルな-oオプションで作成します。基本フォルダー:

    find . | cpio -o | gzip -9 > ../base/file_system.gz

  2. newc形式で適切なアーカイブを作成しますkernel/x86/microcode/GenuineIntel.bin

    find kernel/ | cpio -o -H newc > new_initrd.img

  3. Gzip圧縮されたファイルシステムアーカイブを適切なnew_initrd.imgに追加します。

    find base/ | cpio -o >> new_initrd.img

3
EdiD

私は最近この同じ質問に出くわし、私のウェブ検索はこのスレッドにつながったので、それが他の人がそれらの足跡をたどるのを助けるなら、ここに古い質問に対する2018年の答えがあります...

「最近の」カーネルでは、initrd.imgファイルには、通常のinitramfsディレクトリツリーを含む(圧縮された)cpioアーカイブの前に、圧縮されていないcpioアーカイブ(つまり、マイクロコード更新を含む)を含めることができます。

これはDebian Wikiページで簡単に議論されています:
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
が、この種のinitrd.imgファイルを解析するためのより正確なコードは、initramfs-tools-coreパッケージにあるunmkinitramfsコマンド内のsplitinitramfs()関数で見つけることができます(例: https://git.launchpad.net/ubuntu/+source/initramfs-tools/tree/unmkinitramfs )。

私はこの種のinitrd.imgファイルを自分で再構築しようとしませんでしたが、そのWikiページに基づいて、initramfsブートスクリプトを編集するため、GenuineIntelアーカイブをまったく解凍したくないようです。代わりに、そのcpioアーカイブを別の場所にそのまま保存し、2番目の(圧縮された)アーカイブを解凍し、ディレクトリツリーを変更し、圧縮されたcpioアーカイブを再構築し、保存されたマイクロコードアーカイブを新しく生成されたマイクロコードアーカイブに連結します。

(元々この「追加された」アーカイブを生成したコードは、/usr/share/initramfs-tools/hooks/intel_microcodeにあります。)

1
Nathan

ubuntuではinitrd.imgはgzipで圧縮されていますが、編集するときにこれを保持したいと思います。こうやって:

エキス:

zcat /boot/initrd.img-3.19.0-80-generic | cpio --extract

圧縮する:

find . 2>/dev/null | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/initrd.img-3.19.0-80-generic
0
Jossef Harush