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でちゃんとルートが拡張されてることを確認しておこう。

 

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

自宅にメンテナンスの簡単なサーバーを新たに構築しようと思ったが、いまさらPCサーバーを新しく構築するというのも面白くないので、Raspberry Pi 2を使うことにした。

買ったのはRaspberry Pi 2と専用ケース。Class 10 32GBのmicroSDはTranscend製が安かったので買ったのだが、これは失敗だった。これについては後述。後日、Sandisk Ultraに買い替えた。

運用は、1.5A供給のUSBチャージャーからmicroUSBで給電、短小イーサネットケーブルでルーターの空いてるポートに有線直結。あとはディスプレイもキーボードも全く繋がない状態でセットアップから運用までやってしまおう。

さて、最初にセットアップに必要なイメージをmicroSDに書き込む必要がある。一般的なセットアップではNOOBを選ぶのだが、これはデスクトップとして設定するためのもの。ここは最初からRaspbian Jessie LITEのイメージをダウンロードする。unzipしてimgファイルを取り出しておく。

さて、イメージを焼くのにOS Xを使うので、OS X用のイメージ焼きツールをダウンロード(https://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/)する。ddでもいいんだけど、面倒なのでね。Safariでアクセスするとなぜかダウンロードできないので、ChromeでアクセスしてRPi-sd card builderをダウンロードして準備。

さて、ここでSDカードをカードリーダーに挿入。ディスクユーティリティーからMBRパーティション、MS-DOS(FAT)フォーマットで初期化する。初期化が完了したらRPi-sd card builderでRaspbian Jessie LITEのイメージを指定してSDカードに書き込む。完了したらSDカードをRaspberry Pi 2のmicroSDカードスロットに差し込む。SDカードの表面がRaspberry Pi 2の底面側になるので注意。

これで準備完了。microUSB給電して起動。Raspberry Pi 2には電源スイッチはないので、給電したら即起動する。しかし、この時点ではヘッドレスなので何が起きてるかは分からない。とほほ。これがサーバー運営の醍醐味って奴かな。

 

オンライン / パーティション拡張

さすがに、カーネルのアップデートが出る度にいちいち旧カーネルを先にパージなんてことをしていたらいつ起動不能になるかわかったものではないので、なんとか / パーティションを拡張する方法はないかと考えていたら、実は / パーティションはLVMで管理されていることに気がついた。 🙂

sudo /sbin/lvscan

ACTIVE ‘/dev/bam-system/root’ [332.00 MiB] inherit
ACTIVE ‘/dev/bam-system/usr’ [8.38 GiB] inherit
ACTIVE ‘/dev/bam-system/var’ [2.79 GiB] inherit
ACTIVE ‘/dev/bam-system/swap_1’ [5.52 GiB] inherit
ACTIVE ‘/dev/bam-system/tmp’ [380.00 MiB] inherit
ACTIVE ‘/dev/bam-system/home’ [38.27 GiB] inherit

しかもext4フォーマットだからオンラインで拡張処理が出来る。ということは、どこかのパーティションを減らせば、それを拡張に割り当てることが出来るというわけだ。

ただ、縮小処理はアンマウントしないといけないので、ありあまってる /home から取るのはちょっとリモート操作では躊躇われる。なので、ここはぐっと我慢してswapを少し減らしてそれを / に回すことにしよう。

ますは、swapをオフラインにする。

sudo swapoff -a

次に swap パーティションを300MBほど減らす。

sudo /sbin/lvreduce -L -300M /dev/bam-system/swap_1

lvscanで無事にサイズが減ってることを確認したら再びswapをオンにするために、新しいswapを作成する。

sudo /sbin/mkswap /dev/bam-system/swap_1

sudo swapon /dev/bam-system/swap_1

さて、pvscanを使って、LVMに空きが300MB出来てることを確認しよう。

sudo /sbin/pvscan

PV /dev/sda5 VG bam-system lvm2 [55.66 GiB / 300.00 MiB free]
Total: 1 [55.66 GiB] / in use: 1 [55.66 GiB] / in no VG: 0 [0 ]

よしよし。空きを300MB確保出来た。次はext4のオンライン拡張だが、これはまずボリューム割当を増やし、そしてファイルシステムを拡張するという二段階を踏む必要がある。

sudo /sbin/lvextend -L +300M /dev/bam-system/root

減らした300MB分だけ / パーティションを増やす。念のため、容量をlvscanで確認。

sudo /sbin/lvscan

ACTIVE ‘/dev/bam-system/root’ [632.00 MiB] inherit
ACTIVE ‘/dev/bam-system/usr’ [8.38 GiB] inherit
ACTIVE ‘/dev/bam-system/var’ [2.79 GiB] inherit
ACTIVE ‘/dev/bam-system/swap_1’ [5.22 GiB] inherit
ACTIVE ‘/dev/bam-system/tmp’ [380.00 MiB] inherit
ACTIVE ‘/dev/bam-system/home’ [38.27 GiB] inherit

というわけで、計632MBに増えていることが確認出来た。linux-imageのサイズがだいたい170MBぐらいなので、この分だと3カーネルは保持出来る。十分だ。

ここで、祈れるものには何でも祈りながら、ext4のオンライン拡張を実行する。

sudo /sbin/resize2fs /dev/bam-system/root 632M

無事に完了したらファイルシステムが実際に増えていることを確認しよう。

df -h

なんとか延命完了。