ブログ

Armadillo-440:microSDカード上のカーネル、ユーザーランドで起動する(Linux-2.6.26版)

at_kazutaka.bito
2024年1月10日 10時00分

Armadillo-440をmicroSDカード上のカーネル、ユーザーランドで起動する方法です。

なお、Armadillo-440は、2つのカーネルバージョン(Linux-2.6.26、Linux-3.14)があります。
Armadillo-440のカーネルバージョンは、起動直後のコンソールのログで確認できます。
Linux-2.6.26の例)起動直後のログが「Hermit-At v2」で始まる

Hermit-At v2.5.0 (armadillo4x0) compiled at 06:49:08, Jul 10 2018

Linux-3.14の例)起動直後のログが「Hermit-At v3」で始まる

Hermit-At v3.11.0 (armadillo4x0) compiled at 08:31:07, Mar 30 2018

ここでは、Linux-2.6.26版で説明します。
Linux-3.14版は、 Armadillo-440:microSDカード上のカーネル、ユーザーランドで起動する(Linux-3.14版)を参照ください。

下記の手順にあたり、microSDカードとUSBメモリを用意しておきます。
 USBメモリ(起動ディスクを作るためのファイルを置く。FAT32でフォーマットされたものを使用)
 microSDカード(カーネル、ユーザーランドが書き込まれる起動ディスク)

1. USBメモリにカーネル、ユーザーランドのイメージファイルを置く

USBメモリに下記の2つのイメージファイルを保存しておきます。
 カーネル
 ユーザーランド

ここでは例として、Armadillo-440 製品ソフトウェア・マニュアル(Linux 2.6.26対応・旧版)より
ダウンロード可能(2023.12時点の最新版)な下記の標準ソフトのイメージファイルをUSBメモリに保存しておきます。
 カーネル:linux-a400-1.20.bin.gz
 ユーザーランド:romfs-a440-1.13.img.gz
下記の説明内では、上記のイメージファイル名で記述します。
異なるイメージファイル名を使用する場合は、使用するイメージファイル名に読み替えてください。

2. Armadillo-440の起動

Armadillo-440に、手順1で作成したUSBメモリと、microSDカードを接続して起動します。
起動後、USBメモリをマウントし、手順1のファイルが見えることを確認します。

[root@armadillo440-0 (ttymxc1) ~]# mkdir usb
[root@armadillo440-0 (ttymxc1) ~]# mount -t vfat /dev/sda1 usb
[root@armadillo440-0 (ttymxc1) ~]# ls -1 usb
linux-a400-1.20.bin.gz* 
romfs-a440-1.13.img.gz*

3. microSDカードのフォーマット

3-1. microSDカードのパーティションの設定
// fdiskコマンドをSDカード(/dev/mmcblk0)に対して実行します。

[root@armadillo440-0 (ttymxc1) ~]# fdisk /dev/mmcblk0

The number of cylinders for this disk is set to 236544.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

// 以下、fdisk内での設定になります。

Command (m for help): d   // dを入力(パーティションの削除。複数ある場合はすべて削除。)
Selected partition 1

Command (m for help): n    // nを入力
Command action
   e   extended
   p   primary partition (1-4)
p               // pを入力
Partition number (1-4): 1   // 1を入力
First cylinder (1-236544, default 1):    // そのまま
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-236544, default 236544):    // そのまま
Using default value 236544

Command (m for help): w    // wを入力
The partition table has been altered!

Calling ioctl() to re-read partition table.
 mmcblk0: p1
 mmcblk0: p1
Syncing disks.

// 以上で、fdisk内での設定が完了し、標準入力のプロンプトに戻ります。
[root@armadillo440-0 (ttymxc1) ~]#
3-2. microSDカードのフォーマット
[root@armadillo440-0 (ttymxc1) ~]# mke2fs -j /dev/mmcblk0p1
[root@armadillo440-0 (ttymxc1) ~]# tune2fs -i 0 /dev/mmcblk0p1

上記3-1,3-2の手順の詳細は Armadillo実践開発ガイド第2部「4.1.1. パーティションの作成とフォーマット」を参考。

4. カーネル、ユーザーランドをmicroSDカードに書き込む

手順2でマウントしたUSBメモリ内のイメージファイルを使って、microSDカード(/dev/mmcblk0p1)に
カーネル、ユーザーランドを書き込みます。

4-1. カーネルの書き込み

USBメモリ内のカーネルイメージ(本例では:linux-a400-1.20.bin.gz)をmicroSDカード(/dev/mmcblk0p1)に書き込みます。

[root@armadillo440-0 (ttymxc1) ~]# mkdir sd
[root@armadillo440-0 (ttymxc1) ~]# mount -t ext3 /dev/mmcblk0p1 sd
kjournald starting.  Commit interval 5 seconds
EXT3 FS on mmcblk0p1, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
[root@armadillo440-0 (ttymxc1) ~]# mkdir -p sd/boot
[root@armadillo440-0 (ttymxc1) ~]# cp usb/linux-a400-1.20.bin.gz sd/boot/linux.bin.gz
4-2. ユーザーランドの書き込み

USBメモリ内のカーネルイメージ(本例では:romfs-a440-1.13.img.gz)をmicroSDカード(/dev/mmcblk0p1)に書き込みます。

[root@armadillo440-0 (ttymxc1) ~]# mkdir usb/romfs
[root@armadillo440-0 (ttymxc1) ~]# gzip -c -d usb/romfs-a440-1.13.img.gz > usb/romfs.img
[root@armadillo440-0 (ttymxc1) ~]# mount -o loop usb/romfs.img usb/romfs
ext3: No journal on filesystem on loop0
[root@armadillo440-0 (ttymxc1) ~]# cp -a usb/romfs/* sd
[root@armadillo440-0 (ttymxc1) ~]# umount usb/romfs
[root@armadillo440-0 (ttymxc1) ~]# rmdir usb/romfs

usbメモリに追加した中間ファイル(romfs.img)を削除して、アンマウントします。

[root@armadillo440-0 (ttymxc1) ~]# rm -f usb/romfs.img
[root@armadillo440-0 (ttymxc1) ~]# umount usb
[root@armadillo440-0 (ttymxc1) ~]# rmdir usb
4-3. ユーザーランドのfstabファイルの変更

ユーザーランドのfstabファイルの内容を変更します。
変更前のfstabファイルは、下記のようになっています。

[root@armadillo440-0 (ttymxc1) ~]# cat sd/etc/fstab
/dev/ram0               /               ext2    defaults                0 1
proc                    /proc           proc    defaults                0 0
usbfs                   /proc/bus/usb   usbfs   defaults                0 0
sysfs                   /sys            sysfs   defaults                0 0

上記(変更前)の1行目のram0をmmcblk0p1に、ext2をext3にします。
viエディタでfstabファイルを編集、もしくは、下記コマンドで変更します。

[root@armadillo440-0 (ttymxc1) ~]# sed -i -e 's/ram0/mmcblk0p1/' sd/etc/fstab
[root@armadillo440-0 (ttymxc1) ~]# sed -i -e 's/ext2/ext3/' sd/etc/fstab

変更後のfstabファイルは、下記のようになります。

[root@armadillo440-0 (ttymxc1) ~]# cat sd/etc/fstab
/dev/mmcblk0p1          /               ext3    defaults                0 1
proc                    /proc           proc    defaults                0 0
usbfs                   /proc/bus/usb   usbfs   defaults                0 0
sysfs                   /sys            sysfs   defaults                0 0

microSDカードをアンマウントします。

[root@armadillo440-0 (ttymxc1) ~]# umount sd
[root@armadillo440-0 (ttymxc1) ~]# rmdir sd

以上で、カーネル、ユーザーランドが起動するmicroSDカードの作成は終了です。

Armadillo-440をmicroSDカードのカーネル、ユーザーランドで起動するには、
保守モード(※)で起動して、ブートローダーを設定します。
※)保守モードでの起動方法(SW1を押下したまま起動。または、JP1:オープン、JP2:ショートで起動。)
Armadillo-400 シリーズ ソフトウェアマニュアル「3.8. ブートモード」

ブートローダーで、下記のように設定します。

hermit> setenv console=ttymxc1 root=/dev/mmcblk0p1 noinitrd rootwait
hermit> setbootdevice mmcblk0p1

以降、Armadill-440は、microSDカードのカーネル、ユーザーランドで起動します。

補足1)microSDカードのカーネル、ユーザーランドで起動した場合、終了の際はpoweroffコマンドを実行します。
(microSDカード上のファイルシステムを正常に終了するためにシャットダウンします。)

[root@armadillo440-0 (ttymxc1) ~]# poweroff

補足2)ROMのカーネル、ユーザーランドでの起動に戻すには、保守モードで起動して下記のように設定します。

hermit> clearenv
hermit> setbootdevice flash