作業用miniroot作成 -1-

ターゲットは、arm-v7a-neon
ほんとは、multistrapでarmhfでやりたかったのだけど、時間がなかったのでarmelでdebootstrapで妥協した。
いかんいかん、勉強の機会を逸した。
debootstrapはえらく久しぶりだったので、とりあえず、後のために履歴を残す。


要求はmkfs.ext3, mkfs.vfat, fdisk, dd, tarが入っていればいいということ。
要するに内蔵eMMCの書き換え専用イメージのベースがほしいわけ。
単独起動したらいいので、細かい設定は抜きで。
ターゲットには、どのみち無線LANしかないので、ネットワーク接続可能になることは期待薄。

debootstrapする

kinneko@BuildSV:~/ARMinimal$ mkdir armel
kinneko@BuildSV:~/ARMinimal$ cd armel/
kinneko@BuildSV:~/ARMinimal/armel$ sudo apt-get install debootstrap
kinneko@BuildSV:~/ARMinimal/armel$ sudo debootstrap --arch armel squeeze ./ http://ftp.debian.org/debian
(snip)
W: Failure trying to run: chroot /home/kinneko/ARMinimal/armel/. mount -t proc proc /proc

あ、foreignオプション忘れた。
ついでにminbaseも追加。

kinneko@BuildSV:~/ARMinimal/armel$ sudo debootstrap --arch armel --variant=minbase --foreign squeeze ./ http://ftp.debian.org/debian
(snip)
I: Extracting zlib1g...
kinneko@BuildSV:~/ARMinimal/armel$ ls
bin   debootstrap  etc   lib  proc  sbin     sys  usr
boot  dev          home  mnt  root  selinux  tmp  var

できあがり。
アーカイブする。

kinneko@BuildSV:~/ARMinimal/armel$ sudo tar zcvfp ../root-armel.tgz ./
kinneko@BuildSV:~/ARMinimal/armel$ cd ..
kinneko@BuildSV:~/ARMinimal$ ls -l root-armel.tgz 
-rw-r--r-- 1 root root 82946901 Jul 12 23:39 root-armel.tgz

80MBくらい。
でかい...
まぁ、起動容量に余裕があるから、小さくする労力をかける必要はないな。

実機にてdebootstrapのセカンドステージを実行

次に、実機でセカンドステージる。
最近は、qemuのライブラリ使ったり、Multiarchライブラリ使ったりで、セカンドステージもクロスでできるらしいが、それも試している余裕がない。
SDを用意して書き込み。
SDを4パーティションに分け、フォーマット。

中身をそれぞれに展開。

kinneko@BuildSV:~/ARMinimal$ sudo mount /dev/sdb4 /media
kinneko@BuildSV:~/ARMinimal$ cd /media/
kinneko@BuildSV:/media$ sudo tar xvfp ~/ARMinimal/root-armel.tgz 
kinneko@BuildSV:/media$ cd ~/ARMinimal/
kinneko@BuildSV:~/ARMinimal$ sudo umount /media
kinneko@BuildSV:~/ARMinimal$ sudo mount /dev/sdb3 /media
kinneko@BuildSV:/media$ sudo tar xvf ~/TARGET/buildtest/work/outobj/android-fs_shurink_neon.tar.gz
kinneko@BuildSV:/media$ cd ~/ARMinimal/
kinneko@BuildSV:~/ARMinimal$ sudo umount /media
kinneko@BuildSV:~/ARMinimal$ sudo mount /dev/sdb1 /media
kinneko@BuildSV:~/ARMinimal$ sudo cp ~/TARGET/buildtest/work/outobj/*.bin /media/
kinneko@BuildSV:~/ARMinimal$ sudo cp ~/TARGET/buildtest/work/outobj/uImage.neon /media/uImage
kinneko@BuildSV:~/ARMinimal$ sudo umount /media

ターゲットにSDを入れてシリアル接続してubootから適当に起動。

kinneko@BuildSV:~/ARMinimal$ sudo minicom -8 -D /dev/ttyUSB1
Booted Device: SD
DRAM:  256 MB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
U-BOOT # setenv bootargs root=/dev/mmcblk1p4 noinitrd init=/bin/sh console=ttyS0,115200n8n SELINUX_INIT=no mem=180M@1024M rw video=qfb: ip=none rootfstype=ext3 rootwait;bootm 40007fc0
(snip)
VFS: Mounted root (ext3 filesystem) on device 179:12. 
Freeing init memory: 116K
/bin/sh: can't access tty; job control turned off
#

来た。
セカンドステージを実行。

# /debootstrap/debootstrap --second-stage
I: Installing core packages...
(snip)
I: Base system installed successfully.

完成。
この状態で、mkfs.ext3, fdisk, dd, tarあり。
mkfs.vfatだけ不足。
これは後から考える。

eMMCへのアクセスを確認

起動ログでは、内蔵eMMCとSDCardは認識している。

mmc0: new high speed MMC card at address 0001
mmcblk0: mmc0:0001 M4G1FA 3.72 GiB
 mmcblk0: p1 p2 p3 p4
mmc1: new high speed SD card at address 8dc5
mmcblk1: mmc1:8dc5 SD02G 1.83 GiB
 mmcblk1: p1 p2 p3 p4        

kernelのビルドオプションでeMMCアクセスに必要なモジュールが組み込まれているか調べる。

# mount -t proc proc /proc
# zcat /proc/config.gz |grep CONFIG_MMC
CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
CONFIG_MMC_UNSAFE_RESUME=y
CONFIG_MMC_EMBEDDED_SDIO=y
# CONFIG_MMC_PARANOID_SD_INIT is not set
CONFIG_MMC_BLOCK=y
# CONFIG_MMC_BLOCK_BOUNCE is not set
# CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set
# CONFIG_MMC_TEST is not set
# CONFIG_MMC_SDHCI is not set

MMC_SDHCIってなくてもよかったんだっけ?

sdhci: Secure Digital Host Controller Interface driver

今回の用途では、なくても問題なさそう。


内蔵eMMCにアクセスするには、デバイスファイルが必要。
作っておく。
たしか、ubootは8パーティションまでしか見られないのだったかな。
一応、8つまで作っておく。

# mknod /dev/mmcblk0 b 179 0
# mknod /dev/mmcblk0p1 b 179 1
# mknod /dev/mmcblk0p2 b 179 2
# mknod /dev/mmcblk0p3 b 179 3
# mknod /dev/mmcblk0p4 b 179 4
# mknod /dev/mmcblk0p5 b 179 5
# mknod /dev/mmcblk0p6 b 179 6
# mknod /dev/mmcblk0p7 b 179 7
# mknod /dev/mmcblk0p8 b 179 8

ddで、ダンプできることを確認しておく。
できたできた。

掃除

インストールに使ったdebパッケージを掃除。

# apt-get clean                                                                                               

80MBくらいあったのは、40MB強に小さくなっている。


mkfs.vfatの追加

mkfs.vfatを入れたい。
ネットないので、SDだけ外して、パッケージファイルを取得しておく。

kinneko@BuildSV:/media$ sudo wget http://ftp.de.debian.org/debian/pool/main/d/dosfstools/dosfstools_3.0.9-1_armel.deb

SDをターゲットに挿して起動。

# dpkg -i dosfstools_3.0.9-1_armel.deb                                                                        
dpkg: error: PATH is not set.  

うぐぐ。

# export PATH=$PATH:/usr/local/sbin/
# export PATH=$PATH:/usr/sbin/
# export PATH=$PATH:/sbin
# dpkg -i dosfstools_3.0.9-1_armel.deb                                                                        
Selecting previously deselected package dosfstools.                                                           
(Reading database ... 6140 files and directories currently installed.)                                        
Unpacking dosfstools (from dosfstools_3.0.9-1_armel.deb) ...                                                  
Setting up dosfstools (3.0.9-1) ... 
# mkfs.vfat                                                                                                   
mkfs.vfat 3.0.9 (31 Jan 2010)                                                                                 
No device specified!                                                                                          
Usage: mkdosfs [-a][-A][-c][-C][-v][-I][-l bad-block-file][-b backup-boot-sector]                             
       [-m boot-msg-file][-n volume-name][-i volume-id]                                                       
       [-s sectors-per-cluster][-S logical-sector-size][-f number-of-FATs]                                    
       [-h hidden-sectors][-F fat-size][-r root-dir-entries][-R reserved-sectors]                             
       /dev/name [blocks] 
# rm dosfstools_3.0.9-1_armel.deb                                                                             
# apt-get clean
# sync

アーカイブ作成

あとは、アーカイブ作って終わり。

kinneko@BuildSV:/media$ sudo tar zcvfp ~/ARMinimal/rootfs-armel.tgz ./
kinneko@BuildSV:/media$ ~/ARMinimal
kinneko@BuildSV:~/ARMinimal$ ls -lh rootfs-armel.tgz
-rw-r--r--  1 root    root     39M Jul 13 02:07 rootfs-armel.tgz

しかしデカいな。
ふつうは、このあと、ネットワーク設定したり、fstab書いたり、シリアルコンソールまともにしたり、エディタ入れたり、hostnameつけたり、apt-get update/upgradeしたり、そういう作業もする。
今回は必要ないのと、ネットワークないのでパス。
RTCないので、時計ないときは、こんなことも。

echo HWCLOCKACCESS=no >> /etc/default/rcS

buildrootで作ったものとかはさらに小さいけど、パッケージ管理が生きていないので、いろいろと追加していくのは自前ビルドになって、結構メンテナンスがしんどい。
debootstrapだと、違うアーキテクチャでも簡単に作れて便利だ。
しかし、久しぶりにやったら、思ったより時間かかってしまつた。
1時間くらいでできると思ったのだけど(^^;。
耄碌したわい...