GNU/Linux >> Linux の 問題 >  >> Linux

initrd のディレクトリが 'kernel' の 1 つしかないのはなぜですか?

指定された cpio ブロック スキップ メソッドは確実に機能しません。これは、私が取得していた initrd イメージに、512 バイト境界で連結された両方のアーカイブが含まれていなかったためです。

代わりに、次のようにします:

apt-get install binwalk
legolas [mc]# binwalk initrd.img 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
120           0x78            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
244           0xF4            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
376           0x178           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00005000"
21004         0x520C          ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
21136         0x5290          gzip compressed data, from Unix, last modified: Sat Feb 28 09:46:24 2015

512 バイト境界にない最後の番号 (21136) を使用してください:

legolas [mc]# dd if=initrd.img bs=21136 skip=1 | gunzip | cpio -tdv | head
drwxr-xr-x   1 root     root            0 Feb 28 09:46 .
drwxr-xr-x   1 root     root            0 Feb 28 09:46 bin
-rwxr-xr-x   1 root     root       554424 Dec 17  2011 bin/busybox
lrwxrwxrwx   1 root     root            7 Feb 28 09:46 bin/sh -> busybox
-rwxr-xr-x   1 root     root       111288 Sep 23  2011 bin/loadkeys
-rwxr-xr-x   1 root     root         2800 Aug 19  2013 bin/cat
-rwxr-xr-x   1 root     root          856 Aug 19  2013 bin/chroot
-rwxr-xr-x   1 root     root         5224 Aug 19  2013 bin/cpio
-rwxr-xr-x   1 root     root         3936 Aug 19  2013 bin/dd
-rwxr-xr-x   1 root     root          984 Aug 19  2013 bin/dmesg

initrd.img を知っている場合 圧縮されていない cpio アーカイブとそれに続く gz 圧縮された cpio アーカイブで構成されている場合、以下を使用して、(両方のアーカイブから) すべてのファイルを現在の作業ディレクトリに抽出できます (bash でテスト済み):

(cpio -id; zcat | cpio -id) < /path/to/initrd.img

上記のコマンドラインは initrd.img の内容を渡します 2 つのコマンド cpio -id を実行するサブシェルへの標準入力として と zcat | cpio -id 順次。最初のコマンド (cpio -id ) は、最初の cpio アーカイブに属するすべてのデータを読み取ると終了します。残りのコンテンツは zcat | cpio -id に渡されます 、2 番目のアーカイブを解凍して解凍します。


Debian の live-build によって生成された (そして驚いたことに、カーネルによって受け入れられた) initrd は、実際には 2 つのイメージの連結であることがわかりました:

  • プロセッサに適用されるマイクロコードの更新を含む CPIO アーカイブ;
  • gzip で圧縮された cpio アーカイブ。実際には initrd ファイル ツリーが含まれています (想定される /etc /bin /sbin /dev ... ディレクトリを含む)。

元の initrd.img を live-build 出力から直接抽出すると、次の出力が得られました。

$cpio -idv ../initrd.img
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
896 blocks

これは、それぞれ 512 バイトの 896 ブロックを解析した後に cpio 抽出が終了したことを意味します。しかし、元の initrd.img は 896*512 =458752B =448 KB よりもはるかに大きかった:

$ls -liah initrd.img
3933924 -r--r--r-- 1 root root 21M Oct 21 10:05 initrd.img

したがって、私が探していた実際の initrd イメージは、最初の cpio アーカイブ (マイクロコードの更新を含むもの) の直後に追加され、dd を使用してアクセスできました:

$dd if=initrd.img of=myActualInitrdImage.img.gz bs=512 skip=896

Linux
  1. Rsyncフィルター:1つのパターンのみをコピーしますか?

  2. ファイルシステムのルート用に予約されたスペース–なぜですか?

  3. 1つのパーティションのみを同期する方法は?

  1. Bashスクリプトのインスタンスを1つだけ実行するようにするにはどうすればよいですか?

  2. Linux –ルートディレクトリがA /記号で示されているのはなぜですか?

  3. 起動時に最初のシェルがキーを要求するだけの方法でキーチェーンを実行するにはどうすればよいですか?

  1. フォルダーを実行可能にする必要があるのはなぜですか?

  2. PATH にあるプログラムに対して Bash が No such file or directory を与えるのはなぜですか?

  3. ルート ディレクトリが / 記号で示されるのはなぜですか?