berryboot.img の中をのぞいてみた

投稿日:

berryboot の作りをもう少し見たかったので、起動するboot img をばらして覗いてみました。手順は絶対忘れるのでメモしておきます。

 

作業は、osx でやっています。
とりあえず、作業用にRAMディスクを作っておきます。
作業は、RAMディスクの中じゃなくてもいいんですが、何かと速くて間違えなくて便利なので、自分用のメモの意味をあって書いています。独立したファイルシステムにフォーマットすることも簡単ですしね。

osx でRAMディスクを作成するには、

$ diskutil eraseDisk HFS+ RAMDISK `hdiutil attach -nomount ram://8388608`

この例では、ディスクサイズは8388608(4096 * 2048)で4GB のRAMディスクとしています。

コマンドラインがいやな場合は、RAMDiskCreator というツールをFlorian Bognerさんが公開しているので使ってみてください。

a

_Applications

RAMDiskCreator 1.2

 

aa

これ以下は、Linux でも同じなはずです。

file で berriboot.img を見ると、u-boot の uImage のようです。

$ file berryboot.img 
berryboot.img: u-boot legacy uImage, , Linux/ARM, RAMDisk Image (Not compressed), 10112736 bytes, Wed Apr  1 07:32:40 2015, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0xAB28A904, Data CRC: 0x6870C48E

これは調べてみると、以下のようにすることで展開できるようです。

$ dd if=berryboot.img bs=64 skip=1 of=berryboot_initrd
158011+1 records in
158011+1 records out
10112736 bytes transferred in 0.315515 secs (32051518 bytes/sec)

先頭64bite に属性情報があるようで、それを飛ばして DD してやればよいようです。再度、file で見てみると、

$ file berryboot_initrd 
berryboot_initrd: gzip compressed data, was "rootfs.cpio", from Unix, last modified: Wed Apr  1 07:32:37 2015, max compression

cpio のようです。tmp ディレクトリを作成後、そこに展開してみます。

$ mkdir tmp
$ cd tmp/
$ cpio -idm < ../berryboot_initrd

うまく展開されたようです。

init では以下のようなことをしているようです。

---- /init
#!/bin/sh
#
# BerryBoot, ugly but functional image chooser thingy
#
# Author: Floris Bos
#

# Standard busybox init
/bin/mount -t proc proc /proc
/bin/mount -o remount,rw,noatime / 
/bin/mount -t sysfs sysfs /sys
/bin/mount -t devtmpfs dev /dev
/bin/hostname -F /etc/hostname

if grep -q debugconsole /proc/cmdline; then
    /sbin/getty -L tty2 0 vt100 &
fi

if grep -q "mmc0_led" /proc/cmdline; then
    if [ -e /sys/class/leds/ph20:green:led1 ]; then
        echo mmc0 > /sys/class/leds/ph20:green:led1/trigger
    fi
fi

if grep -q vncinstall /proc/cmdline; then
    export QWS_DISPLAY="VNC:size=800x600:depth=32:0"
    echo
    echo Connect with your VNC client
    echo If you wish to disable VNC mode: remove 'vncinstall' from cmdline.txt
    echo
fi

# Show GUI, it will write the OS choosen to /tmp/answer
/usr/bin/BerrybootGUI -qws 2>/tmp/debug 

# Clear screen
clear

IMAGE=`cat /tmp/answer`
DATADIR="/mnt/data/$IMAGE"
rm /tmp/answer

#
# Set CPU governor to "ondemand" when booting an OS on the Pi
# Set it to "performance" for other devices
#
if grep -q "BCM2708" /proc/cpuinfo; then
    GOVERNOR=ondemand
else
    GOVERNOR=performance
fi

if [ "$IMAGE" != "" ]; then
    mkdir -p /squashfs /aufs $DATADIR
    clear
    echo Mounting image ${IMAGE}...
    mount -o loop "/mnt/images/$IMAGE" /squashfs
    cd /squashfs

    if [ -e berryboot-init ]; then
        echo Executing init script
        . berryboot-init
    fi

    if [ -L lib -o -L sbin ]; then
        echo
        echo Error: having a symlink for /lib and/or /sbin inside your image is not allowed!
        echo This conflicts with the shared AUFS folders
        echo
        sleep 5
    fi

    for initfile in sbin/init usr/lib/systemd/systemd init
    do
        if [ -e $initfile ]; then
            echo Mounting RW data directory on top
            mount -t aufs -o br:${DATADIR}:/mnt/shared:/squashfs none /aufs
            cd /aufs
            mount -o move /dev dev
            mount -o move /sys sys
            mount -o move /proc proc
            echo Setting CPU governor to $GOVERNOR
            echo "$GOVERNOR" > sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
            echo Starting operating system ${IMAGE}...
            exec switch_root . $initfile
        fi
    done

    echo
    echo Error: unable to locate or execute /sbin/init /usr/lib/systemd/systemd /init inside $IMAGE
    echo
    sleep 5
fi

# In case the user pressed cancel or something went wrong, show an emergency recovery shell
clear
echo
echo Emergency recovery shell activated
echo

/bin/sh

cmdline に mmc0_led があると、何か green にしているようですね。筐体のLED を緑にしているんですかね? あとで試してみます。vncinstall があると、環境変数QWS_DISPLAYにVNC のパラメータがセットされるようです。VNC インストールができるということですかね。あとで、試してみることに。

ちょっと勉強になりました。

広告

1件のコメント 追加

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中