ZYBOの追加のUART0をpeta linuxから使う

はじめに

ZYBOのUART1はUSB側につながっていて、パソコンと接続すれば簡単にシリアル通信ができるようになっています。しかし、パソコンではなく外部の機器とシリアル通信をしたかったため、使われていないUART0を有効にしました。

試行錯誤した結果を残しておきます。

 

petalinuxをビルドするために開発環境はlinuxを使いました。

環境の都合でCentOSでやりましたが、特に理由がなければArchLinuxやUbuntuなど一般的なものをお勧めします。

 

ZYBOのUARTの種類

最初にUARTの種類について確認します。

ZYBOのUARTにはいくつか種類があります。

①PS側に実装されているUART (UART0, UART1)

f:id:tokunn:20171130134909p:plain

最初からPS側にUARTが2つついています。

UART1は標準で有効で、USBに変換され UART/JTAG USB portに接続されています。なので、パソコンにUSBでつなぐだけで簡単に使えます。Linuxからは/dev/ttyPS0として認識されます。

 

UART0は存在はしていますが、使用するためにはPLをいじったりdtsをいじったりなど軽く設定が必要です。今回はこのUART0を有効にしてLinuxで/dev/ttyPS1として認識させるまでの説明をします。

②PL側にIPを張り付けて作るUART(いくつでも追加可能)

f:id:tokunn:20171130134917p:plain

標準で用意されているUARTは上記の2つだけですが、PL側にUartliteやUART16550を張り付けることによっていくらでもUARTポートを増やすことができます。こちらの方法は今回は使いませんでした。3ポート以上必要な場合にはこれを使うことになります。

 

いくつか種類がありますが、これらの中から必要に応じて使うことになります。

それではUART0をLinuxで使うために設定を始めていきましょう。

 

UART0を外部に出す(vivadoでの操作)

f:id:tokunn:20171130134914p:plain

標準では外部に接続されていないUART0をMIOの任意のポートに接続します。

MIOは外部に接続できるピンヘッダのPmodの一つです。しかし、他のPmod(JAからJE)がPL側に接続されているのに対して、MIO(JF)はPS側に接続されているという違いがあります。このため、MIOはPS側から簡単に使うことができます。

 

vivadoでの手順は以下のようになります。プロジェクトの作成などは省略します。

①Create Block Design

②Add IPからZYNQ7 Processing Systemを追加してRun Block Automationを実行。

f:id:tokunn:20171130141210p:plain

③ZYNQのブロックをダブルクリックしてRe-customize IPを開く。

f:id:tokunn:20171130141357p:plain

④左のPage NavigatorのMIO Configrationを選択。

⑤UART0にチェックを入れて、任意のMIOポートを指定(画像ではMIO10とMIO11を指定)。OKを押して閉じる。

f:id:tokunn:20171130141614p:plain

Ethernetにつなぐ場合には、ここでPeripheral I/O PinsタブでEthernet0->MDIOでMDIOを選択する必要があるようです。参考: hiro99ma blog: [zybo]PetaLinux (9) 

⑥ZYNQブロックの右側のFCLK_CLK0を左側のM_AXI_GP0_ACLKに接続。

f:id:tokunn:20171130141738p:plain

⑦保存してHDLラッパを作成して、Generate Bitstreamまで実行。

⑧File -> Export -> Export Hardware...を選択し、Include bitstreamのチェックを入れて出力。

ハードウェアは

<プロジェクトルート>/プロジェクト名.sdk/

の下に出力されます。

 

ここまででvivadoでの操作は終了です。

これでUART0が外部ポートに接続されました。

 

petalinuxのビルド

UART0をベアメタルアプリケーションから使うこともできますが、今回はpeta linuxから使用します。

まずは普通にpetalinuxをビルドします。

 

環境はCentOS + zshを使いました。CentOSでのビルドはあまりお勧めしません。

 

手順は以下のようになります。

①petalinuxプロジェクトの作成

$ petalinux-create -t project --template zynq -n project_name

project_nameは適宜置き換えてください。

②ハードウェアのインポートとコンフィギュレーション

$ cd project_name
$ petalinux-config --get-hw-description=path_to_hw
$ petalinux-config -c rootfs

path_to_hwは先ほどvivadoで出力したハードウェアがあるディレクトリ名に置き換えてください。

設定画面は特に何もなければそのままExitしてください。

③ビルド

$ petalinux-build

ビルドを行います。時間がかかります。

これでビルドは完了です。

 

これで通常のpetalinuxは起動しますが、今回はdtsを編集して/dev/ttyPS1として認識させます。

 

バイスツリーの編集

UART0を/dev/ttyPS1として認識させるために、デバイスツリーを編集します。正攻法ではない気しかしません。

今回ビルドしたdtb

<プロジェクトフォルダ>/image/linux/system.dtb

にあります。

 これをdtcで.dtsに戻して編集したのちに.dtbに戻します。

 

手順は下記のようになります。

①フォルダに移動

$ cd image/linux/

②dtsに変換する。

$ dtc -I dtb -O dts -o system.dts system.dtb

これでsystem.dtsというファイルが生成されます。

これを編集します。

③dtsに追記する。

system.dtsの上のほうにあるaliasesに追記します。

aliases {
serial0 = "/amba/serial@e0001000";
serial1 = "/amba/serial@e0000000";  // <==これを追記
ethernet0 = "/amba/ethernet@e000b000";
spi0 = "/amba/spi@e000d000";
};

 

下のほうにあるserial@0000000に追記します。下記のようになるように編集してください。

serial@e0000000 {
compatible = "xlnx,xuartps", "cdns,uart-r1p8";
status = "okay";
clocks = <0x1 0x17 0x1 0x28>;
clock-names = "uart_clk", "pclk";
reg = <0xe0000000 0x1000>;
interrupts = <0x0 0x1b 0x4>;
device_type = "serial";
port-number = <0x1>;
};

dtbに変換する。

 $ dtc -I dts -O dtb -o system.dtb system.dts

これでデバイスツリーの編集は完了しました。

 

起動

以上ですべての設定手順は終了です。

最後にpackageを実行してJTAG経由で起動します。

$ petalinux-package --prebuilt --force
$ cp images/linux/design_1_wrapper.bit pre-built/linux/implementation/download.bit
$ petalinux-boot --jtag --prebuilt 3

jtag経由(USB経由)でpetalinuxをダウンロードして起動します。

もし、jtag経由ではなくSDカードから起動する場合には、次のように実行します。

$ petalinux-package --boot --fsbl images/linux/zynq-fsbl.elf \
--fpga images/linux/design_1_wrapper.bit -u-boot --force

あとは、BOOT.binとimage.ubをSDカードにコピーします。

 

jtagでもsdでも、しばらく待つと/dev/ttyUSB?として認識されるUART0のシリアルコンソールからログインできます。

$ sudo screen /dev/ttyUSB0 115200

/dev/ttyUSB0は適宜自分の環境に置き換えてください。

petalinuxはユーザー名root/パスワードrootでログインできます。

ログインしたのちに/dev/ttyPS0と/dev/ttyPS1があることを確認してください。

/dev/ttyPS1に書き込むと接続したMIOポートから9600でシリアルが出力されます。

$ for i in {0..1000}; do echo "hello $i" > /dev/ttyPS1; done

 

さいごに

今回はUART0をpetalinuxで使用する方法を確認しました。

わからないことがありましたらご質問ください。

twitter.com

KOSENセキュリティコンテスト2017 Write-Up

2017/10/21から10/22までのKOSENセキュリティコンテスト2017に即席チーム074m4K053nで参加してきました。

チームは経験者2人+未経験者2人のつもりだったですが、前者の1人が休日開講の必合格科目に出るために3人になってしまいました。

 

結果は2600点で全体7位/会場1位でした。忙しい中先生に時間を割いていただき残念な結果で終わらせることはできない状況だったので、なんとかなったかなと安心してます。

f:id:tokunn:20171023113926p:plain

 

01 フラグを答えろ - Binary 100

a.outが与えられます。

stringsで見てもSCKOSEN{Hとしか出てこないので、ltraceで実行して共有ライブラリの関数呼び出しを探します。

f:id:tokunn:20171023115224p:plain

入力した文字列とフラグをstrcmpで比較していました。そのまま取り出してSCKOSEN{h1dden_f1ag}です。

 

03 ボスを倒せ - Binary 200

ncするとゲームが始まります。

自分の名前を入力するときに0x10文字を超えて入れるとボスと自分の体力を書き換えられるみたいなのでボスの体力が負になるように

$ python -c 'print("A"*0x10 + "z"*4 + chr(0x1ff)*4)'

を入力してフラグが与えられました。

ボスの体力をchr(0x1ff)に決めたのには意味はないです。値が大きければいいかなと。

 

06 解凍して回答せよ - Crypto 100

zipが与えられるので解凍して2枚の画像をxorして回答しました。

うさみみハリケーンについてるソフトでxorしました。

gimpでできるって聞いたんですけど、どうやればgimpでできるのかワカラナイデス。

 

07 簡単な符号化 - Crypto 100

問題を忘れたのですが、確かbase64エンコードされたデータが与えられるのででコードすればフラグが得られます。

発想力がないので思いつくのにとても時間を要しました。

 

11 君(脆弱性)の名は - Misc 100

CVE-2017-13088で調べたら出てきたKRACK AttacksとKRACKsをとりあえず入力しました。

最近話題だったらしいですけど全然知りませんでした。

WPA2のお話で、影響は「暗号化されたデータの盗聴」と「通信内容の改ざん」だそうです。暗号化アルゴリズムではなく管理プロトコルの問題のようです。

ArchLinuxはwpa_supplicantとhostapdに影響アリ。

 

12 便利なプロトコル - Misc 100

「便利なプロトコル 1998 dhcp」で検索したら「洗濯バサミ DHCP による IP アドレスの管理手法」がでてきました。とても画期的なアイディアです。フラグは英語のManagement of IP numbers by peg-dhcpのスペースをアンダーバーに置き換えたものだったと記憶しています。

相変わらず発想力がないので、今回解くのに最も時間がかかった問題になってしまいました。

 

15 寝坊気味のコンピュータ - Network 100

pcap-ngファイルが与えられるのでwiresharkで開きました。

Wake On LANMACのところにフラグが分割されて入っているので、Follow UDP Streamで見ながらフラグを繋げました。

stringsコマンドで見たほうが圧倒的に早かったようです。

 

16 ログインしたいんだ! - Network 100

こちらもpcap-ngファイルが与えられるのでwiresharkで開きます。

httpでフィルタをかけると、401 Unauthorizedで跳ね返されてるのにめげずにGETし続けてるパケットたちが出てきます。

最後には200 OKになっているので、それに対応するGETパケットのAuthorizationを見ると、admin:SCKOSEN{basic_is_unsecure}と書いてあるのでこれをサブミット。

 

17 ファイル送信pcap - Network 200

与えられたpcapファイルをwiresharkで開きます。

httpでフィルタするとLenna.pngとlock.zipを送信していることがわかります。

File -> Export Objects -> HTTPでやり取りされているデータを保存します。

 

保存したデータをzipinfoで確認するとLenna.pngとflag.txtがパスワード付きZIPで圧縮されていることがわかります。

パスワードはわかりませんが、ZIPの中にあるデータの片方のデータが手元にあれば既知平文攻撃でパスワードを解除できます。

今回の場合はLenna.pngを既知の平文としてpkcrackします。

$ zip Lenna.png

$ pkcrack -C lock.zip -c Lenna.png -p Lenna.png -P Lenna.zip -d target.zip

$ unzip target.zip

出てきたflag.txtに書かれているフラグをサブミット。

 

20 Web1  - Web 200

サイトにアクセスしてソースコードからjsを見るとアンダーバーばっかの読みづらそうなjavascriptが与えられます。

読みやすいように一晩かけて変数名を置き換えました。

数字の大群を文字にして、アンダーバーに変換してることがわかりました。

アンダーバーに変換してるとこを削除して、ページを読み込みなおして、開発者ツールのコンソールから文字列が保存されているであろう変数名__をたたくとフラグらしき文字列が登場してサブミット。

 

K2 通信を解析しろ - KoH 30

最後まで解けてはないです。

pcapファイルが与えられるので、wiresharkで開いて何も考えずにhttpでフィルタをかけると80番ポートにアクセスしたら443へリダイレクトさせられてるのがわかります。

443にアクセスしたパケットを見ると、Webページのbodyにフラグが書いてあったようです。それをサブミット。ボーナスフラグなようです。

 

よくわかんないのでポートスキャンして(何回かやってるとポートノックしたことになるのかな?)空いてたポート(443)にアクセスしてバイナリファイルを落としてきました。

自分のローカル環境で実行してみると、8081番ポートで待ち受けて何かしているようです。

ltraceを使って実行して子プロセスの動作を追いかけます。

$ ltrace -f ./a.out

するとKSCという文字列と送られてきた文字列の冒頭を比較していることがわかりました。そしてshという文字列も見えたのでKSCの後にコマンドを続ければ実行できるのでは?と予測しました。

実際にncでつないでKSC pwdと送ると/rootと返ってきました。

/home/ubuntu/をlsします。

 

KSC ls /home/ubuntu -l
total 864
-rw-rw-r-- 1 ubuntu ubuntu 631 Oct 22 09:37 aaa
-rw-rw-r-- 1 ubuntu ubuntu 2586 Oct 21 17:40 a.c
-rwxrwxr-x 1 ubuntu ubuntu 14280 Oct 22 08:51 a.out
-rw-rw-r-- 1 ubuntu ubuntu 252 Oct 21 14:17 id
-rw-rw-r-- 1 ubuntu ubuntu 766354 Oct 22 09:12 index.html
-rw-rw-r-- 1 ubuntu ubuntu 581 Oct 21 16:52 map
-rw------- 1 ubuntu ubuntu 62954 Oct 21 17:12 nohup.out
-rw-rw-r-- 1 ubuntu ubuntu 101 Oct 21 17:59 out
drwxrwxr-x 2 ubuntu ubuntu 4096 Oct 20 20:34 stage-1
-rwxrwxr-x 1 ubuntu ubuntu 116 Oct 21 17:22 startup.sh

 

なんかいっぱいあって訳が分かりません。

/home/ubuntu/stage-1/instは

 

KSC cat /home/ubuntu/stage-1/inst
sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N PASSED
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
sudo iptables -A INPUT -j KNOCKING
sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
sudo iptables -A GATE1 -j DROP
sudo iptables -A GATE2 -m recent --name AUTH1 --remove
sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
sudo iptables -A GATE2 -j GATE1
sudo iptables -A PASSED -m recent --name AUTH2 --remove
sudo iptables -A PASSED -p tcp --dport 443 -j ACCEPT
sudo iptables -A PASSED -j GATE1
sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH2 -j PASSED
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
sudo iptables -A KNOCKING -j GATE1

 

iptablesわかりません。

/home/ubuntu/idにはチーム名がいっぱい書いてありました。

/home/ubuntu/nohup.outには21日の16時から17時12分までのログっぽいのがありました。

ちなみに、insecureの方々がフラグに成功したのは17時14分でした。何か関係があるんですかね。

 

という感じで訳の分からないままタイムアップで終了しました。

 

ログ

チームのログです。

 

10/22 9:26:12 074m4K053n tokunn tokunnが便利なプロトコルを攻略 100
10/22 9:00:50 074m4K053n tokunn tokunnがWeb1を攻略 200
10/22 9:00:26 074m4K053n tokunn tokunnが通信を解析しろのボーナス0を攻略 100
10/21 17:51:10 074m4K053n rainmaker rainmakerがWeak RSA2を攻略 300
10/21 17:07:18 074m4K053n nebula nebulaがWeb2を攻略 200
10/21 16:16:10 074m4K053n tokunn tokunnがファイル送信pcapを攻略 200
10/21 15:46:17 074m4K053n tokunn tokunnがボスを倒せを攻略 200
10/21 14:50:12 074m4K053n rainmaker rainmakerがWeak RSA1を攻略 200
10/21 14:47:28 074m4K053n tokunn tokunnが簡単な符号化を攻略 100
10/21 14:08:00 074m4K053n tokunn tokunnが解凍して解答せよを攻略 100
10/21 13:48:53 074m4K053n rainmaker rainmakerがファイル名を探せを攻略 100
10/21 13:31:13 074m4K053n tokunn tokunnがログインしたいんだ!を攻略 100
10/21 13:24:38 074m4K053n tokunn tokunnが君(脆弱性)の名はを攻略 100
10/21 13:19:12 074m4K053n tokunn tokunnが寝坊気味のコンピュータを攻略 100
10/21 13:10:32 074m4K053n rainmaker rainmakerが諜報機関は基本?を攻略 100
10/21 13:09:41 074m4K053n rainmaker rainmakerが素数を数えろを攻略 100
10/21 13:07:14 074m4K053n nebula nebulaがフラグを答えろを攻略 100
10/21 13:01:38 074m4K053n nebula nebulaがログインせよを攻略 100
10/21 13:00:22 074m4K053n rainmaker rainmakerがサンプルを攻略 100

さいごに

昨年が同率最下位みたいな感じで今年こそは抜けだそうと思ってたのですが、1年間である程度は解けるようになっていたのでよかったです。

CTFはじめてのお二方もそうともは思わせないくらいに問題を解いてくれたりアドバイスをくれたので高専生のベースの強さも感じました。まともにチームでやるのは初めてだったのですが、チーム戦はとてもいいですね。

自分たちの苦手なジャンルというものも分かったので、対策しながらSECCON 2017 オンライン予選に備えます。

ありがとうございました。

RaspberryPiで作る自作ドライブレコーダ

Raspberry Pi 3 とPi Cameraを使ってドライブレコーダを作ったのでその記録です。

こちらのサイトをほぼそのままやりました。

 

大まかな流れとしては下記のとおりです。

  • OSにはArchLinuxを使う
  • raspivid(yaourtで入ったハズ)で画像の取り込みからデータの出力まで一発でできる
  • 録画データは10分ごとに保存して、容量が80%を超えたら古いファイルから削除していく(これらの管理はPythonスクリプトで行う)
  • Pythonスクリプトをsystemdに登録して自動起動させる

あとは車に固定して、シガーソケットから5Vを持ってきてつなげば完成です。

エンジンをかけると電源が供給されて、録画が開始されます。

エンジンを切ればシャットダウンとか関係なく録画中にぶち切れます。あまりよろしくないかもしれないのですが、今のところ問題ないのでそのままです。

(気になる場合は、モバイルバッテリーを間に噛ませて、シガーソケットの電源をどこかのピンで監視しておいてシャットダウンすればなんとかなるかな?)

 

固定に関しては、私は助手席側のフロントガラスの上に100均の吸盤で取り付けています。箱はボール紙で作りました。

法的には、フロントガラスへの貼付物は上から20%以内で視界を妨げなければいいらしいという記述を見たような気がします。ご自分でお調べくださいMase。

 

使ったソースコードgithubにアップロードしました。(こちら

Pythonスクリプトとサービスファイルです。

フロントとリア両方ありますが、フロントしか動作確認していません。

 

簡単ですが以上になります。

 

BeagleBoneBlack(ArchLinux)の起動

目的

今回はBeagleBoneBlackについてです。
前回作成したArchLinuxのSDカードを使ってBeagleBoneBlackを起動していきます。
起動したあと、便利に使うための説明などをしていきたいと思います。

方法

では、ここからはBeagleBoneBlackの起動を行っていきます。

BeagleBoneBlackはディスプレイにマイクロHDMIケーブルを使うのですが、高いので今回は使用せずに、ディスプレイなしでBeagleBoneBlackのセットアップを行います。 方法は、同じネットワークへ接続してsshで繋ぐ方法と、USB-Serialコンバータを使用してシリアルコンソールでログインする方法、クロスケーブルを使う方法があります。 今回は1つ目の、ネットワークごしにログインします。この方法ではIPアドレスがわからなくても、sshで接続することができます。

2015/7/30 追記
USB-Serialコンバータを使用してシリアルコンソールでログインする方法を追記しました。こちら

準備

まずは下記のものを用意してください

  1. BeagleBoneBlack (Rev C)
  2. ArchLinuxがインストールされたマイクロSDカード
  3. LANケーブル
  4. MiniUSB-B to USB-A ケーブル
  5. ネットワークに接続したLinuxマシン

(1) BeagleBoneBlack には種類が複数ありますが、現在最新のRev Cを使用します。

(2) BeagleBoneBlackはRaspberryPi B+などと同様にマイクロSDカードを使用します。 こちらの通りインストールをしておいてください。
内部ストレージもありますが、インストールにはSDカードを使用しないとできません。 内部ストレージの方が早いので、SDで起動した後に内部ストレージへインストールをお勧めします。

(3) BeagleBoneBlackをネットワークに接続するためにLANケーブルを使用します。有線でないと設定できません。

(4) BeagleBoneBlackはMiniBで電源供給を行います。 RaspberryPiと異なり、設定をするとこのポートを使って(ネットワークケーブルを使用せずに)パソコンからログインできるようになります。

BeagleBoneBlackの起動

まず、こちらで作成したSDカードをBeagleBoneBlackに差し込んでください。

ネットワークへ接続するために、有線LANでルータとBeagleBoneBlackを接続してください。

MiniUSBケーブルでBeagleBoneBlackとパソコンをつなぐと、電源が供給されて、BeagleBoneBlackが起動します。 しかし、デフォルトではeMMC(内蔵メモリ)に入っているDebianが起動してしまうので、SDカードから起動させるために、SDカードを差し込んだ口側にあるボタンを押しながら、USBケーブルを接続してください。

青いLEDが何度か点滅したら、ボタンから手を話しても大丈夫です。
しばらく待つと、LEDの点滅が一定周期になって起動したことがわかります。

起動には20~30秒ほどかかります。
これで起動は完了です。

BeagleBoneBlackへ接続

次に、用意しておいたLinuxマシンからBeagleBoneBlackへ接続します。 ここからは、Linuxマシンでの作業です。

LinuxマシンとBeagleBoneBlackは同じネットワークへ接続しておいてください。

BeagleBoneBlackへはsshを使って接続します。sshは、
$ ssh username@ipaddress
のように指定して接続します。

今回インストールしたArchLinuxのusernameはrootに設定されています。

では、ipaddressはどのようにしたらわかるのでしょうか?
インストールしたArchLinuxはIPアドレスはDHCPサーバから動的に取得するように設定されているため、IPアドレスがわかりません。

IPアドレスを探す

このような場合にはnmapを使用してIPアドレスを調べます。

nmapはポートスキャンなどに使われるネットワークツールです。 今回は、ネットワーク上に存在するすべてのマシンへパケットを送信して、SSH接続を待ち受けている(22番ポートが開いている)マシンを探します。
場合によっては、ネットワーク上に存在する他の人に迷惑をかけてしまうので、閉じた環境で実施してください。

まずは、BeagleBoneBlackを探す範囲を決定します。

LinuxマシンのIPアドレスをifconfigで取得します。 同じネットワークに接続しているため、BeagleBoneBlackのアドレスの範囲を推測することができます。

                            $ ifconfig
                            wlp2s0: flags=4163 UP,BROADCAST,RUNNING,MULTICAST   mtu 1500
                                    inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255
                                    inet6 2408:f3:447d:0:3fa5:eb78:c809:d96  prefixlen 64  scopeid 0x0 global
                                    inet6 fe80::f2ab:fd9f:60ae:e021  prefixlen 64  scopeid 0x20 link
                                    ether 40:25:c2:f5:53:2c  txqueuelen 1000  (Ethernet)
                                    RX packets 7864  bytes 3785892 (3.6 MiB)
                                    RX errors 0  dropped 0  overruns 0  frame 0
                                    TX packets 4651  bytes 794902 (776.2 KiB)
                                    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                        

私の環境では、上記のように表示されました。inetのうしろにある192.18.1.5がIPアドレスです。

環境によって、IPアドレスや、デバイス名(wlp2s0 や enp4s0 eth0)は変わりますが、IPアドレスを見つけてください。

BeagleBoneBlackも同じネットワーク上にいるため、さきほど取得したIP:192.168.1.5より、BeagleBoneBlackのIPアドレスは192.168.1.1 〜 192.168.1.255であることがわかります。

ここまで推測できたのでnmapを使って、推測した範囲内のマシン全てにパケットを送ります。
192.168.1.1 〜 192.168.1.255の範囲を指定するためには、192.168.1.1-255と打ち込みます。

IPアドレスは適宜置き換えてください。

                            $ nmap -p22 192.168.1.1-255
                        

しかし、たくさんのマシンが表示されて22番ポートが開いているマシンがわかりづらいので、grepに流し込んでopenのものだけ表示させます。

                            $ nmap -p22 192.168.1.1-255 | grep -i -B3 open
                            Nmap scan report for 192.168.1.6
                            Host is up (0.011s latency).
                            PORT    STATE SERVICE
                            22/tcp open ssh
                        

私の環境では、上記のように表示されました。 forの後ろにあるのが、22番ポートが開いているマシンのIPアドレスです。

これで、BeagleBoneBlack(だと思われるマシン)のIPアドレスがわかりました。 もし複数表示された場合は、それぞれのマシンにssh接続を試してみてください。 正しいマシンにのみログインできるはずです。 (BeagleBoneBlackが複数ある場合は別ですが)

SSHで接続する

BeagleBoneBlackのIPアドレスがわかったため、これでやっと接続できます。

$ ssh username@ipaddress
のusrenameをroot、ipaddressを先ほど発見したIPアドレスに置き換えて接続します。

                            $ ssh root@192.168.1.6
                        

「The authenticity of host '192.168.1.* (192.168.1.*)' can't be established.
ECDSA key fingerprint is ********************::.
Are you sure you want to continue connecting (yes/no)?」
と聞かれたら、yesと入力してください。
要は「これまでに接続したことがないけど信頼できるシステムなの?」ということです。

                            Are you sure you want to continue connecting (yes/no)?  yes
                        

もし、「Warning: Permanently added '192.168.1.*' (ECDSA) to the list of known hosts. ssh_packet_read: Connection closed」と言われて接続できない場合は、以前に同じIPアドレスのホストに接続したことがあるようです。 ホストが変わったため、次のように入力してそのIPアドレスのsshのリストを初期化してみてください。

ipaddressは適宜置き換えてください。

                            $ ssh-keygen -R ipaddress
                        

うまく接続できると、「root@192.168.1.6's password:」とパスワードの入力を求められます。 デフォルトでrootのパスワードは「root」になっているため、rootと入力してください。

                            root@192.168.1.6's password: root
                        

コンソールの左端が、「[root@alarm ~]#」になったら接続成功です。

                            [root@alarm ~]#
                        

BeagleBoneBlackへ接続する(シリアルコンソール)

sshではなく、シリアルコンソールで接続する方法についてです。この方法では、sshが起動していない場合、ネットワークがない場合でも接続できます。

まずは、仮想コンソールscreenをインストールします。

                            $ sudo pacman -Sy screen
                        

次にUSB-SerialコンバータとBeagleBoneBlackを接続します。

次のように接続してください。

BeagleBoneBlackUSB-Serialコンバータ
LANポート側から1つ目 GND
LANポート側から4つ目 TX (OUTPUT)
LANポート側から5つ目 RX (INPUT)

LinuxマシンにUSB-Serialコンバータを接続して起動します。

lsを使ってUSB-Serialコンバータのデバイス名をチェックします。

                            $ ls /dev/ttyUSB* /dev/ttyACM*
                        

私の環境では、/dev/ttyUSB0として認識されました。

下記のコマンドを打って接続します。デバイス名は各自置き換えてください。

                            $ sudo screen /dev/ttyUSB0 115200
                        

これで接続できます。

終了するときはctrl+a k yと3つ順に入力してください。

BeagleBoneBlack(ArchLinux)の設定へ続く

おわりに

長くなってしまったため、分割して次回に続きます。
わからないことなどがありましたら、ご質問だくさい。

2015/6/30

 

 

 

ArchLinuxでwi-fiアクセスポイント作成

目的

ArchLinuxをインストールしたRaspberryPi・BeagleBoneBlackをwi-fiのアクセスポイントにして、他の機器を接続させます。

準備

まずは下記のものを用意してください

  1. BeagleBoneBlack or RaspberryPi
  2. 無線LAN USBアダプタ

起動して、ログインしておいてください。

hostapdのインストール・設定

ここからは、マイコンボードでの作業になります。

インストール

                        # Ubuntuの場合
                        $ sudo apt-get install hostapd
                        # ArchLinuxの場合
                        $ sudo pacman -Sy hostapd
                    

設定

下記の内容で/etc/hostapd/hostapd.confとしてcurlで保存します。

                        interface=wlan0
                        ssid=arch_ap
                        hw_mode=g
                        channel=3
                        wpa=2
                        wpa_passphrase=temppwds
                        wpa_key_mgmt=WPA-PSK
                        rsn_pairwise=CCMP
                    
                        $ curl -O http://tokun.net/bookshelf/robot/hostapd.conf
                        $ cp hostapd.conf /etc/hostapd/
                    

次のようにして起動します。

                        $ hostapd /etc/hostapd/hostapd.conf
                        $ systemctl enable hostapd
                    

以上で設定は完了です。

dhcpdのインストール・設定

インストール

                        $ sudo pacman -Sy extra/dhcp
                    

設定

下記の内容で/etc/dhcpd.confとしてcurlで保存します。

                        option subnet-mask 255.255.255.0;
                        option routers 10.0.0.0;
                        subnet 10.0.0.0 netmask 255.255.255.0 {
                            range 10.0.0.1 10.0.0.10;
                        }
                    
                        $ curl -O http://tokun.net/bookshelf/robot/dhcpd.conf
                        $ cp dhcpd.conf /etc/dhcpd.conf
                    

次のようにして起動します。

                        $ dhcpd
                    

bridge-utilsのインストール・設定

インストール

                        $ sudo pacman -Sy bridge-utils
                    

設定

下記のコマンドを実行してブリッジを作成します。

                        $ brctl addbr bridge_name
                        $ brctl addif bridge_name wlan0
                        $ brctl show
                    

下記のコマンドを実行してブリッジをupにします。

                        $ ip link set up bridge_name
                    

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/29

 

 

 

BeagleBoneBlack(ArchLinux)の設定

BeagleBoneBlack(ArchLinux)の起動の続きです。

方法

では、ここからはBeagleBoneBlackの設定を行っていきます。

アップデート

まずはOSのアップデートを行います。pacmanを実行してください。

                        $ pacman -Syu
                    

:: Proceed with installation? [Y/n]と聞かれたら、yを入力してください。

                        :: Proceed with installation? [Y/n] y
                    

もし、-bash: pacman: command not foundと言われたら、それはSDカードから起動できていません。 こちら見ながら、もう一度起動しなおしてみてください。

アップデート完了までしばらくお待ちください。

固定IPの設定

今後はnmapを使って総当りアクセスをしないように固定IPを割り振って、一発でアクセスできるようにします。

一般的なネットワーク上の固定IPの方法はこちらを見て設定してください。 (Linuxの固定IP設定

USBでのSSH接続

これらの方法ではネットワークとルータが必要ですが、BeagleBoneBlackではさらにもうひとつアクセス方法を提供しています。

それは、電源供給に使用しているMiniUSBポートを使った接続です。(USB Ethernet)(USB 仮想LAN)

RaspberryPiでは、このポートは電源供給にしか使えませんが、BeagleBoneBlackはなんとこのポートを通じてSSH接続することができます。

しかし、デフォルトでは使用できないので使うための設定をしていきます。

usbネットワークインターフェースの有効化

まずは、usbのネットワークインターフェースを有効化します。

最初に、現在認識されているネットワークインターフェースをチェックし見ましょう。

                            $ ip link
                            1: lo: ..................
                            2: eth0: ...............
                        

loとeth0の2つが表示されると思います。 ここにusb0を追加することでusbをネットワークインターフェースとして使うことができるようになります。

usbネットワークインターフェースを有効にするために次のコマンドを実行してカーネルにg_etherを読み込ませます。 (gとetherの間はアンダーバー)

                            $ modprobe g_ether
                        

もう一度、認識されているネットワークインターフェースを確認してみましょう。

                            $ ip link
                            1: lo: .................
                            2: eth0: ...............
                            3: usb0: ..............
                        

usb0が追加されていれば成功です。

最後にip link upで有効になります。

                            $ ip link set up usb0
                        

ifconfigで確認してみましょう。

                            $ ifconfig usb0
                        

usb0の情報が表示されれば完了です。

自動設定スクリプトの作成

これらの操作は、再起動するとすべて初期化されてしまいます。

そのため、公式で永続的に設定する方法があるのですが、私の環境ではうまく動作しなかったため、ゴリ押しで起動するたびにこれらの操作を自動でするPythonスクリプトを組みます。

スクリプトは下記のようなものになっています。

                            #!/usr/bin/env python3
                            # -*- coding: UTF-8 -*-

                            import os, sys
                            import subprocess

                            #----- call_system() -----#
                            def call_system(cmd):
                                splitted_cmd = cmd.split()
                                subprocess.call(splitted_cmd)

                            #----- main() -----#
                            def main():
                                # Add IP Adress
                                cmd = "modprobe g_ether"
                                call_system(cmd)
                                cmd =" ip link set eth0 up"
                                call_system(cmd)
                                cmd = "ip link set usb0 up"
                                call_system(cmd)
                                cmd = "ip addr add 192.168.7.2/24 dev usb0"
                                call_system(cmd)

                            if __name__ == '__main__':
                                try:
                                    main()
                                except KeyboardInterrupt:
                                    print("\nCtrl+C - END")
                        

このファイルを/opt/bin/start_conf.pyとして保存してください。

startとconfの間はアンダーバー

                            $ mkdir -p /opt/bin/
                            $ cd /opt/bin/
                            $ pacman -S wget
                            $ wget http://tokun.net/bookshelf/robot/start_conf.py
                            $ chmod 755 start_conf.py
                            $ pacman -S python3
                        

次に、このスクリプトをsystemdを使って自動起動させます。

systemdに登録するためには、.serviceファイルを書きます。 今回は、別のスクリプトを起動させるだけなので、とても簡単なものになっています。

                            [Unit]
                            Description=Beagle Bone Configuration
                            After=local-fs.target

                            [Service]
                            Type=oneshot
                            ExesStart=/opt/bin/start_conf.py

                            [Install]
                            WantedBy=multi-user.target
                        

このファイルを/etc/systemd/system/start_conf.serviceとして保存してください。

startとconfの間はアンダーバー

                            $ cd /etc/systemd/system/
                            $ wget http://tokunn.net/bookshelf/robot/start_conf.service
                        

最後に、.serviceファイルをsystemdに登録します。

                            $ systemctl enable start_conf.service
                        

これで完了です。 次回起動時から自動で設定されるようになります。

                            $ reboot
                        

起動時にはこちら見ながら、起動してください。

SSH接続

では、実際に接続してみましょう。

BeagleBoneBlackをUSBで接続したLinuxマシンで、ifconfigを打ちます

                            $ ifconfig
                        

すると、普段より1つ多くデバイスが表示されると思います。 私の環境では、enp0s20u1i1と表示されました。 これが、BeagleBoneBlackです。

このデバイスを使って接続するのですが、IPアドレスが割り振られていないため接続できません。

そのため、まずはIPアドレスを割り当てます。

先ほど、BeagleBoneBlack側のIPを192.168.7.2/24に設定しました。Linuxマシン側は192.168.7.1/24を設定しましょう。

ip addrで割り当てます。devicenameは適宜先ほど調べてたデバイス名に置き換えてください。

                            $ sudo ip addr add 192.168.7.1/24 dev devicename
                        

割り当てたら、もう一度ifconfigで確認してみましょう。

                            $ ifconfig devicename
                        

192.168.7.1が割り当てられていることを確認したら、sshで接続します。

                            $ ssh root@192.168.7.2
                        

パスワードはいつも通りrootです。

コンソールの左端に[root@alarm ~]#と表示されたら成功です。

インターネット接続はできませんが、これでBeagleBoneBlackとパソコンさえあれば、ネットワークなしでも接続できるようになりました。

おわりに

いかがでしたでしょうか。
わからないことなどがありましたら、ご質問だくさい。

2015/7/1

 

 

 

2台のパソコンでROSを実行

目的

ROSでは、ノードとノードを分離させて別のパソコンで動作させることができます。 この方法を使えば、ロボット側のパソコンでroscoreや制御用ノードを実行して、ワークステーションでrvizを実行し指示を出すことができます。 同じwi-fiに接続すれば、自分は動くことなく制御やチェックが可能です。

準備

まずは下記のものを用意してください

  1. ROSがインストールされたマシン(ロボット側)
  2. ROSがインストールされたワークステーション

2台とも同じネットワークに接続してください。

設定

まずは、ロボット側のマシンでROSを起動します。

                    $ roscore
                

次に、ROS_MASTER_URI(ゆーあーるあい エルじゃなくてアイ)をroscoreを起動したマシンに設定します。

ロボット側のマシンでは環境変数をチェックすると、すでにlocalhostになっています。

                    $ export | grep ROS_MASTER_URI
                    ROS_MASTER_URI=http://localhost:11311
                

ROSは11311番ポートを使って通信してるようですね。

                    $ nmap -p11311 localhost
                    11311/tcp open unknown
                

開いていますね。

ワークステーションでも、roscoreを起動したマシン(今回はロボット側)のIPをROS_MASTER_URIに設定します。

roscoreを起動したマシンのIPアドレスはこちらを参考に固定しておいてください。

                    # この場合は192.168.1.6
                    $ export ROS_MASTER_URI=http://192.168.1.6:11311
                

ROS_MASTER_URIの値を確認して正しく設定されていれば完了です。

                    $ export | grep ROS_MASTER_URI
                    ROS_MASTER_URI=http://192.168.1.6:11311
                

ワークステーション側で実行されるノードはロボット側のroscoreを通じてノードと通信することができます。

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/8/11