Ubuntu Weekly Recipe

第70回GW特別企画・電源プラグ型コンピューターSheevaPlugの使い方(2):インストール編

先週に引き続き、$99の超小型コンピューター、SheevaPlugの使い方を見ていきましょう。今週紹介する作業を終えると、⁠sshでログインして日常的に利用できる」状態になります。

Ubuntuファイルシステムのインストール

SheevaPlugでUbuntuを利用するには、Ubuntuの普通のインストール方法とは異なる手法でインストールを行う必要があります。具体的には、⁠前回紹介したNFS Root環境を用いて、NANDに直接JFFS2形式のディスクイメージを書き込む」という手順を踏みます[1]⁠。

NFS Rootでの起動

前回の手順でNFS Root環境をセットアップし、uBootに「boot」コマンドを投入すると、以下のような形でrootプロンプトを得ることができるはずです[2]⁠。

Marvell>> boot
Using egiga0 device
TFTP from server 192.168.254.20; our IP address is 192.168.254.21
Filename 'uImage.sheeva.040309'.
Load address: 0x2000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###############
done
Bytes transferred = 2070316 (1f972c hex)
## Booting image at 02000000 ...
   Image Name:   Linux-2.6.22.18
   Created:      2009-04-04   1:49:44 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2070252 Bytes =  2 MB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
OK

Starting kernel ...

Uncompressing Linux.................................................................................................................................. done, booting the kernel.
Linux version 2.6.22.18 (root@localhost.localdomain) (gcc version 4.2.0 20070413 (prerelease)) #1 Fri Apr 3 18:49:38 PDT 2009
CPU: ARM926EJ-S [56251311] revision 1 (ARMv5TE), cr=00053177
Machine: Feroceon-KW
Using UBoot passing parameters structure
Memory policy: ECC disabled, Data cache writeback
(snip)
NFTL driver: nftlcore.c $Revision: 1.98 $, nftlmount.c $Revision: 1.41 $
NAND device: Manufacturer ID: 0xad, Chip ID: 0xdc (Hynix NAND 512MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 7 at 0x000e0000
Bad eraseblock 19 at 0x00260000
Bad eraseblock 94 at 0x00bc0000
Bad eraseblock 235 at 0x01d60000
Bad eraseblock 291 at 0x02460000
Bad eraseblock 317 at 0x027a0000
Bad eraseblock 323 at 0x02860000
Bad eraseblock 431 at 0x035e0000
Bad eraseblock 992 at 0x07c00000
Bad eraseblock 1798 at 0x0e0c0000
mtd: bad character after partition (r)
3 cmdlinepart partitions found on MTD device nand_mtd
Using command line partition definition
Creating 3 MTD partitions on "nand_mtd":
0x00000000-0x00100000 : "u-boot"
0x00100000-0x00500000 : "uImage"
0x00500000-0x1fd00000 : "rootfs"
ehci_marvell ehci_marvell.70059: Marvell Orion EHCI
ehci_marvell ehci_marvell.70059: new USB bus registered, assigned bus number 1
ehci_marvell ehci_marvell.70059: irq 19, io base 0xf1050100
ehci_marvell ehci_marvell.70059: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
USB Universal Host Controller Interface driver v3.0
usb 1-1: new high speed USB device using ehci_marvell and address 2
usb 1-1: configuration #1 chosen from 1 choice
usbcore: registered new interface driver usblp
drivers/usb/class/usblp.c: v0.13: USB Printer Device Class driver
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
mice: PS/2 mouse device common for all mice
i2c /dev entries driver
Linux telephony interface: v1.00
Marvell Telephony Driver:
mvBoardVoiceAssembleModeGet: TDM not supported(boardId=0x9)
assembly=-1,irq=-1
mp_check_config: Error, invalid voice assembley mode
(snip)
Advanced Linux Sound Architecture Driver Version 1.0.14 (Thu May 31 09:03:25 2007 UTC).
mvCLAudioCodecRegGet: Error while reading register!
mvCLAudioCodecInit: Error - Invalid Cirrus Logic chip/rev ID!
Error - Cannot initialize audio decoder.at address =0xff<6>ALSA device list:
  #0: Marvell mv88fx_snd ALSA driver
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
eth0: link down
eth0: started
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
      device=eth0, addr=192.168.254.21, mask=255.255.255.0, gw=255.255.255.255,
     host=DB88FXX81, domain=, nis-domain=(none),
     bootserver=192.168.254.20, rootserver=192.168.254.20, rootpath=
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
Looking up port of RPC 100003/2 on 192.168.254.20
eth0: link up, full duplex, speed 1 Gbps
scsi 0:0:0:0: Direct-Access     Generic  USB  SD Reader   1.00 PQ: 0 ANSI: 0 CCS
sd 0:0:0:0: [sda] 15659008 512-byte hardware sectors (8017 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 15659008 512-byte hardware sectors (8017 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
 sda: sda1 sda2
sd 0:0:0:0: [sda] Attached SCSI removable disk
sd 0:0:0:0: Attached scsi generic sg0 type 0
Looking up port of RPC 100005/1 on 192.168.254.20
VFS: Mounted root (nfs filesystem).
Freeing init memory: 124K
init started: BusyBox v1.7.0 (2008-02-26 19:25:17 IST)
starting pid 297, tty '': '/etc/init.d/rcS'
starting pid 299, tty '': '/bin/sh'
-sh-3.2#

Ubuntu(ubuntu-9.0.5.Release.jffs2)の書き込み

前回設定したNFSサーバー上に、uImageファイルとルートファイルシステムを配置します。以下は「母艦」側で行う操作です。

まずuImageから準備しましょう。uImageファイルはtftpからのブートに用いたものと同じもの(uImage.sheeva.040309)を用います。コマンドの実行例は、前回同様にNFS領域として「/extra/sheevaplug」を利用していることを仮定しています[3]⁠。

$ sudo cp /var/lib/tftpboot/uImage.sheeva.040309 /extra/sheevaplug/rootfsv1.0/

次にルートファイルシステムです。SheevaPlug Software & Design Informationにある「File System」アーカイブをダウンロードしてください。展開すると、ルートファイルシステムのイメージファイル「ubuntu-9.0.5.Release.jffs2」が得られますので、これもNFS Root上に配置します。

$ unzip SheevaPlug_Filesystem.zip
$ cd SheevaPlug_Filesystem/
$ sudo cp ubuntu-9.0.5.Release.jffs2 /extra/sheevaplug/rootfsv1.0/

母艦側でここまでの操作が完了したら、SheevaPlugのプロンプトで以下の操作を行います。

まず、uImageファイルとJFFS2ファイルが存在することを確認し、⁠No such file or directory」などといった表示が出ないことを確認してください。

# ls /uImage.sheeva.040309 && echo OK
# ls /ubuntu-9.0.5.Release.jffs2 && echo OK

ファイルの存在が確認できたら、次の操作でmtdデバイスの一覧を確認します。mtd0・mtd1・mtd2の3つの領域に分かれいて、mtd1がuImage、mtd2がrootfsとなっているはずです。

# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00100000 00020000 "u-boot"
mtd1: 00400000 00020000 "uImage"
mtd2: 1f800000 00020000 "rootfs"

確認が済んだら、まずflash_eraseallコマンドでNANDフラッシュの初期化を行ってから、uImageとルートファイルシステムを書き込みます。

  • uImageの書き込み
    # cd /
    # /usr/sbin/flash_eraseall -j /dev/mtd1
    # /usr/sbin/nandwrite -p /dev/mtd1 /uImage.sheeva.040309
  • ルートファイルシステムの書き込み
    # /usr/sbin/flash_eraseall -j /dev/mtd2
    # /usr/sbin/nandwrite /dev/mtd2 /ubuntu-9.0.5.Release.jffs2

さらに、ルートファイルシステムが正しく書き込めたかどうか確認してみましょう。マウントポイントとして/mnt1を作成し、そこに先ほど書き込んだ/dev/mtd2をマウントしてみます。JFFS2はマウント時にファイルシステム全体を走査するため、10~20秒程度の待ち時間があるはずです。

# mkdir /mnt1
# mount -t jffs2 /dev/mtdblock2 /mnt1

問題なくマウントできることを確認したら、この領域をアンマウントし、NFS Root環境を終了します。これでNAND領域へのUbuntuのインストールは完了です。

# umount /mnt1
# reboot

NANDからのブート

ここまででNAND領域にカーネル(uImage)とルートファイルシステムを導入できたので、あとはNANDからの起動を行うだけです。……ですが、その前に、uBootのアップデートを行っておきましょう。

uBootのアップデート

SheevaPlugのNANDに格納されたuBootは、本体の出荷時期によっていくつかのバージョンがあるようです。最新版は4月9日版で、uBootの起動時に以下のような出力が得られるものです。これ以外に、4月2日版・3月19日版が存在するようです。これらの古いuBootにはいくつかの問題がありますので、お使いのものが該当する場合はアップデートを行ってください[4]⁠。

U-Boot 1.1.4 (Apr  9 2009 - 12:23:12) Marvell version: 3.4.16

アップデートのために、まず「U-Boot」アーカイブをダウンロードして、母艦のtftp領域に「u-boot-rd88f6281Sheevaplug_400db_nand.bin」を配置します。

$ unzip SheevaPlug_U-Boot.zip
$ cd SheevaPlug_U-Boot/U-Boot\ -\ Image/
$ sudo cp u-boot-rd88f6281Sheevaplug_400db_nand.bin /var/lib/tftpboot/

NFS Rootから起動するように設定したSheevaPlug[5]のuBoot上で、以下のコマンドを実行します。確認プロンプトが表示されますので「y」で答えてください。

Marvell>> bubt u-boot-rd88f6281Sheevaplug_400db_nand.bin

uBootがアップデートされると、直前に設定した各種変数の値(saveenvで保存した値)は失われます。新しいuBootが反映されるか確認するため、念のため一度筐体の電源を抜き、再起動しておいた方がよいでしょう。

NANDからの起動

Ubuntuのインストールが完了し、uBootのアップデートも完了したら、uBootに次のように入力し、NANDにあるuImageから起動するように指定します。

Marvell>> setenv bootcmd 'nand read.e 0x800000 0x100000 0x400000; bootm 0x800000'
Marvell>> setenv bootargs 'console=ttyS0,115200 mtdparts=nand_mtd:0x100000@0x000000(u-boot),0x400000@0x100000(uImage),0x1f800000@0x500000(rootfs)rw root=/dev/mtdblock2'
Marvell>> saveenv

あとは、⁠boot」を入力すれば、Ubuntuが起動するはずです[6]⁠。コンソールにログインプロンプトが表示されたら(起動しきるまでにそれなりの時間がかかりますので、じっくり待ってください⁠⁠、ユーザー名「root⁠⁠、パスワードに「nosoup4u」を入力することでログインできるはずです。

インストール後の初期設定

ここまでで(あるいは、ロットによっては出荷時から)Ubuntuのファイルシステムを導入し、正しくシステムが起動する状態になっています。この状態のSheevaPlugは、ほぼ通常のUbuntu Serverと同じ手順で扱える状態です。が、ルートファイルシステムとして利用できる容量が少ないことと、⁠開発者キットなので)設定がこなれていないことから、日常的な操作を行うにはさらに設定を行う必要があります。

ここからは、初期設定の手順を紹介します。

時計合わせ・タイムゾーンの設定

設定の最初に、時刻合わせを行いましょう。SheevaPlugの出荷時点では内蔵クロックに2009/01で始まる日付が投入されており、日付の再設定を行うまでは日時がズレたままになってしまうはずです[7]⁠。

時計合わせのための設定は、二段階に分けて行います。はじめに、uBoot側でdateコマンドを用い、RTCの日付を大まかに合わせます。

Marvell>> date 0501134309
Date: 2009-05-01 (Friday)    Time: 13:43:00
Marvell>> saveenc

dateコマンドのフォーマットは、⁠MMDDhhmmyy」です。たとえば、2009年5月2日 12:34であれば、⁠0502123409」となります。ただし、ここで設定する時刻は、UTCにしておく方が無難です。日本時間から9時間引いた値をセットしてください。実際の時間が2009年5月2日 12:34ならUTCでは03:34ですので、セットすべきは「0502033409」です。ここでセットする時刻は、⁠大まかなもの」⁠日常生活で支障のない程度に「合っている」時計の時刻)で構いません。

この状態でSheevaPlugをブートし、Ubuntu上でNTPパッケージを導入し、ntpqコマンドで動作を確認します。

# apt-get install ntp
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*europium.canoni 193.79.237.14    2 u  560 1024  377  254.328    4.202   4.745

これによりntpdが起動時に実行され、⁠きちんとした」時刻がセットされるようになります。ただしこのままではUTCのまま(日本時間から9時間ずれたまま)ですので、以下のコマンドでタイムゾーンを日本にセットしてください。

# dpkg-reconfigure tzdata

Current default timezone: 'Asia/Tokyo'
Local time is now:      Sat May  9 01:27:34 JST 2009.
Universal Time is now:  Fri May  8 16:27:34 UTC 2009.

メニューが表示されますので、Asia => Tokyo と選択することで、タイムゾーンが日本にセットされます。例のように、⁠Current default timezone: 'Asia/Tokyo'」が出力されることを確認してください。

rootパスワードの変更

SheevaPlugのデフォルトファイルシステムのrootパスワードは、前述の通り「nosoup4u」です。このまま利用するのは問題ですので、パスワードを変更しておいてください。

# passwd

初期ユーザーの作成

デフォルトではrootユーザーしか存在しないので、adduserコマンドで新規にユーザーを作成してください。以下では「test」というユーザーを作成していますが、利用したいユーザー名に置き換えて実行してください。

# adduser test
Adding user `test' ...
Adding new group `test' (1000) ...
Adding new user `test' (1000) with group `test' ...
Creating home directory `/home/test' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: (ユーザーのパスワードを入力)
Retype new UNIX password: (ユーザーのパスワードを再入力) 
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 

また、このユーザーではsudoを実行できませんので、vigrコマンドで作成したユーザーを"sudo"ユーザーグループに追加し、さらにvisudoコマンドを実行し、sudoersファイルに「%sudo ALL=(ALL) ALL」を追加してください。これで追加したユーザーでsudoを利用できるはずです。

resolv.confの変更

SeehvaPlugのデフォルトでは、自身をDNSレゾルバとして利用するようになっています。これは効率が良くありませんので、お使いの環境のDNSサーバーを指定するように設定しておきましょう。/etc/resolv.confを編集し、⁠namaserver 192.168.254.1」などと指定してください。この例はDNSサーバーが192.168.254.1に存在することを仮定しています。

IPアドレスの変更

SheevaPlugは、デフォルトではDHCPクライアントとして設定されています。サーバー的に利用するにはこれも望ましいものではありませんので、固定IPアドレス設定を行いましょう。/etc/network/interfacesのうち、以下の部分がDHCPクライアントとしての設定です。

auto eth0
iface eth0 inet dhcp

たとえば以下のように設定します。この設定は、SheevaPlugのIPアドレスを192.168.254.20、デフォルトゲートウェイを192.168.254.1と仮定しています。

auto eth0
iface eth0 inet static
address 192.168.254.20
netmask 255.255.255.0
broadcast 192.168.254.255
gateway 192.168.254.1

ホスト名と/etc/hostsの変更

デフォルトでは、ホスト名が"debian"になっています。/etc/hostnameを修正し、別の名前にした方が混乱が少ないでしょう(少なくとも"ubuntu"にした方が安全でしょう⁠⁠。

また、デフォルトの/etc/hostsは、⁠自ホスト名が"debian"になっている」⁠ports.ubuntu.comが91.189.88.36に決め打ちされている」注7等、幾つかの問題があります。/etc/hostsでも自ホスト名を変更し、⁠91.189.88.36 ports.ubuntu.com」行はコメントアウトした方がよいでしょう。

ロケールの生成

SheevaPlug用のルートファイルシステムには、限られたパッケージしか導入されていません。また、ロケールも最小限しか設定されていません。ソフトウェアの利用上、問題になる可能性があるため、以下のようにしてja_JP.UTF-8ロケールを生成しておく方がよいでしょう。

sudo /bin/sh -c 'echo 'LANG="ja_JP.UTF-8"' > /etc/default/locale'
sudo locale-gen "ja_JP.UTF-8"

おすすめ記事

記事・ニュース一覧