Bagaimana cara mengemas ulang initrd.img?

9

Pada /boot/initrd.img- kernel_ver yang asli binwalk memperlihatkan struktur ini:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

Setelah saran dari komentar:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

binwalk :

masukkan deskripsi gambar di sini

Ini adalah struktur yang sama sekali berbeda.

Edid
sumber
Anda mengekstrak initrd.img ke direktori yang berfungsi. Anda menambahkan firmware GenuineIntel.bin Anda dalam hierarki folder tertentu ke direktori kerja. Anda kemudian membuat kembali arsip dengan find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lzJika prosedur itu tidak berfungsi, jelaskan perintah apa yang Anda jalankan dan apa yang tidak bekerja.
Panther
Hasil edit Anda, dengan gambar, tidak banyak menambah pemahaman saya tentang masalah Anda. Anda perlu mengekstrak gambar, menambahkan kode Anda, dengan struktur file yang sesuai dan lokasi firmware GenuineIntel.bin dan mengemas ulang paket menjadi .img baru.
Panther
@ bodhi.zazen seperti yang saya katakan ini membuat file yang berbeda ...
EdiD
@ bodhi.zazen akhirnya Anda mengerti apa yang saya minta?
EdiD
1
Sepertinya file initramfs adalah gabungan dari arsip CPIO. Setiap arsip CPIO dapat dikompresi (dengan gzip, xz dll.) Atau tidak terkompresi. File input Anda mulai dengan yang tidak terkompresi di offset 0, kemudian dilanjutkan dengan yang terkompresi di offset 22528. Sayangnya saya tidak tahu alat standar yang dapat mengekstrak rangkaian arsip CPIO yang mungkin dikompresi.
Poin

Jawaban:

4

Saya menemukan cara untuk membuat initrd.imgarsip yang persis sama .

Jawaban Bodhi.zazen mungkin akan bekerja karena ini adalah solusi yang umum dikenal:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

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:

  1. Membuat cpio sistem file arsip dengan opsi sederhana -o tanpa newc format dibuat sebelum misalnya. folder dasar:

    find . | cpio -o | gzip -9 > ../base/file_system.gz

  2. Buat arsip yang tepat dengan format newc yang berisi kernel / x86 / microcode / GenuineIntel.bin :

    find kernel/ | cpio -o -H newc > new_initrd.img

  3. Tambahkan arsip sistem file yang di-gzip ke new_initrd.img yang tepat:

    find base/ | cpio -o >> new_initrd.img

Edid
sumber
1
Bagus! Terima kasih! +10! Tetapi bagaimana Anda membongkar initrd asli?
r
Juga, solusi Anda menciptakan struktur yang sedikit berbeda. Saya mendapatkan tructure yang sama persis di binwalk ketika saya melakukan langkah (2) pertama dan kemudianfind . | cpio -o | gzip -9 >> new_initrd.img
rth
@ EdiD bagaimana Anda membongkar initrd asli?
ImranRazaKhan
1
@ImranRazaKhan Anda perlu empat langkah: 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
EdiD
3

Anda mengemas kembali

cd your_working_directory_with_modifications
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

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

Kenapa cpio daripada tar?

Keputusan ini dibuat kembali pada bulan Desember 2001. Diskusi dimulai di sini:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

Dan menelurkan utas kedua (khusus pada tar vs cpio), mulai di sini:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

Versi ringkasan cepat dan kotor (yang bukan pengganti untuk membaca utas di atas) adalah:

1) cpio adalah standar. Sudah puluhan tahun (dari masa AT&T), dan sudah banyak digunakan di Linux (di dalam RPM, disk driver perangkat Red Hat). Ini artikel Linux Journal tentang hal itu mulai tahun 1996:

  http://www.linuxjournal.com/article/1213

Ini tidak sepopuler tar karena alat baris perintah cpio tradisional memerlukan argumen baris perintah _truly_hideous_. Tapi itu tidak mengatakan apa-apa tentang format arsip, dan ada alat alternatif, seperti:

 http://freecode.com/projects/afio

2) Format arsip cpio yang dipilih oleh kernel lebih sederhana dan lebih bersih (dan dengan demikian lebih mudah untuk dibuat dan diurai) dibandingkan dengan salah satu dari berbagai format arsip tar. Format arsip initramfs lengkap dijelaskan dalam buffer-format.txt, dibuat di usr / gen_init_cpio.c, dan diekstraksi di init / initramfs.c. Ketiganya memiliki total kurang dari 26 ribu teks yang dapat dibaca manusia.

3) Proyek GNU standardisasi pada tar kira-kira sama relevannya dengan standardisasi Windows pada zip. Linux juga bukan bagian dari keduanya, dan bebas untuk membuat keputusan teknis sendiri.

4) Karena ini adalah format internal kernel, itu bisa dengan mudah menjadi
sesuatu yang baru. Kernel menyediakan alatnya sendiri untuk membuat dan mengekstrak format ini. Menggunakan standar yang ada lebih disukai, tetapi tidak penting.

5) Al Viro membuat keputusan (kutipan: "tar jelek sekali dan tidak akan didukung di sisi kernel"):

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

menjelaskan alasannya:

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html
  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

dan, yang paling penting, merancang dan mengimplementasikan kode initramfs.

Harimau kumbang
sumber
Ini tidak akan mempertahankan struktur folder. Saya ingin struktur yang sama dengan initrd.img asli. Artinya -> GenuineIntel.bin tidak dikompresi hanya diarsipkan dengan cpio on root di folder kernel / x86 / microcode dan mengapa lzma sementara saya berbicara tentang gzip?
EdiD
lzma memberikan arsip yang lebih kecil. gunakan gzip jika Anda mau. Saya tidak yakin mengapa Anda khawatir tentang kompresi atau tidak, harus bekerja dengan baik dengan kompresi dan menghasilkan gambar yang lebih kecil pada disk. Tidak begitu yakin apa yang ingin Anda capai dari apa yang Anda poskan.
Panther
Saya ingin tahu bagaimana awalnya dilakukan. Mungkin firmware intel tidak dikompres karena aksesibilitas yang lebih cepat.
EdiD
hampir pasti dikompresi, Anda dapat memeriksa arsip. Kompresi digunakan secara default karena tidak terasa mempengaruhi kinerja.
Panther
Tidak ada apa pun dalam manual cpio tentang kompresi. Periksa jawaban yang diterima: superuser.com/questions/343915/…
EdiD
3

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 dalam unmkinitramfsperintah yang ditemukan dalam perintah initramfs-tools-corepaket (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.)

Nathan
sumber
0

di Ubuntu yang initrd.imgdikompres dalam gzip, saya ingin mempertahankan ini ketika saya mengeditnya. begini caranya:

ekstrak:

zcat /boot/initrd.img-3.19.0-80-generic | cpio --extract

kompres:

find . 2>/dev/null | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/initrd.img-3.19.0-80-generic
Jossef Harush
sumber