Ubuntu Weekly Recipeゴールデンウィーク特別編のラストとして、Topicsでの予告 の通り、Ubuntuを搭載する、$99の『電源プラグ型』コンピューター“ Marvell SheevaPlug” の使い方をお届けします。
なお、最後に「次回へ続く」などと書いてあります。
……えー、その……。本来この原稿はゴールデンウィークのラストにお送りする予定だったはずなのですが、あまりにも分量が増えてしまったため、ゴールデンウィーク後にも続きます……。
はじめに
通常、Ubuntu Weekly Recipeでお届けするレシピは、「 デスクトップユーザーの方が、容易に試してみることができること」というテーマのもとに、ある程度「わかりやすい」ものを中心にしています。
ですが、今回お届けする内容は、初心者の方がいきなり手を出した場合、かなりの確率で持て余すと思われます。もし興味を持ってSheevaPlugを注文される場合、「 簡単なものではない」ということを念頭に、充分な検討を行ってください。今回(と次回)でお届けする内容で、基本的な利用が可能な状態になりますが、そこまで辿り着くために、第47回で紹介したネットワークインストール や第40回で紹介したNFSサーバの設定 などの概念を理解することが必須です。tftpブートやNFSの扱い方をはじめ、「 自分でどうするか決める」要素が非常に強く、とりあえずインストール、といった扱い方はできないものと考えてください。
一方、「 変わったものに触ってみたい」「 24時間稼働できる、消費電力の少ないマシンが欲しい」「 ベータ版大好き」「 PCに飽きた」「 GUIなんてリソースの無駄使いでしょ 」といった方には、SheevaPlugは全力でお勧めできるマシンです。
SheevaPlugの位置づけ
SheevaPlug [1] は、Marvell社が推進する、「 電源プラグに、ACアダプタのように差し込んで使う」という想定で開発された新しいフォームファクタ“ PlugComputing ” のひとつしてリリースされたハードウェアです。その想定の通り、大きめのACアダプタ程度(おおむね、「 小振りの豆腐」程度)のサイズで、ACコンセントに差し込んだままでもそれほど邪魔にならなりません[2] 。また、特徴の一つは価格が安いことで、1台につき$99しかしません。24時間動作可能な組み込み機器としては破格の値段と言えます。
“PlugComputing” の核にあたる考え方は、「 常時電源をOnにしたままで」「 邪魔にならない」「 家電的ホームサーバー」です。現在のSheevaPlugは電源が内蔵されているため、前述の通りの大きめのACアダプタサイズなので、邪魔にならないとまでは言えません。サイズを把握するために、以下の図1 を見てください。図1 は、SheevaPlugとCD-Rを並べて撮影したものです。長辺がCD-Rの直径ほど、短辺はその1/2程度の直方体です。このユニットの厚みの半分は、AC-DC電源回路(AC100V=>DC5V)のようです[3] 。
図1 SheevaPlugのサイズ
[1] 厳密には、ここで「SheevaPlug」と呼んでいるものは、「 SheevaPlug Development Kit」です。「 SheevaPlug」という製品シリーズの中の、開発者向けキットが「SheevaPlug Development Kit」で、通常の製品にあたる「SheevaPlug(無印) 」とでもいうべきものはまだ量産されていません。
SheevaPlugの正体は、MarvellのSoC“ Kirkwood(88F6281)” に512MBのDDR2メモリと、512MBのNANDフラッシュを追加し、I/Oを追加してコンピューターとして機能するように仕上げたものです。外部接続用のインターフェースとして、Gigabit Ethernetを1系統、USB2.0を1系統、そしてSDIOスロットを1系統と、USB-JTAG(JTAG-UART)を持っています[4] 。いわゆるEVB(Evaluation Board)にあたりますが、“ Kirkwood” の動作クロックが1.2GHzであることに加え、I/O周りもこの種の組み込み機器としては非常に贅沢なスペックを備えています[5] 。なお、“ Kirkwood” を含む88F6000番台SoCのシリーズ名が「Shiva」ですので、なんとなくこのあたりから命名されたように思われます[6] 。
“SheevaPlug Development Kit” は「アプライアンスを作って販売するための開発者キット」という位置づけの製品です。このため本体側面にUSB miniB形状のJTAG-UARTが備えられており、ここから各種初期設定やuBoot(後述)の設定などを行うことができます。SheevaPlugを利用したアプライアンスとして、すでに“ PogoPlug ” という製品がリリースされています。これは「自宅でこれにUSB HDDをつないで置くと、外出先その他から自由に利用できる」というものです。
そして、このSheevaPlugの初期OSとして用意されているOSイメージは、Ubuntu 9.04をベースにしたLinuxです。最小構成にSamba・OpenSSHなどのサーバーを追加したもので、100MBほどしかありませんが、高性能なCPUと512MBのメインメモリにより、「 SSHでログインして利用するサーバー」としては充分な性能を持っています[7] 。
[4] 88F6281はPCI-e x1にSATA、さらにオーディオ入出力に加えてGigabit EthernetのMACを2系統持っているようなのですが、有効になっている(=PHYに接続されている)GbEは1系統だけです。そもそもPHYにあたる88E1116Rが1個しか搭載されていませんし、基板上には搭載できるだけのパターンも用意されていません。残りのI/O系は、なんとなくピンだけは用意されているように見えなくもありませんが、( 表面に出ている配線を含む)公開情報を追いかけた範囲では確定に至っていません。
SheevaPlug(Plug Computer)とPCの違い
“SheevaPlug” を使う上では、PCとの違いを幾つか意識しなくてはいけません。実際に触りながら(+Marvell社が用意しているドキュメント を読んで)把握していくべきですが、ここでは最低限、「 これまでPCだけを触ってきた人」が戸惑わない程度の情報をまとめておきます。
おそらく、この項目のほとんどは、この場では把握しきれない事柄です。一度セットアップを完了してから読み直すのが良いと思われます。
CPUがARM
SheevaPlugのCPUはARM(いわゆるARMEL扱い)ですので、x86のバイナリを動作させることはできません。言い換えれば、バイナリだけが提供されるソフトウェア、たとえばAdobe ReaderやSkypeなどは、ベンダーからARM用バイナリが提供されない限り利用できません。
ソースもセットで提供されるソフトウェア、つまり「フリーソフトウェア」については、x86環境と同じように利用することができます。aptなどのインターフェースでパッケージをダウンロードしてインストールすることも可能です。
「BIOS画面」の違い
SheevaPlugには、x86プロセッサでお馴染みの「BIOS画面」はありません。x86マシンでは最低限のブートデバイスの選択などをBIOS上で行いますが、SheevaPlugではuBoot を用います(起動画面では「Marvell uBoot」と表示されますが、中身はDas U-Boot そのものです。ここでは「uBoot」と表記しますが、一般的には「U-Boot」とするのが普通でしょう) 。
uBootは厳密にはBIOSとしてだけではなく、LILOやGRUBなどと同じブートローダとしての役割も果たしますので、直接「置き換え」と認識するのは望ましくありませんが、ごく普通にSheevaPlugを使う上では、「 CLI(Command Line Interface)で操作を行う、BIOSとGRUBを足したものもの」と思っておけば良いでしょう。
カーネルの置き場所
x86マシンでは/bootにカーネルのinitrdイメージを配置し、GRUBなどのブートローダからこれらをキックして起動しますが、uBootを採用したコンピューターでは、フラッシュメモリ上にuImage用の領域を確保し、そこに起動用イメージを配置して、uBootからuImageの格納されたアドレスを指定して起動します。これも一般的なx86コンピューターとは異なる箇所です。
ブート指定が独特
前述の通り、uBootにuImageのアドレスを与え、さらにカーネルオプションやフラッシュメモリの配置なども指定して起動パラメータとします。典型的な起動オプションは以下のようになります。
setenv bootcmd 'nand read.e 0x800000 0x100000 0x400000; bootm 0x800000'
setenv bootargs 'console=ttyS0,115200 mtdparts=nand_mtd:0x100000@0x000000(u-boot),0x400000@0x100000(uImage),0x1f800000@0x500000(rootfs)rw root=/dev/mtdblock2'
boot
以下のような、GRUBに与える形での典型的な起動オプションに比べると面食らうかもしれません。
kernel /boot/vmlinuz-2.6.24-12-generic root=UUID=1c54dac3-3197-4814-9e04-971753cade1c ro quiet splash locale=ja_JP
initrd /boot/initrd.img-2.6.24-12-generic
モニタ出力がない
SheevaPlugにはモニタ出力にあたるものがありません。このため、ディスプレイにつないで何かを表示させることは(標準では)できません。第66回で紹介したヘッドレス構成 (RS-232Cにカーネルのメッセージを出力し、コンソールも提供する設定)が必須となります。なお、配布されているUbuntuイメージではすでにこれらの設定は行われています。
内蔵ストレージがNANDフラッシュである
512MBの内蔵フラッシュが搭載されていますが、これらはNANDフラッシュが「生」の状態で提供されます。一般的なx86環境では、NANDフラッシュで構成されたデバイス(=SDカードやUSBメモリ、SSDなどなど)へアクセスする際はインテリジェントなコントローラ[8] を経由するので、「 生」の状態のNANDフラッシュにアクセスする必要が生じることはありません。ですが、SheevaPlugではあくまで「生」のまま与えられるため、普通のストレージ領域として考えることはできません 。
/dev/mtd2や/dev/mtdblock2などといったデバイスノード[9] 経由でNANDフラッシュへアクセスすることは可能ですが、これらの領域ではext3やext4、FAT32などのファイルシステムは使えません 。JFFS2やUBIFSなどの、NANDフラッシュで使うために設計されたファイルシステムを使います。
また、NANDフラッシュにはuBootやuImageも格納されるため、512MB全体をデータ領域として使うことはできません。
[8] 一般的なNANDフラッシュは、「 出荷時点で一定率の不良アドレスを含んでいる」「 書き換え回数に上限があるため、繰り替えし同じアドレスにアクセスすると壊れる」という特性を持っています。NANDフラッシュの「インテリジェントな」コントローラは、こうした問題点をシステム側から意識せずに扱えるようにするため、「 不良アドレスが含まれる領域は利用しない(バッドブロックの管理) 」 「 同じ箇所を繰り替えし書き換えないようにする(ウェアレベリング) 」 「 NAND特有のアクセス特性を考慮し、書き込みを制御する」といった機能を備えています。このあたりのほとんどはドライバや専用のファイルシステムが行いますのでユーザーは意識する必要はありませんが、逆に言えば、専用のファイルシステム(本文で出てくるJFFS2やUBIFS)を使うことは必須です。
セットアップ
SheevaPlug Dev Kitの内容物を簡単に紹介しておきましょう。SheevaPlugを注文すると、外装の段ボール箱に包まれた状態で、図2 のようなパッケージが届きます。サイズは「分厚いCDアルバム」程度です。
図2 SheevaPlug Dev Kitのパッケージ
パッケージを開けると図3 のような形で、メガネ電源ケーブル・USBケーブル(JTAG-UART接続用) ・イーサネットケーブルが入っています。
紙でできた仕切りを持ち上げた状態が図4 です。赤いエアクッションに包まれているのがSheevaPlugの本体です。
図3(左) SheevaPlug Dev Kit付属品、
図4(右) SheevaPlug Dev Kitの中身
図5 ・図6 ・図7 は、電源プラグ・イーサネットポート&USB2.0ポート・USB-UART&SDIOポートを正面にして撮影したものです。
図5(左) 電源プラグ、
図6(中央) イーサネットポート&USB2.0ポート、
図7(右) USB-UART&SDIOポート
なお、SDIOポートは基本的にはJTAGまわりの操作をする際に用いるもので、SDカードを挿すと半分以上はみ出しますし、通常の利用は行えません。
インストール環境の準備
SheevaPlugには、デフォルトではOSがインストールされていません。このため、「 母艦」としてLinuxマシンを準備し、次のような手順を追ってOSをNANDフラッシュにインストールする必要があります。
UARTへ接続し、uBootを操作できる状態にする
「母艦」にtftp・NFSサーバーを準備する
NFS Rootのためのファイルシステムの展開
NFS RootによるBoot
NANDフラッシュへのOSイメージの書き込み
今回は1と2を説明します。なお、Ubuntu 9.04が動作するx86/x64マシンを「母艦」として利用することを想定しているため、他のバージョンやディストリビューションを利用している方は適宜パッケージ等を読み替えてください。基本的には、tftpとNFSサーバーを準備でき、FTDI社のUSB-Serialコンバータを利用できるLinuxマシンであれば問題なく設定が行えるはずです(やろうと思えばWindows上で動作するSFU/SUAなどでtftp・NFSサーバを設定して利用することも不可能ではないと思われますが、お勧めしません) 。
UARTの接続
まず最初に、UART(JTAGポート)へ接続し、uBootを操作できる環境を準備します。
SheevaPlugのマニュアル類には「Linuxマシンに加えてWindows PCを準備し、Windows PCに専用のドライバをインストールして利用する」( 注10 )といったことが書いてありますが、Linuxから接続することもできます。
SheevaPlugの側面にあるUSB MiniBのポートに、付属のUSBケーブル(黒いケーブル)を接続し、母艦のUSBポートと接続してください。
SheevaPlugのJTAGポートは、実際にはFTDIのUSB-Serialコンバータを流用して実装されています。Linuxからは単にUSB-Serialの一種として扱ってやれば良いのですが、USBのDeviceIDが既知のものと異なるため、ドライバがロードされません。そこで以下のように、ftdi_sioドライバにベンダID・プロダクトIDを指定してロードしてやります。
$ sudo modprobe ftdi_sio vendor=0x9e88 product=0x9e8f
これによりUARTデバイスがUSB-Serialポート(/dev/ttyUSB0, /dev/ttyUSB1)として見えるようになります。dmesgに以下のようなメッセージが出力されるはずです[11] 。
[40112.635911] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
[153784.308076] usb 4-1: new full speed USB device using ohci_hcd and address 9
[153784.538567] usb 4-1: configuration #1 chosen from 1 choice
[153784.540576] ftdi_sio 4-1:1.0: FTDI USB Serial Device converter detected
[153784.540612] usb 4-1: Detected FT2232C
[153784.540690] usb 4-1: FTDI USB Serial Device converter now attached to ttyUSB0
[153784.545341] ftdi_sio 4-1:1.1: FTDI USB Serial Device converter detected
[153784.545377] usb 4-1: Detected FT2232C
[153784.545430] usb 4-1: FTDI USB Serial Device converter now attached to ttyUSB1
通常のシリアルポートとして扱えるのは/dev/ttyUSB1の側です。次のようにscreenコマンドを実行して、このポートへ接続することでuBootコンソールにアクセスできるはずです。
$ screen /dev/ttyUSB1 115200
起動時には図8 のような形でMarvell uBootのロゴが表示され、「 Marvell>>」プロンプトが表示されているはずです。ここでコマンドを入力することで、uBootの設定を行えます。……が、uBootをさわる前に、まず母艦側の設定を行う必要があります。
図8 起動時に表示されるMarvell uBootのロゴ
tftpサーバーの準備
母艦側でtftpサーバーの設定を行います。以下のコマンドでtftpd-hpaパッケージをインストールします。
$ sudo apt-get install tftpd-hpa
設定ファイル/etc/default/tftpd-hpaをエディタで開き、「 RUN_DAEMON="no"」を、「 RUN_DAEMON="yes"」に修正した上で、tftpdを起動します。
$ sudo vi /etc/default/tftpd-hpa
$ sudo /etc/init.d/tftpd-hpa start
こうして準備したtftpサーバーには、SheevaPlugが利用するuImageファイルを配置します。SheevaPlug Software & Design Information - Revision 1.2 から、“ Linux Support Package (LSP)” をダウンロードし、展開します。アーカイブ内の「SheevaPlug_LSP/LSP - Image/」ディレクトリ以下に、uImage.sheeva.040309というファイルがあるはずです。これがuImageファイルです。
/var/lib/tftpboot以下にこのファイルを配置し、ファイルの所有権を(念のため)変更しておきます(以下ではuImageファイルがカレントディレクトリにあることを仮定しています。注意してください) 。
$ cp uImage.sheeva.040309 /var/lib/tftpboot
$ chown nobody:nogroup /var/lib/tftpboot/uImage.sheeva.040309
これでtftpサーバーの準備は完了です。ただし、これだけではSheevaPlugをブートできるだけで、SheevaPlugが用いる初期のルートファイルシステムが存在しません。続いてNFSサーバーの設定を行い、ルートファイルシステムを準備します。
NFSサーバーの準備
母艦側でNFSサーバーの設定を行います。以下のコマンドでNFSサーバーを準備してください。
$ sudo apt-get install nfs-kernel-server
設定ファイル/etc/exportsを編集し、SheevaPlugに割り付けるIPアドレスからのアクセスを許可しておきます。
以下の例では、SheevaPlug用に提供するNFS領域を"/extra/sheevaplug"、割り付けるIPアドレスを192.168.254.21と仮定しています。お使いの環境に合わせて変更が必要です。
/extra/sheevaplug 192.168.254.21(rw,sync,no_subtree_check,no_root_squash)
NFS用の領域を準備し、NFSサーバーを起動します。
$ sudo mkdir -p /extra/sheevaplug
$ sudo /etc/init.d/nfs-kernel-server stop
$ sudo /etc/init.d/nfs-kernel-server start
NFS Rootのためのファイルシステムの展開
前出のページから“ Host Software Support Package: Linux” をダウンロードし、展開しておきます。このアーカイブに含まれるrootfs.tar(LinuxHost/以下にあります)を、NFS領域に展開します。また、アーカイブを展開した上で、rootfs.tarをホームディレクトリ直下に移動させたことを仮定しています。
$ cd /extra/sheevaplug
$ sudo cp ~/rootfs.tar ./
$ sudo tar xfp rootfs.tar
ここまでの準備ができれば、いよいよ(やっと?)インストールのためのNFS Rootでのブートが行えるようになります。uBootコンソールに以下のように入力してみてください。「 母艦」のIPアドレスとして192.168.254.20を仮定していますので、異なるアドレスが振られている場合は、適宜書き換えてください。
set ipaddr 192.168.254.21
set serverip 192.168.254.20
set rootpath '/extra/sheevaplug/rootfsv1.0'
set image_name uImage.sheeva.040309
set console
set bootargs
saveenv
set console 'console=ttyS0,115200 mtdparts=nand_mtd:0x100000@0x000000(u-boot),0x400000@0x100000(uImage),0x1f800000@0x500000(rootfs)rw'
saveenv
set bootargs_root 'root=/dev/nfs rw'
set bootcmd 'tftpboot 0x2000000 $(image_name);setenv bootargs $(console) $(bootargs_root) nfsroot=$(serverip):$(rootpath) ip=$(ipaddr):$(serverip)$(bootargs_end); bootm 0x2000000'
saveenv
boot
こうすることで、SheevaPlugのNAND領域にデータを書き込む準備ができます。セットアップのための環境が整ったところで、次週へ続きます。