AKI-H8/3069FでuClinuxを動作させる方法(中編)

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

AKI-H8ボード/3069Fの動作確認では、H8上で動作するファームウェアを書き込み、マザーボード上のLEDやLCDの動作確認をした。
ここでは、AKI-H8/3069Fに小型CPUで動作可能なuClinuxを載せ、実際に動作させる。

まず、uCLinuxを載せるには、下図の構成を覚えておく。

AKI-H8 3069F uCLinux 1.jpg


AKI-H8/3069F上でuClinuxが動作して、コマンド入力を行えるシェルが起動したとしても、キーボードやディスプレイは接続できない。
つまり、AKI-H8/3069F単体では入出力等ができないため、必ず、Linux PCが必要になる。
Linux PC上に、AKI-H8/3069F上のuClinuxの起動に必要なカーネル等のファイルを置くことによって、OSの起動を実現できる。

ここでは、以下の問題を解決していく。
この辺りの問題が、組み込み機器の取り扱いを難しくさせている要因であり、幅広い知識が要求される。

  • BIOSに代わるプログラムは何か。
  • カーネルはどこから起動されるのか。
  • HDD / SSDは無いが、ファイルシステムのマウント先はどうするのか。



RedBootの動作確認

Linux PCとAKI-H8/3069FをUSB-シリアル変換ケーブルで接続して、シリアル通信の接続を確認する。
更に、Linux PCとAKI-H8/3069FをLANケーブル(クロスケーブル)で接続する。
そして、下図のようにAKI-H8/3069FのSW1を通常モードにして起動する。

AKI-H8 3069F uCLinux 3.jpg


Red Bootは正常に動作している場合、下記のメッセージが表示される。

+**Warning** FLASH configuration checksum error or invalid key
Use 'fconfig -i' to [re]initialize database
DP83902A - eeprom ESA: 00:02:cb:01:86:c2 ←AKI-H8/3069FのMACアドレス
... waiting for BOOTP information
Ethernet eth0: MAC address 00:02:cb:01:86:c2
Can't get BOOTP info for device!
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot>



tftpのインストールと設定

uClinuxのカーネルをロードするためには、Linux PCからAKI-H8/3069FへuCLinuxカーネルを転送しなければならない。
ここでは、接続認証が不要のtftpを使用して転送する。(セキュリティの問題は残る)

tftpのインストール

まず、tftp(クライアント)とtftp-server、xinetdをインストールする。

# RHEL
sudo dnf install tftp tftp-server* xinetd*

# SUSE
sudp zypper install tftp yast2-tftp-server xinetd*


tftpの設定

インストールの完了後、/etc/xinetd.d/tftpファイルが作成されるので、以下のように編集する。
(クライアントからtftpサーバにファイルをアップロードする場合、disableをnoに設定して、server_argsに-cオプションを追加する)

# /etc/xinetd.d/tftpファイル

service tftp
{
   socket_type = dgram
   protocol    = udp
   wait        = yes
   user        = root
   server      = /usr/sbin/in.tftpd
   server_args	= -c -s /home/ユーザ名/tftpboot
   disable     = no
   per_source  = 11
   cps         = 100 2
   flags       = IPv4
}


上記の設定ファイルでは、初期設定のtftpルートディレクトリは、/tftpbootに設定される。
したがって、tftpサーバを起動する前に作成する必要があるため、以下のコマンドを実行する。

sudo mkdir ~/tftpboot
sudo chmod -R 777 ~/tftpboot


tftpとxinetdを有効にするため、以下のコマンドを実行する。

# tftpとxinetdの起動
sudo systemctl start xinetd && sudo systemctl start tftp

# tftpとxinetdの自動起動
sudo systemctl enable xinetd && sudo systemctl enable tftp


ファイアーウォールのtftpのポート解放とpublicゾーンの登録を行う。

# UDP 69番ポートの解放
sudo firewall-cmd --add-port=69/udp --permanent

# publicゾーンの登録
sudo firewall-cmd --zone=public --add-service=tftp --parmanent

sudo firewall-cmd --reload


RHELを使用している場合、SELinuxの設定を行う。
初期設定では、SELinuxは変更を受け入れない強制ポリシーを使用しているため、tftpの読み書きを許可する必要がある。
SELinuxに変更を加えるには、/etc/selinux/configファイルを変更して、ポリシーを許容に変更する。
tftpの読み書きを許可する場合、以下のようにsetseboolコマンドを実行する。

sudo setsebool -P tftp_anon_write 1
sudo setsebool -P tftp_home_dir 1


getsebool -a | grep tftp


# SELinuxにおけるtftpの権限(変更前)
tftp_anon_write --> off
tftp_home_dir --> off

# ELinuxにおけるtftpの権限(変更後)
tftp_anon_write --> on
tftp_home_dir --> on


tftpの動作確認

Linux PCとAKI-H8/3069Fは、1対1で接続するので、Linux PCは静的IPアドレスに設定する。(例 : 192.168.1.10)

一般的に、tftpを用いてファイルを送信するには、上記で作成した~/tftpbootディレクトリにファイルを配置して転送する。
ここでは、test.txtファイルを転送する。

echo "The Embedded" > ~/tftpboot/test.txt 


次に、/tmpディレクトリに移動してファイルが正常に転送されるか確認する。

cd /tmp
tftp 192.168.1.10
tftp> get ~/tftpboot/test.txt
tftp> quit


~/tftpbootディレクトリ下に作成したtest.txtファイルが、tftpを通じて、/tmpディレクトリ下に転送されていることが分かる。
もし、転送されない場合は、/etc/xinetd.d/tftpファイルの設定およびtftpの起動時に実行するgetコマンドの文法を確認する。


AKI-H8/3069FにIPアドレスを割り当てる

AKI-H8/3069Fにも静的IPアドレスを割り当てる必要がある。
H8のFlash ROMに書き込んだRed Bootは、初期設定では、DHCPのクライアント機能を実行するように設定されている。
つまり、Linux PCをDHCPサーバにする必要がある。

もし、Linux PCにDHCPサーバを構築することが面倒な場合、Red Bootのfconfig -iコマンドを実行して、静的IPアドレスを直接割り当てる。
静的IPアドレスを割り当てた後、AKI-H8/3069Fの電源を再接続する、または、リセットボタンを押下してRed Bootを再起動する。

まず、Linux PCとAKI-H8/3069FをUSB-シリアル変換ケーブルで接続して、シリアル通信の接続を確認する。
次に、Linux PCとAKI-H8/3069FをLANケーブル(クロスケーブル)で接続する。
下図のようにAKI-H8/3069FのSW1を通常モードにして起動する。

AKI-H8 3069F uCLinux 3.jpg
# Red Bootの起動

+**Warning** FLASH configuration checksum error or invalid key
Use 'fconfig -i' to [re]initialize database
DP83902A - eeprom ESA: 00:02:cb:01:86:c2                             AKI-H8/3069FのMACアドレス
... waiting for BOOTP information
Ethernet eth0: MAC address 00:02:cb:01:86:c2
Can't get BOOTP info for device!
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot> 


Red Bootの起動後、シリアル通信を使用してターミナルからfconfig -iコマンドを実行する。
以下のように、サーバとなるLinux PCの情報を入力する。

RedBoot> fconfig -i

Initialize non-volatile configuration - continue (y/n)?       yを入力
Run script at boot: false                                     falseを入力
Use BOOTP for network configuration: true                     trueを入力
Default server IP address: 192.168.1.10                       tftpサーバ(Linux PC)のIPアドレスを入力
GDB connection port: 9000                                     9000を入力
Force console for special debug messages: false               falseを入力
linux boot command:
Network debug at boot time: false                             falseを入力
Default network device: dp83902a_eth0                         dp83902a_eth0を入力
Update RedBoot non-volatile configuration - continue (y/n)?   yを入力
... Erase from 0x00070000-0x00080000: .
... Program from 0x005e4000-0x005f4000 at 0x00070000: .
RedBoot> 


DHCPサーバを構築するのが面倒な場合は、以下のように、Red Bootのfconfig -iコマンドで静的IPアドレスを直接割り当てる。

RedBoot> fconfig -i

Initialize non-volatile configuration - continue (y/n)?       yを入力
Run script at boot: false                                     falseを入力
Use BOOTP for network configuration: false                    falseを入力
Gateway IP address: 192.168.1.1                               適当なGatewayのIPアドレスを入力
Local IP address: 192.168.1.11                                AKI-H8/3069FのIPアドレスを入力
Local IP address mask: 255.255.255.0                          ネットマスクを入力
Default server IP address: 192.168.1.10                       tftpサーバ(Linux PC)のアドレスを入力
GDB connection port: 9000                                     9000を入力
Force console for special debug messages: false               falseを入力
linux boot command:
Network debug at boot time: false                             falseを入力
Default network device: dp83902a_eth0                         dp83902a_eth0を入力
Update RedBoot non-volatile configuration - continue (y/n)?   yを入力
... Erase from 0x00070000-0x00080000: .
... Program from 0x005e4000-0x005f4000 at 0x00070000: .
RedBoot>


次に、Linux PCにDHCPサーバを構築する。
DHCPサーバのインストールの詳細は、サーバ - DHCPを参照すること。

DHCPサーバの設定を行うため、/etc/dhcp/dhcpd.confファイル(RHEL)または/etc/dhcpd.confファイル(SUSE)を編集する。
(AKI-H8/3069FのMACアドレスは、Red Bootの起動時に出力される)

# RHEL
sudo vi /etc/dhcp/dhcpd.conf

# SUSE
sudo mv /etc/dhcpd.conf /etc/dhcpd.conf.org
sudo vi /etc/dhcpd.conf


# /etc/dhcp/dhcpd.confファイル(RHEL)
# /etc/dhcpd.confファイル(SUSE)

# デフォルト貸出期間
default-lease-time 21600;

# 最大貸出期間
max-lease-time 43200;

# 旧バージョンのdhcpdとの互換性が必要な場合に使用する
ddns-update-style ad-hoc;

# bootpクエリ(問い合わせ)に答えるかどうかをdhcpdに指示する(標準設定では、bootpクエリはallow(許可)である)
allow bootp;

subnet 192.168.1.0 netmask 255.255.255.0
{
   # ブロードキャストアドレスの指定
   option broadcast-address 192.168.1.255;

   # サブネットマスクの指定
   option subnet-mask 255.255.255.0;

   # ゲートウェイアドレスの指定
   option routers 192.168.1.10;

   # ネームサーバのホスト名またはIPアドレスの指定
   option domain-name-servers 192.168.1.10;

   # NetBIOS名またはIPアドレスの指定
   option netbios-name-servers 192.168.1.10;

   # 貸し出すIPアドレスの範囲指定 
   range dynamic-bootp 192.168.1.11 192.168.1.20;
}

host AKI3069F.koudo.net
{
   # AKI-H8/3069FのMACアドレス
   hardware Ethernet 00:02:cb:01:86:c2;

   # AKI-H8/3069FのIPアドレス
   fixed-address 192.168.1.11;
}


次に、DHCPサービスを起動する。

sudo systemctl start dhcpd
sudo systemctl enable dhcpd


Firewalldを有効にしている場合は、DHCPサービスの許可が必要である。(DHCPサーバは、UDPでポート番号67を使用する)

sudo firewall-cmd --add-service=dhcp --permanent
sudo firewall-cmd --reload


再度、AKI-H8/3069Fを再起動して、以下のようにIPアドレスが割り当てられていれば、DHCPサーバは正常に動作している。

+DP83902A - eeprom ESA: 00:02:cb:01:86:c2
Ethernet eth0: MAC address 00:02:cb:01:86:c2
IP: 192.168.1.11/255.255.255.0, Gateway: 0.0.0.0                     AKI-H8/3069FのIPアドレス
Default server: 192.168.1.10                                         tftpサーバ(Linux PC)のIPアドレス
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot> 


Linux PCからAKI-H8/3069Fへのネットワーク接続を確認するため、以下のコマンドを実行する。
ネットワーク接続が正常ならば、以下のように出力される。

# 入力
ping 192.168.1.11


# 出力
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=14.9 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=2.84 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=4.22 ms
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 2.842/7.345/14.970/5.421 ms


もし、ネットワーク接続できない場合は、LANケーブル(クロスケーブル)の接続やDHCPの設定ファイルを確認したり、
fconfig -iコマンドで設定したサーバやAKI-H8/3069FのIPアドレスが正しいか確認する。