Cy-Pi

自転車のこと。たまにラズパイのこと。

raspberry pi zero WH ヘッドレス立ち上げ

ほぼこの記事を参考にしました。ありがとうございました。 wave.hatenablog.com

今回も作業メモ

公式サイトからOSをダウンロードする

執筆時点ではRASPBIANの最新版はのstrech。このlite版を持ってきた。

古いものが欲しい場合はここから。 例えばjessieのlite版を持ってくる。

解凍してimgファイルを出しておく。

SDカードフォーマット

カードまるまるfat32パーティション1つにフォーマットした。 方法はなんでもいいが、今回はubuntuだからgpartedを使った。無かったら入れる。

他にはこんな方法もある。
sudo mkfs.vfat -v -c -F 32 /dev/sdX
もちろんsdXにはフォーマットするデバイス名を当てはめる。 このコマンドをそのまま実行しても何も起きないと思うけど、とりあえず実行してみるとか予想でデバイス名を指定するというのはおすすめしない。

フォーマットにはSD formatterの使用が推奨らしいので、ネット上の情報ではwindows環境での解説記事が多く、linuxでのやり方はほぼ見かけない。 今回はraspberry pi zero WHをヘッドレスで立ち上げるため、linuxで完結できる方法をとる。

SDカードにOSを入れる

etcherを使う

echo "deb https://dl.bintray.com/resin-io/debian stable etcher" | sudo tee /etc/apt/sources.list.d/etcher.list

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61

sudo apt install etcher-electron

ここからはGUIでの作業。etcherを立ち上げて、先程解凍したimgファイルを指定する。書き込み先のデバイスを指定する。デバイス名は灰色の小さな文字で表示されている。書き込みを開始して10分ほど待つ。

出来上がったSDカードはパーティションが2つできている。毎回sdX1とsdX2かな? ディレクトリ名で言うと、1つ目が/boot、2つ目が/rootfs。

sshとwlan設定

sdX1のルート(/boot)に移動して、ファイルを2つ作成する。

touch ssh

vim wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="<SSID>"
    psk=<パスワード>
}

パスワードは平文で書いてもいい。平文で書く場合はダブルコーテーションで括る。 暗号化する場合はwpa_passphrase <SSID>で生成する。ここで、要求されるパスワードにラズパイのログインパスワードを入れてしまった。気づけず半日ほど足踏みした。

2つのファイルを用意したら、カードをsudo umount /dev/sdX*する。

raspberry pi zero WHを起動する

SDカードをWHに差し込み、電源ポート(PWR INと書いてある方)にusb端子を差し込む。LEDが点滅し始め、1分ほど経過すると点灯に切り替わる。 ここでubuntuマシンから、nmapなどでipアドレスを確認する。それらしきものが表示されていれば成功。

ssh pi@<IP adrs>でアクセスし、パスワードraspberryで入れるはず。

ssh接続はssh pi@raspberrypi.localでできるそう。 でも、複数台を同時に起動している場合は名前解決できないだろうからipアドレスを調べたほうがいい。

これで立ち上げは完了。

ラズパイのSDをクローンする

ddコマンドを使用する。バカヨケがないからウッカリするとウッカリする。

  • 環境

  • クローン元のSDを調べる
    クローン元のSDカードをどこかのスロットに入れて、デバイス名を確認する。 例えばこんなコマンドを使って。

dmesg
df -h

  • SDカードを丸々ぶっこ抜く
    クローン元のデバイス名は /dev/sde だったとする。 これをddコマンドでぶっこ抜く。 sudo dd if=/dev/sde of=<出力先>

特に動きは見られないが、出来上がるファイルを観察すると、ファイルサイズが増えていくのがわかる。

  • ぶっこ抜いたデータを書き込む
    クローン元のSDをクローン先のSDと入れ替える。 ここでも一応デバイス名を確認しておく。

書き込むにはifとofを入れ替え、オプションを追加してEnter

sudo dd if=<保存したやつ> of=/dev/sde conv=fsync

余談

raspberry pi 3 のSDをクローンして raspberry pi zero WH用のSDを作ろうとしたが、CPUが違う。Pi3はarm8、PiZWHはarm6。そのままだと動かないプログラムがある。しまった。

ラズパイとslackを連携させる:その2(ラズパイに住まわせる編)

その1に引き続きメモ書き

hubotからラズパイを操作する

その1でhubotがslack上で卓球してくれるようになった。 さらに彼にコマンドを渡して実行してくれるように組み上げる。

/scriptに次に書いたようなcoffeeスクリプトを置く。 明らかに変なコードだけど今は動けばいい。 このcoffeeはwrapperとして働くので、実行ファイルは自分の好きな言語で組める。

# Description:

module.exports = (robot) ->
 robot.respond /(.*)$/i, (msg) ->
    sndcmd = msg.match[1]
    @exec = require('child_process').exec
    command = "#{sndcmd}"
    # msg.send command
    msg.send sndcmd
    @exec command, (error, stdout, stderr) ->
      msg.send error if error?
      msg.send stdout if stdout?
      msg.send stderr if stderr?

ラズパイ起動時にhubot起動する

#!/bin/sh

cd <hubot_directory>
sudo -u <user_name> bin/hubot -a slack
  • Systemdの設定ファイルを用意する /etc/systemd/system/mybot.service
[Unit]
Description = <setsumei>

[Service]
ExecStart=<full_path: mybot.sh>
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
sudo systemctl enable mybot

これでrebootすれば起動しているはずだ。

ラズパイとslackを連携させる:その1(bot導入編)

完全にメモ書き

slack導入

  • アカウントを作る
    特に困らなかったので割愛。slackはUIがわかりやすい!

hubot導入

  • もろもろインストール
    ラズパイだとこれをやっておく必要がある(このあたりの情報は錯綜している)
    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt install -y nodejs

sudo npm install -g yo generator-hubot coffeescript
npmでdeprecatedとかWARNされるがいまはスルーしとく。 あとroot権限ないと入らないよ。

  • botを作る
    適当なディレクトリで
    yo hubot

    • Bot adoptor:slack
      ユーザーとかは適当にしておく。bot名つけると愛着がわくからちゃんとつける()
  • 実行 bin/hubot
    プロンプトが変わったら<bot_name> pingと入力してPONGを返してくれればOK。 これはまだslackは関係ない。

  • slackのAppsとかIntegrationとかそんな感じのを掘っていくとHubotのInstallができそうなボタンが見つかる。当然インストールする。するとトークンとか発行される。
    vim bin/hubot
    export HUBOT_SLACK_TOKEN=\"x######################################################\"

slack上で動作させる

bin/hubot -a slack

さっきと同様にbotにダイレクトアタックしてPONGが返れば俺のターン!

raspberry pi を家の外から操りたい

twitterをトリガに動く

cronで5分おきにtwitterのDMをポーリングして、キーワードをトリガとしてスクリプトが走り出す。自由度は低いけど、外でコードを書くつもりはないので、これで十分。 twitterのアクセスキーの設定でハマったものの、それ以外は簡単に組めた。

ただし、2018年8月でstreaming APIが廃止になるらしいので、 15分間に15回までしか叩けないナントカAPIしか使えなかった。

制限いっぱい使用しても1分周期でしか動作しないのでビミョー。

結論:やっぱりリアルタイム性がほしいな。

VPNトンネルを掘る

直接ラズパイに入っちゃえば何でもできる。

でも、ポートフォワーディング設定が必要になるんだろう。 よく知らないのでセキュリティが心配。どんな感じか想像してみた。

  • 開放するポートを変更する
    デフォルトでは22番になっている。自分が攻撃するならまずは22番を堀りに行くと思う。デフォルトから変えないで使う人はきっとその他もガバガバだろうからカモになるよね。

  • アカウント名を変更する
    アカウント名知らなきゃ侵入できないよね。たぶん。 デフォルトでもあるアカウント名は変えといたほうがいいかな。rootとか、piとか。 ゲストアカウントもオフにする必要があるかな。

  • ポート通れるIPの制限とか?
    できるか知らないけど、ホワイトリストベースで運用できればちっとは安心だよね。 スマホからラズパイをいじりたいから、スマホのIPを調べる必要があるよね。で、スマホのIPってのはそもそもどうなっているんだろう?

  • ラズパイというか家のグローバルIPを固定する
    使おうと思ってる回線について調べたら、月額が発生するようだ。 毎月お金を払ってまでラズパイしたいわけじゃないので、、、それなら自立制御に力を入れるので、、、

結論:VPNは断念した。

スマホのpush通知的な仕組みできないか?

メールとかLINEとかってリアルタイムで通知が来る。ラズパイにもpushできれば、やりたいことができるんじゃないかと思う。 それで、、、push通知ってどんな仕組みなんだ?

ぐぐってみると

、、、がんばって読み解くと、AppleなりGoogleなりのサーバーがユーザー端末を特定して通知を出してくれる仕組みのようだね。ラズパイでも同様のサーバーを立ち上げればできるはず、、、だけど、端末を特定するってことはグローバルIP必要になりそうでイヤだな。

結論:サーバーとかよくわからないけど、調べている途中でこんな情報を見つけた。

slack + hubotの連携

いろいろ考えてみたものの、これでやりたいことを実現できそうだ。

結論:これまでの調査は無駄ではない。うまくいかない3通りの方法を発見したのだ。

sublime text導入メモ

いい加減atomは重いのでsublime textに手を出します。 今回は作業メモだけです。自転車乗りたい。

本体の入手

クロスプラットフォームでの運用を視野に入れているので、なんとなくポータブル版を選択。

パッケージ導入の準備

  • コンソールを出して、おまじないをコピペしてッターン!

コンソール出す:Ctrl + `

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
  • 使いそうなパッケージを入れてみた。

一覧の表示方法: Preferences » Package Settings » Package Control » Settings - User

Package Control: Install Package
{
  "installed_packages":
  [
  "AdvancedNewFile",
  "Alignment",
  "AlignTab",
  "All Autocomplete",
  "AutoFileName",
  "BoundKeys",
  "BracketHighlighter",
  "ConvertToUTF8",
  "DataConverter",
  "Diffy",
  "IMESupport",
  "Increment Selection",
  "Japanize",
  "Local History",
  "Markdown Table Formatter",
  "MarkdownPreview",
  "Origami",
  "Package Control",
  "Python PEP8 Autoformat",
  "Random Everything",
  "Smart VHDL",
  "SublimeAStyleFormatter",
  "SublimeCodeIntel",
  "SublimeLinter",
  "SublimeLinter-clang",
  "Sublimerge 3",
  "SyncedSideBar",
  "TrailingSpaces",
  "Trimmer",
  "Verilog"
  ]
}

memo

その他設定

  • ソフトタブ設定
    • "translate_tabs_to_spaces": true
    • "detect_indentation": false