armhfのUbuntuをインストール

Beaglebone BlackにUbuntu 12.04LTSをSDカード起動でインストールした。

ビルド済みイメージのダウンロード

http://www.armhf.com/index.php/download/

ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz (November 23, 2013)
md5: 36060e4209389d7d65422a549ede5111
host: ubuntu-armhf, user: ubuntu, pass: ubuntu

ダウンローする。

~/BBB$ wget wget http://s3.armhf.com/debian/precise/bone/ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz

サイズの確認。66MBと案外小さい。

~/BBB$ ls -lh ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz
-rw-r--r-- 1 kinneko kinneko 66M Nov 24 06:29 ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz

チェックサムの確認。問題ない。

$ md5sum ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz
36060e4209389d7d65422a549ede5111  ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz

イメージファイルの内容を確認する

armhf.comには、以下のように、直接展開しながらSDカードにダンプして書き込む方法が書かれている。

$ xz -cd ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz > /dev/sdX

ここでは、一旦展開して、構成を確認してみる。

~/BBB$ xz -dv ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz
ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img.xz (1/1)
  100 %       65.3 MiB / 1832.0 MiB = 0.036   199 MiB/s       0:09

展開したサイズを見る。1.8GBとは結構大きい。書き込みのSDは2GBを想定しているようだ。

~/BBB$ ls -lh ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img
-rw-r--r-- 1 kinneko kinneko 1.8G Nov 24 06:29 ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img

パーティション構成を見る。中身は、たった2つ。起動用のfat領域と、userland用のext領域。

~/BBB$ sudo fdisk -l ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img

Disk ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img: 1920 MB, 1920991232 bytes
255 heads, 63 sectors/track, 233 cylinders, total 3751936 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x80008000

                                         Device Boot      Start         End      Blocks   Id  System
ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img1   *        2048        4095        1024    1  FAT12
ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img2            4096     3751935     1873920   83  Linux

第一パーティションをマウントする。パーティション情報からオフセットを計算してマウントする。2048x512=1048576。

~/BBB$ sudo mount -o loop,offset=1048576 ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img /media

マウントできたので中を見る。kernelがuImageとして置かれていない。普通とは違う。

~/BBB$ ls -l /media/
total 466
-rwxr-xr-x 1 root root 104320 Nov 17 12:54 MLO
-rwxr-xr-x 1 root root 370652 Nov 17 12:54 u-boot.img
-rwxr-xr-x 1 root root    340 Nov 17 12:54 uEnv.txt

uEnv.txtの中を確認する。ftdとkernelは第二パーティションからロードされているようだ。

~/BBB$ cat /media/uEnv.txt
mmcpart=2
optargs=fixrtc
uenvcmd=i2c mw 0x24 1 0x3e; kd=0; if test $mmcdev -eq 1; then mmc dev 0; if mmc rescan; then kd=1; fi; mmc dev 1; fi; setenv mmcroot /dev/mmcblk${kd}p${mmcpart} ro
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} ${bootdir}/dtbs/${fdtfile}
loadimage=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${bootdir}/${bootfile}

展開すると、こんなところ。値が不明なマクロは埋め込みになっているのだろう。内蔵eMMCか、外付けSDか、どちらで起動したのか調べて、起動ボリュームを変更している。

optargs=fixrtc
uenvcmd=i2c mw 0x24 1 0x3e; 
kd=0; 
if test $mmcdev -eq 1; then 
    mmc dev 0; 
    if mmc rescan; then
        kd=1; 
    fi; 
	mmc dev 1; 
fi; 
setenv mmcroot /dev/mmcblk${kd}p2 ro
loadfdt=load mmc ${mmcdev}:2 ${fdtaddr} ${bootdir}/dtbs/${fdtfile}
loadimage=load mmc ${mmcdev}:2 ${loadaddr} ${bootdir}/${bootfile}

u-bootも調べておく。バージョンやロードアドレスなどがわかる。

~/BBB$ file /media/u-boot.img
/media/u-boot.img: u-boot legacy uImage, U-Boot 2013.10-00249-g15c5cdf fo\023, Firmware/ARM, Firmware Image (Not compressed), 370588 bytes, Mon Nov 18 01:40:23 2013, Load Address: 0x80800000, Entry Point: 0x00000000, Header CRC: 0xFA963551, Data CRC: 0x29F35336

アンマウントしておく。

~/BBB$ sudo umount /media/

2つめのパーティションをマウントする。こちらもオフセットを計算する。4096x512=2097152

~/BBB$ sudo mount -o loop,offset=2097152 ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img /media

内容を見てみる。普通のrootfsの構成だ。

~/BBB$ ls -l /media/
total 92
drwxr-xr-x  2 root root  4096 Nov 12 00:13 bin
drwxr-xr-x  4 root root  4096 Nov 24 03:33 boot
drwxr-xr-x  3 root root  4096 Aug 21  2013 dev
drwxr-xr-x 67 root root  4096 Nov 24 04:08 etc
drwxr-xr-x  3 root root  4096 Nov 12 00:17 home
drwxr-xr-x 12 root root  4096 Nov 14 20:25 lib
drwx------  2 root root 16384 Nov 21 04:16 lost+found
drwxr-xr-x  2 root root  4096 Aug 21  2013 media
drwxr-xr-x  2 root root  4096 Apr 19  2012 mnt
drwxr-xr-x  2 root root  4096 Aug 21  2013 opt
drwxr-xr-x  2 root root  4096 Apr 19  2012 proc
drwx------  2 root root  4096 Nov 24 03:33 root
drwxr-xr-x  7 root root  4096 Nov 12 00:17 run
drwxr-xr-x  2 root root  4096 Nov 12 00:13 sbin
drwxr-xr-x  2 root root  4096 Mar  5  2012 selinux
drwxr-xr-x  2 root root  4096 Aug 21  2013 srv
drwxr-xr-x  2 root root  4096 Apr 14  2012 sys
drwxrwxrwt  2 root root  4096 Nov 12 00:17 tmp
drwxr-xr-x 10 root root  4096 Nov 14 20:24 usr
drwxr-xr-x 11 root root  4096 Nov 24 03:33 var

先ほどのuEnv.txtから、kernelとftdはこのパーティションから読んでいることがわかった。これもファイルを確認しておく。kernelはzImageが置かれている。

~/BBB$ ls /media/boot/
System.map-3.8.13-bone30  dtbs   vmlinuz-3.8.13-bone30
config-3.8.13-bone30      uboot  zImage

バイスツリーの情報を見る。いろいろ入っているが、使っているのは"am335x-boneblack.dtb"だけだろう。

kinneko@L2012:~/BBB$ ls /media/boot/dtbs/
am335x-bone.dtb       omap3-beagle-xm.dtb  omap4-panda.dtb
am335x-boneblack.dtb  omap3-beagle.dtb     omap4-sdp.dtb
am335x-evm.dtb        omap3-evm.dtb        omap4-var-som.dtb
am335x-evmsk.dtb      omap3-tobi.dtb       omap5-evm.dtb
am335x-tester.dtb     omap4-panda-a4.dtb
omap2420-h4.dtb       omap4-panda-es.dtb

アンマウントしておく。

~/BBB$ sudo umount /media

SDカードへの書き込み

SDカードに書き込む。2GBのカードを用意した。dmesgなどでカードに割り当てられたデバイス名を確認しておく。作業環境を上書きしてしまわないように慎重に調べる。ここではsdcであった。サイズが大きいので、少し時間がかかる。bootパーティションとrootfsの2つで配布しているものを自力で書いたほうが早いだろう。

~/BBB$ sudo dd if=ubuntu-precise-12.04.3-armhf-3.8.13-bone30.img of=/dev/sdc
3751936+0 records in
3751936+0 records out
1920991232 bytes (1.9 GB) copied, 747.133 s, 2.6 MB/s

書き込み結果を確認。

~/BBB$ sudo fdisk -l /dev/sdc

Disk /dev/sdc: 2030 MB, 2030043136 bytes
63 heads, 62 sectors/track, 1015 cylinders, total 3964928 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x80008000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *        2048        4095        1024    1  FAT12
/dev/sdc2            4096     3751935     1873920   83  Linux

SDカードから起動可能にするためにuboot設定を変更する

以前、saucyのイメージを使った時には、ubootの設定がおかしくて、ボタンを押さないと起動できないシステムで、SD単体での自動起動はできなかった。
http://d.hatena.ne.jp/kinneko/20140115/p2
http://d.hatena.ne.jp/kinneko/20140116/p1
同じ問題を抱えているようなので、SDカードのuEnv.txtを修正しておく。

~/BBB$ sudo mount /dev/sdc1 /media
mount: special device /dev/sdc1 does not exist

見えてないや。一度抜き差し。こんどは、sdbとして認識されている。

~/BBB$ sudo mount /dev/sdb1 /media
~/BBB$ sudo vi /media/uEnv.txt

mmcpart=2
bootfile=zImage
optargs=fixrtc
uenvcmd=i2c mw 0x24 1 0x3e; kd=0; if test $mmcdev -eq 1; then mmc dev 0; if mmc rescan; then kd=1; fi; mmc dev 1; fi; setenv mmcroot /dev/mmcblk${kd}p${mmcpart} ro
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} ${bootdir}/dtbs/${fdtfile}
loadimage=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${bootdir}/${bootfile}
mmcboot=echo Booting from mmc ...; run mmcargs; bootz ${kloadaddr} - ${fdtaddr}

~/BBB$ sudo umount /media/

これで起動できるはず。

起動テスト

Beaglebone BlackにSDを差し込み、有線LAN、HDMI、USBキーボードを接続して、ACアダプタ給電で起動する。
問題なくコンソール起動してきた。UID:ubuntu, PASS:ubuntuでログインできた。
sshからのリモートログインも問題なくできた。

~/BBB$ ssh ubuntu@192.168.1.102
The authenticity of host '192.168.1.102 (192.168.1.102)' can't be established.
ECDSA key fingerprint is 24:c4:b2:fe:9b:be:28:ec:85:86:f6:63:e1:62:3f:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.102' (ECDSA) to the list of known hosts.
ubuntu@192.168.1.102's password:
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.13-bone30 armv7l)

 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar 11 11:09:16 2014

パッケージデータベースの更新と、パッケージの更新を行っておく。

ubuntu@ubuntu-armhf:~$ sudo apt-get update
ubuntu@ubuntu-armhf:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
  apt apt-utils base-files dmsetup file gnupg gpgv iproute libapt-inst1.4
  libapt-pkg4.12 libdevmapper1.02.1 libdrm-nouveau1a libdrm-radeon1 libdrm2
  libmagic1 libssl1.0.0 openssl perl-base python2.7 python2.7-minimal rsyslog
  xkb-data
22 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.6 MB of archives.
After this operation, 4096 B of additional disk space will be used.
Do you want to continue [Y/n]?
(snip)

最新の12.04.4 LTSに更新された。

ubuntu@ubuntu-armhf:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

マウント時には、noatimeは設定されている。

ubuntu@ubuntu-armhf:~$ cat /etc/fstab
# <file system>          <dir>         <type>   <options>                          <dump> <pass>
proc                     /proc         proc     defaults                             0      0
# /dev/mmcblk0p2
LABEL=rootfs_armhf.com   /             ext4     defaults,noatime,errors=remount-ro   0      1
# /dev/mmcblk0p1
LABEL=BOOT_ARMHF         /boot/uboot   vfat     defaults,noatime                     0      0

終了しておく。

ubuntu@ubuntu-armhf:~$ sudo shutdown -h now
ubuntu@ubuntu-armhf:~$
Broadcast message from ubuntu@ubuntu-armhf
	(/dev/pts/0) at 11:52 ...

The system is going down for halt NOW!
Connection to 192.168.1.102 closed by remote host.
Connection to 192.168.1.102 closed.