Raspberry Pi TypeB+で遊ぶ

昨日ポチッたRaspberryPi、早速届きました。RSコンポーネンツさん仕事が早いです。

早速セットアップ。

MicroSD

上海問屋で以前入手したトラセンドの32G

microUSB電源アダプタ

ソニーエリクソンのMW1付属のものを流用。

モニタ

ソニーの液晶テレビ

要は家にある物でなんとかしてみました。セットアップはMacOSXで行います

SDのフォーマット

通常のフォーマットでFAT32にしておけばOK。

raspberry piのImageのダウンロード

http://www.raspberrypi.org/downloads/

こちらからRASPBIANのZIPファイルをダウンロード。解凍しておきます

イメージの書き込み

ディスクをマウントしコマンドプロンプトのdfで確認します

$ df
Filesystem		512-blocks			 Used	Available Capacity	 iused		 ifree %iused	Mounted on
/dev/disk0s2	1951845952	408391536 1542942416		21%	51112940 192867802	 21%	 /
devfs								380				380					0	 100%			 659				 0	100%	 /dev
map -hosts						 0					0					0	 100%				 0				 0	100%	 /net
map auto_home					0					0					0	 100%				 0				 0	100%	 /home
/dev/disk1s2	1952851232 1666536368	286314864		86% 208317044	35789358	 85%	 /Volumes/WININSTALL
/dev/disk2s1		61800928			 3648	 61797280		 1%				 0				 0	100%	 /Volumes/UNTITLED

/dev/disk2s1がSDのデバイスです。マウントを外し書き込んでいきます。

$ sudo diskutil umountDisk /dev/disk2	 # /dev/disk2s1じゃないよ
$ sudo dd bs=1m if=2014-06-20-wheezy-raspbian.img of=/dev/disk2
2825+0 records in
2825+0 records out
2962227200 bytes transferred in 382.700174 secs (7740334 bytes/sec)

4、5分でイメージが書き終わります。

起動

HDMIケーブルをテレビと接続し、SDカードをセットしたら電源コネクタにマイクロUSBの電源を差し込みます。テレビに起動コンソールが映り始めればOK

だめな場合には、LEDランプの緑がちかちかしているかどうか確認します。こちらがどうやらディスクアクセスのランプのようです。うまく起動画面が出ない場合にはSDにOSがうまく書き込めていないと思いますので、ディスクを変更するなどし再度チャレンジしてください。

RaspberryPIのセットアップ

起動したらディスクやLocaleの設定などを行います

$ sudo raspi-config

1.Expand Filesystem

そのままの設定だと2GしかSDカードを使ってくれないのでこちらのメニューからすべての領域を使うようにします

4.Internationalisation Options

I1 Change Locale

ロケールをja_JP.UTF-8へと変更

I2 Change Timezone

Tokyoへ変更

I3 Change Keyboard Layout

General Keyboard 105 あたりからJapaneseを選択

8. Advanced Options

A4 SSH

これをONにしておくと外部からSSHでログイン可能

ここまででだいぶ使いやすくなるかと思います。あと固定IPの方が使いやすいのでネットワークの設定を行います。

$ sudo vi /etc/network/interfaces
#iface eth0 inet dhcp					 # ここをコメントアウトし
iface eth0 inet static
address 192.168.11.101		 # この辺りの設定をする 
netmask 255.255.255.0
gateway 192.168.11.254

自宅のネットワーク構成に合わせてaddressとgatewayを設定します。

これで一通りの設定ができたかと思います。必要なパッケージはapt-getが使えるので簡単にインストールできるのが楽ですね

Linuxでミリ秒まで取得

ansiのC言語で用意されているtime関数では現在時刻をミリ秒まで取得できません。そこでLinuxならではの取得方法の覚え書きです

gettimeofday関数を用いてミリ秒を取得します

以下のサンプルではミリ秒単位で現在時刻を取得し、2つの時間の差を求めています

#include
#include
#include
#include
#include

struct my_tm {
	time_t tim; // yyyymmddhhmmss
	long msec;	// milli sec
};

static struct my_tm *get_now_tm(){
	struct my_tm *qt;
	struct tm *tmp;
	struct timeval tv;

	qt=(struct my_tm*)malloc(sizeof(struct my_tm));
	if(qt == NULL)return NULL;
	gettimeofday(&tv,NULL);
	tmp=localtime(&tv.tv_sec);
	qt->tim=mktime(tmp);
	qt->msec=tv.tv_usec/1000;
	printf("%04d/%02d/%02d %02d:%02d:%02d:%3d\n",
		tmp->tm_year + 1900, tmp->tm_mon + 1,
		tmp->tm_mday, tmp->tm_hour,
		tmp->tm_min, tmp->tm_sec,
		tv.tv_usec/1000);
	return qt;
}

// return milli second
static inline long my_tm_cmptime(struct my_tm* now_t,struct my_tm* prev_t){
	long diff_sec;
	long diff_msec;
	diff_sec=difftime(now_t->tim,prev_t->tim);
	diff_msec=now_t->msec-prev_t->msec;
	return diff_sec*1000+diff_msec;
}

int main(){
	int i,b;
	struct my_tm *q1;
	struct my_tm *q2;
	long dif;

	q1=get_now_tm();
	sleep(2); // 2秒あける
	b=0;
	for(i=0;i<1000000;i++) b++; // +αあける
	q2=get_now_tm();
	dif=my_tm_cmptime(q2,q1);
	printf("%d\n",dif);

	free(q1);
	free(q2);
}

sshでsudoを使ってtomcatをスタートする

  • centos 5系
$ ssh user@server sudo /usr/local/tomcat/bin/startup.sh
sudo: sorry, you must have a tty to run sudo

どうやらttyがないとエラーになるらしいので以下のオプションをつける

$ ssh -t user@server sudo /usr/local/tomcat/bin/startup.sh

このままだとスタートアップしてもsshでログアウトするとTOMCATも終了してしまう

$ ssh -t use@server sudo nohup /usr/local/tomcat/bin/startup.sh

nohupを使うことによりログアウト後もTOMCATが終了しない

ちなみに/etc/sudoersは

root	ALL=(ALL)	 ALL
user ALL=NOPASSWD: /usr/bin/nohup /usr/local/tomcat/bin/startup.sh

さらにパスワードを入れるのが面倒な場合は

  • remotestart.sh
#!/bin/sh
restart(){
expect << Eof
set timeout -1
spawn ssh -t user@host sudo nohup /usr/local/tomcat/bin/startup.sh
match_max 100000
expect -exact "user@host's password: "
send -- "password\r"
expect eof
Eof
}
restart

このシェルを実行

iptablesでNAT変換しTOMCATをポート80で動かす

色々やりかたはあると思うのですが、ROOT権限で動かしたくなかったので

iptablesでNAT変換します

iptables -F
iptables -t nat -F
iptables -X
iptables -Z
iptables -t nat -A OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -d `hostname` -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -d `hostname` -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -L