私のinitrdには、解凍後に「カーネル」となるディレクトリが1つしかありません。

私のinitrdには、解凍後に「カーネル」となるディレクトリが1つしかありません。

ファイルはブロックサイズ56を示す。私はUbuntu 16.04を使用しており、カーネルを更新する必要のないソリューションが必要です。

ベストアンサー1

名前はで指定できますが、initrd実際にはですinitramfs従属複数のcpioアーカイブ(それぞれは圧縮または圧縮されない可能性があります)おそらく最初の部分だけを抽出した可能性があります。

initramfsファイルを抽出する正しい手順

より具体的には、最初のcpioセクションは通常「Early Microcode Update」であり、Intelプロセッサの場合、パス名はですkernel/x86/microcode/GenuineIntel.bin。を実行すると、cpio -iv /boot/initrd.img-<kernel version>抽出される内容はすべてです。 (マイクロコードは暗号化されているため、通常は圧縮しないため、まったく圧縮されません。)

Debian / Ubuntuシステムから最新のinitramfsを完全に抽出するには、このコマンドを使用する必要がありますunmkinitramfs

何らかの理由でコマンドを使用できない場合は、次のように手動で実行できます。

mkdir /some/temporary/directory
cd /some/temporary/directory
cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; file -)

initramfsには2つの部分しかないとします。

アイデアは、このcatコマンドが角かっこ内のコマンドに最初から最後まで内容を出力することです。そのうちの最初はcpioファイルの先頭を取得し、最初のマイクロコードアップデートを抽出します。完了すると、最初のコマンドが中断された時点から次のコマンドが続行されます。 2番目の圧縮cpioアーカイブが終了すると、file -コマンドはより多くのアーカイブがあることを確認します。

抽出された出力の最後の行が次のような場合いいえ

/dev/stdin: empty

...これにより、initramfsファイルにさらに多くのコンテンツがあることがわかり、fileコマンド出力を介してファイルが圧縮されたかどうかがわかります。次に、コマンドの前に括弧内に別のcpio -iv;要素を追加します。zcat | cpio -iv;file

たとえば、最初のマイクロコードの更新後に2つの圧縮部分を含む3つの部分で構成されるinitramfsを抽出するには、次のようにします。

cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; zcat | cpio -iv; file -)

initrdサイズが実際に56ブロックの場合

この場合、initrd生成プロセスが失敗する可能性があります。あなたはそれを使用することができます

sudo update-initramfs -u

現在のカーネルとモジュールに基づいて再生成するようにシステムに指示します。これはまた、システム起動の初期(実際のルートファイルシステムがマウントされる前)に発生する必要がある操作に影響を与える可能性がある構成変更後に実行するのに最適なコマンドです。

おすすめ記事