12ステップで作る組み込みOS自作入門をVMイメージを使って動かす(for macOS Sierra 10.12.6)
macでクロスコンパイラを入れるのに厳しさを感じたので配布されているVMイメージを用いてssh接続することにした。ただ、ところどころ詰まったところがあるのでそのメモ。
環境
必要なもの
シリアルケーブルは物によっては認識しないことがあるので、iBUFFALO USBシリアルケーブル BSUSRC0605BS をオススメする。
準備
まずはVirtualBoxとVMイメージをダウンロードする
VirtualBoxを起動して、File -> Import Appliance でVMイメージを読み込む(1-2分程度かかる)
右クリック-> start -> normal startでCentOS(ゲストOS)の中に入って、rootでログインする。 パスワードはVMイメージを配布しているサイトを参照すること。
あらかじめ
# yum -y update
をしておくようにする。
ホストOSとゲストOS間の共有フォルダの作成(飛ばしても良い)
(参考) https://qiita.com/wslife/items/946acbf7b0f043887e64
まず、共有フォルダをゲストOSにマウントするのに必要なGuest Additionsをインストールする。
# yum -y install epel-release # yum -y groupinstall "Development Tools" # yum -y install dkms bzip2 gcc make kernel-devel kernel-headers
実行しているCentOSのウィンドウを選択している状態で、メニューバー -> デバイス -> Guest Additional CD イメージ挿入 をクリックする。何も反応がないがイメージ挿入は成功している。 その後、Guest Additionsをマウントしてインストールする。
# mkdir -p /mnt/cdrom # mount -r /dev/cdrom /mnt/cdrom # sh /mnt/cdrom/VBoxLinuxAdditions.run
次に、VirtualBoxで共有フォルダを指定する。VirtualBoxのCentOSのイメージを右クリック -> settings -> Shared Folders の右上の+をクリックして、ホストOSで共有したいフォルダーをFolder Pathに指定する。 また、Auto-mountとMake Permanent(もしあれば)にチェックを入れる。CentOSを一度シャットダウンして、もう一度起動すると、/media/sf_(フォルダ名) に共有フォルダがマウントされているはず。CentOS側でrebootを打ち込んだだけでは設定は反映されないので、VirtualBox側でシャットダウンしてから再起動する必要がある。
もしマウントされていない場合には yum -y update
をすると解決することがある。
ゲストOSにマイコンを認識させる
まずはMac(ホストOS)でシリアルケーブルが認識されているか確認する。 適当にシリアルケーブルを抜き差しする前後で/dev以下のディレクトリが変化するかどうかを見ればいいと思う。
先ほど同様にVirtualBoxのCentOSのイメージを右クリック -> Settings -> Ports -> USBを選択し、右上の+をクリックしてデバイスを追加する。その後、念のために一度VirtualBox側でCentOSをシャットダウンしてもう一度起動する。
ゲストOSで、/dev/serial 以下にファイルが生成されていれば成功。自分の環境では、/dev/serial/by-id/usb-FTDI_USB_HS_SERIAL_CONVERTER_FT1S8XCY-if00-port0がデバイスファイルとなった。
Hello World
ここまできてやっとHello Worldに取りかかれる。今回は環境構築が目的なのでスクリプトは自分で打ち込まずに、VMイメージ内に入っているものを用いる。
まず、本に合わせてディレクトリを少し変更したりコンパイルしたりする。
# cd /home/user/osbook_03 # mkdir tools # cp ../h8write.c tools/ # cd tools # gcc h8write.c -o h8write
次にMakefileを環境に合わせて書き換える。
# cd /home/user/osbook_03/01/bootload # vim Makefile
H8WRITE_SERDEV = /dev/cuaa0となっている部分を、自分の環境のデバイスファイルのパスに書き換える。そうすることで、make writeが正しく機能するようになる。
マイコンが書き込み可能になっていること(3番だけ下げる)、デバイスファイルが存在していることを確認した上で、01ディレクトリ内でmake writeと打ち込む。これで書き込みが成功するはず。
H8/3069F is ready! 2002/5/20 Yukio Mituiwa. writing WARNING:This Line dosen't start with"S". Address Size seems wrong WARNING:This Line dosen't start with"S". Address Size seems wrong ..... EEPROM Writing is successed.
というようなメッセージが出たら成功である。
FATAL:Can not open the line to the H8/OS system.
FATAL:Can not to set line speed and put Query mode.
みたいなエラーが出ることがあるが、リセットボタンを押してから何回か繰り返すと上手くいく。書き込み可能になっているか、また、/dev/serial以下にディレクトリがあるか確認してからリトライするとよい。それでもダメな場合はシリアルケーブルの相性を疑おう。
ここまで成功したら、端末エミュレータを通してHello Worldを表示できる。今回はデフォルトで入っているscreenを用いる。 マイコンのスイッチを書き込みモード(1と3を上げる、2と4を下げる)にした後に次のコマンドを打ち込む。9600はp46の表1.2のボーレートである。
# screen /dev/(個人の環境のデバイスファイル) 9600
enterでバッファーを適宜出力すると、リセットボタンを押すたびにHello Worldが表示される。 (screenを終了するのはcontrol + aを押してk)
なぜかrootではなくuserでやると書き込みが上手くいかなかった、、、
ホストOSにssh接続できるようにする
(参考) http://tenten0213.hatenablog.com/entry/2013/10/15/232600 https://qiita.com/uhooi/items/ab845b06b136e623e51d
CentOSのイメージを右クリック-> settings -> Network -> Adapter 1 -> Advanced -> Port Forwardingをクリックする。 右上の+をクリックして追加して、Host Portを2222(任意)、Guest Portを22(sshのデフォルトのポート番号)に設定する。
これでVirtualBox側の設定は終了で、ゲストOSの設定をする。 OSイメージを実行してrootでログインし、sshのインストールを下記のコマンドで行う。
# yum install -y openssh openssh-server
次にsshの設定ファイルを修正してrootでログインできるようにする。
# vim /etc/ssh/sshd_config
ssh_configではないので注意する。PermitRootLoginをyesに書き換えて保存。
最後にsshサーバーを起動する
# service sshd start
CentOS6なので systemctlではなくserviceを用いる。
これでホストOSからssh接続できるようになる。以下を実行して、VMイメージのrootのパスワードを入力すればよい。
$ ssh -p 2222 root@localhost Password: