OS Xで別バージョンバックアップの作成法

復活したMacBook Proには古い750GBのHDDを戻したので、MacBook Proで使っていた2.5 inch 1TBのハードディスクが余った。なので、USB3.0なケースを買ってそれに突っ込んでみた。このドライブを一時帰国時等で念の為に携帯するメインマックのユーザーフォルダの持ち運びディスクとして使おうという算段だ。

さて、通常のバックアップはTimeMachineに依存しているのだが、TimeMachineでフルバックアップをこのハードディスクにもう一個作るには容量が足りないの。できれば、ユーザーフォルダだけ差分バックアップしたい。で、考えたのが、Cmd-Rで起動できるレスキューディスクのターミナルからrsyncでバックアップするとういう方法だ。

さて、Cmd-Rを押しながら起動し、メニューからターミナルを起動するが、rsyncがレスキューディスクには見当たらない。とはいえ、メインのハードディスクにはOS Xがインストールされているので、この中のrsyncを使えばいい。

/Volume/<OS X Volume>/usr/bin/rsync -av /Volume/<OS X Volume>/Users/<Username> /Volume/<Backup Volume>

これでユーザーフォルダ全体がバックアップ用ハードディスクにコピーされる。以後は同じコマンドを使うことでタイムスタンプの差分を見て必要なファイルだけをコピーしてくれるはずだ。

OS X インストーラーが検証に失敗する

先日、お茶を盛大にぶっかけてしまってお亡くなりになったMacBook Pro、分解してお茶がかかったロジックボードやアッパーケースを超純水で丹念にすすぎ、もう一度組み立てたところ、無事にまた起動するようになった。

というわけで、スペアMacとして活用するために購入時のHDD(750MB)を戻し、リカバリーパーティションから起動(Cmd-Rを押しながら起動する)してオリジナルのOS(といってもこのHDDが入っていた時の最新バージョン)を再インストールしようとしたのだが、エラーが出て再インストールが出来ない。

ならばとEl CapitanのインストーラーをDiskMaker Xを使ってUSBメモリに作成し、こちらから起動したのだが、こちらもアップルとの通信で検証に失敗してインストール出来ない。

いろいろ調べてみると、Macの内蔵時計が正しくないと検証に失敗するとな。ところが、インストーラーからは起動ディスク以外のシステム環境設定にアクセス出来ないので、時計の設定が出来ない。

ま、こういう時こそOS XがUnixであるという便利さを感じる時。メニューバーからターミナルを起動し、コマンドラインで設定すれば良いのだ。

/bin/date mmddHHMMyyyy

月・日・時・分・年のフォーマットなのが釈然としないが、これで正しい日付に設定し直したところ、アップルと通信しての検証がパスして無事にインストールが始まった。これでスペアMacとしての余生を送る事が出来る。よかったよかった。

apticronのタイムアウトを防ぐ

Raspberry Pi 2は毎日apticronでパッケージリポジトリをアップデートしているのだが、結構な頻度でいくつかの反応の遅いリポジトリがタイムアウトしてcronからお怒りのメールが届く。しかも、これが出ちゃうと、このリポジトリにもしかするとアップデートされたパッケージがあるかも知れないと思って、手動でわざわざapt-get updateをやらなければいけないので精神衛生上もよろしくない。

いろいろ調べてみたら、どうも並行アクセスで行うリポジトリキャッシュのアップデートを一個ずつ順にやっていく様に変えることが出来るようだ。

実際には、aptの設定を変える。

/etc/apt/apt.conf.d/75download

Acquire::Queue-Mode “access”;

このファイル自体はRaspbianのデフォルトだと存在しないので、Rootになって作成すればよい。これで、きちんと一個ずつリポジトリからのキャッシュ取得が終わってからでないと次に行かないので同時にアクセスして反応が遅かった奴がタイムアウトする、なんてことはないだろうと期待。でも、反応の遅い奴のおかげでそれ以後が全部タイムアウトになっちゃう、とかだったら本末転倒だな。まあ、とりあえず様子見。

Raspberry Pi 2のファームウェアのバージョンアップ通知

Raspberry Pi 2のファームウェアの更新は過去にも書いた通り、rpi-updateコマンドを使って行うわけだが、rpi-updateコマンド自体は自身のエンジンは実行時にGitHubからダウンロードしてセルフアップデート、ファームウェアそのものもこれまたGitHubからダウンロードして展開という仕組み。したがって、通常のDebianのパッケージアップデートの通知ではファームウェアのアップデートがあったとしてもrpi-update自体はアップデートされないので通知されないということになる。

これは不便だ。やっぱりファームウェアのバージョンアップがあった場合にはなんらかの方法で自分に通知して欲しい。実際、これを書いている時点でもファームウェアの末尾の番号が既に2上がっていたので、慌ててrpi-updateをかけた。Raspbianのカーネルはファームウェアと同梱なので、ファームウェアを適切にアップデートしておかないとカーネルにセキュリティー上の問題がある場合は放置されることになるから、よろしくない。というわけで、自宅で動かしてるRaspberry Pi 2自身がアップデートを知って通知する方法がないのなら、大本のファームウェアのダウンロード元であるGitHubを利用してやろうじゃないか。

というわけで、github.comにアクセスしてサインアップ。GitHubは自分のような非開発者でもFreeのプランで無料でアカウントを作ることが出来る。アカウントを作ったら、GitHub上のRaspberry Piのファームウェアのリポジトリに行く。

https://github.com/raspberrypi/firmware

右上にある目のアイコンのWatchをクリックしてWatch対象にする。アカウントサインアップ時のデフォルトでWatchしたリポジトリの更新はメールで通知される様になっている。

これでファームウェアにアップデートがあった場合にはGitHubから通知がくるので、そのタイミングでrpi-updateをかけることができるはず。まあでも、開発関係のもろもろでも通知が来るとするとちょっとわずらわしいかなあ。

 

監視カメラサーバーの構築

さて、Raspberry Pi 2も常時稼働する様になったことだし、監視カメラサーバーでも構築してみよう。カメラモジュールを買うと高いので激安のLogicool C270を買う。まあ、使い道が無くなっても再利用できるしね。

さて、Logicool C270を適当なところに設置(自分が普段座る場所が画角に入ると自宅にいるだけで検知されるので、自分が映らない方向に設置)して、USBでRaspberry Pi 2に繋ぐ。

lsusb

ちゃんと繋がっていてシステムに認識されていることを確認しよう。次に監視カメラの定番ソフトウェアであるmotionをインストールする。

sudo apt-get install motion

いろいろどっちゃりインストールされる。インストールが済んだら設定ファイルを弄る。今回は単一のカメラしか使わないので、/etc/motion/motion.confを直接弄ればオッケー。複数繋ぐ場合は設定をカメラごとに別ファイルに書くらしい。

daemon off (テスト時はとりあえずoff)

width 1280 (C270だと1280×720で問題なく動く)

height 720

output_pictures off (とりあえず画像ファイルを吐かないように)

ffmpeg_output_movies off (同じく動画ファイルを吐かないように)

target_dir /mnt/storage/motion (吐き出す時は外部のUSBメモリに吐く様にする)

stream_port 8080 (デフォルトは8081だけどちょっと気持ち悪いので)

stream_localhost off (motionが外部向けのストリームサーバーとして動くように)

stream_auth_method 2 (一応、MD5でパスワード認証)

stream_authentication user:pass (認証用のユーザー名とパスワード)

webcontrol_port 0 (このポートに接続すると設定をウェブベースで弄れるんだけどいらないので無効に)

とりあえず、監視はするけど記録はしない設定にしてテストする。まずはdaemonではなく普通にプロセスとして起動してみる。

sudo motion -n

ターミナルに吐き出されるログを見ながらちゃんと画像がストリーミングされるかどうか確認する。あ、ルーターのPort Forwardingで8080番ポートをRaspberry Pi 2にリダイレクトしないと外部からは見れないので注意。なぜか、ローカル側からはiPhoneのSafariでは見れるけど、MacやPCのSafariやFirefoxでは見れなかった。ついでに吐き出すログのイベントを見てるとモーション検知が動いてるかどうかも分かる。locate_motion_mode onにすれば検知した動作のある範囲を枠で表示してくれるので、検知感度の調整はそれを見ながらやればいい。終了は^Cで。

動作が確認出来たら、motion.confのdaemon offをonにして、さらにシステム起動時にdaemonとして起動する様に/etc/default/motionを書き換える。

start_motion_daemon=yes

再起動して、ちゃんとmotionが動いて外部からアクセスできれば監視カメラ設置完了。

監視カメラとして検知した動きを記録するようにすると、自宅でカメラの前をうろうろしただけでどんどん記録されちゃうので、外部トリガーで記録する度に一定程度古くなったデータを自動削除するようにしないとあっという間に空き容量なくなっちゃうかな。まあ、旅行時とかだけなら問題ないかも。今後の課題としておこう。

 

Transcend製SDカードの再活用

最初にrpi-updateで失敗して使い物にならなかったTranscend製の32GBのmicroSD、どうにか無駄せずに済む方法はないかと思い、ブート用SDを長持ちさせるためのスクラッチディスクとして再利用することにした。いろいろなデータの保管はこのSDに行わせることによって、ブート用SDの書き込み量をできる限り節約しようという魂胆だ。

まずは、microSDカードが刺せる超小型のカードリーダーを入手、これにmicroSDカードをセットして、PCなりMacなりでMBRパーティション+FATフォーマットでフォーマットする。これは必要な時に抜いてPCでマウントしてデータを取り出せるようにである。

これをRaspberry Pi 2に刺して起動。まずは、デバイス名をチェックする。

sudo fdisk -l

これによると外部メモリはどうやら/dev/sda1にマウントされてるらしい。しかし、このデバイス名はつながってるデバイスの数によって簡単に変動するものなので、次にカードの固有名であるUUIDをチェックする。

sudo blkid /dev/sda1

/dev/sda1: UUID=”xxxx-xxxx” TYPE=”vfat”

これでUUIDとフォーマット形式が得られた。さて、どこにマウントするかだが、とりあえずは/mnt/storageというディレクトリにマウントすることにして、マウントポイントとなるディレクトリを/mntに掘っておく。

sudo mkdir /mnt/storage

最後に/etc/fstabに以下のエントリを作成して起動時にマウントされるようにする。

UUID=xxxx-xxxx   /mnt/storage   vfat   defaults   0   0

再起動したらdfコマンドでちゃんとマウントされて空き容量が認識されてるか確認しよう。

 

SSMTPによるメール送信環境の構築

さて、サーバーとして運用するからには少なくともレポートメールの送信ぐらいはできないと困る。しかし、メールの送信は必要だが受信は不要なので、それにもってこいな送信専用sendmailであるSSMTPをインストールしよう。

apt-get install ssmtp

で、インストールされたら/etc/ssmtp/ssmtp.confを設定する。

root=***@***.*** (ルート宛メールの転送先のアドレスを設定)

mailhub=mail.asahi-net.or.jp:587 (asahi-netのSMTPサーバーはFrom:アドレスが自由なので、こういうメールリレーハブの投げる先にはもってこい。もちろんプロバイダーにお金払ってるからできることだけど)

AuthUser=***

AuthPass=***

AuthMethod=cram-md5 (asahi-netのSMTP認証に必要な情報をベタ書き。セキュリティー的にはよろしくないけど対策は後述)

#rewriteDomain= (自ドメインのFrom:じゃないとSMTPリレーを拒否するサーバーの場合に、送信されたメールの発信元ドメインを書き換える設定。asahi-netの場合は問題なしなので、コメントアウトのままで)

hostname=***.*** (これも同じくFQDNでダイナミックDNSのホスト名を)

#FromLineOverride=YES (ユーザーが好きなFrom:アドレスを書いてもいいという設定だがrootのレポートメールだけなら不要なのでコメントアウトのままで)

以上で設定完了。しかし、このままではベタ書きにした認証情報が誰にでも見える状態になっているので気持ち悪い。ところが、ssmtp.confファイル自体はメールを送信する人にreadパーミッションを許可しないとそもそもメールが送れない。そこで、今回はmailグループに入ってる人だけメールが送れるようにする。

gpasswd -a %user% mail (まずは自分をmailグループに加える)

chown root:mail /etc/ssmtp/ssmtp.conf

chmod 640 /etc/ssmtp/ssmtp.conf

これでrootとmailグループに入ってる人しかファイルを読めないので一応は大丈夫。あとはユーザーからメールが送信できるかテストする。

echo  “This is a test mail.” | mail -v -s “Test mail” root

-vオプションのおかげで正しくリレーハブとの間でネゴシエーションが行われているかどうか確認できる。これでメールが無事に届けばテスト成功!

 

外部からのサーバーアクセス環境の構築

さて、外部からサーバーにアクセスできないと意味がないので、ダイナミックDNSに登録する。幸い、今のルーターはいくつかのダイナミックDNSで自動更新が可能なので、とりあえずNo-IPに無料アカウントを作成してホスト名を登録した。これをルーターのDDNSに設定して、IPの自動更新をさせる。

次に、ルーターのDHCPの設定でRaspberry Pi 2のMACアドレスには自動的に同じIPが割り当てられる様に設定。こうしておかないとポート転送が設定できない。

最後にまずはSSHのポート22だけをRaspberry Pi 2に転送するように設定する。これで外部から気が向いたときにダイナミックDNSのホスト名でSSHしていじれるようになった。いずれサービスを提供するときは、適宜新しいポートを開いていこう。必要なポートだけしか開かなければRaspberry Pi 2側でファイヤーウォールの設定をする必要もないしね。 🙂

 

Raspberry Pi 2によるサーバー構築 その3

さて、初期設定が完了したところで、まずは最低限の環境構築。ここからはルート作業なのでsudo -sしておくとよい。

apt-get update

apt-get dist-upgrade

システムが最新になったところで、今度はファームウェアも最新にしておこう。といってもRaspberry Pi 2にはオンボードの記憶領域がないので、実はこれはSDカードの隠しエリアに書き込まれる。起動時にはそこからファームウェアを読み込んで起動するというわけだ。

まずはツールをインストール。

apt-get install rpi-update

rpi-update

ここで問題発生。なぜかTranscendのSDカードだと、この後再起動した時点でSDカードへのアクセスがエラーになって起動できなくなる。いろいろ調べた結果、誰もが単純にTranscendはクソ、という結論だったので、あきらめてSandisk Ultraに変えてみたところ、なんのエラーもなくすんなりアップデート後にも起動した。なんだかなあ。

というわけで、ファームウェアのアップデートを完了したら有効にするために再起動。

再起動後はデフォルトユーザーのpiを無効にしておきたい。

というわけで、まずはadduserで新規ユーザーを作成する。もちろんルート作業。

adduser %user% (%user%はお好きなユーザー名)

gpasswd -a %user% sudo (sudoできるようにsudoグループに追加する)

ここで一度ログアウトして今度は作成したユーザーでログインしなおす。あとはデフォルトユーザーを無効にするだけ。実はRaspbian Jessieだと自動でデフォルトユーザーでデスクトップが立ち上がる設定になってるので、これをraspi-configから無効にしないとデフォルトユーザーを削除できないのだが、LITEではオートログインには設定されていないので単純に削除できる。

deluser -remove-home pi

これで新規サーバーの最低限の構築が完了した。

 

Raspberry Pi 2によるサーバー構築 その2

さて、ハードウェア的にはセットアップが完了したので、あとはターミナルからのアクセスで全てを行う。まずは初期セットアップのためのログイン。Rasbpianは最初からsshサーバーが起動しているのでsshでアクセス。さて、ホスト名だが、これも最初からavahiが稼働していてmDNSで名前を解決できる。不思議なことに、Raspbian Jessieではraspberrypi-2.localだが、LITEだとraspberrypi.localになっている。mDNSが引けないOSではなんとか頑張ってください。

ssh pi@raspberrypi.local

初期ユーザーはuser:pi,passwd:raspberryなので、これでログインする。ログインできなかったらハードウェア的に何か問題が起きているのでヘッドレスでのセットアップはあきらめてください。ログインしたら初期設定。

sudo raspi-config

ここでやることはルート領域の拡張、ロケールの設定、タイムゾーンの設定、そしてホスト名の設定だ。順番にやっていく。

ルート領域の拡張はSDカードの余っている部分いっぱいにルート領域を拡張する作業。これをやっておかないともったいない。

ロケールはja_JP.UTF-8にチェックを入れて、これをデフォルトロケールにする。これでターミナルアクセスで日本語でいろいろメッセージが表示される。

タイムゾーンは設置場所次第で。

ホスト名は、デフォルトでもいいんですが、それじゃまあ味気ないよね。 😛

全て完了したらraspi-configを抜けると自動的に再起動する。しばしまったら新しいホスト名を使ってsshで再ログインしてdf -hでちゃんとルートが拡張されてることを確認しておこう。