今までのやり方では展開されない
普通、initramfsの中身を展開する場合は、gunzipあたりとcpioを使って以下のようにするはず。
$ cd /tmp $ cp /boot/initramfs.img initramfs.gz $ gunzip initramfs.gz $ mkdir ramdisk $ cd ramdisk $ cpio -i -d -H newc --no-absolute-filenames < ../initramfs
ところが、最近のFedora/CentOS/RHELで上記をやると、これは「gzipじゃない!!」と怒られてしまう。
$gunzip initramfs.gz gzip: initramfs.gz: not in gzip format
じゃあ、fileで確認するとcpioだというから直接cpioで展開すると、CPUのマイクロコードらしきものしか展開されない(´・ω・`)
$ mkdir ramdisk $ cd ramdisk $ file ../initramfs.gz ../initramfs.gz: ASCII cpio archive (SVR4 with no CRC) $ cpio -i -d -H newc --no-absolute-filenames < ../initramfs.gz 26 blocks $ find . . ./kernel ./kernel/x86 ./kernel/x86/microcode ./kernel/x86/microcode/GenuineIntel.bin ./early_cpio
[RHEL7/CentOS7/FC21]initramfsの展開方法
グーグルさんに聞いてみる
キーワードを変えていろいろ調べたら、出てきた。
forums.fedoraforum.org
手順
上記内容をちょっとだけ丁寧に解説。
バイナリ解析ツールのインストール
まずバイナリー解析用ツールを入れないといけないらしい。
yum -y install binwalk
なおRHELやCentOSのレポジトリにはbinwalkはないので、ネットからrpmパッケージをDLしてrpmコマンドで個別にインストールするか、ソースを落としてコンパイルする。
initramfsの解析と展開
$ cp /boot/initramfs-3.10.0-229.el7.x86_64.img . $ binwalk initramfs-3.10.0-229.el7.x86_64.img DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------- 13312 0x3400 gzip compressed data, from Unix, last modified: Thu Apr 30 13:18:46 2015, max compression 3412955 0x3413DB bzip2 compressed data $ dd if=initramfs-3.10.0-229.el7.x86_64.img of=initramfs.gz bs=13312 skip=1 1350+1 records in 1350+1 records out 17982993 bytes (18 MB) copied, 0.0431475 s, 417 MB/s $ gunzip initramfs.gz $ mkdir ramdisk $ cd ramdisk/ $ cpio -i -d -H newc --no-absolute-filenames < ../initramfs 80381 blocks
なおgzipが始まる位置はその時々で変わる(おそらくmicrocodeのデータサイズが変わるから)ため、都度binwalk解析の確認が必要。