web-dev-qa-db-ja.com

Ubuntu 18.10 Cosmic Cuttlefishのinitrd初期ramdiskを変更する方法

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

私が期待すること

initetcusrなどのようなファイルとフォルダーがあるはずです。例えば:

bin  conf  cryptroot  etc  init  lib  lib64  run  sbin  scripts  usr  var
2
tai271828

Ubuntu 18.10のinitrdは、以前のリリースとは異なる方法でアーカイブされていることがわかりました。以前のリリースでは、initrdは通常lzma(または以前のリリースではgzip)圧縮されたcpioアーカイブです。 18.10のinitrdは、異なる形式の複数のバイナリファイルで構成されるアーカイブです。

アーカイブに飛び込むには、binwalk(または他の同様のツールが必要です。Sudo apt install binwalkbinwalkを取得できます)。 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(ini​​trd.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 =

3
tai271828