Ubuntu 18.10のinitrd casper/initrd
を抽出しようとすると、予期しない結果が得られました。ルートファイルシステムとファイルは表示されませんでしたが、kernel
という名前のフォルダーだけが表示されました。
最初に、initrdを解凍するか、アーカイブを直接抽出するかを確認しようとしたので、次のコマンドを発行しました。
$ file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
出力によると、cpioアーカイブである必要があり、cpio
を使用してアーカイブを抽出しました。
$ cpio -id < initrd
56 blocks
$ ls
initrd kernel
ディレクトリkernel
を見てみると、
kernel/
└── x86
└── microcode
└── AuthenticAMD.bin
2 directories, 1 file
init
、etc
、usr
などのようなファイルとフォルダーがあるはずです。例えば:
bin conf cryptroot etc init lib lib64 run sbin scripts usr var
Ubuntu 18.10のinitrdは、以前のリリースとは異なる方法でアーカイブされていることがわかりました。以前のリリースでは、initrdは通常lzma(または以前のリリースではgzip)圧縮されたcpioアーカイブです。 18.10のinitrdは、異なる形式の複数のバイナリファイルで構成されるアーカイブです。
アーカイブに飛び込むには、binwalk
(または他の同様のツールが必要です。Sudo apt install binwalk
でbinwalk
を取得できます)。 binwalk
を取得したら、コマンドbinwalk initrd
を発行します。
$ binwalk initrd
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ASCII cpio archive (SVR4 with no CRC), file name: ".", file name length: "0x00000002", file size: "0x00000000"
112 0x70 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
232 0xE8 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
356 0x164 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
488 0x1E8 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/AuthenticAMD.bin", file name length: "0x00000026", file size: "0x00006B2A"
28072 0x6DA8 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
28672 0x7000 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
28792 0x7078 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
28916 0x70F4 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
29048 0x7178 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/.enuineIntel.align.0123456789abc", file name length: "0x00000036", file size: "0x00000000"
29212 0x721C ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00180C00"
1605296 0x187EB0 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
1605632 0x188000 LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes
2つのマイクロコードバイナリファイルとLZMA圧縮データファイルがあることがわかります。後者は私たちが望むものです:lzma圧縮されたinitrd。
Lzmaを圧縮したinitrdを取得してみましょう
dd if = initrd bs = 1605632 skip = 1 | unlzma -c | cpio -id
質問に記載されている予想されるファイルを取得します。変更するファイルを編集します。次のコマンドを使用して、バイナリファイルを再パックします。
見つける| cpio -H newc -o | lzma -c> initrd.partial.lz
最後に、マイクロコードファイルと新しいinitrd(initrd.partial.lz)を連結します。
dd if=initrd of=initrd.microcode bs=512 count=3136
cat initrd.microcode initrd.partial.lz > initrd.new
initrd.new
の名前をinitrd
に変更し、casper/initrd
に戻します。新しいinitrdでライブシステムを起動できます。
私の答えはこの投稿に触発されました https://unix.stackexchange.com/questions/163346/why-is-it-that-my-initrd-only-has-one-directory-namely-kernel =