AS/400展望台

IFSへのデータの移行:パート2



ジェイク・クーゲル著

本記事のパート1では、ストリーム・ファイル・データをNTやQDLSからiSeriesの統合ファイル・システム(IFS)のルート・ファイル・システムに移行する方法について説明しました。パート2では、Unix/LinuxサーバーやNetWareサーバーからIFSへストリーム・ファイル・データを移行する方法について説明します。パート1と同様に、ここで用いた例ではCLコマンドとV5R1の新機能を使用しています。

Unix/Linuxからのデータの移行
AIX、Linux、その他のUnixサーバー間でファイルを共有するためのオプションの1つとしてネットワーク・ファイル・システム(NFS)があります。iSeriesはNFSサーバーとしての役割を果たすこともできますし、NFSクライアントとしての役割を果たすこともできます。共有したいディレクトリをNFSサーバーがエキスポートし、エキスポートされたディレクトリはNFSクライアント上にマウントされます。これは、PCサーバー上で共有フォルダを作成し、そのフォルダをPCクライアントのドライブにマッピングするのと似ています。

リモートのディレクトリを一度マウントしてしまえば、アプリケーションは、まるでファイルがローカル・システム上に格納されているかのように、ファイルにアクセスすることができます。リモート・システムからの実際のデータの取り出しはアプリケーションからは見えません。ただしこの方法はローカルのファイル・システム内にデータがある場合に比べて速度が遅くなります。誰かがファイルにアクセスするたびに、アクセス要求がネットワーク上を渡ってリモートのNFSサーバーまで行かなければならないからです。

以下の例では、NFSとCPY(Copy Object)コマンドを使用してUnixのNFSサーバーのディレクトリ・ツリーをiSeriesにコピーする方法を説明しています。ここではNFSサーバーとしてAIXを使用し、NFSクライアントとしてiSeriesを使用しました。NFSディレクトリを一旦マウントした後は、CPYコマンドを使用してディレクトリ・ツリーのローカル・コピーを作成しています。

1. Unixマシン上でNFSサーバーが稼動していることを確認します。NFSサーバーを既に起動している場合はこのステップは気にしなくて構いません。このステップはプラットフォームに最も左右される部分です。ここで紹介する例ではAIX固有のコマンドを使用していますが、他のUnixマシンでサーバーを起動した場合は、異なるコマンドを使用することになるでしょう。サーバーを起動したら、さまざまなUnix NFSサーバー用の標準アプローチにしたがったステップを取ります。

AIXシステムでは、次のコマンドを使用します(以下のコマンドを使用するにはルート権限が必要となる場合があります)。

lssrc -a
このコマンドはサブシステムの状態とサブシステムが存在しているグループ、およびそのグループの状態(たとえば、アクティブ、動作不能など)を表示します。ポートマップとnfsグループ内のすべてのサブシステムがアクティブになっていることを確認します。アクティブになっていなければ、以下のコマンドを使用して起動します。
startsrc -g nfs
startsrc -g portmap
2. コピーしたいファイルを所有しているUnixシステム上のユーザは、iSeries上のユーザ・プロフィールのUID番号がUnix上のプロフィールのUID番号と一致していることを確認します。セキュリティAPIであるQSYCHGIDを使用してiSeries上の既存のユーザ・プロフィールのUIDまたはGIDを変更できます(UID番号とGID番号の詳細については後述の「UID番号とGID番号を理解する」を参照してください)。QSYCHGIDは値を16進数で受け付けるということに注意してください。たとえばユーザFREDのUIDを2504に変更するには、16進値9C8を使用します。
CALL PGM(QSYCHGID)
   PARM('FRED' X'000009C8' X'FFFFFFFF' 0)
3. コピーしようとしているファイルを含んだUnixシステム上のグループのプロフィールがiSeries上のグループ・プロフィールおよびGID番号と一致していることを確認します。一致していないと、ファイルのプライマリ・グループが*NOUSRPRFとなってしまいます。プライマリ・グループが*NOUSRPRFのときにファイルをコピーしようとすると、「Information passed to this operation was not valid(この操作に渡された情報は有効ではありません)」といった曖昧なエラー・メッセージが返されます。

既存のグループ・プロフィールのGIDを変更するには、QSYCHGID APIを使用することができます(2番目のパラメータをX'FFFFFFFF'とし、GIDは3番目のパラメータに指定します)。また、まだグループがiSeries上に存在していない場合は、CRTUSR PRF (Create User Profile)コマンドを使用し、Unixシステム上と同じGID番号をこのコマンドに与えて、グループを作成することができます。
CRTUSRPRF USRPRF(<groupname>) PASSWORD()
INLPGM(QSYS/QCMD) GID(8193)
4. Unixからディレクトリをエキスポートします。まず、リモート・システム上でNFSサーバーが起動していることを確認します(ステップ1参照)。以下のコマンドを実行するにはルート権限が必要となる場合があることに注意してください。このコマンドは/tmp/mydirディレクトリをエキスポートし、だけにアクセスを許可します。アクセス・パラメータを使用しないと、デフォルトではどのクライアントもこのディレクトリをマウントできることになります。この例で使用したAIXシステムのコマンドは以下の通りです。
exportfs -o access=<clientname>,
   root=<clientname> -i /tmp/mydir

このコマンドにより<clientname>からルート・アクセスができるようになります。iSeries上で*ALLOBJという特別な権限をもっているユーザはルート・ユーザと見なされることに注意してください。NFSクライアントに対してNFSサーバーへのルート・アクセスを許可しないと、このユーザはNFSサーバー上のファイルを見ることができなくなります。
5. iSeries上でNFSサーバー・デーモン・ジョブを起動します(NFSクライアントでもこのステップは必要です)。
STRNFSSVR SERVER(*ALL)
6. MOUNTコマンドを使用して、エキスポートしたディレクトリをローカルにある既存のIFSディレクトリ上にマウントします。マウントしたディレクトリはルート・ファイル・システム中にあるはずです。
MOUNT TYPE(*NFS) MFS('<servername>:
<exportname>') MNTOVRDIR('<mountdir>')
7. CPYコマンドを呼び出して、ディレクトリ・ツリーをローカルのファイル・システムにコピーします。
CPY OBJ('<mountdir>')
   TOOBJ('<newdirectory>') SUBTREE(*ALL)

CPYコマンドはリモートのUnixシステム上にあるツリーのコピーを作成します。コピーされた新しいツリーの所有者はCPYコマンドを呼び出したユーザになります。ただし、各ファイルの元々の所有者はコピーされたオブジェクト上でもプライベート権限者として残り、Unix上のGID番号がiSeries上の既存のGID番号と一致していればファイルのプライマリ・グループも変わりません。このようにして、Unixシステム上のファイルを含む元々の所有者とグループは、iSeries上の新しいファイルに対してもアクセスが許されています。アクセス権限をより強めたい場合は、QShellコマンドを使用すれば、本記事のパート1のステップ6「NTからのデータの移行」のセクションで説明したように、ディレクトリ・ツリー全体に対して処理が行えます。

iSeriesを使ってリモートのNFSサーバー上にあるファイルを表示させるとき、一見そのファイルが有しているように見えるコード文字セット識別子(CCSID)の値が、実際にはMOUNTコマンドを発行したときに決定されるということに注意してください。デフォルトでは、ファイルはジョブCCSIDのASCII相当値であるCCSIDを有するように見えるはずです(ジョブCCSIDが37の場合、そのASCII相当値は437です)。つまり、iSeries上のアプリケーションは、そのファイルの中身が実際はどんなものであろうと、ASCIIのテキスト・データを含んでいると解釈してしまいます。

これではNFSサーバーにEBCDICのテキスト・データがあったときに問題となります。サーバー上にEBCDICのテキスト・ファイルがある場合は、MOUNTコマンドのCCSIDパラメータをCCSID(37 *ASCII)として、CCSIDが37に見えるようにします。最初のパラメータ値(データファイルCCSID)は、このディレクトリ中のリモートのファイルにCCSID 37が割り当てられていることを示し、2番目のパラメータ値(パス名CCSID)はパス名がどのようにやり取りされるのか(NFSサーバーおよびクライアントでは*ASCIIが標準)を特定しています。

NetWareからのデータの移行
iSeriesの観点から見れば、QNetWareファイル・システムはQNTCと似ています。QNetWareディレクトリにはiSeriesが接続されるNetWareサーバーの名前が含まれています。各NetWareサーバーには/QNetWareディレクトリ下にそれぞれ独自のサブディレクトリがあります。NetWareサーバーへの接続については
http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htmにあるiSeries情報センター(英文サイト)を参照してください。ご希望のリリースを選択してGOをクリックし、左側のパネルでネットワーキングを選択してiSeries上のNetWareを選択します。リモートのNetWareサーバーに接続するには、NetWare強化統合(5722-SS1 ? オプション25)が必要です。

リモートのNetWareサーバーへの接続を設定し、コピーしたいNetWareのボリュームへのアクセス権をiSeriesのユーザ・プロフィールに与えたら、準備完了です。

1. NetWareサーバー上のフォルダはIFSでは
/QNetWare/<servername>.SVR/<volumename>/<foldername>と表示されます。
フォルダをルート・ファイル・システムにコピーするには次のコマンドを使用します。
CPY OBJ('/QNetWare/<servername%gt.SVR/
   <volumename>/<foldername>')
TOOBJ('/newdirectory') SUBTREE(*ALL)

CPYコマンドを呼び出すときに新しいディレクトリが存在していてはいけないことに注意してください。QNetWareからコピーするときは、コピーされたオブジェクトに対して正しいCCSIDが設定されます。コピーされたiSeries上のテキスト・ファイルをそのCCSIDを変更せずに表示させることができます。
2. 新しいディレクトリ・ツリー中のオブジェクトのアクセス権限を変更します。ディレクトリ・ツリーがコピーされると、CPYコマンドを呼び出したユーザが所有者として設定されます。この例では、CHGAUTALLユーティリティを使用してツリー中の全オブジェクトのアクセス権限リストを変更します。このツールを
ftp://testcase.boulder.ibm.com/as400/fromibm/ApiSamples/ifstool.savf からiSeries上のセーブ・ファイルにダウンロードできます。CHGAUTALLユーティリティはV4R4以降のシステムで使用できます。

アクセス権限リストを設定したら、ユーザをリストに追加することによってこのツリー全体へのアクセス権をユーザに与えることができます。(アクセス権を制御する別の方法については本記事のパート1の「NTからのデータの移行」のステップ5とステップ6を参照してください。)新しいアクセス権限リストを作成するには次のコマンドを使用します。
CRTAUTL AUTL(<autlistname>)
3. CHGAUTALLユーティリティを使用して、次のコマンドによりオブジェクトを復元します。
RSTOBJ OBJ(*ALL) SAVLIB(DDILLING) DEV(*SAVF)
       SAVF(<yourlib>/IFSTOOL)
       RSTLIB(<targetlibrary>)
4. CHGAUTALLプログラムは、ディレクトリ・ツリー中の各オブジェクトに対して指定したパラメータを使って、CHGAUT (Change Authority) コマンドを呼び出します。次のコマンドによりディレクトリ中のすべてのオブジェクトに対してアクセス権限リストを設定します。図-1にCHGAUTALLプログラムの出力例を示します。
CALL PGM(CHGAUTALL) PARM('/newdirectory'
   'AUTL(<autlistname>)')

CHGAUTALLコマンドは'/newdirectory'中のすべてのファイルとサブディレクトリに対してAUTLを設定しますが、CHGAUTALLコマンドに渡した最上位のレベルのディレクトリ自体は変更しないということに注意してください。アクセス権限のないユーザは、'/newdirectory'の最初のレベルの一覧を見ることはできても、そのファイルやサブディレクトリを表示または変更することはできないので、これはあまり問題にはならないでしょう。ディレクトリの最初のレベルの一覧を見せないようにしたい場合はCHGAUTをもう一度呼び出し、これにCHGAUTOBJ ('/newdirectory') AUTL(<autlistname>)という最上位のレベルのディレクトリ名を渡します。
5. ディレクトリ・ツリー内のオブジェクトへの*PUBLICアクセス権限を変更してアクセス権限リストを使用するようにします。CHGAUTALLを次のようにもう一度呼び出すことで、これが可能となります。
   CALL PGM(CHGAUTALL)
   PARM('/newdirectory' 'USER(*PUBLIC)
   DTAAUT(*AUTL) OBJAUT(*NONE)')

ステップ4と同様に、CHGAUTALLに渡した最上位のレベルのディレクトリは変更しません(ただし'/newdirectory'中のファイルやサブディレクトリは変更されます)。最上位のレベルのディレクトリを変更するには、次のコマンドを使用します。
CHGAUT OBJ('/newdirectory') USER(*PUBLIC)
DTAAUT(*AUTL) OBJAUT(*NONE)
6. 次のコマンドは、アクセス権限リストで制御されるオブジェクトへの*PUBLICアクセスを排除します。このようにして、アクセス権限リストに明確に追加したユーザだけが、ディレクトリ・ツリー中のオブジェクトにアクセスできるようになります。
  CHGAUTLE AUTL(<autlistname>)
  USER(*PUBLIC) AUT(*EXCLUDE)
7. これで、ディレクトリ・ツリー全体へのアクセスを、アクセス権限リストを使用して制御することができます。最後に、ユーザへアクセス権を与えなければなりません。個々のユーザへアクセス権を与えるには、次のコマンドを使用します。
  ADDAUTLE AUTL(%ltautlistname>)
  USER(<username>) AUT(*ALL)

NetWareのボリュームのディレクトリをiSeries上で有することにより、ツリー全体へのアクセスをユーザに簡単に与えることができます。

IFSの利点
データをIFSのルート・ファイル・システムに格納すると、スケーラビリティ、性能、大きなファイルのサポート、ジャーナル機能といった利点が得られます。また、IFSにデータを移行すると、一つのシステム上にバックアップをまとめることが容易になります。IFSで使用できるツールが増えていくにつれ、IFSでのデータの管理はよりいっそう容易になります。これでさまざまなプラットフォームからiSeriesへデータを移行する方法を習得できましたので、iSeries上のIFSの利点を大いに活用できます。

ジェイク・クーゲルはIBMロチェスター事業所のソフトウェア・エンジニアで、IFS事業部に勤務して4年になります。

UID番号とGID番号を理解する
ネットワーク・ファイル・システム(NFS)ではUID番号とGID番号を使用してアクセス権限を管理しています。リモートのNFSシステム上のファイルへアクセスするときは、ユーザ・プロフィールのUID番号とグループ・プロフィールのGID番号がローカル・システムとリモート・システムで同じになっていることが重要です。これらの番号が一致していれば、コピーされたディレクトリ・ツリーへのアクセス権限がUnixシステム上のアクセス権限と一致していることが保証されます。

典型的なUnixシステムでは、ls -lg コマンドによりディレクトリ中のオブジェクトの一覧と各オブジェクトの所有者名とグループ名が表示されます。各所有者には固有のUID番号が、各グループには固有のGID番号が割り当てられています。あるユーザのUID番号を確認するには、標準ファイル/etc/passwdの中でユーザ名とUIDの一覧を見ます。グループのGID番号を確認するには、/etc/groupファイルの中を見ます。

iSeriesでは、ユーザ・プロフィールにUID番号が関連付けられています。またユーザ・プロフィールは1つまたは複数のグループ・プロフィールに属することもでき、グループ・プロフィールにはGID番号が関連付けられています。iSeries上のユーザ・プロフィールとグループ・プロフィールはどちらも*USRPRFオブジェクトなので、混乱を招くことも考えられます。プロフィールがグループ・プロフィールであればGID番号を持っており、グループ・プロフィールでなければGID番号は*NONEと表示されます。DSPUSR PRF (Display User Profile)コマンドを使用して、UID番号とGID番号を確認することができます。




↑このページのトップへ
TOPPAGE

BELLDATA, Inc. Copyright reserved.