GNU/Linux >> Znalost Linux >  >> Linux

Proč má můj initrd pouze jeden adresář, a to 'kernel'?

Uvedená metoda přeskočení bloku cpio nefunguje spolehlivě. Je to proto, že obrazy initrd, které jsem sám získával, neměly oba archivy zřetězené na hranici 512 bajtů.

Místo toho udělejte toto:

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

Použijte poslední číslo (21136), které pro mě není na hranici 512 bajtů:

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

Pokud znáte své initrd.img sestává z nekomprimovaného archivu cpio následovaného gz-komprimovaným archivem cpio, můžete použít následující k extrahování všech souborů (z obou archivů) do vašeho aktuálního pracovního adresáře (testováno v bash):

(cpio -id; zcat | cpio -id) < /path/to/initrd.img

Výše uvedený příkazový řádek předá obsah initrd.img jako standardní vstup do subshell, který provádí dva příkazy cpio -id a zcat | cpio -id postupně. První příkaz (cpio -id ) se ukončí, jakmile načte všechna data patřící do prvního archivu cpio. Zbývající obsah je poté předán do zcat | cpio -id , který dekomprimuje a rozbalí druhý archiv.


Ukázalo se, že initrd generovaný živým sestavením Debianu (a k mému překvapení akceptovaný jádrem) je ve skutečnosti zřetězením dvou obrázků:

  • archiv CPIO obsahující aktualizace mikrokódu, které mají být aplikovány na procesor;
  • archiv cpio ve formátu gzip, který ve skutečnosti obsahuje strom souborů initrd (s adresáři /etc /bin /sbin /dev ..., které byly očekávány).

Po extrahování původního souboru initrd.img přímo z výstupu živého sestavení jsem získal tento výstup:

$cpio -idv ../initrd.img
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
896 blocks

Což znamená, že extrakce cpio skončila po analýze 896 bloků po 512 bajtech. Ale původní initrd.img byl mnohem větší než 896*512 =458752B =448 KB :

$ls -liah initrd.img
3933924 -r--r--r-- 1 root root 21M Oct 21 10:05 initrd.img

Takže aktuální obrázek initrd, který jsem hledal, byl připojen hned po prvním archivu cpio (ten obsahující aktualizace mikrokódu) a bylo možné k němu přistupovat pomocí dd:

$dd if=initrd.img of=myActualInitrdImage.img.gz bs=512 skip=896

Linux
  1. Filtr Rsync:Kopírování pouze jednoho vzoru?

  2. Vyhrazený prostor pro root na souborovém systému – proč?

  3. Jak synchronizovat pouze jeden oddíl?

  1. Jak spustit Keychain způsobem, který má pouze první výzvu Shell pro klíče při spuštění?

  2. Only Root Can Mount, proč?

  3. Vytvoření modulu jádra z několika zdrojových souborů, z nichž jeden má stejný název jako modul

  1. Co se stane, když je mv přerušeno?

  2. Proč chránit linuxové jádro před uživatelem root?

  3. Proč ln -s neřekne, že selže při vytváření symbolického odkazu na existující adresář se symbolickým odkazem?