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


9

元の/boot/initrd.img-で、kernel_ver binwalkはこの構造を示しています。

ここに画像の説明を入力してください

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

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

ここに画像の説明を入力してください

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

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

binwalk

ここに画像の説明を入力してください

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


initrd.imgを作業ディレクトリに抽出します。GenuineIntel.binファームウェアを特定のフォルダー階層で作業ディレクトリに追加します。次に、次のfind . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lzコマンドでアーカイブを再作成します。その手順が機能しない場合は、実行したコマンドと機能していないものを明確にします。
パンサー2016年

写真付きのあなたの編集は、あなたの問題の私の理解のほとんど何も追加しません。画像を抽出し、適切なファイル構造とGenuineIntel.binファームウェアの場所をコードに追加して、新しい.imgに再パッケージする必要があります。
パンサー

@ bodhi.zazen私が言ったようにこれは別のファイルを作りました...
EdiD '26

@ bodhi.zazen私が求めていることをようやく理解できましたか?
EdiD 2016年

1
initramfsファイルはCPIOアーカイブを連結したもののようです。各CPIOアーカイブは、圧縮(gzip、xzなどを使用)または非圧縮できます。入力ファイルはオフセット0の圧縮されていないファイルで始まり、オフセット22528の圧縮されたファイルで続行します。残念ながら、圧縮された可能性のあるCPIOアーカイブの連結を抽出できる標準ツールは知りません。
PTS

回答:


4

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

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

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

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

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

  1. 作るCPIOことなく、簡単な-oオプションを使用して、ファイルシステムアーカイブをnewc例えば前に作成されたフォーマット。基本フォルダ:

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

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

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

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

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


1
すごい!ありがとう!+10!しかし、どのようにして元のinitrdを解凍しますか?
2018

また、ソリューションは少し異なる構造を作成します。最初にステップ(2)を実行したときとビンウォークでまったく同じ構造を持っていますfind . | cpio -o | gzip -9 >> new_initrd.img
rth

@EdiDどのようにして元のinitrdを解凍しますか?
ImranRazaKhan

1
@ImranRazaKhanには4つのステップが必要ですcpio -id < initrd.img-kernel_verdd if=initrd.img-4.4.0-22-generic of=image.gz bs=22528 skip=1-initrd.imgファイル名とブロックサイズを一致させます。 gunzip image.gz; cpio -i < image
EdiD

3

あなたは

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

3番目に、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アーカイブ形式はbuffer-format.txtで説明され、usr / gen_init_cpio.cで作成され、init / initramfs.cで抽出されます。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と同じ構造が必要です。意味-> kernel / x86 / microcodeフォルダーのルートでcpioを使用してアーカイブしただけではGenuineIntel.binは圧縮されず、なぜgzipについて話しているときにlzmaなのか?
EdiD 2016年

lzmaはより小さなアーカイブを提供します。必要に応じてgzipを使用します。なぜ圧縮が心配なのかわからないので、圧縮で問題なく動作し、ディスク上のイメージが小さくなります。あなたが投稿したものから何を達成しようとしているのか本当にわかりません。
パンサー

元々どのように行われたのか知りたい。おそらくアクセシビリティが高いため、Intelファームウェアは圧縮されていません。
EdiD 2016年

ほぼ間違いなく圧縮されているので、アーカイブを確認できます。圧縮はパフォーマンスに大きな影響を与えないため、デフォルトで使用されます。
パンサー

cpioのマニュアルには圧縮については何もありません。:受け入れ答えをチェックsuperuser.com/questions/343915/...
EDID

3

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

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

これはDebianのWikiページで簡単に説明されています
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
が、initrd.imgをファイルのこの種を通じて解析するためのより正確なコードはで見つけることができますsplitinitramfs()内の関数unmkinitramfsで見つかったコマンドinitramfs-tools-coreパッケージ(例: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ます。)


0

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

エキス:

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