AKI-H8/3069FでuClinuxを動作させる方法(中編)
概要
AKI-H8ボード/3069Fの動作確認では、H8上で動作するファームウェアを書き込み、マザーボード上のLEDやLCDの動作確認をした。
ここでは、AKI-H8/3069Fに小型CPUで動作可能なuClinuxを載せ、実際に動作させる。
まず、uCLinuxを載せるには、下図の構成を覚えておく。
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を通常モードにして起動する。
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を通常モードにして起動する。
# 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アドレスが正しいか確認する。