Metode lompatan blok cpio yang diberikan tidak berfungsi dengan baik. Itu karena gambar initrd yang saya dapatkan sendiri tidak memiliki kedua arsip yang digabungkan pada batas 512 byte.
Sebagai gantinya, lakukan ini:
apt-get install binwalk
legolas [mc]# binwalk initrd.img
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
120 0x78 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
244 0xF4 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
376 0x178 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00005000"
21004 0x520C ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
21136 0x5290 gzip compressed data, from Unix, last modified: Sat Feb 28 09:46:24 2015
Gunakan angka terakhir (21136) yang tidak berada pada batas 512 byte untuk saya:
legolas [mc]# dd if=initrd.img bs=21136 skip=1 | gunzip | cpio -tdv | head
drwxr-xr-x 1 root root 0 Feb 28 09:46 .
drwxr-xr-x 1 root root 0 Feb 28 09:46 bin
-rwxr-xr-x 1 root root 554424 Dec 17 2011 bin/busybox
lrwxrwxrwx 1 root root 7 Feb 28 09:46 bin/sh -> busybox
-rwxr-xr-x 1 root root 111288 Sep 23 2011 bin/loadkeys
-rwxr-xr-x 1 root root 2800 Aug 19 2013 bin/cat
-rwxr-xr-x 1 root root 856 Aug 19 2013 bin/chroot
-rwxr-xr-x 1 root root 5224 Aug 19 2013 bin/cpio
-rwxr-xr-x 1 root root 3936 Aug 19 2013 bin/dd
-rwxr-xr-x 1 root root 984 Aug 19 2013 bin/dmesg
Jika Anda tahu initrd.img
Anda terdiri dari arsip cpio yang tidak dikompresi diikuti oleh arsip cpio yang dikompresi gz, Anda dapat menggunakan yang berikut ini untuk mengekstrak semua file (dari kedua arsip) ke direktori kerja Anda saat ini (diuji dalam bash):
(cpio -id; zcat | cpio -id) < /path/to/initrd.img
Baris perintah di atas meneruskan konten initrd.img
sebagai input standar ke dalam subkulit yang mengeksekusi dua perintah cpio -id
dan zcat | cpio -id
berurutan. Perintah pertama (cpio -id
) berakhir setelah membaca semua data milik arsip cpio pertama. Konten yang tersisa kemudian diteruskan ke zcat | cpio -id
, yang mendekompresi dan membongkar arsip kedua.
Ternyata initrd yang dihasilkan oleh live-build Debian (dan yang mengejutkan saya, diterima oleh kernel) sebenarnya adalah gabungan dari dua gambar:
- arsip CPIO yang berisi pembaruan kode mikro untuk diterapkan pada prosesor;
- arsip cpio gzip-ed, yang sebenarnya berisi pohon file initrd (dengan direktori /etc /bin /sbin /dev ... yang diharapkan).
Setelah mengekstrak initrd.img asli, langsung dari output live-build, saya mendapatkan output ini:
$cpio -idv ../initrd.img
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
896 blocks
Yang berarti ekstraksi cpio berakhir setelah mem-parsing 896 blok masing-masing 512 Byte. Tapi initrd.img aslinya jauh lebih besar dari 896*512 =458752B =448 KB :
$ls -liah initrd.img
3933924 -r--r--r-- 1 root root 21M Oct 21 10:05 initrd.img
Jadi gambar initrd sebenarnya yang saya cari ditambahkan tepat setelah arsip cpio pertama (yang berisi pembaruan kode mikro) dan dapat diakses menggunakan dd:
$dd if=initrd.img of=myActualInitrdImage.img.gz bs=512 skip=896