Linux Gazette 3月投稿記事
03/01/2004 - 09:18 Automation of Tasks in the *nix Environment by David Dorgan
03/01/2004 - 20:22 IPv6-Transport Relay Translator by P. Shanmugaraja
03/02/2004 - 16:59 Using your C code in the Mono platform with P/Invoke by Carlos Unserkonig
03/03/2004 - 23:32 Two dozen questions to get you started in PERL by Arun Mahadevan
03/04/2004 - 12:48 Using Afick To Aid In Intrusion Detection by Rick Nicholas
03/08/2004 - 00:14 IPv6 transition-6to4 tunneling by P. Joy Shyam and D. Balamurugan
03/08/2004 - 15:27 Cutting down your workload with cluster ssh. by david
03/16/2004 - 17:55 Easy gaim 0.75 Install for SuSE 9.0 by Willy Smith
03/17/2004 - 14:38 Keeping Fedora Up to Date with Yum by rnicholas
03/19/2004 - 05:15 A primer on NUMA (Non-Uniform Memory Access) by asmyalinux
03/24/2004 - 14:19 Command Line Essentials by pixelbeat
投稿David Dorgan:2004年3月1日 - 09:18. 記事|システム管理
これはUnixにおける管理自動化に対する基本的てびき指針である。
毎日又は毎週同じ事を繰り返すのであれば、自動化を考えると良い。毎日、毎週すること全部を自動化出来ない理由はない。実用的で有用な例を少し示すので、これを変更すれば殆どのタスクに利用することが出来る。
1.crontab を使って夜間にシェルスクリプトを実行。
2.sshとkeyを用いるネットワークアクセス自動化。
3.夜間の mysql データベースバックアップ。
4.リアルタイムイベントに基づく遠隔処置の実施。
これから説明することが、自分のサイトセキュリティ方針に反するかも知れないことに注意されたい。だが、そのリスク管理は限られたネットワークタスクを考慮に入れていることに注意するのも価値がある。.
1.crontab を使って夜間にシェルスクリプトを実行
月/日/時間/分の一定時刻にタスクを実行するのは、普通にある状況だ。crontabフォーマットは極めて簡単で次のように入力する。
01 1 * * * /bin/sh /home/davidd/bin/somescript.sh
が /home/davidd/bin/somescript.sh を毎晩 1:01 に実行する。
最初のフォーマットは(分時日月曜日(0=日曜))である。私は普通、殆どのことをスクリプトで呼出すので、crontabを変更することなく何かを追加することが出来るし、結果を全部自分にメールする。自動化タスクには便利で、毎朝出力を見られるより良い。
2.sshとkeyキイを用いるネットワークアクセス自動化
利用可能な最良のツールの一つは、sshとブランクkeyを用いるロールアカウントの使用である。このユーザの持つアクセスには大いに注意しなければならないが、これは大変有用なロールで、遠隔からファイルをコピイし、遠隔コマンドを容易に実行することが出来る。短く言うと、_backup( _は人が使わないシステムアカウントに普通使っているからである)と言う名のユーザを作ることを薦める。ユーザを追加したら、su - backup でssh-keygen -t dsaを走らせ、セーブするディレクトリを聞かれたときは、enterを押すだけだ。パスフレーズを聞かれたときも、enterを押すだけで、パスフレーズは何も入れない。すると、ユーザホームディレクトリのsshディレクトリにkeyが与えられる筈だ。ユーザホームディレクトリ上で chmod 700 を走らせて、システム上のユーザが誰もそれに含まれるファイルを読むことが出来ないようにすることを勧める。
ここで、ファイルをhostaからhostbに完全な自動化でコピイすることを考える。これら次のステップは、交信したいすべてのマシンに追加しなければならない。ここでhostbに _backupと言う名のユーザを追加し su - backup ; mkdir .ssh をおこなう。これは公開キイを追加することの出来るsshディレクトリを作る。これを終わったら、hostaからscp .ssh/id_rsa.pub hostb:~/.ssh/authorized_keysを走らせる。ここで、hostaからssh hostbとタイプすると、hostbの指紋を受領するので、パスワードを聞かれないでログインされる。ここではkeyが受領されて記憶されるのでパスワードを聞かれることなくssh又はscpをすることが出来る。今は、コマンドをhostaからのみ走らせることが出来るのに注意されたい。他のマシン全部は、秘密キイ(これは.ssh/id_rsa)でなく公開キイを有する。
これを別のホストから始めることが出来るためには、 .ssh/id_rsa を別のサーバにコピイする必要はない。(ファイルのコピイのため)scp及び(遠隔マシン上でコマンドを実行しttyに結果を戻すため)sshをすることが出来るので、バックアップの目的でこれを実用にするため、次のセッションに移動しなければならない。
3.夜間の mysql データベースバックアップ
この章では、別の二つから知識を引き出す。cronと言うシェルスクリプトを用い、ネットワーク通信用のキイと共にsshを用いる。先ず、スクリプトに何を置くかを知らなければならない。このバックアップには主要なステップ二つがある。始めるデータベースをダンプして、次にこれを遠隔マシンにコピイすること、及び勿論、最後の仕事は管理チームに結果を報告することだ。
mysql データベースをダンプするには、mysqldumpコマンドを用いることが出来る。ここでこれを全面的に自動化するため、1)データベース上のユーザ名のためパスワードを使用しない又は、2)パスワードを平文でシェルスクリプトに入れ、バックアップディレクトリが700であることを覚える。mysql では、データベースへのアクセスを選んだだけのユーザを追加する方法を読者が知っていると仮定するので、誰かがこのパスワードを見付けても、データを壊すことは出来ないで、データベースをそのまま読取るだけだ。ユーザ名がfoobackupで、パスワードがfoopassのfooと言うデータベース一つをダンプしたいときは、mysqldump -u foobackup --password="foopassword" foo > foo-database を走らせる。
コピイをするとき、mysqldump -u foobackup --password="foopassword" foo > ~/foodb/foo`date +%d%m%yなどとすると、これはマシン上でFoodbと言うディレクトリにはバックアップを置き、ファイル名はfoo-011203 (2003年12月1日)などとなる。
これを終わったら、ファイルをコピイする必要があるので、もう一度、人手で/usr/bin/scp /home/backup/foodb/foo`date +%d%m%y` hostb:~/foodb/をして見る。これはファイルをディレクトリ~/foodb/にあるhostbに置く。これがコマンド行で働くことが分かったので、次に基本スクリプトを考える。
#!/bin/sh
echo 'backing up d/b locally'
mysqldump -u foobackup --password="foopassword" foo > ~/foodb/foo`date +%d%m%y`
echo 'copying to hostb'
scp /home/backup/foodb/foo`date +%d%m%y` hostb:~/foodb/
これを、 /home/backup/の中の foobackup.shと言うような名のファイルにセーブして、crontab -e を実行し、毎晩午前1時に走らせたいときは、
0 1 * * * /bin/sh /home/backup/foo.sh
とすると、毎晩のバックアップが自動化される。
4.リアルタイムイベントに基づく遠隔処置の実施
この例のため、apacheが到着したか否かをチェックし、到着していれば記憶する簡単な例を考える。ここでもその処置をするのに最低の優先度で働かせる。この場合はそれ自体のユーザ,sshキイ、御yびsudoを使うことを意味する。この場合pytonスクリプトを用いてウエブサーバのポート80に接続するだけで、それが働いていないときは、サービスを開始する。これはソケットに基づく遠隔マシン上で活動をする基本で、これは多くの場合に適用することができる。そこで、最初の最初に、環境がある。バックアップユーザを使用するときは、hostaでスクリプトを実行しウエブサーバがhostbの上にあると、この段階で設定しなければならないことのすべては、hostb上のsudoで、キイの設定についても上と殆ど同じステップである。.
バックアップユーザがapachectlを実行出来るようにするには、backup souken = NOPASSWD: /usr/sbin/apachectを/etc/sudoersの中に入れる。これで、バックアップユーザが、パスワードを聞かれることなく、apachectlコマンドをルートとしてを実行出来るようなる。注記:この場合、マシン名はsoukenである。soukenの代わりにhostとタイプしてその値を入れる。この後、これはスクリプトを走らせるだけで、スクリプトがsouken上のポート80に接続しようとし、働かないときは、コマンドsh hostb apachectl restartを実行する。これは、訳の分からない問題が起こらないためだけにstartの代わりにrestartを用いる。基本コードをここに入れる。(実際には、もっと良い場所に入れるし、何もかも構成かのうであるが、自分で考えられる筈だ)
IPv6-Transport Relay Translator
投稿P. Shanmugaraja:2004年3月1日 - 20:22 記事|一般
インターネットにおける最近の発達は、コンピュータ科学の分野で新技術を生み出した。ネットワーク実施における重要開発の一つはIPv6 プロトコルである。IPv6 は、現在使用されているIPv4 の欠点を克服するため1990年代に開発された。IPv4の欠点は、IPアドレスがないこと、著作権IPsec及びDHCPプロトコルを用いるノードのコンフィギュレーションである。これらの欠点を避けて、追加の特徴を含むため、IPv6プロトコルに進む。IPv6プロトコルには、拡張性、大きいアドレス空間、新規ヘッダフォーマット、階層的アドレス決定、及び埋め込みセキュリティなど追加の特徴が幾つかある。一晩でネットワーク全体を変更することは出来ない。IPv6と IPv4が相互運営するまでには時間と費用が掛かる。この課題を達成するため異なる機構がある。それらが Ø Dual stackである。ホストとルータがIPv4 と IPv6双方のスタックを走らせる。
Ø Tunneling:IPv6 パケットがIPv4 ネットワークを通じてトンネルされる。
Ø Translation:ゲートウエイが、IPv6 パケットをIPv4 パケットに翻訳する。
この報告は、翻訳機構の一つTransport Relay Translator (TRT)に焦点を当てる。この報告は、Transport Relay Translatorの運用と設計を規定する。
緒言:
インターネットに入る新しいホストには、IPv6のための機能があるが、IPv6のためだけに構成されていると、別のノードでIPv6能力のあるものとしか連絡することが出来ない。現在インターネットで広く使用されているIPv4ノードとは交信することが出来ない。IPv6のみのネットワークを展開するときでも、IPv4のみのネットワークにアクセスしたい筈だ。このような構成をサポートするため、Transport Relay Translator (TRT)と言うIPv6 対 IPv4翻訳技術の一つが提案された。これは、RFC-3142に基づく。トランスポート層に置かれるトランスレータをトランスポート・リレー・トランスレータと言う。このリレーは、交信ホストの間のどこかに置かれていて、IPv6のみのホストが通信をIPv4のみのホストと交換することが出来るようにする。二つのノードが異なるプロトコルスタックを用いるクライアントとアプリケーションサーバなどであるときは、互いに直接交信することが出来ないので、TRTを通さなければならない。デュアルスタック・ノードで走るTRTは、クライアントと交信するときは一つのプロトコルを用い、アプリケーションサーバと交信するときは別のプロトコルを用いる。
術語:
IPv6 ソースホスト:システムは、IPv6 アドレスを用いて構成されるので、他の IPv6 システムとだけ交信することが出来て、IPv4システムとは交信することが出来ない。ここではTCP/IPv6接続を用いてパケットを送信する。
DNS (ドメイン名システム):IPv6 ホストは、ネームサーバを用いてそのDNSクェリーを解明する。IPv6 が、そのネームサーバにIPv4 のみのホストのIPv6 (AAAA)レコードを要求すると、そのホストにはIPv6 アドレスが無いとのエラー応答の代わりに、IPv4アドレス(A)から特に構築される IPv6アドレスを、DNSから受け取る。構築されるアドレスは、トランスポート・リレーと遠隔ホストのIPv4 アドレスを埋め込むホストid(下位64ビット)に結合する特殊ネットワーク局番を含む。小規模設備には静的マッピングを推奨するが、大規模施設には特殊DNSサーバが必要である。
ルータ:ルータは、特殊ネットワーク局番のあるアドレス向けのパケットはTRTリレーノードにローとされるように設定する。
TRT:TRTは、IPv6 アドレスからIPv4 アドレスへの転換を行い、宛先ホストとTCP/IPv4接続をする。ルータはパケットをTRTにルートする。そのときTRTがトランスポートセッションに介入し、クライアント・ノードに向かってはIPv6セッションの宛先端末として働き、サーバ・ノードに向かってはIPv4セッションのソースとして働いて、お互いのセッションから受け取るデータを相手方に対してコピイする。
IPv4 宛先ホスト:このシステムは、IPv4アドレスを用いて構成されるので、他の IPv4 システムとだけ交信することが出来て、IPv6システムとは交信することが出来ない。
機能的アーキテクチャ:
これまでTransport Relay Translator全体を説明したが、TRTの実際の機能は説明していない。TRTは TCP/IPv6 パケットから TCP/IPv4パケットへの転換を行う。
IPC作成:これは、これはメッセージキューとセマホアを作る。メッセージキューを使ってメッセージを次のプロセスに送る。セマホアを使ってメッセージキューに対するアクセスを同期させる。
スレッド作成:スレッドを二つ作る。一つはTCP/IPv6接続を扱い、他はTCP/IPv4接続を扱う。
IPv6パケット受信:ソースホストからのパケット受信に用いる。ソケットを用いて接続を扱う。アドレスとデータは両方共、構造体に書き込まれてメッセージキューに送られる。
IPV6 サーバ:ここでIPv6サーバプログラムが走る。
IPV4 サーバ:ここでIPv6サーバプログラムが走る。
GET_FROM_MSGQUEUE:構造体をメッセージキューから受け取る。記憶されるデータとアドレスを構造体から復元してパケットを構成し、それをIPv4宛先ホストに送る。
SEND THE PACKET:パケット構成の後、IPv4アドレスを用いてIPv4宛先ホストに送る。ソケットAPIを利用する。
既存システム FAITH: FAITHは IPv6対IPv4のTCP リレーなので、TRT仕様の一部だけを実行する。TCPリレーを、丁度ファイアウォール指向ゲートウエイのいずれかのように、IPv6 と IPv4の間でアドレス翻訳と共に、実行する。IPv6ノードから開始されるTCP接続は、IPv4ノードに向かってリレーされる。FAITHは、反対方向にリレーすることが出来ない。リレーを実行するのに、FAITHデーモンはローカルIPv6 サイトと外のIPv4ネットワークとの間のデュアルスタックルータ上で実行する必要がある。このデーモンはTCPサービス(TCPポート番号)毎に呼び出される。
Ø UDP は、Portable Transport Relay Translator Daemon (pTRTd)がサポートしていない。pTRTdは、KAMEプロジェクトで実行するFAITHパケージと同じく、IPv6ホストがRFC 3142の規定するIPv4 ホストと交信する方法を提供する。しかし、FAITHと異なり、kernel IPv6スタックで特殊サポートに依存しないので、ほとんどのUnix類似OSに移植するのが相当用意である。
Ø:Ø UDPのサポートするNAT疎遠プロトコル(FTP とH.323)では働かない。
提案システム:提案するTRTプロジェクトはNAT 疎遠プロトコルやUDPなど現存システムの欠点を幾つか克服する。
参考資料:
1. J. 萩野, K.山本, RFC-3142, “Transport Relay Translator”, 2001.
2. Joseph Davies, “Understanding IPv6”, Microsoft publications, 2000.
3. “IEEE Internet Computing Magazine” May-June 2003.
4. W. Richard Stevens, “Unix Network Programming, volume-I”, PHI, 2002.
5. W. Richard Stevens, “Unix Network Programming, volume-II”, PHI, 2002.
6. Hain, T., RFC-2993, “Architectural Implications of NAT”, 2000.
7. Foruzan, Behrouz, “(TCP/IP) Protocol suite”, TMH, 2000.
8. K. Egevang, P. Francis, RFC 1631 “The IP network Address Translator (NAT)”, May 1994.
P/Invoke付きMonoプラットホームにおける
Cコードの使用
投稿Carlos Unserkonig:2004年3月2日 - 16:59 記事|一般
P/Invoke とは "Platform Invocation Facility"(プラットホーム呼出機能)の意味で、これによりMono世界から管理されていないコード(Monoの外界でコンパイルされるコード)にアクセスすることが出来る。この記事では、C#を用いるMonoアプリケーションでCコードを用いてそれを使う方法を示す。C# とMono プラットホームの基本使用は大変役に立つ。Monoについてご存じなければ、先ず
Mono Handbook を参照すると良い。。
1. P/Invoke入門
先ず最初に、次の簡単な(役立たない) C# コードがあることを述べる:
//
// P/Invoke Example
//
using System;
public class Tester
{
public static void Main ()
{
}
}
ご覧の通り、これは何もしない。このコードを使って何か役立つことをさせるのが、我々の仕事だ。
第一ステップは、次を追加することだ。
using System.Runtime.InteropServices;
そこで、このnamespace内部のtypeを使用することが出来る。それにより外部コードにアクセスすることが出来る。namespaceを知らない人のため説明すると、これは一連のtypeその他の中身が含まれるブロックで、javaパケージに良く似ている。この行は、C/C++ における#include又はJavaにおけるimportに似ている。
次に、我々のTesterクラスの中でstatic extern メソッドを定義する。このように宣言しなければならない理由は、これがexternエレメントを使わせるP/Invokeの方法で、staticでなければならないからだ(したがって、クラスのインスタントなしでアクセスすることが出来る)。この二つの修飾子なしでメソッドを宣言すると、エラーになる。
この記事の目的のためsrqtファンクションmath共有ライブラリ(lmath.so)から使う積もりなので、二つのことを行ってそのファンクションをロードしなければならない。先ず、述べたファンクションの署名を覚える。
double sqrt (double x);
次いで、コードにDllImport属性を付け加える(属性の意味が分からなくても構わない、後で説明する)。
[DllImport ("lmath")]
事実、これらの行で「このファンクションを共有ライブラリからロードしたいことをruntimeに告げよ」と命令している。
次に、属性の前と後で規定するようにファンクション定義(実際はその署名だけ)を追加する:
static extern double sqrt (double element);
double return とdouble type に、特に注意されたい。これらは元のCコードで規定されるtupeである(次の章で、この働きが分かる)。)
追加したこの2行により、そのファンクション ( sqrt () )にアクセスすることが出来る。だからMain () で sqrtファンクションの用途を示す:
Console.WriteLine("The square root of {0} is {1}.", 225.0, sqrt(225.0) );
ここまでで、コード全体は次のようになっている筈だ:
//
// P/Invoke Example
//
using System;
using System.Runtime.InteropServices;
public class Tester
{
[DllImport("libm")]
static extern double sqrt ( double element );
public static void Main ()
{
Console.WriteLine("The square root of 225.0 is {0}.", sqrt(225.0));
}
}
先に進んでコンパイルしよう。
mcs pinvoke.cs
エラー・メッセージが出なければ、成功だ。出たら元に戻ってコードを見直す。最後に次を用いて実行する:
mono pinvoke.cs
次の行が出る筈だ:
The square root of 225.0 is 15.
2. 若干の理論
最初にアーギュメントを説明する。属性とは、データをデータに結合するための機構と定義されている。あらゆるアプリケーションには、コード、データ及びメタデータがある。メタデータはデータに関する情報、つまりデータに付いてのデータに過ぎない。最も普通のデータは、データ型、構造定義、などである。このメタデータは、環境が使用し、通常mcsコンパイラ(勿論C#で)により作られる。しかし、属性は追加メタデータをアプリケーションのエレメントに付け加える方法だ。殆どの時間、メタデータはこのような異なる目的、又は各種タスクをするためメタデータを用いさせるReflectionと言うルーチンのため、使用される。
属性を働かせる方法は:
[NameOfTheAttribute(positional arguments, named arguments)]
Target-of-the-attribute
事実、属性は、システム属性クラス(属性スーパークラス)から導き出されるクラスである。また、クラスとして、数個の引数を受けるコンストラクタを持つことが出来る。これらの引数はPositionalと呼ばれる。定義順にコンストラクタの中に渡さなければならないからだ。その他、Namedは、任意選択の引数で、属性クラスの中でプロパティ又はパブリック・フィールドとして実行される。属性のターゲットは、アセンブリ、クラス、メソッド、フィールドなど、データに結合したいエレメントである。ターゲットでは幾つかの属性に特別の注意を払うだけで良い。属性全部が可能な全てのターゲットに働く訳ではないからである。属性の中にはメソッドなどに働くものもあるがdelegateには働かない。
DllImport属性を解析すると、属性についてもう少し分かって、P/Invoke機構を理解し始める。DllImport属性は、外部ファンクションをロード/使用することを環境に告げるメタデータを付け加える。先ず最初に、次のDllImport属性定義を見られたい:
[DllImport("libm"), EntryPoint="sqrt", ExactSpelling=false, CharSet=CharSet.Ansi]
太文字を見られたい。これがNamed属性と呼ぶものだ。これらは余分なオプションとして渡され、特別の順序である必要はないからだ。例えば、EntryPoint引数をDllImport定義の最後に置くことが出来る。共有ライブラリの名として渡される文字列はpositionalなものであることを忘れないこと。
ここでDllImportが働く理由を深く解析する。先ず、Mono コード内部のコンストラクタをチェックする:
public DllImport ( string dllName )
だから、これは文字列を共有ライブラリの名として受け取ることが出来ると言っている。私はWindows上の動的リンクライブラリ(DLL)とUnix世界の共有ライブラリを指している。この種にライブラリは、それを必要とアプリケーション毎に貼り付ける必要がなくて、アプリケーションにロードすることが出来るものである。例えば、UNIXシステムの中の自分の /libディレクトリに行くと、沢山の .so ファイルがある。これらは共有ライブラリと呼ばれるもので、アプリケーションをコンパイルするときリンクされ、ランタイムではそのライブラリ内部の各ルーチンを呼出すだけである。ライブラリを名称だけで渡すことが出来る。
二番目の場所に、普通に渡される方法で Named ar引数がある:
NameOfNamedArg = value
DllImportクラスの中に、これらnamed引数がる(もっとあるが、これが最も使用される):
| 名称 |
型 |
値 |
説明 |
CharSet
|
CharSet Enum |
Ansi, Unicode, Auto |
Mono Runtimeに渡すとき文字列引数とメソッド名を変更する方法を示す。規定値はAnsi. |
EntryPoint
|
文字列
|
ファンクション名
|
共有ライブラリに含まれるファンクション名を示す(これはファンクション名だけ)。元の名と異なるエキスポート済みメソッドを使うときだけ使用する。このパラメータを渡さないと、P/Invokeはターゲットのメソッドの定義で規定する名称でファンクションをロードしようとするからだ。 |
ExactSpelling
|
Boolean
|
true/false
|
非取扱ライブラリにあるエントリポイントが修正されてCharSet fieldに対応しているか否か。 |
SetLastError
|
Boolean
|
true/false
|
trueであるときは、GetLastErrorメソッドを呼出して、エキスポート済みメソッド呼出にエラーがあるか否かをチェックすることが出来る。 |
最後にDllImport 属性クラスについて、これはDllImport.csで定義されるように、target型だけを有することを言はなければならない:
[AttributeUsage (AttributeTargets.Method)]
これは、メソッドがこの属性のためtargetとして利用出来ることを意味する。これを(プロパティなど)別のエレメントに適用すると、エラーメッセージが出る。
DllImport属性クラスの部分を幾つか説明した。ここで
static extern type function_name ( type arg1, type arg2, ... )
をロードするため、ファンクションの定義を追跡する必要がある。
static とexternの修飾子が必要なことに注意。staticにより、これをstaticクラスメンバーとして使うことが出来る。externにより、「これは非管理コードファンクションである」と言っている。これで完璧だ。唯一の問題は、MonoでどのC型がサポートされているかを知る方法だ。型の幾つか(基本的な型)はMono環境の中で定義されているので、心配はない。このプロセス(認識されるデータ型の転換)をmarshalingと言う。基本的な型の同等物の幾つかを見よう:
|
|
| C 型 |
Mono クラス |
C# 型 |
| void * |
System.IntPtr |
IntPtr |
| byte |
System.Byte |
byte |
| short |
System.Int16 |
short |
| unsigned short |
System.UInt16 |
ushort |
| int |
System.Int32 |
int |
| unsigned int |
System.UInt32 |
uint |
| long |
System.Int64 |
long |
| unsigned long |
System.UInt64 |
ulong |
| char |
System.Char |
char |
char *
|
System.String/System.Text.StringBuilder |
string/StringBuilder
|
| float |
System.Single |
float |
|
プラットホーム呼出機能は、非管理コードファンクションをロードするためDllImport属性の助けを必要とする。この属性は、非管理コードその他興味ある中身へのアクセスが出来る型を含むSystem.Runtime.InteropServiceに見出される。
3. 練習
理論は十分だ。小さい実例に進もう。ここで別のファンクションをインクルードし、DllImport属性の最も頻繁に使用されるEntryPointプロパティを用いる。またlibc共有ライブラリからchar * getenv (const char * )ファンクションをインクルードする。上の表に基づいて、char*型をstringに変更する。StringBuilderクラスはダイナミックストリングに働くもので、今はその場合でないからだ(用いることは出来る)。
前述のように、別のファンクションをインクルードする。EntryPointプロパティを使用するとき非管理ファンクションの名を変更することが出来る。また、例の一部としてユーザ名を入手してそれをプリントする。
using System;
using System.Runtime.InteropServices;
public class PInvokeTester {
//
// Load the sqrt () function from libm
//
[DllImport ("libm", EntryPoint="sqrt")]
static extern double Square (double element);
//
// Load the pow () function from libm
//
[DllImport ("libm")]
static extern double pow (double x, double y);
//
// Load the ceil () function from libm
//
[DllImport ("libm")]
static extern double ceil (double x);
//
// Load the floor () function from libm
//
[DllImport ("libm", EntryPoint="floor")]
static extern double Floor (double x);
//
// Load the getenv () function from libc
//
[DllImport ("libc")]
static extern string getenv (string var);
public static void Main ()
{
string user = "USER";
double root = 225.0;
double x = 5.0;
double y = 5;
double n = 1.6;
Console.WriteLine ("\tHi {0} ! \n", getenv (user));
Console.WriteLine ("\tsqrt ({0}) = {1}", root, Square (root));
Console.WriteLine ("\tpow ({0}, {1}) = {2}", x, y, pow (x, y));
Console.WriteLine ("\tceil ({0}) = {1}", n, ceil (n));
Console.WriteLine ("\tfloor ({0}) = {1}", n, Floor (n));
}
}
この例は、以下をプリントする筈だ(全くこの通りではないかも知れない):
[zero@NOWHERE c-sharp]$ mono pinvoke.exe
Hi zero !
sqrt (225) = 15
pow (5, 5) = 3125
ceil (1.6) = 2
floor (1.6) = 1
[zero@NOWHERE c-sharp]$
今日はこれでお終いだ。C言語の非管理コード(Mono環境で構築されていないコード)を働かせるため、Monoプラットホームで利用出来るP/Invokeを紹介した。このルーチンは、Gtk+-2.0ライブラリセットの構築に用いられたので、如何に強力かが理解されるであろう(但し、少々の欠陥はある)。
次の章では、P/Invoke機構とその使用法、並びにstructとIntPtの使用法をもっと詳しく説明する。
参考資料
・Mono Handbook:Mono プロジェクトの現状ドキュメンテーション
http://www.go-mono.com/tutorial
・Mono Documentation :API 参考資料及びその他の興味ある内容
・Everything you ever wanted to know about Marshaling. :p/invokeの内部と marshaling機構に関する優れた文書。Jonathan Pryor著。 Mono Handbookにも含まれている。
http://www.jprl.com/~jon/interop.html
投稿Arun Mahadevan:2004年3月3日 - 23:32 記事|一般|Linux用法
これらの疑問はPrerl記者会見で実際にあった質問を集めたものである。質問はPrelを始めようとする人に役立つよう整理した。
* Perl スクリプトの1行目は何か ?
Perl スクリプトの1行目は、Perl実行可能プログラムに対するパスを示す。
Eg. #!/usr/bin/perl
この行は、スクリプトを実際に走らせるため使うプログラムをUNIXに告げる。これはPerlインタープリータに対する実際のパスに一致しなければならない。
* Perl呼出中に何か引数/スイッチを渡すのか?Perl呼出中に用いたすべての引数/スイッチは何で、各々にどんな意味があるのか?
イエス、Perl呼出中に引数/スイッチを渡す。
例えば " #!/usr/bin/perl -w " はPerl を中断して、警告メッセージをオンにする。
重要な引数/スイッチには次が含まれる:
-c は、シンタクスだけをチェックする。(BEGIN及びEND ブロックを走らせる)
-d は、デバッガの下でスクリプトを走らせる。
-P は、コンパイルの前にCプロセッサを通じてスクリプト走らせる。
-w は、スクリプトのコンパイルのため警告メッセージをオンにする。
"perldoc perlrun" 又は "man perlrun" を走らせると、引数の完全リストを含むマニュアルが示される。
* Perlにおいて初期化されない変数の値は何か ?
Perlにおいて初期化されない変数の値はゼロである。
* Perlにおける変数の各種の型は何か ?
Perlには、変数の型三つがある。それらは:.
i) Scalars(スカラー)
ii) Arrays(アレー)
iii) Hashes(ハッシュ)
* スカラー変数とは?
スカラー変数は、単一の値だけを取る。スカラー変数は数値、文字列又は参照番号を保持することが出来る。
スカラーは、整数の前に '$' を付けてアクセスする。
* これはどんな値を記憶することが出来るか ?
スカラー変数は数値、文字列又は参照を保持することが出来る。
例えば、
$count = 10; # 数値
$message = "Hello World"; # 文字列
$ref = \@arr; # $ref はアレー 'arr' への参照
* アレーとは ?
Perlアレーは、スカラーの規則正しい集合である。アレー変数名はアット記号(@)で始まる。
アレーの中の要素は、同じ型である必要はない。
例えば、 @array = (1, 2, "hello");
Cと同様に、角括弧 [ ]を用いて要素をあらわす。したがって $a[6] はアレー @aの中のインデクス6にある要素である。Cのように、あれーインデクスは0から始まる。、
* ハッシュとは ?
ハッシュ即ち「結合性」アレーは、埋込キイ/値データ構造体である。ハッシュアレーは、キイに関する値を極めて迅速に見出すため最適化される。ハッシュアレー変数は、パーセント記号 (%) で始まり、中括弧{ }を用いて特定キイのための値にアクセスする。
例えば、
$capital{"Kerala"} = "Trivandrum"
$capital{"TamilNadu"} = "Chennai"
$capital{"Karnataka"} = "Bangalore"
キイ/値の対の間に => 演算子を用いるともっと読み易くなることが多い。
%capital = (
"Kerala" => "Trivandrum",
"TamilNadu" => "Chennai",
"Karnataka" => "Bangalore",
);
$city = $capital{"TamilNadu"}; ## 値"Chennai"を得るにはキイ"TamilNadu"を見よ
* アレーとハッシュの相違は ?
アレーはスカラーの表を記憶するため用いられるが、ハッシュはキイ/値の対を記憶するため用いられる。
アレーは、整数(0からN)で索引するが、ハッシュは文字列で索引する。
またアレーは、要素を参照するのに角括弧を用いる($a[4]など)が、ハッシュは、キイを用いて値を得るため中括弧を用いる( $h{"key"} など)
* ハッシュの中のキイのデータ型は何か ?
ハッシュの中のキイは 'string'(文字列)データ型である。
* ハッシュの中のキイ全部を示す方法は ?
'keys' ファンクションを用いて、ハッシュの中のキイのリストを示すことが出来る。
例えば、
%map = (
red => 0xf00,
green => 0x0f0,
blue => 0x00f,
);
@colors = keys(%map); # 'red', 'green', 'blue'を有するリストを返す
* ハッシュの中の値全部を示す方法は ?
指名ハッシュの値全部を含むリストを返す 'values'ファンクションを用いることが出来る。
例えば
@listofvalues = values(%map);
* ハッシュの中のキイ全部をソートする方法は ?
ハッシュの中のキイをソートするには 'sort'ファンクションを用いることが出来る。
例えば
sort(keys(%map))
は、ハッシュ '%map' の中のキイのソート済みリストを返す。
* 値 2,10,1 などに対するソートの働き方は?また通常の環境で記憶される順序は?
'sort' ファンクションは、通常、要素をリスト語彙でソートする。したがって、値2,10,1のあるリストがあると、ソート後の出力は 1,10,2 となる(10は語彙的に2の前に来るので)。
* ソートが正しく行われ最終結果が1,2,10となるのを確実にするため、問題を克服する方法は ?
要素を数学的順序のリストにソートするには、それをsortファンクションの中で明確に規定しなければならない。
@arr = (1,2,10);
@numerically_sorted_list = sort {$a <=> $b} @arr; # 1,2,10の順でソートする
* アレーの中の要素番号を知る方法は ?
アレーをスカラー文脈で評価することにより要素番号を見出すことが出来る。
例えば、
$len = @arr; # アレー 'arr' の長さをスカラー $lenに割り当てる。
scalar ファンクションを次のように用いて、これを明確に規定することも出来る:
$len = scalar(@arr);
* アレーの最終インデクス値にアクセスする最短の方法は ?
アレーの最終インデクス値には、'$#' を用いてアクセスすることが出来る。
例えば、
@arr = ("abc", "def", "efg" );
$last_index = $#arr; # ここで最終インデクス値は 2
* アレーから最初の要素を示す最短の方法は ? (角括弧[]を用いないで)
'shift' ファンクションを用いて、アレーから最初の要素を示すことが出来る。
例えば
@arr=(2,4,6,8,10);
shift @arr; # アレーを一つ短くして '2' を戻す。アレーは (4,6,8,10)となる。
* 'unshift' とは ?
'unshift' は、'shift' の反対を行う。リストをアレーの前につり下げて、新しいアレーの要素数を返す。
構文は: unshift ARRAY,LIST;
例えば
@arr = (5,6,7,8);
@tmp = (1,2,3,4);
unshift @arr, @tmp; # ここで@arr が (1,2,3,4,5,6,7,8)になる;
* 規定値でメインブロックの中にある値に 'shift' がアクセスする場所は ?
ARRAYを省略すると、'shift' ファンクションは、@_ アレーをシフトする(即ち、サブルーチンに渡される引数のリスト)。
ファイルの範囲内で(プログラムの主流の中で)、何も引数のない 'shift' は、@ARGV (即ちコマンド行引数のリスト)をシフトする。
例えば
#!/usr/bin/perl
$var1 = shift;
print "\nShift1 = $var1"; # 渡される第一コマンド行引数をシフトする
&sub1(100, 200);
sub sub1 {
$var2 = shift;
print "\nShift2 = $var2"; # 引数のリスト(100,200)から100をシフトする
}
* サブルーチンの呼出方法は ? パラメータの渡し方は ?
サブr−ちんは次のように定義することが出来る:
sub hello_world {
print "Hello World\n";
}
このサブルーチンは、メインプログラムから次のように呼び出すことが出来る:
hello_world(); or &hello_world();
パラメータの引渡しは、'C' におけるものと同じである::
例えば、
&sum($a, $b);
* サブルーチン内で渡されれたパラメータにアクセスする方法は ? つまり、何処に記憶されるのか ?
渡されたパラメータには、@_ アレーからアクセスすることが出来る。
例えば
sub sum {
my ($a, $b) = @_; # ローカル変数宣言のため 'my' が使われる.
return ($a + $b);
}
* スカラー変数三つの続くハッシュをサブルーチンに対するパラメータとして渡すと、何が起こるだろうか ?
ハッシュと変数三つが、サブルーチンの中に、@_アレーでの単一の長いリストとして渡される。
ハッシュ値は、リストの中に転換されるので、サブルーチンの中に正しく再生されない。
アレー又はハッシュを含む一つ以上の変数を渡すとき、変数をリファレンスとしてわたすのが良い。
* Perl スクリプトの中でUNIX環境変数にアクセスする方法は ?
Unix環境変数には、Perlの中でhash %ENVからアクセスすることが出来る。
例えば
$sh = $ENV{'SHELL'}; # 環境変数 $SHELLの値を示す
投稿Rick Nicholas:2004年3月4日 - 12:48 記事|ハウツー|セキュリティ
Afick は、侵入検出を助けると同時にシステムも一般統合性監視に役立つ迅速で移植可能のユティリティである。Afickは
Eric Gerbierが書いて、
GNU 一般公開ライセンス下で頒布されている。多数のプラットホームで、バイナリ及びソースフォーマットで利用することが出来る。この記事は、afickのインストールと使用の方法の基本を述べる。
私が最初にAfickを見付けたのは数ヶ月前で、システム上のファイル変更を監視して、変更内容と時期を報告するユティリティを探しているときだった。
Tripwire や
AIDEなど多数のユティリティがそれぞれ長所と短所があったが、Afickが私の好みに合った。人により異なるかも知れない。
この講義は、
Linux の新人やIDS(侵入検出システム)を使う人のためを目的とする。この講義で使用するマシンは
Fedora Core 1を走らせているので、システムに依っては少々の相違があるかも知れない。
IDSには、ポート活動を監視してネットワークからの侵入を検出したり、失敗ログインを探したりなどなど、色々な形があるのは注目に値する。Afick は、マシンのファイルシステムの変化を監視して報告し、変更が予期したものか否かの判断をさせる。これは極めて有用な情報である。もしセキュリティが犯されたと思ったら、変更された場所を知るのは大切で、Afickはこれに役立つ。
最後に、100%効果のあり単一セキュリティ対策はないことを知るのは重要である。各種の互いに補完的なツールの組に基づく階層化防御戦略を用いることが最良の方策であろう。システム/ネットワーク全体のセキュリティはこの講義の範囲を超えるので、ここでは述べない。
Afickにつき少し分かったところで先に進んで、インストールして働きを見よう。
インストレーション -
Afick の最新最大のバージョンは下記でダウンロードすることが出来る:
この講義で使用するバージョンは 1.6-0である。ソースでも.rpmでも好きな方を捕まえる。このボックスではFedoraを使っているので、例として afick-1.6-0.noarch.rpm を用いる。ここからは、rootである必要があるので、Afickをダウンロードしたら、ターミナルウインドウを捕まえてルートに su - する。
$su - <enter>
$password <enter>
ここで、ダウンロード済み .rpm ファイルを次のようにインストールする:
#rpm -ivh afick-1.6-0.noarch.rpm
次のようなものが画面に出る筈だ:
warning: afick-1.6-0.noarch.rpm: V3 DSA signature: NOKEY, key ID cb6fa42a
Preparing... ########################################### [100%]
1:afick ########################################### [100%]
first install : we will initiate the database
Hash database created successfully. 36348 files entered.
-----------------------------------------------------------------
MD5 hash of /var/lib/afick/afick => 41daxskFuk22DZC+Z1eO3Q
コンフィギュレーション -
基本的にAfickは自分でインストールして、ファイル、ディレクトリ、及びそれら各々のMD5チェックサムのデータベースを構築する。このデータベースに含まれるファイルとディレクトリは、afick.confと言うAfickのコンフィギュレーション・ファイルからの入力に基づいて選ばれ、Afickのインストールの後このファイルは /etcディレクトリに入る。afick.confファイルは、構文が判り易いので理解が容易である。ファイル型、ディレクトリなどを容易に追加、削除して自分の好みに合わせることが出来る。afick.confファイルのサンプルを、所与の行でafick.confファイルがAfickに告げていることの説明を付けて、下に示す。このファイルへのエントリは、case sensitive.であることに注意。
# afick config sample file
# directives
############
database:=/var/lib/afick/afick Afick が使用するデータベースファイルを規定
# report_url := stdout Afick がその出力を送る先を規定
# verbose := no
# warn_dead_symlinks := no
# report_full_newdel := no
# warn_missing_file := no
# running_files := no
# timing := no
# text files
exclude_suffix := log LOG html htm HTM txt TXT xml これらの拡張子を持つテキスト・ファイルをAfick は無視すべきことを規定
# help files
exclude_suffix := hlp pod chm これらの拡張子を持つヘルプ・ファイルをAfick は無視すべきことを規定
# old files
exclude_suffix := tmp old bak これらの型の一時ファイルをAfick は無視すべきことを規定
# fonts
exclude_suffix := fon ttf TTF これらの型のファイルをAfick は無視すべきことを規定
# images
exclude_suffix := bmp BMP jpg JPG gif png ico これらの型のイメージ・ファイルをAfick は無視すべきことを規定
# audio
exclude_suffix := wav WAV mp3 avi これらの型のメディア・ファイルをAfick は無視すべきことを規定
# macros
########
# used by cron
@@define MAILTO root Afickがその報告をメールするユーザを規定
@@define LINES 1000 報告に含む最大行数を規定
# list the file or directories to scan
# syntaxe :
# file action
# to have action on file (see below
# ! file
# to remove file from scan
# file with blank character have to be quoted
# action : a list of item to check 下記のオプションはAfickがチェックすることの出来るファイル属性を規定する
# md5 : md5 checksum
# d : device
# i : inode
# p : permissions
# n : number of links
# u : user
# g : group
# s : size
# b : number of blocks
# m : mtime
# c : ctime
# a : atime
#R: p+d+i+n+u+g+s+m+c+md5
#L: p+d+i+n+u+g
# action alias may be configured with
# your_alias = another_alias|item[+item][-item]
# all is a pre-defined alias for all items except "a"
# alias :
#########
DIR = p+i+n+u+g Directory rule、上のリストに基づいて追加、又は削除することが出来るパーミッション、inode、ハードリンク数、uid、gidオプションを必要に応じてチェックする。
ETC = p+d+i+u+g+s+md5 ETC rule、パーミッション、ファイルシステムのデバイス番号(主及び従)、inode、uid、gid、ファイルサイズ、md5チェックサムをチェックする。
Logs = p+n+u+g パーミッション、ハードリンク数、uid、gid をチェックするLog rule
MyRule = p+d+i+n+u+g+s+b+md5+m 殆ど全部の属性をチェックするCustom rule
# files to scan
##############
=/ DIR 上で定義する DIR rule を用いて/をチェック
#
/bin MyRule 上で定義するMyRule を用いて /bin をチェック
/boot MyRule
!/boot/map ! を用いて Afick にこのディレクトリを無視せよと命じる
!/boot/System.map ! を用いて Afick にこのファイルを無視せよと命じる
/etc ETC 上で定義するETC Rule を用いて /etc をチェック
/etc/mtab ETC - i ETC Rule を用いて /etc/mtab をチェックするが、inode のチェックは飛ばす(-i)
/etc/adjtime ETC - md5
/etc/aliases.db ETC - md5
/etc/mail/statistics ETC - md5 ETC Rule を用いて /etc/mail/statistics をチェックするが、MD5チェックサム のチェックは飛ばす(-md5)
!/etc/map
!/etc/webmin/sysstats/modules/
!/etc/cups/certs/0
/lib MyRule
/lib/modules MyRule -m MyRule を用いて /lib/modules をチェックするが、epoch 以降の最終変更時刻 のチェックは飛ばす(-m)
/root MyRule
!/root/.viminfo
!/root/.bash_history
!/root/.mc
/sbin MyRule
/usr/bin MyRule
/usr/sbin MyRule
/usr/lib MyRule
/usr/local/bin MyRule
/usr/local/sbin MyRule
/usr/local/lib MyRule
/var/ftp MyRule
/var/log Logs
/var/www MyRule
お分かりのように、Afickのコンフィギュレーション・ファイルは単純だ。追加の例として、自分のホームディレクトリをAfickの統合チェックに追加し、そこにあるファイルを所有権変更、パーミッション変更、最終変更時刻及びファイルサイズについて、Afickにチェックさせたいとする。先ず、afick.conf ファイル内の # alias セクションの下に次のような新エントリを作る。
HOME = u+g+p+m+s
続いて、# files to scanセクションの下に、次のようなエントリを追加する:
/home/yourusername HOME
これで終わりだ。もう一度Afickを走らせると、ホームディレクトリをデータベースに追加し、将来走らせる毎に、規定の基準に基づいてチェックする。変更を直ちに有効にしたいときは、次のコマンドを人手で入力してAfickをはしらせることが出来る:
afick --update
そうでなければ、Afickの日常cronjobが走るのを待つ。この cronjob はインストレーション時に自動的に追加され、1日1度走る。このジョブからの出力はafick.confのMAILTOセクションに来ていするユーザにメールされる。ユーザの規定値は上述のようにrootである。e-メールクライアントを用いてAfickの日々報告を見ると、そのレポートは次のようになっている:
This is an automated report generated by Another File Integrity Checker on
+localhost.localdomain at 07:46:07 AM on 02/25/2004.
Output of the daily afick run:
new file : /var/log/afick/afick.log.2
new file : /var/log/afick/error.log.2
deleted file : /etc/sysconfig/iptables
changed file : /etc/adjtime
changed file : /etc/aliases.db
changed file : /etc/mail/statistics
changed file : /etc/prelink.cache
changed file : /etc/printcap
detailed changes
changed file : /etc/adjtime
MD5 : 7+bTDZQbxsTXEJXhyI2GCw ao6a/yDwoBR8GSL1AKlWXQ
changed file : /etc/aliases.db
MD5 :GT/eP5D+B8apNoa7L5CLRw soh7MnLDuQw4gI9KHlhpTA
changed file : /etc/mail/statistics
MD5 :oshq17jZ2a0o5pYhVBRgwQ vb69gMWXvpIEEZ4fmOl9/Q
changed file : /etc/prelink.cache
MD5 : SKh/403FRMUqBNdCIInQ9A zeC+5EPFfWBR4OeT7xZdbw
changed file : /etc/printcap
MD5 : b5e3g2//bGaxeCxVyRJqaw QFY1NJGy/kdt32B1YV0TXQ
filesize : 194 581
お分かりのように Afick は、多数のファイルが変更、作成又は削除されたことを通知する。また、これらのファイルと最初と現在のチェックサムを示して、ファイルの内一つのファイルサイズ変更を通知する。Afickが最後に走ったとき渡されたプロパティと現在プロパティを比較してAfickはこれらの変化を知る。予期しない変更がファイルにあるときは、調査の必要を示している。良い例は、/usr/binの中又は/sbinの中のファイルで、これらは、プログラム更新などのため変更しない限り、変わる筈がない。Afickは使用者の判定を頼りにしている。情報を与えるだけだ。初心者には、変化が問題を示すとは分からないかも知れぬが、必要なら知識のある人に出力を見せて助けを求めることも出来る。
最後に検討するのは、Afick データベースを記憶する場所だ。規定値は/var/lib/afick/で、これが良いけれども、問題を生じることがある。システムに欠陥を生じると、Afickデータベース完全性もまた欠陥を生じるとの問題だ。生じたことを知る方法がない。これの可能な解決策は、Afickデータベースをcdromなど変更不能のメディアフォーマットに移動することで、Afickデータベースが削除や変更をされないことを確実にする。このときは、 afick.confファイルを変更してその位置を指させる。
講義を終わる。お分かりのように、Afick はシステムを欠陥のない完全なものにする強力な助けだ。さらに詳しく学習したい人は
Afick's Site を調べるか、マニュアルを読まれたい。
IPv6 transition 6to4 トンネリング
投稿P. Joy Shyam、D. Balamurugan:2004年3月8日 - 00:14 記事|一般|Linux用法
インターネットにおける最近の発達は、コンピュータ科学のあらゆる分野で新技術を生み出した。ネットワーク実施における重要開発の一つはIPv6 プロトコルである。IPv6 は、現在使用されているIPv4 の欠点を克服するため1990年代に開発された。IPv4の欠点は、IPアドレスがないこと、著作権IPsec及びDHCPプロトコルを用いるノードのコンフィギュレーションである。これらの欠点を避けて、追加の特徴を含むため、IPv6プロトコルに進む。IPv6プロトコルには、拡張性、近接ノードとの会話のための新規プロトコル、及び埋め込IPsecなど追加の特徴が幾つかある。
現在のネットワークで IPv6 を実行する上での主要な問題は、既存 IPv4ネットワークの置換を必要とすることである。IPv6には、現在のネットワークを変更するまで実行することの出来ない追加特性がある。IPv4 のある状態でIPv6を実行するため三つの機構がある。
1.Dual stack approach.
2.Tunneling.
3.Translation.
これら三つの方法のうち、この論文ではTunnelingメソッドを扱う。このメソッドは、IPv6 パケットが既存IPv4 ネットワークと通じて翻訳される方法を告げる。
緒言:
今日のインターネットは完全にプロトコルTCP/IPに依存している。Transmission Control Protocol (TCP)とInternet Protocol (IP)が、パケット送受信などインターネット基本活動を支配している。TCPが情報送受信をおこない、IPがネットワーク付着のホストに対するIPアドレス割当をおこなう。IPはインターネットの背骨であると言われる。今日使用されているIPのバージョンはIPv4 (IP version 4)である。20年も使われて来た頑丈なプロトコルだ。信頼性があって頑丈だが、232個のホストにしかアドレス出来ないとの欠点がある。だがインターネットの成長速度のため、インターネットに接続されるホストすべてを扱うのにIPv4 では充分でない。この欠点を克服するためIPv6が開発された。その主な特徴はアドレッシングの能力だ。2128ホストにアドレスする能力があるので、将来のためにも充分過ぎるほどだ。
この論文は、6to4の機構に焦点を当てる。6to4について、その作動と、他の機構と6to4との比較、及び設計アーキテクチャを明確にする。
説明に入る前に、IPv4の限界とIPv6の特徴を幾つか述べる。
IPv4 の限界
IPの現行版(IPv4)は、1981年に公表された RFC 791以来余り変わっていない。IPv4は、頑丈で、実行が容易で、相互利用可能であることが明らかである。今日の大きさの世界的使用までネットワーク間の拡張性試験にも耐えた。これは最初の設計のお蔭だ。しかしIPv4が最初の設計で予期していなかったことがある:
1.IPv4 アドレス空間の枯渇
2.簡単なコンフィギュレーションの必要
3.IP レベルにおけるセキュリティ要件
IPv6の特徴
以下に IPv6プロトコルの特徴をまとめる:
1. 新規ヘッダフォーマット
2. 大きいアドレス空間
3. 効率的で階層化されるアドレス作成とルート決定インフラストラクチャ
4. Statelessとstateful のアドレス構成
5. 埋込セキュリティ
6. QoS に対する良好なサポート
7. 近接ノード相互作用のための新規プロトコル
8. 拡張性
6to4トンネリング
この論文は、6to4トンネリング・メソッドを扱う。6to4メソッドは、IPv4ネットワークを通じるIPvのみのノード二つの通信に基づく。このメソッドのブロック図を下に示す:
IPv6 発信元 IPv4 ネットワーク 宛先 宛先
発信元-----------6to4----------------------------------------------side 6to4--------------IPv6
ノード ゲートウエイ ゲートウエイ ノード
図1:6to4トンネリング・ブロック図
作動詳細に入る前に、ブロック図の用語を説明する。
用語:
IPv6 のみノード:
IPv6アドレスだけが割当られるノード。このアドレスを用いてのみ他のノードと交信することが出来る。IPv6ノードとのみ交信することが出来てIPv4ノードとは交信することが出来ない
IPv6 中継ゲートウエイ:
IPv6本来アドレスと6to4アドレスの双方があるパケットをルートすることの出来るゲートウエイ。
6to4 ゲートウエイ:
通常は、IPv6 サイトと広域IPv4ネットワークとの間の境界ゲートウエイである。IPv6パケットをIPv4パケットに封入し、またIPv6パケットをIPv4パケットから取出す。最初の作用は発信元側6to4 ゲートウエイでおこない、二番目の作用は宛先側6to4 ゲートウエイでおこなう。IPv4パケットとIPv6パケットの両方を扱う能力がある。
6to4 アドレス:
6to4局番を用いて構築されるIPv6アドレス。6to4 ゲートウエイ向けの6to4 アドレスは次のようになる:
2002:WWXX: YYZZ: [SLA ID]:[Interface ID]
ここで、
-2002は、予め割当られる6to4 局番
-WW.XX.YY.ZZ は、6to4 ゲートウエイのIPv4 アドレス
-SLA ID は、6to4 ゲートウエイが付着されるネットワークのサブネット・アドレス
-Interface ID MAC は、6to4 ゲートウエイのアドレス
IPv6 本来アドレス:
6to4とは異なる別の型の局番を用いて構築されるIPv6アドレス。
6to4トンネリング全体の実際作動を見よう。このメソッドは次の成分を含む。
作動:
発信元 IPv6 ノード:
発信元 IPv6 ノードが、IPv6パケットを宛先IPv6ノードに送る。宛先IPv6ノードのIPv6アドレスはDNSから採用する。
IPv6 中継ルータ:
このルータは任意選択である。これは、発信元 IPv6ノードが別個のIPv6のみネットワークの中にあるとき存在する。このルータは、そのネットワーク内ではIPv6ルータとなる。発信元 IPv6ノードからIPv6パケットを受取って、パケットの宛先をチェックする。パケットが、このルータに直接接続される別のIPv6ネットワーク宛てであるときは、パケットを直接そのネットワークに送る。そうでないときは、パケットを6to4ルータに送り、その6to4ルータがそのパケットを正しい宛先にルートする。発信元IPv6ノードが単一ノードであるときは、IPv6 中継ルータは不要である。
6to4ゲートウエイ:
6to4ゲートウエイは、6to4トンネリング機構の心臓である。発信元側では、IPv6ノード又はIPv6 中継ゲートウエイからIPv6パケットを受取る。このIPv6パケットをIPv4パケットの中に封入して、IPv4ネットワークを通じて宛先に送る。IPv4パケットに封入されたIPv6パケットがIPv4ネットワークを移動して宛先側6to4ゲートウエイに到着する。宛先側6to4ゲートウエイでは、パケットを受け取って宛先アドレスをチェックする。そのゲートウエイ宛てであれば、IPv4パケットからIPv6パケットを取出し(つなり:封入されれたパケットからIPv4ヘッダを取り除き)このパケットをIPv6中継ゲートウエイ又はIPv6宛先ノードに送る。
宛先IPv6ノード:
これは別のIPv6のみモードで、実際はIPv6パケット全部を受取り、6to4ゲートウエイからのパケットを受取る。
機能アーキテクチャ:
前章は6to4トンネリング・メソッド全体を説明する。だが、実際の6to4機能は、6to4ゲートウエイにある。6to4ゲートウエイだけが封入、取出処理をおこなう。この章では、6to4ゲートウエイの機能的アーキテクチャを説明する。それを図2に示す。
パケット捕捉
|
|
パケット型チェック
_________________________|_____________________
| |
IPv6 パケット IPv4パケット
| |
| |
IPv6 ヘッダ解析 IPv4 ヘッダ解析
| |
| |
封入 取出
| |
| |
パケットを パケットを
次のゲートウエイに送付 IPv6 ノード宛先に送付
図2:6to4 ゲートウエイの機能アーキテクチャ
上図が6to4 ゲートウエイにある機能モジュールを示す。モジュールの説明は次の通り。
IP パケット捕捉:
このモジュールは、IPパケットの捕捉のみをおこなう。このモジュールにはイーサネット装置が無差別モードで設置されている。その装置は、パケット捕捉のため開く。フィルタプログラムがイーサネットカードをIPパケットだけ捕捉する設定にする。その後、捕捉パケットをバッファにコピイする。
IP パケットの型のチェック
このモジュールは、バッファにコピイした捕捉パケットからイーサネットヘッダの最後の2バイトをチェックする。これら2バイトの値が16進0800であるとき、捕捉パケットはIPパケットである。次いで発信元又は宛先アドレスフィールドの長さをチェックする。フィールドの長さが4バイトであればIPv4パケットで、16バイトであればIPv6ぱけっとである。
IPv6 ヘッダ解析:
このモジュールと次の二つのモジュールは、6to4ゲートウエイが発信側で働くとき実行される。このモジュールの中で、IPv6パケットヘッダ解析をおこなう。捕捉パケットの宛先アドレスをチェックする。宛先アドレスを見た後、パケットを封入モジュールに送る。
封入:
このモジュールでは、フィールド全部を含むIPv4ヘッダがバッファメモリの中に作られる。次いで、作ったばかりのIPv4ヘッダに次の変更を加える。
1) 6to4 ゲートウエイのIPv4アドレスに対し発信元アドレスフィールドを設定する。
2) 宛先アドレスフィールドを宛先側の6to4ゲートウエイのIPv4アドレスに設定する。
3) TOS (サービスの型) フィールドの値を41に設定する。
4) 捕捉IPv6パケットを、今作ったIPv4パケットのペイロードフィールドにコピイする。
5) IPv4ヘッダの中の DF [7] (寸断するな) フラグをtrueに設定する。
入信IPv6パケットをIPv4に封入する。これでIPv4パケットとなるので、IPv4ネットワークを通じて送ることが出来る。
パケットを次のルータに送る:
このモジュールでは、封入IPv6パケットが、使用するルート決定アルゴリズムに基づいて次の最良IPv4ルータに送られる。
IPv4 ヘッダ解析:
このモジュールと次に来るモジュールは、6to4ゲートウエイが宛先側で働くとき実行される。このモジュールはIPv4パケットを捕捉して、先ず、パケットの宛先アドレスをチェックする。パケットがこの6to4ゲートウエイ宛てであるときは、パケットをバッファにコピイする。バッファにコピイの後、IPv4パケットのTOS値をチェックする。この値が41である時は、パケットを取出モジュールに送る。
取出:
ここで、入信パケットをバッファから取り出す。IPv4ヘッダの長さを見出す。ヘッダの終わる位置から始めて、パケットのIPv4ヘッダを除くサイズまで、パケットを別のメモリ領域にコピイすることにより、IPv4ヘッダを削除する。これでパケットはIPv6パケットになるので、宛先に送る用意が整う。
パケットを宛先に送る:
取出したIPv6パケットの宛先IPv6アドレスを見て、それぞれの宛先に送る。パケットをIP層に渡すことにより、これをすることが出来る。
まとめ:
この機構は、既に利用出来るIPv4ネットワークの存在するネットワークにIPv6を移植するための暫定機構として使用することが出来る。この機構が必要とするノードのコンフィギュレーションは、最小である。この機構には長所もあるが短所もある。マルチキャスティングに関するサポートがないことや6to4ゲートウエイの複雑さなどである。
参考資料:
1. R. Gilligan, E. Nordmark, RFC 1933 "Transition Mechanisms for IPv6 Hosts and Routers", 1996.
2. F. Templin, T. Gleeson, M. Talwar, D. Thaler, Internet draft "Intra-Site Automatic Tunnel Addressing Protocol (ISATAP)", 2002.
3. B. Carpenter, C. Jung, Internet draft “Transmission of IPv6 over IPv4 Domains without Explicit Tunnels", 1999.
4. A. Durand, P. Fasano, I. Guardini, D. Lento, RFC 3053 “IPv6 Tunnel Broker", 2001.
5. Joseph Davies,, “Understanding IPv6”, PHI, 1999.
6. B. Carpenter, K. Moore, RFC 3056 “Connection of IPv6 Domains via IPv4 Clouds”, 2001.
7. W. Richard Stevens, “Unix Network Programming, volume-I", PHI, 2002.
1. Michael Mackay, Christopher Edwards, Martin Dunmore, Tim Chown, Graca Carcalho, “ A Scenario-Based Review of IPv6 Transition Tools, IEEE Internet Computing journal (pp 27-30)”, May-June 2003
投稿david :2004年3月8日 - 15:27. 記事 | システム管理
これは、csshを用いてクラスターシステムにおける作業量を削減する基本の手引きである。
クラスターを走らせるとき、数個のマシン上で同じ日常業務をしているのに気付くだろう。その必要はない。cluster sshは、こんなことに役立つ設計となっている。
1. clusterssh とは? それを使う理由は?
Clusterssh (cssh) は、基本的に、別のマシンでも構わない多数のウインドウで、同じコマンドを行う設計となっている。これは、あらゆるものが同じ筈のクラスタのため、大変良く働く。これはまた、両者で同じconfigファイルを必要とすることをも意味するので、別々のマシン上の同一ファイルを編集するのに同じキイ操作を用いることが出来る。両マシン上に全く同じconfigファイルがあると考えるようにするので、大変便利だ。ウェブの前線などでは、configファイルが正確に一致し、ソフトウエアがロードバランスの面倒を見てホスト故障を宣言しなければならない。
2.興味のあるcluster ssh.
私はこれをdebian上で行ったので、apt-get install clusterssh済んだ。別のものであればプロジェクト
homepage から入手されたい。これの入手にパケージ管理ソフトウエアを使うことが出来るなら、それをお薦めする。
debianインストールには一つ問題がある。他でもそうだろうが、次のようなメッセージが出る:
tainted at /usr/lib/perl5/Tk/MainWindow.pm line 55. MainWindow->new(-title,Cluster Control By SSH) at /usr/bin/cssh line 393
これが出たときは、/usr/binにあるcsshを編集して、$ENV{HOME} = '/tmp'; を定義全部のあるトップのどこかに挿入する。これで問題は解決の筈だ。
3. cluster sshの使用
基本的に、これは極めて簡単だ。cssh 192.168.0.50 192.168.0.51 などとすると、両方に簡単にログする。これはsshに依存するので、sshキイなどはまだ上手く働く。また、二つ以上にログインすることも出来る。コマンド行で沢山示すだけだ。また設定中にホストを追加したいときは、クラスタ制御ウインドウに行ってadd hostをクリックする。このときは常にクラスタ制御ウインドウにタイプインすると、現在ログインしているホスト全部に出力する。また一つのウインドウだけに何かをしたいときは、そのウインドウをクリックする。
規定値 xterm ウインドウを好まないときは、 rxvt, xterm-rv 又は何でも好きなものに変えるだけだ。多分自分のワークステーションなのでcsshの編集は多分立派だろうが、そうでないときは、それを ~/binにコピイして、そこで編集すると、特注変更をすることができる。次の行を、自分の好きなように編集するだけだ:
$user_config{'default.terminal'}="xterm";
フロントエンド二つ又はアプリケーションサーバ二つ、又はメイルサーバ五つなど、共通クラスタを常に使用するときは、 /etc/clusersと言う名のファイルを追加し、そこに次のようなものを入れることを考える:
#format clustername machine machine machine
mailservers 192.168.0.40 192.168.0.41 192.168.0.42 192.168.0.43
frontend 192.168.0.80 192.168.0.81
intranet root@192.168.0.55 root@192.168.0.56
これから、色々なアイデアが浮かぶと思う。多数のホストを置くことが出来るし、@を用いてユーザを選ぶことも出来る。
投稿Willy Smith:2004年3月16日 - 17:55. 記事 | 一般 | ハウツウ| Linux
Gaimは、チャットクライアントで、AOL インターネット・メッセージ装具, Yahoo!, ICQ, MSN, IRC, Jabberで働く。我が社のJabber サーバと SuSE 9.0に用いるためバージョン0.75を必要としたが、インターネットでRPMを見付けることが出来なかった。これはSuSE YaST ユティリティを用いてそれをインストールする方法の簡単な説明である。リンク阿RPMファイルに設けられている:
RPMファイルを作ったMitch Frazierに感謝する。ライブラリに問題があったのでこれが必要だった。以下は、インストールに必要な四つのファイルである:
KonquerorからYaSTを用いてファイルをインストールするには、以下のステップに従うだけだ。ファイルを正確に上に記載の順序でインストールするのが重要なことに注意:
1.ダウンロードしたいRPMファイルへのリンクをクリックする.
2.ラベルが"Install package with YaST"のボタンのある新しいブラウザウインドウが開く
3.ファイルがダウンロードされるのを待つ。画面の下に進捗度表示があらわれる筈
4.ダウンロードが終わったら、"Install package with YaST"をクリックする。
5.数秒後に、ウインドウがポップアップしてルートパスワードを聞く。入力してOKをクリック。
6.YaST が完了したら、四つのファイル各々についてステップを繰り返す。
これで、メインKDEメニューからGaimを走らせることが出来る。これは"Internet"ヘディングの下に出る。私のは"Other Programs"サブメニューの下にインストールした。
投稿rnicholas:2004年3月17日 - 14:38. 記事|一般|ハウツー|システム管理|DISTORO
Yum は、rpmに基づくシステムのための自動更新とパケージ管理である。Yumは、従属性を自動的に計算してパケージをインストールするため起こす必要のあるステップを解明する。各々にrpmを用いてマシンのグループを人手なしで更新するのを容易にする。
Yumは、
Red Hat up2date 及びこれも
Fedora Core 1と一緒に来るrpmツールの代わりに又は、追加して使うことが出来る。私の好みはYumを両ツールの完全な代替物として使うことである。その方が速くて、信頼性があり、他のツールでは得られない次のような機能がある、
・貯蔵所が多数
・コンフィギュレーション・ファイルが簡単
・従属性計算が正しい
・作用がrpm-整合
・複数貯蔵所グループを含むcomps.xml グループ・サポート
・インターフェイスが簡単
Yumは、システムにインストール済みのパケージを最新に保つため使用することが出来るだけでなく、パケージを直接インストールするため使用することが出来る。これはファイルをセーブするcdが見つからないとき素晴らしいことだ。ネット上で簡単に常に原典をダウンロードするか、又はrpmを探すことが出来る。Yumは
Duke Universityの努力で開発され、
GNU GPLの下で利用することが出来る。Yum が少し分かったところで、何にが出来るかを検討しよう。
この講義は、既にYumをインストールしており、基本的編集作業のため
vi などのテキストエディタを使用することが出来ると仮定していることに注意されたい。Yum をまだインストールしていないときは、Fedora Core 1 installation cdからインストールするか、又は
mirrors.kernel.org サイトからrpmを入手すると良い。
Yum のコンフィギュア -
Yumを使う前に、
yum.conf と言うコンフィギュレーションファイルを変更して、使用するレポジトリ・サーバをYum に命令する行を編集しなければならない。規定値で、これはメインのFedora Core 1 ダウンロード・サーバに設定されている。これでも良いが、遅くて時間切れになり勝ちなである。これは仲間が同時にサーバを使用するためだ。そこで、Yumを
The Fedora Mirror Site.に記載される多数のミラーサイトのうち一つを利用する設定にする。地理的に近い一次サイトを選ぶと、速度が速くなるが、マイレージが変動する。そこで、
yum.confを編集し、サーバを設定してYum の利用を開始する。この講義の後の部分ではルートに止まる必要があるので、ターミナルウインドウを捕まえて、次のコマンドを出す;
$su <enter>
$password <enter>
そこで、好みのテキストエディタを用いて、/etc/yum.confファイルを開き、baseurl行を選択するレポジトリのアドレスに置き換える。私が米国西部にいるので、この例では、ミラーサイトmirrors.kernel.org, を使用する。
[base]
name=Fedora Core $releasever - $basearch - Base
baseurl=http://mirrors.kernel.org/fedora/core/$releasever/$basearch/os
[updates-released]
name=Fedora Core $releasever - $basearch - Released Updates
baseurl=http://mirrors.kernel.org/fedora/core/updates/$releasever/$basearch
このファイルの[updates-testing]部分に神経を使う必要がある。これは一般的な更新とパケージ・インストレーションには使用しないからだ。必要な変更をおこなったら、ファイルをセーブして閉じる。ここで/etc/sysconfig/rhn/sourcesファイルを次のように編集する。ここでもミラーサイトは必要に応じ自分の選ぶものに変更する。
yum fedora-core-1 http://mirrors.kernel.org/fedora/core/1/i386/os
yum updates-released http://mirrors.kernel.org/fedora/core/updates/1/i386
変更はRedhatツールもまた働くことを保証する。ファイルをセーブして閉じて、先に進む。
Yum を使用する -
Yumに関し最初になすべきことは、rpmヘッダリストを更新することだ。各rpmにはヘッダがあって、完全なファイルリスト、パケージ説明、与える特徴やライブラリ、要件のリスト、競合相手のリストを含む。Yumはこの情報を用いてパケージの更新とインストールの方法を決定する。
そこで、ルートとして次のコマンドを出す;
#yum check-update <enter>
現行ヘッダの完全な組を、yum.confファイルに規定するレポジトリサーバからダウンロードする。これには数分かかり、次のようになる;
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
Yumがヘッダファイルのダウンロードを終えると、凄い仕事に入る準備完了だ。現在自分のシステムにインストールしているパケージ全部を最新版に更新するには、次のコマンドを入力する;
#yum update <enter>
先に進んで、現在自分のシステムにインストールしているパケージ全部を、レポジトリサーバ上で入手可能なものと比較する。完了したら、何をしようとするかの詳細を記載する情報画面が示され、次のように確認を求める;
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
getting /var/cache/yum/updates-released/headers/rdesktop-0-1.3.0-2.i386.hdr
rdesktop-0-1.3.0-2.i386.h 100% |=========================| 3.1 kB 00:00
Resolving dependencies
Dependencies resolved
I will do the following:
[install: rdesktop-0-1.3.0-2.i386]
Is this ok [y/N]: y
この場合、Yum は
Rdesktopに利用出来る更新があると言っている。質問にイエスと答えるだけでパケージは更新される。特定のパケージだけを更新したいときは、上で使用するコマンドを変更して、パケージ名を追加するだけだ;
#yum update nmap <enter>
次のようなものが現れる:
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
No Packages Available for Update
No actions to take
この場合、Yum はシステムにインストールしてある
nmapのバージョンは現行のものなので、処置をしないと言っている。
XChat IRCクライアントなど、今持っていないパケージをインストールしたいときは、次のように入力するだけだ;
#yum install xchat <enter>
次のようなものが現れる:
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
getting /var/cache/yum/base/headers/xchat-1-2.0.4-4.i386.hdr
xchat-1-2.0.4-4.i386.hdr 100% |=========================| 6.8 kB 00:00
Resolving dependencies
Dependencies resolved
I will do the following:
[install: xchat 1:2.0.4-4.i386]
Is this ok [y/N]:
Yumの質問にイエスと答えるだけで、直ぐにそのパケージがインストールされて使える。既にnmapをインストールしていて、それにguiインターフェイスを追加したいが、パケージの名が分からない時は、次を入力する;
#yum search nmap gui <enter>
以下が現れる;
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
Looking in available packages for a providing package
Available package: nmap-frontend.i386 2:3.48-1 from base matches with
Gtk+ frontend for nmap.
Available package: nmap-frontend.i386 2:3.48-1 from base matches with
nmap-frontend
欲しいパケージを取り上げて、講義の前の方で用いたコマンド使ってインストールする。searchオプションは、ワイルドカード文字も受け付ける。 libc6.1-1.so.2など独立パケージでないライブラリが何か必要であるとする。次のようにする;
#yum provides libc6.1-1.so.2 <enter>
以下が現れる;
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
Looking in available packages for a providing package
Available package: compat-libstdc++.i386 0:7.3-2.96.118 from base matches with
libstdc++-libc6.1-1.so.2
Available package: compat-libstdc++.i386 0:7.3-2.96.118 from base matches with
libstdc++-libc6.1-1.so.2(GCC.INTERNAL)
2 results returned
Looking in installed packages for a providing package
No packages found
Yumは、探しているライブラリlibc6.1-1.so.2はパケージcompat-libstdc++ に含まれていて、現在システムにはインストールされていないと言っている。そこでyum install compat-libstdc++ を走らせるだけで、ライブラリが手に入る。存在すら知らないユーザのマシンに対するポートスキャン(勿論イタズラ)にウンザリしているとする。そこでnmapを全部削除したいときは、次のコマンドを入力する;
#yum remove nmap <enter>
これは選ばれたパケージを削除すると同時に、それに従属する他のパケージ全部を削除する。覚えておくと良いのは、Yumがパケージ又は更新をインストレーションのためダウンロードするとき、それをディスクキャッシュから自動的には削除しないことだ。だから定期的保守が必要になる。幸い保守は簡単で迅速で、次のコマンドを時々走らせるだけだ;
#yum clean all <enter>
これは、キャッシュされた古いパケージをシステムから削除すると同時に、不要な古いrpmヘッダを削除する。最後の例は、毎日呼び出すもので、実際にインストールしないでXchatパケージについて知るものだ。次のようにする;
#yum info xchat <enter>
次があらわれる;
Gathering header information file(s) from server(s)
Server: Fedora Core 1 - i386 - Base
Server: Fedora Core 1 - i386 - Released Updates
Finding updated packages
Downloading needed headers
getting /var/cache/yum/base/headers/xchat-1-2.0.4-4.i386.hdr
xchat-1-2.0.4-4.i386.hdr 100% |=========================| 6.8 kB 00:00
Looking in Available Packages:
Name : xchat
Arch : i386
Version: 2.0.4
Release: 4
Size : 2.40 MB
Group : Applications/Internet
Repo : Fedora Core 1 - i386 - Base
Summary: A GTK+ IRC (chat) client.
Description:
X-Chat is an IRC client for the X Window System and GTK+. X-Chat is
fairly easy to use and includes a nice interface.
これで講義は終わりだ。役立つと良い。もっと詳しく知りたいときは、Yum のサイトを訪ねるか、マニュアルを読まれたい。
投稿 asmyalinux :2004年3月19日 - 05:15. 記事 |一般
NUMAは、各プロセッサが、共通システムメモリとは別にそのプロセッサ自体の計算をおこなるため使用することの出来る自分自身のローカルメモリを有する、マルチプロセッサにおいて使用されるメモリアーキテクチャである。各プロセッサは、そのローカルメモリをデータとインストラクション共有目的で使用し、幾つかの内部計算が内部ローカルメモリで行われる。これによりメモリ競合が軽減され、プログラム効率が上がる。プロセッサが自分のメモリにアクセスするときの方が、別のプロセッサからそれを借りるときより、メモリアクセス時間が短いので、これを不均一と言う。
一般的なSMP(対称マルチプロセッサ・アーキテクチャ)では、全てのメモリアクセスが同一共有メモリバスに送られる。これは比較的少数のCPUではうまく働くが、数十、数百のCPUが共通メモリバスに対するアクセスで凶暴するとき、共通バスに問題を生じる。これは、多数のCPUの単一のメモリバスに対する極めて高い競合のため、性能の大きい隘路を作る。
NUMAアーキテクチャは、SMPアーキテクチャの拡張性のこの限界を超えるため設計された。NUMAコンピュータは、効率を失うことなくプロセッサの追加削除が出来るとのMPP(大量平行処理)の拡張性を与え、SMPのプログラム作成を容易にする。典型的なNUMAシステムにおいては、特定プロセッサ内部の計算は、そのプロセッサのローカルメモリで行われる。共有メモリにアクセスする要求は出されない。そのプロセッサ上で走る一定の処理に参加する命令と計算はすべて、共有メモリにアクセスして処理の結果を連絡するときにのみ実行される。これはシステム内の全てのプロセッサに関して行われるので、単一メモリバス上の負担は大幅に軽減され、マルチプロセッサ・システムの効率を上げる結果となる。
キャッシュコヒレンスとNUMA
殆ど全部のCPUアーキテクチャは、小さいキャッシュを使用してメモリアクセスにおけるリファレンスの局所性を利用する。設計と構築は容易であるが、非キャッシュコヒレントNUMAシステムは、多分標準ノイマンプログラム作成モデルでのプログラム作成を複雑にする。その結果、公認NUMA設計はすべて、特殊目的ハードウエアを用いてキャッシュコヒレンスを維持するので「キャッシュ-コヒレントNUMA」(ccNUMA)と呼ばれる。
これは一般的に、同一メモリロケーションが一つ以上のキャッシュに記憶されるとき一貫性のあるメモリイメージを維持するためキャッシュ・コントローラの間のプロセッサ間通信を用いて行われる。この理由で、ccNUMA は、多数プロセッサが急速に連続して同一メモリ領域にアクセス使用とすつとき、性能が落ちる。この理由で、NUMAをサポートするOSは、プロセッサとメモリをNUMAに馴染む方法で割当ること、及びNUMAに馴染まない不要なアクセスをしないスケジューリングとロッキングアルゴリズムを回避することにより、この種のアクセスの頻度を下げようとする。用語「NUMAに馴染む」は、同一メモリ領域に頻繁にアクセスするプロセッサを、単一プロセッサに割り当てて、それにより、異なるメモリに変数のコピイ多数を持つ可能性を減らすことを意味する。
NUMAとccNUMAとの間の相違は、この点では殆ど存在しない。非ccNUMAマシンのためのアプリケーションは、ほとんど存在しないので、プログラム作成は困難なので、別段に断らない限り、NUMAは実際はccNUMAを指し、逆も真である。
典型的 NUMA 用語
1) ノード:程々に技術的で程々に物騒なノードの定義は、各バイトが各CPUから同一距離にあるメモリの領域。もっと普通の定義は、メモリと、メモリと物理的に同一バス上にあるCPU、I/Oなどのブロック。アーキテクチャによっては、メモリ、CPU、I/Oを同一物理バス上に持たないので、第二の定義は本当には保たれない。
2) ローカルメモリとリモートメモリ: ローカルメモリとリモートメモリの用語は、一般的に現在走っているプロセスとの関係で用いられる。ローカルメモリは一般的に現在プロセスを走らせているCPUと同じノードの上にあるメモリと定義される。この定義によると、現在プロセスが走っているノードの上に属さないメモリは全部リモートである。
ローカルメモリとリモートメモリはまた、現在走っているプロセスとは別のものとの関係でも用いられる。中断の文脈では、現在実行中のプロセスはないが、中断を扱うCPUを含むノードにあるメモリは、ローカルメモリと呼ばれる。また、ローカルメモリとリモートメモリをディスクとの関係で用いることも出来る。例えば、DMAをおこなう(ノード1に付属する)ディスクがあるときは、それが読取又は書込するメモリが別のノード(つまりノード0)にあるとリモートと呼ばれる。
3) 距離:NUMAに基づくアーキテクチャは、必然的にシステム成分(つまりCPU、メモリ、I/O バスなど)の間の距離の概念を含む。距離を決めるには各種の尺度を用いることが出来るが、帯域幅及び待ち時間と並んで、ホップが普通の尺度である。これらの用語は全て、ネットワーク文脈で用いるとき、実質的に同じものを示す。したがって、ノードを記述するため用いるとき、メモリの特定範囲がCPUs 0..3 及び SCSIコントローラ0から2ホップ(バス)であると言うことが出来る。したがって、CPUs 0..3 及び SCSIコントローラは同一ノードの部分である。
NUMAの利点
NUMAの主な利点は、上述のように、拡張性である。SMP をCPU 8-12 個以上に拡張するのは極めて難しい。この数のCPUでは、メモリバスの競合が激しくなる。NUMAは、共有メモリバスに対するアクセスを競うCPUの数を減らす一方法である。これは、数個のメモリバスをおいて、これらバスの各々に少数のCPUを持たせることにより達成される。NUMAがあると、一般的SMPアーキテクチャが提供するプログラム作成の簡単さを与え、SMPアーキテクチャで経験する通常のメモリ競合問題から解放される。
OSの問題
NUMAシステムの性能決定における重要な特徴は、OSのサポートである。NUMAを理解しないOSを使ってNUMAを走らせると、NUMAの利点を利用するためにプロセスをルートしないので、性能改善はほとんどない。他方、NUMAを理解するOSを用いると、OSがNUMAアーキテクチャの要点を利用するので、プロセスはプロセッサ上でメモリアクセスが最小になり、同一メモリ領域の共有コピイが最小になり、最適多重処理を生じるよう実行されるので、数倍の性能改善がある。
kernel 2.6から始まるLinuxは、NUMAに基づくアーキテクチャのサポートを開始した。
NUMAの代替物
メモリアップを分割し(多分勝手に)それをCPUのグループに割当ることにより、実際のNUMAと同様の性能向上を得ることが出来る。このような設定は、メモリ全てが同一バス上にあるので、ローカルメモリとリモートメモリの間の線引きが曖昧な正規のNUMAマシンのようになるであろう。PowerPC Regattaシステムが、この例である。
クラスタを用いて幾つかのNUMA類似性能を達成することが出来る。クラスタは、NUMAマシンに良く似ていて、クラスタ内の個別マシン各々が、仮想NUMAマシンのノードになる。唯一の実際の相違は、ノードの待ち時間である。クラスタ環境では、内部リンク上の帯域幅と待ち時間がもっと悪くなる。
参考資料:
投稿 pixelbeat:2004年3月24日 - 14:19. 記事|一般| Linux
Linux noコマンド行でおこなうことの出来る手軽で共通の事項の一覧表を示す。
| コマンド |
説明 |
| apropos word |
単語に対するコマンド付属物を示す |
| gpg -c file |
ファイルを暗号化 |
| gpg file.gpg |
暗号化ファイルを解読 |
| cal -3 |
カレンダを表示 |
| look wordprefix |
辞書の即席検索 |
| grep --color word /usr/share/dict/words |
辞書で単語の発生を強調 |
| nice command |
低優先度のコマンドを走らせる |
echo "wget url" | at 01:00
|
午前1時にurlを現行ディレクトリにダウンロード |
| echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 |
e-メールの注意喚起
|
| echo "(321-123)/123" | bc -l |
コマンド行上の即席算術 |
| echo "print (10E3-123)/123" | python |
コマンド行上の即席算術(科学記号付き) |
| watch -n1 "cat /proc/interrupts" |
変更可能データを連続監視 |
| time command |
コマンド所要時間を見る |
| dd bs=1M if=/dev/hda | gzip | ssh user@remote dd of=hda.gz |
ハードディスクをリモートマシンにバックアップ |
| alias hd='od -Ax -tx1z -v' |
簡便 hexdump 別名 |
| ls | pr -T9 -W$COLUMNS |
ターミナル幅まで9欄をプリント |
| touch -c -t 0304050607 file |
ファイル時刻印設定 (YYMMDDhhmm) |
| du -sh file dir |
fileとdirのディスク利用の表示 |
| pstree -p |
プロセス階層の表示 |
| ディレクトリ・ナビゲーション |
| cd - |
前のディレクトリへgo to |
| cd |
ホーム・ディレクトリへgo to |
(cd dir && command)
|
dirへ行き、commandを実行し、自動的に現在ディレクトリに戻る |
pushd .
|
現在ディレクトリをスタックに置くので、それに popd バック出来る |
| CD |
| dd bs=1M if=/dev/cdrom | gzip > cdrom.iso.gz |
データのコピイをcdromにセーブ |
mkisofs -r dir | gzip > cdrom.iso.gz
|
ディレクトリからcdromイメージを作成 |
| gzip -dc cdrom.iso.gz | cdrecord dev=0,0,0 - |
cdromイメージの焼付 |
cdparanoia -B
|
オートトラックをCDから現在ディレクトリをスタックのwavファイルにrip |
cdrecord dev=0,0,0 -audio *.wav
|
現在ディレクトリの全wavからオーディオ CD を作るfrom all wavs in current dir |
| oggenc --tracknum="track" track.cdda.wav -o "track.ogg" |
wav ファイルからoggファイルを作る
|
| アーカイブ |
| tar c dir | bzip2 > dir.tar.bz2 |
アーカイブ又はディレクトリを作成 |
| bzip2 -dc dir.tar.bz2 | tar x |
アーカイブを抽出 |
| find dir -name "*.png" | xargs tar rf dir.tar; bzip2 dir.tar |
ディレクトリに*.pngのアーカイブを作る |
| file searching |
| alias l='ls -l --color=auto' |
迅速なディレクトリ一覧 |
| ls -rt |
日付順にファイルを一覧 |
| ls -rS |
サイズ順にファイルを一覧 |
| find -name "*.[ch]" | xargs grep -E "search string" |
*.c と*.h を"search string"につきこのディレクトリ以下で検索 |
find -type f | xargs grep -E "search string"
|
正規ファイル全部を"search string"につきこのディレクトリ以下で検索 |
| find -type f -maxdepth 1 | xargs grep -E "search string" |
正規ファイル全部を"search string"につきこのディレクトリで検索 |
locate "file*.txt"
|
キャッシュされるインデクスをファイル名につき検索 |
| テキスト編集 |
| sed '/ *#/d; /^ *$/d' file |
fileからコメントと空白行を削除 |
| sed 's/string1/string2/g' file |
file内で string2 を string1 で置換 |
| tr -d '\r' < file |
dos テキストファイルをunixに転換 |
| RPM |
| rpm -ivh packages(s).rpm |
rpm ファイルをインストール |
| rpm -Uvh packages(s).rpm |
rpmを用いてシステムをアップグレード |
| rpm -e package |
パケージを削除 |
rpm -q package
|
インストール済みパケージのバージョンを表示 |
| rpm -q -i package |
パケージ・メタデータ全部を表示 |
| rpm -q -f /path/file |
ファイルの属するパケージ |
| rpm -q -l package |
ファイルをインストールした場所の一覧 |
| rpm -q -l -p package.rpm |
ファイルをインストールする場所を一覧 |
rpm -q --requires package
|
そのパケージが必要とするファイル/パケージの一覧 |
| rpm -q --whatrequires package |
パケージを必要とするパケージを一覧 |
| rpm -q -a --queryformat "%10{SIZE}\t%{NAME}\n" | sort -k1,1n |
パケージ全部をサイズで一覧
|
| 双方向 |
mc
|
極めて強力なファイルマネージャ(開き方の分からないファイルがあるとき、mc上でそれを押す)、ftpクライアント, ... |
| screen |
切離し機能...のある仮想ターミナル |
| lynx |
ウェブ・ブラウザ |
| gnuplot |
双方向/スクリプタブル・グラフィング |
| octave |
matlab類似環境 |
