GNU/Linux >> Belajar Linux >  >> Linux

Mengapa initrd saya hanya memiliki satu direktori, yaitu 'kernel'?

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

Linux
  1. Filter Rsync:Menyalin Satu Pola Saja?

  2. Ruang Cadangan Untuk Root Pada Sistem File – Mengapa?

  3. Cara Menyinkronkan Hanya Satu Partisi?

  1. Bagaimana Memastikan Hanya Satu Contoh Skrip Bash yang Berjalan?

  2. Linux – Mengapa Direktori Root Dilambangkan Dengan A / Sign?

  3. Mengapa Aplikasi Mono Hanya Mulai Dari Direktori Sendiri?

  1. Bagaimana Menjalankan Keychain Dengan Cara Yang Hanya Memiliki Shell Prompt Pertama Untuk Kunci Saat Startup?

  2. Membangun modul kernel dari beberapa file sumber yang salah satunya memiliki nama yang sama dengan modul

  3. Apa yang terjadi jika mv terganggu?