Ubuntu Weekly Recipe

第69回GW特別企画・電源プラグ型コンピューターSheevaPlugの使い方(1):基礎編

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の正体は、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]⁠。

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全体をデータ領域として使うことはできません。

セットアップ

SheevaPlug Dev Kitの内容物を簡単に紹介しておきましょう。SheevaPlugを注文すると、外装の段ボール箱に包まれた状態で、図2のようなパッケージが届きます。サイズは「分厚いCDアルバム」程度です。

図2 SheevaPlug Dev Kitのパッケージ
図2 SheevaPlug Dev Kitのパッケージ

パッケージを開けると図3のような形で、メガネ電源ケーブル・USBケーブル(JTAG-UART接続用⁠⁠・イーサネットケーブルが入っています。

紙でできた仕切りを持ち上げた状態が図4です。赤いエアクッションに包まれているのがSheevaPlugの本体です。

図3(左) SheevaPlug Dev Kit付属品、
図4(右) SheevaPlug Dev Kitの中身

図3 SheevaPlug Dev Kit付属品 図4 SheevaPlug Dev Kitの中身

図5図6図7は、電源プラグ・イーサネットポート&USB2.0ポート・USB-UART&SDIOポートを正面にして撮影したものです。

図5(左) 電源プラグ、
図6(中央) イーサネットポート&USB2.0ポート、
図7(右) USB-UART&SDIOポート

図5 電源プラグ 図6 イーサネットポート&USB2.0ポート 図7 USB-UART&SDIOポート

なお、SDIOポートは基本的にはJTAGまわりの操作をする際に用いるもので、SDカードを挿すと半分以上はみ出しますし、通常の利用は行えません。

インストール環境の準備

SheevaPlugには、デフォルトではOSがインストールされていません。このため、⁠母艦」としてLinuxマシンを準備し、次のような手順を追ってOSをNANDフラッシュにインストールする必要があります。

  1. UARTへ接続し、uBootを操作できる状態にする
  2. 「母艦」にtftp・NFSサーバーを準備する
  3. NFS Rootのためのファイルシステムの展開
  4. NFS RootによるBoot
  5. 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のロゴ
図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領域にデータを書き込む準備ができます。セットアップのための環境が整ったところで、次週へ続きます。

おすすめ記事

記事・ニュース一覧