自宅サーバの電源を外出先から入れる方法

自宅サーバをお持ちの皆様方は日々電気代と戦っているのではないでしょうか。
低消費電力のサーバを使っていても、チリツモで電気代がかかります。
我が家も例に漏れず電気代との戦いを繰り広げているので、いっその事必要な時だけどこからでも電源入れて使えるようにすればいいじゃないか、と結論づけました。

電気代気にするならVPSとか使えばいいやないかというツッコミは至極まっとうなのですが、我が家の場合はNASとしても稼働しているので家の中では Gigabit Ethernet で繋がってないと使い物にならず。

やりかた

世の中には古の時代から存在する WoL という非常にすばらしい規格があります。

Wake-on-LAN(ウェイク・オン・ラン、略称WoLあるいはWOL)は、コンピュータネットワーク(主にLAN)に繋がっているコンピュータの電源操作(投入、シャットダウンなど)を遠隔で操作するAMDが開発した技術あるいはその行為を指す。

参考:Wake-on-LAN - Wikipedia

普通のサーバ機ならまず対応してるので、これを使えば一発です。

とはいえ

WoL のページを見てもらえばわかるのですが、WoL で利用するマジックパケットはブロードキャストとして送信する必要があります。
つまり、家の外からやろうとした場合は何らかの方法でインターネット経由で家の中のLANにブロードキャストさせないといけません。

やり方は何通りかありますが、比較的楽なのはルータで静的IPマスカレード使って特定のポート宛に受け取ったパケットをLAN内のブロードキャストアドレス宛てに転送しちゃうことですね。
僕はこの方法でやりました。

マジックパケットの送り方

既に便利なソフトが沢山あるので、それを利用しましょう。
mac で Homebrew 使ってる人ならば wakeonlan が便利です。

% brew install wakeonlan

でインストールできます。
インストールが終わったら、以下のコマンドでマジックパケットが送れます。

% wakeonlan -i [IPアドレスかホスト名] -p [ポート番号] [MACアドレス]

更に楽にするには

上記のコマンドを alias とかに登録しとくと便利です。
僕は .zshrc に以下のように登録してあります。

alias wakeup.athena='wakeonlan -i [IPアドレスかホスト名] -p [ポート番号] [MACアドレス]'

まとめ

ココらへんの環境整理しとくと、外出先から必要な時にサーバの電源入れられるようになるのでとても便利です。
必要無いときは電源落としとけばエコですしね!
僕は HP の N54L でこれやってますが、激しく快適です。

Debian wheezy に docker をインストールする方法

docker のためだけに Ubuntu server に乗り換えようとしたんですが、今使ってる N54L ではキーボードが認識されずインストールが進まないので諦めました。
ココとかにレポートは上がってるんだけど、まだ直ってないみたい、つらい。

でも色々実験したいからサーバ上に docker の環境欲しい! というわけで調べてたら、Debian wheezy に docker をいい感じにインストールする方法を見つけたのでそのまとめです。

下準備

ありがたい事に wheezy 用に backport を準備してくれてる方がいらっしゃいました!
というわけで、それを利用します。

docker.io wheezy-backport

この backport を利用するためには公式の backport も必要になるので、両方共 /etc/apt/sources.list に追記します。

# wheezy-backports
deb http://ftp.jp.debian.org/debian/ wheezy-backports main non-free contrib
deb-src http://ftp.jp.debian.org/debian/ wheezy-backports main non-free contrib

# wheezy-backports(docker)
deb http://people.debian.org/~nomadium/apt/ wheezy-backports main
deb-src http://people.debian.org/~nomadium/apt/ wheezy-backports main

次に http://people.debian.org/~nomadium/apt/ 用の公開鍵を追加します。

# wget http://people.debian.org/~nomadium/apt/nomadium.asc
# apt-key add nomadium.asc

あとはお決まりのアップデート。

# apt-get update

docker のインストール

シンプルに apt-get でインストールするだけ。

# apt-get install docker.io

楽ちんですね。

動作チェック

どうせ debian のイメージばっかり作るので、手始めに debian のイメージ全部落とします。

# docker.io pull debian

その後、とりあえずシンプルに Hello docker! とだけ表示させてみます。

# docker.io run debian:wheezy /bin/echo Hello docker!

Hello docker!

ばっちり。

さいごに

2014/05/03 時点でインストールされるバージョンは以下のとおり。

# docker.io version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

HP の N54L で動かしてますが、今のところ快適です。

CarrierWave 利用時に RSpec の実行速度を高速化できるかもしれないたった一つの設定

CarrierWave、便利ですよね!
ファイルアップロードの定番なので、僕もよく利用しています。
ただ、場合によっては RSpec の実行速度を著しく下げる場合があるので、その改善法のご紹介。

とあるプロジェクトで実験してたのですが、もともと 15分 程度かかっていた spec の実行時間がこの設定だけで 7分 程度に削減されました!

高速化できるかもしれない場合

以下の条件に当てはまる場合、高速化できる可能性があります。

  1. CarrierWave を使っていて
  2. Uploader で画像のリサイズとかを行っていて
  3. FactoryGirl とかで Uploader がマウントされてる要素に画像をセットしてる場合

高速化するための魔法の言葉

既にお気づきの方もいらっしゃると思いますが、何も設定しないとテストの時も画像のリサイズとかが走ってるんですよね。
大抵の場合、spec 実行する際はリサイズされた画像なんて必要ない事が多いです。
ということはリサイズをしなくするだけで spec の実行速度があがるのでは!

というわけで、initializer で以下のような設定を追加しましょう。

CarrierWave.configure do |config|
  ....
  config.enable_processing = false if Rails.env.test?
  ....
end

効果のほどは

画像のリサイズを3種類ほど行ってるモデルで実験した所、以下の様な感じでした。

使ったコマンド

Benchmark.measure { 100.times { FactoryGirl.create(:profile) } }

結果

user system total real
before 10.230000 3.600000 28.620000 ( 41.236512)
after 8.640000 0.440000 9.080000 ( 9.847417)

ざっくりですけど、実行時間が 25% 程度になってます!

まとめ

今回の例だと対象のモデルがユーザのプロフィール関係だったので、それらを利用しまくっていた Feature spec が相当高速化されました。
プロフィール画像が必須で FacotyGirl で画像を設定している場合とかだと効果が顕著に出ると思うので、まだこの設定をしてない方は是非お試しあれ!

参考https://github.com/carrierwaveuploader/carrierwave#testing-with-carrierwave

5 分で作る Time Capsule もどき (Debian Wheezy 版)

netatalk が Time Machine のバックアップに対応してた気がする、と思って調べたらいい感じで対応してました!
今のところ OSX Mavericks から無線 LAN 経由でバックアップできてます。

環境

Debian Wheezy だと Time Machine のネットワーク経由でのバックアップに必要な AFP 3.3 に対応している netatalk が簡単にインストールできるので、それを使います。

OS
Debian Wheezy

保存先の作成

まずは Time Machine の保存先を準備します。
場所はどこでもOKですが、この作業をしているサーバは /storage にストレージをマウントしているので、/storage 配下にディレクトリを作ります。
また、Time Machine 経由でログインするユーザの権限でアクセスしたりするので、ディレクトリ自体はだれでもアクセルできるようにします。

# mkdir /storage/time_capsule
# chmod 777 /storage/time_capsule

netatalk のインストール

apt でサクッとインストールします。

# apt-get install netatalk

netatalk の設定

netatalk で Time Machine 用の設定を行います。

# vi /etc/netatalk/AppleVolumes.default

以下の内容をファイルの最後尾あたりに追加します。

/storage/time_capsule "Time Capsule" options:tm volsizelimit:500000

options に tm を指定するのがキモです。
Time Machine で利用する容量に制限をかけたい場合は volsizelimit を指定します。
詳細は以下のドキュメントを参照してください。

参考) http://netatalk.sourceforge.net/2.2/htmldocs/AppleVolumes.default.5.html#id1226920

netatalk の再起動と Time Machine の設定

あとは netatalk を再起動すれば終わりです。

# /etc/init.d/netatalk restart

再起動後に Time Machine のディスクの選択を選ぶと、今設定したやつが見えるようになってます。

f:id:ruzia:20140104013247p:plain

参考情報

以下の blog が大変参考になりました!

Time Machine with Netatalk:HAT blog

mdadm と LVM で作る、全手動 BeyondRAID もどき

自宅のファイルサーバをリプレースしていて、冗長性と拡張性を兼ね備えるべく色々試行錯誤したらいい感じになったのでそのまとめです。

ファイルサーバの容量拡張、困ってませんか?

自宅でファイルサーバを運用してるんですが、以下の 2 点をいい感じで満たそうとして大体悩みます。

  1. 冗長性の確保
  2. 拡張性の確保

どちらも RAID5 にすれば何とかなるっちゃーなるんですが、HDDベイを使い切った後で容量を増やすのが大変です。
例えば搭載できるHDDの数が 4 台で場合に全てを RAID5 にしていたら、そこから容量増やすとなると 4 台全ての容量を上げないといけません。 お財布的に優しくなさすぎるので、せめて2台換装したら容量増えるとかにしたい!

そんなアタナに Drobo が(※

そんな悩みを解決してくれる製品が世の中には既にあります。
有名なのは

Drobo 5N NAS SATA 3.5インチ 5ベイ ホットスワップ / Beyond RAID DR-5NSTD

Drobo 5N NAS SATA 3.5インチ 5ベイ ホットスワップ / Beyond RAID DR-5NSTD

とかですね。
容量が全く違うHDDを組み合わせれる上に冗長性を確保してくれるという優れものです。
容量が足りなくなったら一番容量の小さなディスクを交換すればOKという簡潔っぷり。

ただし値段がお高い・・・!

ですよねー、という感じで、箱だけでも結構いい値段(6諭吉以上)します。
HP の Microserver が 1.5諭吉とかで買えてしまう事を知っていると、なかなかお財布の紐を緩ませることができません。

しかーし、ありがたい事に Drobo で使われてる技術(Beyond RAID)の概要は公開されてます!

Beyond RAID とは

以下が概要です。

http://en.wikipedia.org/wiki/Drobo#BeyondRAID

ざっくり言うと、RAID1 か RAID5 でHDDを横断する領域をいくつか作って、その領域をまとめあげる事で大容量のストレージを作る感じですね。
これのイケてる点は HDD が 1 台消えても大丈夫な上に、状況によっては HDD を 1 台交換するだけでストレージの容量がアップすること。
最低 2 台の HDD を大容量の物に交換すれば確実に容量が増えます。
ココらへんの管理を全自動でいい感じにこなしてくれる上にホットスワップもできるとくれば、そりゃ Drobo は高いですよね。
非常によく出来てらっしゃる、めっちゃ欲しい。

しかーし、RAID 周りは mdadm でOKだし、領域をまとめのは LVM で行けますね。
ということは、頑張れば全手動 Beyond RAID が作れるのでは!

というわけで作ってみました

世の中には似たような事を考える方がいるもので、先人がいました!
参考) nakanote blog UbuntuでDrobo風なNASを作る
この手順を参考にさせて頂きつつ、自分の環境やらに合わせたものを書いておきます。

結果だけ先に書くと、容量が 4 TB 程で速度が 180MB/sec 程度出るストレージができました。
トリッキーな構成だけど悪くない速度です。

環境とか

マシン HDD OS
HP ProLiant Microserver N54L WD20EARX * 3 Debian 7.0

※) OS は USB メモリにインストール
※) /dev/sda から /dev/sdc までに WD20EARX が刺さってます

領域ごとの容量設定

本来の Beyond RAID はサイズが異なるディスクをいかようにも組み合わせれるのがメリットですが、自分の環境で考えるとそこまで煩雑にHDDを追加したりしません。
追加するとしてもHDDごとに 1TB は増やすと思うので、各領域のサイズは 1 TB で良さそうです。
あと、RAID を組む際にセクタ数がずれてると面倒なので、今回は各パーティションをセクタ数単位で管理します。

1,000,000,000,000B(1 TiB ではなく 1 TB) / 512B = 1,953,125,000s

また、AFTのからみで 2048 で割り切れるセクタ数じゃないと後続のパーティションのアライメントがずれるので、その調整もします。
最近はアライメントがずれてると parted が警告してくれるので助かりますね。

1,953,125,000s より大きくて、2,048 で割り切れる最小のセクタ数
----
1,953,126,400s

というわけで、1 パーティションあたり 1,953,126,400s にします。
WD20EARX は 2 TB なので、HDDごとに 2 つのパーティションを作ります。

必要なソフトのインストール

パーティションを設定するための parted、後はソフトウェア RAID の mdadm と LVM を入れます。

# apt-get install parted mdadm lvm2

各ディスクの準備

/dev/sda から /dev/sdc まで、以下の様な感じでパーティションを設定します。

# parted /dev/sda
(parted) mklabel gpt
(parted) mkpart                                                           
---
Partition name?  []? md0
File system type?  [ext2]?                                                
Start? 2048s
End? 1953128447s
---
(parted) mkpart                                                           
---
Partition name?  []? md1                                                  
File system type?  [ext2]?                                                
Start? 1953128448s
End? 3906254847s

RAID アレイの作成

パーティションが切り終わったら、次に各パーティションをまとめて RAID5 な領域を複数作ります。

# mdadm --create --assume-clean /dev/md0 --level=5 --metadata=1.2 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1
# mdadm --create --assume-clean /dev/md1 --level=5 --metadata=1.2 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2

これで 2TB * 2 で計 4 TB の領域ができました。

LVM の設定

/dev/md0 と /dev/md1 を PV にして、それらを集めた VG を作り、そこから LV を作ります。

# pvcreate -M2 /dev/md0 
# pvcreate -M2 /dev/md1
# vgcreate storage /dev/md0 /dev/md1
# lvcreate -l 100%FREE storage

ファイルシステムの作成

そろそろ ext4 でいい気がするので ext4 でフォーマット。
/ にするわけじゃないので、スーパーユーザ用の予約領域は 0 にします。

# mkfs.ext4 -m 0 /dev/storage/lvol0

自動マウントの設定

まずは作成した LV の uuid を確認します。

# tune2fs -l /dev/storage/lvol0
....
Filesystem UUID:          ef5ba377-2f9c-47cf-8cb7-29e936f2806a
....

あとは /etc/fstab で自動的にマウントされるようにしたらOKです。

# vi /etc/fstab
....
UUID=ef5ba377-2f9c-47cf-8cb7-29e936f2806a /storage ext4 defaults 0 2
....

簡単な速度計測結果

hdparm でベンチマーク取ってみます。

# hdparm -tT /dev/storage/lvol0 

/dev/storage/lvol0:
 Timing cached reads:   3238 MB in  2.00 seconds = 1618.80 MB/sec
 Timing buffered disk reads: 554 MB in  3.00 seconds = 184.42 MB/sec

基本的に GbE 経由でアクセスするので十分な感じです。

容量を増設する場合

以下のような感じで増設ができます。

  1. HDD ベイが埋まるまでは RAID5 の領域にパーティションを追加する
    1. md 側の領域を増やす (mdadm --add と mdadm --grow)
    2. PV をリサイズする (pvresize)
    3. LV をリサイズする (lvextend)
    4. ファイルシステム側を増やす (resize2fs)
  2. HDD ベイが埋まったら HDD を換装する
    1. HDDを容量増やした物に換装する (既存の RAID5 領域が degraded に)
    2. 1 TB ごとのパーティションを作成する (parted)
    3. a で degraded になった RAID5 に b で作ったパーティションを割り当てる (mdadm --add、 mdadm --grow)
    4. b で作ったパーティションで RAID1 が新たに組める場合、組んでから LV に追加する (mdadm --create、pvcreate、vgextend、lvextend、resize2fs)
    5. b で作ったパーティションで既存の RAID1 を RAID5 に変更出来る場合は変更する (mdadm --grow と pvresize、lvextend、resize2fs)

まとめ

全手動とはいえそこまで面倒じゃないし、いい感じで使えそうです!
結構トリッキーな構成なので速度も遅いかなーと思ったんですが、実用上問題ない速度でますし。

今回このファイルサーバを作るにあたって、HP ProLiant ML115 G1 から HP ProLiant Microserver N54L に乗り換えたんですが N54L は良いですねー!
小さいし、HDDの交換しやすいし、デフォでもファンが静かだし、CPUもそこそこ回るし。
一番新しい HP ProLiant Microserver Gen8 が一気に値段上がったのが悲しいですが、このシリーズは末永く続いて欲しいところです。

HP ProLiant MicroServer N54L 上の Debian 7.0 で「W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin for module tg3」とか警告が出る場合の対処法

お家のサーバを HP ProLiant ML115 G1 から HP ProLiant MicroServer N54L に乗り換えたんですが、kernel の更新しようとしたらタイトルのような警告が出たのでその対処法です。

環境

マシン OS
HP ProLiant Microserver N54L Debian 7.0

症状

kernel の更新しようとしたら、以下の様なメッセージが表示される。

W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin for module tg3
W: Possible missing firmware /lib/firmware/tigon/tg3_tso.bin for module tg3
W: Possible missing firmware /lib/firmware/tigon/tg3.bin for module tg3

原因

調べてみたら、N54L の NIC 用の firmware が apt-line の main に入ってない模様。

参考) http://packages.debian.org/ja/stable/firmware-linux-nonfree

というわけで、インストールします。

インストール方法

まずは apt-line に firmware-linux-nonfree の含まれてる non-free を追加し、その後 firmware をインストールします。
firmware をインストールすると自動的に kernel も更新されます。

apt-lineに non-free と contrib を追加

ここではどうせなので contrib も追加してます。
以下のはサンプルで1行だけですが、全ての deb に追加します。

# vi /etc/apt/sources.list

変更前

....
deb http://ftp.jp.debian.org/debian/ wheezy main
....

変更後

....
deb http://ftp.jp.debian.org/debian/ wheezy main non-free contrib
....

apt の更新と firmware のインストール

# apt-get update
# apt-get install firmware-linux-nonfree

以上で警告が表示されなくなります。

ソニックガーデンのプログラマになりました!

このたび株式会社ソニックガーデンに転職し、プログラマとして働くことになりました。
新卒で九州にある某ベンチャーに飛び込んだり、師匠(@beyondseeker)と共に起業したりしてきましたが、今後はソニックガーデンのプログラマとして様々なビジネスを盛り上げるお手伝いをしていきます。
 
f:id:ruzia:20130302235440j:plain  
 
折角の節目なので、ソニックガーデンとの出会いや採用を通じて感じたことなどをまとめておきます。
ちなみにですが、僕も@mah_lab@jnchitoと同じく、半年くらいかけて入社が決まりました。

ソニックガーデンとの出会い

去年の9月くらいに@maedanaが日本に戻ってきたタイミングで飲みに行ったのがきっかけです。
 
その頃はもろもろのやんごとなき事情により転職先を探さないといけないなーという状況だったので、今考えるとものすごく素敵なタイミングでした。
そこで互いの状況とかを話す中でソニックガーデンの話を聞き、その後はひたすらにソニックガーデンの事を調べ尽くしました。
 
Webページ社長ブログYouTubeに上がっている動画、SlideShareに上がっているスライドなどなど、とにかく手に入れられそうな情報は全てに目を通しました。
 
そして色々な情報を調べれば調べるほどソニックガーデンという会社に惚れ込み、@maedanaに是非応募させて頂きたいと伝えて、そこから僕のソニックガーデンへの猛アタックが始まりました。

ソニックガーデンの採用活動

一言でざっくり言ってしまえば、とても真摯で誠実でした。
 
今回は誘われたのではなく僕が惚れたのがスタートなので、初めはソニックガーデンのどこに惚れたのかとかをひたすらに話していた気がします。
その中で、何を想って仕事をしているのかとか、IT業界をどうしていきたいのかとか、ソニックガーデンで何をしたいのかとか、とにかく色々な内容に関してひたすら話し合いを続けました。
途中、どんなコードを書くのかのチェックとか一緒に働けるかの相性チェックとかもありましたが、こっちでも事あるごとに色々と話し合いました。
 
その話し合いの中で、僕が惚れてると伝えた様々な箇所に対して、一つ一つ「実際はこうだよ?」といった形で認識がずれてないかも散々話し合いました。
また、そういった話を色々繰り返していく上で何度も「思っていたのと違ったりしない?大丈夫?」といった確認もしてくれました。
 
ソニックガーデンの採用情報のページには

お互いの理解が大事

と書いてありますが、まさにそれを地で行く感じですね。
完全に納得が行くまで、ひたすらに話し合いを続けた感じです。
 
アタックしてる間は難攻不落過ぎて正直大変でしたが、考え方から仕事の仕方まで全部ひっくるめてそういったやり取りを繰り返したので、「入ってみたら思ってたのと違う!」という所が今のところ1ミリも発生してません。
ソニックガーデンは全員からOKを貰わないとダメなので双方共に大変ですが、そこに関して一切手を抜かないあたり、仲間探しも全力なんだなーと強く感じました。  

というわけで

転職したばっかで待望の第一子が生まれそうだったりとなかなかに激動な感じですが、自分の作ったソフトウェアで一人でも多くの人に喜んでもらうべくがつがつ頑張っていきます!

ちょっとだけ宣伝

前職で作っていたAndroid向けの英単語学習ソフトのエクタンは我ながら良い出来だと思うので、英単語を学習したい人は是非お試し下さい!