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.