Armadillo実践開発ガイド

~組み込みLinuxの導入から製品化まで~

第2部


目次

1. はじめに
1.1. 対象読者
1.2. 表記方法
1.2.1. 使用するフォント
1.2.2. コマンド入力例の表記方法
1.2.3. コラムの表記方法
1.3. サンプルソースコード
1.4. 困った時は
1.5. お問い合わせ先
1.6. 商標
1.7. ライセンス
1.8. 謝辞
2. 開発環境の整備と運用
2.1. ATDE3でUSBメモリを使用する
2.1.1. ホストOSがWindowsの場合
2.1.2. ホストOSがLinuxの場合
2.2. ATDE3にソフトウェアを追加する
2.2.1. ソフトウェアが含まれるパッケージを検索する
2.2.2. パッケージをインストールする
2.3. ATDE3にクロス開発用ライブラリをインストールする
2.3.1. dpkg-crossコマンドを使用する
2.3.2. apt-crossコマンドを使用する
2.4. ATDE3と同じ環境を構築する
3. Linuxシステムの仕組みと運用、管理
3.1. コマンドの使い方を調べる
3.2. ユーザー管理
3.2.1. 特権ユーザーと一般ユーザー
3.2.2. ユーザーの追加と削除
3.2.3. ユーザーとグループ
3.3. ファイルの操作
3.3.1. ファイルの種類
3.3.2. ファイルの属性情報(inode)
3.3.3. ファイルシステムとパス
3.3.4. ファイルの所有権とパーミッション
3.3.5. デバイスファイルの管理
3.4. プログラムとプロセス
3.5. シグナル
3.6. プロセス間通信
3.7. 端末
3.7.1. シリアル端末
3.7.2. コンソール端末
3.7.3. 擬似端末
3.8. 時間の管理
3.8.1. タイムゾーン
3.8.2. 時刻を正確に保つ
3.8.3. タイマーの分解能
3.9. ロケール
3.10. ネットワーク
3.10.1. ネットワークインターフェース
3.10.2. IPアドレスとポート番号
3.10.3. ホスト名とリゾルバ
3.10.4. ネットワークの状態を調べる
4. Armadillo上にDebian GNU/Linuxを構築する
4.1. 構築手順
4.1.1. パーティションの作成とフォーマット
4.1.2. カーネルイメージファイルのコピー
4.1.3. ルートファイルシステムの構築
4.1.4. ブートデバイスとカーネルパラメーターの設定
4.2. Debian GNU/Linuxインストール後にまずすること
4.2.1. ログインと一般ユーザーの追加
4.2.2. 時刻の設定
4.2.3. パッケージのアップデート
4.2.4. FTPサーバーのインストール
4.2.5. Telnetサーバーのインストール
4.3. セルフコンパイル用ツールチェインのインストール
5. シェルスクリプトプログラミング
5.1. シェルの種類
5.2. シェルスクリプトの書き方
5.3. シェルの構文
5.3.1. 基本的なコマンドの実行方法
5.3.2. 変数
5.3.3. 環境変数
5.3.4. パラメータ
5.3.5. クォート
5.3.6. 展開
5.3.7. 終了ステータス
5.3.8. 入出力の扱い
5.3.9. 様々なコマンドの実行方法
5.3.10. 制御構文
5.3.11. 関数
6. C言語による実践プログラミング
6.1. C言語プログラミングのためのツールたち
6.1.1. Cコンパイラ: gcc
6.1.2. クロスツールチェーン
6.1.3. makeとmakefile
6.2. C言語プログラミングの復習
6.2.1. コマンドライン引数の扱いと終了ステータス
6.2.2. 終了処理
6.2.3. エラー処理
6.2.4. 共通ヘッダファイル
6.3. ファイルの取り扱い
6.3.1. テキストファイルを扱う
6.3.2. 設定ファイルに対応する
6.3.3. バイナリファイルを扱う
6.4. デバイスの操作
6.4.1. デバイスファイルを使う
6.4.2. sysfsファイルシステムを使う
6.5. シリアルポートの入出力
6.5.1. シリアルエコーサーバー
6.5.2. 改行コードの違いを吸収する
6.5.3. より効率的な入出力方法
6.6. ネットワークを使う
6.6.1. TCP/IP
6.6.2. TCP/IPでHello!
6.6.3. ネットワークエコーサーバー
7. 詳解Atmark Dist
7.1. ディレクトリ構成
7.1.1. トップレベルmakefile
7.1.2. configディレクトリ
7.1.3. toolsディレクトリ
7.1.4. Cライブラリディレクトリ
7.1.5. userディレクトリ
7.1.6. vendorsディレクトリ
7.2. 基本ターゲット
7.2.1. コンフィギュレーション設定用のターゲット
7.2.2. クリーンターゲット(clean)
7.2.3. デフォルトターゲット(all)
7.3. イメージファイル作成手順の全体像
7.4. コンフィギュレーションの設定
7.4.1. ベンダー、プロダクトの選択
7.4.2. ユーザーランドコンフィギュレーションの変更
7.4.3. カーネルコンフィギュレーションの変更
7.4.4. コンフィギュレーションの変更を元に戻す
7.4.5. コンフィギュレーションの保存
7.4.6. その他のコンフィギュレーション
7.5. ソースコードのビルドとイメージファイルの作成
7.5.1. ビルドの実行
7.5.2. 詳細なビルドの流れ
7.5.3. romfsインストールツール(romfs-inst.sh)
7.6. プロダクトディレクトリのカスタマイズ
7.6.1. プロダクトディレクトリに含まれるファイル
7.6.2. プロダクトディレクトリの作成
7.6.3. アプリケーションプログラムの追加
7.6.4. ファイルの追加、変更
7.7. ソフトウェアアップデートへの対応
7.7.1. Atmark Distがアップデートされた場合
7.7.2. Linuxカーネルがアップデートされた場合
8. 組み込みシステム構築の定石
8.1. 起動時にコマンドを自動実行する
8.1.1. 初期化スクリプトで自動実行する(一時的な方法)
8.1.2. 初期化スクリプトで自動実行する(恒久的な方法)
8.1.3. inittabで自動実行する
8.2. 定期的にコマンドを実行する
8.2.1. cronで定期実行する
8.3. 不具合発生時の自動再起動
8.3.1. initによるプロセスの自動再起動
8.3.2. ウォッチドッグタイマーによるシステムの再起動
8.4. ログ管理
8.4.1. ログファイルのローテーション
8.4.2. ログをリモートサーバーに送る
8.5. 外部ストレージのデータを守る
8.5.1. データがストレージに書き込まれたことを保証する
8.5.2. 不意な電源断への対応
8.6. データ溢れを防ぐ
8.6.1. ストレージのサイズと使用量を調べる
8.6.2. ルートファイルシステムの空き容量を増やす
8.6.3. 一時RAMファイルシステムを使用する
8.7. イメージの自動アップデート
8.7.1. USBメモリを使用してのアップデート
8.7.2. Webサーバーを使用してのアップデート

図目次

1.1. コマンド入力表記例(Linuxシステム)
1.2. コマンド入力表記例(保守モード)
1.3. クリエイティブコモンズライセンス
2.1. USBメモリの接続
2.2. USBメモリのアイコン
2.3. USBメモリの接続
2.4. USBメモリのアイコン
2.5. apt-cache searchによるパッケージの検索
2.6. lsコマンドが含まれているパッケージを調べる
2.7. apt-get installによるパッケージのインストール
2.8. apt-crossコマンド
3.1. --helpオプションでコマンドの使用方法を調べる
3.2. コマンドの使用方法を調べる(--helpオプションをサポートしていない場合)
3.3. catコマンドの使用方法を調べる
3.4. ユーザーの切り替え(suコマンド)
3.5. 一時的なユーザーの切り替え(sudoコマンド)
3.6. ユーザーの追加(useraddコマンド)
3.7. パスワードの設定(passwdコマンド)
3.8. ユーザーの削除(userdelコマンド)
3.9. ログインできないユーザーとしてコマンドを実行する(sudoコマンド)
3.10. グループを追加する(groupaddコマンド)
3.11. ユーザーが所属するグループを変更する(usermodコマンド)
3.12. inodeが持つ情報を確認する(ls -lコマンド)
3.13. ファイルのパーミッションを変更する(chmodコマンド)
3.14. umaskと新規作成時のファイルパーミッション
3.15. etc/shadowファイルとpasswd実行ファイルのパーミッション
3.16. /tmpディレクトリのパーミッション
3.17. デバイスファイルの例
3.18. デバイスファイルの作成(mknodコマンド)
3.19. プロセス一覧の確認(psコマンド)
3.20. シリアルポートの読み書き
3.21. シリアルポートの設定確認(sttyコマンド)
3.22. 端末が使用しているttyデバイスの確認(ttyコマンド)
3.23. カーネルパラメーターの確認(proc/cmdlineファイル)
3.24. Gnome端末でのttyデバイス
3.25. Armadilloにtelnetで接続した場合のttyデバイス
3.26. システムクロックの参照(dateコマンド)
3.27. ハードウェアクロックの参照(hwclockコマンド)
3.28. システムクロックの参照(タイムゾーンを指定)
3.29. システムクロックをハードウェアクロックに設定する(UTC)
3.30. システムクロックをハードウェアクロックに設定する(ローカルタイム)
3.31. adjtimexによるシステムクロックの補正1: ntpdの停止
3.32. adjtimexによるシステムクロックの補正2: adjtimexのインストール
3.33. adjtimexによるシステムクロックの補正3: ntpdateによる補正データの測定
3.34. adjtimexによるシステムクロックの補正4: 補正データの設定と確認
3.35. システムでサポートされているすべてのロケールを得る(locale -aコマンド)
3.36. 現在のロケールを確認する(localeコマンド)
3.37. ロケールを指定してdateコマンドを実行
3.38. ネットワークインターフェースの状態を取得する(ifconfigコマンド)
3.39. ネットワークインターフェースの状態を設定する(ifconfigコマンド)
3.40. ATDE3のinterfacesファイル
3.41. 使用中のポート番号を調べる(netstatコマンド)
3.42. ホスト名を調べる(hostnameコマンド)
3.43. /etc/hostsファイル
3.44. ネットワークの到達確認: 成功(pingコマンド)
3.45. ネットワークの到達確認: 失敗(pingコマンド)
4.1. microSDカード挿入時のカーネルメッセージ
4.2. パーティション作成手順
4.3. ファイルシステム作成手順
4.4. カーネルイメージの配置
4.5. ルートファイルシステムの構築
4.6. ブートデバイスをmicroSDカードに指定する
4.7. ルートファイルシステムをmicroSDカードに指定する
4.8. Hermit-Atの設定を元に戻す
4.9. Armadillo上のDebian GNU/Linuxへログインする
4.10. Armadillo上のDebian GNU/Linuxのプロンプト表記
4.11. 一般ユーザー(guest)の追加
4.12. タイムゾーンの設定
4.13. システムクロックを手動設定する
4.14. システムクロックをハードウェアクロックに反映する
4.15. Debianパッケージのアップデート
4.16. FTPサーバーのインストール
4.17. inetdの起動
4.18. lftpでArmadilloのFTPサーバーに接続
4.19. lftpを使用してArmadilloにファイルを転送
4.20. Telnetサーバーのインストール
4.21. telnetでArmadilloのTelnetサーバーに接続
4.22. ツールチェインのインストール
5.1. for文の例1
5.2. for文の例2
5.3. シェルスクリプトの例(example.sh)
5.4. シェルスクリプト実行例
5.5. シェルでコマンドを実行する
5.6. シェルでコマンドを実行する(空白を含む引数)
5.7. 変数の例
5.8. 算術演算の例
5.9. すべての環境変数の表示
5.10. 環境変数の設定
5.11. クォートの例
5.12. チルダ展開の例
5.13. コマンド置換の例
5.14. 終了ステータスの例
5.15. 出力のリダイレクト
5.16. 出力のリダイレクト(追記)
5.17. 標準エラー出力のリダイレクト
5.18. 標準出力のリダイレクト
5.19. 複数の出力のリダイレクト
5.20. 標準出力と標準エラー出力を同じファイルにリダイレクト
5.21. 出力を/dev/nullにリダイレクト
5.22. 入力のリダイレクト
5.23. パイプ
5.24. パイプの例
5.25. ヒアドキュメントの文法
5.26. ヒアドキュメントの例
5.27. ヒアドキュメントの例(クォート)
5.28. 単純なコマンドの文法
5.29. パイプラインの文法
5.30. リストの文法
5.31. サブシェルの文法
5.32. グループコマンドの文法
5.33. 算術評価の文法
5.34. 条件式評価の文法
5.35. if文の構文
5.36. if文の例(if_sample.sh)
5.37. case文の構文
5.38. case文の例(case_sample.sh)
5.39. for文の構文
5.40. for文の例1(for_sample1.sh)
5.41. for文の例2(for_sample2.sh)
5.42. for文の例3(for_sample3.sh)
5.43. while文の構文
5.44. while文の例(while_sample.sh)
5.45. 関数の構文
5.46. 関数の例(function_sample1.sh)
5.47. function_sample1.shの実行結果
5.48. 関数の例(function_sample2.sh)
5.49. function_sample2.shの実行結果
5.50. 関数の例(function_sample3.sh)
5.51. function_sample3.shの実行結果
5.52. 関数の例(function_sample4.sh)
5.53. function_sample4.shの実行結果
6.1. ルールの記述方法
6.2. ルールの記述方法2
6.3. makefileの実例
6.4. makefileの実例: 実行結果
6.5. オーバーライドの発生例
6.6. 基本的なmakefile
6.7. 複数ファイルを扱うmakefile
6.8. すべてのパラメータを表示するプログラム(show_arg.c)
6.9. show_argの実行結果
6.10. greetingの動作
6.11. greeting.c
6.12. fdump.c
6.13. fdumpの実行結果
6.14. エラー内容表示とFAILURE終了するためのヘッダ(exitfail.h)
6.15. CSVファイルの内容を表示するプログラム(dispcsv1.c)
6.16. dispcsv1の実行結果
6.17. CSVファイルの内容を表示するプログラムのconfファイル対応版 (dispcsv2.c)
6.18. dispcsv2のためのMakefile
6.19. dispcsv2の実行結果
6.20. dispcsv2.confを編集したdispcsv2の実行結果
6.21. BMPファイル形式構造定義ヘッダファイル(bitmap.h)
6.22. BMP形式画像ファイルのコンソール表示プログラム(dispbmp.c)
6.23. dispbmp の実行結果
6.24. シェルからLEDを点灯/消灯する
6.25. LEDの点灯/消灯を行うプログラム(led_on_off.c)
6.26. led_on_off の実行例
6.27. シリアルエコーサーバー(serial_echo_server1.c)
6.28. serial_echo_server1の実行例
6.29. 改行コード変換を行うシリアルエコーサーバー(serial_echo_server2.c)
6.30. 改行コード変換を行うシリアルエコーサーバー(serial_echo_server3.c)
6.31. TCP/IPプログラムの基本的な流れ
6.32. ネットワークでHello!を返すサーバー (network_hello_server.c)
6.33. network_hello_serverの実行結果
6.34. network_hello_serverへのtelnet
6.35. ネットワークエコーサーバー (network_echo_server1.c)
6.36. network_echo_server1の実行結果
6.37. network_echo_server1へのtelnet
6.38. network_echo_server1へのtelnet(Windows)
6.39. ネットワークエコーサーバー (network_echo_server2.c)
7.1. Atmark Distのトップディレクトリ
7.2. vendorsディレクトリ
7.3. vendors/AtmarkTechnoディレクトリ
7.4. vendors/configディレクトリ
7.5. make config: ベンダーの選択
7.6. make config: プロダクトの選択
7.7. make config: アーキテクチャの選択
7.8. make config: Cライブラリの選択
7.9. make config: コンフィギュレーションの設定を標準にする
7.10. make config: コンフィギュレーション設定の終了
7.11. メニュー画面によるコンフィギュレーション設定の開始
7.12. menuconfig: Main Menu画面
7.13. Atmark Distでイメージファイルを作成する流れ
7.14. 設定画面の階層
7.15. ベンダーとしてAtmarkTechnoを選択する
7.16. プロダクトを選択する
7.17. ユーザーランドコンフィギュレーションの変更
7.18. カーネルコンフィギュレーションを変更する
7.19. コンフィギュレーションの変更を元に戻す
7.20. コンフィギュレーションを保存する
7.21. 開発環境の選択
7.22. Atmark Distのビルド
7.23. デフォルトターゲットのルール
7.24. subdirsターゲットのルール
7.25. romfs-inst.shのヘルプ
7.26. romfs-inst.shの構文
7.27. ファイルをコピーするルール
7.28. ファイルをコピーするルール(srcを省略)
7.29. ディレクトリをコピーするルール
7.30. ディレクトリをコピーするルール(ディレクトリ名を指定する)
7.31. シンボリックリンクを作成するルール
7.32. シンボリックリンクの作成結果
7.33. ハードリンクを作成するルール
7.34. -aオプション指定時のromfs-inst.shの構文
7.35. 文字列を追記するルール
7.36. -eオプション指定時のromfs-inst.shの構文
7.37. プロダクトディレクトリの作成
7.38. アプリケーションプログラム用ディレクトリの追加
7.39. hello.c
7.40. Makefile
7.41. プロダクトディレクトリのmakefileにアプリケーションプログラム用のディレクトリを追加
7.42. varディレクトリの追加
7.43. 不要なファイルの削除
7.44. プロダクトディレクトリのコピー
7.45. プロダクト設定
7.46. 新しく追加された項目の設定例
7.47. 不要なファイルの削除
7.48. 古いバージョンのLinuxカーネルへのシンボリックリンクの削除
7.49. 新しいバージョンのLinuxカーネルへのシンボリックリンクの作成
7.50. 新しく追加された項目の設定例
8.1. Armadillo-440の標準イメージの/etc/config/rc.local
8.2. /etc/config/rc.localファイルを変更しフラッシュメモリに保存する
8.3. /etc/rc.dディレクトリにシンボリックリンクを追加するための変更箇所
8.4. crontabファイルのフォーマット
8.5. crondを起動する初期化スクリプト
8.6. Armadillo-440のストレージ使用量
8.7. Armadillo-440の各ディレクトリのサイズ使用量
8.8. ルートファイルシステムのブロック数と inode 数の確認
8.9. ルートファイルシステムサイズの手動設定
8.10. 手動で設定したルートファイルシステムのストレージ使用量
8.11. tmpfs をマウントする
8.12. マウントされているディレクトリの確認
8.13. USBメモリが接続された時にスクリプトを実行するudevルール(z99_usb_image_update.rules)
8.14. udevdの再起動をおこなうコマンド
8.15. USBメモリ内のイメージファイルでフラッシュメモリをアップデートするスクリプト(usb_image_update.sh)
8.16. 毎日4:00に処理を実行するcrontab
8.17. Webサーバーにあるイメージファイルでフラッシュメモリをアップデートするスクリプト(web_image_update.sh)