ふと、Nano Pi K2 に Ubuntu を入れて .NET Core を使ってあれこれしようと思ったのですが、何やらこの OS がちょっと Ubuntu とは違う。Raspberry Pi に Ubuntu Mate を入れたときと挙動がちがう。そもそも CPU は同じ Cortex-A53 なのだから、GPIO まわりが違うとはいえ、Hello world 位は動くのではないか?
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_K2#UbuntuCore
と思って、何の OS だか再確認すると「UbuntuCore」と書いてあります。これは、普通の Ubuntu とはどう違うのか?ってのが発端です。
そもそも Nano Pi K2 って何?
Friendly ARM で購入できるラズパイ互換機です。Nano Pi にはいくつか種類があって、メモリや USB の数などで選ぶわけですが、Nano Pi K2 は、Android が動作して歌マクロスを動かすために購入しました。Raspberry Pi 3 よりも安く購入ができます。ちなみに、このボードでは歌マクロスは動きませんでした orz どうやら、タッチパネルが必須みたいですね。ただし、マギレコは動きます。これは後日。
現在のところ動作できる OS は、Android 5.1 と Ubuntu Core だけです。Raspbian のような Debian 系はありません。購入時には、赤外線のコントローラーとケースが付属しているので、Android を入れると Fire TV のように動作できます。というか、その目的で売っているみたいですね。これも後日。
Ubuntu Core とは何か
そういえば、Docker を勉強した頃に、CentOS の Atomic というのがあって、Docker 専用のコンテナ OS でした、ってのをやっと思い出しました。
コンテナホスト向けOS環境「CentOS Atomic Host」や「Snappy Ubuntu Core」を試す – さくらのナレッジ
http://knowledge.sakura.ad.jp/knowledge/4217/
元の OS に apt-get やらで色々インストールすると環境が汚れるので、Docker を入れて動かします。Docker のコンテナとしての機能しか要らないので、機能が相当削ってあり vi すら動かない状態だった、とかなんとか。そんな訳で、素の状態の OS として使う訳ではありません。
当時、Raspberry Pi でも Docker が動かないかとかいう話があったのですが、当時のラズパイは、まだ 32bit で、Docker を動かすには 64bit CPU が必須だったという状態だった、というのを覚えています。
で、現在のラズパイ3は、64bit なので、Docker が動きます。なので、それのコンテナ用としての Ubuntu Core も動作する、という状況な訳ですね。www.raspberrypi.org でも「Snappy Ubuntu Core」と言う形でダウンロードできます。これをクリックすると、Ubuntu developer の https://developer.ubuntu.com/core/get-started/raspberry-pi-2-3 にジャンプするので、「Ubuntu Core」のことです。
さて、Ubuntu Core が動作する環境は、 https://developer.ubuntu.com/core/get-started で見れるわけですが、ここには Intel x86/64 系や Mac はありません。通常の PC で試したい場合は、KVM 版の仮想環境で動くものを使います。
となると、CentOS の Atomic のように複数の Docker を載せて動かすというよりも、Ubuntu mate よりもメモリが少ない環境/ストレージが少ない環境の組み込み用 Linux として動作させる、という形にシフトしたようです。2016年頃の記事を見ると「snappy ubuntu core」としてラズパイ上で docker を動かす記事が多いのですが、先のダウンロード先が Ubuntu core になっていることから内部構成が変わっています。そもそも、snappy と言うコマンドが無くなって、snap というコマンドに変わっています。
目的も Docker のコンテナとしてではなく(snap find docker で見つかるので、インストールはできる模様)、小メモリで IoT 機器が扱えるというスタイルみたいですね。
Ubuntu Core をインストール
まずは、Raspberry Pi 3 にインストールします。Raspberry Pi 2 でも CPU が 64ビット版であればインストールできます。
Raspberry Pi 2 or 3 | Developer
https://developer.ubuntu.com/core/get-started/raspberry-pi-2-3
普通の Raspbian と同じように micro SD に焼き込みます。色々な機能は削られているみたいで、8GB 以下でも大丈夫な感じです。限られた処理しか使わないのであれば、安価な 8GB を大量に買って入れ込むということもできそうですね。16GB はまだそこそこ高いので。
ひとつ気を付けなければいけないのは、Ubuntu Core に対して SSH するためには「Ubuntu SSO account」を取得して、そのアカウントでログインする必要があります。どうやら、組み込み機器へのインストールを制御するために Ubuntu SSO を使うらしいのですが、
- Ubuntu Core の初回起動時に Ubuntu SSO のアカウントを入力する必要がある。
- つまり、モニタとキーボードが必須
- Ubuntu SSO に繋がるために、外部接続が必須になる。
- Ubuntu Core に SSH するときにRSA公開鍵/秘密鍵が必要になる。
- これが結構ハマる。ラズパイの英語フォーラムでもハマったまま解決していなかったり。
- 公開鍵使って SSH している人には当たり前のことなのか?
という制限があります。
Ubuntu Core を起動して、Ubuntu SSO に登録したメールアドレスを入れると、以下のようなアカウントで Ubuntu Core にアクセスできるようになります。私の場合は moonmile というアカウントを取りました。おそらく、早い者勝ちですね。
Ubuntu Core は、この写真で分かるように単純なコンソール環境…と言いますか、コンソール環境ですらないです。外部から SSH で繋げてあれこれややるしかありません。WinSCP は繋げたのでファイルのアップロードなどはできます。
Raspberry Pi からだと。
のようにして SSH で接続できます。このときに、public/private key が必要になります。
SSH/OpenSSH/Keys – Community Help Wiki
https://help.ubuntu.com/community/SSH/OpenSSH/Keys
を見て、ssh-keygen -t rsa で作ります。ラズパイの場合、デフォルトで .ssh フォルダができているのですが、.ssh/id_rsa のパーミッションを chmod 600 id_ras で変えておく必要があります。ここがデフォルトの 644 のままだと、何故か ssh で繋げるときにエラーになって不明な状態に陥ります。
.ssh/id_rsa.pub の内容を、Ubuntu SSO の SSH Keys に貼り付けて、登録しておきます。初回 SSH するときには、秘密鍵のパスフレーズが必要になるので、忘れないでください。その後は、Ubuntu SSO のパスワードと混乱しそうですが、RSA公開鍵を使ってアクセスをするので、自分の秘密鍵のパスフレーズが必要、という訳です。
そうすると、無事 Raspberry Pi から(通常の Linux でも同じです)Ubuntu Core にログインできます。
Tera Term でログインする
では、Windows の環境から Tera Term を使って Ubuntu Core にログインしてみましょう。Raspberry Pi 上の .ssh/id_rsa と .ssh/id_rsa.pub を Windows 上の何処かにコピーします。github などで既に、id_rsa を作っている場合は、それを使ってもよいでしょう。
SSH 認証で、「RSA~鍵を使う」を選択して、id_rsa ファイルを指定します。ユーザー名には、Ubuntu SSO のログイン名を入れ、パスフレーズは、id_rsa のパスフレーズを入れます。ややこしいですね。
うまくつながると、↓のようにログインができます。
WinSCP でファイル転送する
Windows からファイル転送ができるように WinSCP の設定もしておきます。
転送プロトコルで「SCP」を選択して、ユーザー名に Ubuntu SSO のアカウント名を入れます。
設定ボタンをクリックして、SSH → 認証で、秘密鍵を指定します。
秘密キーのパスフレーズは、接続時に要求されるので入力します。このパスフレーズは保存できないようです。
うまくつながると、下記のようにファイル転送が SSH 経由できるようになります。
ホスト名の変更と avahi-daemon のインストール
ubuntu core のホスト名は、初期値が localhost になっているので、これを変更します。ホスト名を「raspicore」にするときは、以下のように実行。
sudo hostnamectl set-hostname raspicore
あと、windows からホスト名 raspicore.local でアクセスできるように avahi-daemon も入れておきます。
snap install avahi
でインストールができます。
インストールしたパッケージは snap list で確認ができます。
snap 自体は、Unbutu mata でも使えるので、このあたりは普通に使えるのかなと。snapcraft で自前のパッケージも作れます。
と言う訳で Raspberry Pi 上で ubuntu core が動き出したので、お次は GPIO 廻りをどう弄るのか?を調べていきましょう。