自宅サーバのブログ記事

録画サーバに繋げたHDDは容量も弾数も増えていくよね、ってことで、HighPoint Rocket 2720SGLを導入したわけだけれども。

PCI Express x8動作のminiSAS×2(=SATA×8)のHost Bus Adapterですね。

 

ケースからワサワサとケーブル(miniSAS→SATA×2、SATA電源×2)を吐き出させて、「裸族のマンション二号棟」(終売)×2を合体&前面に蓋追加して、ここにディスクを載せた。

IMG00412.jpg

IMG00405.jpg

IMG00409.jpg

 

・・・はて。どのディスクに何が入っているやら・・・。(あるあるーw)

同じ型番のディスクが何発もあると、いちいちマシン停止して繋ぎ変えてたりとかめんどくせーし。

アクセスランプさえあれば! Σ(゚Д゚)

 

ってことで、ぐぐるとこのページのお方がほぼ同じことをしようとしておりまして、大変参考になったです。感謝。(*ゝω・)ノ アリガ㌧♪

ふむふむ。LEDのカソードをRocket 2720SGLのピンに、アノードを3.3Vに繋げればいいのね・・・。

むむぅ。3.3Vって5Vから作らねばならんのか・・・。ま、電子工作とかもやってみたいし。ブレッドボードとか楽しそうだな。\(^ω^)ノ ヤッホイ

ほほぅ。内部USBの延長ケーブルとか便利に流用できるのかー。

 

しかし、HDD単体にアクセスランプを繋げられないものだろうか、とまたぐぐる。

ちょいちょい出てきますな。SATA電源の11番ピンが引き出せれば、そこに繋げればいいらしい。

だが、11番ピンにアクティブ信号を出すのは任意らしく、対応していないHDDがあるらしい。

#WDは対応してるとか、Seagateは対応してないとかだったようななな・・・。

そしてなにより、SATA電源ケーブルで11番ピンだけ外に出してくれるものはないらしい。

SATA電源ケーブルは、1~15番を3つずつ5本(3.3V/GND/5V/GND/12V)にまとめられているのが通常。

3.3Vと11番を含むGNDを繋げれば良さそうではあるが、対応してないHDDとか持ってるし。

 

ん?SATA電源に3.3Vがある!?5Vから作り出さなくてもいいんじゃんww

というわけで、SATA電源の3.3VとRocket 2720SGLのアクティブピンに接続することに決定。( ゚Д゚ノノ☆パチパチパチパチ

 

というわけで、まずはSATA電源から3.3Vを取ってくる。

もちろん、PC電源でSATA電源として3.3Vを出力している事が必要。

3.3Vがなくても、HDD内部で3.3Vを作り出してるらしく、4ピンからSATA電源に変換するアダプタ/ケーブルとかあって、使ったりしてるけど、もちろんそれじゃダメダメ。

ちゃんとPC電源から直に生えてるSATA電源を引っ張り出してくる。

で、SATAの分岐ケーブル電源コネクタと追加で3.3Vを引っ張り出すためのラインを適当に用意して、ガッチャンコ。

IMG00408.jpg

黄色いラインが3.3Vを引き出したやつですお。

 

お次は、Rocket 2720SGLのアクティブピンに内部USBケーブルを流用、接続して引っ張り出してくる。

内部USBケーブルは、2個分をまとめた9ピン用のが売られていたりするけど、2720SGLは単純なHBAでFailure信号用のピンがないのでこれでもOK。(^ω^)b ダイジョーブ

#Failure信号用のピンのあるRAIDカードだったりすると、9ピン用だと物理的にダメだと思う。

IMG00411.jpg

赤い大量のminiSASからファンアウトしたSATAケーブル、PC電源からのSATA電源ケーブル×2とともに、アクティブピンに接続した内部USBケーブルをケース後方から引き出してみた。

 

ここで、もう一個内部USBケーブルを持ってきて、片側を切断、ラインむきむき、3.3Vのラインにハンダ付け、仕上げは絶縁テープまきまき。

 

これで、Rocket 2720SGLから引き出したアクティブ信号の9ピンUSBコネクタと3.3V電源の9ピンUSBコネクタが出来ましたとさ。

USBコネクタからケーブルをそれぞれ片側半分を引っこ抜いて(精密マイナスドライバで外側から金属部分が見えている部分の下の方の爪をちょっと持ち上げながらケーブルを引っ張る)、入れ替えてそこにLEDをそのまま挿せるようにしてみた。

#ただし、3.3Vの方の9ピン目は要らんし、間違えたりすると嫌なので切除した。

IMG00404.jpg

ただし、LEDの足はUSBのピンより細いらしく、ゆるゆるなのでUSBコネクタの金属部分が見えているところを細いもので押し込んで、LEDの足でも挟まるように狭めてやる必要があった。

#白い方のコネクタの右端が光ってますが、動画再生して点滅するか確認中だったから。

 

作成したLEDパーツの全体像がこちら。

IMG00406.jpg

 

さて、このLEDパーツをどこにどうやって収めるかが残る課題ですが、なんか飽きたww

 

【追記】

結局、こう収めたよ。

IMG00415.jpg

PCケースの後部スロットを塞ぐ板を曲げて、穴あけて、LED差し込んで、ゴニョゴニョしてネジ止め。

Node.jsのインストール

今更ですが、Node.js (0.6系)のインストールメモ

 

 

●Windowsの場合

インストーラでインストールするだけ

http://nodejs.org/#download

NPMも使えるようになったね。

楽になったもんですな。

 

●Ubuntuの場合

apt-getでインストールする。

下記リポジトリを利用させていただく。

https://launchpad.net/~chris-lea/+archive/node.js

「Technical details about this PPA」のリンクをクリックすると

インストールのための設定方法が表示される

 

・リポジトリ追加

 /etc/apt/source.listを編集

 deb http://ppa.launchpad.net/chris-lea/node.js/ubuntu YOUR_UBUNTU_VERSION_HERE main

 deb-src http://ppa.launchpad.net/chris-lea/node.js/ubuntu YOUR_UBUNTU_VERSION_HERE main

 

・キー追加

 「Signing key」をクリック

 →キーの文字列をクリック

 →keyIDをクリック

 →-----BEGIN 以下をコピーしてファイルに保存

 

 apt-key add [key file]

 

#下記で一気にできるらしい(未確認)

 add-apt-repository ppa:user/ppa-name

 

・インストール

 apt-get update

 apt-get install nodejs

 

●NPMの設定

 

プロキシを通らなければならない場合、下記を設定する。

・プロキシ設定

npm set proxy http://[proxy]:[port]

 

・レジストリ設定

proxy設定だけだとhttpsを使おうとして、有効でない証明書でエラーになる(っぽい)

npm config set registry http://registry.npmjs.org/

これで、httpsでなくhttpを使うようになる(っぽい)

PostgreSQLにPostGISを使って位置情報を入出力する。

MapServerは、PostgreSQLにアクセスして情報を取得、WEBへサービスする。

OpenLayersは、MapServerにアクセスして情報を取得、ブラウザ上に地図を描画する。

 

で、ここにいろいろと情報を載っけられるようにして行こうということで、とりあえずGoogle Mapの表示とPostGISに格納した自前の位置情報を重ね合わせるサーバをたててみる。

  1. 前提(インストール済み)
    • Ubuntu 10.10
    • Apache2
    • PostgreSQL 8.4
  2. インストールするパッケージ名
    • postgis (proj, geos, gdal)
    • postgresql-8.4-postgis (Ubuntu 10.10から。10.04だと8.3用しかない。)
    • cgi-mapserver
    • mapserver-bin
  3. 手動でダウンロード&設置するもの
    • OpenLayers
      http://openlayers.org/download/ からダウンロードする。
      現在(2010/11/05)のバージョンは2.10。
      ApacheのDocumentRoot(/var/www/)とか、お好きなところに展開、設置。
  4. PostGISの設定
    • PostgreSQLにテンプレートDBを作成する
      createdb template_postgis -E UTF-8
      createlang plpgsql template_postgis
      psql template_postgis -f /usr/share/postgresql/8.4/contrib/postgis.sql
      psql template_postgis -f /usr/share/postgresql/8.4/contrib/spatial_ref_sys.sql
      createdb -T template_postgis (データベース名)
      createuser (Apache実行ユーザ)
    • SQLを実行して確認
      select * from postgis_version();
                  postgis_version            
      ---------------------------------------
       1.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
      PostGISのバージョンが1.5で、GEOS、PROJが使用されていることが確認できる。
      ※参考 http://lets.postgresql.jp/documents/tutorial/PostGIS/1/
  5. 自前の地図情報をPostGISを使ってPostgreSQLにデータを入れる
    • 自前のデータを用意する
      サンプルとして植生のデータをダウンロードしてくる。
      http://www.vegetation.jp/
      ー>植生図を見る(全国)
      ->植生図をみる(地域)
      ->2次メッシュを選択
      ->2次メッシュ情報
      ->植生図GISデータ(シェープファイル)
      ->同意してダウンロード
      ->zipファイルがダウンロードされる
      ー>解凍した中の.shpファイルを利用するよ。
    • shpファイルからSQLファイルを作成する
      shp2pgsql -s 4612 -D -i -I -W (shpファイルの文字コード) (shpファイルパス) (テーブル名) > (SQLファイルパス)
      shpファイルの文字コードは、shpファイルを配布しているところで仕様を確認する。
      前述の植生図の場合はShift-JIS。Shift-JISの場合、cp932を指定したほうが無難とか。

      以下引用そのまま
      標準出力に出てきますので、リダイレクトして下さい。
      -Dはダンプ形式にするためのものです(これが無い場合はINSERT文が並べられ、叩き込むのに時間がかかります)。
      -iは整数を32ビットにするためのものです(これが無い場合は16ビットにされます)。
      -Iは作成されるGEOMETRY型カラムに空間インデックスを貼るSQL(CREATE INDEX)を生成するためのものです。
      -W cp932 は、シェープファイルの文字コードを指定します。なおShiftJISでなくcp932とする方が無難です。
      -s 4612 は「おまじない」です。(srid?座標系?要勉強ww)
    • データをPostgreSQLに入れる
      psql (データベース名) -f (SQLファイルパス)
    • テーブルアクセス権限付与
      GRANT SELECT ON (テーブル名) TO (ユーザ名);
  6. MapServerの設定
    • Apacheの設定
      /usr/lib/cgi-bin/mapserv にMapServerのCGIがインストールされているので、Apacheから実行できるようしておく。

      http://localhost/cgi-bin/mapserv をブラウザで開いてみて、
      No query information to decode. QUERY_STRING is set, but empty.
      とか表示されればOK。
    • Google Map向けの設定
      Google Mapで使われている投影(測地系)を設定する。
      /usr/share/proj/esri.extra の最後に記述してある、google用の設定(<900913>〜)を
      /usr/share/proj/epsg にコピペで追記する。
      参考 http://shigekun.blog.so-net.ne.jp/2009-04-10-1
    • 自前の地図情報用のMapファイルを作成する
      eda.map

      フォントの設定ファイル指定
         FONTSET "./fonts.txt" # フォント用ファイル
      fonts.txt

      PostGISで接続するための設定
          LAYER
            NAME "main"
            CONNECTIONTYPE POSTGIS
            CONNECTION "host=localhost user=(ユーザ名) password=(パスワード) dbname=(データベース名)"
            DATA "the_geom FROM (テーブル名)"
      ・・・・・

      Google Mapの上に重ねるので透過させるための設定
      TRANSPARENT on (3箇所www)

      Google Mapに座標系を揃えるための設定
         WEB
            METADATA
          WMS_SRS "EPSG:4326 EPSG:900913"
            END
         END

      Mapファイルのリファレンス
      http://mapserver.org/mapfile/map.html
    • Mapファイルの設置
      MapServerのCGI(mapserv)から読めるところにあればどこでもいいのだが、httpでmapservを呼ぶときにMapファイルのパスを指定することになるので、見られても構わないようにすること。

      mapservと同じディレクトリにシンボリックリンクを貼るとか
      ln -s (マップファイルの設置場所) (mapservと同じディレクトリ)/mapfiles

      ・・・測地系?座標系?よくわかってねぇwwww 勉強しなきゃだねwwww
      参考 http://bubble.atnifty.com/modules/bwiki/
  7. MapServer用ライブラリの言語別パッケージいろいろ(自分でMapServerアプリを作るときにお好みで)
    • perl-mapscript
    • php-mapscript
    • python-mapscript
    • libmapscript-ruby
  8. OpenLayersで表示してみる
    • Google Map(API v3)と自前の地図情報を重ねて表示してみる
      OpenLayersサンプル
      HTMLとJavaScriptのソースを見てね

      ベースに各種Google Mapを選択式で設定する。
      行22 // allOverlays: true, 
      マップをすべて重ねる(ベースなしにする)ための設定

      Google Mapの座標系変換とベースの指定
      行31  {"sphericalMercator": true, isBaseLayer: true}
      行35、39、43も同様

      自前の地図情報を重ねる設定
      行47〜51
      var wms = new OpenLayers.Layer.WMS( "eda",
      "http://recitativo-fant.asia/cgi-bin/mapserv?map=mapfiles/eda.map&SERVICE=WMS&VERSION=1.1.1&",
      {layers: "main", transparent: true},
      {isBaseLayer: false, visibility: true, opacity: 0.5, gutter: 15}
      );
      行47 OpenLayersで表示するレイヤ名
      行48 MapServerの呼び出し(Mapファイルのパス指定)
      行49 Mapファイルにしていしたレイヤ名、透過指定
      行50 ベース指定

      下記にサンプルがいっぱいあるのでのぞいてみると良いですな。
      http://openlayers.org/dev/examples/
      Google Mapのサンプルを参考にする場合は、API v3を見ると良いです。
      v2はキーが必要になり、そのままコピーして利用すると「キーを取得しろ」とかダイアログが表示されて、表示が遅延するため、一番上に表示されて、OpenLayersの地図操作コントロールが下になってしまったりする。

Ubuntuのシステムディスクを交換

ってか、変更なんだけどね。

自鯖のAtom 330 のマザボ、D945GCLF2にPT2を入れるには、今刺さっているSATA×4のPCIカードを抜かなければならない。

それには、IDEのシステムディスク、SATAのデータディスク×4、IDEの光学ドライブの構成を変更する必要がある。

D945GCLF2には、SATA×2とIDE×1しかない。

っつーことで、光学ドライブは外付けにしちゃうとして、データディスクのまだ使っていないやつをシステムディスクに変更して、「SATAに2台、IDEにアダプタかまして2台」のディスク構成に変更するなり。

 

まずは、システムディスクのバックアップを作成する。

  1. UbuntuのCD-ROMから起動する。ここでは、日本語Remixのデスクトップ版を使う。
  2. dumpとrestoreをインストールする
    1. /etc/apt/source.list に 「dev http://jp.archive.ubuntu.com/ubuntu [OSのバージョン] universe」、 「dev-src http://jp.archive.ubuntu.com/ubuntu [OSのバージョン] universe」を追記
    2. sudo apt-get update
    3. sudo apt-get install dump
  3. バックアップ実行
    1. sudo dump -0 -u -j /dev/[ルートのパーティション] -f [バックアップファイルのパス]

次に新しいシステムディスクの準備

  1. GUIのディスク管理ツールで新しいディスクのパーティションを作成して、フォーマットする。
  2. ルートパーティションは起動ディスクに指定しておく。
  3. ルートを40GB、スワップを実メモリの2倍、残りはデータに使うことにした。

そして、リストア

  1. 新しいディスクのルートパーティションをマウントして、そこに移動。
  2. sudo restore -rf [バックアップファイルのパス]
  3. すると、カレントディレクトリにバックアップがリストアされる。

新しく作ったパーティションのUUIDを調べて、リストアしたファイルの内、起動、マウントに必要なファイルを編集する。

  1. sudo ls -l /dev/disk/by-uuid で新しく作ったパーティションのUUIDを調べる。
  2. /etc/fstab の古いUUIDを新しいUUIDに変更する。
  3. /boot/grub/menu.lst の古いUUIDの部分を新しいルートパーティションのUUIDに変更する。
  4. /etc/initramfs-tools/conf.d/resume のスワップパーティションの指定(あるいは古いUUID)を新しいものに変更する。

MBRの書き込み(GRUBのインストール)

  1. CD-ROMから再起動して、最初の起動メニューでF6を押して起動オプションを変更する。
  2. 「boot=casper」を「root=/dev/[ルートパーティション]」に変更して起動。
  3. 起動したら、sudo grub-install /dev/[新しいディスク] ←パーティションではない

これで新しいディスクから起動できればOK。

だめだったら、/etc/fstabや/boot/grub/menu.lstの記述、UUIDをチェックする。

 

追記:2011/02/11

Ubuntuを10.10にアップグレードしたら、UUIDが合ってるのに起動しなくなったorz

しゃーないので、/boot/grub/menu.lstのuuid=~の行を削除、root=uuid~のところをroot=/dev/sda1に変更して起動した。

MySQLのバックアップスクリプト

Movable Typeを5にアップグレードしたので、そのデータベースもPostgreSQLからMySQLに移行するハメになった。
ので、MySQL用のバックアップスクリプトも書いたよ。もちろん、世代管理機能付き♪
ちなみに、PostgreSQL用のバックアップスクリプトはこちら

mysqldump_daily.sh
#/bin/sh

##################################################
# MySQL database backup script
#
# Dump to DB_NAME.YYMMDD.dump
# Delete expired dump file
# Output log file.
##################################################

##################################################
# Settings
USER="username"
PASS="password"

# space separated value: databases and backup directories (full path)
DB_NAMES="movabletype"
BAK_DIRS="/backup/mysql/daily"
WK_DIR="/etc/backup"

# log file path
LOG="/backup/mysql/mysqldump_daily.log"

BAK_NUM=15
##################################################

##################################################
# Main routine
TODAY=`date +%Y%m%d`

echo "@@@ Start Database Backup [ `date +%Y/%m/%d` ] @@@" | tee -a $LOG

# backup each "DB_NAMES"
for DB_NAME in $DB_NAMES
do
CNT_DIR=1
CP_SRC=""
CP_DST=""

# backup to each "BAK_DIRS"
for BAK_DIR in $BAK_DIRS
do
if [ $CNT_DIR -eq 1 ]; then

# create dump command
COM="mysqldump -u$USER -p$PASS $DB_NAME"
if [ $DB_NAME = "ALL" ]; then
COM="mysqldum -u$USER -p$PASS --all-databases"
fi

# execute dump command
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [start]" | tee -a $LOG
DUMP_FILE_PATH=$WK_DIR/$DB_NAME.$TODAY.dump
$COM > $DUMP_FILE_PATH | tee -a $LOG
mv $DUMP_FILE_PATH $BAK_DIR
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] $COM [done]" | tee -a $LOG
CP_SRC=$DUMP_FILE_PATH
else
# copy dump file to other BAK_DIRS
CP_DST=$BAK_DIR/$DB_NAME.$TODAY.dump
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [start]" | tee -a $LOG
cp $CP_SRC $CP_DST | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Copy dump file to $BAK_DIR [done]" | tee -a $LOG
fi

# delete old backup files
LS=`ls -r $BAK_DIR/$DB_NAME.*.dump`
CNT=1
for FILE in $LS
do
if [ $CNT -gt $BAK_NUM ]; then
rm -f $FILE | tee -a $LOG
echo "[" `date +%Y/%m/%d_%H:%M:%S` "] Delete expired dump file [$FILE]" | tee -a $LOG
fi
CNT=`expr $CNT + 1`
done

CNT_DIR=`expr $CNT_DIR + 1`
done

done
echo "@@@ Finish @@@" | tee -a $LOG
##################################################


Settings セクションにmysqldumpを実行するユーザとパスワードを設定して、火曜0時~日曜0時に取る分(上記スクリプトそのまんま。mysqldump_daily.sh。)と月曜0時に取る分(「daily」を「weekly」 に変更したもの。mysqldump_weekly.sh)を作ります。
これらの.shファイルを/etc/backupなどのフォルダに突っ込んで、そこをWK_DIRにします(まぁ、どこでもいいんですが)。
DB_NAMESパラメータにバックアップ対象のデータベース名をスペース区切りで入力します。
BAK_DIRSパラメータにDB_NAMESに指定したデータベースに対応するバックアップ先ディレクトリをスペース区切りで入力して、そのディレクトリを作成します。
BAK_NUMパラメータで指定した日数分が保持されます。
LOGはログファイルの保存先を指定します(cronに登録しちゃうのでメールが来るからいいや、という話もあるがw)。

ここまでのバックアップ処理を crontab -e で登録。
10  0 * * 1   /etc/backup/mysqldump_weekly.sh
10  0 * * 2-6 /etc/backup/mysqldump_daily.sh

以上。

VPNのセットアップ

VPNサーバを立てますよ。
出先から自宅にアクセスできるようにするんです。

最初PPTPDをセットアップしたけど、出先のネットワークがGREポートを通してくれないから、OpenVPNもセットアップした。

ここでは、OpenVPNのセットアップをまとめておくです。

UbuntuのVPNサーバにWindowsクライアントから接続できるように設定するよ。

  • OpenVPNとbridge-utilsのインストール
まずはインストール。
bridge-utilsは、一つのEtherポート仮想化して(br0)、VPN(tap0)とその他(eth0ポート)から使えるようにするもの(らしい)。
apt-get install openvpn bridge-utils
※sudoが面倒なので、私はrootで実行しちゃいますw

  • 鍵ファイルの作成
OpenVPNは鍵ファイルを使った認証なのでその辺の作業をしていく。
鍵ファイルを作るスクリプトがインストールされているので、そこに移動。
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0

ここに vars というファイルがあるので、その一番下の方を編集して、鍵を作るときの情報を入力。
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Kanagawa"
export KEY_CITY="Yokohama"
export KEY_ORG="recitativo-fant.asia"
export KEY_EMAIL="メールアドレス"

あとは、下記手順でCA、サーバ鍵、クライアント鍵を作っていく。
source vars
./clean-all
./build-dh
./build-ca

# サーバ鍵を作成 : 鍵の名前は "server"
./build-key-server server

# クライアント鍵をパスワード付きで作成 : 鍵の名前は "client01"
./build-key-pass client01
ここで作成するクライアント鍵1個に対して、IPアドレスが1個割り振られる模様。
なので、同時接続するクライアントの数だけ鍵ファイルを作成すること。

すると、keysというディレクトリの中に鍵ファイルが作られるので、このうち必要なものをコピーする。
cd keys
mkdir /etc/openvpn/keys
cp ca.crt /etc/openvpn/keys
cp dh1024.pem /etc/openvpn/keys
cp server.crt /etc/openvpn/keys
cp server.csr /etc/openvpn/keys
cp server.key /etc/openvpn/keys

クライアント側には下記ファイルをコピーする。
ca.crt
client01.crt
client01.key

  • サーバの設定
★この設定途中でOpenVPNを再起動してはいけない!
★途中で再起動すると、ネットワークが全部とまったりするorz。

まずは、OpenVPNの設定。
/etc/openvpn/server.conf を作成します。
内容は下記の通り。
proto tcp
port 1194

# デバイスのインターフェースは tap0 を使う
dev tap0

# 鍵ファイルの設定
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem

# サーバブリッジの設定
# 192.168.1.10 はサーバのIPアドレス
# ネットマスクは 255.255.255.0
# 192.168.1.210 から 192.168.1.219 の範囲でIPアドレスを割り振る
server-bridge 192.168.1.10 255.255.255.0 192.168.1.210 192.168.1.219

# 経路の設定
# 192.168.1.0/24 をクライアントに追加する。
route 192.168.1.0 255.255.255.0

# TLS-Server にする
tls-server

# 圧縮を有効にする
comp-lzo
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz に設定ファイルのサンプルがあるので、これを解凍して /etc/openvpn/ の下にコピー、編集しても良し。
#UDPでも良いが、出先のネットワークがUDPを通してくれないのでここではTCPを使う。

次に、ブリッジの起動、停止スクリプトを設定する。
/usr/share/doc/openvpn/examples/sample-scripts に bridge-start、bridge-stopがあるので、/etc/openvpn/ の下にコピーして、bridge-startの下記を編集。
(~省略~)
eth="eth0"
eth_ip="192.168.1.10"    ←br0に設定するIPアドレス
eth_netmask="255.255.255.0"    ←br0に設定するネットワークアドレス
eth_broadcast="192.168.1.255"    ←br0に設定するブロードキャストアドレス
(~省略~)

VPNの起動、停止には下記の順番になる必要がある。
起動手順
ネットワーク機能   →   ブリッジ機能   →   OpenVPNサーバ

停止手順
OpenVPNサーバ   →   ブリッジ機能   →   ネットワーク機能
なので、bridge-startとbridge-stopを/etc/init.d/openvpn に適当に組み込んじゃうw

さらに、Ethernet関連ファイルを編集する。
まずは、/etc/network/interfaces
(~省略~)
#eth0からbr0に変更
#auto eth0
#iface eth0 inet static
auto br0
iface br0 inet static
(~省略~)
#ファイルの最後に追加
bridge_ports eth0 tap0 iface eth0 inet manual
iface tap0 inet manual

次に、/etc/sysctl.conf
net.ipv4.ip_forward = 1

ここまでやって、ようやくサーバを再起動。
マシンごと再起動しないと、/etc/sysctl.confが設定されないっぽい。

  • クライアントの設定
Windows側には OpenVPN GUI for Windows をインストールする。
http://openvpn.se/download.htmlからインストールパッケージをダウンロードしてインストールする。

インストールすると、Windowsの「ネットワーク接続」に「ローカル接続 n」が追加される。
デバイス名が「TAP-Win32 Adapter」のやつである。
これの名前を右クリックで「tap0」に変更する。

C:\Program Files\OpenVPN\config\client.ovpn を編集する。
client
dev tap
dev-node tap0
proto tcp
remote recitativo-fant.asia 1194
resolv-retry infinite
nobind
ca "D:\\keys\\ca.crt"
cert "D:\\keys\\client01.crt"
key "D:\\keys\\client01.key"
comp-lzo
verb 3
鍵ファイルのパス指定では、エンサイン(\)を2個ずつ書く。

  • ルータの設定
外部からのTCP 1194ポートでの接続をVPNサーバに転送するよう設定します。

今更ですが、設定してみました。
#今まで何やってたんだろう、オレorz

  • WinSCPのデフォルト文字コードをUTF-8にする
  1. 「WinSCP ログイン」画面(最初の画面)で「新規」なり保存したセッションの「編集」なりを押す。
  2. 左ペインのツリーで「環境」-「SFTP」を選択し、「サーバはUTF-8を使用しない」を「オフ」にする。
  3. セッションを「保存」する。

  • PuTTYのデフォルト文字コードをUTF-8にする
  1. 「PuTTY Configuration」画面(最初の画面)の左ペインのツリーで「Window」-「Translation」を選択し、「Character set translation on received data」で「UTF-8」を選択する。
  2. 左ペインのツリーで「Session」を選択し、「Load, save or delete a stored session」で「Default Settings」を選択し、「Save」する。

自鯖をフルアルミケースに乗せ替え

ジャンク屋で3.5インチシャドウベイが5個あるフルアルミのケースをゲットした。
シャドウベイの前には8cmファン×2個が装着されている。
リアのファンも8cmが1個付いている。
5インチベイのベゼルが全くなし。
これで1000円。

店の人に5インチベイのベゼルを2個探してもらって、これで1500円。

電源はこの間安売りしてたサイズのCORE POWER 3 400W(2970円)を使っちゃう。
予備用で買ったんだけどね。

ホントは、穴を開けまくって既存の9cmファン×2個と未使用の12cmファン×2個を装着しようかとも思ったけど、それはまた今度にする。

っつーことで、中身を詰めてみる。
server20091019_01.JPG
スッカスカですなw
涼しそうでなにより。
でも、HDDが4台連なっているところは熱そうw

台から大分はみ出る。
server20091019_02.JPG
ってか、前足が半分しか乗ってないw

モニタも10インチCRTだとBIOS画面の周波数が合わなくて写らないから、素直に17インチの液晶を持ってきた。
まぁ、BIOS画面なんぞそんなに見るもんでもないけど。

とりあえず、今日はこんなところで。
自鯖のネットワークが死んだ模様。
FedoraのLive CDで起動してもネットワークが使えない。
ってことで、同型マザボを買いにPC DEPOにひとっ走り。ラス1だったぞw。

で、マザボ換装。
でも下記のようなエラーが出て動かない。

SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
・・・・
むぅ、たしかLinuxはMACアドレスを覚えているので、どこか書き換えればいいはず。
rmmod r8169 とか打ち込んでみたけどだめ。じゃぁ、ってことで手動で下記を書き換える。

/etc/udev/rules.d/70-persistent-net.rules
見ると、壊れた方のマザボのMACアドレスがeth0&新しいMACアドレスがeth1で記述されているので、古い方を削除&新しい方をeth0に変更。

できました。ネットワーク復活。
来週は夏休み。自鯖ダウンのまま出かける羽目にならなくて良かった。
壊れた方は保障期間内のハズなので、交換してもらお。
でもって、予備マザボとして保管しておこう。

結論から言うと、こうなった。

Gmail(Google Apps無料版)でメールを全て受信する。
  ↓
fetchmailでPOP3で自宅サーバに取り込み。
  ↓
postfixで各ユーザに配信する。
  ↓
davecotがIMAP4でサービスする。
  ↓
各自メールクライアントでIMAP4で見る。

こうすることで、自宅サーバが死んだとしても、Gmailが受信しておいてくれるし、そんなときはGmailのWEBメールで自宅サーバ復旧までしのぐ事が出来る。
2重化というかは微妙だが、とにかく自宅サーバが死んだとしてもメールを受信し続けることが可能になった。
ここで、Gmailに大きく依存することになるが、自宅サーバ1台に比べれば、GmailはMXレコードが7個もあるので信頼性は比べ物にならない。

さて、レシピと行きましょうか。

まずは、postfix、dovecotをインストール&設定。方法の記述は端折るw。

次に、Google Apps標準版(無料)を申し込む。ドメインを持っていることが必須だ。
申し込み方法、設定方法は下記。

  1. Google Apps標準版を申し込む。
    • 管理者を選択して、自分のドメイン名を入力。
    #このとき、情報発信用のドメイン名を入力した。
    #家族用(メール用)ドメイン名は後でエイリアスとして登録した。

  2. 申し込みが終わったらGoogle Appsの管理画面で設定を行う。
    • エイリアスのドメインに家族用ドメインを登録する。
    • 「ドメインの所有権を確認」する。
    「HTMLファイルをアップロード」を選択して、ドメイントップに指定されたようにHTMLファイルを作成、設置する。
    これは、メインのドメインとエイリアスのドメインの両方で行う必要がある。
    • 自宅サーバに登録してあるメールアカウントを同じように全て登録する。
  3. DNSの設定を行う。
  4. 利用しているDNSのレコードを変更する。
    ちなみに、当ドメインはVALUE-DOMAIN.COMで取得したので、ここのDNSを利用している。
    DNSの変更が完了したら、Google AppsのMXレコード変更画面で「指定された手順を完了しました」ボタンを押す。

以下、VALUE-DOMAIN.COMでのDNS設定変更

a @ [IP address]
mx @ 10  ★この行を削除★
★以下を追加★
mx ASPMX.L.GOOGLE.COM. 20
mx ALT1.ASPMX.L.GOOGLE.COM. 30
mx ALT2.ASPMX.L.GOOGLE.COM. 30
mx ASPMX2.GOOGLEMAIL.COM. 40
mx ASPMX3.GOOGLEMAIL.COM. 40
mx ASPMX4.GOOGLEMAIL.COM. 40
mx ASPMX5.GOOGLEMAIL.COM. 40

ちなみに、MXレコードにGoogle以外のものが設定されていると、2日後にGmailが使用できなくなる。
筆者も一度は自鯖をプライマリMXに、GoogleをセカンダリMXに指定してチャレンジしたがあえなく撃沈。
ちなみにちなみに、有料版のGoogle Appsを利用するとセカンダリMXに指定できるらしいが、1アカウントあたり年額6000円と高額だw。

次、Gmailの設定。
うちではGmailをSMTPに使っている。なぜなら、自鯖がスパムの踏み台にされると嫌だから。お手軽だから。
で、GmailのSMTPを使い、複数ドメインのメールアドレスを管理する場合、下記を設定しないとFromがGmailのアカウントに書き換えられてしまう。
#ただし、SenderがGmailのアカウントで固定で追加されてしまう。そのため、多少見られても構わない情報発信用メールアドレスをGmailアカウントに設定するのが吉。
  • 「アカウント」-「名前:」-「メールアドレスを追加」でにエイリアスに設定したドメインのメールアドレスを追加する。
  • 「アカウント」-「名前:」-「メッセージの受信時:」は「メールを受信したアドレスから返信する」を選択
  • 転送 無効
  • POP 有効 & POPを使用する場合:すべてのメール、メールのコピーを削除(これを設定しないとクライアントから削除できないらしい。)
  • IMAP 有効

参考:いそっちノート [tips] Gmailで独自ドメイン(Value Domain)を使う


次にfetchmailの設定。
まず、/etc/fetchmailrcというファイルを下記内容で作成する。
set postmaster root
set nobouncemail
set logfile /var/log/fetchmail.log

defaults
protocol pop3
flush
no mimedecode
smtphost localhost

poll pop.gmail.com
port 995

user [pop account1] with password [password1] is [local user1] here ssl
user [pop account2] with password [password2] is [local user2] here ssl
......以下、家族分
GmailのPOP/IMAPはSSL経由でしかアクセスできないが、sslオプションはuser毎に指定する必要があるらしい。

下記コマンドで設定を確認。ログがうじゃうじゃ出てきます。
fetchmail -v -f /etc/fetchmailrc

設定が確認できたら crontab -e で3分毎に取得するよう設定。
*/3 * * * * fetchmail -f /etc/fetchmailrc
追記:2009/06/21
/etc/fetchmailrc の所有者でないとこのコマンドは動かない。
fetchmailユーザってゆーのが勝手に出来てて、それが所有者になっている。
ということで、crontab -e への書き込みは、fetchmailユーザの方で行う。
また、/var/log/fetchmail.log の所有者もfetchmailユーザになっているか確認する。

参考:
以上。

このアーカイブについて

このページには、過去に書かれた記事のうち自宅サーバカテゴリに属しているものが含まれています。

前のカテゴリはプログラミングです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。