[Linux] ramfs image の展開・再構築

root filesystem を ramfs で構築するためには、イメージファイルを作成する必要があります。たいていは buildroot や yocto などの distribution で自動的に作成されるものを使用するか、以前の記事でも使用したように提供されている構築済イメージファイルを使用するのが一般的です。

しかしながらプログラムや追加したいときや設定ファイルを変更したいときに、元の作成方法まで戻るのは大変だし、提供されているものはそもそも固定なので、自力でイメージの展開と再構築ができるようにしておくと便利です。

今回も boot upstream Linux from U-boot on QEMU の時と同様に Linaro で用意されている initramfs のイメージファイルをダウンロードします。後の説明のためリネームしておきます。

arm の initramfs イメージは以下でダウンロードできます。

wget http://releases.linaro.org/openembedded/images/minimal-initramfs-armv7a/latest/linaro-image-minimal-initramfs-genericarmv7a-20170127-460.rootfs.cpio.gz.u-boot
mv linaro-image-minimal-initramfs-genericarmv7a-20170127-460.rootfs.cpio.gz.u-boot rootfs.cpio.gz.uboot

aarch64 の initramfs イメージは以下でダウンロードできます。

wget http://releases.linaro.org/openembedded/images/minimal-initramfs-armv8/latest/linaro-image-minimal-initramfs-genericarmv8-20170127-888.rootfs.cpio.gz.u-boot
mv linaro-image-minimal-initramfs-genericarmv8-20170127-888.rootfs.cpio.gz.u-boot rootfs.cpio.gz.uboot

※上記イメージは /sbin/init がなく、/init は起動時の cmdline に ”console=” オプションが必要になります。詳しくは展開時の init を見てみてください。

イメージファイルの展開(uImage)

ダウンロードしたファイルは "u-boot legacy uImage" 形式で、U-Boot で直接読むことができます。頭にヘッダ情報が 64byte 追加されているので、これを削除することで cpio.gz 形式になります。

tail -c+65 rootfs.cpio.gz.uboot > rootfs.cpio.gz

イメージファイルの展開 (cpio.gz)

cpio.gz 形式は、cpio 形式のアーカイブを gzip で圧縮したもので、それぞれのコマンドで展開します。

mkdir -p sysroot
cd sysroot
gzip -dc ../rootfs.cpio.gz | sudo cpio -di

sysroot/ 以下にイメージファイルの中身が展開されています。

イメージファイルの再構築

追加変更したファイル群から initramfs イメージを再構築します。cpio では newc (SVR4 portable) フォーマットを指定しています。QEMU の -initrd オプションではこれでできたイメージが使用できます。

cd sysroot
sudo find . | sudo cpio -o -H newc | gzip -c > ../rootfs.cpio.gz

U-Boot で読む uImage 形式にするためには mkimage でヘッダを追加します。mkimage は u-boot-tools パッケージでインストールできます。

sudo apt install u-boot-tools
mkimage -A arm64 -O linux -C none -T ramdisk -d rootfs.cpio.gz rootfs.cpio.gz.uboot

コメント

  1. たろう より:

    再構築したところ、kernel panicになってしまいました。
    原因にお心当たりはありますでしょうか?

    Kernel panic – not syncing: Attempted to kill init! exitcode=0x00000100
    その他のエラーは以下のようなものが表示されます。
    mount: you must be root
    chmod: /dev/tty*: No such file or directory
    cat: can’t open ‘/proc/cmdline’: No such file or directory

    作成されたrootfs.cpio.gz.u-bootをfileコマンドで確認すると、
    rootfs.cpio.gz.u-boot: u-boot legacy uImage, , Linux/ARM, RAMDisk Image (Not compressed), 8220002 bytes, Sun May 24 02:56:08 2020, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0x374C8FA5, Data CRC: 0x07E2459C

    • kunih より:

      panic の原因は init がエラー終了したためですが、元のイメージファイルが動作しているのであれば、sysroot 内のファイルの owner が root でないためかもしれません。
      展開時の “cpio” と再構築時の “find” と “cpio” に sudo を付けて試してみてください。
      (本文にも追加しておきます)

      • たろう より:

        ご回答ありがとうございます!
        無事起動できるようになり、助かりました。

タイトルとURLをコピーしました