のぴぴのメモ

自分用のLinuxとかの技術メモ

RHEL7 initramfsの展開方法

今までのやり方では展開されない

普通、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

なおRHELCentOSのレポジトリには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
    • binwalk解析でgzipが始まる位置を確認(上記例では、13312bytesから開始)
    • ddコマンドでgzipの前のデータをスキップしてコピー("bs=13312 skip=1"がミソ)
    • それ以降は今までのやり方と同じ

なおgzipが始まる位置はその時々で変わる(おそらくmicrocodeのデータサイズが変わるから)ため、都度binwalk解析の確認が必要。