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 インストールができるということですかね。あとで、試してみることに。

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

Arduino と RasPi2 と ESP8266

ここのところ、遊び道具が増えてきて、あれもやりたいこれもありたいと調査していると、結局何も手付かずに終わってしまう不毛な毎日が続いているので、とりあえず、やってみたいことを整理してみます。

 

・ESP8266 の省電力化と、リチウム電池利用した温度湿度照度の単体デバイスの作りこみ

単体ではそこそこ調査は終わっていて、あとは作りこみ。ESP8266(ESP12) + DHT-22(AM2302) + GL5528でセンサー部と、データをWiFi で投げてThingSpeak に投げることまでは完了。残るは、省電力化へのコードの検討、テストと、バッテリー駆動への電力部の作成(というか、パーツ組み合わせるだけ)です。途中で、RasPi2 をゲットしてそっちに気がほうけてしまい手付かずの案件。

2015_05_10_2_14

+

HTB19pQDHXXXXXXyXFXXq6xXFXXX7

+

HTB1NkOvHFXXXXa_aXXXq6xXFXXXt

 

 

・ProMini を活用したモータ制御するロボット(プログラム制御の車とか、リモコン制御のものとか)

極小のギヤモータは、ゲット済みでモータードライバなしでarduino に直結して動作させる予定の案件。基本部分が出来ればあとはセンサー拡張して楽しむ予定の案件

 837293198_862

+gearmoter

・HC-06(Bluetooth) + ProMini で HID USBデバイス

SPPのやつなんですが、HID にできるかもしれないので、一応ゲットしました。だめなら、ちょっと高価なHM-10でやるつもりのもの。まだ、未調査なので、動作確認もしてない放置もの。

a

or

b

・RasPi2(母艦) + Firmata化したarduino との通信

これはつい最近、知ったんですがFirmata という汎用通信規格がやり取りできるよう arduino にスケッチを入れてコントロールはシリアル経由でやるという代物。ソフトウェア実装なので、電子工作が伴う前の基礎技術の研究をしたいなと。コントロールする母艦は、RasPi2 でやるつもりで、実装方法はいろいろあるようです。Python や Ruby や C 、PHP、そしてnode.js とかでも出来るようです。表示やコントロールが伴うものは、HDMI出力があるRasPai からやったほうが良さそうなので、そいういう用途にGUI でラップしたFirmata のアプリケーションを作れないかなと。こちらは、まだ未調査なので、どんな組み合わせがベストなのかは不明。

 

 

このほかにもあれこれと、やりたいことが調べているうちに出てきてしまうんですが、上4つはやりたいですね。今年度中はおそらくこれらで、あそべるはず。特に、ソフトウェア的な組み合わせが出来る、RasPai との連携を考えると、技術が追いつかなさそうなので、ぼちぼと勉強しながらやっていきたいと思っています。

 

さて、とりあえず何からやりますかね。気がノルやつから手をつけていきますか。遊びでは、それが基本スタンスですからね。

osx10.9 で UnixBench

ここのところ、RasPi2 でいろいろ遊んでいますが、そういえば母艦である osx 機で UnixBench を計測していないことに気がつきました。で、その結果。

 

UnixBench にパッチを当てる情報は、以下を参考にしました。

Patch for UnixBench 5.1.3 on Mac OS X Mavericks (10.9)
https://gist.github.com/barusan/11033924

blog
http://www.baru-san.net/archives/267

ありがたく、使わせていただきます。

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz
git clone https://gist.github.com/11033924.git
tar xvf UnixBench5.1.3.tgz
cd UnixBench/
patch -p1 < ../11033924/UnixBench5.1.3.mavericks.patch
make
./Run

な感じで計測。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: HOPE.local: Darwin
   OS: Darwin -- 13.4.0 -- Darwin Kernel Version 13.4.0: ....::
::
   CPU 7: Intel(R) Core(TM) ...::
::

------------------------------------------------------------------------
Benchmark Run: 日  7 12 2015 16:14:49 - 16:42:55
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       34704465.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     6360.0 MWIPS (9.8 s, 7 samples)
Execl Throughput                                903.5 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        800480.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          219592.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2163139.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1281398.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 103377.8 lps   (10.0 s, 7 samples)
Process Creation                               4573.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5948.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1956.7 lpm   (60.0 s, 2 samples)
System Call Overhead                        1350215.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   34704465.0   2973.8
Double-Precision Whetstone                       55.0       6360.0   1156.4
Execl Throughput                                 43.0        903.5    210.1
File Copy 1024 bufsize 2000 maxblocks          3960.0     800480.2   2021.4
File Copy 256 bufsize 500 maxblocks            1655.0     219592.2   1326.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    2163139.0   3729.6
Pipe Throughput                               12440.0    1281398.1   1030.1
Pipe-based Context Switching                   4000.0     103377.8    258.4
Process Creation                                126.0       4573.6    363.0
Shell Scripts (1 concurrent)                     42.4       5948.9   1403.0
Shell Scripts (8 concurrent)                      6.0       1956.7   3261.2
System Call Overhead                          15000.0    1350215.3    900.1
                                                                   ========
System Benchmarks Index Score                                        1092.0

------------------------------------------------------------------------
Benchmark Run: 日  7 12 2015 16:42:55 - 17:11:05
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      151501922.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    47934.1 MWIPS (9.8 s, 7 samples)
Execl Throughput                               4391.2 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1785300.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          417942.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       5208018.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             3024743.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 737487.3 lps   (10.0 s, 7 samples)
Process Creation                              17603.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  17545.1 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   2572.0 lpm   (60.1 s, 2 samples)
System Call Overhead                        3138596.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  151501922.0  12982.2
Double-Precision Whetstone                       55.0      47934.1   8715.3
Execl Throughput                                 43.0       4391.2   1021.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1785300.9   4508.3
File Copy 256 bufsize 500 maxblocks            1655.0     417942.6   2525.3
File Copy 4096 bufsize 8000 maxblocks          5800.0    5208018.8   8979.3
Pipe Throughput                               12440.0    3024743.9   2431.5
Pipe-based Context Switching                   4000.0     737487.3   1843.7
Process Creation                                126.0      17603.0   1397.1
Shell Scripts (1 concurrent)                     42.4      17545.1   4138.0
Shell Scripts (8 concurrent)                      6.0       2572.0   4286.7
System Call Overhead                          15000.0    3138596.8   2092.4
                                                                   ========
System Benchmarks Index Score                                        3440.0

osx 10.9.5 ですが、体感的にはもっと速い感じ。まぁ、とりあえずの指針としてきます。

たとえば、sakuraVPS の2G Plan の CPU3 RAM 2GB HDD200GB で2000くらいは出ます。

 

ベンチマーク計測中の htop は以下のような感じ。

  1  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]     Tasks: 252 total, 0 running
  2  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]     Load average: 7.85 5.22 3.26 
  3  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]     Uptime: 01:03:57
  4  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
  5  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
  6  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
  7  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
  8  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]
  Mem[||||||||||||                                        3711/32768MB]
  Swp[                                                        0/1024MB]

がんばってますね。

ちなみに、osx10.9.5 の公開しているソースは、

http://www.opensource.apple.com/release/os-x-1095/

たとえば、bash とかは、以下にあり、

http://www.opensource.apple.com/source/bash/bash-92/

まだやったことはないんですが、xcode を使ってビルドできるようです。

Source_Browser

iSCSI Boot で OS をいろいろ切り替え

あれもこれも、入れたいのに、いちいちSDカードなんて、抜き差ししてるのめんどいよね、ってことで、工夫してみました。

こんな感じで、SD Card にOS は入れずに、ネットワーク越しのiSCSI Disk から、OS をブートしてPi2 を楽しむことを試しました。

iscsiBoot_raspi

まさか、RasPi がiSCSI Boot するなんて思っていなかったので、最初は本当かな? って。で、試したところ問題ない速度で楽しめることがわかりました。BerryBoot v2.0 を使って実際に試してみましたよ。

 

図では、わかりにくいのですが、osx にバーチャルボックスで起動した、FreeNAS でiSCSI のターゲットを提供し、pi は、Boot 領域のSD Card を指したまま、ネットワーク越しのディスクから起動します。

OS 切り替えは、osx のブラウザーからFreeNAS の iSCSI のディスクを交換し、Pi2 をリブートすれば OK な感じです。

freenas_-_FreeNAS-9_3-STABLE-201506292332

ZFS の操作はまったくわかりませんが、とりあえず物理ディスクをバーチャルボックスで80Gくらい割り当てたものを上記な感じで作ります。

 freenas_-_FreeNAS-9_3-STABLE-201506292332 2

iSCSI にする DISK はあらかじめたくさん作っておいて、上図のような感じでエクステントと対応ディスクのセットを作っておきます。

freenas_-_FreeNAS-9_3-STABLE-201506292332 3

ターゲット名は変わらないので、Pi2 の SDCard の中は変更しなくてOK です。

freenas_-_FreeNAS-9_3-STABLE-201506292332 4

こんな感じで、ブートしたいディスクに交換し、

freenas_-_FreeNAS-9_3-STABLE-201506292332 5

Pi2 をリブート(電源を落として変更するのがベストですかね)すれば、OK。

 

BerryBoot v2.0 の説明は、親切な作者のページがあるので、省略しますが、

http://www.berryterminal.com/doku.php/berryboot

iSCSI でのインストールは、以下に説明があります。

http://www.berryterminal.com/doku.php/storing_your_files_on_a_synology_nas_using_iscsi

 

一度、インストールをすると、boot の中の設定ファイルは以下のような感じになります。

---- iscsi.sh
# iscsistart -i [initiatorName] -t [targetIqn] -g [Lun] -a [Address]
/sbin/iscsistart -i "iqn.2012-08.com.berryboot:myPi" -g 1 -t "iqn.freenas:piboot" -a "192.168.1.45"

---- cmdline.txt 
smsc95xx.turbo_mode=N elevator=deadline quiet bootmenutimeout=10 ipv4=192.168.1.24/255.255.255.0/192.168.1.1 datadev=iscsi


---- config.txt 
disable_overscan=1
start_x=1
gpu_mem=128

# Berryboot settings, do not change
initramfs berryboot.img

[pi2]
kernel=kernel_rpi2_aufs.img

[pi1]
kernel=kernel_rpi_aufs.img
cma_lwm=16
cma_hwm=32
cma_offline_start=16

---- uEnv.txt 
ipv4=192.168.1.24/255.255.255.0/192.168.1.1 datadev=iscsi

 

 

再度インストールするときは、uEnv.txt と iscsi.sh と cmdline.txt の datadev=iscsi を消して Pi2 をリブートすれば インストールウィザードが走ります。iSCSI の設定は再度必要ですが、自身のIP 設定などは、残したままなので、ターゲットのポータル名と、IP を入れればOK な感じです。

 

あと、このBerryboot は Github にソースがあって、Qt4 でGUI 作っているようです。

https://github.com/maxnet/berryboot

統合開発環境 Qt Creator のプロジェクトファイル(BerrybootGUI2.pro)があったので、これらの開発環境についても折を見て勉強してみたいです。GTK による開発と、QT の開発、どっちが入りやすいのでしょうかね。

 

Linux の組み込みの世界は、奥が深いですね。

最後に、iSCSI Boot した Raspbian の UnixBench を乗せておきます。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: pi: GNU/Linux
   OS: GNU/Linux -- 3.18.10v7-aufs -- #1 SMP PREEMPT Wed Apr 1 00:07:44 CEST 2015
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 1: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 2: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 3: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   16:46:43 up 8 min,  2 users,  load average: 0.12, 0.32, 0.19; runlevel 2

------------------------------------------------------------------------
Benchmark Run: 土  7月 11 2015 16:46:43 - 17:15:08
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       13034196.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2201.6 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1115.2 lps   (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks         67394.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           18209.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        217804.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                              820546.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 143190.3 lps   (10.0 s, 7 samples)
Process Creation                               3197.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2604.1 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    344.4 lpm   (60.4 s, 2 samples)
System Call Overhead                        1752660.9 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   13034196.3   1116.9
Double-Precision Whetstone                       55.0       2201.6    400.3
Execl Throughput                                 43.0       1115.2    259.4
File Copy 1024 bufsize 2000 maxblocks          3960.0      67394.5    170.2
File Copy 256 bufsize 500 maxblocks            1655.0      18209.0    110.0
File Copy 4096 bufsize 8000 maxblocks          5800.0     217804.3    375.5
Pipe Throughput                               12440.0     820546.2    659.6
Pipe-based Context Switching                   4000.0     143190.3    358.0
Process Creation                                126.0       3197.5    253.8
Shell Scripts (1 concurrent)                     42.4       2604.1    614.2
Shell Scripts (8 concurrent)                      6.0        344.4    573.9
System Call Overhead                          15000.0    1752660.9   1168.4
                                                                   ========
System Benchmarks Index Score                                         406.1

pi@pi /usr/local/src/UnixBench $ 

Pi2 LXDE 調整

osx より X11 を経由して、ああでもないこうでもないと設定をあれこれ見ると、i-bus というのがありまして。

結論から言えば、この設定を変えることで、スペースが打てない問題は解決しました。

以下のような部分を右クリックして、設定を選択

panel

以下のような設定が現れて、ここをシフト + スペースに設定。Super っていうのが選択されていたのですが、そんな就職キーはないのか有効じゃないようで、

スペースがこのショートカット

になっていたようです。

入力メソッドの切り替え中_のキーボードショートカットを選択_と_IBus_の設定_と___無題_

このキーは、入力システムを切り替えるやつのようです。以下のようなのが、現れて、切り替わるという。

__無題_

とりあえず、少し前進。普通に使えるってことが、すばらしいですね。こんな事で感動してますが、何か?w

panel_と_タスクマネージャ_と_IBus_について_と___無題_

メモリの消費も最小限で、速度も実用的。Linux の GUI ツールっていうのはまったく知りませんが、探せばいろいろあるかと思います。あわてず、少しづつ入れてみます。知らないだけで、実は便利なLinux のGUIツールっていうのはありそうですよね。

LXDE Desktop のほうが軽かった

この画像、osx から X11 経由で接続してます。LXDE でとりあえずいいやってことにして、これを使ってみます。

LXDE

キーボードマップがどこで設定するのかがまだ、わかりませんが。ぜんぜん、実用的な感じでちょっとGUI環境もいいなってことで見直すことにしてみます。

 

いつになるかわかりませんが、GPIO を操作するアプリケーションをXでGUIインターフェイスで作ってみたいです。X-Window っていうのは、応用価値がありそうだということがわかりました。