0

SFCにVPSがやってきた

大学で仮想サーバーが無料で借りれる時代が来てしまった。
電源とか配線とか置き場所の問題をクリアして、グローバルIPありport全開root権限ありのサーバーが手に入る。

最近はすごい重い計算をさせるとかはあんまり無くて、単にどこからでも参照できるwebサーバーが必要だったり、node.js使うのにportがたくさん必要だったり、webサイトをクロールするためにずっと起動しているマシンが必要だったりするわけで実に研究設備として有益ですばらしい。ERNSの人ありがとう。


SFCの大学院生はVPS (個人用仮想サーバ)サービスの試験運用開始について — Erns web siteの要項を埋めてメールで申し込める。学内からしか見れないページだけど。

ちょうどサーバーが2台必要だったので申し込んだ。



スペックはこれ。

  • CPU : 2.67GHz 1コア
  • メインメモリ:512MB
  • ネットワーク:動的IPv4アドレス 1アドレス
  • ストレージ:20GB
  • OSもLinux系から選べる。UbuntuやDebianやFedoraCoreやCentOSなど



コントロールパネルからサーバー起動できる。
SFC ERNS VPS


起動して、右のTerminalのアイコンを押したらJavaのVNCコンソールが起動して、Ubuntuのインストール画面が出た。ハイテク!!
SFC ERNS VPS


ふつうにUbuntuをセットアップして、sshdを起動して
sudo apt-get install sshd
sudo ifconfig
でIP確認して、sshで外から接続できるようにした。


あとは自分のMacから
ssh yourname@133.27.xx.xxx
で接続できる。

1

BeagleBoard上でmoxaを開発する

Ubuntu 9.04をインストールしたBeagle Boardの上でtalkticのコンパイルとmoxaへ書き込みを行う。刺しっぱなしで開発できるようになるのでとても便利。

xtel technical information > download> ダウンロードから「開発用エクリプスパッケージ for Mac」をダウンロードしてくる。

xtel-eclipseの中の

  • jsc/jsc.jar
    talkticコンパイラ
  • avrdude/bin/avrdude
    avrdude実行ファイル。mac portsでインストールできるavrdudeだと書き込みが怪しい。
    Ubuntu9.04のaptでインストールできるavrdudeは普通に動くのでこれは必要ない。
  • avrdude/etc/avrdude.conf
    avrdudeの設定ファイル
この3つを手に入れて適当にアクセスしやすい場所に置いておく。


■talkticのコンパイル
javaをインストールする
sudo apt-get install default-jre
which java

コンパイル。source.jsからsource.binを作る
java -jar path/to/jsc.jar -Bsource.bin source.js
macでも同じようにバイナリを作れる。


■moxaへの書き込み
avrdudeをインストールしておく。Macはeclipseについてるavrdudeを使う。
sudo apt-get install avrdude
which avrdude

BeagleBoardではUSBデバイス名を書き込んであっても /dev/ttyUSB0 になってしまい、しかもrootしかアクセスできないのでsudoを使って書き込む。
sudo avrdude -C path/to/avrdude.conf -p m128 -c stk500v1 -b 9600 -P /dev/ttyUSB0 -F -U eeprom:w:source.bin:r


Macだとsudoが必要なくて、デバイス名が認識されてるのでこうなる。
avrdude -C path/to/avrdude.conf -p m128 -c stk500v1 -b 9600 -P /dev/tty.usbserial-gemsbok -F -U eeprom:w:source.bin:r


こんな風に書き込んだりプログラム書いたりしてる
ピクチャ 1

ピクチャ 2

1

Beagle Board rev.BにUbuntu9.04 ARM版をインストール

既に9.04を動かしてたんだけど、Arduinoにつないだセンサーの値をずっと読ませていたらkernel panicになってブート不能になっていたので再インストールした。大量のセクタエラーが出ていたので、SDカードに何度も書き込みすぎて壊れた気がする。

前回のインストール方法はメモを取っておいたんだけど、公開されていたrootfsが削除されていてインストール方法も変わっていたのでメモしなおしておく。
同じ9.04なのにUSBシリアル変換チップのFT232RLやemobileや、300GBのUSB外付けHDDが接続できた。ファームウェアをアップデートしたからか、Ubuntuのせいかは不明。

USBメモリとemobileを接続して動いているところ
beagleboard + emobile

WiFiとmoxaとUSBメモリ
USBメモリ、WiFi、moxaを接続

手順

  1. Beagle Boardのファームウェアをアップデート
  2. SDカードにパーティションを切る
  3. Ubuntu9.04 ARM版のrootfsを作る
  4. uImageを作る
  5. boot.scrを作る
  6. UbuntuをSDカードに書き込む
  7. 起動する
  8. emobileやWiFi、Arduino、USB外付けHDDとかを接続してみる

■Beagle Boardの起動手順おさらい
まずボード自体のファームウェアがあって、専用シリアルケーブルで接続して設定できる。ファームウェアはSDカードにu-boot.binという名前にして入れておくとアップデートできる。色々改善されてるみたいなので今回は最初にアップデートしておいた。

起動は、まずボードのファームウェア→第1パーティションのboot.scr→第1パーティションのuImage→第2パーティションのLinux OS
の順で行われる。
uImageはOS毎に違う物を使う。第2パーティションのOSは自分でビルドして作る物で、rootfsとも呼ばれる。

つまりboot.scrとuImageとrootfsを用意して、SDカードに書き込まなければならない。
ARM用イメージをビルドするツールはLinuxでしか動かないのと、ファイルシステムの関係でここから先の作業は全てUbuntuデスクトップマシンで行った。でもVMWareのUbuntでも問題なくできる。


■Beagle Boardのファームウェアをアップデート
新しいSDカードを用意して、先頭に50MB程度のFAT32パーティションを切る。
SDカードのフォーマットはUbuntuのgpartedでやった。

http://elinux.org/BeagleBoardUbuntu#Upgrade_U-Bootに書いてあるとおりにやればいい

SDカードは/media/boot に自動的にマウントされた。
されなかったら
sudo mkdir /media/boot
sudo mount /dev/sdb1 /media/boot
でマウントする。

アップグレード用のu-boot.binをSDカードの第1パーティションに置く。
wget http://rcn-ee.net/deb/tools/u-boot-beagleboard-2009.08+r37+gitr1590f84007e2b50ad346a482fff89195cb04ff4e-r37.bin
sudo mv u-boot-beagleboard-2009.08+r37+gitr1590f84007e2b50ad346a482fff89195cb04ff4e-r37.bin /media/boot/u-boot.bin
sudo umount /media/boot

Beagle Boardの基板上のシリアルポートピンに専用のケーブルで接続してから、電源を入れる。
WindowsならTeraterm、MacならZTerm、Linuxならminicomで接続するといい。

で、u-boot.binを読ませてファームをアップグレードするのだけど俺の使ってるのはrev.Bなので、命令名がwikiに掲載されているのとはちょっと違った。helpコマンドで出てくるのを参考にしてこう打ち込んだ
U-Bootのアップグレード – 橋本詳解より
mmcinit
fatload mmc 0:1 0x80300000 u-boot.bin
nand unlock
nand ecc sw
nand erase 80000 160000
nand write 0x80300000 80000 160000
nand erase 260000 20000
reset


■SDカードにパーティションを切る
Ubuntuマシンを持ってるので、gpartedでSDカードを3つのパーティションに分けた。4GBのSDカードを使った。あんまり怪しいメーカーのは使わない方がよさそう。
先頭から順に
  • FAT32で100MB程度、名前はboot
  • ext3で3GBちょっと、名前はubuntu
  • swapで700MBぐらい
のパーティションを作ったと思う。


■Ubuntu9.04 ARM版のrootfsを作る
http://elinux.org/BeagleBoardUbuntuを参考にビルドする。

rootstockの最新版をダウンロードしてきて、rootstockのバイナリを手に入れる。
sudo apt-get install qemu
wget http://ports.ubuntu.com/pool/main/d/debootstrap/debootstrap_1.0.20~jaunty1_all.deb
sudo dpkg -i debootstrap_1.0.20~jaunty1_all.deb
wget http://launchpad.net/project-rootstock/trunk/0.1/+download/rootstock-0.1.3.tar.gz
tar -zxvf rootstock-0.1.3.tar.gz
cd rootstock-0.1.3


ARM用ubuntu9.04(jaunty)のビルド。4GBのSDカードに作った3GBのパーティションに入れるのでimagesizeで指定している。
sudo ./rootstock --fqdn beagleboard --login ubuntu --password ubuntu --imagesize 3G --seed gcc,make,linux-firmware,wireless-tools,usbutils --dist jaunty --serial ttyS2 --kernel-image http://rcn-ee.net/deb/kernel/beagle/jaunty/v2.6.29-58cf2f1-oer44.1/linux-image-2.6.29-oer44.1_1.0jaunty_armel.deb
デスクトップ環境が欲しければ、–seedにubuntu-desktopやxfce4を追加指定する。

それなりに時間がかかる。CPU2.7GHzの環境で2時間ぐらいかかった。
これでarmel-rootfs-[日付].tgzとvmlinuz-2.6.29-oer44.1できる。vmlinuz-*はuImageを作るのに使う。


■uImageを作る
vmlinuz-*からuImageを作る。
sudo apt-get install uboot-mkimage
which mkimage
mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux" -d ./vmlinuz-* ./uImage
できた。


■boot.scrを作る
ブートスクリプトを作る。

ubuntu.cmd というテキストファイルを作る
setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; bootm 0x80300000'
setenv bootargs 'console=ttyS2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait rootfstype=ext3 ro vram=12M omapfb.mode=dvi:1024x767MR-16@60'
boot
dvi:の所の解像度は自分の画面環境に合わせないと出ない。


beagle boardのbootパーティションに書き込むバイナリ形式にする
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Ubuntu 9.04" -d ./ubuntu.cmd ./ubuntu.scr



■UbuntuをSDカードに書き込む
SDカードを刺したらマウントされると思うけど、手動マウントの場合
sudo mkdir /media/boot
sudo mkidr /media/ubuntu
sudo mount /dev/sdb1 /media/boot
sudo mount /dev/sdb2 /media/ubuntu
でマウント。

uImage, ubuntu.scr, rootfsの3つを書き込む
sudo cp uImage /media/boot/
sudo cp ubuntu.scr /media/boot/boot.scr
sudo tar xfp armel-rootfs-*.tgz -C /media/ubuntu


最初からキーボードは認識するが、ネットワークに接続できないとemacsがインストールできないので、SDカード上でUbuntuの設定をいじっておく。
/media/ubuntu/etc/netowrk/interfaces を編集
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
これでUSBイーサネットアダプタが認識する。


/media/ubuntu/etc/fstab を編集。swapを有効にする
proc /proc proc defaults 0 0
/dev/mmcblk0p3 swap swap defaults 0 0

取り外す
cd /media/boot
sync
cd /media
sudo umount /media/boot
cd /media/ubuntu
sync
cd /media
sudo umount /media/ubuntu
うちのSDカードリーダだと手動でsyncしないとなかなか書き込んでくれなかった


■起動する
USBにハブ経由でLANとキーボードを接続、HDMIで画面も起動、SDカードを入れてbeagle boardを起動する。
念のためにシリアルケーブルを接続しておいて見ておいた方がいい。カウントダウンを10秒待つか自分でbootって打ちこんでUbuntu9.04を起動させる。

rootstockでイメージ作った時に指定したusername,passwordでログインする。
パスワードを変更してsshdを起動すれば、あとは普通のLinuxとして使える。


■emobileやWiFi、Arduino、USB外付けHDDとかを接続してみる
USBデバイスがちゃんと認識するようになったのでいろいろできる。特にHDDかUSBメモリを付けてそっちに作業領域とswapを置くと、SDカードが壊れる事が少なくなってよいかもしれない。

0

Cでgearman workerを書いてRubyのclientから呼び出す

gearmandをソースからインストールして、Cライブラリのlibgearmanが使えるようになった。

これでC言語でworkerを作ってRubyのclientから呼び出せる。環境はUbuntu9.04とgearmand0.11


■Cでworkerを書く
str_reverseというアビリティを持つworkerを作る。
ほぼAPIドキュメントのままだが、jobの引数を受け取るのと、値を返せるようにがんばった。ジョブ失敗した時とかのエラー処理全然書いてない。たぶんenum gearman_return_tを返せばいいんだろうけど

strreverse-worker.c

// 文字列をreverseして返すworker
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgearman/gearman.h>

void *job_str_reverse(gearman_job_st *job, void *cb_arg, size_t *result_size,
       gearman_return_t *ret_ptr)
{
  char *str = (char *)gearman_job_workload(job);
  int len = strlen(str);
  printf("str:%s  length:%d\n", str, len);

  char reverse[len];
  for(int i = 0; i < len; i++){
    reverse[i] = str[len-i-1]; // 文字列を逆にする
  }

  char *result = strdup(reverse); // 結果の文字列はコピーしてポインタで返す
  *result_size= gearman_job_workload_size(job);
  *ret_ptr= GEARMAN_SUCCESS;
  return result;
}


int main(int argc, char *argv[])
{
  gearman_return_t ret;
  gearman_worker_st worker;

  gearman_worker_create(&worker);
  gearman_worker_add_server(&worker, "127.0.0.1", 7003);
  gearman_worker_add_function(&worker, "str_reverse", 0, job_str_reverse, NULL);
  
  while(1) gearman_worker_work(&worker); // ジョブ登録したらループで待つ

  gearman_worker_free(&worker);
  return 0;
}


Makefile
# Linux用Makefile
SRC = strreverse-worker.c
DST = strreverse-worker

prefix=/usr/local
INCPATH=$(prefix)/include
LIBPATH=$(prefix)/lib

GEAR_LIBS=$(LIBPATH)/libgearman.a

all:
g++ -O $(SRC) -o $(DST) -I$(INCPATH)/libgearman -L. -L$(LIBPATH) $(GEAR_LIBS)
makeするとstrreverse-workerができる。


■Rubyでclientを書く
xing-gearman-serverを使うといい

client書く。実行時引数を一つずつstr_reverseに登録するclient。
strreverse-client.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'

c = Gearman::Client.new(['localhost:7003'])
taskset = Gearman::TaskSet.new(c)

ARGV.each{|str|
  puts "add task #{str}"
  task = Gearman::Task.new('str_reverse', str)
  task.on_complete{|result|
    puts "return: #{str} => #{result}" # 文字列が逆になって返ってくる
  }
  taskset.add_task(task)
}
taskset.wait(100) # wait 100(sec)


■動かしてみる
worker動かす
./strreverse-worker

clientから3つ文字列登録
ruby strreverse-client.rb hello konitiwa asdfhujiko

すると文字列返ってくる
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
return: asdfhujiko => okijuhfdsa

worker側の標準出力はこうなってた
str:hello  length:5
str:konitiwa length:8
str:asdfhujiko length:10


workerを3つバックグラウンドで起動しておく
./strreverse-worker&
./strreverse-worker&
./strreverse-worker&


凄い勢いで処理されてるので非同期になってるのかよくわからない
ruby strreverse-client.rb hello konitiwa asdfhujiko aaiiaaiiaaii hogehogehogehoge mmmasdffajkl23rwdfv ahsdga9sd8uf9p8u nbjkasdoif98pu
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
add task aaiiaaiiaaii
return: asdfhujiko => okijuhfdsa
add task hogehogehogehoge
return: aaiiaaiiaaii => iiaaiiaaiiaa
add task mmmasdffajkl23rwdfv
return: hogehogehogehoge => egohegohegohegoh
add task ahsdga9sd8uf9p8u
return: mmmasdffajkl23rwdfv => vfdwr32lkjaffdsammm
add task nbjkasdoif98pu
return: ahsdga9sd8uf9p8u => vfdu8p9fu8ds9agd
return: nbjkasdoif98pu => vfdu8up89fiods

0

Inspiron Mini9に外付けUSB RAID HDDをつけてファイルサーバー化した

Ubuntuが入ってるDellのInspiron Mini9を回収してきたので、IO DATAの外付けRAID HDDをつけてファイルサーバーにした。
もともとうちではGLANTANKを使ってたんだけど、部屋の掃除をしたら急にファンの音が気になるようになったので、もう3年以上使ってるし入れ替える事にした。
inspironは4GBのSSDでファンレス。外付けHDDもファンレスなのでとても静かになった。


I-O DATA ミラーリング/ストライピング RAID対応USBハードディスク 2TB HDC2-U2.0
アイ・オー・データ (2008-06-20)
売り上げランキング: 675
おすすめ度の平均: 4.0
5 Cost-Efficient & Convenient!
4 結構いいww
5 順調です
5 ミラーでのフォーマットが時間がかかる
4 動画専門で使っています


■ほしい機能
ただのNASではなく
  • 音が静か
  • RAID1でミラーリングしてデータが消えないようにしたい
  • 家のdynamic dnsを更新
  • 家の外からもe-mobileでsshでログインできたり、mercurialやgitのリポジトリを置ける
  • rsyncで大学にある巨大なファイルをダウンロードさせておく作業を任せられる
  • sambaでwindowsのファイル共有にも参加する
  • 念のためモニタとキーボードも付いていて、ネットワークが壊れている時も操作しやすい
  • Inspiron Mini9と外付けHDDどちらが壊れても迅速に入れ替え・復旧できる構成にしたい
  • apacheとhgweb.cgiを動かしてmercurialのリポジトリビューアを置きたい
  • 巨大ファイルのやりとりのためにapacheは動かしておきたい


■HDC2-U2.0の設定
まずRAID1に設定し直す。後でやると中身がフォーマットされるので。

パソコンに接続しないで、ACアダプタだけ刺す。
電源モードスイッチをONに切り替える。起動する。

裏にあるRAID SETUPボタンを3秒押し続けると電源LEDが点滅しはじめる。
前側のFUNCボタンを押す毎に電源LEDの色が変わる。

青:RAID0 ストライピング
紫:RAID1 ミラーリング
緑:マルチディスクモード
なので、紫にする。裏側のRAID SETUPボタンを押して設定終了。

パソコンに接続して容量が1TBに減っている事を確認。これでミラーリングモードになった


■HDC2-U2.0のフォーマット
inspiron mini9に接続して起動。
sudo apt-get install gparted
which gparted
sudo gparted
gpartedでHDDのパーティションをフォーマットする。ubuntuをインストールする時に出てくるツール。

全部ext3でフォーマットした。しばらく待つ。


■HDC2-U2.0をマウントする
マウントポイントを作っておく
mkdir /home/sho/ex


/dev/sdb1としてHDC2-U2.0が認識されていたので
/etc/fstab を編集
/dev/sda2		/			ext3 defaults	0 0
proc /proc proc defaults 0 0
/dev/sdb1 /home/sho/ex ext3 defaults 0 0
自分のホームディレクトリの下に置く。

マウントする
sudo mount -a

これで/home/sho/ex/ 以下はRAIDで守られる。


■sambaのインストールと設定
sudo apt-get install samba

/etc/samba/smb.conf を編集
[global]
workgroup = MSHOME

coding system = UTF-8
doc charset = cp932
unix charset = UTF-8
wins support = yes

[ex]
path = /home/sho/ex
comment = ex
browseable = yes
read only = no
create mask = 0755
directory mask = 0755

sambaからはHDC2-U2.0の中以外は見える必要が無いので、[homes]とかは ; で全部コメントアウトした。


samba再起動
sudo /etc/init.d/samba restart


■Dynamic DNSの更新
mydns.jpを使っているんだけど、ここはDiCEとかを使わなくてもBasic認証で更新できる。

crontab -e で設定追加
*/10 * * * * wget --spider http://mydns-username:password@www.mydns.jp/login.html
10分おきに更新する。


■その他
あとはまあ普通のLinuxなので、mercurialとかgitとかapacheをインストールしておしまい。
SSDの容量を稼ぐために、Inspiron Mini9に入ってたゲームやGIMPやEvolutionメールやOpenOfficeを全部消した。