ZYBOの追加のUART0をpeta linuxから使う
はじめに
ZYBOのUART1はUSB側につながっていて、パソコンと接続すれば簡単にシリアル通信ができるようになっています。しかし、パソコンではなく外部の機器とシリアル通信をしたかったため、使われていないUART0を有効にしました。
試行錯誤した結果を残しておきます。
petalinuxをビルドするために開発環境はlinuxを使いました。
環境の都合でCentOSでやりましたが、特に理由がなければArchLinuxやUbuntuなど一般的なものをお勧めします。
ZYBOのUARTの種類
最初にUARTの種類について確認します。
ZYBOのUARTにはいくつか種類があります。
①PS側に実装されているUART (UART0, UART1)
最初からPS側にUARTが2つついています。
UART1は標準で有効で、USBに変換され UART/JTAG USB portに接続されています。なので、パソコンにUSBでつなぐだけで簡単に使えます。Linuxからは/dev/ttyPS0として認識されます。
UART0は存在はしていますが、使用するためにはPLをいじったりdtsをいじったりなど軽く設定が必要です。今回はこのUART0を有効にしてLinuxで/dev/ttyPS1として認識させるまでの説明をします。
②PL側にIPを張り付けて作るUART(いくつでも追加可能)
標準で用意されているUARTは上記の2つだけですが、PL側にUartliteやUART16550を張り付けることによっていくらでもUARTポートを増やすことができます。こちらの方法は今回は使いませんでした。3ポート以上必要な場合にはこれを使うことになります。
いくつか種類がありますが、これらの中から必要に応じて使うことになります。
それではUART0をLinuxで使うために設定を始めていきましょう。
UART0を外部に出す(vivadoでの操作)
標準では外部に接続されていない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を実行。
③ZYNQのブロックをダブルクリックしてRe-customize IPを開く。
④左のPage NavigatorのMIO Configrationを選択。
⑤UART0にチェックを入れて、任意のMIOポートを指定(画像ではMIO10とMIO11を指定)。OKを押して閉じる。
(Ethernetにつなぐ場合には、ここでPeripheral I/O PinsタブでEthernet0->MDIOでMDIOを選択する必要があるようです。参考: hiro99ma blog: [zybo]PetaLinux (9) )
⑥ZYNQブロックの右側のFCLK_CLK0を左側のM_AXI_GP0_ACLKに接続。
⑦保存して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で使用する方法を確認しました。
わからないことがありましたらご質問ください。
KOSENセキュリティコンテスト2017 Write-Up
2017/10/21から10/22までのKOSENセキュリティコンテスト2017に即席チーム074m4K053nで参加してきました。
チームは経験者2人+未経験者2人のつもりだったですが、前者の1人が休日開講の必合格科目に出るために3人になってしまいました。
結果は2600点で全体7位/会場1位でした。忙しい中先生に時間を割いていただき残念な結果で終わらせることはできない状況だったので、なんとかなったかなと安心してます。
01 フラグを答えろ - Binary 100
a.outが与えられます。
stringsで見てもSCKOSEN{Hとしか出てこないので、ltraceで実行して共有ライブラリの関数呼び出しを探します。
入力した文字列とフラグを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 LANのMACのところにフラグが分割されて入っているので、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にアップロードしました。(こちら)
フロントとリア両方ありますが、フロントしか動作確認していません。
簡単ですが以上になります。
■
BeagleBoneBlack(ArchLinux)の起動
目的
今回はBeagleBoneBlackについてです。
前回作成したArchLinuxのSDカードを使ってBeagleBoneBlackを起動していきます。
起動したあと、便利に使うための説明などをしていきたいと思います。
方法
では、ここからはBeagleBoneBlackの起動を行っていきます。
BeagleBoneBlackはディスプレイにマイクロHDMIケーブルを使うのですが、高いので今回は使用せずに、ディスプレイなしでBeagleBoneBlackのセットアップを行います。 方法は、同じネットワークへ接続してsshで繋ぐ方法と、USB-Serialコンバータを使用してシリアルコンソールでログインする方法、クロスケーブルを使う方法があります。 今回は1つ目の、ネットワークごしにログインします。この方法ではIPアドレスがわからなくても、sshで接続することができます。
2015/7/30 追記
USB-Serialコンバータを使用してシリアルコンソールでログインする方法を追記しました。こちら。
準備
まずは下記のものを用意してください
- BeagleBoneBlack (Rev C)
- ArchLinuxがインストールされたマイクロSDカード
- LANケーブル
- MiniUSB-B to USB-A ケーブル
- ネットワークに接続した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を接続します。
次のように接続してください。
BeagleBoneBlack | USB-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つ順に入力してください。
■
ArchLinuxでwi-fiアクセスポイント作成
目的
ArchLinuxをインストールしたRaspberryPi・BeagleBoneBlackをwi-fiのアクセスポイントにして、他の機器を接続させます。
準備
まずは下記のものを用意してください
- BeagleBoneBlack or RaspberryPi
- 無線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に接続すれば、自分は動くことなく制御やチェックが可能です。
準備
まずは下記のものを用意してください
- ROSがインストールされたマシン(ロボット側)
- 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