[メモ] ASUS TinkerBoard: カーネル・OSイメージのビルド / ベンチマーク

## 概要
- TinkerBoardで使えるOSイメージをビルド<br>(2017-3-21現在)
    - ここでビルドしたものでは、<font color='red'>WifiとBluetoothは**使えない**</font>
    - ASUSが、TinkerOSとか、カーネルのソースコード・ビルド手順を<del>出してないよね?</del><br>=> https://github.com/TinkerBoard/debian_kernel ここにある。(2017-09-26更新... ずっと前から、みんな知ってるよな! 記事更新してなかった)
- 基本的に [[TUTORIAL] Build a Tinker Board development image](http://tinkerboarding.co.uk/forum/showthread.php?tid=22) にそってます。
- Windowsで、VirtualBox上に、Ubuntu16.04の仮想機を作って、そこでビルド。

- 作成したイメージは、sshが有効になっていて、ユーザ名: `linaro` / パスワード: `linaro`で、ログインできる。

- 3840x2160での表示(を縮小したもの)....<br>![起動画面jpg](http://qiita-image-store.s3.amazonaws.com/0/75594/ad3215ad-ff33-7360-aef1-6c37f306bb52.jpeg)

## 環境 
- ASUS TinkerBoard
- 仮想機ホスト: Windows 10 64bit
    - Vagrant 1.9.2
    - Virtualbox 5.0.32
    - 仮想マシン: Ubuntu 16.04
        - ベースイメージ ubuntu/xenial64 (20170320.0.0) 使用
        - CPU:2コア / RAM: 4GB (お好みにより変更)
        - ソースコードとか生成物を置く、16GBの外部ディスクイメージを作成(`/vagrant/disk-ext4.img`, `/vagrant`は Windowsから提供される共有フォルダ)<br>`sudo mount -t ext4 -o loop /vagrant/disk-ext4.img /mnt/tinker`<br>にて、マウント。起動ごとにうまくマウントすること.



## 手順

### Windowsでの作業
1. インストールして使えるようにしとく::
    - Vagrant
    - Virtualbox
    - git for Windows 
2. `C:\Vagrant\TB-Dev` フォルダを作成して、`Vagrantfile`を作る

	```rb:Vagrantfile
	# Vagrantfile
	# mt08

	VB_NAME="Build-TinkerOS-MoDoKi"
	VM_MEMORY=4096
	VM_CORES=2
	VM_HOSTNAME="TB-MoDoKi.local"

	Vagrant.configure("2") do |config|
		config.vm.box = "ubuntu/xenial64"
		config.ssh.username = 'ubuntu'

		config.vm.provider "virtualbox" do |vb|
			vb.gui    = false 
			vb.name   = VB_NAME
			vb.memory = VM_MEMORY
			vb.cpus   = VM_CORES
		end

		config.vm.provision "shell", inline: <<-SHELL
			#echo 'Acquire::http::Proxy "http://apt-cache-server:3142";' | tee /etc/apt/apt.conf.d/02proxy

			apt-get update
			apt-get upgrade -y
			
			apt-get install -y git build-essential bc libssl-dev
			apt-get install -y gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools parted  binfmt-support
			apt-get install -y qemu-user-static
			apt-get install -y python-dbus python-debian python-parted python-yaml python-apt

			# python-support for Ubuntu 16.04
			wget http://launchpadlibrarian.net/109052632/python-support_1.0.15_all.deb
			dpkg -i ./python-support_1.0.15_all.deb
			rm -fv ./python-support_1.0.15_all.deb
			apt-get install -f
		SHELL
	end
	```

3. Git Bashをひらいて、
    1. 仮想機起動:<br>`vagrant up`
    2. ... 返って来るまで、待つ ...
    3. 16GBのファイル(`disk-ext4.img`)を作る<br>`fsutil file createnew disk-ext4.img 17179869184`
    4. sshログイン<br>`vagrant ssh`

### Ubuntuでの作業
1. ファイルの確認:<br>`ls -l /vagrant/disk-ext4.img` 
2. ext4でフォーマット<br>`mkfs.ext4 /vagrant/disk-ext4.img`
3. マウントして、作業フォルダ作成・移動

	```bash
	sudo mkdir /mnt/tinker
	sudo mount -t ext4 -o loop /vagrant/disk-ext4.img /mnt/tinker/
	ls -l /mnt/tinker  #確認
	cd /mnt/tinker     #移動
	sudo mkdir tinkeroscustom
	sudo chmod 777 tinkeroscustom
	sudo chown ubuntu.ubuntu tinkeroscustom
	cd tinkeroscustom
	```
4. ソースコード・スクリプトなど取得

	```bash:結構、時間かかるよ
	cd /mnt/tinker/tinkeroscustom
	git clone https://github.com/rockchip-linux/kernel.git
	git clone https://github.com/rockchip-linux/u-boot.git
	git clone https://github.com/rockchip-linux/rk-rootfs-build.git
	git clone https://github.com/rockchip-linux/build.git
	```

5. ビルド
    1. uboot: <br>`build/mk-uboot.sh miniarm`

		```txt:参考
		real    0m32.818s
		user    0m26.388s
		sys     0m2.136s
		```
    2. rootfsイメージ作成


		```bash
		cd rk-rootfs-build/
		# 必要なパッケージ導入
		sudo dpkg -i ubuntu-build-service/packages/*
		sudo apt-get install -f
		
		# ビルド
		TARGET=desktop ARCH=armhf ./mk-base-debian.
			#参考time
			#real    25m41.317s
			#user    15m4.508s
			#sys     0m56.804s
		
		ARCH=armhf ./mk-rootfs.sh
			#参考time
			#real    3m5.331s
			#user    2m23.524s
			#sys     0m9.888s
		
		./mk-image.sh
			#参考time
			#real    0m43.335s
			#user    0m0.332s
			#sys     0m2.840s
		```

    3. カーネルビルド

		```bash
		cd /mnt/tinker/tinkeroscustom
		build/mk-kernel.sh miniarm
			#参考time
			#real    8m38.834s
			#user    14m12.372s
			#sys     1m20.440s
		```
6. 仕上げ
    1. rk3288の編集: `vi build/extlinux/rk3288.conf`<br>`root=/dev/mmcblk`<font color='red'>2</font>`p7` を `root=/dev/mmcblk`<font color='blue'>0</font>`p7`へ

		```txt:こんな感じ/mnt/tinker/tinkeroscustombuild/extlinux/rk3288.conf
		label kernel-4.4
			kernel /zImage
			fdt /rk3288-miniarm.dtb
			append  earlyprintk console=tty1 console=ttyS2,115200n8 rw root=/dev/mmcblk0p7 rootfstype=ext4 init=/sbin/init
		```

    2. sdイメージ作成

		```bash
		build/mk-image.sh -c miniarm -t boot
		build/mk-image.sh -c miniarm -t system -s 4000 -r rk-rootfs-build/linaro-rootfs.img
		```
    3. `out/system.img`

		```shell-session:system.imgをSDにやく
		ubuntu@ubuntu-xenial:/mnt/tinker/tinkeroscustom$ ls -l ./out/system.img
		-rw-rw-r-- 1 ubuntu ubuntu 1974607872 Mar 21 17:20 ./out/system.img
		```
7. Windows側へコピー:<br>`cp out/system.img /vagrant/`<br>=> Windowsから、[いつものツール](https://rufus.akeo.ie/)で、SDに焼く



## ベンチ
### byte-unixbench

	```bash:byte-unixbench導入・実行
	sudo apt-get install git-core build-essential
	git clone https://github.com/kdlucas/byte-unixbench.git
	cd byte-unixbench/UnixBench
	./Run
	```

	```shell-session:結果...1時間くらいかかたのか... 
	linaro@linaro-alip:~/byte-unixbench/UnixBench$ ./Run
	gcc -o pgms/arithoh -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Darithoh src/arith.c 
	gcc -o pgms/register -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum='register int' src/arith.c 
	gcc -o pgms/short -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=short src/arith.c 
	gcc -o pgms/int -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=int src/arith.c 
	gcc -o pgms/long -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=long src/arith.c 
	gcc -o pgms/float -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=float src/arith.c 
	gcc -o pgms/double -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=double src/arith.c 
	gcc -o pgms/hanoi -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/hanoi.c 
	gcc -o pgms/syscall -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/syscall.c 
	gcc -o pgms/context1 -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/context1.c 
	gcc -o pgms/pipe -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/pipe.c 
	gcc -o pgms/spawn -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/spawn.c 
	gcc -o pgms/execl -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/execl.c 
	gcc -o pgms/dhry2 -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -DHZ= ./src/dhry_1.c ./src/dhry_2.c
	gcc -o pgms/dhry2reg -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -DHZ= -DREG=register ./src/dhry_1.c ./src/dhry_2.c
	gcc -o pgms/looper -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/looper.c 
	gcc -o pgms/fstime -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME src/fstime.c 
	gcc -o pgms/whetstone-double -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -DDP -DGTODay -DUNIXBENCH src/whets.c -lm
	make all
	make[1]: Entering directory '/home/linaro/byte-unixbench/UnixBench'
	make distr
	make[2]: Entering directory '/home/linaro/byte-unixbench/UnixBench'
	Checking distribution of files
	./pgms  exists
	./src  exists
	./testdir  exists
	./tmp  exists
	./results  exists
	make[2]: Leaving directory '/home/linaro/byte-unixbench/UnixBench'
	make programs
	make[2]: Entering directory '/home/linaro/byte-unixbench/UnixBench'
	make[2]: Nothing to be done for 'programs'.
	make[2]: Leaving directory '/home/linaro/byte-unixbench/UnixBench'
	make[1]: Leaving directory '/home/linaro/byte-unixbench/UnixBench'
	locale: Cannot set LC_CTYPE to default locale: No such file or directory
	locale: Cannot set LC_MESSAGES to default locale: No such file or directory
	locale: Cannot set LC_ALL to default locale: No such file or directory
	locale: Cannot set LC_CTYPE to default locale: No such file or directory
	locale: Cannot set LC_MESSAGES to default locale: No such file or directory
	locale: Cannot set LC_ALL to default locale: No such file or directory
	sh: 1: 3dinfo: not found

	   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
	   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
	   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
	   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
	   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
		####   #    #  #  #    #          #####   ######  #    #   ####   #    #

	   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

	   Multi-CPU version                  Version 5 revisions by Ian Smith,
										  Sunnyvale, CA, USA
	   January 13, 2011                   johantheghost at yahoo period com

	Use of uninitialized value in printf at ./Run line 1438.
	Use of uninitialized value in printf at ./Run line 1439.
	Use of uninitialized value in printf at ./Run line 1438.
	Use of uninitialized value in printf at ./Run line 1439.
	Use of uninitialized value in printf at ./Run line 1438.
	Use of uninitialized value in printf at ./Run line 1439.
	Use of uninitialized value in printf at ./Run line 1438.
	Use of uninitialized value in printf at ./Run line 1439.
	Use of uninitialized value in printf at ./Run line 1648.
	Use of uninitialized value in printf at ./Run line 1649.
	Use of uninitialized value in printf at ./Run line 1648.
	Use of uninitialized value in printf at ./Run line 1649.
	Use of uninitialized value in printf at ./Run line 1648.
	Use of uninitialized value in printf at ./Run line 1649.
	Use of uninitialized value in printf at ./Run line 1648.
	Use of uninitialized value in printf at ./Run line 1649.

	1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

	1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

	1 x Execl Throughput  1 2 3

	1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

	1 x File Copy 256 bufsize 500 maxblocks  1 2 3

	1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

	1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

	1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

	1 x Process Creation  1 2 3

	1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

	1 x Shell Scripts (1 concurrent)  1 2 3

	1 x Shell Scripts (8 concurrent)  1 2 3

	4 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

	4 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

	4 x Execl Throughput  1 2 3

	4 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

	4 x File Copy 256 bufsize 500 maxblocks  1 2 3

	4 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

	4 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

	4 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

	4 x Process Creation  1 2 3

	4 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

	4 x Shell Scripts (1 concurrent)  1 2 3

	4 x Shell Scripts (8 concurrent)  1 2 3

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

	   System: linaro-alip: GNU/Linux
	   OS: GNU/Linux -- 4.4.52 -- #1 SMP Tue Mar 21 17:17:30 UTC 2017
	   Machine: armv7l (unknown)
	   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
	   CPU 0: ARMv7 Processor rev 1 (v7l) (0.0 bogomips)
			  
	   CPU 1: ARMv7 Processor rev 1 (v7l) (0.0 bogomips)
			  
	   CPU 2: ARMv7 Processor rev 1 (v7l) (0.0 bogomips)
			  
	   CPU 3: ARMv7 Processor rev 1 (v7l) (0.0 bogomips)
			  
	   19:31:01 up 6 min,  3 users,  load average: 0.66, 0.34, 0.16; runlevel Mar

	------------------------------------------------------------------------
	Benchmark Run: Tue Mar 21 2017 19:31:01 - 19:59:16
	4 CPUs in system; running 1 parallel copy of tests

	Dhrystone 2 using register variables       10094986.0 lps   (10.0 s, 7 samples)
	Double-Precision Whetstone                     1494.8 MWIPS (10.1 s, 7 samples)
	Execl Throughput                                974.9 lps   (29.9 s, 2 samples)
	File Copy 1024 bufsize 2000 maxblocks        173252.4 KBps  (30.0 s, 2 samples)
	File Copy 256 bufsize 500 maxblocks           57547.3 KBps  (30.0 s, 2 samples)
	File Copy 4096 bufsize 8000 maxblocks        421426.1 KBps  (30.0 s, 2 samples)
	Pipe Throughput                              362544.6 lps   (10.0 s, 7 samples)
	Pipe-based Context Switching                  48032.5 lps   (10.0 s, 7 samples)
	Process Creation                                369.6 lps   (30.0 s, 2 samples)
	Shell Scripts (1 concurrent)                   1352.4 lpm   (60.0 s, 2 samples)
	Shell Scripts (8 concurrent)                   1020.5 lpm   (60.1 s, 2 samples)
	System Call Overhead                         783442.5 lps   (10.0 s, 7 samples)

	System Benchmarks Index Values               BASELINE       RESULT    INDEX
	Dhrystone 2 using register variables         116700.0   10094986.0    865.0
	Double-Precision Whetstone                       55.0       1494.8    271.8
	Execl Throughput                                 43.0        974.9    226.7
	File Copy 1024 bufsize 2000 maxblocks          3960.0     173252.4    437.5
	File Copy 256 bufsize 500 maxblocks            1655.0      57547.3    347.7
	File Copy 4096 bufsize 8000 maxblocks          5800.0     421426.1    726.6
	Pipe Throughput                               12440.0     362544.6    291.4
	Pipe-based Context Switching                   4000.0      48032.5    120.1
	Process Creation                                126.0        369.6     29.3
	Shell Scripts (1 concurrent)                     42.4       1352.4    319.0
	Shell Scripts (8 concurrent)                      6.0       1020.5   1700.9
	System Call Overhead                          15000.0     783442.5    522.3
																	   ========
	System Benchmarks Index Score                                         330.7

	------------------------------------------------------------------------
	Benchmark Run: Tue Mar 21 2017 19:59:16 - 20:27:43
	4 CPUs in system; running 4 parallel copies of tests

	Dhrystone 2 using register variables       30422699.0 lps   (10.0 s, 7 samples)
	Double-Precision Whetstone                     5071.9 MWIPS (10.1 s, 7 samples)
	Execl Throughput                               4141.1 lps   (29.9 s, 2 samples)
	File Copy 1024 bufsize 2000 maxblocks        218831.1 KBps  (30.0 s, 2 samples)
	File Copy 256 bufsize 500 maxblocks           62352.0 KBps  (30.0 s, 2 samples)
	File Copy 4096 bufsize 8000 maxblocks        683966.7 KBps  (30.0 s, 2 samples)
	Pipe Throughput                             1253660.1 lps   (10.0 s, 7 samples)
	Pipe-based Context Switching                 148544.1 lps   (10.0 s, 7 samples)
	Process Creation                               8500.8 lps   (30.0 s, 2 samples)
	Shell Scripts (1 concurrent)                   7484.8 lpm   (60.0 s, 2 samples)
	Shell Scripts (8 concurrent)                   1025.5 lpm   (60.1 s, 2 samples)
	System Call Overhead                        2394917.0 lps   (10.0 s, 7 samples)

	System Benchmarks Index Values               BASELINE       RESULT    INDEX
	Dhrystone 2 using register variables         116700.0   30422699.0   2606.9
	Double-Precision Whetstone                       55.0       5071.9    922.2
	Execl Throughput                                 43.0       4141.1    963.0
	File Copy 1024 bufsize 2000 maxblocks          3960.0     218831.1    552.6
	File Copy 256 bufsize 500 maxblocks            1655.0      62352.0    376.7
	File Copy 4096 bufsize 8000 maxblocks          5800.0     683966.7   1179.3
	Pipe Throughput                               12440.0    1253660.1   1007.8
	Pipe-based Context Switching                   4000.0     148544.1    371.4
	Process Creation                                126.0       8500.8    674.7
	Shell Scripts (1 concurrent)                     42.4       7484.8   1765.3
	Shell Scripts (8 concurrent)                      6.0       1025.5   1709.2
	System Call Overhead                          15000.0    2394917.0   1596.6
																	   ========
	System Benchmarks Index Score                                         969.7

	linaro@linaro-alip:~/byte-unixbench/UnixBench$ 
	```

## その他
- ビルド後のディスクの使用量はこんな感じ。

	```shell-session
	ubuntu@ubuntu-xenial:/mnt/tinker/tinkeroscustom$ pwd
	/mnt/tinker/tinkeroscustom
	ubuntu@ubuntu-xenial:/mnt/tinker/tinkeroscustom$ sudo du -sh *
	1.3M    build
	4.4G    kernel
	1.9G    out
	5.5G    rk-rootfs-build
	269M    u-boot
	ubuntu@ubuntu-xenial:/mnt/tinker/tinkeroscustom$ df -h .
	Filesystem      Size  Used Avail Use% Mounted on
	/dev/loop0       16G   12G  2.9G  81% /mnt/tinker
	ubuntu@ubuntu-xenial:/mnt/tinker/tinkeroscustom$
	```
- 起動ごとに、EthernetのMACアドレスが変わる. (ので、DHCPで取得されるIPアドレスも変わるかと..)
- まだ、シロウトには、使えるものでないな...

<!--
https://twitter.com/shin177729/status/912131838990180353
-->