So-net無料ブログ作成

Raspbian設定 [Raspberry Pi]

また工場に来ている。こないだ借り上げアパートで熱中症になったので今回はホテル。でもシーズンなのでまともなところは満杯。今いるホテルはなかなかすごいところだけど、空調があってネットが来てるだけアパートよりマシ。

ところで遊びや仕事で買ったRaspberry Piがもう10個を超えた。全部でいくつあるのかはっきりとはわからなくなってる(若い頃と違って心情的には十進二桁は無限大と同じ)。しかもどれがどれだかわからなくなってきたので、Raspberry Pi 3(あるいはそれ以降)は全部同じ設定にしなおすことにした。家と横浜のオフィスと工場にバラけてて、会社の方針でvpnは導入しない、ということになった(単に僕しか使わないのに月々費用がかかる)ので管理が面倒になってきた。全部がホスト名以外同じならちょっとでも簡単になるのではないかと期待して。

いつからかは知らないんだけどRaspbianはNFSをルートファイルシステムにしたネットワークブートができるようになったらしい。とりあえず今でもローカルのSDカードにはなるべく書かないようにはしてるんだけど、仕事で使ってるやつはSDカードが壊れたら困るのでネットワークブートにしたい。

でもたぶんかなり遅いだろうし、僕としては全部切り替えるにはまだちょっと時期尚早に思える。とりあえずRaspberry Piをヘッドレスで使うための同じ設定のSDカードを作る手順を備忘録として書いておく。例えばRaspberry Pi Zero Wみたいなのは特にそうだけど、モニタキーボードなしでインストールしようと思う人には参考になるところがあるかも....

Raspbianのイメージのダウンロード

NOOBSは実によくできてると思うんだけど、最初の立ち上げにはモニタとキーボードが必要になってしまう。それを避けるためにNOOBSではなくインストール用のRaspbianのイメージを使う。大きいのでなるべく近くから。どれだけ違うかわからない、というかどこからも遅いけど...
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
ftpでパソコン(僕の場合はmacOSマシン。プロンプトが「%」は以下同じ。Linuxでも以降の作業はまったく同じにできるけどけど、Windowsマシンからだとちがうかも知れない。でもWindowsからの話は他所様にいっぱいある)に落とす。今だとzip圧縮された7月5日のタイムスタンプのjessieで、こいつを展開すると4GBちょっとのimgファイルになる。

SDカードの準備

こいつを初期化したSDカードにbyte-wiseコピーする(imgファイルを仮想ボリュームとしてマウントしてFinderコピー、はダメらしい)。
% sudo umount /Volume/NoName
% sudo dd bs=1m if=2017-07-05-raspbian-jessie.img of=/dev/rdisk2
NoNameはSDカードを初期化したときの名前。/dev/rdisk2はSDカードのデバイスファイル。アンマウントしないとddからデバイスがビジーだと怒られる。4GBあるのでddでも時間がかかる。しかしほんとにddを使うときはドキドキする。直前にTimeMachineバックアップを忘れないようにする。

ちなみに、なぜかumountでアンマウントできないときがある。そのときは
% sudo diskutil umount /Volume/NoName
としろ、とでてくる。macOS固有の問題だと思うんだけど、なんでなのかよくわからない。umountがdiskutilを呼んでくれてもいいのに。

ヘッドレス設定

最近のRaspbianはssh接続がデフォルトではできなくなっているらしいので、まず最初のブートのときにsshdが立ち上がるようにしたい。そのためにはSDカードに書き込んだbootというボリュームのトップレベルにsshというファイルがあればいいらしい。そこでコピーし終わったSDカードをもう一度macOSにマウントする。このときmacOSでは/bootボリュームだけがマウントされるが、それで十分。マウントできれば
% touch /Volume/boot/ssh
としておくと初回ブートからsshdが起動されるようになる。中身はカラッポでいい。

さらにEthenetのケーブルを繋ぐのも面倒なので最初のブートのときにWiFi接続できるようにする。そのためにはやはりbootボリュームのトップレベルにwpa_supplicant.confをコピーする。そうするとブートするときに/etc/wpa_supplicant/にコピーしてくれるらしい。
% cp raspiSettings/wpa_supplicant.conf /Volume/boot/
コピー元のraspiSettings/wpa_supplicant.confには普段僕が出没してraspberry piを立ち上げる可能性のある会社のオフィスや工場や家のWiFi設定が全部書いてある。

最初のブート

そしてこのSDカードをRaspberry piに入れて5V電源を繋ぐ。モニタがないとどうなってるのかわからないけど、しばらくほったらかしておく。ブートの間にNOOBSのようにSDカードのパーテイションを切りなおしてRaspbian本体をext4のボリュームに置いたりする、なんていう必要はないはずなんだけど、何をやってるのか見てないのでよくわからない。少なくともNOOBSでRaspbianをインストールするよりずっと短い時間で終わる。

ちゃんとブートできて、WiFiに接続できればraspberrypiというホスト名でネットワークに見えるようになるはずである。最近のRaspbianにはavahiがデフォルトで入っているので、
% ping raspberrypi.local
これでecho replyが返ってくればOK。デフォルトのユーザでsshログインする。
% ssh pi@raspberypi.local
とすると、sshdがちゃんと立ち上がっていればauthenticityの注意が出るのでそれにyesを返すとloginできる。
The authenticity of host 'raspberrypi.local (192.168.127.111)' can't be established.
ECDSA key fingerprint is 32:fe:b8:d6:6f:a7:29:1a:e9:7b:f5:00:bd:1b:b7:a6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local,192.168.127.111' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: 
デフォルトのパスワードraspberryを入力してログイン。これができないとモニタを持ってきてどうなってるかみるしかない。シリアルを設定してあればコンソールログが見られるはずで、それで確認できるけど、僕の環境ではそっちの方がモニタを繋ぐよりずっとめんどくさい。

raspi-config

ログインできたら、山は越えたと言える。まず最初の設定をする。
pi@raspberrypi:~ $ sudo raspi-config
これで
  • 2 hostname
  • 3 Boot Options -> CLI
  • 4 Localizsation Options
    1. Change Locale -> en_GBをはずしてen_US,UTF-8、デフォルトのロケールをC.UTF-8
    2. Change Timezone -> Tokyo
    3. Change Wi-fi Country -> JP
  • 5 Interfacing Options -> SSH、VNC、SPI、I2C、Serialをオンにする
  • 7 Advanced Options -> Expand Filesystem
と設定する。ロケールを日本にしないのはメッセージが日本語英語ごっちゃになるのがいやだから。システムの全部のメッセージが日本語になるんだったらするんだけど。もちろんロケールがC.UTF-8のままでも日本語のファイルの中身ぐらいは表示できる(もちろん日本語のエンコードがUTF-8の場合だけど)。

最後のExpand Filesystemはpi3ではいらなくなったみたい。

update

raspi-configを終わるとかってにリブートする。立ち上がった頃をみはからってあたらしいホスト名のpiでログインする。できなければまたモニタを繋いでコンソール出力をみるしかない。ここまでは何個も同時に、というわけにはいかない(ホスト名がカブる)が、これからは複数台同時進行可能である。

ログインできればアップデート(誰かがまとめてやってたのをみたので真似させてもらった)、
pi@vega:~ $ sudo apt-get update && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get autoclean
vegaというのはたまたまこのとき設定したホスト名。昔と違ってかなり時間がかかる。

そしてもうひとつ
pi@vega:~ $ sudo rpi-update
こっちはraspberry pi専用。こっちもかなり頻繁にアップデートがある。

tcshインストール

とりあえずtcshだけは先にインストールする。
pi@vega:~ $ sudo apt-get install tcsh
古い人間でcshしか使えないので。

rootの代理アカウント作成

GPIOをアクセスするにはrootでないといけない。ところがデフォルトではrootユーザはログインできないようになっている。これがEclipseを使ったリモートデバグ(この問題解決できていない)をはじめけっこういろんなところで問題を発生させる。本来ならGPIOをアクセスできるroot以外のアカウントが設定できるようにすべきだと僕は思うけど、いい方法がわからないので、僕はrootと同じuidを持つユーザを作ることにしている。
pi@vega:~ $ useradd -g 1000 -o -u 0 -s /bin/tcsh deputy
これでこのアカウントでsshログインできて、GPIOをsudoなしにアクセスできる。

ところが、最近のraspbianはいつからかこのアカウントもrootのログインと見なされるようになってしまった。結局rootログインを許すしかなくなった。
pi@vega:~ $ sudo vi /etc/ssh/sshd_config
PermitRootLogin  yes
とする。結局、今となってはdeputyアカウントの意味はなくなったけど、まあ、ホームディレクトリが/rootじゃないだけまし、ということで。

いちおうセキュリティを考慮しているという姿勢を示すためにこの時点でデフォルトのpiアカウントはホームディレクトリごと完全に削除しておく。

VNC用のスクリーンサイズ設定

VNCを使ってXウィンドウを使うこともあるけど、モニタが繋がってないとすごい小さなスクリーンサイズに設定されてしまうようなので、強制的にサイズを決めうちしておく。
vega:~ # vi /boot/config.txt
で(deputyアカウントにはsudoはいらない)
	hdmi_force_hotplug = 1
	hdmi_group=1
	hdmi_mode=5
と書き換えてリブートする。これだととりあえず1080iになる。解像度の詳細はここで。

pigpioのインストール

最近GPIOのプログラムに使っているpigpioをインストール。
vega:~ # git clone https://github.com/joan2937/pigpio
これをmakeしてインストールしておく。どうでもいいけど、最近の僕のpigpio依存はかなり深い。pigpioジャンキーと言っていい。wiringPiBCM2835ライブラリではどうしてもできなかったことがpigpioだとできることがある。大変うれしい。もちろんpigpioでもダメなこともあるけど、それは過大な要求だと言える。

ssh公開鍵

sshでログインしたときにパスワードではなくて公開鍵にするとリモートデバグでファイルを更新するたびにパスワードを入れずに済む。そのためには
  1. ホームディレクトリに.sshというサブディレクトリを作る
  2. そこにauthorized_keysというファイルを作る
  3. authorized_keysにログイン元のマシンの.ssh/id_rsa.pubという公開鍵ファイルの中身をコピーする
  4. ファイルのモードを600(8進で)、.sshのモードを700に変更する
ということをしておくと、sshがログインのときにパスワードではなくて鍵を参照するようになる。id_rsa.pubをどうやって作ったかはもう忘れた。

sambaのインストール

sambaは
vega:~ # apt-get install samba 
で。そのあと/etc/samba/smb.confを編集する。
[global]
unix charset = UTF-8
dos charset = CP932
[deputy]
path=/home/deputy
read only = No
guest ok = No
force user = deputy
どうでもいい設定もあるけど、まあいい。そのあとsambaパスワードを設定してリスタート。
vega:~ # smbpasswd -a deputy
vega:~ # service smbd restart
これでrasperry piのSDカードのディレクトリにアクセスできるようになる。

ネットワークドライブのマウント

しかし、これではSDカードを読み書きしてしまうので逆に手元のmacのボリュームをマウントする。sambaをインストールするとsamba形式のネットワークボリュームをマウントできるようになる。
vega:~ # mount -t cifs -o username={username},password={password}//{hostName.local}/{shareFolder} {/mnt/mountFolderName}
{}の中身にはそのときにあわせて必要なものを入れる(パスワードを平文で入れるのはマズイので、無しでマウントしようとするとちゃんとパスワードを訊いてくる。ちなみにこのパスワードはsmbpasswdコマンドで設定したもので、macOSのアカウントのパスワードではない ←追記:ごめん、トリビアルな勘違いでこれウソ。もちろんmacOSのアカウントを使う)。もちろん先にマウント先(/mnt/mountFolderName)のディレクトリを作っておくのと、mac側の「ファイル共有」のオプションで「SMBを利用してファイルやフォルダを共有」をオンにしておく必要がある。

ssh経由のXクライアント

mac側にXサーバ(X-Quartz)を立ち上げて、RaspbianでXクライアントを走らせると便利なこともある。そのときはX認証ではなく、sshをトンネルするようにできる。というかもうX認証はobsoleteでsshを経由するのが正しい使い方らしい。そのためには
% ssh -X deputy@vega.local
としてログインするとXプロトコルの通信はssh経由になるので改めて認証する必要がなくなる。そしてDISPLAY変数も設定されて(複数のXサーバを接続するためにDISPLAY変数を指定することもできるらしい)これ以上何もしなくてもXクライアントを起動するとX-Quartzに表示される。

僕はウィンドウベースで作業することは少ないんだけど、なぜか以前よりもXをリモートのサーバに繋ごうすると遅いことが多くなった。vncの方がCPUは食うけどレスポンスはいい(いくつかXアプリを試してみるとものによることがわかる。極端なのはchromium-browserでX-Quartzに表示させると数秒のレイテンシがあってまったく使えないが、vncだとそんなことはない。なんでだろう)。複雑な表示が増えてXプロトコルではトラフィックがかえって増えてしまって、127.0.0.1と外との差が開いているのがPi3でloop backの効率が上がって顕在化した、というようなことかもしれない。vncより便利なこともあるんだけど、これからはこの出番は減っていきそうである。

node.js

ほんとはGoogle Coderを使うつもりでいたんだけど、もう3年以上も放置プレイ。Googleだからと思って期待して、Pi3で動いて僕が必要なものも一緒に入ったSDカードも作ったんだけど、これではバージョンアップも個別にしないといけなくてめんどくさい。で、Coderは諦めて自分で環境構築することにした。と言ってもJavaScriptやHTMLのファイルをまとめてXcodeのプロジェクトにしただけ。どうせコンパイルという作業はないし、プロジェクトにまとめておけば大域検索やローカルでのバージョン管理ができる。そのプロジェクトファイルがあるフォルダをRaspberry piにマウントしてそのindex.jsをRaspberry pi上のnodeコマンドで実行する。

ということで、まだいろいろわからないところがあってやりたいことができるところまでいってないんだけど、node.jsをインストール。これはたとえばこちらを参照。 僕はtcshを使ってるので、nvmの起動スクリプトが動かない。しょうがないのでそのときだけbashに切り替える。
vega:~ # exec bash
これをすぐ忘れる。シェルスクリプトって難しくて全然覚えられないので、csh用に書き換えることもできない。誰かやってくれないかな。csh使う人でnode.jsを使いたい人ってどうしてるの?

そしてどうせnode.jsを使うなら、ということでjadeをインストール
deputy@vega:~ $ npm install jade
(bashに切り替えたのでプロンプトが変わってしまってる)。jadeは2.0からpugという名前に変わったらしい。もう問題なく使えるのかなにかexcuseがあるのかよくわからない。まあ.jadeのソースはまだほんの少ししかないし、名前さえ変えればそのままらしいし。

それと息子に教えてもらった超簡単なCSSフレームワークというかテンプレートライブラリのbootstrap
deputy@vega:~ $ npm install bootstrap
をインストール。CSS無し手書きのHTMLのダサダサ表示が一手間で見栄えが良くなる。これは良いわ。つい、もうちょっとカッコよく、なんて思ってしまってそんなどうでもいいことに時間を費やしてしまうこともあるけど。

jadeやbootstrapなんかでめんどくさくてなかなかやる気の出ないHTMLまわりをちょっとでも楽にしたい。このへんは全部がRaspbianに乗っている必要はないんだけど、macで使うことは少なくとも当分はなさそうなので、押し付けておく。どうもWebアプリを作るのって僕と相性が悪いのか、めちゃ難しくってあまり楽しくない。慣れてくると違ってくるのかもしれないけど。

node.jsを何に使いたいのか、は、またあらためてここでご披露するつもり。ヘッドレス特有の使い方をしたい、と言えばだいたいわかるだろう。node.js + 僕の書いたpigpioアプリ + WebSocket + Mathematicaカーネル + ユーザPC上のブラウザ、という組み合わせ。まだできてないけど。

今日はここまで。
nice!(1)  コメント(0)  トラックバック(0) 

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

メッセージを送る