元の/boot/initrd.img-kernel_verbinwalk
には次の構造が表示されます。
から22528バイトまでCPIOアーカイブにはGenuineIntel.binのみが含まれます特定のフォルダー階層のファームウェア。
From22528バイトにはgzipがありますarchiweには適切なファイルシステムが含まれ、このgzipもCPIOでアーカイブされます
解凍して変更した後、同じ方法で(同じフォルダー階層で)initrd.imgを圧縮するにはどうすればよいですか?この元の構造のように:
コメントからの提案の後:
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz
binwalk
:
これは完全に異なる構造です。
再パッケージする
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コードを設計および実装したことです。
まったく同じinitrd.img
アーカイブを作成する方法を見つけました。
Bodhi.zazenの回答は、これが一般的に知られているソリューションであるため、おそらく機能します。
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz
しかし、質問は異なっていました。この回答は、cpioアーカイブにgzip圧縮されたファイルシステムが1つある場合に適していますが、この状況では、特定のフォルダー構造にIntelファームウェアがあり、これを保持する必要があります。
CPIOファイルシステムアーカイブを、newc形式なしのシンプルな-oオプションで作成します。基本フォルダー:
find . | cpio -o | gzip -9 > ../base/file_system.gz
newc形式で適切なアーカイブを作成しますkernel/x86/microcode/GenuineIntel.bin:
find kernel/ | cpio -o -H newc > new_initrd.img
Gzip圧縮されたファイルシステムアーカイブを適切なnew_initrd.imgに追加します。
find base/ | cpio -o >> new_initrd.img
私は最近この同じ質問に出くわし、私のウェブ検索はこのスレッドにつながったので、それが他の人がそれらの足跡をたどるのを助けるなら、ここに古い質問に対する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
にあります。)
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