2007-04-24

MacBookProのバッテリが・・・

最近、MacBookPro(15インチ、初代)をバッテリで使っていると急に電源が切れる現象に見舞われていたので、銀座アップルストアに相談しにいった。
バッテリキャリブレーション(フル充電したまましばらく使って、その後バッテリ駆動で最後まで使い切る)を行っても直らないですかと聞かれたので、普段そういう使い方をしているが直らないと答えたところバッテリをその場で新品に交換してもらえた。購入後1年を過ぎていたけれど、AppleCareに入っていたのでまだ保証が効いたのだ。MacBookProのバッテリは15,800円なので、ひとまずAppleCare代の半分は元を取れたことになるね。

Adobe Acrobat 8のタイプライターツールは文字色を変えられない

Acrobat8にはタイプライターツールというものがあって、PDF文書内の好きな場所に文字列を書き込むことができる。
この機能、便利なのだが何故か文字の色を変えることができない。黒に固定。(大きさなら変えられる)

赤い字でコメントを入れたいときにはやはり注釈機能の「テキストボックス注釈」を使うよりないようだ。
デフォルトでは枠線と塗りつぶしがついてしまうが、プロパティで枠線なしにしたり塗りつぶしなし(背景透過)にしたりできる。

BINDのゾーンファイルにNSレコードを追加して委譲を行う

最近は簡単にドメインを取れてしまうので、サブドメインで何かを運用するという機会もあまりなく、表題のようなことのやりかたも知らなかったのだけど、サブドメインといったグループでなく特定のホストだけ名前解決を委譲するといったことも出来る(本来DNSの使い方として想定されていないだろうけど)ので、一応覚えておくためのメモ。

例えば stbbs.net ドメインのプライマリDNS上で、www.stbbs.net の解決だけ外のホストに回すように設定したい場合。

www IN NS other.ns.stbbs.net.

みたいにしておけば、そうなる。
移譲先のNSでは www.stbbs.netドメインの 無名ホスト(というんだろうか?)にAレコードを書いてやれば良いと思う。

2007-04-21

cronとexpユーティリティを使ったOracleのかんたんバックアップ

最近の Linuxだと、/etc/cron.daily に置いてあるスクリプトが勝手に毎日実行されるようになっていると思う。
なので、これを使って Oracleのデイリーバックアップをしてみよう。

※この記事で扱っている内容を実際に運用した結果について責任は持てませんので、やるなら必ず自分で検証してからにしてください。

私の作成した /etc/cron.daily/exp.cron は下記。

#!/bin/sh
USER=hr # Oracleユーザー名
PASSWORD=secret # パスワード
FILE=$USER-`date +%a`.dmp
echo "exp $USER/$PASSWORD FILE=$FILE && gzip --force $FILE" | su - oracle

/etc/cron.dailyに配置されたスクリプトは cronデーモンにより root権限で実行されるが、私の場合 rootユーザにOracle用の環境設定をしておらず、かわりに oracle ユーザに対してORACLE_HOMEなどの設定をしてある。そのためこのスクリプトでは expコマンドを su - oracle で呼び出している。suコマンドに - オプションがついているので、expコマンドはユーザ oracleのホームディレクトリで実行される。そのためこのスクリプトではバックアップファイルもそこに出力されることになる。

また、このスクリプトでは1ユーザのスキーマのみexpしている。もしデータベース全体のバックアップを取る必要がある場合は、expコマンドに与えるユーザーとしてDBA権限(Oracleにデフォルトで存在するのは sys, system など)を持ったものを選択し、FULL=y を指定する。

出力先ファイル名として、`date +%a` を用いている。このコマンドは曜日を返す。つまり、曜日毎に違うファイル名でバックアップファイルを出力するので、常に一週間分のバックアップが保持されることになる。

cronの実行中に出力された内容はrootにメールされるが、その中に expコマンドから出力された「EXP-00091: 不審な統計をエクスポートしています」という警告があるかもしれない。
不審という言葉もどうかと思うが、これは「統計情報をエクスポートしたものの、(なんらかの理由で)これをインポートしても使えないかもよ?」という意味である。この警告が出力される原因は色々あるようだが、統計情報はインポート後に再作成できるので、よほどテーブルが巨大で統計に時間がかかるというのでなければこの警告は無視して構わないと思う。

ついでにメモしておくと、統計情報の再作成をするには、プリセットのANALYZE_SCHEMAプロシージャをコールするのが早い。
('HR' はユーザー名で置き換えること。大文字小文字の区別あり)

call DBMS_UTILITY.ANALYZE_SCHEMA('HR','compute');

統計情報ってなに?という人はOracleの CBO(コストベース・オプティマイザ)について調べると良い。

ラベル:

YAMAHAルータでブリッジのかわりにProxyARPを使う

YAMAHA RTW65iを購入したものの、困っていたことがひとつ。HUBを内蔵していない。

いや、HUBくらい持っているんだけど、このRTW65iは外部からINS経由で接続して電源スイッチコントローラ RPC-5LCを制御するためのゲートウェイという役割を担っているので、RTW65iとRPC-5LCとの間には障害ポイントになりうる機器を設置したくない。つまり外部のHUBなど経由せず直接RPC-5LCを接続したい(なおかつLANにも接続したい)

LANケーブルをさす穴という意味では、RTW65iには LAN1ポートとLAN2ポートがある。通常LAN2ポートはWAN側ポートとして使われるが、YAMAHAルータはそこいらの安物と違ってあるポートを必ずWAN側に接続しなくてはならないといった制限はなく、設定次第で好きなように利用できる(わざわざ3倍のお金を出してヤマハ製のルータを買う人種は、そこがわかっているのだ)。しかしながら、LAN1ポートとLAN2ポートは別のインターフェイスなので、そのままだと同一ネットワークに所属させることができない。YAMAHAの高いルータだと複数のインターフェイス間でブリッジを設定してそのような動作をさせることが出来るのだが、RTW65iは家庭向けのグレードなので、いくらそこいらの安物と違うとはいえレイヤ2の動作を制御するほどの機能はない。

仕方がないので、RTW65iとRPC-5LCの接続には別のネットワークセグメントを定義して運用していたのだが、ProxyARPを使えば異なるネットワークインターフェイスを同一セグメントに居るように見せられることがわかった。

ネットワークの一部分を別セグメントにする (www.rtpro.yamaha.co.jp)

これを参考に、LAN1ポートの所属している24ビットマスクのネットワークから 248番以降の3ビットを切り出した 29ビットマスクのネットワークをLAN2ポート上に定義したら望みのことが出来た。
(もともとPPP接続を受け付けてLANにゲートウェイするためにProxyARP自体はオンにしていた)

レイヤ3の機能でこういう運用もできるんだな、とちょっと感心。

2007-04-18

スコットさんはもういない

Oracle Express Edition(XE)をインストールするとデフォルトで HR というサンプルスキーマが作成される。HRが何の略かは知らない。HardRockか?
最初HRはアカウントロックされた状態なので、使うならロックを解除してやる必要がある。apexでやればすごく簡単。
apexでアカウントロックを解除する際、同時にパスワードも設定できるが、信頼できないネットワークからのアクセスを受けるノードなら少なくともTIGERやMANAGERやCHANGE_ON_INSTALLはやめておいたほうがいいと思う。

ラベル:

2007-04-17

Vista Access2000→2007

Vistaマシンに Microsoft Office2007の試用版を入れたら、

Access2000が動かなくなりました。

謀ったなマイクロソフト!
ゆるさん・・・ゆるさんぞ・・・

WebDAV(on Apache2)も使えてたのが使えなくなった気がする。

XenでドメインUの仮想CPU数を絞る方法

うちのドメインUたちはドメイン0で稼働しているLVMの上で動作している。
ドメインUの稼働している論理ボリュームのスナップショットを作成してxfs_copyでバックアップし、gzipで圧縮するという処理をドメイン0上のcronで毎夜行っているのだが、これが重い(特にgzip)。

Xenの仮想CPUは、ドメイン0にはデフォルトで実CPU数と同じだけ割り当てられてしまうので、ドメイン0でコンテキストが複数走るような重い処理を開始するとCPUコアを両方使ってしまいドメインU群に割り振られる処理時間が激減しているようだったので、ドメイン0に割り当てる仮想CPU数を2から1に減らそうと考えた。

結果をいうと、grub.conf内にある kernel=/boot/xen.gz 行で、dom0_mem=オプションと並べて dom0_max_vcpus=1 と書くことでどうやら実現できたようだが、この情報がほとんどどこにも載っていない。誰もドメイン0の仮想CPU数を減らしたくなんかないのだろうか。

これを書いている最中にちょうどドメイン0でバックアップが走り出したが、ドメイン0へ割り当てる仮想CPU数を減らした今、ドメインU群は重くなることなく良いレスポンスを維持しているようだ。

ラベル:

Apacheで Reverse Proxy

普通のProxyは閉じたネットワークの中から外へのアクセスを代理する。
Reverse Proxyは、外からのリクエストをネットワーク内のホストへ中継する。

社内ネットワーク上にあるWebアプリケーションの、「ある機能だけ」インターネット側に見せたいといったような場合にこの Reverse Proxyが役に立つ。もちろん外に見せても差し支えないもの(きちんと認証機構を備えているなど)であることが前提だが。

Gentooの場合、/etc/conf.d/apache2の APACHE2_OPTS=行に "-D PROXY" を追加すると ApacheのProxy機能が有効になる。

<IfModule mod_proxy.c>
 ProxyPass /myapp http://myappserver:8080
</IfModule>

上記のようにすると、/myappへのアクセスが myappserverの8080番へ転送されるようになる。内側に居るのが AJPのしゃべれるアプリケーションサーバなら Proxyじゃなくてmod_jkを使ってもっと効率の良い(とおもわれる)バイナリプロトコルで通信すれば良いのだけれどね。
ProxyPassとProxyPassReverseの違いは、返りのLocation:ヘッダに手を入れてリダイレクトの辻褄を合わせるかどうかの違いなんだけど、私の手元では何故か ProxyPassReverseがうまくいかなかった(Proxy設定自体が無視されてしまう)。うーん。

AccessとOracle、#Deletedの謎

Oracleで、Accessのオートナンバーと似たことをやろうとするとシーケンスとトリガを使ってこうなる。
"ID"がオートナンバーにしたい列ね。

CREATE TABLE "領収書"
( "ID" NUMBER(7,0),
"日付" DATE,
"発行元" NVARCHAR2(64),
"但し書き" NVARCHAR2(64),
"税込金額" NUMBER(8,0),
"領収書番号等" NVARCHAR2(64),
"主な品目" NVARCHAR2(64),
"決済方法" NVARCHAR2(64),
"記帳済み" NUMBER(2,0),
"仕分け候補" NVARCHAR2(64),
CONSTRAINT "領収書_PK" PRIMARY KEY ("ID") ENABLE
);

CREATE SEQUENCE "領収書_SEQ" NOMAXVALUE NOCACHE NOORDER NOCYCLE;

CREATE OR REPLACE TRIGGER "BI_領収書"
before insert on "領収書"
for each row
begin
select "領収書_SEQ".nextval into :NEW.ID from dual;
end;

ALTER TRIGGER "BI_領収書" ENABLE;


実はapex経由でテーブルを作成すると、主キー用のシーケンスとトリガ(上記みたいなの)を自動的に作ってくれるオプションが使えるのでいちいちやりかたを覚えなくて良い上記のようなことは覚えなくて良い。とはいえWeb上のフォームでポチポチやるよりもDDL文を手で書いて実行した方が早いので今後のためにメモ。

それはそうと、こうして作った「主キー列をDBMS側で自動生成する」テーブルを Access(2000とか2007とか)からリンクテーブルとして使おうとすると、行をINSERTするたびにいちいち"#Deleted"になってしまう。
なんでだろうと思って色々試してみたのだけれど、日本語のテーブル名やカラム名は問題ないみたいなのだが、どうやらVARCHAR2列の最大長256以上?だとそうなるみたいだ。ODBCの型にうまくマッピングできないんだろうか。
他にもID列の長さがint型の範囲を超えている(小数部があったり、桁数が10桁以上あったり)場合や、ODBCドライバが古い場合などにも#Deletedが出るとのこと。

ラベル:

2007-04-14

Java(ICU4J)で全角文字を半角に変換する

ICUは驚くほど多くの変換処理が可能で、半角に変換できる全角文字(カタカナ含む)を半角に変換なんていう日本のケータイ事情に都合のいい処理まである。恐るべしIBM。

import com.ibm.icu.text.Transliterator;

Transliterator tr = Transliterator.getInstance("Fullwidth-Halfwidth");
String halfwidthHoge = tr.transliterate("ホゲ");

Translitartorはステートレスに動作するので、複数スレッドから同時に呼び出される可能性のあるシングルトンでステートレスなコンポーネントに持たせて使っても大丈夫。要するにスレッドセーフ。

"Fullwidth-Halfwidth"の Transliteratorは何故か空白文字だけ全角を半角に変換してくれないので、うちでは仕方なく空白だけ replaceして使っている。

2007-04-12

PostgreSQLのODBCドライバ

本家にある。
http://www.postgresql.org/ftp/odbc/versions/msi/

インストーラは英語だが、日本語UIリソースも入っているので、これを使えば大丈夫なのだと思う。

2007-04-10

Struts2を動作させるために最低限必要な物

最低限、下記のようなファイル構成が必要だった。

./src/java/struts.xml
./src/webapp
./src/webapp/WEB-INF
./src/webapp/WEB-INF/classes
./src/webapp/WEB-INF/lib
./src/webapp/WEB-INF/lib/freemarker-2.3.8.jar
./src/webapp/WEB-INF/lib/ognl-2.6.11.jar
./src/webapp/WEB-INF/lib/struts2-core-2.0.6.jar
./src/webapp/WEB-INF/lib/xwork-2.0.1.jar
./src/webapp/WEB-INF/web.xml


Spring Frameworkも組み合わせて使うならこれも。

./src/webapp/WEB-INF/lib/spring.jar
./src/webapp/WEB-INF/lib/struts2-spring-plugin-2.0.6.jar
./src/webapp/WEB-INF/applicationContext.xml

web.xmlへの記述はこんなふう。

<filter>
  <ilter-name>struts</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
  <filter-name>struts</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Springを組み合わせるならこれもね。

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ラベル:

2007-04-09

Linuxで動作中のプロセスがどのファイルを開いているか知る方法

運用中のシステムで、運用上の都合によりファイルを削除したい時とか、移動したいとき。
動作中のプロセスが使っているファイルに触らない方が良いのは自明。
でも、どのファイルが今まさに使われているのか知るにはどうしたらいいのだろう。

実は Linuxの /proc ファイルシステムに情報がある。

たまたま手元のホストで MySQLがプロセス番号 4316として動作中なのでそれを例にとろう。

cd /proc/4316/fd

このディレクトリには4316番のプロセスが使用しているファイルディスクリプタが投影されている。中身をみてみよう。

# ls -l
lr-x------ 1 root root 64 Apr 9 00:54 0 -> /dev/null
l-wx------ 1 root root 64 Apr 9 00:54 1 -> /usr/local/var/aeka.err
lrwx------ 1 root root 64 Apr 9 00:54 10 -> /usr/local/var/ib_logfile1
l-wx------ 1 root root 64 Apr 9 00:54 11 -> /usr/local/var/mysql-bin.000055
(略)
lrwx------ 1 root root 64 Apr 9 00:54 26 -> /usr/local/var/mysql/procs_priv.MYD
lrwx------ 1 root root 64 Apr 9 00:54 3 -> /usr/local/var/mysql-bin.index
lrwx------ 1 root root 64 Apr 9 00:54 4 -> /usr/local/var/ibdata1
lrwx------ 1 root root 64 Apr 9 00:54 5 -> /tmp/ibeOA5lt (deleted)
lrwx------ 1 root root 64 Apr 9 00:54 6 -> /tmp/ibPbPkSe (deleted)
lrwx------ 1 root root 64 Apr 9 00:54 7 -> /tmp/ibiyDAo0 (deleted)
lrwx------ 1 root root 64 Apr 9 00:54 8 -> /tmp/ibTg0jXL (deleted)
lrwx------ 1 root root 64 Apr 9 00:54 9 -> /usr/local/var/ib_logfile0

少なくともここにリストアップされているファイルは、MySQLによってオープンされているので削除やら移動やらをしてはいけないということになる。(もちろんこういうものはプログラムが動作している限り刻一刻と変化するので参考のひとつとして考えるべき)

この情報は、誰かの作ったプログラムを他の場所へ移して実行したい場合に、実行バイナリ以外に一体どんなファイルを必要としているのかを調べるために参照することも有用だ。

2007-04-08

YAMAHA RTW65i 購入


今日は秋葉で出物があったので買ってきたよ!
これはね、ヤマハのRTW65iっていう無線ルーターなんだ。購入価格4,300円。

って、こんなもんどこで見つけてきたんじゃぁあぁあぁあ!!
(注:2004年4月に生産終了しています)
えっと、あきばおー3号店にありました。

へー無線ルーター?11Mbpsで 4,300円?高くはないけど別に何てこともないでしょ。
とかいうなかれ。RTW65iはISDNターミナルアダプタ内蔵なのだよ。(おまけでVoIPもできる)
ターミナルアダプタを買うとね、それだけで12,800円とかしちゃうのが普通なんだよ?
それに無線APとブロードバンドルータが一緒になった夢の(?)製品っていうわけさ。
そりゃターミナルアダプタも無線ルータも既に持ってるけど、こんな無粋な機械ふたつ置くよりもひとつにまとめたほうが見栄えもいいし配線もきれいになるでしょ。うちみたいにまだINSを使ってる所ではこういうのが重宝するんだよう。
ああ、あきらめてたんだけど手に入って良かったナァ。

(実はISDNのついていないRTW65bというモデルは昔持ってたんだけど手放した)

で、ファームウェアが最新になってなかったのでtftpでの更新手順をメモ。
YAMAHAのサイトにはあまりtftpで更新する手順が積極的に解説されてないので。

RTW65iに telnetして tftpを受け付ける設定にする。

telnet 192.168.0.1 # RTW65iのデフォルトIPアドレスはこれ
Password: #デフォルトはパスワードなし
> administrator
Password: #デフォルトはパスワードなし
# tftp host any
# save
# exit
> exit


ファームウェアを送信する側(LinuxなりMacなりの場合。Windowsの人はGUIツールでやってください)

tftp 192.168.0.1
> mode binary
> put rtw65i50325.bin exec


いじょう。

Oracle10g Instant Client Windows ODBC

なんですかこの Google先生に教えを請うかのような題名は。

Oracle Express Edition(XE) のおかげで手軽に Oracleが使えるようになったので、オフィスワーク用に使うことにしてみた。
そんなの PostgreSQLや MySQLを使えばいいんじゃないの?というなかれ、Oracle向けのノウハウ(バッドノウハウがほとんどだが)やツール資産、国際化対応、ドライバ(特にODBC)の成熟というものに関してはオープンソース系のそれとは歴史の長さがまるで違うのだ。
だからオープンソースより良いって主張したいわけじゃないけどね。単なる物好きだ!悪いか!

しかしそんなOracleもユーザーインターフェイス無しにはただの入れ物、使いようがない。
実は XEについてくる apexなるWeb UIの出来が良いのでそれでもまあまあ良いんだけど、やはり Wordや Excelくらいしかしか使ったことのない事務系スタッフにでも使える UIを提供しようとすれば Accessから ODBC経由で使ってもらうのが一番簡単で高効率だ。というか、この分野(わーどやえくせるしかつかったことのないじむけいすたっふによろこんでつかってもらえるでーたべーすふろんとえんど)で Accessに匹敵するものは未だに存在しないと確信している。(そりゃそうだよね前提条件がWordやExcelの経験なんだから)

Oracleのフロントエンドとして Accessでアプリケーションを構築したことのある人はどんな悪夢をしっているかな?
そのひとつが、「各端末に余すことなく Oracle ClientをインストールしてTNSを構成しなきゃいけない」じゃないだろうか。
(「WinMeにインストールできない(Oracleの仕様)」っていうのもあるだろうけどそれは記憶の彼方に葬るとして)

ところが最近の Oracle Clientではインストール時に Instant Clientという方法が選択できて、これが「普通の利用に必要な最小構成」を割とうまくセットアップしてくれるのだ。

というわけで我がオフィスでも、この間インストールした XEで名刺管理をするために(なんという些細な仕事にOracleを使うことか)、Windowsマシンに Instant Clientを入れてみたのでこの記事はそのメモ。っていうか前振り長いよ。

Oracle 10g ClientのWindows用をダウンロードしたら setupを実行して Instant Clientを選択、「次へ」「次へ」・・・でインストール完了。あれ、ORACLE_HOMEは?構成の選択は?TNSは?

AccessからODBC経由でOracleを利用するため、コントロールパネル→管理ツール→ODBC で、DSN定義を行う。
「ほらみたことか、TNSサービス名を要求されるじゃないか!メモ帳でtnsnames.oraを書かなきゃ!ORACLE_HOMEは何処?」
落ち着きなさいあなた!試しにTNSサービス名のかわりに、ホスト名/サービス名を書いてごらん。
(ryoko.localはうちのOracleホスト名、xeは Express Editionのインストールで勝手につけられるサービス名)

あ、なに・・・これでつながっちゃうのね。tnsnames.oraもORACLE_HOMEも設定しなくていいんだ、便利になったなあ。

うんうん、わかってくれてうれしいよ。でも実はNLS_LANG環境変数だけは設定しないとだめでした。
(設定しないとODBCドライバの構成ダイアログが全部英語になるばかりか、オブジェクト名などで日本語が通らない)
うちの場合は、JAPANESE_JAPAN.JA16SJISTILDEに。これが最良なのかは知らない。

ラベル:

2007-04-06

Mac OS X用のiSCSIイニシエータとLinuxのiSCSITarget その4

前回からの続き。

iSCSIによってParallelsの仮想HDを好き放題置ける場所が得られたので、さっそく Windows XPのイメージを iSCSIディスク上にコピーして動かしてみた。

んんー?なんだなんだ?妙に速いぞ?→動画で見る(要QuickTimePlayer)

試しに XBenchを使って MacBookProの内蔵ハードディスクと速度を比べてみよう!
マシン:MacBook Pro 15" Intel Core Duo 1.83 GHz RAM2GB
内蔵HDD:Intel ICH7-M AHCI 上の TOSHIBA MK8032GSX (80GB SATA)
iSCSI:RAID0アレイ上に作成された論理ボリューム(100GB) on Gentoo Linux
ネットワーク:ギガビットイーサネット(安いギガビットスイッチングHUB経由)

結果は・・・

...なんだこりゃー!

どうやら、内蔵のシリアルATAハードディスクを読み書きするよりも、iSCSI経由でもっと速いハードディスクを使ったほうが断然高性能のようだ。ギガビットイーサネットの帯域を考えれば理論上は当然なのだが、実際の速度がこれほど出るとは予想していなかった。(それよりMacBookProの内蔵ディスクがこんなに遅いとは・・・)

ランダムアクセスがむやみに速いのは、ターゲット側でディスクキャッシュがものすごく効いているからだと思われる(Linuxホストのメモリは1GB)。だから本当はキャッシュが無効な状態で比較しないと不公平なのだけど、速いこと自体は確実なのでまあいいとする。

というわけで、本当はMacProが欲しいんだけど持ち歩けないから仕方なく MacBookProで我慢しているあなた。
今すぐ LinuxでRAIDを組んで、iSCSIでつなぎなさい。さすれば救われん!(持って歩くときは多分連れて行けないけど・・・)
Macに限らず、iSCSIは XPやVistaでも使えるので(XP用のiSCSIイニシエータはダウンロード提供、Vistaでは標準搭載)、ノートPCの内蔵HDDが遅くて困っている向きにはネットワークインターフェイスがギガビット対応であれば是非おすすめしたいところ。

Linuxマシンで使うPCI-Express/シリアルATA用のハードウェアRAIDコントローラなら、俺は外付けで8台までいくぜ!という人にはマルチレーン接続のHighPoint RocketRAID 2322、とりあえず安く内蔵の4台でいってみようという人にはRocketRAID 2310がお勧め。Mac用のドライバもあるから、将来Mac Proを買っても大丈夫だよ。
ひとまずなにより性能の評価がしてみたい!という人はお金をかけずに mdadmを使ってソフトウェアRAID0を組んでもOK。

ラベル:

Mac OS X用のiSCSIイニシエータとLinuxのiSCSITarget その3

前回からの続き。

LinuxマシンでiSCSIのターゲットが起動したので、後は globalSAN iSCSI を使ってMacから接続してやる。


Portals -> Add で接続先のホスト名又はIPアドレスを追加。「そんなホストないよ」みたいな警告が出るが気にしなくて良いみたい。


接続先ホストを追加したら、Refreshボタンを押してそのホストの持っているターゲット一覧をロードさせる。するとTargetsに ietd.conf で設定したターゲットが現れるので Connected チェックをオンにしてみよう。
Target Connect...というダイアログが出るが、特に認証などを設定していない場合はそのまま Connectボタンを押す。


「セットしたディスクは、このコンピュータで読み取れないディスクでした」という表示が出る。これはまさに、新品のハードディスクを買ってきて USBなり FireWireなりで接続した時と同じ動作だということにお気づきだろうか?「初期化...」ボタンを押してディスクユーティリティを起動し、普通のハードディスクと同様にフォーマット(消去)しよう。


これで Linux上の記憶域をあたかも外付けハードディスクであるかのように Macで使えるようになった。

続く

ラベル:

Mac OS X用のiSCSIイニシエータとLinuxのiSCSITarget その2

前回からの続き。

さて、そもそもなんでわざわざLinuxと iSCSIなんてよくわかんない代物を組み合わせて Mac用のディスク領域を追加したいの?普通の外付けハードディスクやNASじゃだめなの?
私の場合、

  • うちの MacBookPro(初代)には FireWire800がついてない。FireWire400で外付けHDDをつけたところで、どう頑張っても速度は知れている

  • デスクの周りにゴテゴテとハードディスクを置きたくない。サーバ用の棚に全部収めてしまいたい

  • Parallels Desktop for Macの仮想HDはネットワーク上の共有フォルダ(smb,afp,nfs,webdav)に置けない


といったことが挙げられる。とくにディスク容量に乏しいノートでは最後のが致命的で、これのために 8GBのSDHCメモリを買ったりなど涙ぐましい散財があったのは秘密。

...さて、Linux上で iSCSIターゲットを起動するのは割と簡単。

/etc/sysctl.confに下記のパラメータを追記して sysctl -p で反映させる。

net.core.wmem_max=1048576
net.core.wmem_default=1048576
net.core.rmem_max=1048576
net.core.rmem_default=1048576
net.ipv4.tcp_mem=1048576 1048576 1048576
net.ipv4.tcp_rmem=1048576 1048576 1048576
net.ipv4.tcp_wmem=1048576 1048576 1048576

必須ではなく推奨パラメータらしいので、メモリ容量に乏しい環境では無理に設定しなくても良いかも知れない。

iscsitargetをインストールする。Gentooなら、

emerge iscsitarget

イニシエータ側へHDDとして見せたいブロックデバイスをどれにするか選ぶ、又は作成する。実ディスクを見せたければ /dev/sd*でも良いと思うし、論理ボリューム(LVMを使っているなら lvcreateで作る)でも構わない。
ブロックデバイスの用意が出来たら、/etc/ietd.conf にその情報を書き込む。
私は raid0ボリュームグループにparallelsという論理ボリュームを作って、それを MacからHDDとして使えるようにしようと下記のような設定にした。ターゲットの名前はよくしらないけど "iqn.年-月.自分のドメイン名:このデバイスの名前" にすればいいみたいだ。

Target iqn.2007-04.net.stbbs:parallels
Lun 0 Path=/dev/raid0/parallels,Type=fileio

/etc/init.d/ietd start として iSCSIターゲットを起動する。自動起動にしたい場合、Gentooなら

rc-update add ietd default

とでもする。

続く

ラベル:

2007-04-04

バックグラウンドでひたすら繰り返しコマンドを実行し続ける

bashスクリプトで。

while true; do 実行したいコマンド; sleep 1; done &

Mac OS X用のiSCSIイニシエータとLinuxのiSCSITarget

無料で使えるMac OS X用の iSCSIイニシエータ "globalSAN iSCSI"が登場!
「時間制限も機能制限もしていません。どうぞMacOS Xで iSCSIのアドバンテージを得てください 」とのこと。すごくいい会社だ!

iSCSIのことをちょっと説明すると、要するに SCSIのネット版。iSCSIでは、ストレージを利用する側を「イニシエータ」ストレージを提供する側を「ターゲット」と呼ぶ。パソコンがイニシエータで外付けHDDがターゲットね。
これはいわゆる SAN(Storage Area Network)を普通のLAN機器で実現する技術で、ファイバチャネルの貧乏人バージョンといったところ。とはいえ、ギガビットイーサネットの帯域は FireWire800を超えるわけで、ストレージを接続するインフラとしてはそれなりに強力なのだ。

Windows Vistaには標準でiSCSIのイニシエータが搭載されているのだが、Macには今まで有料の別売製品しかなかった。
しかしこれからは Macでも iSCSIが利用できるんだ!

・・・とは言ったものの、iSCSI対応のハードディスクなんてどこに売ってるの?そう、ヨドバシカメラやビックカメラに行って「iSCSI対応のハードディスクくださーい」などと言ってもまるでわかってもらえないことはほぼ確実だ。間違いなくNASとかを勧められてしまうだろう。

イニシエータがあってもターゲットがなくては仕方ない。仕方ないので Linuxで立ち上げてしまおう。Linux上で iscsitarget というサービスを動作させれば、Linuxマシンに搭載されている任意のディスクやパーティションをiSCSIディスクとしてネットワーク越しに提供可能だ。

注意しなくてはならないのが、SANはストレージを提供するためのネットワークだけど、同じディスクを複数のホストから同時に読み書きする機能を直接はサポートしないということ。(外付けハードディスクは同時に1台のパソコンからしか使えないのと同じ)
もしSAN上のディスクを直接複数のホストから同時に読み書きしたいのであれば、クラスタ対応のファイルシステムを用いなければならないことに注意!(WindowsやMacで手軽に利用可能な物があるかどうかは不明、Linuxなら OCFSや GFSを使う)

次回から、実際に LinuxでiSCSIターゲットを起動し、それを Macから利用するまでの流れを紹介する。

続く

ラベル: