Pada /boot/initrd.img- kernel_ver yang asli binwalk
memperlihatkan struktur ini:
Dari 0 hingga 22528 byte ada arsip CPIO yang hanya berisi firmware GenuineIntel.bin dalam hierarki folder tertentu.
Dari 22528 byte ada gzip archiwe mengandung sistem file yang sesuai dan gzip ini juga diarsipkan dengan CPIO
Setelah membongkar dan memodifikasi bagaimana saya bisa mengompres initrd.img dengan cara yang sama (dengan hierarki folder yang sama)? seperti struktur asli ini:
Setelah saran dari komentar:
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz
binwalk
:
Ini adalah struktur yang sama sekali berbeda.
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz
Jika prosedur itu tidak berfungsi, jelaskan perintah apa yang Anda jalankan dan apa yang tidak bekerja.Jawaban:
Saya menemukan cara untuk membuat
initrd.img
arsip yang persis sama .Jawaban Bodhi.zazen mungkin akan bekerja karena ini adalah solusi yang umum dikenal:
tetapi pertanyaannya berbeda. Jawaban ini akan bagus jika dalam arsip cpio ada satu sistem file gzip tetapi dalam situasi ini ada juga firmware Intel dalam struktur folder tertentu yang ingin saya simpan.
Untuk menjaga hierarki folder yang sama diperlukan tiga langkah:
sumber
find . | cpio -o | gzip -9 >> new_initrd.img
cpio -id < initrd.img-kernel_ver
;dd if=initrd.img-4.4.0-22-generic of=image.gz bs=22528 skip=1
-match nama file initrd.img Anda dan ukuran blok;gunzip image.gz
;cpio -i < image
Anda mengemas kembali
Perintah kedua mengubah nama initrd, Anda menentukan initrd untuk digunakan saat boot di grub.
Saya sarankan Anda menguji (boot) initrd khusus sebelum memindahkan atau mengganti nama.
Informasi tambahan dari diskusi di komentar:
Pertama, saya tidak berpikir Anda memahami peran cpio / tar. baik cpio dan tar mengambil sejumlah file dan / atau direktori dan menjadikannya satu file atau arsip.
Kedua saya tidak berpikir Anda memahami peran kompresi, kompresi hanya membuat arsip yang dihasilkan lebih kecil. Anda dapat menggunakan alat apa pun yang Anda inginkan untuk kompresi.
Lihat
https://wiki.ubuntu.com/CustomizeLiveInitrd
https://wiki.gentoo.org/wiki/Initramfs/Guide
Ketiga, kernel linux menggunakan cipo daripada tar.
Lihat
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
Lihat "Mengapa cpio daripada tar?" bagian
sumber
Saya baru-baru ini berlari ke pertanyaan yang sama dan pencarian web saya membawa saya ke utas ini, jadi jika itu membantu orang lain mengikuti jejak mereka, inilah jawaban 2018 untuk pertanyaan lama ...
Tampaknya di kernel "baru-baru ini" file initrd.img dapat berisi arsip cpio yang tidak terkompresi (yaitu berisi pembaruan mikrokode) yang ditambahkan ke arsip cpio (terkompresi) yang berisi pohon direktori initramfs normal.
Ini dibahas secara singkat di halaman Debian Wiki:
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
, tetapi kode yang lebih tepat untuk mem-parsing melalui initrd.img file semacam ini dapat ditemukan dalam
splitinitramfs()
fungsi di dalamunmkinitramfs
perintah yang ditemukan dalam perintahinitramfs-tools-core
paket (mis. https://git.launchpad.net/ubuntu/+source/initramfs-tools/tree/unmkinitramfs ).Saya belum mencoba membangun kembali file initrd.img semacam ini, tetapi berdasarkan halaman Wiki itu tampaknya untuk mengedit skrip boot initramfs, orang tidak ingin membongkar arsip GenuineIntel sama sekali. Sebagai gantinya, Anda bisa mempertahankan arsip cpio itu seperti di suatu tempat secara terpisah, lalu membongkar arsip kedua (terkompresi), memodifikasi pohon direktori, dan membangun kembali arsip cpio terkompresi, lalu menggabungkan arsip mikrokode yang disimpan dengan yang baru dibuat.
(Kode yang awalnya menghasilkan arsip "prepended" ini ditemukan di
/usr/share/initramfs-tools/hooks/intel_microcode
.)sumber
di Ubuntu yang
initrd.img
dikompres dalam gzip, saya ingin mempertahankan ini ketika saya mengeditnya. begini caranya:ekstrak:
kompres:
sumber