第16章 SDブートの活用

本章では、SDブートを行うためのブートディスクの作成方法や、ブートディスクにルートファイルシステムを構築する方法など、SDブートを活用するために必要な情報について説明します。SDブートとは、SDカードに保存されたブートローダーイメージを起動させることを示します。

開発時にSDブートを利用すると、以下のようなメリットがあります。

  • フラッシュメモリのブートローダーを復旧することができる

  • フラッシュメモリに収まらないサイズのソフトウェアを動作させることができる

  • SDカードを取り替えるだけでシステムイメージを変更することができる

[警告]

SDブートを行った場合でも、ブートローダーの設定(保守モードのsetenv/setboodeviceコマンドで設定する項目)についてはフラッシュメモリに保存されます。

SDカードに対する作業は、ATDEで行います。そのため、ATDEにSDカードを接続する必要があります。詳しくは「取り外し可能デバイスの使用」を参照してください。

ATDEにSDカードを接続すると、自動的に/media/ディレクトリにマウントされます。本章に記載されている手順を実行するためには、次のようにSDカードをアンマウントしておく必要があります。

[ATDE ~]$ mount
(省略)
/dev/sdb1 on /media/52E6-5897 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=cp437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks)
[ATDE ~]$ sudo umount /dev/sdb1
[ATDE ~]$ 

図16.1 自動マウントされたSDカードのアンマウント


本章で使用するブートローダーイメージファイルなどは、開発セット付属の DVD に収録されています。最新版のファイルは、"Armadillo サイト"でダウンロードすることができます。新機能の追加や不具合の修正などが行われているため、DVD に収録されているものよりも新しいバージョンがリリースされているかを確認して、最新バージョンのソースコードを利用することを推奨します。

16.1. ブートディスクの作成

ATDEでブートディスクを作成します。ブートディスクの作成に使用するファイルを次に示します。

表16.1 ブートディスクの作成に使用するファイル

ファイルファイル名
SDブート用ブートローダーイメージloader-armadillo840-mmcsd-[version].bin

SDカードにブートローダーイメージを配置する際、表16.2「ブートディスクの制約」に示す制約があります。本章に示す手順を実行した場合は問題になることはありませんが、独自のブートディスクを作成する場合は注意してください。

表16.2 ブートディスクの制約

項目制約
パーティション番号1
パーティションのシステムタイプ0xb(Win95 FAT32)
ファイルシステムFAT32
ブートローダーイメージファイル名sdboot.bin
ブートローダーイメージファイルの配置場所ルートディレクトリ直下

表16.3「ブートディスクの構成例」に示すブートディスクを作成する手順を、手順16.1「ブートディスクの作成例」に示します。

表16.3 ブートディスクの構成例

パーティション番号パーティションサイズファイルシステム説明
1128MByteFAT32SDブート用のブートローダーイメージを配置します。
2残り全てext3ルートファイルシステムを構築するためにext3ファイルシステムを構築しておきます。

手順16.1 ブートディスクの作成例

  1. SDブート用のブートローダーイメージファイルを取得します。

    [ATDE ~]$ ls
    loader-armadillo840-mmcsd-[version].bin
    [警告]

    フラッシュメモリ用のブートローダーイメージをSDカードに配置しても起動することができません。事前にファイル名を確認してください。ブートローダーイメージファイルには以下2種類があります。

    格納場所イメージファイル
    SDカードloader-armadillo840-mmcsd-[version].bin
    フラッシュメモリloader-armadillo840-nor-[version].bin
  2. SDカードに2つのプライマリパーティションを作成します。

    [ATDE ~]$ sudo fdisk /dev/sdb  1
    
    Command (m for help): o  2
    Building a new DOS disklabel with disk identifier 0x8cb9edcc.
    Changes will remain in memory only, until you decide to write them.
    After that, of course, the previous content won't be recoverable.
    
    Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
    
    Command (m for help): n  3
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p):   4
    Using default response p
    Partition number (1-4, default 1):   5
    Using default value 1
    First sector (2048-3862527, default 2048):   6
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-3862527, default 3862527): +128M  7
    
    Command (m for help): n  8
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p):   9
    Using default response p
    Partition number (1-4, default 2):   10
    Using default value 2
    First sector (264192-3862527, default 264192):   11
    Using default value 264192
    Last sector, +sectors or +size{K,M,G} (264192-3862527, default 3862527):   12
    Using default value 3862527
    
    Command (m for help): t  13
    Partition number (1-4): 1  14
    Hex code (type L to list codes): b  15
    Changed system type of partition 1 to b (W95 FAT32)
    
    Command (m for help): w  16
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: If you have created or modified any DOS 6.x
    partitions, please see the fdisk manual page for additional
    information.
    Syncing disks.
    [ATDE ~]$ 

    1

    SDカードのパーティションテーブル操作を開始します。USBメモリなどを接続している場合は、SDカードのデバイスファイルがsdcやsddなど本実行例と異なる場合があります。

    2

    新しく空のDOSパーティションテーブルを作成します。

    3

    新しくパーティションを追加します。

    4

    パーティション種別にはデフォルト値(p: プライマリ)を指定するので、そのまま改行を入力してください。

    5

    パーティション番号にはデフォルト値(1)を指定するので、そのまま改行を入力してください。

    6

    開始セクタにはデフォルト値(使用可能なセクタの先頭)を使用するので、そのまま改行を入力してください。

    7

    最終シリンダは、128MByte分を指定します。

    8

    新しくパーティションを追加します。

    9

    パーティション種別にはデフォルト値(p: プライマリ)を指定するので、そのまま改行を入力してください。

    10

    パーティション番号にはデフォルト値(2)を指定するので、そのまま改行を入力してください。

    11

    開始セクタにはデフォルト値(第1パーティションの最終セクタの次のセクタ)を使用するので、そのまま改行を入力してください。

    12

    最終セクタにはデフォルト値(末尾セクタ)を使用するので、そのまま改行を入力してください。

    13

    パーティションのシステムタイプを変更します。

    14

    第1パーティションを指定します。

    15

    パーティションのシステムタイプに0xb(Win95 FAT32)を指定します。

    16

    変更をSDカードに書き込みます。

  3. パーティションリストを表示し、2つのパーティションが作成されていることを確認してください。

    [ATDE ~]$ sudo fdisk -l /dev/sdb
    
    Disk /dev/sdb: 1977 MB, 1977614336 bytes
    61 heads, 62 sectors/track, 1021 cylinders, total 3862528 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x8cb9edcc
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048      264191      131072    b  W95 FAT32
    /dev/sdb2          264192     3862527     1799168   83  Linux
  4. それぞれのパーティションにファイルシステムを構築します。

    [ATDE ~]$ sudo mkfs.vfat -F 32 /dev/sdb1  1
    mkfs.vfat 3.0.13 (30 Jun 2012)
    [ATDE ~]$ sudo mkfs.ext3 -L rootfs /dev/sdb2  2
    mke2fs 1.42.5 (29-Jul-2012)
    Filesystem label=rootfs
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    112448 inodes, 449792 blocks
    22489 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=461373440
    14 block groups
    32768 blocks per group, 32768 fragments per group
    8032 inodes per group
    Superblock backups stored on blocks:
    	32768, 98304, 163840, 229376, 294912
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    [ATDE ~]$

    1

    第1パーティションにFAT32ファイルシステムを構築します。

    2

    第2パーティションにext3ファイルシステムを構築します。ボリュームラベルには"rootfs"を設定します。

  5. SDブート用のブートローダーイメージファイルを第1パーティションに配置します。

    [ATDE ~]$ ls
    loader-armadillo840-mmcsd-[version].bin
    [ATDE ~]$ mkdir sd  1
    [ATDE ~]$ sudo mount -t vfat /dev/sdb1 sd  2
    [ATDE ~]$ sudo cp loader-armadillo840-mmcsd-[version].bin sd/sdboot.bin  3
    [ATDE ~]$ sudo umount sd  4
    [ATDE ~]$ rmdir sd  5

    1

    SDカードをマウントするためのsd/ディレクトリを作成します。

    2

    第1パーティションをsd/ディレクトリにマウントします。

    3

    sd/ディレクトリにブートローダーイメージをコピーします。ファイル名は"sdboot.bin"にリネームする必要があります。

    4

    sd/ディレクトリにマウントした第1パーティションをアンマウントします。

    5

    sd/ディレクトリを削除します。

    [警告]

    アンマウントが完了する前にSDカードを作業用PCから取り外すと、SDカードのデータが破損する場合があります。

16.2. ルートファイルシステムの構築

「ブートディスクの作成」で作成したブートディスクにルートファイルシステムを構築します。

Atmark Dist または Debian GNU/Linuxのルートファイルシステムを構築することができます。ルートファイルシステムの構築に使用するファイルを次に示します。

表16.4 ルートファイルシステムの構築に使用するファイル

Linuxディストリビューションファイル名ファイルの説明
Atmark Distromfs-a840-[version].img.gzAtmark Distで作成したユーザーランドイメージ
Debian GNU/Linuxdebian-wheezy-armhf_a840_[version].tar.gzARM(armhf)アーキテクチャ用 Debian GNU/Linux 7(コードネーム 「wheezy」)のルートファイルシステムアーカイブ

[ティップ]

ブートディスクに構築したAtmark Distルートファイルシステムからでも、netflashを使用してフラッシュメモリを書き替えることができます。開発時にはフラッシュメモリの復旧用として準備しておくことを推奨します。

16.2.1. Atmark Distのルートファイルシステムを構築する

Atmark Distで作成したユーザーランドイメージから、ルートファイルシステムを構築する手順を次に示します。

手順16.2 Atmark Distイメージからルートファイルシステムを構築する

  1. Atmark Distで作成したユーザーランドイメージファイル(romfs-a840-[version].img.gz)を準備しておきます。

    [ATDE ~]$ ls
    romfs-a840-[version].img.gz
  2. ユーザーランドイメージファイルをマウントします。

    [ATDE ~]$ mkdir romfs  1
    [ATDE ~]$ gzip --stdout --decompress romfs-a840-[version].img.gz > romfs-a840-[version].img  2
    [ATDE ~]$ ls
    romfs  romfs-a840-[version].img  romfs-a840-[version].img.gz
    [ATDE ~]$ sudo mount -o loop romfs-a840-[version].img romfs  3
    [ATDE ~]$ ls romfs  4
    bin   dev  home  linuxrc     media  opt   root  sys  usr
    boot  etc  lib   lost+found  mnt    proc  sbin  tmp  var

    1

    ユーザーランドイメージファイルをマウントするためのromfs/ディレクトリを作成します。

    2

    gzip形式で圧縮されているユーザーランドイメージファイルを伸長します。

    3

    ユーザーランドイメージファイルをromfs/ディレクトリにマウントします。"-o"オプションで"loop"を指定する必要があります。

    4

    マウントに成功し、ルートファイルシステムが見えるようになったことを確認します。

    [ティップ]イメージファイルをマウントするには

    Atmark Distで作成したユーザーランドイメージファイルのマウントには「loopデバイス」を使用します。loopデバイスを使用すると、イメージファイルをブロック型デバイスとして扱うことができます。loopデバイスを使用したマウントを行うためには、mountコマンドの"-o"オプションで"loop"を指定する必要があります。

  3. ルートファイルシステムをブートディスクの第2パーティションに構築します。

    [ATDE ~]$ mkdir sd  1
    [ATDE ~]$ sudo mount -t ext3 /dev/sdb2 sd  2
    [ATDE ~]$ sudo cp -a romfs/* sd  3
    [ATDE ~]$ sudo umount romfs  4
    [ATDE ~]$ rmdir romfs  5

    1

    SDカードをマウントするためのsd/ディレクトリを作成します。

    2

    第2パーティションをsd/ディレクトリにマウントします。

    3

    romfs/ディレクトリからsd/ディレクトリにルートファイルシステムをコピーします。

    4

    romfs/ディレクトリにマウントしたユーザーランドイメージファイルをアンマウントします。

    5

    romfs/ディレクトリを削除します。

  4. ユーザーランドイメージファイルの/etc/fstabはフラッシュメモリ用の設定になっているため、SDカード用の設定に変更します。

    [ATDE ~]$ sudo vi sd/etc/fstab
    /dev/mmcblk0p2          /               ext3    defaults                0 1  1
    proc                    /proc           proc    defaults                0 0
    usbfs                   /proc/bus/usb   usbfs   defaults                0 0
    sysfs                   /sys            sysfs   defaults                0 0
    udev                    /dev            tmpfs   mode=0755               0 0
    /dev/flashblk/firmware  /opt/firmware   squashfs        defaults        0 0
    /dev/flashblk/license   /opt/license    squashfs        defaults        0 0
    [ATDE ~]$ sudo umount sd  2
    [ATDE ~]$ rmdir sd 3

    1

    "/dev/ram0"を"/dev/mmcblk0p2"に、"ext2"を"ext3"に変更します。

    2

    sd/ディレクトリにマウントしたブートディスクの第2パーティションをアンマウントします。

    3

    sd/ディレクトリを削除します。

    [警告]

    アンマウントが完了する前にSDカードを作業用PCから取り外すと、SDカードのデータが破損する場合があります。

16.2.2. Debian GNU/Linuxのルートファイルシステムを構築する

Debian GNU/Linuxルートファイルシステムアーカイブから、ルートファイルシステムを構築する手順を次に示します。

手順16.3 Debian GNU/Linuxルートファイルシステムアーカイブからルートファイルシステムを構築する

  1. Debian GNU/Linuxルートファイルシステムアーカイブを準備しておきます。

    [ATDE ~]$ ls
    debian-wheezy-armhf_a840_[version].tar.gz
  2. ルートファイルシステムをブートディスクの第2パーティションに構築します。

    [ATDE ~]$ mkdir sd  1
    [ATDE ~]$ sudo mount -t ext3 /dev/sdb2 sd  2
    [ATDE ~]$ sudo tar zxf debian-wheezy-armhf_a840_[version].tar.gz -C sd  3
    [ATDE ~]$ sudo umount sd  4
    [ATDE ~]$ rmdir sd 5

    1

    SDカードをマウントするためのsd/ディレクトリを作成します。

    2

    第2パーティションをsd/ディレクトリにマウントします。

    3

    ルートファイルシステムアーカイブをsd/ディレクトリに展開します。

    4

    sd/ディレクトリにマウントしたブートディスクの第2パーティションをアンマウントします。

    5

    sd/ディレクトリを削除します。

    [警告]

    アンマウントが完了する前にSDカードを作業用PCから取り外すと、SDカードのデータが破損する場合があります。

16.3. Linuxカーネルイメージの配置

「Atmark Distのルートファイルシステムを構築する」または、「Debian GNU/Linuxのルートファイルシステムを構築する」で作成したルートファイルシステムにLinuxカーネルイメージを配置します。Linuxカーネルイメージの配置に使用するファイルを次に示します。

表16.5 ブートディスクの作成に使用するファイル

ファイルファイル名
Linuxカーネルイメージlinux-a840-[version].bin.gz

SDカードにLinuxカーネルイメージを配置する際は、次の条件を満たすようにしてください。この条件から外れた場合、ブートローダーがLinuxカーネルイメージを検出することができなくなる場合があります。

表16.6 ブートローダーがLinuxカーネルを検出可能な条件

項目条件
ファイルシステムext2 または ext3
圧縮形式gzip形式 または 非圧縮
Linuxカーネルイメージファイル名(gzip形式)Image.gz, linux.gz, Image.bin.gz, linux.bin.gzのいずれか
Linuxカーネルイメージファイル名(非圧縮)Image, linux, Image.bin, linux.binのいずれか
Linuxカーネルイメージファイルの配置場所/boot/ディレクトリ直下

Linuxカーネルイメージをルートファイルシステムに配置する手順を次に示します。

手順16.4 Linuxカーネルイメージの配置例

  1. Linuxカーネルイメージを準備しておきます。

    [ATDE ~]$ ls
    linux-a840-[version].bin.gz
  2. Linuxカーネルイメージをブートディスクの第2パーティションに配置します。

    [ATDE ~]$ mkdir sd  1
    [ATDE ~]$ sudo mount -t ext3 /dev/sdb2 sd  2
    [ATDE ~]$ sudo mkdir -p sd/boot  3
    [ATDE ~]$ sudo cp linux-a840-[version].bin.gz sd/boot/Image.bin.gz  4
    [ATDE ~]$ sudo umount sd  5
    [ATDE ~]$ rmdir sd  6

    1

    SDカードをマウントするためのsd/ディレクトリを作成します。

    2

    第2パーティションをsd/ディレクトリにマウントします。

    3

    Linuxカーネルイメージを配置するためのboot/ディレクトリを作成します。

    4

    Linuxカーネルイメージをsd/boot/ディレクトリにコピーします。

    5

    sd/ディレクトリにマウントしたブートディスクの第2パーティションをアンマウントします。

    6

    sd/ディレクトリを削除します。

    [警告]

    アンマウントが完了する前にSDカードを作業用PCから取り外すと、SDカードのデータが破損する場合があります。

16.4. SDブートの実行

「ブートディスクの作成」で作成したブートディスクから起動する方法を説明します。

Armadilloに電源を投入する前に次の準備を行います。

  1. SDスロット(CON1)にブートディスクを接続します。

  2. ブートディスクのブートローダーイメージを起動させ(SDブート)、ブートローダーの起動後に保守モードとなるように、Armadillo-840のJP1およびJP2をショートに設定します。

準備が完了後、電源を投入するとSDブートさせることができます。SDブートに成功した場合は、図16.2「SDブート時の起動メッセージ」のように起動メッセージが表示されます。起動デバイス(Armadillo-840/の後に表示される文字列)が"mmcsd"になっていることを確認してください。

Hermit-At v3.2.3 (Armadillo-840/mmcsd) compiled at 15:34:56, Jul 03 2013
hermit> 

図16.2 SDブート時の起動メッセージ


「ルートファイルシステムの構築」で構築したルートファイルシステムで起動する場合は、図16.3「ルートファイルシステムの起動設定」のようにsetenvコマンドでLinuxカーネル起動オプションを設定します。setenvコマンドの詳細については「ブートローダーの機能」を参照してください。

hermit> setenv console=ttySC2,115200 noinitrd rootwait root=/dev/mmcblk0p2 mem=384M
hermit> setenv
1: console=ttySC2,115200
2: noinitrd
3: rootwait
4: root=/dev/mmcblk0p2
5: mem=384M

図16.3 ルートファイルシステムの起動設定


[ティップ]

Linuxカーネル起動オプションを出荷状態(Linuxカーネル起動オプションが設定されていない状態)に戻すには、以下のようにコマンドを実行します。

hermit> clearenv

「Linuxカーネルイメージの配置」で配置したLinuxカーネルイメージで起動する場合は、保守モードで図16.4「Linuxカーネルの起動設定」のようにsetbootdeviceコマンドでLinuxカーネルイメージを指定します。setbootdeviceコマンドの詳細については「Linuxカーネルイメージの指定方法」を参照してください。

hermit> setbootdevice mmcblk0p2
hermit> setbootdevice
bootdevice: mmcblk0p2

図16.4 Linuxカーネルの起動設定


[ティップ]

起動デバイス設定を出荷状態(フラッシュメモリから起動)に戻すには、以下のようにコマンドを実行します。

hermit> setbootdevice flash