How to use Angstrom - kinneko/BBBB GitHub Wiki
BeagleBone Blackには、AngstromというLinux環境がプリインストールされています。
この章ではコマンドラインで使ってみましょう。sshやシリアルポートからの操作を行います。
GUI環境でのAngstromの使い方は、別の章で行います。
Angstrom (オングストローム)は、PDA・ハンドヘルドデバイスなどのリソースの少ない機器に特化した組込みLinuxディストリビューションです。
SHARP Zaurusシリーズ用のLinuxディストリビューションとして開発されたOpenZaurusプロジェクトや、シーメンスのSIMpad用のOpenSimpadプロジェクト、組み込みLinux用のOpenEmbeddedプロジェクトから派生しました。
現在は、OpenEmbeddedをビルドフレームワークとして採用し、Yoctoプロジェクトの、OpenEmbeddedビルドシステム、bitbake、各種アプリケーション、BSPレイヤを使用しています。
しかし、AngstromとOpenEmbeddedは、まったく別のプロジェクトとして運用されています。
ディストリビューションの配布形式は、ターゲットハードウエアによってやや異なり、基本的にはコンソールで動作するものと、Xorgを含んだGUI環境を含んだものがあります。
組み込み向けのシステムなので、システムは一般的に構成の度にフルビルドされます。
プロジェクトでサポートされているターゲットハードウエアであれば、「Angstromオンインビルダー」でターゲットボードを選んで、オンラインビルドを行い、出来上がったイメージをダウンロードしてインストールできます。
しかし、いまのところ、選択肢にはBeagleBone Blackはサポートされていないので、Angstromオンラインビルダーを使ってインストールイメージをビルドし、ダウンロードすることはできません。
BeagleBone BlackにプリインストールされているAngstromは、"Angstrom-Cloud9-IDE-GNOME-eglibc-ipk-v2012.12-beaglebone-2013.06.20.img.xz"ですので、Xorg/GNOMEが入ったGUI環境になっています。GUI環境での使い方は別の章で解説します。
パッケージ管理システムは、ipkg(Itsy Packaging system)を使っていましたが、プロジェクトが終了したため、現在はOpenedHand Ltd.が開発したopkg形式を採用しています。
パッケージのアーカイブ方式は、ipkです。パッケージの拡張子も.ipkになります。
デフォルトシェルはbashです。
root@beaglebone:~# echo $SHELL
/bin/sh
root@beaglebone:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 18 2013 /bin/sh -> bash
root@beaglebone:~# ls -l /bin/bash
-rwxr-xr-x 1 root root 777868 May 20 2013 /bin/bash
root@beaglebone:~# /bin/bash --version
GNU bash, version 4.2.10(1)-release (arm-angstrom-linux-gnueabi)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
組み込み用だからといって、busyboxのsh,ashなどの機能制限されたシェルは使っているわけではありません。
インストールされているバージョンは、angstrom-versionファイルで確認できます。
root@beaglebone:~# cat /etc/angstrom-version
Angstrom v2012.12 (Core edition)
Built from branch: angstrom-staging-yocto1.3
Revision: 93f9f674059d8003a84ef1caad39339c2d940d4d
Target system: arm-angstrom-linux-gnueabi
"beaglebone-2013.06.20"などの細かなリビジョンは、含まれていないようです。
kernelのバージョンは、3.8.13です。
root@beaglebone:/# uname -a
Linux beaglebone 3.8.13 #1 SMP Tue Jun 18 02:11:09 EDT 2013 armv7l GNU/Linux
このkernelは、USB Hotplugのkernelイベントにバグがあるため、USBデバイスの自動認識ができません。
事前に、USB機器を接続した状態で電源をいれないと、USBデバイスが認識されません。
設定された起動オプションは以下でわかります。
root@beaglebone:/# cat /proc/cmdline
console=ttyO0,115200n8 quiet drm.debug=7 root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
CPUの情報から、NEONが有効なことがわかります。Linuxアーキテクチャとしては、armhfになります。
root@beaglebone:/# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 2 (v7l)
BogoMIPS : 297.40
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2
Hardware : Generic AM33XX (Flattened Device Tree)
Revision : 0000
Serial : 0000000000000000
搭載メモリは512MBで、起動した状態では6割近くが空いていることがわかります。
root@beaglebone:/# cat /proc/meminfo
MemTotal: 510820 kB
MemFree: 292620 kB
Buffers: 24696 kB
Cached: 100596 kB
SwapCached: 0 kB
Active: 100288 kB
Inactive: 88736 kB
Active(anon): 63888 kB
Inactive(anon): 1368 kB
Active(file): 36400 kB
Inactive(file): 87368 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 510820 kB
LowFree: 292620 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 120 kB
Writeback: 0 kB
AnonPages: 63740 kB
Mapped: 37608 kB
Shmem: 1528 kB
Slab: 18724 kB
SReclaimable: 12352 kB
SUnreclaim: 6372 kB
KernelStack: 1448 kB
PageTables: 2584 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 255408 kB
Committed_AS: 347812 kB
VmallocTotal: 499712 kB
VmallocUsed: 30756 kB
VmallocChunk: 389116 kB
root@beaglebone:/# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / ext4 rw,relatime,data=ordered 0 0
devtmpfs /dev devtmpfs rw,relatime,size=255280k,nr_inodes=63820,mode=755 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620 0 0
tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs rw,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=23,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0
mqueue /dev/mqueue mqueue rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime 0 0
gvfs-fuse-daemon /home/root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=0,group_id=0 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
/dev/mmcblk0p1 /media/BEAGLEBONE vfat rw,nosuid,nodev,relatime,fmask=0022,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro 0 0
root@beaglebone:/# cat /etc/fstab
rootfs / auto defaults 1 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
tmpfs /tmp tmpfs defaults 0 0
root@beaglebone:/# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 1.7G 1.1G 540M 67% /
/dev/root 1.7G 1.1G 540M 67% /
devtmpfs 250M 0 250M 0% /dev
tmpfs 250M 4.0K 250M 1% /dev/shm
tmpfs 250M 272K 250M 1% /run
tmpfs 250M 0 250M 0% /sys/fs/cgroup
tmpfs 250M 12K 250M 1% /tmp
/dev/mmcblk0p1 70M 56M 15M 80% /media/BEAGLEBONE
組み込みをターゲットにしているため、最近のPC向けディストリビューションに較べて、単純な構成になっています。PC向けディストリビューションが内部構造の標準化のために採用している、Linux Standard Base (LSB) には従っていません。そのため、/rootが/home/rootだったり、違和感があるかもしれません。構成としては、古いBSD UNIXシステムに近いものです。
root@beaglebone:/# ls
bin dev home lost+found mnt run sys usr
boot etc lib media proc sbin tmp var
/
+bin: 一般ユーザーが利用可能なプログラムの置き場所
+dev: デバイスを使うためのファイルの置き場所
+home/ : ユーザーのホームディレクトリの置き場所
| +root: rootユーザーのホームディレクトリ
+lost+found: ファイルシステムの破損などで管理が不明になったファイル置き場
+mnt: 外部メディアなどを後から一時的にマウントするための場所
+run: udev,systemdなどが利用するtmpfs(RAM上に作られた仮想ディスク)
+sys: sysfsが利用しているkernelメモリ空間を可視化したもの
+usr: ユーザーが共有するファイルの置き場
+boot: 起動に使用したinitramfs領域をマウントしている場所
+etc: 設定ファイルの置き場所
+lib: 実行ファイル用の共有ライブラリの置き場所
+media: CDやDVDなどを自動的に接続するマウントポイント
+proc: procfsが利用しているkernelメモリ空間を可視化したもの
+sbin: 管理者が使用するコマンド置き場
+tmp: 一時的に使用するファイルの置き場
+var: ログファイルや作業ファイルの置き場
/bin, /sbin, /usr/bin, /usr/sbinなどに入っているコマンド群は、一般的なPC向けのLinuxディストリビューションで採用されているようなコマンドではなく、組み込み用途で機能制限を行って小さく作られているものです。オプションがなかったり、出力結果が異なったりすることがありますので、注意が必要です。
1つのバイナリに複数のコマンドを詰め込み、オプションでそれぞれの機能を呼び出すbuxybox, tinyloginの他、coreutils, util-linuxもパッケージに含まれる全てのコマンドをサポートせずに、最小限の必要なものだけを厳選した専用の小型版が使われています。grep、gzip、hdparm、iproute2、procps、shadow、kmod、systemctl、sysvinit、procps、debianutils、sed、tar、udisksなども複数の機能を統合した独自のものが採用されています。
ユーザーは以下が設定されています。
root@beaglebone:~# cat /etc/passwd
root:x:0:0:root:/home/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
messagebus:x:999:998::/var/lib/dbus:/bin/false
xuser:x:1000:1000::/home/xuser:/bin/sh
avahi:x:998:996::/var/run/avahi-daemon:/bin/false
mpd:x:997:995::/var/lib/mpd:/bin/sh
gdm:x:42:1002:gdm:/var/lib/gdm:/bin/sh
パスワードは、shadowパスワードで管理されています。
rootアカウントにパスワードが設定されていないので、設定しておきます。
root@beaglebone:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root権限で作業を行うのは、危険を伴いますので、一般ユーザーを作っておきましょう。
adduserも、useraddも使用できます。
root@beaglebone:~# adduser [username]
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
adduserコマンドは、tinyloginが使われています。
root@beaglebone:~# which adduser
/bin/adduser
root@beaglebone:~# ls -l /bin/adduser
lrwxrwxrwx 1 root root 14 Mar 18 2013 /bin/adduser -> /bin/tinylogin
root@beaglebone:~# useradd [username]
root@beaglebone:~# passwd [username]
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
一方、useraddは単体のプログラムです。
root@beaglebone:~# which useradd
/usr/sbin/useradd
root@beaglebone:~# ls -l /usr/sbin/useradd
-rwxr-xr-x 1 root root 68780 May 20 2013 /usr/sbin/useradd
suコマンドが使えます。
root@beaglebone:/# su kinneko
kinneko@beaglebone:/$ su
Password:
root@beaglebone:/#
しかし、これもまた危険を伴うので、sudoを入れておいたほうがいいかもしれません。
root@beaglebone:/# opkg install sudo
root@beaglebone:/# vi /etc/sudoers
##
## User privilege specification
##
root ALL=(ALL) ALL
[username] ALL=(ALL) ALL
SSHの設定ファイルは以下にあります。rootでログインできないようにしておきましょう。
ExecStartのdropbear起動オプションに"-w"を追記して再起動します。
root@beaglebone:/# vi /lib/systemd/system/[email protected]
ExecStart=-/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -w -p 22
root@beaglebone:/# /etc/init.d/dropbear restart
デフォルトでは、"beaglebone"に設定されています。複数の端末を扱う場合などでは、ホスト名を変更しておくとよいでしょう。
root@beaglebone:/# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.0.1 beaglebone
システムを終了する場合は、必ずシャットダウンを行ってください。
いきなり電源を切ったりすると、ファイルシステムが破損して起動できなくなることもありますので、注意が必要です。
root@beaglebone:/# shutdown –h now
リブートもできます。
root@beaglebone:/# shutdown –r now
rebootコマンドも使えます。
ネットワーク設定は、ConnMan (Connection Manager)で管理されています。
ConnManは、IntelとNokiaの支援でオープンソース開発されている、組み込みのLinuxシステム向けに開発されたインターネットコネクションの管理デーモンです。なるべく少ないリソースで動作するように設計されており、モジュールシステムによって機能を拡張でき、プラグインを介して有線または無線を問わずにすべての通信をサポートしています。
現在のインターフェイスの設定は/var/lib/connman/以下で見ることができます。
root@beaglebone:/# cat /var/lib/connman/ethernet_9059af4a6608_cable/settings
[ethernet_9059af4a6608_cable]
Name=Wired
AutoConnect=true
Modified=2000-01-01T00:00:17.236506Z
IPv4.method=dhcp
IPv4.DHCP.LastAddress=192.168.0.9
IPv6.method=auto
IPv6.privacy=disabled
設定はD-BUSを経由して行いますが、制御用のコマンドは/usr/lib/connman/test/以下に置かれています。
root@beaglebone:/# ls /usr/lib/connman/test/
backtrace monitor-connman simple-agent
connect-vpn monitor-services test-clock
disable-tethering service-move-before test-compat
disconnect-vpn set-domains test-connman
enable-tethering set-global-timeservers test-counter
get-global-timeservers set-ipv4-method test-manager
get-proxy-autoconfig set-ipv6-method test-new-supplicant
get-services set-nameservers test-session
get-state set-proxy test-supplicant
list-services show-introspection
現在の状態を取得するには、get-servicesコマンドを使います。
root@beaglebone:/# /usr/lib/connman/test/get-services
[ /net/connman/service/ethernet_9059af4a6608_cable ]
IPv6.Configuration = { Method=auto Privacy=disabled }
AutoConnect = true
Name = Wired
Nameservers = [ 192.168.0.1 ]
Provider = { }
Favorite = true
Domains.Configuration = [ ]
Timeservers.Configuration = dbus.Array([], signature=dbus.Signature('s'), variant_level=1)
State = online
Proxy = { Method=direct }
Nameservers.Configuration = [ ]
IPv4 = { Netmask=255.255.255.0 Gateway=192.168.0.1 Method=dhcp Address=192.168.0.9 }
Timeservers = dbus.Array([dbus.String(u'192.168.0.1')], signature=dbus.Signature('s'), variant_level=1)
IPv6 = { }
Domains = [ ]
Ethernet = { Interface=eth0 MTU=1500 Method=auto Address=90:59:AF:4A:66:08 }
Security = [ ]
Proxy.Configuration = { }
Type = ethernet
Immutable = false
IPv4.Configuration = { Method=dhcp }
DNSの設定をやってみます。"ethernet_9059af4a6608_cable"の部分は、デバイス毎に異なります。
root@beaglebone:/# /usr/lib/connman/test/set-nameservers
Usage: /usr/lib/connman/test/set-nameservers <service> [nameserver*]
root@beaglebone:/# /usr/lib/connman/test/set-nameservers ethernet_9059af4a6608_cable 8.8.8.8 8.8.4.4
Setting nameserver to ['8.8.8.8', '8.8.4.4']
固定IPアドレスの設定には、set-ipv4-methodコマンドを使います。
root@beaglebone:/# /usr/lib/connman/test/set-ipv4-method
Usage: /usr/lib/connman/test/set-ipv4-method <service> [off|dhcp|manual <address> [netmask] [gateway]]
root@beaglebone:/# /usr/lib/connman/test/set-ipv4-method ethernet_9059af4a6608_cable manual 192.168.1.100 255.255.255.0 192.168.1.1
Setting method manual for ethernet_9059af4a6608_cable
あまり直感的ではないですね。
タイムゾーン用のファイルは、パッケージとしてインストールされているようです。
root@beaglebone:/# opkg list | grep tzdata
tzdata - 2012d-r3.0
東京に設定します。
root@beaglebone:/# rm /etc/localtime
root@beaglebone:/# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
再起動後に反映されます。
BeagleBone BlackのカレンダーICは、電池でバックアップされていないので、起動するとタイマーは2000年01月01日の零時からカウントされます。そのため、ネットワークを使った時刻同期が必要です。
cronでは、ntpdate-syncを使った時刻同期が設定されています。
root@beaglebone:/# crontab -l
30 * * * * /usr/bin/ntpdate-sync silent
ntpdate-syncは、"/etc/default/ntpdate"を参照して、時刻同期サーバーを決めていますが、設定ファイルには、何も書かれていません。
root@beaglebone:/# cat /etc/default/ntpdate
# Configuration script used by ntpdate-sync script
NTPSERVERS=""
# Set to "yes" to write time to hardware clock on success
UPDATE_HWCLOCK="no"
pool.ntp.orgなど、使用可能なNTPサーバーを指定しておきます。
root@beaglebone:/# date
Sat Jan 1 02:59:41 JST 2000
root@beaglebone:/# /usr/bin/ntpdate-sync
root@beaglebone:/# date
Wed Oct 30 15:45:46 JST 2013
時刻同期が実行されました。