2009年4月28日火曜日

ZFSのミラー状態ストレージプールを、リプレースで拡張する

ZFSは柔軟な拡張も売り、というからには当然このくらいできるだろ?
ということを実験してみた。
 
 

ZFSのストレージプールは、デバイスを適当にAddしていくだけで容量が増えていく。
ではミラーリングで作られたプールはどうなの?
 

ミラーリングのストレージプールを用意する


Solaris10で実験、ZFSのバージョンは 10 ね。
まずは "mkfile" コマンドで 512MB と、1024MB のファイルを それぞれ2つずつ作成。
 

$mkfile 512m /zdev/512M-1
・・・


ファイルがそろった。

$find /zdev -type f | xargs du -h
512M /zdev/512M-1
512M /zdev/512M-2
1.0G /zdev/1024M-1
1.0G /zdev/1024M-2

 

では 512MB のほうを使ってZFSストレージプールを作成しよう。もちろん "mirror" オプションを忘れずに。

$zpool create m512 mirror /zdev/512M-1 /zdev/512M-2

 

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: 何も要求されませんでした
構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/512M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません
 
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 89.5K 472M 1K /m512


m512 という 472MBのプールができました、ちょっと減るのはメタ情報領域がいるから。
ちなみにZpool名の初めの文字には 0-9 が使えない、デバイスの最低サイズは64MBから。
 
 



ミラーリング拡張方法の説明


デバイスとして 512MBのファイルが2つ使われているストレージプールに対して、中身のデバイスを 1024MBのファイル2つに 置き換えてしまうという作戦。
 
ZFSストレージプールでは、既存ものと同一か、より容量が大きいものであればデバイスの置き換えが可能なのだ。そして置き換えで発生した余剰サイズは無駄にならない、再計算されちゃんと最大容量が使用される。
 
 


デバイスを順繰りに置き換えていく


では リプレースしてみよう。
まずは 512MB のうち1つを 1024MB に置き換え。

$zpool replace m512 /zdev/512M-1 /zdev/1024M-1
 
$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
replacing ONLINE 0 0 0
/zdev/512M-1 ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません


リプレースというステータスを経て、めでたく置き換わる。所要時間はZFS上のファイル容量に比例するかな。
 

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません
 
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 106K 472M 18K /m512


OK、この状態でサイズが拡張しないのはミラーとして当然な。
ではもう一丁。

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/1024M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません


と、完全にミラーリングのデバイスを置き換えることに成功。ここまで完全Online、ファイルアクセスの停止は無し。
 
 

サイズを確認しよう 1


512MB 2つで組んだミラーは、生まれ変わるまでもなく今や1024MB 2つとなった。もちろん間にデグレード状態も挟まないぞ。
 

さあZFSのサイズを確認しよう
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 106K 472M 18K /m512

あれー? 変わってないや。
 
ミラーは拡張できないの?いやそうでもない、次でやりかたを。
 
 

サイズを確認しよう 2


この状態からサイズ拡張をさせるには、確認できた手順で2通りある。※サーバの再起動はしてないので未確認
 

■エクスポート&インポート
$zpool export m512
$zpool import -d /zdev/ m512

これはまあ確実だ、もともとZFSではサイズなんて後から付いてくるものだから。
 

■もう一度デバイス操作
$zpool replace m512 /zdev/1024M-1 /zdev/1024M-3

この例では1024MBファイルの3つ目をつくってデバイスの置き換えをもう一度やっている、これでサイズの再計算がおこなわれるのか、使用可能サイズが拡張される。
ミラー中の片割れをデタッチ&アタッチでもいいかもしれない。
 


どちらかをやったあとにサイズを確認しよう。
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 112K 984M 18K /m512


ほら拡張している。
 
 

おわりに


なんでこの実験をしたかということを少し。
社内向けファイルサーバとしてZFSが使える環境を考えたのがきっかけ。容量の追加によるストレージ拡張は社内共用サーバとしてよく課題に上げられるので、それをZFSが楽にしてくれないかと考えた。
 

Solaris+ZFS は CIFS をサポートしているので、ADサーバがある環境には容易に突っ込むことができるだろう。ミラーであれば構築時にいろいろ融通がきくうえ、拡張が自由となればさぞ柔軟性も高かろう。
(※ZFSのiSCSIも面白いんだが、拡張に不向き)
 
弾さえ用意すれば幾らでも容量を拡張してくれるファイルサーバって素敵やん?
 

ただ、Solarisを運用する気になるか、という点では敷居がちょっと高いのかな。マニュアル充実なので、まとまった時間さえとれればと思いますが。
 

2009年4月26日日曜日

Wordpressの更新差分を取る(WinMerge編)

このブログはWordPressなんだけど、 2.7 から 2.7.1 に更新するのをしばらく面倒だからと放っていた。
 

で、ようやく更新しようかと、いつも差分ファイルを配布されているサイトに行ってみると...
 


日本語版 2.7.1 アップグレード用差分ファイル | EastCoder;

自動アップグレード機能実装にともない利用者も少なくなっているようですので差分配布は今回で終了とさせていただきます。


ガビーン ∑(- _ -)
一部ファイルをいじっているので重宝していたんですが、まあ仕方ないですね。
 
 

次からはファイルリストを作って diif するバッチファイルでも書くかと思って、Windowsで使うコマンドラインDiffを探したが、 いくつか試したところで WinMerge をつかってリスト作るのが楽かもとなった。
 
 
 




WinMerge で 新旧比較したリストを作る


とりあえず WinMerge をインストールして使えるようにしたら、適当なところにWordPressの新旧インストール用セットを展開しよう。
 

で、比較。フォルダ比較は操作性がイマイチなのでコマンドラインで渡してしまうのが楽かも。
WinmergeU ってのはUnicode版、例では"d:\WPDiff"っていうフォルダにWordpressの新旧ファイルを置いてます。
c:\Program Files\WinMerge>WinMergeU.exe /r d:\WPDiff\wordpress-2.7-ja d:\WPDiff\wordpress-2.7.1-ja


これでCLIのままでリストだけくれれば文句ないんだが、GUIが立ち上がってくる。本来の用途とはちょっと違うし仕方がないかな。
 

[caption id="attachment_1301" align="alignnone" width="300" caption="画像:WinMerge立ち上げ"]画像:WinMerge立ち上げ[/caption]
 

比較の結果が一覧で表示される。
 

で、一覧をざっと眺めたりソートしたりして、「異なっています」となっているファイルを選択、『パス名をコピー』としてあげればめでたく差分リストの完成となる。
更新されたファイル
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\languages\ja.mo
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\themes\default\ja.mo
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\css\colors-classic.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\css\colors-fresh.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\css\ie.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\css\press-this.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\blogger.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\blogware.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\livejournal.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\mt.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\rss.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\import\wordpress.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\bookmark.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\dashboard.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\file.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\media.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\plugin.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\post.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\schema.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\includes\template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\js\common.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\js\editor.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\js\link.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\js\plugin-install.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\admin-ajax.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\admin.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\edit-comments.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\edit-link-form.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\index.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\link-manager.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\menu-header.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\menu.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\theme-editor.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\update-core.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-admin\wp-admin.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\languages\ja.po
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\plugins\wp-multibyte-patch\ext\ja\class.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\plugins\wp-multibyte-patch\readme-ja.txt
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\plugins\wp-multibyte-patch\wp-multibyte-patch.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\plugins\wp-multibyte-patch\wpmp-config-sample.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\themes\default\ja.po
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\js\thickbox\thickbox.css
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\js\thickbox\thickbox.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\js\autosave.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\js\wp-ajax-response.js
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\bookmark-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\canonical.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\capabilities.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\category-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\class-phpmailer.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\comment-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\comment.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\compat.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\cron.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\feed-atom-comments.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\feed.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\formatting.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\functions.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\general-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\http.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\kses.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\link-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\pluggable.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\post-template.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\post.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\script-loader.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\taxonomy.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\theme.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\version.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-includes\widgets.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\readme.html
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-config-sample.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-settings.php
d:\WPDiff\wordpress-2.7.1-ja\wordpress\xmlrpc.php


新しいバージョンで追加されたファイル
d:\WPDiff\wordpress-2.7.1-ja\wordpress\wp-content\plugins\wp-multibyte-patch\ext\ja\word-count.js

 

あとはこのリストのファイルをCopyなりで他のフォルダにもっていってあげればOK。
 

2.7.2 がでたら更新差分を作ってみようかな。
 

2009年4月22日水曜日

Ultimate Google Analytics plugin が有効にならない?

Wordpressの便利なプラグイン「Ultimate Google Analytics plugin」についてメモ。
 

要は Google Analytics でトラッキングしてもらうコードを Wordpressの各地に埋め込んでくれるものだけど、ソースを見たら下記のメッセージのみでコードが入ってない時がある。
『tracker not added by Ultimate Google Analytics plugin』
 

有効にならないのでどうしてかと思ったら。
UltimateGAプラグイン採用 [追記] < < yamaq blog
の情報にて解決。
 


実際にログイン状態でGoogleのコードが含まれていないかを試す方法に気がつきました。SafariのView Sourceでページのソースコードを表示したところ、ログイン状態の場合、
 
tracker not added by Ultimate Google Analytics plugin
 
という表記が見つかりました。その後一旦ログアウトして確認したところ、きちんとScriptの項目が有効になっていました。


なるほどねー、そういえばそういう設定項目があったな、"Track admin pages" とかいうオプション。

別ブラウザから見たらちゃんとコードが入ってた。
 

2009年4月21日火曜日

The SNIA Storage Management Initiative (SMI) ドキュメント

あとで(頑張って)読む 的なエントリ。
 
http://www.snia.org/forums/smi/tech_programs/tech_activities/spec_activities/
 
 


ストレージネットワーキング・インダストリ・アソシエーション(Storage Networking Industry Association 略称=SNIA ) という団体の出しているドキュメント。
SNIA自体はストレージベンダさんが寄り集まって、ストレージの使い方広めようぜ という団体さんだ。

find で古いファイルを消す

メモエントリ
 

linux サーバ運用で、古いログやファイルをfindで洗い出す時、 mtime, mmin などのオプションを使う。
あとは exec に渡して消すなり tar で固めるなりと、好きに料理すると良い。
 

#!/bin/bash
del_oldlog(){
# $1 directory path
# $2 days
find $1 -type f -name \* -mtime +$2 -exec rm -f {} \;
}
del_oldlog $1 $2

mtime で指定する値は、狙い通りにするのはちょっとややこしい、man を見るとよい。
(追記:daystart オプションで扱いやすくなる)
 
 


ちなみにfindだけでやるより、exec の代わりに パイプで xargs に投げた方が処理的に軽いみたい。
#!/bin/bash
del_oldlog(){
# $1 directory path
# $2 days
find $1 -type f -name \* -mtime +$2 | xargs rm -f
}
del_oldlog $1 $2


量が多いと思ったらこちらを優先したい。
 
 




4.26追記:(はてブにツッコミがあったので)
findコマンドのうち、IEEE Std 1003.2(POSIX.2) の仕様にそっているものでは
"-delete" オプションというのが使えるらしい。
他、"-exec" では ;(セミコロン) でなく +(プラス) で閉じると xargs のようにまとめてコマンド実行してくれる模様。
例としては FreeBSD でつかえる find とか。

2009年4月13日月曜日

WindowsServer2003R2 のFSRMで、クォータの残り容量をコマンドラインから取得 する

メモエントリ
 

WindowsServer2003R2 のファイルサーバリソースマネージャ(FSRM) で、クォータの情報をコマンドラインで取得する。
 
 

"D:\Users/UserA/" にクォータをかけている場合、 dirquota コマンドから残りの使用量を表示することが出来る。
>dirquota quota freespace /Path:D:\Users/UserA/
利用可能: 895.07 MB

 
 
 

dirquota コマンドは 2003R2 のFSRMを入れたら使えるようになる、FSRM管理専用のコマンドだ。
この記事に関連したヘルプを並べてみる。
>dirquota
このコマンドの構文は次のとおりです:
 
Dirquota {Quota | Autoquota | Template | Admin}
 
Quota クォータの一覧表示、追加、変更、削除
Autoquota 自動適用クォータの一覧表示、追加、変更、削除
Template クォータ テンプレートの一覧表示、追加、変更、削除
Admin 設定の構成および管理操作の実行
 
スイッチを一意に識別する最小シーケンスを省略文字として使用できます。
例: "Dirquota q l /list-n" は "Dirquota quota list /list-notifications"
と同じです。

 
 

>dirquota quota
このコマンドの構文は次のとおりです:
 
Dirquota Quota {List | Add | Modify | Delete | Scan | Freespace}
 
List 現在構成されたクォータを一覧表示する。
Add 新しいクォータを追加する。
Modify 既存のクォータを変更する。
Delete 既存のクォータの削除する。
Scan クォータ使用率を更新するためスキャンを開始する。
Freespace 空き領域を照会する。
 
スイッチまたはスイッチの値を一意に識別する最小シーケンスを省略文字として
使用できます。例: "Dirquota q l /list-n" は
"Dirquota quota list /list-notifications" と同じです。

 
 

>dirquota quota freespace
空き領域を照会する。
 
このコマンドの構文は次のとおりです:
 
Dirquota Quota Freespace /Path:PATH [/Remote:REMOTE]
 
/Path:PATH PATH 上の空き領域を照会する。パスの最も
厳しい制限のあるクォータの空き領域が返されます。
 
/Remote:MACHINE コンピュータ MACHINE の操作を実行します。
 
例:
Dirquota Quota Freespace /Path:D:\scratch

 

それなりに色々可能だが、結果が標準出力に限っちゃうのが玉にキズ。
 

WMIから取る方法も少し探したけど、分からなかった。
R2関連は軒並みないWMIで管理できない気がする。。
 

2009年4月9日木曜日

sendmail の .forward で、メールの任意の行をログに出力

以前のネタ、sendmail で リレーするメールの DATA 部分をログに記録する の局地限定仕様版。
全アカウントの全メールをログに書き出しているとさすがに大変なので、ピンポイントで調査する時になど向け。
 

要点だけ言うと、 .forward にコマンドなりスクリプトなりを書いて、必要なものだけログに出力してしまおうという話。
 
 


例えば 特定のメールアドレスに送られてくるメールの Subject だけを記録したいという場合。
 

該当アカウントのホームディレクトリにある ".forward" ファイルを編集する、なければ作る。
"|grep '^Subject\:'>>/tmp/testlog.txt"
\{バックスラッシュ+元のアドレスという行}


と記述しておけば "Subject:" で始まる行だけログに記録できる、記録先はパーミッションのあるところなら何でもOK。
ちなみに2行目がないとメール消えちゃうので注意。
 
 

結局、標準出力を処理するだけなので単純だ、他の情報も grep のところで簡単な正規表現で出来るはず。
貰ったメールの内容を条件に、ログ記録以外で色々やりたいなら シェル やら perl やらでスクリプト書けばOK。
 

もし出来ない場合は smrsh などが原因ちゃうかな、ログを見たら良いと思う。
さらにSendmailに限った話でもないけど、試したのがSendmailだったからで、大体のMTAで似たようなこと出来るはず。
 

2009年4月8日水曜日

tarで差分

メモエントリ
 

tar単体で差分取れるとは知らなかった。
 

Manpage of TAR より。
-N, --after-date DATE, --newer DATE
DATEより新しいファイルだけを格納する

 

へぇ、使いどころ次第で地味に便利かも。
 

日時の書式はこんな感じ、"2008-04-07 00:00:00" 日付だけでもOK。
date でいうと 'date "+%F %T"' での出力になるかな。