Linux Gazette 4月号
今月のLinux Gazette の内容
n今月のニュース
nADSLを用いる自家用ホームドメイン
nLinux Today の Marty Pittsとのインタビュー
nインターネット・プリンティング
n PVM とMPI を用いるLinux上の平行処理
nオープンソース・インフラストラクチャ上のWebポータルバンク
n外からマイコンピュータを見出す
nPerl の学習、パート3
n不思議な^[[文字
nsmalltalk 00Thinking
n秘密ホームネットワーク
nネット・ブラウジングのスピードアップ
 
 
今月のニュース
▼▼▼ディストリビューション関連ニュース▼▼▼
Caldera

Caldera Systems は、新規オープンLinuxサーバー製品コード名"Project 42," のベータが入手出来ること及びEnhydra Open Source Java/XMLアプリケーションサーバーに新バージョンを発送する協定を発表した。製品は新Linux 2.4 kernel に基づいており、OEMとVARを対象としている。Project 42 は確実なWebサーバー、ファイル・プリントサーバー及び DHCP, DNSとファイヤウォールを含むネットワーク・インフラストラクチャ・サーバーを組み込んでいる。


Caldera と SCO は、Liniuxアプリケーションのためのサポートを組み込んだオープン UNIX 8 を明らかにした。オープンUNIX 8 は UnixWare 7 OSの一族で互換性があるが、加えて完全なLinux環境を提供する。無修正Linux Intel アーキテクチャ・バイナリ用のサポートも組み込む。

 
Debian

Debian は、新Debianプロダクトリーダー(DPL)に Ben Collins を選出した。

 
Progeny Debian

Progeny Linux システムスはProgeny Debian RC1がダウンロードで入手出来ると発表した。Progeny Debian はDebian の現行試験版であるwoodyに基づいておりDebianのチームが作成した。最高経営役員 Ian Murdock によれば RC1 への変更を期待すると。

RC1の特徴は、グラフィック関係に充実、GNOMEインターフェイス、ハードウエア検出、USBサポート、GRUBへの移植、自動多重インストレーションである。

RC1に含まれるソフトウエアは:

・Kernel 2.2.18 (2.4 オプション)
・XFree 86 4.0.2.
・glibc 2.2.
・Netscape 4.76 と Mozilla 0.7.
・GNU parted
・Open SSH.
・GRUB 0.5.96.1

Progeny Debianにつき詳しくは http://www.progeny.com/.

 

Suse

SuSE Linux はドイツのLinuxにつき極めて明るいニュースを発表した。SuSE 発表文によると、面談した56%のPCユーザーがLinuxを聞いたことがあり10%は既に家庭又は仕事で代替OSとして使用している。この統計は、Linuxは普及の点でウインドウズに次ぐことになる。さらにコンピュータユーザーの23%が機器のアップグレードに際しLinuxへの切り換えを考えている。これはドイツ、 Bielefeld の市場調査会社TNS EMNIDが最近行った調査の結果である。


SuSE Linux は現在、ドイツ、ハノーバーの CeBIT におけるSuSE Linux 企業サーバーに専門ユーザー向けサーバー版を提供している。SuSE Linux 企業サーバーはサーバー向けにつながるOSで、セキュリティと安定性の点で最適化された。


SuSE's PowerPC Edition 7.1 が4月上旬に発表される。PowerMacs用にkernel 2.4.2 とALSA (Advanced Linux Sound Architecture) を含む。インストール後、個々のパケージをアップデートするためYOU (YaST Online Update) がSuSEの管理構成ツール YaST2 を補足する。

これには、拡張グラフィカル・コンフィギュレーション・ツール KDE2、XFree86 4.0.2、SaX2 も含まれており、グラフィックカードの簡単確実な設定を保証する。LinuxでMacOSをスタートするのに用いられる仮想マシンMOL (Mac on Linux)が普及を補足する。

PowerPC にサポートされるIBMコンピュータの範囲が著しく広がった。SuSE Linux 7.1 PowerPC版は今や IBM Power3 マシン上で働く。Kernel 2.4 が備える3 GBまでのRAM 及び拡張マルチプロセッサの可能性により、SuSE Linux 7.1 PowerPC版はIBM pシリーズ640の魅力的である。パケージはCD6枚、500頁マニュアル、60日インストレーションサポートを含めてEURO 49.00である。

 
▼▼▼その他のニュース▼▼▼
Lion ウォーム (DNS/BIND セキュリティ警報!)

Lino と言う新種のウォームが一定の版のBIND(ドメイン名サーバープログラム)を攻撃する。 The Sans Institute情報 を沢山持っており、バージョン 8.2, 8.2-P1, 8.2.1, 8.2.2-Px が弱いと言う。不完全情報だが、 BIND 8.2.3-REL は大丈夫らしい。BINDが弱いのはTSIG が弱いためと2001年1月29日に報告されている。心配であれば、SANS研究所が検出プログラム Lionfind を持っている。BIND最新版をベンダーから入手するか、BIND代替品に乗り換えるチャンスだ。

一般的セキュリティ問題を見るのも価値がある。セキュリティの在り方については、 Honeynet 法廷闘争の結果 the results を見ること。危ないLinuxシステムをダウンロードした人は「誰が、何を、何時、何処で、どのように」を見出すこと。専門家の取り組みと難しさが分かる。大切なのは「用心!」

 
LinuxFocus

LinuxFocus にLG読者は余りお馴染みがないだろう。本質的に英語で外国語翻訳付きのLGと異なり、LFは非英語国民に「十分なLinux情報を母国語で提供してLinux社会に参加して貰う」目標で作られた。現在7カ国語で完全に4カ国語で一部をサポートしている。翻訳は双方向で、現在六つのフランス語記事が英訳を待っている。LGはLFを支持しその成功を祈る。

 
NetworX とAMD がクラスタをボーイングに供給

ボーイングは96 AMD Athlon プロセッサを使ったLinux NetworX クラスタを使っている。高性能クラスタとして設計されたシステムは、カリフォルニア州ハンチントンビーチのボーイング宇宙通信が使って、Delta IV プログラムの支援に流体力学アプリケーションを走らせている。ボーイングDelta IV エンジニアはクラスタ購入前に、 Linux NetworX 施設にある多数のプラットホームを試験し、価格と性能の点でAMD Athlon を選んだ。


Linux NetworX は又 Alpha プラットホーム用 LinuxBIOS を発表した。 LinuxBIOS オープンソース計画と平行して、Linux NetworX は Alpha プラットホーム上のSRMをLinux ベースのBIOSで置き換えた。これでユーザーはLinuxをマザーボード上のROMから直接ブートすることが出来る。

 

Python ソフトウエア基金及び Python Cookbook

ActiveState は協力的プログラム教科書、O'Reilly他と共にPython Cookbookの立ち上げを発表した。Cookbook は Python レシピの集大成になる筈である。無料でダウンロードして利用出来る。詳細は website へ。活動には、新Python ソフトウエア基金(PSF)の共同出資も含まれる。PSFは、Python 社会の教育、法律相談及び資金も提供する。詳しくは完全な発表press releaseを参照。

 
Penguin Computing がLinuxサーバー用に Arkeia Backup を選択

Knox Software Corp. は、 Penguin Computing 社と再販契約を結んだと発表した。契約の下で、 Penguin Computing は、Pengiunの構成済みカスタムLinuxサーバーと組むため、Knoxのフラッグシップ・ネットワーク・バックアップArkeia を提供する。

 
IBM、生化学とLinux
IBM は最近 Linux フロントに熱心である。新しいbiotechnology市場におけるIBMの努力は、Structural Bioinformatics が将来のアプリケーション用戦略的開発プラットホームとしてLinux用DB2を選んだとの発表で頂点に達した。DB2は、新薬開発に使われるタンパク質構造高解像度三次元表示の2テラバイト以上を扱うのに用いられれる。
IBMのLinux関する詳しい情報は、彼らの website. を参照。
 
OEone チームEarthLinkとともに立ち上げ

OEoneEarthLink は、OEoneのインターネッ・トコンピュータOS環境プラットホームを用いてEarthLinkのLinuxベース・インターネット・アクセスを統合するため、共同作業をする working together

 
チームLinux とMuze が関係を拡張

TeamLinuxMuze Inc. との関係を現在及び将来のkiosk顧客に対するハードウエア・サポート及びサービスに拡張した。この新しい多年度契約によりチームLinuxはハードウエアとサービスに関する主プロバイダの地位を与える。Muzeは所有ソフトウエアの提供とMuzeシステム問題に対する一次コンタクトを継続する。

 
Sair Linux & GNU 認定
Sair Linux は新規website を発表した。このWebサイトはSair Linux & GNU 認定に関する情報を有する。会社は訓練、認定及び教育援助(教科書など)を提供るする。SairにLUGがサインアップすると、T-シャツ、冊子、Sair Linuxや Distro CDに関する情報などを含む「ウエルカムキット」が貰える。
 
Agenda Computing がLinux PDAを販売

カリフォルニアのAgenda Computing が純粋Linux PDA (パーソナル・デジタル・アシスタント)を発売してPalmの市場争奪戦に参加する。Agenda VR3と VR3r 各々に、独特のソフトウエアと16MBフラッシュメモリのようなハードウエアを搭載し、これによりRAMベース装置に伴うデータ喪失などの問題を回避する。7カ国語をサポートし、e−メールが出来て、メモ又はメッセージを赤外線無線でプリンタに送信する。

 
Keyspan がLinux 用4-ポートUSB シリアルアダプタを出荷
Keyspan 4-ポートUSBシリアルアダプタは4個のシリアル装置を一つのUSBポートに接続する目的である。そのオス DB9 ポートに RS232 シリアル装置を960 Kbpssのデータ速度で接続することが出来る。Linux 2.4に加えて、Keyspan 4-ポートUSBシリアルアダプタは各種ウインドウズ風作業もこなす(詳しくは会社に問い合わせのこと)
 
Linux Links

Galleo はモバイル・マチチメディア・コミュニケータである。e−メール、Web及び音楽能力のあるnifty風PDAを有する。残念ながら、彼らのWebサイトはniftyではない。示すべきメニューボタンがないので、製品案内を入手するにはGalleoイメージかここ follow this link をクリックし、そこからのテキストリンクを利用して「バーチャルツアー」をクリックされたい(javaスクリプトが必要で、動画には「ショックウエーブ」が何かを知っている必要)。

Duke of URL は下記の提案を有する。

Review of Trustix Secure Linux 1.2
Linux Buyer's Guide #9
Tribes 2 Linux Preview
TurboLinux Workstation Pro 6.1 Review
A Beginner's Guide to Linux Apps

ZDNの Anchordesk UKの仲間からのリンクする人もいる。

Linux is too much: 数千のアプリケーションを付けてパックされたLinuxディストリビューションがデスクトップの平均的ユーザーを驚かせ混乱させる様子の概観
・新kernelの二つの見解: Linux 2.4: It's here! Now what?Much ado about kernels
How to succeed at selling free software
Why Linux is like pizza
Nautilus: here today. Eazel: gone tomorrow?

debianhelp.org が um, Debianへのヘルプを提供。

Linux Valley, イタリア語版案内書。

マイクロソフトは Linux が知的財産権への脅威 threat だと言う。 Linux Journal反論.

Paranoid Backup は「安価なテープドライブとテープで、靴磨きやデータ損失なしで、古いパックアップを上書きすることなく、出来るだけ少ないテープで作業する」設計となっている。

国防省研究機関は、戦場の各部隊間のモバイル通信を提供するsoldier's radio のデモを計画中。ネットワークはLinux OSを基本とする。

Linux エキスポ・バーミンガム2001 web サイトが現在online.。別のLinuxエキスポ行事については、その website.に問い合わせを。

OLinux がLehrbaum とインタビューinterview 。OLinux はまたOLinux を世界中に翻訳しせんでんする投資家又は会社を探している。

Doug Eubanks が共同で新Linux/RoadRunner help siteを作った。目的は各種分野の統合。

企業ユーザー用新刊 Microsoft's complicated licensing terms (マイクロソフトの複雑な提携条件)。Slashdotリンク向け題名は「マイクロソフトはスクリューを顧客に向け始めた」

 
▼▼▼ソフトウエア関連ニュース▼▼▼
Tomの Root/Boot 更新

Tom Oehser がtomsrtbt への小さいが重要な更新を発表した。現行版は1.7.218である。入手は http://www.toms.net/rb/。非常用フロッピイからブートしなければならなくなったとき誰でもが必要とするものである。

 
AbsoluteX がダウンロードで入手出来る
AbsoluteXが http://www.absolutex.org/でダウンロード出来る。アトランタのLinux年次省ケースで発表されLGPLの下のデベロッパが世界中で入手出来る。AbsoluteXは Epitera がLinuxOS用GUI開発手順を容易にするため開発した X-Windowデベロッパ用ツールキットでC++言語に基づく。AbsoluteXは、クラスを論理とビジュアルの面でクラスを別にした各種伝統的方法論、効果的メッセージ、プログラム手法を有する標準テンプレートライブラリ(STL)である
 
Loki ゲーム

Loki Software はゲーム出版者Gathering of Developers とPCゲームRuneHeavy Metal: F.A.K.K.2 を本年早期にLinuxに持ち込む契約を発表した。テスターが必要、希望者はここで登録を register here

さらに、 Loki Software, Incはエンドユーザー及びデベロッパ用に、一連のオープンソース計画、ソフトウエア・リリース管理用のツール一式をリリースする。

Setup 1.5.8 はLokiの新XML製品データベースを含む。このデータベースにより製品が完全か不完全かを判定することが出来る。
Loki Update Tool 1.0.6 により、任意のLokiソフトウエアの簡単迅速な更新が出来る。
Loki Uninstall Tool 1.0.3 により、Lokiソフトウエアの削除が出来る。
Loki Patch Tools 1.0.1 により、任意のプロジェクト用に、完全でプリ/ポストインストールスクリプト付いたパッチを構築することが出来る。
 
"Emerald Isle" Ispell
アイルランド語の文法とスペルチェック用パケージの新バージョン。
 
GARLIC バージョン1.1 リリース
http://pref.etfos.hr/garlicでLinux及びUNIX用無料GPL視覚プログラムgarlicバージョン1.1が入手出来る。 ANSI とPOSIXに不満なにとを目標としており、Unix的プラットホームに移植出来る。1.0にはない各種特徴がある。スクリーンショットgallery が入手出来る。
 
FIEN グループがTeamware Officeを米国Linuxに販売
Fujitsu の子会社Teamware Group と、南カリフォルニア本社の技術コンサルタント会社The FIEN Groupが提携契約に署名し、FIENグループは Teamware Office 5.3 を米国内のLinuxグループウエアのため販売する。Teamware Office 5.3 は電子メール、時間割、会議日程、文書保管と検索などを便利にする。1989年発売で2000年春Linuxに移植した。
 
Opera がアドウエアとしてリリースされる

Opera Software はそのLinuxブラウザの最終リリースが無料で入手出来ると発表した。無料版は全機能を備えているが、バナー広告が入っている。広告不要ならば無料版に39ドルで登録するか又は無広告版を同値で入手。Linuxベータ7用Opera5は now out.

 

Open Motif が最新Linux 2.4 Kernelディストリビューションをサポート

Integrated Computer Solutions はOpen Motif Everywhereの更新版をリリースした。新版はOpen Group Patch 3とPatch 4をOpen Motifに正式に組み込む。これらのpatchにはMotifライブラリ、クライアント及びでもソースコードのバグフィックスとアップデートが含まれる。RPM(バージョン4)もまた Red Hat Linux 7, SuSE Linux 7.1 及びglibc 2.2を使うディストリビューション用に備えている。最新ICS Open Motifのバイナリ及びソースパケージは the MotifZoneで無料ダウンロード出来る。the ICS Storeでは29.95ドルでICSの Open Motif Everywhere ディストリビューションCDが購入出来る。

 

Kaspersky Lab が Linux 用 Kaspersky アンチウィルス新版を導入

Kaspersky Lab は Linux 用 Kaspersky アンチウィルス新版のリリースを発表した。この新版には幾つかの特色がある。Kaspersky Lab Webサイトで download 出来る。旧版のユーザーは無料で更新出来る。

 

その他のソフトウエア

Rob Pitman は、JavaアプリケーションとASCIIターミナルとの間のGUIを提供するLGPI特許ソフトウエアをリリースした。このパケージはJava AWT とSwin ツールキットをエミュレートする。詳しくは http://www.pitman.co.za/projects/charva/index.html.


Mahogany バージョン0.62が出た。Mahogany はOpenSource(TM)プラットホーム間メール及びニュース・クライアントである。広範囲のプロトコル(POP3, IMAP4, MIME,など)をサポートする。SSL経由で通信を安全にし、埋め込みPythonインタープリータとモジュールを用いて拡張することが出来る。

TUXIA はインターネット及び情報アプリケーション用の埋め込みLinuxソフトウエアに専門化する。TASTE(TUXIA Appliance Synthesis Technology Enabled)は、埋め込みMozillaブラウザその他の機能を持つLinux Kernel 2.4 に基づくソリューションである。任意のハードウエアプラットホームに組み込める。

 

Copyright © 2001, Michael Conry and the Editors of Linux Gazette.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 

ADSL を用いる自家用ホームドメイン

By Ray Chan

 

注記:本記事中のドメイン名とIP番号は変更された。筆者はmyfakedomain.comとも電話とも無関係だ。ここに質問やご意見は送らないで頂きたい。

 

謝辞

本記事は筆者が家でドメイン名を維持した経験で、ホームドメイン設定の手引きではない。解説書は他に沢山ある。これは、参考用の実例とされたい。

Background

2000年末、誰もがブロードバンドを使用しているとき、筆者はネットサーフに28.8kbpモデモを使っていた。固定I.P.を提供するブロードバンド・プロバイダがいなかったからだ。幾つかのISPでホストしたドメイン名を持っていたが、ホスト会社はhtml, perl cgi, pop サーバーに限定されており、SMTP, MySQL, PHP4はサポートしなかった。これが固定I.P.を提供するブロードバンド・プロバイダを探した理由だ。

2001年になって、固定IPを提供するブロードバンド・プロバイダが現れた。高価だがいとわなかった。

ネットワーク計画

ブロードバンドに加入した。スプリッタとADSLモデモの設置に二週間掛かった。高速接続実現の好機だった。実際にネットワークを構築する前に、先ずトポロジイを考える。予備の古いハードウエアを使って二つのLinux boxを作った。一つはApache web サーバー、ftp サーバー、e−メールサーバー、とMySQL データベースサーバーを走らせるbaston ホストで、インターネットのイントラネットとの間の通信経路を決めるをエクステリアルーターとして働く。他は内部アプリケーションとデータをホストするイントラネットサーバーだ。これはイントラネットルーターとして働く。二つにしたのはセキュリティの理由だ。図1にネットワーク図を示す。

入手した固定IPは1個だったので、高通信量は止めた。簡単なネットワークなので bastonホスト1個だけで働いた。これは私だけの事情なのでそれぞれで考えられたい。

ネットワークの構築

両Linux用にRedHat 7.0 をダウンロードした。他の配布品でもよいが、インターネットサーバー設置に必須の成分がある。この記事は手引き書でないので HOW-TOを読まれることを強く推奨する。

ISP-Setup-ReadHat
DSL HOWTO for Linux

及び下記のミニ−HOWTO:

Setting Up Your New Domain Mini-HOWTO
Home-Network-mini-HOWTO
IP-Subnetworking

Linuxの性能が判っていない人は 'The Linux Networking Overview HOWTO'を読むこと。

ipチェインを用いるパケットフィルタfirewallによりbaston hostの安全確保

RedHatは搭載したが、Linuxマシンを保護して内部ネットワークから外部ネットワークに接続するにはfirewallとrouting tableの設定が必要だ。大変な作業だ。freshmeat.net、 google、sourceforgeで研究した。幾つかの無料firewallスクリプトを改造したがうまくゆかない。成功したのはfirewall scripts @ ICEBERGだ。これは改造と設定が楽だ。 ICEBERGに感謝。下記はfirewallとパケット送付に関する有用文書だ。

Firewall-HOWTO
IP-Masquerade-HOWTO
IPCHAINS-HOWTO

firewallの後ろに Napster を使うのであれば IPMasquerading+Napster mini-HOWTOを読むこと。

baston hostに外部 DNS サーバーを設定

ドメイン名用DNS登録のホストに HAMMER NODE を使うけれども、Linux boxを働かせるにはキャッチオンリーで働くネームサーバーが必要だ。conf.ファイルを下記。

/etc/named.boot
/etc/named.conf
/var/named/named.ca
/var/named/named.local
/var/named/named.myfakedomain.com
/var/named/named.myhome.net
/var/named/named.rev.3
/var/named/named.rev.2

ADSL モデモへの接続

ADSL モデモの接続は簡単だ。Roaring Penguin Software IncからRP-PPPOE のRPMをダウンロードして、adsl-setupを走らせるだけだ。ウインドウズマシンと同じだ。

ドメイン名のbaston host への移植

Webサーバーは未だ働かない。 /etc/httpd/conf/httpd.conf fileに下の行を加えて解決した。

ServerName www.myfakedomain.com (for baston host)
ServerName www.myhome.net (for Intranet Server)

再ブートの後両LinuxのWebサーバーが立ち上がって働いた。次は?Netscape を使ってサーチエンジン Google で無料DNSサーバーを検索した。結局HAMMER NODEに達した。 hn.org.に達したのは幸運だった。これはダイナミックI.P.とスタチックI.P.ユーザー双方に無料サービスを提供する。UIの使用が簡単で信頼姓のある安定なサービスを提供する。仮想ドメインアカウントをつくり、以下のような configuration を持った。

Rec FQDN Rec Type Rec Value DynDNS MX Pref Commands
myfakedomain.com NS ns1.hn.org 0 0
myfakedomain.com NS aux1.hn.org 0 0
www.myfakedomain.com CNAME
 
myfakedomain.com 0
 
0
 

 
myfakedomain.com A 202.xxx.xxx.xxx 0 0
mail.myfakedomain.com MX
 
202.xxx.xxx.xxx
 
0
 
0
 

 
ns.myfakedomain.com NS
 
myfakedomain.com 0
 
0
 

 
mail.myfakedomain.com CNAME
 
myfakedomain.com 0
 
0
 

 
ns.myfakedomain.com CNAME
 
myfakedomain.com 0
 
0
 

 
 

a.orgからDNSアカウント設定の後、ドメイン登録会社からhn.orgにより提供されるDNSサーバーへの一次及び二次サーバー双方の、DNS登録を変更する。DNS更新まで一寸時間が掛かる。

DNSが更新され、www.myfakedomain.com へのすべてのリクエストが私のbaston host に送られる。DNS登録設定法に付いてはDNS-HOWTOを参照。

ADSモデモに接続されたマシンが公衆にサービスを提供するので、インターネットアクセスを持つ人はどこからでもアクセス出来る。セキュリティの理由からアクセスを制限になければならない。ファイル/etc/hosts.allow と /etc/hosts.deny を受領排除にしたがって次のようにエディットした。

/etc/hosts.allow

ALL: 127.0.0.1
in.telnetd: 192.168.2.2
in.ftpd: 192.168.2.2
sshd: 192.168.2.2 203.xxx.xxx.xxx

/etc/hosts.deny

ALL: ALL : spawn (echo Attempt from %h %a to %d at `date` | tee -a /xxx/xxx/tcp.deny.log | mail my@email.com )

上のconf.ファイルに示したように、内部ネットワークからのすべてのマシンはbaston hosutに telnet, ftp, ssh , sftp が出来る。アドレス203.xxx.xxx.xxx は私の事務所のI.P. アドレスで、baston hostに対しsshを用いる遠隔ログインとsftpを使うファイル転送が許される。baston hostへのTelnet とftpは、ユーザー名とパスワードが平文で送られハッカーに容易に捕まるので、内部ネットワーク外のマシンからは許されない。HTTPDはINETDの制御下にないので上のconf.ファイルには含まれない。

SSHを用いて baston host に安全に接続

Telnet とFTPは、baston host に内部ネットワークからは接続が許される。外部ネットワークから接続するにはSSHとSFTPを使用しなければならない。SSHの設定と利用に付いては Linux Gazette の記事 'Using ssh' を参照。SSHをサポートするには、SSHDを搭載して働かせなければならない。SFTPはhttp://enigma.xbill.org/sftp/. からダウンロード出来る。SFTPは使用も搭載も容易だ。

イントラネットサーバーの設定

内部ネットワーク保護のため、外部ネットワークから内部ネットワークへのアクセス全部を不能にする:

/etc/hosts.allow

ALL: LOCAL 192.168.1.2 192.168.1.7

/etc/hosts.deny

ALL: ALL : spawn (echo Attempt from %h %a to %d at `date` | tee -a /xxx/xxx/tcp.deny.log | mail my@email.com )

禁止サービスから私のlinuxサーバーに接続の試みがあったときe−メールはすべてメールボックスに送られる。

図1に示すように、内部マシンはホスト名を有する。ドメイン名が既にNICに登録されているときでも、任意のホスト名とドメイン名を内部ネットワーク用に設定することが出来るが、内部DNSサーバーを設定するときは特別の注意が必要である。

名前付き−イントラネットDNSサーバーの設定

DNSサーバー設定方法については、HOWTOを参照のこと。以下はイントラネットサーバーで働いている私のconf.ファイルを示す。

/etc/named.boot
/etc/named.conf
/var/named/named.ca
/var/named/named.local
/var/named/named.myhome.net
/var/named/named.rev.1
/var/named/named.rev.2

追加セキュリティ問題

ハッカーはいつも周りをうろついており、パケットフィルタ付きファイアウォールと hosts.allow/hosts.deny からの制御サービスでは十分でない。セキュリティの孔は常に見出される。通信相手リストを作って、常に更新しなければならない。セキュリティに関する記事とソフトウエアを下記する。

Security for the Home Network LG #46
Linux Firewall and Security Site
Mason - the automated firewall builder for Linux
Astaro AG (Great firewall linux distribution with web interface)
The Ethereal Network Analyzer
Nessus - The Security Scanner
Stunnel - Universal SSL Wrapper

POP3 と SMTP サーバーについては?

POP3は、TELENET及びFTPと同じく、ユーザー名とパスワードを平文で送るので安全でないと思われる。SPOPが暗号化POPデータを設定するが、私は自分のe−メールが内部ネットワーク外のマシンに記憶されるのを好まないので、baston hostにはPOP3を設定しない。STMPを許さない理由は、スパマーがスパムメールを送るのに中継STMPサーバーを利用するので、メールに依存するのは危険だからだ。一方中継しないSMTPを設定はしてもネットワーク外のSTMPサーバーにメールを送れないので無意味だ。私はsshを使って私のbaston hostにログインしpineを走らせてメール点検と回答を行う。

Web サーバー用サブドメイン

これで、webサーバー、e−メールサーバー、ftpサーバーが全部ホームlinux boxで働く。ここでオンラインレジメをホストするためサブドメインresume.myfakedomain.com が必要だ。/etc/httpd/conf/httpd.conf に次の行を加える:

RewriteEngine on
## www.myfakedomain.comを無視
RewriteCond %{HTTP_HOST} !^www\.myfakedomain\.com [NC]
## subdomain 名のディレクトリが存在しないといけない
RewriteCond %{DOCUMENT_ROOT}/%1 -d
## 要求ホスト名をURIに追加
## [C] は次のRewrite Rules がこれを使うことを意味する
RewriteRule ^(.+) %{HTTP_HOST}/$1 [C]
## abc.myfakedomain.com/foo を myfakedomain.com/abc/fooに翻訳
RewriteRule ^([a-z-]+)\.myfakedomain\.com/?(.*)$ http://www.myfakedomain.com/$1/$2 [L]

その他の有用なコンフィギュレーション・ファイル

/etc/hosts (baston host)



127.0.0.1	localhost.localdomain 	localhost


192.168.2.1	router.myhome.net	router


192.168.2.2	gateway.myhome.net	gateway


202.xxx.xxx.xxx	www.myfakedomain.com	www


/etc/hosts (intranet gateway)



127.0.0.1	localhost.localdomain 	localhost


192.168.1.1	server.myhome.net	server


192.168.1.2	devel.myhome.net 	devel


192.168.1.3	php.myhome.net	php


192.168.1.4	asp.myhome.net	asp


192.168.1.7	be.myhome.net	be


192.168.2.1	router.myhome.net	router


192.168.2.2	gateway.myhome.net	gateway


/etc/resolv.conf (baston host)



search myfakedomain.com


nameserver	127.0.0.1


/etc/resolv.conf (intranet gateway)



search	myhome.net


nameserver	127.0.0.1


ネットワークカード設定

イーサネットポート設定:

追加ネットワーク・コンフィギュレーション・ファイル

/etc/sysconfig/network (baston host)
/etc/sysconfig/network-scripts/ifcfg-eth0 (baston host)
/etc/sysconfig/network-scripts/ifcfg-eth1 (baston host)

/etc/sysconfig/network (Intranet gateway)
/etc/sysconfig/network-scripts/ifcfg-eth0 (Intranet gateway)
/etc/sysconfig/network-scripts/ifcfg-eth1 (Intranet gateway)

/etc/rc.d/rc.local (Both of the Baston host and Intranet gateway)

TCP/IP 設定要約

Baston host
Default Gateway: ppp0
Nameserver: 127.0.0.1
Network interface: eth0
I.P. Address: 192.168.3.1
Subnet mask: 255.255.255.0
Network interface: eth1
I.P. Address: 192.168.2.1
Subnet mask: 255.255.255.0
Intranet Server
Default Gateway: 192.168.2.1
Nameserver: 127.0.0.1
Network interface: eth0
I.P. Address: 192.168.1.1
Subnet mask: 255.255.255.0
Network interface: eth1
I.P. Address: 192.168.2.2
Subnet mask: 255.255.255.0
Workstations from Internal Network
Default Gateway: 192.168.1.1
Nameserver: 192.168.1.1
Network interface: eth0
I.P. Address: 192.168.1.X
Subnet mask: 255.255.255.0

追加設定と読み込み

ウインドウズを走らせる自分の内部ネットワークマシンに他のネットワークからfirewallを通してアクセスしたいときは、仮想プライベートネットワーク(VPN) 技術を用いる。

Linuxは最新版でVPNをサポートする。詳細は VPN HOWTOで。1個以上のドメインがあって、同一baston hostでサポートしたいときは、apache web サーバーとメール送信サーバーに特殊設定が必要だ。この記事の次の版でVPNと仮想ドメイン設定を述べる。

ご連絡は rayxtra@hotmail.com. へ

 

Copyright © 2001, Ray Chan.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 

Linux Today の Marty Pittsとのインタビュー

By Fernando Ribeiro Correa and Marcos Martins Manhães
Originally published at OLinux

 
Marty Pitts は Linux Today の編集長。Linux Today の革新と成長に付いて語った。

 

OLinux: 自己紹介をして下さい (経歴、学歴、趣味、業績).

Marty Pitts:Linux Todayに来る前 原子力産業で13年間購買から広報の仕事をしました。冬はスキー夏はハイキングとキャンプが趣味です。間には科学小説を読みます。最新のlinuxで遊ぶのが好きです。

OLinux: Linux Today で何年働き、何をご担当ですか?

Marty Pitts: 仕事でLinuxを使ったとき、Linuxオンラインの情報検索から始め、Linux Todayにたどり着き、毎時更新されるのが好きでした。抜けたニュースを知らせたところ、数ヶ月経ってオーナーの Dave と Dwight からサイトで働かぬかと声が掛かり、飛びつきました。

1999年夏に、Dave から雇用条件の通知があり、丁度ボスが首切りに遭ったので、これがチャンスと転職しました。幸運でした。

同年9月からDaveとDwightの下で働きましたが、LinuxPR.comに属したLinux Today のWevサイトが internet.comに売却され、以後internet.com で働いています。

OLinux: サイトの組織は? Linux Today の仕事振りと従業員数を教えて下さい?

Marty Pitts: 14のWebサイトを含む全チャンネルで9名のエディタとプログラマがいます。今は、Linux Todayで私とMichael Hall の二人がフルタイムで働いています。 LinuxPR と他にLinuxオープンソース・チャンネルのサイト二・三の面倒を見ています。

Michael は東海岸に住んでいて私は西のワシントン州にいるので、一・二時間重複の上、一日を二つに分けて担当しています。。

OLinux: Linux Today 創立以来の変化をご説明頂けますか?

Marty Pitts: Linux Today のアイデアを出したのはDave とDwight で、それをうまく生かしinternet.com の興味を引きました。

Linuxオープンワールドで起こっていることを人々に知らせるため、DaveとDwight が好きで始めた仕事です。1998年9月に始め、翌年二人とも昼間の仕事を辞めてフルタイムをサイトで働きました。フルタイム・エディタを雇って、10,000ストーリイを送りました。今はLinux Today で34,000ストーリイを送っています。

サイトをinternet.comに売却した後、変更もあったが残ったものもあります。Dwightは残り、Daveの代わりにPaul Ferrisが雇われました。

Paulは偉大な男です。プログラムの面から仕事を始めましたが、コラムも書きます。今、サイトコードの第二反復を使っていますが、Paulは第三反復を書いており、近く出来上がると、大変融通性のあるものとなり、色々なサイトで使われるでしょう。

売却後、変わらないのはLinux Today の方向と重点です。元の通りにやっています。

今日では、昔より沢山の自作コンテントを持っており、重点は全Linuxオープンソースが全体でうまく働くことです。

OLinux: Linux Today のスポンサーはいますか?

Marty Pitts: Linux Today がinternet.com の所有になって以来、ここやその他のサイトを維持しているのは同社です。

OLinux: 冗長度や編集作業改善のための中央管理機構がありますか?

Marty Pitts: あります。Linux Today の後ろに編集委員会があって、ストーリイを追跡しているほか、e−メールを広く用い、迅速通信にIRCを使います。

それでも二重報道があります。「この報道は送りません」と偶に出るのはそのためです。

OLinux: 良いコンテントを毎日出すのは難しいでしょうね?読者の協力の他に何かリソースがありますか(Reutersなどのような)?

Marty Pitts: 週の初めは送るコンテント見付けるのは簡単です。週が進むにつれ、難しくなります。終末にはニュースがなくなって大変難しくなるので、エディタとの間に休憩を設けたり、定期的に示す項目を作ったりします。

読者は貴重なコンテント情報源です。これなくしてLinux Today の今日はありません。

internet.com 財産の中から利用することもあります。

OLinux: オープンソースワールドの中のLinux Today をどう思っておられますか?Linux社会に与えたLinux Today の最も大きい貢献は何ですか?

Marty Pitts: Linuxオープンソース社会で何が起こっているか知りたいとき、寄ってみる場所だと思っています。出来事とニュースを検索してお知らせし、読者が自分で探す労力を使わないで済むようにします。

フォーラムと記事を通じて社会内の論議を容易にし、ニュースに応える場を与えます。

Linux Today の最大の貢献は、Linuxオープンソース社会のニュース、出来事をお知らせしたことだと信じています。

OLinux: Linux Todayで開発中の新特徴は何ですか?現行プロジェクトの詳細をお話頂けますか?

Marty Pitts: 再設計サイトソフトウエアを立ち上げるところです。すべてのサイトに取り融通性があって頑丈になる筈です。

OLinux: 企業内でのLinuxの成長につきご意見は?デスクトップについては、将来の計画がありますか?

Marty Pitts: 経験から、Linuxは思われているより深く企業にとけ込んでいます。新規予算項目を要求しないで問題が解決出来るとき、現場では働くものを使います。Gartner やIDC のような会社のしていることを見ると、目先で起こっている革新を評価出来ないのに笑ってしまいます。隠れた展開が見えないのです。

デスクトップは直ぐそこにあります。簡便な使用とグラフィックツールはここ二・三年で発展しました。私は仕事にLinuxを使っています。DVDデコードと再生、最近のビデオ、音響、ネットワークハードウエアなど、利用出来るものを見て下さい。KDEやGNOMEは使っていませんが(純 'Enlightenment' デスクトップを使用)両方をシステム上に持っておりそのアプリケーションを使っています。

 

Copyright © 2001, Fernando Ribeiro Correa.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 
 

インターネットプリンティング - 別法

By Graham Jenkins

 

問題

好みのISPに接続されたホームPCで仕事をしており、会社の高速カラープリンタでWORD文書を印刷したいとする。プリンタは社内LANに接続に接続されているが、会社のファイアウォールの向こうにあるので、LPRやIPPを使っては通話出来ない。

「ファイルにプリント」の操作で作ったファイルを社内の同僚にe−メールしてプリンタに送ることは出来る。だが手順は面倒だし、e−メールの長さが制限されていることもあり、そのときはファイル分割の操作をしなければならない。

クライアントソフトウエア

こんなことを考えた人が Brother プリンタを作ってWindowsプリンタドライバを開発した。これらにより、指定のe−メールアドレスに直接プリント出来る。このプリント作業は必要なら自動的にパーツに分割し、パーツは送信前にbase-64暗号化される。

このWindowsプリンタドライバ(Windows 95/98, NT-4/2000 用)はBrotehr Web サイトからダウンロード出来る。

プリンタ性能

Brotherが期待しているのは、勿論、必要なネットワーク・カードを搭載したBrother プリンタである。

別のメーカーのプリンタを使いたい人はどうするか?

ソフトウエアで行う

筆者の最初の試みは、適切な入信がメール送信仲間を経由してパイプされるKorn-shellプログラムであった。これは 'awk' を用いて、ジョブやパーツ番号などの情報の引き出し、適切なファイル名へのこれらの解読をおこなう。

パーツ受信後、プログラムはそれを「完了」とマークし、反同期ロックを掛けて必要パーツ全部が届いたかの点検作業に入る。全部届いていれば順序通り並べて、結果を指定プリンタに送る。

「ジョブが殺到したとき、それらのパーツ全部を記憶する容量がないときどうなるか?」と「Brotherはネットワーク・カードでこれをどう解決しているか?」が次に起こった疑問だった。

ローカル記憶なしでこれをおこなう

筆者の第二の疑問への回答は「POP3 サーバーを使っている」だ。各ジョブの成分は必要分全部が揃ったとネットワーク・カードが判定するまでそのサーバー上に止め、揃った段階で吸い上げて順に解読の上プリンタに送り、サーバーに削除を要求する。

ここにLinuxマシンで行う方法がある。POP3サーバーへのアクセスの容易なNET::POP3モジュールが使えるようにプログラムはPerlで書いた。NetBSD とSolaris の両マシンで試験済みなので殆どのマシンで働く筈である。変更が必要なのは、Perlインタープリータの位置、'awk' に用いた名称、及び 'lpr' コマンド[Text version of this listing.]である。



#!/usr/bin/perl -w


# @(#) BIPprint.pl      POP3 サーバーから Brother-Internet-Print ファイルを取得し




#                     目標プリンタに送る。スモールメモリ・バージョン。




#                      inittab エントリ経由の呼出を意図




#                      Graham Jenkins, IBM GSA, Feb. 2001. Rev'd: 17 Mar. 2001.





use strict;


use File::Basename;


use Net::POP3;


use Date::Manip;


use IO::File;


my $host="bronzeback.in.telstra.com.au";        # ホストとパスワードは


my $pass="MySecret";                       # 各プリンタで同一


my $limit=30*1024*1024;                    # プリントジョブ当たり最大ビット


my ($printer,$awkprog);


defined($ARGV[0]) || die "Usage: ", basename($0). " printer1 [ printer2 ..]\n";


open(LOG,"|/usr/bin/logger -p local7.info -t ".basename($0)); autoflush LOG 1;


$awkprog="";                            


while (<DATA>) {$awkprog = $awkprog . $_};      # 後のためawkプログラムを構築


while (1) {                                     # 次いで、ループで、


  sleep 30;                                      #各パスの間で30秒スリープ


  foreach $printer (@ARGV) {process($printer);}   # しながら各パスの


}                                               # プリンタを処理





sub process {


  my ($flag,$i,$j,$k,$l,$m,$allparts,$user,$pop,@field,@part,$count,$top15,


      $msgdate,$parsdate,$notify,$reply,%slot,$fh);


  $user = $_[0];


  $pop = Net::POP3->new($host);               # POP3 サーバーにログイン


  $count = $pop->login($user,$pass) ;            # header と各メッセージの


  $count = -1 if ! defined ($count) ;            # 最初の15行を入手 


  for ($i = 1; $i <= $count; $i++ ) {           # サーバーがサポートしていれば


    $top15=$pop->top($i,15) ;                 # ログインの代わりにapopを用いる


    if ($top15) {                       


      $msgdate = ""; $notify="None"; $reply="";


      for ($j = 0; $j < 99; $j++ ) {


        if (@$top15[$j]) {                     # POP3サーバー上の到着日時


          if($msgdate eq "") {                 # を用いてメッセージの年齢を


            (@field) = split(/;/,@$top15[$j]);    # 確認。古ければ削除して


            if ( defined($field[1])) {          # 次をループ.


              $parsdate=&ParseDate($field[1]);   # (有効日の続く


              if( $parsdate ) {                 # セミコロンを検索)


                $msgdate="Y";


                if(&Date_Cmp($parsdate, &DateCalc("today","-3 days") ) lt 0 ) {


                  print LOG "Stale msg: $user $parsdate\n";


                  $pop->delete($i);


                  goto I;                       # POP3 サーバーが自動


                }                             #メッセージ期限到来を行うなら


              }                               # この部分全部を


            }                                  # 省略することが出来る


          }


          (@field) = split(/=/, @$top15[$j]);


          if ( defined($field[0]) ) {   


            if ($field[0] eq "BRO-NOTIFY") {chomp $field[1];$notify=$field[1];}


            if ($field[0] eq "BRO-REPLY")  {chomp $field[1];$reply =$field[1];}


            if ( $field[0] eq "BRO-PARTIAL" ) { # 上の行にメール通知を


              ( @part )=split("/", $field[1]);  # 止めるようコメント


              chomp $part[1];           


            }


            if ( $field[0] eq "BRO-UID" ) {     # メッセージに含まれたプリント


              chomp $field[1];                  #ジョブとパーツ番号を判定


              $slot{$field[1]."=".$part[0]} = $i ;


              $allparts = "Y";                   #各メッセージを見るとき、


              for ($k=1;$k<=$part[1];$k++) {    # パーツ全部があるかを点検


                $allparts = "N" if ! defined($slot{$field[1]."=".$k}) ; 


              }


              if ( $allparts eq "Y" ) {         # パーツをプリントして策.


                print LOG "$field[1] $part[1] => $user\n";


                if(($notify ne "None") && ($reply ne "")) {system 


                  "echo Print Job Received, $part[1] pcs|Mail -s$user $reply";}


                $fh=new IO::File "|awk '{$awkprog}' Limit=$limit |lpr -P $user";


                for ($k = 1;$k<=$part[1];$k++) {


                  $pop->get($slot{$field[1]."=".$k},$fh) ;


                  $pop->delete($slot{$field[1]."=".$k}) ;


                }                               # ファイルスペースが十分なら


                $fh->close;                     # awk 出力をgzip 経由で


              }                              # 臨時ファイルに送ってプリントし


            }                                # 全パーツを削除;これは


          }                                   # 接続不具合を賄う


        }                       


      }                                         # 以下の awk プログラムは


    }                                           # 多数パーツを含むファイル


I:}                                             # からファイルを抽出し


  $pop->quit() if ($count >= 0);                  # その各々をデコーダ経由で


}                                               # stdoutに送る


__DATA__


if( Flag == 2 ) {


    Size=Size+length


    if(length == 0) { Flag=0; close("mmencode -u 2>/dev/null") }


    else if(Size<=Limit*4/3) print $0 |"mmencode -u 2>/dev/null" }


  if( Flag == 1 ) if(length == 0) Flag=2


  if( Flag == 0 ) if($1 ~ /^Content-Transfer-Enc/) if($NF == "base64") Flag=1


プログラム通覧

プログラムは後の使用のため小さい 'awk' プログラムを構築し、次いでそのコマンド行上の各プリンタについて、同一名のメールボックスへのアクセスと中のメッセージの点検を宣言する。メッセージが古ければ廃棄する。そうでなければBrother特有の行を抽出する。これはe−メール通知が必要か、およびどのジョブのどのパーツがメッセージに含まれているかを示す。

メッセージ点検中に、相当ジョブの全パーツがメールボックス中にあると判定すると、必要ならe−メール通知を出して、パーツを順に抽出し(各パーツを解読する) 'awk' プログラム経由で適切なプリンタコマンドに送る。各パーツはこうして処理され次第削除される。

理想的には、e−メイルと削除の前にプリント送り出し通知を待つべきであろうが、リストで述べたように、これはローカル記憶を必要とする。Brotherクライアントソフトウエアはe−メイル通知を幾つかの異なる条件で送るが、我々は「None」を選ばない限りジョブ送り出しの通知を送る。

結びの備考

このプログラムはパスワードを含むので、これを実行するユーザーが読むことが出来る。実行に特権は要らないから、 /etc/inittab への入力は次のようになる筈だ。



bi:345:respawn:su - nobody -c "/usr/local/bin/BIPprint.pl lp1 lp2 >/dev/null 2>&1"


これを読む限り、「ローカル記憶を大して必要としないのはOKだが、出力をプリント・スプーラに送るのは、良くない」と言うだろう。スプール領域の容量が心配なら、 'netcat' 又は 'hpnpout' を使ってジョブをプリンタに直接送れば良い。この方法でスプーラを迂回するのであれば、プリンタ毎に別々のプログラム・インスタンスを作らなければならない。

ロケット科学ではないので、ユーザー認証も内容暗号化もないが、少しは楽しんで頂けるだろう。

 

Copyright © 2001, Graham Jenkins.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 
 

PVMとMPIを用いる Linux 上の平行処理

By Rahul U. Joshi

 
この記事は、広く使われる平行メッセージ受け渡しプログラム PVM と MPI の紹介を目的とする。ネットワークで接続された異種UNIX/LINUX コンピュータを単一マシンとして大きい問題の処理に使えるようになる。

1. 平行処理の紹介

平行処理とは、多数の活動を同時に行って処理時間を減少することである。以前は限られたことにしか使われなかったが、ハードウエア価格が急速に下がったので、日常業務に広く使われるようになった。

しかし、プログラムを平行して走らせるには、ハードウエアの他に、平行プログラムの相互依存性のため、その実行を整合させるソフトウエアが必要である。これは実例で明らかになる。このような整合の好例はメッセージ受け渡しで、このときプログラムはその実行を整合させ一般的にメッセージを受け渡して互いに連絡する。

2. 極めて簡単な問題

この節では、アレーに記憶された整数の表の和を求めると言う、極めて簡単な問題を考えて平行処理の使い方を示す。itemsと言うアレーに100個の整数があるとする。先ずこの問題を多数のプログラムで同時に解く方法を見出さなければならない。例えば二つの演算を含む (a + b) * c を計算するとき、これは同時に行えない。加算が乗算の先になる。幸い、選んだ問題では、4個のプログラムが同時に加算問題を解くとすると、アレーitemsを4個の部分に分けて各プログラムに各部分を処理させれば良い。このとき問題の平行化は次のようになる。

1.4個のプログラムP0, P1, P2, P3 が問題を解く。
2.P0 はアレー要素 items[0]から items[24]までの和を求め、同様にP1 はitems[25] から items[49]まで、 P2は items[50]から tems[74]まで、P3は items[75]から items[99]までの和を求める。
3.これらプログラムの実行後、4個の結果を加えて答えを示す別のプログラムが必要だ。またアレーitemsの要素を P0から P3 までは知らないので、その値を知らせる必要がある。そこで、P0から P3までの他にもう一つ、データを配分し、結果を集計し、実行を組織するプログラムが要る。これをマスターと呼び、P0から P3までをスレーブt呼ぶ。この組織をマスター・スレーブ・パラダイムと呼ぶ。

この組織を頭において、マスターとスレーブのアルゴリズムを書くと、



 




/* マスター・プログラム用アルゴリズム*/


initialize the array `items'.


/* スレーブにデータを送付 */


for i = 0 to 3


    Send items[25*i] to items[25*(i+1)-1] to slave Pi


end for


/* 結果をスレーブから収集 */


for i = 0 to 3


    Receive the result from slave Pi in result[i]


end for


/* 最終結果を計算 */


sum = 0


for i = 0 to 3


    sum = sum + result[i]


end for


print sum





/* スレーブ・プログラム用アルゴリズム*/


Receive 25 elements from the master in some array say `items'


/* 中間結果を計算 */


sum = 0


for i = 0 to 24


    sum = sum + items[i]


end for


send `sum' as the intermediate result to the master



3. PVM を使用する実行

基本アルゴリズムを設計したので、実行方法を考えよう。このプログラム実行用の特殊ハードウエアは必要でなく、相互接続のコンピュータを平行処理に使えるようにするPVM(Parallel Virtual Machine)のお陰で、単一コンピュータ又は相互接続のコンピュータ群で十分だ。これは同一又は異なるマシン上で多数のプログラムを同時に走らせることが出来、プログラム間でのメッセージ交換機能を備えている。単一コンピュータであっても、「真の」平行処理ではないがPVMは働く。学習目的ではこれで十分だ。後でPVMを使う「真の」平行処理を説明する。

PVMシステムを使うには、LinuxシステムにPVMソフトウエアを搭載する必要がある。Red Hat Linuxを使っている場合は、CDにPVM用RPMパケージが入っているので、他のパケージと同様に搭載すれば良い。搭載したとして、 ~/pvm3/bin/LINUX/のディレクトリをホームディレクトリに作る。作った実行可能ファイルをこのディレクトリにコピイすることをPVMが必要とするからだ。これで設定は終わり。コマンドpvmをプロンプトから入れて試されたい。PVM Console がスタートし pvm> プロンプトが出て、PVMシステムにコマンドが与えられる。ここでコマンドconf を入れると、出力は次のようになる。



pvm> conf


conf


1 host, 1 data format


                HOST     DTID     ARCH   SPEED       DSIG


               joshicomp   40000    LINUX    1000   0x00408841


これは、PVMシステムにより、相互接続LINUXシステムを個々のコンピュータより高い計算能力を有する「仮想」コンピュータと見なし得ることを意味する。こうしてPVMシステムは処理を多数のコンピュータに分配する。しかし、規定値では、今仕事をしているホストだけがPVMマシンに含まれる、つまり、全ての処理は同じホストを動かすよう計画される。confコマンドは、PVMにあるホストとノードを示す。今は一つしかない。ホストの加え方は後で示す。取りあえずコマンドhaltでPVC console から出る。

3.1 デモンストレーション・プログラム

PVCシステムの搭載を終わったので、プログラムの書き方を示す。PVC用プログラムは FORTRAN とC言語で書けが、C言語を用いる。PVMシステムを用いるには、他のステートメントと共にCプログラムにPVM機能呼出を含めてPVMライブラリをプログラムに連結する。PVMを開始するため、マスターとスレーブのある簡単なプログラムを書こう。マスターはスレーブに文字列を送り、スレーブがこれを大文字に変換してマスターに返す。プログラムは下記の通り。コンパイルするにはコマンド make -f makefile.demoを与える。プログラムリストを含むファイルは、ここをクリック[Click here for a tar file containing the program listings.]



      1 /* -------------------------------------------------------------------- *


      2  * master_pvm.c                                           *


      3  *                                                                *


      4  * これはシンプルPVMデモンストレーション用マスタープログラム   *


      5  * -------------------------------------------------------------------- */


      6 #include <stdio.h>


      7 #include <stdlib.h>


      8 #include <pvm3.h>           /* PVM 定数と関数を宣言 */


      9 #include <string.h>


     10 int main()


     11 {


     12     int mytid;              /* 我々の課題 ID          */


     13     int slave_tid;          /* スレーブの課題 ID  */


     14     int result;


     15     char message[] = "hello pvm";


     16     


     17     /* スレーブをPVM システムに巻き込んで我々の ID を入手*/


     18     mytid = pvm_mytid();


     19     /* スレーブを産出 */


     20     result = pvm_spawn("slave_pvm", (char**)0, PvmTaskDefault, 


     21                         "", 1, &slave_tid);


     22     /* スレーブ産出に成功したか確認    */


     23     if(result != 1)


     24     {


     25         fprintf(stderr, "Error: Cannot spawn slave.\n");


     26         /* クリーンアップして PVM システムを出る        */


     27         pvm_exit();


     28         exit(EXIT_FAILURE);


     29     }


     30     /* スレーブにデータを送るためデータバッファを初期化  */


     31     pvm_initsend(PvmDataDefault);


     32     /* 文字列をデータバッファに "`pack''       */


     33     pvm_pkstr(message);


     34     /* メッセージタグ0を付けて文字列をスレーブに送付 */


     35     pvm_send(slave_tid, 0);


     36     /* スレーブからの結果文字列を待って受領   */


     37     pvm_recv(slave_tid, 0);


     38     


     39     /* スレーブからの結果を``unpack''   */


     40     pvm_upkstr(message);


     41     /* スレーブからの結果を表示        */


     42     printf("Data from the slave : %s\n", message);


     43     /* クリーンアップして PVM システムを出る   */


     44     pvm_exit();


     45     


     46     exit(EXIT_SUCCESS);


     47 } /* main()終了 */


     48 /* master_pvm.c 終了*/





      1 /* -------------------------------------------------------------------- *


      2  * slave_pvm.c                                                       *


      3  *                                                                 *


      4  * これはシンプルPVMデモンストレーション用 スレーブプログラム   *


      5  * -------------------------------------------------------------------- */


      6 #include <stdio.h>


      7 #include <ctype.h>


      8 #include <stdlib.h>


      9 #include <pvm3.h>


     10 #define MSG_LEN     20


     11 void convert_to_upper(char*);


     12 int main()


     13 {


     14     int mytid;


     15     int parent_tid;


     16     char message[MSG_LEN];


     17     /* 自分をPVM システムに巻き込む        */


     18     mytid = pvm_mytid();


     19     /* マスターのタスクID を取得             */


     20     parent_tid = pvm_parent();


     21     /* マスターから原始文字列を取得      */


     22     pvm_recv(parent_tid, 0);


     23     pvm_upkstr(message);


     24     /* 文字列を大文字に変換             */


     25     convert_to_upper(message);


     26     /* 転換文字列をマスターに送付     */


     27     pvm_initsend(PvmDataDefault);


     28     pvm_pkstr(message);


     29     pvm_send(parent_tid, 0);


     30     /* クリーンアップして PVM システムを出る    */


     31     pvm_exit();


     32     


     33     exit(EXIT_SUCCESS);


     34 }  /* main()終了 */


     35 /* 与えられた文字列を大文字に変えるファンクション */


     36 void convert_to_upper(char* str)


     37 {


     38     while(*str != '\0')


     39     {


     40         *str = toupper(*str);


     41         str++;


     42     }


     43 } /* convert_to_upper() 終了 */


     44 /* slave_pvm.c  終了 */





      1 # Make file for the demo PVM program


      2 .SILENT :


      3 # paths fro PVM include files and libraries


      4 INCDIR=-I/usr/share/pvm3/include


      5 LIBDIR=-L/usr/share/pvm3/lib/LINUX


      6 # link the PVM library


      7 LIBS=-lpvm3


      8 CFLAGS=-Wall


      9 CC=gcc


     10 TARGET=all


     11 # this is where the PVM executables go


     12 PVM_HOME=$(HOME)/pvm3/bin/LINUX


     13 all : $(PVM_HOME)/master_pvm $(PVM_HOME)/slave_pvm


     14 $(PVM_HOME)/master_pvm : master_pvm.c


     15     $(CC) -o $(PVM_HOME)/master_pvm master_pvm.c $(CFLAGS) $(LIBS) \


     16           $(INCDIR) $(LIBDIR)


     17 $(PVM_HOME)/slave_pvm : slave_pvm.c


     18     $(CC) -o $(PVM_HOME)/slave_pvm slave_pvm.c $(CFLAGS) $(LIBS) \


     19           $(INCDIR) $(LIBDIR)



プログラムをコンパイルしたら、 ~/pvm3/bin/LINUX ディレクトリにコピイする(makefileが規定値で行う)。プログラムを走らせるには、PVMコンソールからコマンドpvmを入力してPVMシステムをスタートする。そこでpvm>プロンプトからquitとタイプする。出力は:



pvm> quit


quit


Console: exit handler called


pvmd still running.


PVM daemon (pvmd)が未だ走っているとの最終行を見られたい。PVMを走らせるにはメッセージ交換を管理するPVM daemon を走らせなければならないが、今それを行った。PVM daemon が走ったら、次のコマンドでプログラムを走らせられる:


[rahul@joshicomp rahul]$ cd ~/pvm3/bin/LINUX/


[rahul@joshicomp LINUX]$ ./master_pvm


Data from the slave : HELLO PVM


[rahul@joshicomp LINUX]$


文字列が大文字になったのを確認されたい。

3.2 プログラムの説明

この節では、プログラムの働きを細かく見る。PVMファンクションを用いるため、先ずmaster_pvm.c の8行目と slave_pvm.c. の9行目で、ヘッダーファイルpvm3.hをプログラムにインクルードしている。プログラムをコンパイルするときPVMライブラリにリンクしするため makefile.demoの7行目で、コンパイラへに -lpvm3オプションを規定している。またmakefileの4行目と5行目のように、ヘッダとライブラリファイルのパスを規定する必要がある。

マスタープログラムでは、先ず PVM ファンクション pvm_mytid()を呼び出してマスターの task ID を入手する。PVMシステムは、LinuxのプロセスIDと同様に、各処理に独特の32ビット整数をtask IDとして割り当てる。task ID(mytidに記憶)は連絡すべき処理を見分けるのに役立つが、マスターは使わない。ここでの目的はファンクション pvm_mytid()の呼出である。このファンクションが処理をPVMシステムに巻き込み、処理用に独特の task ID を発生する。積極的に巻き込まれないとPVMは、最初のPVMファンクションのとき自動的に巻き込む。次に pvm_spawn() を使ってスレーブ処理を発生する。第一パラメータ "slave_pvm" は、スレーブ用実行可能プログラムの名である。第二パラメータは、スレーブに渡したいアーギュメントである(普通のCのargvと同じ)。アーギュメントは送らないので値を0とする。第三パラメータは、PVMがスレーブをスタートする方法と場所を制御するフラッグである。単一マシンがあるだけなのでこのフラッグは PvmTaskDefault に設定し PVM がスレーブを生む間規定基準を使う規定とした。第四パラメータは、フラッグが PvmTaskDefault 以外のときプログラムを走らせたいホスト名で、ここでは空白となる。第五パラメータは生み出すスレーブの数で、第六パラメータはスレーブのIDを戻すアレーへのポインタである。このファンクションは生じたスレーブ数を返し、これを正しさの点検に用いる。

PVMの中のメッセージは、基本的にデータとメッセージ型を示す tag の二つの部分から成る。tag は異なるメッセージを区別する。、例えば、加算の例で、各スレーブはマスターに加算結果の整数を送るが、エラーに遭遇しマスターにエラーコードを示す整数を送るマスターがあるかも知れない。マスターが受け取った整数が中間結果かエラーコードかを判定するのが tag である。中間結果には MSG_RESULT と言うtagを割り当てて、ヘッダーファイルで #define し、エラーには MSG_ERROR を割り当てる。マスターはメッセージ tag を見て判定する。

メッセージを送るには、送信バッファを "initialize"(初期化)する必要がある。これには pvm_initsend() ファンクションを呼び出す。このファンクションへのパラメータは"encoding'' スキムの使用を規定する。(ペンチアムとSPARCなど)アーキテクチャの異なるマシン間でのデータ交換には送信側でエンコードし受信側でデコードする必要がある。pvm_initsend() へのパラメータは使用するエンコードスキムを規定する。PvmDataDefault は異機種間の安全なデータ交換を可能にするエンコードスキムを規定する。バッファを初期化したら、データをバッファに入れてエンコード(パック)する。データは文字列なので、ファンクション pvm_pkstr() を使ってパックする。整数を送るのであればファンクション pvm_pkint()、同様に、別のデータ型には別のファンクションがある。パックしたら pvm_send() を呼び出して送信する。最初のアーギュメントはメッセージを送る処理のIDで、次のアーギュメントはメッセージタグである。メッセージ型は一つなので、タグは0に設定する。

データをスレーブに送ると、スレーブが処理してマスターに戻すので、pvm_recv() を呼び出してスレーブから受け取る。ここでもパラメータはメッセージ送付のタスクIDとメッセージタグである。望みのメッセージが来ないと、このファンクションは待機して返さない。マスターはスレーブの処理を待つ。メッセージが到着すると、データはバッファに入りアンパックされ原始メッセージに戻される。このデコードは pvm_upkstr() ファンクションがおこなう。ここで処理文字列を表示する。

PVMプログラムから出る前に、 pvm_exit() ファンクションを呼び出して、PVMシステムを出ることをPVMシステムに通知してリソースを開放する。

スレーブプログラムは判り易い。先ずファンクションpvm_parent()を呼び出してマスターのタスクIDを見出す。次いでメッセージ文字列を受け取り、大文字に変えてマスターに送り返す。

3.3 加算プログラム

PVMプログラムの基礎が判ったので、PVMを使う加算アルゴリズムをおこなう。1個のマスターと4個のスレーブがある。マスターは4個のスレーブを生み出し、それぞれにデータを送る。スレーブは加算結果を返す。二つの型のメッセージが交換される。マスターがデータを送るとき使うタグ MSG_DATA とスレーブが結果を返すときつかうタグ MSG_RESULTである。マスターとスレーブのプログラムを下記に示す。




      1 /* -------------------------------------------------------------------- *


      2  * common.h                                                     *


      3  *                                                              *


      4  * これは共通定数を幾つか定義するヘッダーファイル                 *


      5  * -------------------------------------------------------------------- */


      6 #ifndef COMMON_H


      7 #define COMMON_H


      8 #define NUM_SLAVES      4                 /* スレーブの数   */


      9 #define SIZE            100                  /* 全データのサイズ */


     10 #define DATA_SIZE     (SIZE/NUM_SLAVES) /* 各スレーブ用のサイズ */


     11 #endif


     12 /* common.h 終了 */





      1 /* -------------------------------------------------------------------- *


      2  * tags.h                                                          *


      3  *                                                               *


      4  * これはメッセージ用に使うタグを定義するヘッダーファイル      *


      5  * -------------------------------------------------------------------- */


      6 #ifndef TAGS_H


      7 #define TAGS_H


      8 #define MSG_DATA            101     /* data from master to slave    */


      9 #define MSG_RESULT          102     /* result from slave to master  */


     10 #endif


     11 /* end tags.h */





  1 /* -------------------------------------------------------------------- *


  2  * master_add.c                                                         *


  3  *                                                                    *


  4  * PVMを用いてアレーの要素を加算するマスタープログラム       *


  5  * -------------------------------------------------------------------- */


  6 #include <stdio.h>


  7 #include <stdlib.h>


  8 #include <pvm3.h>           /* PVM 定数と宣言   */


  9 #include "tags.h"            /* メッセージ用タグ   */


 10 #include "common.h"         /* 共通定数          */


 11 int get_slave_no(int*, int);


 12 int main()


 13 {


 14     int mytid;


 15     int slaves[NUM_SLAVES];  /* スレーブのタスクID記憶アレー   */


 16     int items[SIZE];          /* 処理すべきデータ                */


 17     int result, i, sum;


 18     int results[NUM_SLAVES];    /* スレーブからの結果             */


 19     /* PVM システムに入る  */


 20     mytid = pvm_mytid();


 21     /*  アレー `items' を初期化*/


 22     for(i = 0; i < SIZE; i++)


 23         items[i] = i;


 24     /* スレーブを生む            */


 25     result = pvm_spawn("slave_add", (char**)0, PvmTaskDefault,


 26                        "", NUM_SLAVES, slaves);


 27     /* 正しい数のスレーブが出来たか点検    */


 28     if(result != NUM_SLAVES)


 29     {


 30         fprintf(stderr, "Error: Cannot spawn slaves.\n");


 31         pvm_exit();


 32         exit(EXIT_FAILURE);


 33     }


 34     /* データをスレーブに分配     */


 35     for(i = 0; i < NUM_SLAVES; i++)


 36     {


 37         pvm_initsend(PvmDataDefault);


 38         pvm_pkint(items + i*DATA_SIZE, DATA_SIZE, 1);


 39         pvm_send(slaves[i], MSG_DATA);


 40     }


 41     /* 結果をスレーブから受領    */


 42     for(i = 0; i < NUM_SLAVES; i++)


 43     {


 44         int bufid, bytes, type, source;


 45         int slave_no;


 46         


 47         /* スレーブのいずれかから目セージを受領       */


 48         bufid = pvm_recv(-1, MSG_RESULT);


    


 49         /* メッセージに関する情報を受領          */


 50         pvm_bufinfo(bufid, &bytes, &type, &source);


 51         


 52         /* メッセージを送ったスレーブ番号を入手   */


 53         slave_no = get_slave_no(slaves, source);


 54         /* 結果を適切な場所でアンパック   */


 55         pvm_upkint(results + slave_no, 1, 1);


 56     }


 57     /* 最終結果を見出す         */


 58     sum = 0;


 59     for(i = 0; i < NUM_SLAVES; i++)


 60         sum += results[i];


 61     printf("The sum is %d\n", sum);


 62     /* クリーンアップしてPVMシステムを出る    */


 63     pvm_exit();


 64     exit(EXIT_SUCCESS);


 65 } /* end main() */


 66         


 67 /* タスクIDを与えられたスレーブ番号を返すファンクション */


 68 int get_slave_no(int* slaves, int task_id)


 69 {


 70     int i;


 71     for(i = 0; i < NUM_SLAVES; i++)


 72         if(slaves[i] == task_id)


 73             return i;


 74     return -1;


 75 } /* get_slave_no() を終了 */


 76 /* master_add.c を終了 */





  1 /* -------------------------------------------------------------------- *


  2  * slave_add.c                                                         *


  3  *                                                                   *


  4  * PVMを用いてアレーの要素を加算するスレーブプログラム            *


  5  * -------------------------------------------------------------------- */


  6 #include <stdlib.h>


  7 #include <pvm3.h>


  8 #include "tags.h"


  9 #include "common.h"


 10 int main()


 11 {


 12     int mytid, parent_tid;


 13     int items[DATA_SIZE];           /* マスターが送ったデータ */


 14     int sum, i;


 15     


 16     /* PVM システムに入る       */


 17     mytid = pvm_mytid();


 18     /* マスターのタスク ID を入手   */


 19     parent_tid = pvm_parent();


 20     /* マスターからデータを受領 r */


 21     pvm_recv(parent_tid, MSG_DATA);


 22     pvm_upkint(items, DATA_SIZE, 1);


 23     /* 要素の和を見出す    */


 24     sum = 0;


 25     for(i = 0; i < DATA_SIZE; i++)


 26         sum = sum + items[i];


 27     /* 結果をマスターに送る   */


 28     pvm_initsend(PvmDataDefault);


 29     pvm_pkint(&sum, 1, 1);


 30     pvm_send(parent_tid, MSG_RESULT);


 31     /* クリーンアップしてPVMシステムを出る      */


 32     pvm_exit();


 33     


 34     exit(EXIT_SUCCESS);


 35 } /* main() 終了 */





  1 # 加算PVMプログラム用ファイルを作る− makefile.add


  2 .SILENT :


  3 # PVM インクルード・ファイルとライブラリのパス


  4 INCDIR=-I/usr/share/pvm3/include


  5 LIBDIR=-L/usr/share/pvm3/lib/LINUX


  6 # PVM ライブラリをリンク


  7 LIBS=-lpvm3


  8 CFLAGS=-Wall


  9 CC=gcc


 10 TARGET=all


 11 # PVM 実行可能ファイルの行き先


 12 PVM_HOME=$(HOME)/pvm3/bin/LINUX


 13 all : $(PVM_HOME)/master_add $(PVM_HOME)/slave_add


 14 $(PVM_HOME)/master_add : master_add.c common.h tags.h


 15     $(CC) -o $(PVM_HOME)/master_add master_add.c $(CFLAGS) $(LIBS) \


 16           $(INCDIR) $(LIBDIR)


 17   


 18 $(PVM_HOME)/slave_add : slave_add.c common.h tags.h


 19     $(CC) -o $(PVM_HOME)/slave_add slave_add.c $(CFLAGS) $(LIBS) \


 20          $(INCDIR) $(LIBDIR)



先ず簡単なスレーブプログラムを考える。スレーブはマスターから25個のアレー要素を受け取り、和を見出し、結果もにタグ MSG_RESULTを付けてマスターに返す。ここでマスターを考える。サイズが NUM_SLAVES のアレーslavesを定義して、パレントが生み出したスレーブのタスクIDを記憶し、別にアレー results を定義してスレーブからの結果を記憶する。マスターは先ずアレーを初期化してスレーブを作る。次いでデータをスレーブに配分する。38行目の pvm_pkint() 呼出で第一パラメータは整数を記憶するアレー、第二はパックする整数の数、第三は``stride.'' で、パックのとき飛ばす要素数を意味する。これが1であれば連続してパックし、2であれば、偶数番要素(0, 2, 4 ...) がパックされる。ここでは1とする。

データをスレーブに配分したら、マスターはスレーブが返す結果をを待つ。結果をタスクIDの順に受けるのは、計算の早いスレーブを待たせるので、効率が良くない。ジョブを終えたスレーブに別のジョブを与えるためにも、マスターはどのスレーブからのメッセージにも応答しなければならない。ここではそれをおこなう。

48行目の pvm_recv() 呼出で、第一パラメータはメッセージ発信源のタスクIDだが、この値を−1にすると、ワイルドカードになって、タグ MSG_RESULTの付いたメッセージは全部受け取り、制御情報と共に active receive buffer.と言うバッファに記憶する。この呼出はこのバッファ特有のIDを返す。pvm_bufinfo() が、バッファの中のメッセージに関する情報、タグ、バイト数、送り手タスクIDなどを返す。送り手タスクIDを知ったら、そのスレーブの結果を results アレーの該当する要素に設定する。残余のプログラムは容易に理解出来るであろう。

3.4 PVM を用いる作業

興味があれば、適当な問題を選んでプログラムを書くと良いが、バグなどのため、開始前の状態に返る必要があるかも知れない。PVMコンソールには haltコマンドがあって、PVM daemon を殺す。Linux の kill コマンドを使っても良い。LANなどに接続された Linuxマシンのネットワークがあるときは、「本当の」並行処理を行うことが出来る。先ずPVM を全てのホストに搭載し、PVMコンソールのaddコマンドを使ってホストを仮想マシンに加える。するとPVMがこれらのホストを働かせる何かの処理をして、本当の平行処理が出来るようになる。

4. MPI を用いる実行

前節で、PVMを用いる加算プログラムを実行した。平行処理プログラム開発に用いる別の方法、MPI(Message Passing Interface)ライブラリの利用、を検討しよう。これはポータブルメッセージ受渡アプリケーションを書くことが出来るよう開発されたスタンダードで、メッセージ交換他多数の機能の為のファンクションを備える。PVMがソフトウエアであるのに対しMPIはスタンダードなのでMPIを用いる多数の方法があることに注意されたい。ここではMPIを用いるLAM(Local Area Multicomputer)を用いる。これはRed Hat Linux CD 上でRPM パケージとして入手出来るので、搭載に問題はない。

RPMパケージを搭載したら、 /usr/boot ディレクトリに行って、名前が conf.lam で一行だけ lamd $inet_topo とタイプしたファイルと、名前が bhost.def で、一行だけlocalhostとタイプしたファイルを作る。うまく働くか試験をするため、プロンプトからlambootとタイプすると、下記の応答がある。



[rahul@joshicomp boot]$ lamboot


LAM 6.3.1/MPI 2 C++/ROMIO - University of Notre Dame


[rahul@joshicomp boot]$


出力がエラーを示したら、上記を繰り返すか、又はlamboot(1)マニュアルを参照する。

LAM/MPI が正しく搭載されたとして、デモプログラムを書いてみる。

4.1 A MPI デモ・プログラム

(a + b) * (c - d)を計算するとして簡単なマスター・スレーブ・プログラムを書く。マスターがユーザーから値a、b、c、dを読み取り、一つのスレーブが(a + b) 他が(c - d) を計算するとする。プログラムは次の通りになる。




  1 /* -------------------------------------------------------------------- *


  2  * mpi_demo.c                                                        *


  3  *                                                                   *


  4  * 式を計算する簡単な MPI デモ・プログラム        *


  5  * -------------------------------------------------------------------- */


  6 #include <stdio.h>


  7 #include <stdlib.h>


  8 #include <lam/mpi.h>             /* MPI 定数及びファンクション用     */


  9 #define MSG_DATA        100     /* マスターからスレーブへのメッセージ  */


 10 #define MSG_RESULT      101     /* スレーブからマスターへのメッセージ */


 11 #define MASTER          0       /* マスターのランク                */


 12 #define SLAVE_1         1       /* 第一スレーブのランク             */


 13 #define SLAVE_2         2       /* 第二スレーブのランク             */


 14 /* マスターと二つのスレーブの問題を扱うファンクション         */


 15 void master(void);


 16 void slave_1(void);


 17 void slave_2(void);


 18 int main(int argc, char** argv)


 19 {


 20     int myrank, size;


 21     


 22     /* MPI システムの初期化                              */


 23     MPI_Init(&argc, &argv);


 24     /* コミュニケータのサイズ即ちプロセス数を取得        */


 25     MPI_Comm_size(MPI_COMM_WORLD, &size);


 26     /* プロセスの正しい数を点検                          */


 27     if(size != 3)


 28     {


 29         fprintf(stderr, "Error: Three copies of the program should be run.\n");


 30         MPI_Finalize();


 31         exit(EXIT_FAILURE);


 32     }


 33     


 34     /* プロセスのランクを取得                                    */


 35     MPI_Comm_rank(MPI_COMM_WORLD, &myrank);


 36     /* ランクにしたがって処理を実行                           */


 37     if(myrank == MASTER)


 38         master();


 39     else if(myrank == SLAVE_1)


 40         slave_1();


 41     else


 42         slave_2();


 43     /* クリーンアップしてMPI システムを出る                      */


 44     MPI_Finalize();


 45     exit(EXIT_SUCCESS);


 46 } /* main()終了 */


 47 /* マスターの課題を実行するファンクション     */


 48 void master(void)


 49 {


 50     int a, b, c, d;


 51     int buf[2];


 52     int result1, result2;


 53     MPI_Status status;


 54     printf("Enter the values of a, b, c, and d: ");


 55     scanf("%d %d %d %d", &a, &b, &c, &d);


 56     /*  第一スレーブに a と b を送る              */


 57     buf[0] = a;


 58     buf[1] = b;


 59     MPI_Send(buf, 2, MPI_INT, SLAVE_1, MSG_DATA, MPI_COMM_WORLD);


 60     /* 第二スレーブに c とd を送る             */


 61     buf[0] = c;


 62     buf[1] = d;


 63     MPI_Send(buf, 2, MPI_INT, SLAVE_2, MSG_DATA, MPI_COMM_WORLD);


 64     /* スレーブから結果を受け取る              */


 65     MPI_Recv(&result1, 1, MPI_INT, SLAVE_1, MSG_RESULT, 


 66              MPI_COMM_WORLD, &status);


 67     MPI_Recv(&result2, 1, MPI_INT, SLAVE_2, MSG_RESULT, 


 68              MPI_COMM_WORLD, &status);


 69     /*  最終結果                                 */


 70     printf("Value of (a + b) * (c - d) is %d\n", result1 * result2);


 71 } /* master() 終了 */


 72 /* 第一スレーブの課題を実行するファンクション       */


 73 void slave_1(void)


 74 {


 75     int buf[2];


 76     int result;


 77     MPI_Status status;


 78     


 79     /* 二つの値をマスターから受け取る      */ 


 80     MPI_Recv(buf, 2, MPI_INT, MASTER, MSG_DATA, MPI_COMM_WORLD, &status);


 81     


 82     /* a + b を見出す                           */


 83     result = buf[0] + buf[1];


 84     /* 結果をマスターに送る                    */


 85     MPI_Send(&result, 1, MPI_INT, MASTER, MSG_RESULT, MPI_COMM_WORLD);


 86 } /* slave_1() 終了 */


 87 /* 第二スレーブの課題を実行するファンクション      */


 88 void slave_2(void)


 89 {


 90     int buf[2];


 91     int result;


 92     MPI_Status status;


 93     


 94     /* 二つの値をマスターから受け取る      */


 95     MPI_Recv(buf, 2, MPI_INT, MASTER, MSG_DATA, MPI_COMM_WORLD, &status);


 96     


 97     /* c - d を見出す                            */


 98     result = buf[0] - buf[1];


 99     /* 結果をマスターに送る                    */


100     MPI_Send(&result, 1, MPI_INT, MASTER, MSG_RESULT, MPI_COMM_WORLD);


101 } /* slave_2() 終了 */


102 /* mpi_demo.c を終了*/





  1 # Makefile for MPI demo program - makefile.mpidemo


  2 .SILENT:


  3 CFLAGS=-I/usr/include/lam -L/usr/lib/lam


  4 CC=mpicc


  5 mpi_demo : mpi_demo.c


  6     $(CC) $(CFLAGS) mpi_demo.c -o mpi_demo



このプログラムをコンバイルするには、コマンド make -f makefile.mpidemo を与える。コンパイルを終えて走らせるには、先ず lamboot コマンドを用いて、ローカルエリアマルチコンピュータシステムを「スタート」即ち「ブート」し、次いでコマンド mpirun -np 3 mpi_demoを与えてプログラムを走らせる。



[rahul@joshicomp parallel]$ lamboot


LAM 6.3.1/MPI 2 C++/ROMIO - University of Notre Dame


[rahul@joshicomp parallel]$ mpirun -np 3 mpi_demo


Enter the values of a, b, c, and d: 1 2 3 4


Value of (a + b) * (c - d) is -3


[rahul@joshicomp parallel]$


4.2 プログラムの説明

MPIシステムとファンクションを使うには、8行目で行ったように先ずヘッダファイル mpi.h をインクルードする。PVMでは別のプロセスをIDで区別したが、MPIでは、MPIシステムが各プロセスに rank と呼ばれる0から始まる独特の整数を割り当てる。ランクで区別して連絡する。第二に各プロセスは多数のコミュニケータで、コミュニュケータは互いにメッセージを交換するプロセスのグループと考えられる。規定値で各プロセスは MPI_COMM_WORLD と呼ばれる多数のコミュニュケータである。新しいコミュニュケータを作っても良いが、複雑になるだけなので、MPI_COMM_WORLD を使う。

MPIプログラムはいずれも最初に MPI_Init() 呼出さなければならない。これはプロセスがMPIシステムに入るためとシステムが要求する初期化に用いられれる。次に、MPI_Comm_size() ファンクションを用いて MPI_COMM_WORLD コミニュケータの大きさつまりプロセスの数を得る。ここではマスター一つとスレーブ二つの三つのプロセスが必要である。その後、 MPI_Comm_rank() を呼んでランクを得る。三つのプロセスはランク0,1,2を有するが、三つ共本質的に同一でマスター・スレーブの関係はない。どれをマスターにするかは自由である。ランク0をマスターとしランク1,2をスレーブとする。マスターと二つのスレーブ双方のコードを同一プログラムに組み込んだのが分かるだろう。PVMのようにプロセスの産出はない。プログラムでなくコマンド行から生み出すプロセス数を決めている。実行を終了したら MPI_Finalize() を呼び出してクリーンアップする。

ここで、マスターファンクションを考察する。マスターはユーザーから値a,b,c,dを読み込んでスレーブ1と2に送る。変数を個々に送る代わりに、アレーにまとめて整数2個のアレーを送る。これは良い方法で、メッセージ受渡の負荷を軽減する。バッファの準備が終わったら、PVMと異なり、パックもエンコードも不要でMPIが内部処理をするので MPI_Send() ファンクションを呼び出して送る。第一パラメータ(59行目)はバッファのアドレスで、第二はメッセージ中の要素数、第三はバッファのデータ型で、ここではバッファが整数のアレーであることを規定する MPI_INT となっている。次にメッセージを送るプロセスのランク、ここでは SLAVE_1(#と規定)が来る。次はPVMと同様の message tag である。最後のパラメータは、受信者がメンバーのコミュニュケータ、この場合は MPI_COMM_WORLD、である。

データをスレーブに配布したら、マスターはスレーブが結果を送るのを待つ。簡単のため、スレーブ1、2の順で結果を集める。メッセージ受領には MPI_Recv() ファンクションを用いる。ここでもパックとデコードはMPI内部でおこなう。第一アーギュメント(65行目)はデータを受領するバッファのアドレスである。第二は要素数であらわしたバッファサイズで、この場合は1である。次はデータ型で、今の場合 MPI_INT。次の三つのパラメータはメッセージ源のランク、予想メッセージのタグ、発信源がメンバーとなっているコミュニケータを規定する。最後のアーギュメントは何らかの状態情報が返される MPI_Status 型の構造体へのポインタである(我々は無視)。これで基本的MPI用語が分かったので、 slave_1()slave_2() は明らかな筈だ。

このプログラムでは、マスターもスレーブもコード同じ実行可能ファイルに入っている。後で多数の実行可能ファイルの実行方法を検討する。makefileからMPIプログラムのコンパイルには、必要ライブラリを自動的にリンクするラッパープログラムが設けられていることが分かる。プログラムを走らせるには、LAMをブートした後 mpirun -np 3 mpi_demo コマンドを用いる。これでLAMに三つのプロセス、マスターと二つのスレーブを規定する。

4.3 もう一度、加算プログラム

MPIで加算プログラムをもう一度作ってみる。ここでは別のプログラムをMPIで実行する方法を示す。MPIで単一実行可能プログラムを用いるときそれをSingle Program Multiple Data (SPMD)アプリケーションと呼ぶ。さらに二つが含まれるときMultiple Program Multiple Data (MPMD) アプリケーションと呼ぶ。LAMを用いると、MPMDプログラムは、application schema の助けを借りて実行される。その前に、マスターとスレーブのプログラムを検討する。




  1 /* -------------------------------------------------------------------- *


  2  * master_mpi.c                                                 *


  3  *                                                             *


  4  * MPIを用いてアレーの要素を加算するマスタープログラム        *


  5  * -------------------------------------------------------------------- */


  6 #include <stdio.h>


  7 #include <stdlib.h>


  8 #include <lam/mpi.h>        /* MPI 定数とファンクション            */


  9 #include "tags.h"            /* 異なるメッセージのためのタグ         */


 10 #include "common.h"        /* 共通定数                           */


 11 int main(int argc, char** argv)


 12 {


 13     int size, i, sum;


 14     int items[SIZE];


 15     int results[NUM_SLAVES];


 16     MPI_Status status;


 17     /* MPI システムの初期化                */


 18     MPI_Init(&argc, &argv);


 19     /* プロセス数が正しいかチェック       */


 20     MPI_Comm_size(MPI_COMM_WORLD, &size);


 21     if(size != 5)


 22     {


 23         fprintf(stderr, "Error: Need exactly five processes.\n");


 24         MPI_Finalize();


 25         exit(EXIT_FAILURE);


 26     }


 27     /* initialize the `items' array             */


 28     for(i = 0; i < SIZE; i++)


 29         items[i] = i;


 30     /* データをスレーブに配分       */


 31     for(i = 0; i < NUM_SLAVES; i++)


 32         MPI_Send(items + i*DATA_SIZE, DATA_SIZE, MPI_INT, i + 1,


 33                  MSG_DATA, MPI_COMM_WORLD);


 34     /* スレーブからの結果を集計     */


 35     for(i = 0; i < NUM_SLAVES; i++)


 36     {


 37         int result;


 38         


 39         MPI_Recv(&result, 1, MPI_INT, MPI_ANY_SOURCE, MSG_RESULT,


 40                  MPI_COMM_WORLD, &status);


 41         results[status.MPI_SOURCE - 1] = result;


 42     }


 43     /* 最終解答を見出す                  */


 44     sum = 0;


 45     for(i = 0; i < NUM_SLAVES; i++)


 46         sum = sum + results[i];


 47     printf("The sum is %d\n", sum);


 48     /* クリーンアップしてMPI システムを出る     */


 49     MPI_Finalize();


 50     exit(EXIT_SUCCESS);


 51 } /* main() 終了 */


 52 /* master_mpi.c  終了*/





  1 /* -------------------------------------------------------------------- *


  2  * slave_mpi.c                                                        *


  3  *                                                                  *


  4  * MPIを用いるアレー要素加算用スレーブプログラム                   *


  5  * -------------------------------------------------------------------- */


  6 #include <stdio.h>


  7 #include <stdlib.h>


  8 #include <lam/mpi.h>        /* MPI ファンクションと定数  */


  9 #include "tags.h"            /* メッセージタグ            */


 10 #include "common.h"         /* 共通定数               */


 11 #define MASTER  0         /* マスターのランク          */


 12 int main(int argc, char** argv)


 13 {


 14     int items[DATA_SIZE];


 15     int size, sum, i;


 16     MPI_Status status;


 17     /* MPI システム初期化            */


 18     MPI_Init(&argc, &argv);


 19     /* プロセス数が正しいかチェック */


 20     MPI_Comm_size(MPI_COMM_WORLD, &size);


 21     if(size != 5)


 22     {


 23         fprintf(stderr, "Error: Need exactly five processes.\n");


 24         MPI_Finalize();


 25         exit(EXIT_FAILURE);


 26     }


 27     /* マスターからデータを受領        */


 28     MPI_Recv(items, DATA_SIZE, MPI_INT, MASTER, MSG_DATA,


 29              MPI_COMM_WORLD, &status);


 30     /* 合計を見出す                     */


 31     sum = 0;


 32     for(i = 0; i < DATA_SIZE; i++)


 33         sum = sum + items[i];


 34     /* 結果をマスターに送る        */


 35     MPI_Send(&sum, 1, MPI_INT, MASTER, MSG_RESULT, MPI_COMM_WORLD);


 36     /* クリーンアップしてMPI システムを出る     */


 37     MPI_Finalize();


 38     exit(EXIT_SUCCESS);


 39 } /* main() 終了 */


 40 /* slave_mpi.c 終了 */





  1 # Makefile for MPI addition program - makefile.mpiadd


  2 .SILENT:


  3 CFLAGS=-I/usr/include/lam  -L/usr/lib/lam


  4 CC=mpicc


  5 all : master_mpi slave_mpi


  6 master_mpi : master_mpi.c common.h tags.h


  7     $(CC) $(CFLAGS) master_mpi.c -o master_mpi


  8 slave_mpi : slave_mpi.c common.h tags.h


  9     $(CC) $(CFLAGS) slave_mpi.c -o slave_mpi



プログラムをコンパイルするには、make -f makefile.mpiadd とタイプする (ファイル common.htags.h はPVM プログラムに用いたのと同じ)。これで master_mpislave_mpi の実行可能ファイルが出来る。次はMPIにこれらを走らせよと告げることだ。ここで application schema file が介入し、 application schema ファイルが、走らせる実行可能ファイル、走らせるノード、及び実行可能ファイルのコピイ数を規定する。新ファイル add.schema を作って、その中に次の行をタイプする。



# Application schema for the addition program using MPI


n0 master_mpi


n0 -np 4 slave_mpi


このファイルは、MPIがマスターを一つ(ランク0)とスレーブを四つ、ノードn0、つまりローカルノードにコピイすることを規定する。この schema file では他の多くのパラメータを規定することが出来る。マニュアルの appschema(1) を参照。 schema file が出来上がったら次のようにプログラムを走らせる。



[rahul@joshicomp parallel]$ lamboot


LAM 6.3.1/MPI 2 C++/ROMIO - University of Notre Dame


[rahul@joshicomp parallel]$ mpirun add.schema


The sum is 4950


[rahul@joshicomp parallel]$


プログラムのほとんどは分かり易い筈だ。39行目で、スレーブから中間結果を受け取るとき、ソースを MPI_ANY_SOURCE と規定した。前に言ったように、計算を終わったスレーブから順に結果を受け取りたいからである。この場合、status 構造体は実際のソースをMPI_SOURCEに含む。この情報を利用して適切な要素を results アレーから受領中間結果に設定する。

相互接続コンピュータのネットワークを有するときは、アプリケーション schema ファイルを適宜変更してプログラムを走らせることが出来る。ホストとしてn0を指定する代わりに、ホスト名とそのホストにスケジュールしたいプロセスを規定する。詳しくはマニュアルと参考文献で。

5. 結び

PVMとMPIライブラリを用いる平行プログラムの書き方を示した。これらは多くのプラットホームで利用出来、デファクトスタンダードでもあるので、大型マシンではほとんど変更なく利用出来る。ここで述べたかったのはこれらライブラリの提供する二点間通信機能とそれを使うメッセージ受渡しである。これらの装置から離れて、PVMとMPIは数多くの機能を提供する。これらの機能を是非探求されたい。公衆ドメインソフトウエアによりコンピュータのネットワークを単一コンピュータとして使えるようになったので、大きい問題に事務所又は学校でネットワークを使うことを考えられたい。以下の書物がそのときの参考になるであろう。

1.PVM: Parallel Virtual Machine - A User's Guide and Tutorial for Networked Parallel Computing, Al Geist, Adam Beguelin, Jack Dongarra, Robert Manchek, Weicheng Jiang and Vaidy Sunderam, MIT Press. Available at http://www.netlib.org/
2.MPI: The Complete Reference, Marc Snir, Steve Otto, Steven Huss-Lederman, David Waker and Jack Dongarra, MIT Press. Available at http://www.netlib.org/.
3.RS/6000 SP: Practical MPI Programming,Yukiya Aoyama and Jan Nakano, International Techical Support Organization, IBM Corporation, http://www.redbooks.ibm.com/.
4.A Beginner's Guide to PVM Parallel Virtual Machine, Clay Breshears and Asim YarKhan, Joint Institute of Computational Science, University of Tennessee, USA. www-jics.cs.utk.edu/PVM/pvm/_guide.html.
1.PVM: An Introduction to Parallel Virtual Machine, Emily Angerer Crawford, Office of Information Technology, High Performance Computing, www.hpc.gatech.edu/seminar/pvm.html.

Copyright © 2001, Rahul U. Joshi.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 
 

オープンソース・インフラストラクチャ上の

Webポータルバンク

By Ned Lilly

データベース big boy の日は終わった

一つの会社がオンライン社会向けに二つのWebポータルを作った途端に有名になった。無線専門社 Wireless Developer Network (WDN) と地理情報専門の子会社GeoCommunity は、従来それぞれマイクロソフトとオラクルを用いるホストサービスを行って来た。ポータルが成功しそうになると、危機が表面に出た。

1月以内にWDNがSQLサーバーの性能とMS IISnoのセキュリティに問題を生じた。 Oracle 8i は高価で、ポータルの容量とユーザーが増えるに連れ、利益を圧迫した。そこで、両社のWebポータル用オープンソース技術プラットホームから big boy の追放を企てた。

Webポータルは、衝突や干渉なして24/7までのwebページにサービス出来なければならない。開発者はLinuxを用いと決めた。Apache web サーバーがLinux プラットホーム用に最適化されていて、優れていると知っていた。

オープンソースと著作権環境を検討して、Webベースのアプリケーションにはオープンソースが確実と信じるに至った。オープンソースでは多数の開発者がセキュリティと性能を掘り下げて、穴があれば開発段階の早期に見付けてくれる。

WDN首脳は早速その考えを取り入れたが、管理者の中には「無料で良いことはない」と考える者もいた。だが、上級管理者はオープンソースで売り始めた。

事実、Linuxの力は確実に伸びており、NetcraftによればWebサーバー上でLinuxは36%、Apache Webは61%となっている。2004年にはソフトウエア産業が劇的に変わるとの予想もある。

今日のWebベースビジネスの核心であるデータベース市場は、Oracle、Microsoft、IBMなどを確実に握り続けるだろうが、最近では PostgreSQL やMySQL などのオープンソースが性能でも機能でも著作権巨人に迫りつつある。熟練開発者とその社会と同時に企業をも引き付けつつある。

ポータルの核心

WDNとGeoCommunityに取って最大の問題は、正しいデータベース管理システムの選択であった。ポータルは、毎月数千のビジターを扱うに十分な拡張性と機能性及びe−ビジネスを含むアプリケーションの能力源を必要とした。

ポータルは二つのオープンソース・データベース MySQLPostgreSQLを試験した。

MySQLは構成と使用が簡単だが、取引サポートと拡張性に欠けていた。 MySQLは大きいユーザーベースを引き付けたが、低通信量Webサイトに適していると判断した。技術者はまた PostgreSQL に各種の厳しい試験を課したがこれに耐えた。

Red Hat Linux OS、Apache web サーバー、PostgreSQL データベースを含むオープンソース・アプリケーションをダウンロードした後、スタッフは一時間足らずでシステムを構成した。ポータルは、書物販売、メッセージ板、メールリストなどのダイナミック・アプリケーションを補強する PostgreSQL を用いて12のサーバーを走らせる。システムは1分以内で働いたがどのポータルにも今まで衝突やデータ喪失はない。

FUD (危惧、不安、疑惑) 要因との対決

オープンソース技術が熟練ハッカーやユーザーの専門分野であったのには理由がある。昔、これらアプリケーションは意図的に著作権競合のあるベルなどを欠いていたので、初心者にはインストールさえ難しかった。独立開発者がツール、付加機能、文書化を促進したので、時間を経るにつれ使いやすくなった。

WDN とGeoCommunity に取って、著作権からオープンソースへの移植は在来ビジネスより容易だった。Webポータルは両方の経験のあるスタッフを雇った。融通性があって廉価なオープンソース代案に悩まされたが、オープンソース開発モデルと哲学を理解した。オープンソース・プラットホームで起こる問題にも直面した。時には新しいシステムのコードでアクセスするためソフトウエアの特性を会社の需要に合わせて変更することもあった。

これらwebポータルのような多くのe−ビジネスが、同様の問題を抱えているが、オープンソース技術の統合やオープンソースプラットホーム導入の技術経験に欠けている。これらはベンダーや顧客が容易に使えるwebサイトを望んでいる。彼らは24/7利用可能で毎日数千の取引に衝突やデータ喪失のないデータベース起動アプリケーションを必要とする。商品購買客のため常に便利に働き、代金回収の確実なサイトを望んでいる。その役目にデータベース・アプリケーションは非常に重要なので、有名な著作権システムなら信頼に足ると思って採用する。だが費用が掛かり過ぎるのと、予測不能の事故のたえ、次第にオープンソース技術に興味を示し始めた。

それでもこれらビジネスはオープンソースを疑っている。著作権に慣れているので、良いソフトウエアが否ターネットから無料でダウンロード出来る理由が分からない。これらアプリケーションが会社所有でないのが疑いと懸念の原因だ。誰の所有でもないなら、不確実で信頼が置けず、サポートもサービスも受けられない。それに数千の独立デベロッパが世界中で協力しているとの考えが、さらに経営者を惑わせ結果を信じるのをためらわせる。

これらビジネスは次第に、金儲けにならぬがソフトウエアを効率よく作成するオープンソース開発モデルにつき判りはじめた。各オープンソース・アプリケーションの開発過程は違うけれども、最良のプロジェクトが最高技術者の世界を引き付ける。これら組織的実力社会が厳格な試験と急速な開発を促進しバグとセキュリティ欠陥が少なく特性改良の発表が多いことが明らかになりつつある。

WDN とGeoCommunityのようなe−ビジネスの多くがビジネスをオープンソースプラットホームで構築しつつある。これらwebポータルは、ソフトウエアの開発速度の速さ、低価格、改造の容易さが、高成長で変化の早い業界に理想的と思っている。単独では数千ドルの使用料を負担しなければならない中小企業に、低価格は魅力的である。

別の重要な長所はコードがオープンなので改造出来ることである。熟練技術者にソースコードが入手出来ることがソフトウエア開発を迅速にするとの考えに基づく。Apache、Linux、PostgreSQL などは、協力の精神で進歩した。同様に、オープンソースを採用する企業は、迅速な開発と内部コードへの無料アクセスの利点を享受して、必要に応じ修正出来る。オープンソース技術を使う会社はソフトウエアを、企業の発展に合わせて迅速に改良出来る。

オープンソースを使おう

オープンソース・ソフトウエアに専門的サポートのないことがビジネスや産業への普及の障害になっている。経営者は問題が起こったときサービスセンターを呼びたがる。過去には、オープンソース・アプリケーションで問題を生じたらe−メールを送って普通1時間以内にデベロッパ自身から正しい解決策を受け取った。このような技術サポートの非公式ネットワークは最高のサポートを与えるが、常に利用出来るわけではないし、需要が増えるのに対応出来る訳でもない。

技術サポートの問題はWDN とGeoCommunity にとっても重要問題であった。そこで、そのwebサイトから何時でも直接援助の得られる強力な開発社会のあるアプリケーションを選んだ。技術スタッフは、社内技術スタッフがいないともっと広範なサポートを必要とすると認める。これは経営者を脅えさせ続ける一つの問題だ。

基本的に、企業は常に真空を満たそうとする。Red HatはLinuxオープンソースシステムの支援を提供した最初の会社だが、今や多くの会社が最良のオープンソース・データベース・アプリケーションに支援を提供しており、支援の問題は急速に解決しつつある。

これは良い傾向だ

ところで、WDN とGeoCommunityは、オープンソース採用決定とそれに伴う、信頼性、エラー報告、共同体支援、明確な設計、業界基準への厳格な一致に満足している。付帯して、将来他の製品への移植を禁止する「ロックイン」や著作権フックがないのも新鮮である。上級経営者は言う「需要に応じる以外の条件無しで設計された製品を使う真の自由化経験だった」


Copyright © 2001, Ned Lilly.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 65 of Linux Gazette, April 2001
 
 
 

外からマイコンピュータを見出す

By Mark Nielsen

緒言

この記事の目的は家にあるコンピュータを、仕事などで旅行中に見出せるようにすることである。家のコンピュータは Ricochet モデモを使っている。DSL接続と衛星接続に加入したが色々問題があってダイアルアップ接続に戻った。
スタチックDSLでは、ダイアルアップの度にipが変わるとの問題がある。sshを使ってファイルを1時間毎にリモートWebサーバーに送る方法を考えた。

Ssh の設定.

sshはージョン1.2.27を利用した。OpenSSHを使用すべきだが、市販sshを使った。
ホーム・コンピュータからリモート・コンピュータに安全にファイルを転送ため ssh-keygen プログラムを使用する。sshマニュアルの文章を下記する。
Ssh は RSA 認証プロトコルを自動的に実行する。ユーザーはssh-keygen(1)を走らせてRSAキイ対を作る。これは、秘密キイをユーザーのホームディレクトリの .ssh/identity に、公開キイを.ssh/identity.pub に記憶する。次いで、identity.pub をリモートマシン上のホームディレクトリにある.ssh/authorized_keys にコピイしなない(authorized_keys ファイルは在来の .rhosts ファイルに相当し、行毎に一つのキイを有するが、行は長くて構わない)。その後、ユーザーはパスワード無しでログイン出来る。RSA認証はrhosts認証より安全である。
そこで、家のコンピュータからユーザーとして "ssh-keygen" を走らせる。次いで家のコンピュータにある ".ssh/identity.pub" ファイルをリモートコンピュータに、リモート・コンピュータ上のユーザー "web1" のための".ssh/authorized_keys"として転送する。これでホームコンピュータからリモートコンピュータにパスワード無しでログイン出来る。これはファイル転送にも使うことが出来る。


rsync -e ssh -av /home/test1/IP.txt web1@somecomputer.com:public_html/IP.txt




 


IP アドレスをアップロードする Perl スクリプト

以下はipアドレスをアップロードするPerlスクリプトである。ユーザー名とリモートコンピュータアドレスを変更しなければならない [Text version of this script.]


#!/usr/bin/perl


use strict;


  ### ifconfig を走らせてデータを @Temp listに記憶. 


my @Temp = `/sbin/ifconfig`;


  #### pppを検索


my $Search = "ppp";


  ### イーサネットカードのipアドレスを探すのであれば


  ### 次の行は入れない;


# $Search = "eth0";


  ### 先ずipアドレスが空白であると見出す行を作る


my $Match_Line = "";


my $Match_Device = "no";


  ## 行を検索、整合したら、空白行を見出すまで行をセーブする


foreach my $Line (@Temp)


  {


    ### 整合したら, abort. 


  if ($Match_Line ne "")   {@Temp = ();}


    ### でなければ、行頭に整合を見出すことが出来るかを見る;


  elsif ($Line =~ /^$Search/) {$Match_Device = "yes";}


    ### でなければ、デバイスを見出し、探す行を見出したとき


  elsif (($Match_Device eq "yes") && ($Line =~ /^ +inet/)) 


    {$Match_Line = $Line;}  


  }


  ## $Match_Line が空白でないとき、分割してipアドレスを得る.


my $IP = "";


if ($Match_Line ne "") 


   {


    ### アドレス前の詰め物を除く:


   my ($Junk,$Good) = split(/addr\:/, $Match_Line,2);


    ### 第一スペース後の詰め物を除く


   my ($Good,$Junk) = split(/ /, $Good,2);


   $IP = $Good;


   }


  ## I$IPが空白で無いとき、何かがある。ファイルにセーブして


  ## リモートサイトにファイルを転送. 


  ### このファイルの記憶には /tmp ではなく別の位置を使うこと.


if ($IP ne "")


  {  


  open(FILE,">/tmp/IP.txt");


  print FILE "$IP\n";


  close FILE;


  system ('rsync -av -e ssh /tmp/IP.txt web1@somecomputer.com:public_html/IP.txt');


  }


   ### でなければ、e−メールで送るか別のことをして


   ### 働かない訳を知る。これは試験問題として残す.


else {}




 


リモート・コンピュータ上の Webpage と perl スクリプト.

ipアドレスを記憶しているリモートコンピュータ上で、1時間経過を判定し、1時間以下ならエラーメッセージをプリントする必要がある。"/home/web1/public_html/IP.pl"の名前のPerlスクリプトを用いる。 [Text version of this listing.]


#!/usr/bin/perl


use strict;


print "Content-type: text/html\n\n\n\n";


my $File = "/home/web1/public_html/IP.txt";


open(FILE,"/home/web1/public_html/IP.txt");


my $Line = <FILE>;


chomp $Line;


close FILE;


my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,


   $atime,$mtime,$ctime,$blksize,$blocks)


     = stat($File);


my $time = time();


print "<br> Last known ip address was $Line\n";


print qq(<br> To transfer to the website, 


     <a href="http://$Line">click here</a>\n);


my $Diff = $time - $mtime;


if ($Diff > 4000) 


  {


  print "<p>ERROR: The ip address should have been updated once an hour, 


  but 4000 seconds has past since the last update.


  <br> $time - $mtime = $Diff \n";


  }


このPerlスクリプトを自分のWebサーバーのcgi-bin ディレクトリに写すことを考えるかも知れない。でなくて、Perlスクリプトユーザーのディレクトリから走らせると大変危険だ!Webサーバーが誰でもPerlスクリプトを実行出来るようになっていると、Webサーバー上で誰でもやりたいことが出来る。

そのためにはWebサーバー上でPerlスクリプトを実行することが出来る。



<Directory /home/*/public_html>


   ## Options All は他の幾つかのオプションと共に冗長である. 


    Options All Indexes FollowSymLinks MultiViews ExecCGI Includes 


    AllowOverride All


    Order allow,deny


    Allow from all


</Directory>


   #### これは幾つかの perl apache モジュールを必要とする


 <Files *.pl>


 SetHandler perl-script


 PerlHandler Apache::OutputChain Apache::SSIChain Apache::Registry 


 PerlSendHeader On


 Options ExecCGI


 </Files>


夜間走らせるためのクロン・エントリ

"crontab -e"コマンドを用いてリモート・サーバー上のcrontab にこれを置く。


#/bin/sh


  ### 2時間毎にダウンロード


1 * * * *   /www/Cron/Remote_Website.pl >> /www/Cron/out  2>&1  


まとめ

同じことが別の方法でも出来る。ファイルが安全に転送されるので筆者はこの方法が好きだ。インターネットで何を送っているか判らないので、誰もファイルを入手出来ない。ipアドレスを表示するwebpageはパスワードで保護しなければならない。

参考

1.ssh
2.OpenSSH
3.Apache
4この記事に変更があれば http://www.gnujobs.com/Articles/17/Remote_Website.html
 
Copyright © 2001, Mark Nielsen.
Copying license http://www.linuxgazette.com/copying.html
Published in Iss