Linux Gazette 2004年5月投稿記事
 
目次
05/01/2004 - 08:38 Gentoo Linux announces Gentoo Linux 2004.1 by swift
  Gentoo LinuxがGentoo Linux 2004.1を発表
05/10/2004 - 08:04 Timers in Linux by Nikhil Bhargava
  Linuxにおけるタイマー
05/17/2004 - 02:18 A Linux Veteran's Assessment of Windows by silvan
ウィンドウズに関するLinuxベテランの評価
05/17/2004 - 07:29 Multithreaded RPC Server for Linux by BDerzhavets
Linux用多重ヘッドRPCサーバ
05/21/2004 - 02:50 Configuring a VME-Linux Diskless System on Motorola MVME24xx by Augusto Pereira
  VME-Linuxディスクレス・システムのコンフィギュア
05/26/2004 - 05:03 Compiling the linux kernel 2.2.12 on VME-PowerPC architecture by Augusto Pereira
  VME-PowerPC でのlinux kernel 2.2.12 コンパイル
05/28/2004 - 00:21 Multimedia/Internet Keyboards in GNU/Linux by rakesh_arky
  GNU/Linuxにおけるマルチメディア/インターネット・キイボード
 
 
 
 
 
Gentoo LinuxがGentoo Linux 2004.1を発表
Gentoo Linux announces Gentoo Linux 2004.1
投稿者 swift、05/01/2004 - 08:38. 記事|ディストリビューション
 
Gentoo Linuxリリース工学チームは、Gentoo Linux 2004.1のリリースを発表する。ダウンロード場所については mirror index を、インストレーション詳細に関する手引きについては Gentoo Linux Installation Handbook に問い合わせられたい。Gentoo Linux 2004.1のサポートについては、Gentoo Forums, IRC 及び各種団体mailing-listsを用いてユーザ団体が行う。Gentoo Linux Release Engineeringプロジェクトペイジから各アーキテクチャに関するリリースノートにリンクすることが出来る。
 
Gentoo Linux 2004.1 は、リリース成分全体の使い勝手と品質を強化するバグ修正に焦点を当てている。リリースの全体品質向上のため、セキュリティのためGPG署名、インストレーション段階に含まれるファイルのオンラインリスト、パケージCD及び各アーキテクチャ専用CDの作成など多大の努力を行った。その上、Gentoo Linux リリース・メタツール、Catalyst v1.0.7に多くの改良を加えてコードベースを固定化した。
 
パケージ済みGentoo Linux CDは、使用し易い寄付システムと同時に Gentoo Linux storeから入手することが出来る。
詳細はreleng@gentoo.orgのGentoo Linux Release Engineering team に問合わせられたい。
 
 
 
 
 
Linuxにおけるタイマー
Timers in Linux
投稿者 nikhil_bhargava、05/10/2004 - 08:04. 記事| ハウツー
 
緒言
この記事は、Linux OSが提供するタイマーに付いてである。タイマーは、アプリケーション・レベルのプログラムについても、デバイスドライバその他の低レベル・システムプログラムについても重要である。Linux OSはタイマー作成のため各種の機構を提供する。ここでは、これら機構の幾つかを論じる。この記事で引用するkernel版は2.4.20である。この記事は、開発者がLinuxのタイマーを提供するのに役立つであろうが、実行コードはこの記事に含まない。
 
RTC とシステムク・ロック
タイミングの分野で多くの人が混乱するのは、RTC(リアルタイム・クロック)とシステム・クロックとの間の違いである。RTCは、システムの電源が切れたとき、マザーボード上の小さい電池(デスクトップでは通常CMOS電池)を用いて、時間を追跡する。ブートアップに際して、kernelがRTCを読取って変数 xtimeを初期化する(xtimeは、2.4 linux では/include/linux/sched.hで宣言される)。このときkernelはこの xtimeを用いてウォールタイム(time_of_the_day)を初期化する。したがって、time of dayを読取るユーザ空間アプリケーションは、その値をxtime変数から受領する。通常kernelはRTCをブートアップに際してのみ読取るので、time_of_the_day()を呼び出すユーザ空間メソッドには、RTCの変化は反映されない。
 
タイマー割込
Kernel は通常、timer interrupt を用いて、時間割込を追跡する(通常はアプリケーションが呼出す各種タイマーのため)。timer interrupt は、変数 HZ の設定する所定時刻にシステムのタイマー・ハードウエアが発生する、 この変数 HZ は基本最小タイマー値HZの値(これはkernel構築時に設定することが出来る)にしたがって定義される。HZは、システムがサポートする最低タイマー値(基本クロック割込頻度)で、変更することが出来る(規定値は10ミリ秒)。
 
jiffies
jiffies は、kernelが維持する内部システム変数であって、システムの電源投入(スタート)以来の時の刻みの数を記憶する。 <linux/schedule.h>内で定義される。しかし、揮発性でロングとして定義されてにも拘わらず、連続使用可能時間(約1年半)のためオーバーフローすることがある。
 
アーキテクチャ固有のメソッド
殆どのプラットホームは、幾つかのアーキテクチャ固有タイマー機構をサポートしており、これが開発者に極めて短いタイマー割込を与えるのに役立つ。このようなオプションの一つは、クロックサイクル毎に値を一つ増やすタイマー・カウンタ・レジスタである。これは、プラットホームにより32ビット又は16ビットである。最も新しいカウンタ・レジスタはTSC (timestamp counter) で、これは、殆どの主要プラットホームで利用することが出来て、ユーザ空間及びkernel空間のromが読むことが出来る。このレジスタ (#include <asm/msr.h>)を読取るには、以下のマクロを用いる。
 
rtdsc(low,high); //Catches the 64 bit value into two 32 bit variables
rtdscl(low); //Catches the lower 32 bit value
 
他のプラットホームの殆どは rtdsc (#include <linux/timex.h>)の代替としてアーキテクチャ独立ファンクションである。 cycles_t get_cycles(void); // catches only the lower 32 bit of the counter
 
現在時刻
jiffies の値は、モジュールに正確な現在時刻を与える。jiffies は、比較的長い時間間隔の測定に優れた方法であるが、比較的短い時間間隔を得るにはアーキテクチャ固有メソッドに後退しなければならない。通常、デバイスドライバやkernelモジュールなどのシステム・プログラムは、ウォール時刻(cron 及びatどのユーザプログラムが与える時刻のフォーマット)でなくシステム時刻を必要とする。したがって、現在時刻を知るため沢山のファンクションがある。
このようなメソッドの一つはgettimeofday()である。これはtimeval構造体を秒とミリ秒で満たす。同様の別のファンクションはdo_gettimeofday() である。そのプロトタイプは、(#include <linux/time.h>) として定義される。
 
void do_gettimeofday(struct timeval *tv);
 
このファンクションは、マイクロ秒に近い分解値を与える。効率の良い別の方法で現在時刻を得る別のオプションは、kernalファンクション get_fast_time () である。
 
void get_fast_time (struct timeval *tv);
 
更に、現在時刻を得る最も容易な方法は、変数 xtime の値を用いる方法であるが、精度は低い。しかしそのフィールド全部を横切るのは割込を無効にしない限り自動的には行われないので、リアルタイムシステムには使わないことを薦める。
 
kernelタイマー
タイマーは任意のモジュールで時間が重要な機能性を確実にする機構である。周期的又は離散的な特定時間間隔の後、バッファを点検する必要のある又は何かデバイスを呼び出す必要のあるタスクの場合は、タスクを特定時間間隔の終わりに親しませて、予告が来るのを気にしたり待ったりすることなく、自由に正常進行させるた機構がなければならない。あらゆるアプリケーションでこの要求を満たすためタイマー処理が用いられる。
 
kernelタイマーは、作動に当たり前進後退両方のポインタを用いて二重リンクリストに組織される。このタイマーは、その後は期限切れになる値、識別用タグ(名称、所属プロセス、その他のデータ)及びタイマー期限切れのとき呼出されれるファンクション(ハンドラー)により特徴付けられる。タイマーのデータ構造体は次のようになる (#<linux/timer.h>):
 
struct timer_list
{
struct timer_list *next; //pointer to next timer in list
struct timer_list *prev; //pointer to previous timer in list
unsigned long expires; // timeout values in jiffies
unsigned long data; // argument to handler
void (*function) (unsigned long); // handler function
volatile int running; //flag denoting state of node
};
 
タイマーハンドラは、timer->expires>=jiffiesのとき呼出される。timer_list 構造体が初期化されると、それをadd_timer() が、定期的に呼出される選別リストにそれを挿入する。与えられるKernel タイマーAPI全部を示す:
 
void init_timer (struct timer_list* timer);
このファンクションは、新たに割当られたタイマーを初期化する。
 
void add_timer (struct timer_list* timer);
このファンクションは、新たに割当られたタイマーを、有効タイマーの全体リストに挿入する。
 
void mod_timer (struct timer_list* timer, unsigned long expires);
このファンクションは、有効タイマーの値を修正するため用いられる。
 
int del_timer (struct timer_list* timer);
このファンクションは、指定タイマーを有効タイマーのリストから削除するのに用いられる。
 
 
 
 
 
ウィンドウズに関するLinuxベテランの評価
A Linux Veteran's Assessment of Windows
投稿者silvan:05/17/2004 - 02:18. 記事| 一般
 
この記事は、元々alt.os.linux.mandrakeに "A Windows Veteran's Assessment of Linux." の題名に記事対する返答の積もりで投稿した。何人かからここへの投稿を薦められたので、少し手を加えて投稿する次第である。
 
私はXPが出る直前にLinuxに切り換えた。発表されそうなものが余り好きでなく、良い代案がないのを悲しんでいた。或る人が新たにリリースされたMandrake 8.1をメールして呉れた。お極まり通りの進行で、Debian Woody が出た時には、100% Linuxで走らせていた。最後のWindowsをLTSPターミナルに転換したのは、2002年の初めだった。
 
その頃(実際より随分長く感じる)XPを見る理由が何も無かったので、見なかった。私はコンピュータを仕事には使わない。コンピュータの仕事がないからだ。「コンピュータ経験」は無い。それを無視するのを楽しんでいる。XPを見たことのない唯一の人間かも知れない。だが上司の娘が助けを求めた時には、呼出しに応じた。
 
出会ったコンピュータは全く遅かった。何故か分からなかった。何がRAMやCPUサイクルを喰っているのか分からなかった。ctrl-alt-delを使って見たが「応答しません」と言うものはなく、何を停止すれば良いか分からない。
 
見ているコンピュータの種類を知ろうとした。コントロール・パネルを突付き廻して情報を探したが、どこに有るかが分からない。コンピュータの種類やROMの量をを知る手掛かりがない。Windowsがその中身を保存するKInfoCenter も /procディレクトリもない。
 
少なくとも背景は分かるかとDOSプロンプトを探した。私が助けている人はウイルスがいて、ウイルススキャナがSOMEFILE.EXEに問題があると報告したとと思い込んでいる。SOMEFILE.EXEを見付けて削除しようとしたが、何も彼も進むのが遅過ぎる。ウィルススキャナを走らせようにも、スタートしない。コンピュータ・ウィルスは私のDOS/Windows時代には問題でなかったので、ウィルス退治には余り自信がなかった。ウィルスに対する最良の防御は、用心して徹底的に対策を講じることで、私はそうして来た。
 
情報を探しているうちに、エラーメッセージが出たが、何処にも抜けられない。DSLモデモは接続されて居るが、何も彼も何処も時間切れだ。DOSボックスに到達する方法が分からないので、接続不良か、DNS問題か、その他の問題かを知る通常の診断方法を使うことが出来ない。有効なコンソールが無いのだ。隠されたものを見付ける方法がない。これらが無いと、何をすべきかの手掛かりが無い。
 
とにかく、一日も掛ける訳にも行かぬのでKnoppixを立ち上げて、調べる用意をした。立ち上げて直ぐ分かったのは、 P4 2.4 GHz、 256 MBのRAM、i845 ビデオ、i810オーディオ、sis900 NICであることだ。私の400MHZより早いので、このコンピュータが遅い筈がない。ハードウエアも同じで、慣れたものばかりなのは好都合だった。何かの具合が悪い。何かが完全にダウンしている(XPかも知れないし、そうでないかも知れない)。
 
パーティションはNTFSなので、SOMEFILE.EXEを削除する訳に行かない。出来ない筈だ。闇夜に鉄砲を打つようなものだ。手早く進めるためフォーマット仕直すことにした。他の方法で選別するには、XPを良く知らないし、Windowsも忘れ掛けている。
 
用意したディスクを使ってフォーマット仕直しはうまくいった。驚いた事に、フォーマット仕直しの後コンピュータを使い続けるのに 1-900の番号をダイヤルしてMicrosoftの許可を貰う必要がない。最初の立ち上げでユーザをコンフィギュアして、一番最初に見たものが何かが分かった。「カスタマ」はボックス上に6人のユーザを持っている。全部が「管理者」アカウントだ。彼女の学友だ。彼女等はルートレベルの責任を持って何をするか全く分かっていない。その中でボックスをこんなに酷く壊したのは誰かを知っているのは神様だけだ。スパイウエア、アドウエア、ウィルス、ウォーム、どれかと言うのは難しい。彼女はファイアーウォールも持っておらず、アップデートもしたことがない。それさえあれば、私が何時でもニュースで聞く沢山の研究利益の一つを利用することが出来る筈だ。「これこれのウイルスが蔓延して・・・これこれの被害を生じ・・・Windows XP と2000.だけが対象です・・・」。こんな何かが生じたに違いない。こんな環境では無理もない(分からないが推測だ。XPなどWindowsの世界がどうなろうと構わないのだが)。
 
私は、アカウントを彼女のユーザ用に一つと、管理者としての自分用に一つ設定した。そして、ホームを駆動して、ユーザとして走りそのユーザをスイッチャとして用いて、ソフトウエア・インストールやコンフィギュレーション変更などの、管理者作業を行う前の "su to root" に等しいことを行う点に持って来ようとした。この点をスタックとは思わない。Windows XPには真のマルチユーザと区画化機能がある筈だが、ものごとを左右する普通のホームユーザは、それが何かを理解しているとは思えない。このコンピュータ所有者は、自分の新規OSが提供する最良特性のうち一つを無意識に無効にしてしまった。私が自分でMandrakeでなくXPに切り換えたのあれば、同じことをしてしまったかも知れない。Linuxのやり方は、もっと良い方法を薦める。KDEでも何でもルートとして走らせることを認める誰にでも罵声を浴びせて、いじめ付けようとする。これが多分良い方法であろう。Windows王国にも同じことが必要だ。「理由なく管理者アカウントにログインするとは、何事だ。ログアウトし、ユーザとしてログインせよ」
 
ブートに際して、ハードウエアは何もサポートされない。ドライバで一杯のCDを慎重に調べなければならない。このハードウエアを探して見つけ出すものをLinuxから承知しているのでなければ、厄介なことになだったろう。オートファインダflummyは自動検索ジャックではないので、与えられたCDの中でチップセット番号を探し回たなければならない。先ずLinuxから見ることをしないで、何を探すか知る方法は、私には分からない(多分 1-900の番号でコンピュータ製造者を呼び出すのだろう)。
 
私のDebianのため二三ヶ月前に、ビデオを走らせるため最新の「実験用」XFree86を探す必要を生じたが、このXPボックスは何も彼もドライバを必要とする。XPは2000から来ており、当時の私のDebian はその時 Sarge 更新だったので驚く必要はない。Linux に付いて言えないことの一つは、古いソフトウエアを使うには費用節約をする必然的な理由があることである。早期の更新、頻繁な更新は、最新の見栄えと格好のよい新機能を持たせる。良い仕事をするボックスを買うときでも、沢山の最新プログラムが各ボックスに入っている。
 
Debian/Linux は、最低限このハードウエアのサポートに同意する。Sargeが「実験用」XFree86を組み込むまで数週間であったし、今日のSargeはこのビデオ「アウトオブボックス」を、その他もろもろと同様にサポートする。NIC、音響、USBは問題なし。インストールするだけで働く。Mandrake は多分一年も前にサポートした。
 
だから、兎に角スタートさせるだけだ。インターネットエクスプローラ、アウトハウルエクスプレス、基本的GUI何でも出来る。ユーザインターフェイスは、Windows MEより良いが、Playskoolのときのままだ。フォントは丸で駄目だ(多分変更可能だと思う。でなければ多数の人の悩みの種だ)。多分もっとKeramikに似るだろうが、KDEやGNOMEのような極めてスマートものにはならないだろう。Window連中が何かの開発に多くの年月を要したことを考えると、XPはKDEに比べ野暮で幼稚だと思う。KDE 2.xに比べてさえもだ。オプションについて人々を惑わそうとしているとは思わない。
 
(私の母は50歳過ぎだが、コンピュータ経験皆無から、今はKDEが随分分かっている。だが私をシステム管理者にしている。何か必要なとき、ソフトウエアのインストールや設定は私任せだが、余計なオプションで混乱することはない)
 
兎に角、3時間掛けてチップのバグを直し、コンピュータがウェブをサーフしe-メールを送ることが出来るようにした。もっと何かするには、したいことによって50ドルから500ドルのソフトウエアが入用になる。フリーウエア/シェアウエアもあるだろうが、ウェブで探してダウンロードしなければならない。一方私が Debianをインストールしたときは、14,000本余りのソフトウエアがインストール出来ると、 "select packages" ビットが告げた。Linux王国に未だ無い(沢山の)ことをWindows では利用出来るのは本当だが、ソフトウエアがありさえすれば、それを入手するのに全く問題がない。買いに行く手間も、ウェブをサーフする手間も、ファイルのダウンロードのためクレジットカードを取り出す手間も、呆れたことにドライバも要らない。パケージマネージャで数件をクリックするか、bashプロンプトからコマンドを出すだけで、手に入る。多分少々の質問に答えれば働き始める。全く手が掛からない。Debianの格別優れたパケージマネージャを使うと特にそうだ。
 
ルンルン気分で引き上げる前に、私は、「カスタマ」として無知な誰かがLinuxでも同じ量の問題を抱えるかも知れぬと気付いた。その人が、全員が同じルートアカウントを使う五人の友人とともに、KDEをルートとして走らせると、多分面倒に巻き込まれるか、何もかも台無しにする方法に出会うかも知れない。その人は多分、色々な議論で聞いたことのある実験室Linuxウイルスの一つを捕まえる方法を解明するだろう。私は、無知な人はLinux王国を出る方が良いと言っているのではない。その人はLinuxに対処することが出来ないくて「どうして分かるの、飽きないの。全部を勉強する気にはなれない。貴方は変わっている。子供みたい」などと何度も言うだろう。
 
何かより何かの方が良いと言う気はない。これは主張でなく、私自身の経験である。議論を吹きかけないで欲しい。
 
 
 
 
 
Linux用多重ヘッドRPCサーバ
Multithreaded RPC Server for Linux
投稿者 BDerzhavets 、05/17/2004 - 07:29. 記事 | システム管理
 
これは参考資料[1]第1章 "Sun RPC"に示すような一例である。これはLinux用多重ヘッドPRCサーバを構築するためのファイルsquare_svc.c である。ファイルsquare.xは(参考資料[1]のように)次の通りである:
struct square_in {
long arg1;
};
struct square_out {
long res1;
};
program SQUARE_PROG {
 version SQUARE_VERS {
 square_out SQUAREPROC(square_in) = 1;
 } = 2 ;
} = 0x31230000;
 
ヘッダファイル名を囲む二重引用符はsquare.hを除きすべて、ヘッダファイル用のC括弧になるのに注意。rpcgnを呼出してサーバ、クライアントstub、ヘッダファイルsquare.hとsquare_xdr.cを作る。キイ-A はLinuxではサポートしていないのを忘れないこと。これが問題を抱える理由だ(SunOSと比較せよ)$ rpcgen ?a ?M square.x サーバ側プロシージャコード:
 
/*
*                      ServerSideProc.c
*/
#include "square.h"
#include "stdio.h"
#include "stdlib.h"
#include "rpc/pmap_clnt.h"
#include "string.h"
#include "memory.h"
#include "sys/socket.h"
#include "netinet/in.h"
 
int request=0;
 
bool_t
 
squareproc_2_svc(square_in *inp,square_out *outp,struct svc_req *rqstp)
{
printf("Thread id = '%ld' started, arg = %d\n",pthread_self(),inp->arg1);
sleep(5);
outp->res1=inp->arg1*inp->arg1;
printf("Thread id = '%ld' is done %d \n",pthread_self(),outp->res1);
return(TRUE);
}
int
square_prog_2_freeresult(SVCXPRT *transp,xdrproc_t xdr_result,
caddr_t result)
{
xdr_free(xdr_result,result);
return(1);
}
 
修正コード square_svc.c:
 
/*                             square_svc.c
* このファイルを編集しないこと
*これは rpcgenを用いて作成された.
*/
 
#include "square.h"
#include "stdio.h"
#include "stdlib.h"
#include "rpc/pmap_clnt.h"
#include "string.h"
#include "memory.h"
#include "sys/socket.h"
#include "netinet/in.h"
 
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
 
pthread_t p_thread;
pthread_attr_t attr;
 
 
/* スレッドで走らせるべきプロシージャ */
 
void *
serv_request(void *data)
{
struct thr_data
{
struct svc_req *rqstp;
SVCXPRT *transp;
} *ptr_data;
 
{
 
  union {
        square_in squareproc_2_arg;
  } argument;
  union {
        square_out squareproc_2_res;
  } result;
  bool_t retval;
  xdrproc_t _xdr_argument, _xdr_result;
  bool_t (*local)(char *, void *, struct svc_req *);
 
ptr_data = (struct thr_data *)data;
struct svc_req *rqstp = ptr_data->rqstp;
register SVCXPRT *transp = ptr_data->transp;
    switch (rqstp->rq_proc) {
    case NULLPROC:
        (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
        return;
 
    case SQUAREPROC:
        _xdr_argument = (xdrproc_t) xdr_square_in;
        _xdr_result = (xdrproc_t) xdr_square_out;
        local = (bool_t (*) (char *, void *, struct svc_req *))squareproc_2_svc;
        break;
 
    default:
        svcerr_noproc (transp);
        return;
    }
    memset ((char *)&argument, 0, sizeof (argument));
    if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
        svcerr_decode (transp);
        return;
    }
 
    retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
 
if (retval " 0 && !svc_sendreply(transp, (xdrproc_t) _xdr_result, (char *)&result))   
  {
        svcerr_systemerr (transp);
    }
    if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
        fprintf (stderr, "%s", "unable to free arguments");
        exit (1);
    }
    if (!square_prog_2_freeresult (transp, _xdr_result, (caddr_t) &result))
        fprintf (stderr, "%s", "unable to free results");
    return;
}
}
 
/*
 
square_prog_2用新規コード
 
*/
 
static void
square_prog_2(struct svc_req *rqstp, register SVCXPRT *transp)
{
struct data_str
{
struct svc_req *rqstp;
SVCXPRT *transp;
} *data_ptr=(struct data_str*)malloc(sizeof(struct data_str));
 
{
data_ptr->rqstp = rqstp;
data_ptr->transp = transp;
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
pthread_create(&p_thread,&attr,serv_request,(void *)data_ptr);
}
}
 
int
main (int argc, char **argv)
{
register SVCXPRT *transp;
 
pmap_unset (SQUARE_PROG, SQUARE_VERS);
 
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, SQUARE_PROG, SQUARE_VERS, square_prog_2, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (SQUARE_PROG, SQUARE_VERS, udp).");
exit(1);
}
 
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, SQUARE_PROG, SQUARE_VERS, square_prog_2, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (SQUARE_PROG, SQUARE_VERS, tcp).");
exit(1);
}
 
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
 
ServerSQUAREのコンパイル:
$ gcc ?o ServerSQUARE ServerSideProc.c square_svc.c square_xdr.c \
?lprthread  -lnsl
 
クライアント側コード:
 
/*     
*                 ClientSideProc.c
*/
 
#include "memory.h" /* for memset */
#include "square.h"
#include "stdio.h"
#include "stdlib.h"
#include "rpc/pmap_clnt.h"
#include "string.h"
#include "memory.h"
#include "sys/socket.h"
#include "netinet/in.h"
 
int
main (int argc,char **argv)
{
CLIENT *cl;
square_in in;
square_out out;
if (argc != 3 )
{ printf ("Usage : client "hostname" "integer_valus=e"\n");
 exit(1);
}
cl = clnt_create(argv[1],SQUARE_PROG,SQUARE_VERS,"tcp");
if (cl == NULL) {
        clnt_perror (cl, "call failed");
        exit (1);
    }
in.arg1 = atol(argv[2]);
if (squareproc_2(&in,&out,cl) != RPC_SUCCESS)
{
  printf (“%s\n” , clnt_perror (cl,argv[1] ));
  exit(1);
}
printf("result: %ld\n",out.res1);
exit(0);
}
 
ここでClientSQUAREをコンパイルする:
 
$ gcc ?o ClientSQUARE ClientSideProc.c square_clnt.c square_xdr.c \
  -lprthread   -lnsl
 
テスト (参考資料 [1], “SUN RPC”の章): [root@dell4500 SQWMT]# cat square.bsh
 
./ClientSQUARE dell4500.redhat 10 & ./ClientSQUARE dell4500.redhat 11 & \
./ClientSQUARE dell4500.redhat 12 & ./ClientSQUARE dell4500.redhat 21 & \
./ClientSQUARE dell4500.redhat 13 & ./ClientSQUARE dell4500.redhat 14 & \
./ClientSQUARE dell4500.redhat 15 & ./ClientSQUARE dell4500.redhat 16 & \
./ClientSQUARE dell4500.redhat 17 & ./ClientSQUARE dell4500.redhat 18 & \
./ClientSQUARE dell4500.redhat 19 & ./ClientSQUARE dell4500.redhat 20 &
 
クライアント側出力:
 
[root@dell4500 SQWMT]# ./square.bsh
[root@dell4500 SQWMT]# result: 196
result: 225
result: 256
result: 289
result: 121
result: 144
result: 441
result: 169
result: 100
result: 324
result: 361
result: 400
サーバ側出力: [root@dell4501 SQWMT]# ./ServerSQUARE
Thread id = '1082453184' started, arg = 14
Thread id = '1090841664' started, arg = 15
Thread id = '1099230144' started, arg = 16
Thread id = '1116941120' started, arg = 17
Thread id = '1125329600' started, arg = 11
Thread id = '1133718080' started, arg = 12
Thread id = '1142106560' started, arg = 21
Thread id = '1150495040' started, arg = 13
Thread id = '1158883520' started, arg = 10
Thread id = '1167272000' started, arg = 18
Thread id = '1175660480' started, arg = 19
Thread id = '1184048960' started, arg = 20
Thread id = '1082453184' is done 196
Thread id = '1090841664' is done 225
Thread id = '1099230144' is done 256
Thread id = '1116941120' is done 289
Thread id = '1125329600' is done 121
Thread id = '1133718080' is done 144
Thread id = '1142106560' is done 441
Thread id = '1150495040' is done 169
Thread id = '1158883520' is done 100
Thread id = '1167272000' is done 324
Thread id = '1175660480' is done 361
Thread id = '1184048960' is done 400
参考資料: 1. W. Richard Stevens UNIX: Network Programming v 2.Interprocess communications Prentice Hall,1999
 
 
 
 
 
VME-Linuxディスクレス・システムのコンフィギュア
Configuring a VME-Linux Diskless System on Motorola MVME24xx
投稿者 Augusto Pereira 、05/21/2004 - 02:50. 記事|一般|ハウツー|システム管理
 
この文書は、NFS経由でルートファイルシステムをマウントする、ネットワークからのディスクレス運営のため、VMEバスとモトローラPRePアーキテクチャ(PowerPC MVME24xx ボード)に基づきサーバ(LinuxOS)を設定しクライアントを構成する方法を簡単に述べる。
キイワード:PowerPC, VME, Linux Diskless, Embedded & Control systems.
 
1. 緒言
VME-PPC-Linux アーキテクチャは、新規モトローラCPU (MVME2434) をVME上に使用し、ローカルエリア・ネットワークにより100 Mbpで接続される分散独立環境に統合され、クライアント側がVMEクレート上で走る一方、サーバ側は PC-Linux ワークステーション上で走る。これは、Linux システムからVMEバスにアクセスする一つだけの特殊な方法の作用を重要視する。我々の方法は、殆どのVMEプロセッサボード上では働かないTundra Universe PCI/VMEブリッジを必要とする。我々のTundra Universeドライバは、 Gabriel Paubertがプログラムして、この ftp サイトに置いてある。重要なのはVMEケージの中の特定デバイスのためkernelモジュールに書込魅することが出来るドライバを有することである。割込の取扱とDMA転送待ち行列形成も重要である。元々のインストレーションはkernelバージョン2.2.12に基づいており、後には同一のイメージzImage.nfsroot-2.2.12 だがPPC-CPU, base2_2.tgzのためのDebian GNU/Linux 2.2 'potato' ディストリビューション・ファイルシステムをサポートした。元々のLinuxソースコードにはイーサネットを100Mbpで働かせることに関係するバグがあったので、実際にはLinuxファイルシステムはDebian 2.2であるが、kernelイメージを修正して我々がリコンパイルした。これらは、サーバの /tftpboot ディレクトリにインストールする。そこにはlinuxPPCdeb2.2.12.tgzファイル、VMELinuxファイルを含むtarball、及び zImage-tulip、圧縮Linux kernelイメージが置かれている。作動させるには、クライアントがディスクレス・システムに自分のnfsrootファイルシステムをマウントすることの出来るNFSサーバを構成すること、及び交信をするためBOOTP又はDHCPサーバを構成することが必要である。Linuxがスタートすると、dselectコマンドで必要なLinuxパケージ全部をコンフィギュアすることが出来る。
 
2.サーバ・コンフィギュレーション
o 2.1 自分のサーバ上にTFTP 設定
自分のサーバでftp及びtelnetなど適切なサービスをするには、"Configure Network Service"をYAST SuseLinux ツールを用いて変更する。済んでいなければtftp rpm をインストールし、/etc/inetd.conf ファイルの中でtftp及びbootpsに関する行をアンコメントする。
 
o 2.2 自分のサーバ上にNFS ファイルシステムを設定
次いで、etc/rc.configにSTART_PORTMAP=yes とNFS_SERVER=yesがあることを確認する。ps aux | grep nfs に続いて、以下のような/etcサーバディレクトリにCreate exports fileをタイプして、nfsデーモンが働いていることを試すことが出来る:
 
/tftpboot/160.103.145.6 d251.esrf.fr(rw,no_root_squash)
/tftpboot/160.103.145.7 d252.esrf.fr(rw,no_root_squash)
/tftpboot/160.103.145.8 d253.esrf.fr(rw,no_root_squash)
/tftpboot/160.103.145.9 d254.esrf.fr(rw,no_root_squash)
/tftpboot/160.103.145.10 d255.esrf.fr(rw,no_root_squash)
 
bootptabを変更するときは、nfs及びinetdデーモンを再スタートするため次のようなexports又はdhcpd.confファイルが必要である:
 
etc/rc.d/nfsserver stop
etc/rc.d/inetd stop
etc/rc.d/nfsserver start
etc/rc.d/inetd start
 
以下を置いて、サーバ内の /etc/hosts ファイルを修正する:
 
160.103.145.6 d251.esrf.fr d251
160.103.145.7 d252.esrf.fr d252
160.103.145.8 d253.esrf.fr d253
160.103.145.9 d254.esrf.fr d254
160.103.145.10 d255.esrf.fr d255
 
o 2.3 BOOTP 又はDHCPD サーバの設定
サーバ上でdhcpdデーモンが走っていることを確認する。ps aux | grep dhcpd コマンドにより、走っていることをチェックする。走っていないとき、Suseシステムではdhcpdプログラムが /etc/rc.d/dhcpd に置かれている。プログラムがそこにあるときは、dhcpd startを用いてデーモンをスタートさせることが出来る。プログラムがそこにないときは、dhcpd デーモンを、ディストリビューションCDからか又はインターネットからダウンロードしたものからインストールしなければならない。dhcpd.confファイルにコンフィギュレーションを追加する。このファイルは、 /etc ディレクトリにある筈だ。構文は次に示すようになる:
 
ddns-update-style ad-hoc;
subnet 160.103.145.0 netmask 255.255.255.0 {
option domain-name "esrf.fr";
option domain-name-servers 160.103.6.12;
option routers 160.103.145.99;
option ip-forwarding on;
}
 
host d251{
hardware ethernet 08:00:3E:2C:F5:A8;
fixed-address 160.103.145.6;
filename "zImage_tulip";
server-name "castilla.esrf.fr";
server-identifier 160.103.145.2;
option host-name "160.103.145.6";
}
 
host d253{
hardware ethernet 00:01:AF:07:79:02;
fixed-address 160.103.145.8;
filename "zImage_tulip";
server-name "castilla.esrf.fr";
server-identifier 160.103.145.2;
option host-name "160.103.145.8";
}
 
host d254{
hardware ethernet 08:00:3e:2c:f5:94;
fixed-address 160.103.145.9;
filename "zImage_tulip";
server-name "castilla.esrf.fr";
server-identifier 160.103.145.2;
option host-name "160.103.145.9";
}
 
host d255{
hardware ethernet 00:01:AF:0B:11:CC;
fixed-address 160.103.145.10;
filename "zImage_tulip";
server-name "castilla.esrf.fr";
server-identifier 160.103.145.2;
option host-name "160.103.145.10";
}
 
コマンド: /etc/rc.d/dhcpd restartをタイプしてdhcpdデーモンを再スタートする。システムのスタートアップに際してデーモンを走らせるには、etc/rc.configにSTART_DHCPD=yes を入れる必要がある。DHCPDの代わりにBOOTP プロトコルを使いたいときは、/etcディレクトリの中に、次に示すようなbootptabファイルを作らなければならない:
 
allhost:\
:ht=ether:\
:vm=rfc1048:\
:to=auto:\
:bs:\
:hd=/tftpboot:\
:bf=vmlinuz:\
:sa=160.103.145.2:\
:sm=255.255.255.0:\
:gw=160.103.145.99:
 
d251:ha=08003e2cf5a8:ip=160.103.145.6:tc=allhost:
d253:ha=0001af077902:ip=160.103.145.8:tc=allhost:
d254:ha=08003e2cf594:ip=160.103.145.9:tc=allhost:
d255:ha=0001af0b11cc:ip=160.103.145.10:tc=allhost:
 
BOOTPプロトコルに関する適切なrpmファイルのインストールを忘れないこと。Suseディストリビューションに関しては、これらはbootparamdとbootp-DD2である。
 
o 2.4 PPC ファイルシステムの準備
次に進む前に、下に示すファイルを入手して、 /usr/local/linuxppcに入れなければならない:
 
zImage.nfsroot-2.2.12 (...イーサネット速度t 10 Mbps で働かせるとき)
zImage-tulip (...100 Mbpsで働かせるとき)
base2_2.tgz (... 必要なファイルシステムを含む tarball )
 
必要なファイルシステムを作るには、次のステップを踏む:
 
> su
> mkdir tftpboot
> chmod a+xwr tftpboot
> cd /tftpboot
> ln -s . tftpboot
> cp /usr/local/linuxppc/zImage.tulip .
> cp /usr/local/linuxppc/base2_2.tgz .
> mkdir 160.103.145.6
> cd 160.103.145.6
> tar xvzf /tftpboot/base2_2.tgz
> mv /tftpboot/160.103.145.8/sbin/unconfigured.sh /tftpboot/160.103.145.8/sbin/not.unconfigured.sh
 
次のファイルを以下のように人手でエディットしてコンフィギュアする:
 
/tftpboot/160.103.145.8/etc/hostname
d253
 
/tftpboot/160.103.145.8/etc/hosts
160.103.145.2 castilla # tftpboot server for BM25
160.103.145.8 d253 # First crate VME for branch B
 
/tftpboot/160.103.145.8/etc/resolv.conf
search esrf.fr
nameserver 160.103.6.12
nameserver 160.103.6.84
 
/tftpboot/160.103.145.8/etc/securetty
# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
ttyS0
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
tty12
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
 
/tftpboot/160.103.145.8/etc/fstab
#
# /etc/fstab
#
# これをエディとするには fstool (コントロール−パネル) を使用しなければならない!
#
#
 
castilla:/tftpboot/160.103.145.8 / nfs nolock,rw 0 0
none /dev/pts devpts defaults
none /proc proc defaults
yellow:/segfs /segfs nfs nolock,rw,soft 0 0
 
/tftpboot/160.103.145.8/etc/network/interfaces
# interface file for ifup用インターフェイスファイル
# 作者: marguet@esrf.fr 21/6/02
 
iface lo inet loopback
 
/tftpboot/160.103.145.8/etc/inittab
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.8 1998/05/10 10:37:50 miquels Exp $
 
# 規定値ランレベル
id:2:initdefault:
 
# Boot-time system configuration/initialization script.
# 緊急モード (-b) でブートするとき以外は、これを最初に走らせる
si::sysinit:/etc/init.d/rcS
 
# 単一ユーザモード為すべきこと.
~~:S:wait:/sbin/sulogin
 
# /etc/init.d が、ランレベルの変更に際して S 及びK スクリプトを実行する
#
# ランレベル 0 は、停止
# ランレベル 1 は、単一ユーザ
# ランレベル 2-5 は、複数ユーザ
# ランレベル 6 は、再ブート.
 
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# 通常は到達しないが、緊急の場合に実現不能になる
z6:6:respawn:/sbin/sulogin
 
# CTRL-ALT-DEL が押されるとき為すべきこと
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
 
# 特殊キイが押されたときの作動 (ALT-上向き矢印).
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
 
# 電源故障/復元のとき為すべきこと.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
 
# ランレベルに関する /sbin/getty 呼出
#
# "id" フィールドはデバイスの最終文字( "tty"の後)
# と同一でなければならない
#
# ファーマット:
# :::
 
# 以下行は初期化問題 (PowerPC)のため、
# VME-ESRF (10-7-2002)に関し、コメント化する
#1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
 
# 連番行の上にgetty を入れる方法の例(ターミナルのため)
#
# 以下の行は、ターミナルのスタートに必要な
# VME-ESRF (10-7-2002)についてはアンコメントする
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
 
# モデモ行にgettyを入れる方法の例:
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
 
/tftpboot/160.103.145.8/etc/mtab
castilla:/tftpboot/160.103.145.8 / nfs rw,nolock,nolock 0 0
none /proc proc rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
yellow:/segfs /segfs nfs rw,nolock,soft,addr=160.103.6.219 0 0
 
/tftpboot/160.103.145.8/etc/passwd
 
/tftpboot/160.103.145.8/etc/shadow
 
/tftpboot/160.103.145.8/etc/hosts.allow
ALL:ALL:ALLOW
 
/tftpboot/160.103.145.8/etc/hosts.deny
#ALL: PARANOID
 
3. クライアント・コンフィギュレーション
o 3.1 Establishing Network connections with PPCBug
TIMEコマンドを用いてRTC(リアルタイムクロック)の作動を確認して日付を設定
SET mmddyyhhmm
 
NIOTコマンドを用いてボードにIPアドレス可能性を与える。envコマンド上のNVRAMのパラメータを無効にすると、NIOTがエラーメッセージに応答して、入力される値をセーブしない。NPINGコマンドを用いてネットワーク接続性を検証する。
NPING 0 0 SourceIP DestinationIP 1
 
o 3.2 MVME24xx ファームウエアをコンフィギュアする
コマンド
ENV
を用いて環境変数を設定する。
 
サーバとクライアントの間で交信させるのにDHCPDを選ぶときは、NIOTコマンド上でクライアントIPとサーバIPを示す必要はないが、BOOTPでは必要である。コマンド行プロンプトでNBOコマンドを用いて、システムをグーとする。
 
4. 参考資料
ESRF. http://embedded.port5.comにあるControl and Data Acquisition System for the Spanish Beamline (BM25) (「スペインBeamline(BM25)のための制御及びデータ取得システム」)
 
PPC. http://ppd.fnal.gov/experiments/e907/linuxppc/linuxppc.htmlにあるMIPP DAQ Documentation Project - Linux (「MIPP DAQ ドキュメンテーションプロジェクト - Linux」)
 
Debian VME PPC. http://people.debian.org/~bottoms/Debian-VME-PPC.html
 
Root over nfs clients & server Howto. http://www.tldp.org/HOWTO/Diskless-root-NFS-HOWTO.html
 
VMELinux Project. http://www.vmelinux.org/
 
 
 
 
 
VME-PowerPC でのlinux kernel 2.2.12 コンパイル
Compiling the linux kernel 2.2.12 on VME-PowerPC architecture
投稿者 Augusto Pereira 、05/26/2004 - 05:03. 記事|ハウツー|システム管理
 
この文書では、VMEバスとモトローラPowerPC MVME24xxボードを用いてlinux kernel 2.2.12 をネットワークからのディスクレス運営のためコンパイルする方法を述べる積もりである。これは、元々のLinuxkernelにはイーサネットDECチップ21142/4を100Mbpイーサネットで働かせることに関係するバグがあったので、NFS経由でそのルート・ファイルシステムをマウントし、tulip 100 Mbpドライバパスを含む。
キイワード:PowerPC, VME, Linux Diskless, Embedded & Control systems.
 
1. 緒言
VMEバス・コンピュータ用のOSは、高価で重要な習熟曲線を有する通常リアルタイムOS (RTOS) である。その代わり、RTOSは機械の制御又はプロセスに対する応答のため実世界事象に対し迅速に応答する。VMEバスは、無骨なコンピュータ囲いと、ネットワーク能力などの相互接続システム、 telnet又は同様のプログラムを通じるリモートアクセス、FTP又は同様のプログラムを通じるファイル転送、BOOTP又は同様のメソッドを通じるリモートブーティング、システム割込に応答する方法、などを提供する。
 
VMELinuxの目的は、OSにおける別の選択肢をVMEシステムインテグレータに与えることである。機能が豊富で、信頼性が高く、廉価なLinuxは、埋込コンピュータ産業に利益をもたらす。高価なOSは、VMEが多くのアプリケーションに使用されるのを妨げる。LinuxとVMELinuxドライバを用いると、無骨なコンピュータに新たな可能性が生まれる。
 
PowerPCは、IBMとモトローラが開発したRISCマイクロプロセッサである。最初のチップは1992年にリリースされた601で、その後603と604シリーズが開発され、続いてG3として知られる750、その後にG4シリーズが出た。PowerPC用Linux は、先ずkernelの2.2.xバージョンでリリースされた。PowerPC Linux 開発の主要リソースはpenguinppcで、Linux PowerPC kernelソースの最新リリースと開発を含んでいる。Debian PowerPCポートがDebian GNU/Linux 2.2 (`potato')により最初に公式にリリースされた。PowerPCのサポートは、リリース 3.0 (`woody')で維持されている。
 
PowerPCマイクロプロセッサを用いる各種のシステムがあり、モトローラ MVME24xx ボードファミリ(その他多数)がPowerPC とイーサネットDECチップ 21142/43を使用している。Debian のpotatoバージョン(2.2.x)には、そのDECチップを使って100 Mbps イーサネット速度で働かせるにはバグがある。次の行では、kernel 2.2.12を正しく補修してコンパイルし直す方法を説明する。
 
2. 手順
1. kernel 2.2.12 とGabriel Paubertの generic、及び VME patchを、自分の /tftpboot/160.103.145.10/usr/src ディレクトリにダウンロードする。.
2. /tftpboot/160.103.145.10/usr/srcから、古い linux ディレクトリを削除してkernel (tar -xzvf linux-2.2.12.tar.gz).をアンパックする。
3. mv linux linux-2.2.12
4. ln -s linux-2.2.12 linux
5. cd linux-2.2.12
6. patch -p1 < ../mvme2600.generic-patch-2.2.12
7. patch -p1 < ../mvme2600.vme-patch-2.2.12
8. トップレベルMakefileをエディットする。クロスコンパイルをするときは、 CROSS_COMPILEオプションに変更して'CROSS_COMPILE =powerpc-linux-' (引用符なし)を読み取る必要がある。また 'ARCH :=' line to read 'ARCH = ppc'を変更する必要がある。
9. クロスコンパイラ・ディレクトリに向かって送られるパスを、我々の場合はexport PATH=/segfs/linux/ppc/cross-suse72/bin/:$PATHに変更しなければならない。
10. make distclean
11. make mrproper
12. ここで 'make xconfig' 又は 'make menuconfig' 又は 'make config' 又は 'make oldconfig'とタイプする。ファイル config-OK をロードする。kernelコンフィギュレーションの'General setup' の下に'PReP bootloader arguments' が内蔵されているのを確認する。次ぎに、これを選んでroot=/dev/nfs に変更する。'Networking options' の中に'IP Kernel level auto configuration' が内蔵されているのを確認し、次いで、 'Bootp support' を同時に内蔵として選択する。 In the 'Filesystems section' 'Network File Systems' 'Root file system on NFS'と同時に選択されているのを確認する。
13. make dep
14. /drivers/net/Makefile ファイルのバックアップを作る (改名)。 ftp://ftp.scyld.com/pub/network/ (netdrivers-3.5.tgz)を入手。.それを /drivers/net/にuntarする。 my old /drivers/net/Makefileを復元する。更新ドライバをkernel http://www.scyld.com/network/updates.html に内蔵するように、kernel_path>/drivers/net/Makefile を次のように編集する
L_TARGET := net.a
L_OBJS := auto_irq.o pci-scan.o
M_OBJS := pci-scan.o
MOD_LIST_NAME := NET_MODULES
15. make clean
16. gmake zImage
17. ここで、全てが上手く行っていれば、kernelイメージがarch/ppc/prepboot/zImageに置かれているので、これを /tftpboot/ にzImage-tulipの名でコピイする。
18. make modules
 
3. 参考資料
ESRF. http://embedded.port5.comにあるControl and Data Acquisition System for the Spanish Beamline (BM25) (「スペインBeamline(BM25)のための制御及びデータ取得システム」)
 
Debian VME PPC. http://people.debian.org/~bottoms/Debian-VME-PPC.html
 
PPC. http://ppd.fnal.gov/experiments/e907/linuxppc/linuxppc.htmlにあるMIPP DAQ Documentation Project - Linux (「MIPP DAQ ドキュメンテーションプロジェクト - Linux」)
 
Root over nfs clients & server Howto. http://www.tldp.org/HOWTO/Diskless-root-NFS-HOWTO.html
 
VMELinux Project. http://www.vmelinux.org/
 
 
 
 
 
GNU/Linuxにおける
マルチメディア/インターネット・キイボード
投稿者 rakesh_arky 、05/28/2004 - 00:21. 記事|一般
 
常駐「おたく」として、新規ユーザが他のOSからGNU/Linuxに転換するのを手伝うことがある。長い間に、Gnu/Linux をインストールした色々な人に、上手く働かないハードウエア装置について聞いて見た。最も多いのがマルチメディア/インターネット・キイボードだった。この記事では、Hotkeys プログラムを用いてこのようなキイボードを一つ構成する。
 
Anthony WongのHotkeysは、マルチメディア/インターネット・キイボードが設ける特殊キイ全部を取り扱って、それらに関連するプログラムを立ち上げるため書かれた。Gnu/Linuxでこれらのキイを構成する方法は沢山あるけれども、Hotkeysは構成が大変楽で、そのosd(画面表示)は、他のOSのものに良く似ている。
 
Hotkeys サイトを訪ねて、プログラムの最新版と同時に tarball 又は deb パケージをダウンロードすることが出来る。
Debian マシンへの員ストリレーションはapt-getを用いておこなうことが出来る。
 $ apt-get install hotkeys
 
コンフィギュレーション
Hotkeys は、通常xinitでスタートするデーモンをスタートする。これはグローバル・コンフィギュレーション・ファイル /etc/hotkeys.conf を用いるので、ユーザは自分のコンフィギュレーションを$HOME/.hotkeysrcに記憶することが出来る。
 
hotkeys.confファイルは、良くコメントされているので、新規ユーザにも問題はない。その内容は次のようにまとめられる。
 
デバイス設定
キイボード型   (kbd="")
CD ドライブ   (CDROM="")
サポートされるキイボードは、'hotkeys -l' コマンドを用いてチェックすることが出来る。
 
キイ動作
Tag = 'command' (Play = "xmms --play-pause")
Tagの完全なリストは、/usr/share/doc/hotkeys/sample.xmlファイルにある。ユーザは自分のカスタムtagを作ることも出来る。
 
画面表示特性
フォント    (osd_font="")
色      (osd_color="")
位置     (osd_position="")
 
/etc/hotkeys.conf ファイルの例:
 
############################################################
# hotkeys用グローバル・コンフィギュレーション        #
############################################################
 
# これらは規定値である
#  # で始まる行はコメントである
 
### 規定値キイボードを定義 (.def 拡張子なし) するので
### 毎回-tを規定する必要はない。
Kbd=hp5181
CDROM=/dev/cdrom # CDROM ドライブが無いときは 'none' を用いる
 
 
PrevTrack=xmms --rew
Play=xmms --play-pause
Stop=xmms --stop
Pause=xmms --pause
NextTrack=xmms --fwd
Rewind=
 
WebBrowser=mozilla
Email=mozilla -mail
Calculator=xcalc
FileManager=gmc
MyComputer=gmc
MyDocuments=gmc
Favorites=gnome-moz-remote --remote=openBookmarks
Transfer=gtp
Record=grecord
Shell=xterm -rv
ScreenSaver=xscreensaver-command -activate
NewsReader=mozilla -news
Communities=mozilla -remote 'openURL(http://slashdot.org)'
Search=mozilla -remote 'openURL(http://google.com)'
Idea=mozilla -remote 'openURL(http://sourceforge.net)'
Shopping=mozilla -remote 'openURL(http://thinkgeek.com)'
Go=mozilla -remote 'openURL(http://linux.com)'
Print=lpr
Rotate=
 
osd_font=-arphic-ar pl kaitim big5-bold-i-normal--0-250-0-0-c-0-*-*
### 色に関しては、/etc/X11/rgb.txtの中の文字列、又は
### RGB 構文 #RRGGBB、##A086FFなど、の何れかを用いることが出来る。
osd_color=LawnGreen
osd_timeout=3
### osd_positionは、 'top' 又は 'bottom' のいずれかである
osd_position=bottom
osd_offset=25
 
新規マルチメディア/インターネット・キイボードの構成
Hotkeysプログラムは未だ開発中で、自分のキイボードが規定値リストに無いことがある。自分のキイボードを構成するには、自分のキイボードの特殊キイ全部のキイコードを見出す。
 
xevプログラムを用いてキイコードを捕捉し、それをファイルにセーブする。カーソルをxevウインドウの白角印に動かして、特殊キイを順番に押す。順番を覚えておかないと、キイコード割当で困ることがある。
 $ xev 2>&1 >mykeys
 
キイコードにかんするファイルを検索する。
 $ grep 'keycode' mykeys | cut -d ' ' -f7,8 >mykeycodes
 
ファイルを点検してキイコードを見る。
  $ cat mykeycodes
keycode 223
keycode 166
keycode 151
keycode 232
keycode 159
keycode 153
keycode 144
keycode 165
keycode 158
keycode 146
keycode 178
keycode 150
keycode 148
keycode 149
keycode 173
keycode 164
keycode 163
keycode 162
keycode 161
keycode 152
keycode 160
keycode 174
keycode 176
keycode 64
 
HotkeysはXMLを用いてキイコードとその機能を定義する。これらは ' .def ' ファイルとして/usr/share/hotkeys ディレクトリに記憶される。hotkeysが提供するsample.xml ファイルを用いてカスタムキイボード定義ファイルを作って見よう。
 $cp /usr/share/doc/hotkeys/sample.xml /usr/share/hotkeys/custom.def
 
hotkeys は、Sleep, Search, Shopping及び各種CD/DVDプレーヤ・コントロールなど各種定義済み「タグ」をサポートする(/usr/share/doc/hotkeys/sample.xml参照)。各「タグ」には動作が割り当てられており、 SleepはAPMを使ってコンピュータをハイバネーションに追い込む。他の多くの特殊キイもまた構成することが出来る。
 
例えば私のキイボードの半月キイは 'Sleep' タグに構成してある。
<Sleep    keycode="223"/>
 
また未定義ショートカットキイは、次を用いて設定する。
<userdef keycode="232" command="xterm">Xterm</userdef>
 
上述の例で、custom.def がどのようになるかを示す。
 
<?xml version="1.0"?>
 <definition>
  <config model="My custom keyboard">
 
   <!-- Support Tags functions --> 
    <Sleep    keycode="223"/> <!-- half-moon key -->
 
   <!-- User define functions -->
  <userdef keycode="232" command="xterm">Xterm</userdef>
  </config>
 
 <contributor>
  <name>your-name</name>
  <email>your-email</email>
 </contributor>
<definition>
 
custom.defをキイボード型に用いることにより custom.defをテストする。
    $ hotkeys -t custom
 
同じcustom.defファイルを使って、もっと沢山のキイを定義することが出来る。一寸した労力が報われる。hotkeysを使って新しいマルチメディア/インターネット・キイボードを構成したら、時間を割いて自分の'.def ' をプロジェクト開発者に送られたい。同じ種類のキイボードを使う人に役立つ。
 
最新版
関連の最終記事についてはGrmtech technical writing team を訪ねららたい。
 
ウェブ情報源
Hotkeys ヘルプフォーラム
http://sourceforge.net/forum/forum.php?forum_id=91461
 
Hotkeys プロジェクト
http://sourceforge.net/project/hotkeys/
 
 
 
 
 
END