部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

Solaris版Adobe Flash Playerのサポートが終了していました

会社のマイSolaris11.1マシンのFirefoxのバージョンが16ぐらいで止まっていたので、最新版にしとこうと以前ブログに書いた記事

http://d.hatena.ne.jp/bata64/20091110/1257832803

を参考にしながらバージョンアップをしたのですが、その流れで最新版のSolarisAdobe Flash PlayerをインストールしようとAdobeのサイトに行ったら、なんとSolarisAdobe Flash Playerはサポートされていない旨表示されました。

古いバージョンならダウンロードできるとの説明に従いこちらのページ
http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html#main_Archived_versions

に移動して調べたところ、「Solaris x86 and Sparc」の「Most recent version of Flash Player supported」は「11.2.202.223」となっています。一方、
http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html#Flash Player archives

によると本日2013年2月27日現在で「11.6.602.171」がリリースされている模様で、上記の「11.2.202.223」は2012年3月28日付でリリースされています。
つまり、昨年以降Solaris版Flash Playerはリリースされていない模様です。

Adobe Flash Playerはyoutubeニコニコ動画などの動画をブラウザで見るために必要なソフトウェアで*1、今どきのインターネットを楽しむためには必須であると思われます。そのソフトウェアの最新版が提供されていないというのは、世間の流れから取り残されたOSになってしまったように思われ大変ショックです。今更言っても詮無い事ですが、2008年頃のOpenSolarisのムーブメントが今も続いていればこんな事にはならなかったのでは、と悔やまれてなりません。

ついでにSolarisのインターネットブラウザ事情についても言及しますと、Firefoxについては以前記事に書いた時と変わらず、Contribute版がダウンロード可能です。

Solaris版を提供していたOperaについてはバージョン10.11で提供が終わっているようです

また、Google ChromeについてはそもそもSolaris版がありませんが、Chromiumをソースコードからビルドすれば動くのかもしれません。

現状、Solarisですぐ使える今どきのブラウザはFirefox一択となるかと思います。デスクトップ用途でSolarisを使うのは、なかなか厳しい情勢だなあと思ってしまいます。

ではー。

*1:もちろんそれだけの用途ではありませんが、代表的なのはこれらではないでしょうか

朝測定した体重をはてなグラフにメール投稿する

はじめに

「はてなグラフ」という、値を入力するとグラフを表示してくれるサービスがあり、このブログの左側に「退社時間」という「はてなグラフ」で作ったグラフを表示させています。
しかし値の入力を「はてなグラフ」の入力画面に毎日アクセスして入力するのが面倒で、そのうち止めてしまっていました。

そして最近、体重が増えてまいっちんぐな状況なので、ダイエットを行い、かつ毎朝体重を計ってグラフにしようと考え、またはてなグラフを利用することにしました。しかし入力が面倒になっては退社時間グラフの二の舞です。「あー、はてなグラフに携帯からメール送って値を投稿できれば良いのになー」と思って調べてみたら、なんと大分前からはてなグラフはAPIが公開されていたのでした
APIとはプログラミングをする際に、サービスを利用する事が出来る仕組みを指します。はてなグラフを運営しているはてなという会社ははてなグラフをプログラムから操作する仕組み、APIを提供してくれている訳です。これを使えばプログラム経由ではてなグラフを更新することが出来そうです。サンプルプログラムも、慣れ親しんでいるperlで書かれているのも素敵です。さらに応用して、以下のような事が出来そうだと考えました。

  1. 家で体重を計る
  2. 計った体重を携帯からメールで所定のメールアドレスに送る
  3. メールに書かれた体重を読み取り、APIを利用してはてなグラフに入力する
  4. はてなグラフ「朝一に計った体重」が更新される

ちなみにグラフはこんな感じです。
朝一に計った体重(Kg)


という訳でperlのプログラム「hatenagraph.pl」を用いた、朝一に計った体重をはてなグラフにメールで投稿するシステムを作ってみました。動作は以下の通りです。

システムのおおまかな動作(基本設計)

1. 人力で行う処理

1-1.朝起きたら自宅で体重を測定する
1-2.測定した体重を、携帯からメールで所定のメールアドレスへ送信する。メールの書式は
Subject(件名)を

bataweight [体重]
例:
bataweight 67.5

とする。

2.プログラム「hatenagraph.pl」が行う処理

2-1.所定メールボックスPOP3でアクセスし、一番最近届いたメールの件名をチェックする。
2-2.件名が「myweight [体重]」だったら、体重の値を記録し、メールをメールボックス削除、POP3接続を終了する。
件名が違ったら、その次に新しいメールの件名をチェックする。以下繰り返し。
2-3. 記録した体重の値を、はてなグラフ「朝一に計った体重」のプログラムを実行した日の値として登録する。

3. サーバが行う処理

3-1.10分おきにhatenagraph.plを実行する。

システムの詳しい情報(詳細設計)

hatenagraph.plの内容

上記はてなグラフAPIのサンプルプログラムや、こちらで紹介されているperlPOP3アクセスを行うためのプログラムを参考に(ていうかほぼそのままです・・・)、以下のプログラムを作りました。

#!/usr/bin/perl

use strict;
use warnings;
use DateTime;
use LWP::UserAgent;
use Net::POP3;

#チェックする文字列
my $KEYWORD = 'bataweight';

#POP接続用情報
my $popuser = 'xxxx'; #POPログインID
my $poppass = 'xxxx'; #POPログインパスワード
my $popserver = 'xxxx'; #pop3サーバ名
my $popport = xxxx; #pop3ポート番号

#はてなログイン情報
my $hatenauser = 'bata64'; #はてなログインID
my $hatenapass = 'xxxx'; #はてなログインパスワード
my $hatenagraphname = '朝一に計った体重(Kg)'; #はてなグラフのグラフ名(utf-8)

#プロキシ情報
my $use_proxy = 0; #proxyを使用するかどうか。1で使用、0で使用しない
my $proxy = 'http://example.com:28080'; #httpプロキシサーバのホスト名:ポート番号(http://から記入)

#変数定義
my $maildata = 0;
my $weight = 0;
my $counter = 0;
my @array = ();

#POPサーバ接続処理
##POP接続開始
my $pop = Net::POP3->new($popserver, Port => $popport);
if ( ! $pop ){
        die "接続失敗: $!";
}
print "###POP connect###","\n";

##POPログイン
$pop->user($popuser);
print "###POP user###","\n";
my $pop_check = $pop->pass($poppass);
print "###POP pass###","\n";

##POP認証チェック
if ( ! defined $pop_check ){
        die "認証失敗: ";

##メールボックス内の通数が0の場合はPOP接続終了
} elsif ( $pop_check == 0 ){
        ##POP接続終了
        $pop->quit();
print "###POP quit because NOT MESSAGES###","\n";
}

while ( $pop_check > 0 ){
        my $msg = $pop->get($pop_check);
print "###POP retr $pop_check###","\n";
        foreach ( @$msg ){
                if ( $_ =~ /^Subject: $KEYWORD/){
print "###match bataweight!###","\n";
                        $maildata = $_;
                        $counter += 1;
                        $pop->delete($pop_check);
                        last;
                }
        }

        if ( $counter == 1){
                last;
        }
        $pop_check -= 1;
}

##POP接続終了
$pop->quit();

##体重を取得
chomp($maildata);
@array = split(/ /, $maildata);

$weight = $array[2];

if ( ! $weight == 0 ){
        print "###hatena###","\n";
        #はてなグラフへの接続処理
        my $ua = LWP::UserAgent->new;

        ##プロキシ設定
        if ( $use_proxy == 1 ){
                $ua->proxy([qw(http https)] => $proxy);
        }

        ##API経由ではてなグラフへ接続
        $ua->credentials('graph.hatena.ne.jp:80', '', $hatenauser, $hatenapass);
        my $res = $ua->post( 'http://graph.hatena.ne.jp/api/post', {
                graphname => $hatenagraphname,
                date => DateTime->now( time_zone=>'local' )->ymd,
                value => $weight
        });
        warn $res->content unless $res->code == 201;
}
exit
プログラムが動作する場所

プログラムが動作するには、「cronやperlを実行できてインターネットに接続していて24時間365日稼働しているLinuxまたはUNIXサーバ」が必要と考えましたが、自宅の機器でやるには色々大変なので、さくらインターネットのレンタルサーバを使うことにしました。月額500円で上記条件を満たす、FreeBSDというUNIX OSがインストールされたサーバを借りられます。

なお、さくらのレンタルサーバperl(v5.8.9)には、上記プログラムで使ったperlモジュールが全てインストール済みでした。ローカル環境にCPANモジュールインストールするのにチャレンジしなきゃいかんかと思っていたので助かりました。メンテが行き届いているように感じられ好印象です。

こちらのサーバに、以下のディレクトリパスで実行権を付与したプログラムのファイルを格納しました。

/home/bata64/pl/hatenagraph.pl
10分おきにプログラムを実行する仕組み

10分おきにプログラムを実行するのは人力だと辛いので、仕事で親しんでいるUNIXLinuxでおなじみの「cron」を使う事にしました。cronを使うと決まった時間に所定のプログラムを実行させることが出来ます。cronについての細かい説明は省きますが、以下のように設定しました。

*/10    *       *       *       0,1,2,3,4,5,6   /home/bata64/pl/hatenagraph.pl

まとめ

朝一で計った体重をメールで送ってグラフ化したい、というのが目的でしたが、この仕組みを使えば更新を止めていた退社時間グラフも楽に更新が出来そうです。凄いことは何一つやっていませんが作っていて自分が楽しかったので良しとします。
また、パソコンと接続できる体重計(知りませんがそういうのあるんですかね)があれば、体重計ってグラフ作成までを全て自動化できるのではないかと思います。

なお、作成中に会社の同期諸氏から「グラフ生成APIならgoogleにもあるよ」とか「cloudforecastとかのイマドキな機構使った方が便利だよ」とか言われましたが、とりあえず思いついた機能をどんな手段でも実現させるのが今回の目的だったので、良いのです!今後のアップデートの際に参考にさせていただきたいと思います。

あと、上記のシステムは色々改善の余地がありますのでもう少し手を加えたいと思います。思いついているのは以下のような事柄です。

  • 同期O氏に「実行時にログ吐かせるだろjk」と言われたので実行時にログを出力するようにする
  • メールのチェック条件はSubjectヘッダだけで良いのか?Dateヘッダもチェックすると本日以外の日のデータを投稿できるようになるのではないか。
  • Subjectが日本語含まれていても、iso-2022-jpエンコード後の文字列でマッチさせればいいやー、と思ったら、メールクライアント毎にエンコードの仕方が違う模様(少なくとも自宅秀丸メールと携帯からとでは違った)なのでうまくマッチされなかった。とりあえず半角英数字だけ使う事にする。
  • 投稿したいグラフをWEBページから設定できたりすると便利かもなー。
  • rubyで書いてみる

では。

Synergyで一組のキーボード、マウスで複数のPCを操作してみよう その2

以前その1を書いたSynergyについてですが、会社の机の上をいろいろいじって、現在は以下のように設定しています。

前提条件

  • Synergyバージョン:1.3.1
  • Synergyサーバ:Solaris11 snv_151a(x86)・・・主にキーボードとマウスを使用するマシンはこちらとなる
  • Synergyクライアント:Windows XP
  • IPアドレス
WindowsXP 192.168.0.1
Solaris11 192.168.0.2
  • synergyサーバを起動するSolaris11のOSユーザおよびホームディレクトリ:
hoge
/export/home/hoge
  • ディスプレイの配置
机に向かって左側がWindowsXP
机に向かって右側がSolaris11
  • WindowsXPの文字変換ソフトウェア(IME):MicroSoft IME スタンダード2003

とする。

以前Solaris10をインストールしていたマシンをOpenSolaris、さらにSolaris11へアップグレードしたところ、Synergyクライアント起動は

% /usr/local/bin/synergyc 192.168.0.1

を実行して行うのは変わらないのですが、Solaris10時代はteratermでSSHログインした状態で実行すれば良かったのがGUIのデスクトップ環境から端末を起動して実行しないと接続できなくなったためです。
変更点を調べていけば原因が分かるのかもしれませんが、調べるのが面倒だったSolarisを使い倒すんだという意思表示のためにもサーバをSolarisにしたらどうか」と同僚に言われたので、上記のようにしてみました。

また、後述のとおりWindows側で日本語入力を行うのに大変苦労しましたが、有志の方が提供している日本語入力のためのパッチがsynergyのバージョン1.3.1用だったのでこれに合わせました。
2012年4月現在、Synergyの最新バージョンは1.4.7 Betaで、さらには派生版の「synergy-plus」というものが存在します。

しかしながらこれらには手を出せていません(異なるOS間での動作が微妙、という噂があるのも試行をためらう理由の一つです)。おいおい調べていきたいと思います。

という訳で設定手順は以下の通りです。

ソフトのダウンロード

公式サイト
http://synergy-foss.org/ja/
から

1.3.1 Windows 32-bit

をダウンロード。
日本語関連パッチを公開している素晴らしいサイト
http://wiki.nothing.sh/page/memo/Synergy
にて、

synergys_bin_20080204.zip
synergy_src_20080204.zip

をダウンロード。

インストール

Windows XP用Synergyのインストール

1.3.1 Windows 32-bit

をクリックしてダウンロードしたインストーラ「synergy-1.3.1-Windows-x86.exe」を実行します。特に特記すべき点は無いので割愛します。
その後、

synergys_bin_20080204.zip

を解凍した後に展開される

synergy.exe
synergyc.exe
synergys.exe
synrgyhk.dll

を、インストールされたものと差し替えます(格納フォルダにファイルをコピーして上書きする)。

■Solaris11用Synergyのインストール

ダウンロードしたソースコードからビルドします。
なお、gccのバージョンは

3.4.3

であり、スーパユーザの環境変数として

PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin

を設定しています。

ソースコードの解凍
synergys_src_20080204.zip

を解凍します。

% unzip synergy_src_20080204.zip
configure、makeの実行
% su -
# cd synergy_src_20080204
# ./configure
# make
インストール実行
# make install

/usr/local/bin以下にインストールされると思います。

設定

■Solaris11側でsynergyサーバの設定
まずsynergyサーバであるSolaris11側の設定をします。Windowsではsynergyを起動して設定を行いましたが、Solarisでは

.synergy.conf

という名前の設定ファイルに必要な設定を記入します。「.synergy.conf」はsynergyサーバを起動する際に使用するOSユーザのホームディレクトリに格納しておきます。今回は以下のように設定しました。

su - hoge
vi /export/home/hoge/.synergy.conf

以下のように編集

section: screens
        sol11:
        winXP:
end

section: links
        sol11:
                left    = winXP

        winXP:
                right    = sol11

end

section: aliases
        sol11:
                192.168.0.2

        winXP:
                192.168.0.1
end

■WindowsXP側でsynergyクライアントの設定
次にWindowsXP側の設定を行います。
synergyのアイコンをクリックしてsynergyを起動します。

ほかのコンピュータのキーボードとマウスを使用する(クライアント)

の「サーバのホスト名」の欄に

192.168.0.2

と、synergyサーバのIPアドレスを入力します。
これで最低限の準備完了ですが、WindowsXP PCを起動する度にsynergyクライアントが自動で起動するようにすると便利です。自動起動したい場合は

オプション > 自動起動

をクリックし、

PCの起動時 > 設定

をクリックし、「閉じる」で終了すれば設定できます。以降は電源オンした後、自動でsynergyクライアントが起動されます。

Synergy起動

■Solaris11側でsynergyサーバを起動

su - hoge
% /usr/local/bin/synergys

と実行します。psコマンドなどでsynergysプロセスが上がっている事を確認しましょう。

■WindowsXP側でSynergyクライアント起動
synergyのアイコンをクリックして起動し、上述のクライアント設定が入っていることを確認して「スタート」を押下します。ログファイルが出力されるウィンドウが現れ、

NOTE: started client
:
NOTE: connected to server

というようなメッセージが出ていればサーバと接続が出来ている事になります。Solaris11マシン側のマウスのポインタを左側に滑らせて、WindowsXP側のディスプレイのポインタを操作できるようになっていたら接続成功です。

日本語入力に関する設定

Solaris11のキーボード、マウスでWindowsXPの操作ができるようになりましたが、この状態で「半角/全角」キーを押下すると、半角から全角へ入力モードを変更できますが、その逆の全角から半角への変更が出来ません。

上記のパッチ提供サイトからたどれる、そもそもの日本語キー対応パッチを作成された方のサイトによると、このパッチによって

半角/全角キー
変換キー
カタカナ/ひらがな/ローマ字キー

が使えるようになっているはずなのにおかしいな、と思っていたのですが、調べているうちに、Synergy経由でWindowsXPにアクセスして「半角/全角キー」を押すと実際には「変換キー」として押下されている事が判りました。

対策をどうしようかと考えましたが、よく考えると「変換キー」はあまり使わないので、「変換キーを押すと半角/全角キーと同じ動作をするようにWindowsXP側の設定を変更する」事にしました。具体的には以下の通りです。

  • WindowsXPの言語バーにて、
ツール > プロパティ > 全般 > 設定 > キー設定

とクリックしていく。

キー「半角/全角」

を選択して「キー追加」ボタンを押下する。
キー入力待ち状態になるので、ここで「半角/全角キー」を押すとなぜか「変換キー」として認識されているので、そのまま「OK」を押下すると「半角/全角キー」に割り当てられている「IME オン-オフ」という動作が「変換キー」にも割り当てられる。

確認画面でもさらに「OK」を押下、さらに「OK」を押下してプロパティを終了する。


これで「半角/全角キー」を押すたびに、半角または全角に入力モードが変更されます。

考察

Solaris11サーバに接続しているキーボードは「HHKB Lite2」というものですが、これによって「半角/全角キー」が上手く認識しないのかは現時点では不明です。
synergyのバージョンが古い事も関係している気がしますが、とりあえずは望む動作になったのでそのままにしてあります。
新しいバージョンにチャレンジしなかったのは現行環境で上手く動作しなかったためも大きな理由なのですが、1.3.1環境でちゃんと動くようにはなったので、新しいバージョンのものにも少しずつ試してみようかなと思っています。

ではー。

iptablesとipfilterでパケットフィルタリング

iptables

先日、仕事で「あるサーバに送信される、特定のTCPポート番号向けのパケットを廃棄する」という動作をさせる必要がある事が判ったので、Linuxならiptablesというツールで実現できる、という事で色々調べてみました。

目的

Redhat EnterpriseLinux 5のサーバにて、hogeサーバ(192.168.0.1)のTCP 5002番向けパケットを全てREJECTする。

iptables設定
vi /etc/sysconfig/iptables

以下のように編集

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A FORWARD -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A OUTPUT -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A INPUT -j LOG --log-level info --log-prefix "[iptables] "
-A OUTPUT -j LOG --log-level info --log-prefix "[iptables] "
-A FORWARD -j LOG --log-level info --log-prefix "[iptables] "
COMMIT
iptablesを有効化
service iptables start
フィルタ設定の確認
# iptables-save

以下のように表示されていれば設定どおりに動いていることになります。

# Generated by iptables-save v1.3.5 on Fri Aug 26 14:14:53 2011
*filter
:INPUT ACCEPT [3921:507273]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4106:413124]
-A INPUT -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j LOG --log-prefix "[iptables] " --log-level 6
-A FORWARD -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j LOG --log-prefix "[iptables] " --log-level 6
-A OUTPUT -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j LOG --log-prefix "[iptables] " --log-level 6
COMMIT
# Completed on Fri Aug 26 14:14:53 2011 

これで、ポート5002番をLISTENしているhogeサーバ上のアプリケーションにアクセスしたところ、通信できないエラーとなりました。やりたい動作になったようです。

ipfilterでフィルタリング

その後、hogeサーバ上で、ポート5002番向けにやってくるパケットを廃棄させる必要が出てきたのですが、hogeサーバはSolaris10で動いているのでiptablesが使えません。代わりにipfilterというツールが用意されているので、これまた調べつつ以下のように設定してみました。

/etc/ipf/ipf.conf を編集して以下の行を追加:
block in log on e1000g0:2 proto tcp from any to 192.168.1.1 port = 5002
ipfilterの有効化
# svcadm enable ipfilter

これでいけました。
ではー。

Solaris 10サーバでscreenを使ってみる その2

かなり時間が経ってしまいましたがその1の続きです。

とりあえず使える状態にはなりましたが、実際に便利に使う際には他にもコマンドが必要です。

また、「.screenrc」という設定ファイルに、動作させる環境の情報を色々書くと便利になります。
ここでは、「.screenrc」の作成とその上での便利な使い方について書こうと思います。

なお、screenについてはこちらのように、マニアックに使おうと思えば更に出来るのですが、正直言って私は使いこなしているレベルではなく、とりあえず業務で便利に使っている程度ですので「これしか設定しないのかよ」とか思われるかもしれませんがご了承下さい*1

.screenrcの作成

screenを実行するユーザのホームディレクトリに「.screenrc」という名前のファイルがあれば、実行時にそれを読み込んで動作させる事が出来ます。

とりあえず私は以下のような設定をしています。なお、#でコメントアウト出来ます。

#起動時のメッセージ表示をOFFにする
startup_message off
#文字コードをEUCに設定(これはお好みで)
defencoding eucJP
#画面下に「ホスト名、開いている画面の一覧、日付を表示させるようにする
hardstatus alwayslastline "%{= bw}%H:%-w%{= kw}% %t%{= bw}%+w %=[%y/%m/%d %D %c]"
#不意にネットワーク切断などが発生した際に自動でデタッチする(接続は保持される)ようにする  
autodetach on
#バックスクロールできる行数
defscrollback 1000
#screenで使用するシェルをbashに
shell bash

screenを日常使う方々的にはシンプルすぎると思いますがこんな感じで。
ホームディレクトリが「/home/hoge」であるhogeユーザで使用する場合、上記が記述された.screenrcというテキストファイルを、

 /home/hoge/.screenrc

というように格納してやれば良いです。

ファイルが作成できた後にscreenを起動してみます。

screen

すると、以下のような画面になるはずです。下に青色の画面一覧などが表示されるようになっていますね。これで、

  • 青色の帯が表示されていたらscreen使っている、という事がわかる
  • 複数画面が存在したら一覧に表示される*2

という事ができるようになり、大変便利になります(デフォルトで複数画面を作成しても区別が付け辛いので)。

各種コマンドについて

screenで使用できるコマンドは色々あるようですが、これまた最小限のものしか私は使いこなせておりません。ので少ないですがつかっているものは以下の通りです。原則、
「Ctrl + A , なにかのキー」
という組み合わせになります。

動作 コマンド 備考
画面の作成 CTRL + A , C
画面の切替 CTRL + A , {画面番号} 画面番号は0〜9までが指定可能
画面の切替(昇順) CTRL + A , N
画面の切替(降順) CTRL + A , P
画面名の編集 CTRL + A , SHIFT + A 書いた後Enterで決定
デタッチ CTRL + A , D
画面の削除 CTRL + A , K

また、起動前の状態で出来る事は以下の通りです。

動作 キー 備考
デタッチしたscreenプロセスを確認 screen -ls
screenセッションのアタッチ screen -r detachされたセッションが複数ある場合は画面で選択する
起動時に特定の.screenrcファイル読み込み screen -c {ファイル名} 客先環境とかでひっそり使うときに便利

ではー。

*1:むしろ教えて頂きたい

*2:ただし表示上は最大10個までしか表示されません。仕様なのか設定変更できるのかは未調査です。誰か教えてー

ZFSでRAID1をしてみよう

今更ながらOracleからSolaris11 Expressがリリースされたので、OpenSolarisで動いている会社の検証サーバもアップグレードしました。
で、散々検証に四苦八苦したWD15EARSというHDDも二本ある事ですので、ZFSでRAID1(いわゆるミラーリング)をしてみました。
ZFSでのミラーリングは簡単に出来るという事で有名なのですが、実際にトラブルが発生してミラーしたDISKからOSを起動させようとすると意外な事につまずいたりしましたので、
ミラーリングの設定方法

ミラーリングの運用方法
について書いてみたいと思います。

前提条件

OSは

Oracle Solaris 11 Express snv_151a X86

で、二本のHDD「WD15EARS」がOSからそれぞれ

c7d0
c8d0

と認識されており、ルートファイルシステムが格納された「rpool」というzpoolが既に「c7d0s0」で構成されているものとします。zpool statusコマンドで確認すると以下のようになります。

# zpool status
  pool: rpool
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
	still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
	pool will no longer be accessible on older software versions.
 scan: resilvered 371G in 25h27m with 0 errors on Fri Dec 31 00:06:51 2010
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  c7d0s0    ONLINE       0     0     0

よって、「rpoolのミラーディスクとしてc8d0を追加する」という作業を行います。
また、以下の全ての作業はスーパユーザにて行うものとします。

注意点

この作業のポイントは、「HDDのスライス単位で設定する」という事です。
色々試した結果、DISK全体を示す「c8d0」ではなく、DISKのスライス0番である「c8d0s0」をミラー設定しないと後からOSを起動できません*1のでご注意下さい。
また、rpoolを構成しているc7d0も、スライス0番を指定して「c7d0s0」で構成しておきます。

■ミラーリングの設定方法

1)ミラーディスクのフォーマット

まず、c8d0のフォーマットを行います。上述の通り、「c8d0s0」に領域を作成します。

# format -e c8d0
〜省略〜
format> p

下記のようになるよう設定した(0番に8番と9番を除いた全ての領域である約1.36TBを設定)。

partition> p
Current partition table (original):
Total disk cylinders available: 60797 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       3 - 60796        1.36TB    (60794/0/0) 2929966830
  1 unassigned    wu       0                0         (0/0/0)              0
  2     backup    wu       0 - 60796        1.36TB    (60797/0/0) 2930111415
  3 unassigned    wu       0                0         (0/0/0)              0
  4 unassigned    wu       0                0         (0/0/0)              0
  5 unassigned    wu       0                0         (0/0/0)              0
  6 unassigned    wu       0                0         (0/0/0)              0
  7 unassigned    wu       0                0         (0/0/0)              0
  8       boot    wu       0 -     0       23.53MB    (1/0/0)          48195
  9 alternates    wm       1 -     2       47.07MB    (2/0/0)          96390

なお、今回二本とも同じDISKを使用していますので、パーティションは「c7d0s0」と同様にすれば良い分けですので、

# prtvtoc /dev/rdsk/c7d0s2 | fmthard -s - /dev/rdsk/c8d0s2

と実行すれば、c7d0と同じパーティション設定をc8d0に実施できますので便利です*2

2)ミラーディスクをrpoolに設定する

c7d0s0というデバイスで構成されているrpoolのミラーディスクとして、c8d0s0を追加します。以下のコマンドを入力します。

# zpool attach -f rpool c7d0s0 c8d0s0

これでミラーリング、すなわちRAID1構成となります。

3)ミラーリングの確認

ミラーリングを実施した後、元のディスクと追加したミラーディスクとの間で同期処理が行われます。完了までには数時間程度時間がかかります。zpool statusコマンドで進捗を確認できます。

# zpool status rpool
  pool: rpool
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h10m, 2.81% done, 5h53m to go
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c7d0s0  ONLINE       0     0     0
            c8d0s0  ONLINE       0     0     0  4.27G resilvered

errors: No known data errors

zpool attachの実行直後は同期途中である事を示す

 scrub: resilver in progress for 0h10m, 2.81% done, 5h53m to go

というメッセージが表示されます。ここで表示されるパーセンテージが100%になったら同期完了です。しばらく待ちましょう。

4)GRUBのインストール

ミラーリングが完了したら、次にGRUBというソフトウェアのインストールを行います。
Solaris11 ExpressというOS*3GRUBというソフトウェア(ブートローダと呼ばれます)を使用して起動されますが、OSがインストールされているディスク(ブートデバイスと呼ばれます)毎にインストールが必要のようです。
Oコピー元ディスクであるc7d0s0にはOSインストール時に自動でインストールされていますが、今回ミラーリング設定したc8d0s0にはインストールされていないので、個別にインストールする必要があります。
インストールしないとc7d0s0に何か異常が発生して使用できなくなった場合にc8d0s0から正常にOSを起動する事が出来ません*4ので、以下のコマンドでインストールを行います。

# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8d0s0

ここでしつこく注意点ですが、私が試した限りは、OSがインストールされている領域がディスク全体(cXdXs2、あるいはcXdXp0)ではなく、スライス指定でなければ上記コマンドを実行しても正常に起動しませんでした*5

そして私が見つけたZFSでrpoolをミラーリングする手順を開設するサイトほとんど全てが、rpoolを「cXdXs0」で構成していました。
よって、

ルートファイルシステムZFSでミラーするためにはスライス0番(s0)を使用する事

という事を暫定的な決まり事としておくと良さそうです。

もしディスク全体を指定してrpoolが構成されている状態で、installgrubを行う方法をご存知の方は教えて頂けますと幸いです。

少し話題がずれましたが、これでZFSでRAID1を構成出来ました。
次は運用の仕方を説明します。


■ミラーリングの運用方法

まず大前提ですが、HDDをRAID1で構成にする目的は「ディスクに異常が発生した時に備えてミラーディスクに同じ情報を格納しておく」という事です。システムエンジニアが言うところの「冗長性を確保する」というやつですね。

ここではミラー元である「c7d0s0」に何らかの異常が発生したとして運用方法を書きます。

1)ミラーディスクからOSを起動

RAID1の概念からすると本来はしなくても良いはずですが、場合によってはディスクが壊れた時点でリブートが発生し、OSが上がらない状態になる場合があります。その場合はミラーディスクからOSを起動します。ミラーディスクの作成の際にinstallgrubによるGRUBのインストールを行っているので、ミラーしているディスクからも起動が出来ます。
ここではc7d0s0から起動できなくなっている事になりますので、BIOSのブートデバイス選択設定などでc8d0s0からOSを起動しましょう。いつものOS起動画面になるはずです。
OSがダウンしていない場合はこの項は省略しましょう。

2)故障ディスクを取り外す

異常が起きているDISKを取り外します。この場合はc7d0s0が故障していますので、c7d0として認識されているDISKを取り外します。
商用サービスで使用される大抵のサーバ機器では電源オフする事なく無停止での交換(ホットスワップ)ができますが、一般的なパソコンでもSATAのHDDであればホットスワップが出来るはずですので、一回試してみましょう。

で手順ですが、まず以下のコマンドでrpoolを構成するディスクからc7d0s0を外します。

# zpool detach rpool c7d0s0

実施後、zpool statusでrpoolを構成するディスクが「c8d0s0」だけとなっている事を確認します。
その後故障したc7d0s0を物理的に取り外し、交換用ディスクを交換で取り付け、正常に認識されている事を確認します。物理的な交換方法については機器によって様々だと思いますので割愛します。

3)ミラーの再作成

デバイス名に気をつけて(取り付けたDISKのデバイスが「c7d0」だとは限らないので)、前項「ミラーリングの設定方法」に基づいてミラーリングを設定します。

これで一連の運用が出来るはずです。自分で運用してみて問題があったら都度修正したいと思います。

*1:s2にOSをインストールしてinstallgrubを行う方法を知っていたら誰か教えていただきたく。。。

*2:ただしコピー元とコピー先を間違えないよう注意しましょう

*3:厳密には[http://docs.sun.com/app/docs/doc/819-0378/hbx86boot-aaa?l=ja&a=view:title=Solaris 10 1/06以降]らしい

*4:GRUBが無くてもinit 0の状態からブートできるのかもしれませんがx86Solarisでやったことが無いです。出来るの・・・?

*5:GRUBのプロンプトから画面が遷移しなくなる

OpenSolaris 2009.06でWD*EARS(WD15EARS)を使用する その3

その2の続きです。

だいぶ時間が経ちましたが、前回からさらに調べて判った事を書きます。

1.前回対策の問題点

前回の結論としては、Solarisのfdiskコマンドにて参照できる情報のうち「Rsect」を8の倍数にする、というものです。具体的には

# fdisk -W - c8d0p0

実行結果が

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
  191   128  0      1      3       254    63     1023    48195      2930207805

となっていたのを

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
  191   128  0      6      3       254    63     1023    48200      2930207805

となるように変更する、というものでした。
ただ、ここで見落としがありました。「Numsect」という、パーティションが使用可能なセクタ数の値を変更していなかったので、

「Rsect」を5足した分、「Numsect」は5減らして「2930207800」とするべきだったのでは?

という事です。

実際、当時の作業ログを見直すと、

root@tpc5160:~# fdisk -F test.txt c8d0s2
WARNING: Device /dev/rdsk/c8d0s2:
The device does not appear to include absolute
sector 0 of the PHYSICAL disk (the normal location for an fdisk table).
Fdisk is normally used with the device that represents the entire fixed disk.
(For example, /dev/rdsk/c0d0p0 on x86 or /dev/rdsk/c0t5d0s2 on sparc).
Are you sure you want to continue? (y/n) y
                Warning: only -1 bytes written to clear backup VTOC at block 2930255817!
                Warning: only -1 bytes written to clear backup VTOC at block 2930255819!
                Warning: only -1 bytes written to clear backup VTOC at block 2930255821!
                Warning: only -1 bytes written to clear backup VTOC at block 2930255823!
                Warning: only -1 bytes written to clear backup VTOC at block 2930255825!

というように、「Warning: only -1 bytes written to clear backup VTOC」というやばげなメッセージが出ていました。

さらに、前回の手順実施済みのDISKに対してprtvtocコマンドでパーティション情報(Solaris用語で言うところの『スライス』)を確認すると、

$ pfexec prtvtoc /dev/rdsk/c7d0s0
* /dev/rdsk/c7d0s0 partition map
*
* Dimensions:
*     512 bytes/sector
*     189 sectors/track
*     255 tracks/cylinder
*   48195 sectors/cylinder
*   60799 cylinders
*   60797 accessible cylinders
*
* Flags:
*   1: unmountable
*  10: read-only
*
* Unallocated space:
*       First     Sector    Last
*       Sector     Count    Sector
*           0     48195     48194
*
*                          First     Sector    Last
* Partition  Tag  Flags    Sector     Count    Sector  Mount Directory
       0      2    00      48195 2930063220 2930111414
       2      5    01          0 2930111415 2930111414
       8      1    01          0     48195     48194

となっており、スライスは0、2、8の三つが存在する事がわかります。
対策実施前のDISKは

$ pfexec prtvtoc /dev/rdsk/c8d0s2
〜中略〜
*                          First     Sector    Last
* Partition  Tag  Flags    Sector     Count    Sector  Mount Directory
       0      2    00     144585 2929918635 2930063219
       2      5    01          0 2930063220 2930063219
       8      1    01          0     48195     48194
       9      9    00      48195     96390    144584

という事でスライスは0、2、8、9の四つが存在します。

つまり、前回の対策ではスライス9番がなくなってしまったという事です・・・。

ただ、それでも特に問題なくOSインストールできて動いているのでした。
Sunのサイト(今はOracleだけど)
http://docs.sun.com/app/docs/doc/805-5854/6j5h9ja1e?l=ja&a=view
を参照すると、スライス9番は

「代替ディスクブロック用に予約された領域であり、代替セクタースライスと呼ばれる。」

という事で、通常のデータを格納する用途には使われていないためのように思われます。
ただ、やはり普通の状態ではないので、違う方法を考えたいものです。

2.新たな対策

そこで、上述の通り「Rsect」を足した分、「Numsect」は5減らすというやり方でやってみることにしました。「Rsect」を5足して「48200」とするなら、「Numsect」は5引いて「2930207800」にします。こうするとスライス9番は消えませんでした。ただし、性能も向上しませんでした。

そこで、今度は

  1. 一つ「Rsect」を足す、かつ「Numsect」を減らすようにfdiskによるパーティション変更実施
  2. zpoolでデバイス作成
  3. sambaでWindowsからマウントして「CrystalDiskMark」でパフォーマンス測定
  4. 一旦アンマウント
  5. 一つ「Rsect」を足す、かつ「Numsect」を減らすようにfdiskによるパーティション変更実施
  6. 以下繰り返し

という手順で気長に確認してみました。

結果は

Rsect:48199、 Numsect:2930207801の場合

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
  191   128  0      5      3       254    63     1023    48199      2930207801

および、
Rsect:48207、 Numsect:2930207793の場合

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
  191   128  0      13     3       254    63     1023    48207      2930207793

Random Write 4KB (QD=1)の数値の向上が見られる


というものでした。原理は不明*1ですがセクタ8個毎の周期ではあるようです。

3.新しい対策の効果

前回も書きましたが、対策をしない状態での結果は以下の通りです。

-----------------------------------------------------------------------
CrystalDiskMark 3.0 (C) 2007-2010 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

           Sequential Read :     9.989 MB/s
          Sequential Write :    11.525 MB/s
         Random Read 512KB :     9.950 MB/s
        Random Write 512KB :    11.612 MB/s
    Random Read 4KB (QD=1) :     3.258 MB/s [   795.5 IOPS]
   Random Write 4KB (QD=1) :     0.376 MB/s [    91.9 IOPS]
   Random Read 4KB (QD=32) :    11.626 MB/s [  2838.5 IOPS]
  Random Write 4KB (QD=32) :     1.405 MB/s [   343.1 IOPS]

  Test : 1000 MB [Y: 7.9% (104.0/1320.8 GB)] (x5)
  Date : 2010/08/30 12:06:20
    OS : Windows XP Professional SP3 [5.1 Build 2600] (x86)

今回の対策を行った場合の結果は以下の通りです。

■Rsect:48199、 Numsect:2930207801の場合

-----------------------------------------------------------------------
CrystalDiskMark 3.0 (C) 2007-2010 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

           Sequential Read :     9.626 MB/s
          Sequential Write :    11.677 MB/s
         Random Read 512KB :    10.159 MB/s
        Random Write 512KB :    11.618 MB/s
    Random Read 4KB (QD=1) :     3.268 MB/s [   797.9 IOPS]
   Random Write 4KB (QD=1) :     3.736 MB/s [   912.1 IOPS]
   Random Read 4KB (QD=32) :    11.633 MB/s [  2840.1 IOPS]
  Random Write 4KB (QD=32) :     2.179 MB/s [   531.9 IOPS]

  Test : 1000 MB [Y: 8.2% (108.5/1320.7 GB)] (x5)
  Date : 2010/09/03 13:34:31
    OS : Windows XP Professional SP3 [5.1 Build 2600] (x86)

■Rsect:48207、 Numsect:2930207793の場合

-----------------------------------------------------------------------
CrystalDiskMark 3.0 (C) 2007-2010 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

           Sequential Read :     9.897 MB/s
          Sequential Write :    11.664 MB/s
         Random Read 512KB :     9.990 MB/s
        Random Write 512KB :    11.601 MB/s
    Random Read 4KB (QD=1) :     3.198 MB/s [   780.7 IOPS]
   Random Write 4KB (QD=1) :     3.621 MB/s [   884.1 IOPS]
   Random Read 4KB (QD=32) :    11.487 MB/s [  2804.6 IOPS]
  Random Write 4KB (QD=32) :     2.020 MB/s [   493.1 IOPS]

  Test : 1000 MB [Y: 8.2% (108.5/1320.8 GB)] (x5)
  Date : 2010/09/07 16:21:18
    OS : Windows XP Professional SP3 [5.1 Build 2600] (x86)
  

未対策の場合はRandom Write 4KB (QD=1)が
0.376 MB/s [ 91.9 IOPS]
でした。
対策を実施した場合はこの値が
3.736 MB/s [ 912.1 IOPS]
3.621 MB/s [ 884.1 IOPS]
という事で、約10倍の性能が出ている事になります。
ちなみに前回実施した対策の結果だと、Random Write 4KB (QD=1)が
1.099 MB/s [ 268.4 IOPS]
だったので、より性能が向上しているとは思います。

4.考察

ただ、しばらく使っていましたが性能劣化の影響を受けないはずのRead(データ読み込み)処理も結構遅いです・・・。そもそもあまり速くないDISKなのではないか、と思い始めています。
あと、こんな面倒くさい事をしないといけないHDDは、そもそも使わない方が良いなあと思います。秋葉原で安く売っているのには訳がある、と思わずにはいられません。
性能を考えなくて良い、バックアップ用途などなら安くて良いかもしれませんが・・・。
SolarisでこのHDDを使う、という人が日本(世界で、でも良いが)にどれくらいいるものなのか判りませんが、興味があればこれらの方法を試してみたらいかがでしょうか。また、より良い方法がありましたら是非、教えていただければと思います。

ではー。

*1:開始セクタを1としたら8の倍数だから?そうすると前回の対策は何故有効そうだったのか?謎だ・・・。