2010年01月19日

パーティション分割されたパーティションのmount方法

タイトルが分かりにくくてすいません…。
(内容もお世辞にも分かりやすく書けてません…orz)

きっかけは昨日の記事。iSCSIターゲットサーバ上で論理ボリュームやパーティションを公開する領域として指定した場合、ターゲットサーバ上では1つのパーティションとして扱われる領域が、イニシエータ側ではディスクそのものだと認識され、その中にさらにパーティションが作成されることになります。

イニシエータ側はそれで何の問題もないんですが、ターゲットサーバ側で中身を見たいときに「パーティションの中にあるパーティション」のマウントってどうやるの?と考えたら頭の上にはてなマークが。

で、その解決方法。
実はとっても簡単で、offsetを指定してあげるだけでした。

まずはパーティション内のパーティション(分かりにくい言葉ですね^^;)のoffsetを調べるために、fdisk-lu オプションを付けて実行します。(以下の例では /dev/hdb1 がiSCSIで公開している領域となります)
fdisk -lu /dev/hdb1

こんな感じの結果が出てくると思います。
Disk /dev/hdb1: 1069 MB, 1069254144 bytes
255 heads, 63 sectors/track, 129 cylinders, total 2088387 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot Start End Blocks Id System
/dev/hdb1p1 63 1044224 522081 b W95 FAT32
/dev/hdb1p2 1044225 2072384 514080 b W95 FAT32
この Start とあるのが各パーティションのオフセット値になります。ただしここで表示されているのはセクタ単位。fdiskoffset値はバイト単位で指定する必要があるので、このStartの値にセクタサイズを掛け算した値を指定する必要があります。上記の例で第2パーティションを指定したいのであれば、
1044225(セクタ位置) x 512(セクタサイズ) = 534643200

を指定する必要があります。

実際のコマンドは以下のようになります。
mount -o loop,offset=534643200 /dev/hdb1 /mnt

これでターゲットサーバ側でもディスクの内容を参照出来るようになりますが、1つ留意点が。イニシエータ側での書き込みはターゲットサーバ側には即座に反映されません。一度umountしてmountし直すと反映されていましたが、どのタイミングで反映されるかは具体的には分かりません。逆のパターンでターゲットサーバ上での書き込み結果もイニシエータ側はディスクの切り離し/再接続をするまで反映されませんでした。

基本的にはターゲット側とイニシエータ側で同時に書き込みする(それも別の仕組みで)事は考慮されていないと思うので、常時両方からmountするのではなく、イニシエータ側が使用していないときにターゲット側で内容を確認するための手段くらいに考えておいた方が良さそうです。

以下のサイトを参考にさせていただきました。(感謝!)

壊れたかもしれないハードディスクからのデータサルベージ - 黒糖々日記/kokutoto diary
http://d.hatena.ne.jp/kokutoto/20080525/p1

HDDイメージファイルをマウントして使う方法 - adsaria mood
http://d.hatena.ne.jp/adsaria/20080724
posted by 月水和尚 (とも) at 17:41 | Comment(2) | TrackBack(0) | Linux(UNIX)全般

2010年01月18日

CentOS 5.4でiSCSIターゲット

CentOSでiSCSIを使おうと思い scsi-target-utils を入れてみたんですが、何故かターゲットデバイスを指定しようとするとtgtadmコマンドがハングしてしまいます。ちょっと調べてみた感じだと、どうも 5.2 まではうまく動いていたようですが、5.3 以降では事例が見つからない。動かなくなった??

仕方ないのでソースからコンパイルしてみることにしました。

使用したのは iSCSI Enterprise Tagetscsi-target-utilsLinux target framework が元になっているみたいなのですが、導入事例が見つかったのが前者だったのでそちらを試しています。

まずは下準備。コンパイルに gcc kernel-devel openssl-devel が必要なので導入しておきます。
yum install gcc kernel-devel openssl-devel

次にソースコードを取得します。こちらのダウンロードページから最新版をダウンロードしてください。2010/01/18現在の最新版は1.4.19なので以下のコマンドでダウンロードおよび展開をします。
cd /tmp
wget http://downloads.sourceforge.net/project/iscsitarget/iscsitarget/1.4.19/iscsitarget-1.4.19.tar.gz?use_mirror=jaist
tar zxvf iscsitarget-1.4.19.tar.gz
cd iscsitarget-1.4.19

続いてビルド。これはもうお作法どおり。
make && make install

サービスを起動します。
service iscsi-target start

続いてiSCSIターゲットの作成。
ietadm --op new --tid=100 --params Name=iqn.2010-01.com.hoge.iscsi:test

ターゲットID(tid)は0以外であれば何でもいいようなのですが、ここでは参考にさせていただいたサイトを真似て100にしています。名前は命名規則があって、

 タイプ識別子「iqn.」、ドメイン取得日、ドメイン名、ドメイン取得者が付けた文字列

としなければないそうです。ただ今回はローカルな環境に設定している(=名前の衝突は発生しない)ので、適当な名前で設定しました。

続いて公開するディスクの設定。
ietadm --op new --tid=100 --lun=0 --params Path=/dev/hdb

ここではディスクを丸ごと1つ(/dev/hdb)公開指定しましたが、LVMの論理ボリュームやパーティション、ファイルシステム(ddで空のファイルを作っておく)を指定しても大丈夫みたいです。ただ論理ボリュームやパーティションを公開した場合、ホスト側で中身を参照する方法が不明…どうやるんだろう?(ディスク丸ごとであれば普通にmount出来るのですが)

−追記:2010/01/19−
解決したので別記事作成しました → こちら
−追記ここまで−

これでiSCSIターゲットの設定は完了です。あとはiSCSIが使用するポート(3260/TCP,UDP)を外部と通信可能にしておきましょう。CentOSの導入時にFirewallを使うように設定している場合、以下のエントリを適当な場所(ESTABLISHEDの前あたり?)に追加します。
-A RH-Firewall-1-INPUT -p udp -m udp --dport 3260 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 3260 -j ACCEPT

設定を有効化しましょう。
service iptables restart

続いてクライアント側(ターミネータ側)の設定。今回はWindowsXPから使うことを想定します。

WindowsXPはデフォルトではiSCSIのドライバを持っていません。以下のサイトからダウンロードしてインストールする必要があります。

Microsoft iSCSI Software Initiator
http://www.microsoft.com/downloads/details.aspx?familyid=12cb3c1a-15d6-4585-b385-befd1319f825&displaylang=en

スタートメニューからMicrosoft iSCSI Initiatorを実行すると、iSCSI Initiatorのプロパティというウィンドウが表示されます。Discoveryタブを選択し、Target PortalsAddボタンを押し、先ほどiSCSIターゲットを導入したサーバのIPアドレスを入力します。

次にTargetsタブを選択すると、Targetsに先ほどサーバ側で設定した名前が表示されていると思います。項目を選択してLog On...をクリックするとポップアップが表示されるので、必要なオプションにチェックを入れて(とりあえずテストであればチェック不要です)OKをクリックすればディスクが認識されます。

あとはローカルディスクと同様に、ディスクの管理ツールからパーティションの設定やフォーマットを行えば利用可能になります。

ちなみに先ほど ietadm で設定した内容は、再起動後には無効になってしまいます。サービス起動と同時に有効にするためには、/etc/iet/ietd.conf に以下の設定を追加します。
Target iqn.2010-01.com.hoge.iscsi:test01
  Lun 0 Path=/dev/hdb,Type=fileio
  MaxConnections 1

あとサービス自体もサーバ再起動時には行われないので、ちゃんと自動起動するように設定しておきましょう。
chkconfig iscsi-target on

以下のサイトを参考にさせていただきました。(ありがとうございます!)

CentOS/5.2/11.iSCSIターゲット - moji-moji wiki
http://mojimoji.jp/wiki/index.php?CentOS%2F5.2%2F11.iSCSI%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88

Mazn.net » iSCSIを使ってみる@CenOS5.2 (ターゲット) + Windows XP (イニシエータ)
http://www.mazn.net/blog/2009/03/20/199.html

EZ-NET: CentOS 5.3 で iSCSI ターゲットを構築する
http://network.station.ez-net.jp/server/linux/storage/iscsi.asp

湘南エイト会−iSCSI技術仕様
http://liffey2.ld.infoseek.co.jp/computer/storage/index7.html

−追記:2010/02/02−
前提ソフトウェアにgccとkernel-develを追加しました。
posted by 月水和尚 (とも) at 18:13 | Comment(0) | TrackBack(0) | Linux(ディストリビューション固有)