Linux Gazette 2002年12月号 #85
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
n最新Linuxディストリビューションとハードウエアに挑戦されたPC
n世界中の身障者よ、団結せよ!
n自家用x86 OSを作りませんか
nウエブ上でファックスを見る
n今月のPerlワンライナ−ダブルUIDの場合
nコンピュータ馬鹿話
nプログラム例−C#データ型
n Ptraceを用いるプロセス追跡−パート3
n多重ブートCDの作成
n TUXで始めよう
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 


 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
DMCA
DCMAの風変わりな解釈を見付けるのは、樽の中の魚を撃つ程易しいと揶揄される。Registerは、FatWallet.comが販売高と価格の比較を宣伝するのを阻止するため主要販売業者4社(WalMart, Target, Best Buy, Staples)がDCMAを持ち出した invoked the DMCA と報じている。販売価格は著作権のある情報(で単なる事実ではない)との言い分だ。高価な訴訟費用を避けるため、FatWalletは応ぜざるを得ない。
別のDCMA関連事件では、ゲーム機modチップを作るハードウエア製造者が、装置を通じてDCMAを適用されるのをおそれて生産を止めようかと考えている have found themselves under pressureとSecurity Focusが報じている。チップの正当性はその使用が侵害になるか否かに左右されるが、それは国によって変動することがある。
最後に、Adam C. EngstがTidBITSに書いた面白いDCMA記事DMCA article がある。法律から生じる問題と、「コンテント産業」が長い目で演じる賭けをうまくまとめている。TidBITS にはCory Doctorowの「デジタルハブはハリウッドで生き残れるか」Can the Digital Hub Survive Hollywood?.と題する別の記事もある。コンテント/メディア産業と広い意味の知識産業の利害(技術が「コンテント」の保護に用いられるとうまくやる知識産業の中で社会的利益の福祉に反する)との間の緊張に焦点を当てている。特に BPDG (放送保護討論グループ)に注目している。
 
Mobilix
下級審の判決を覆して、ドイツ法廷はMobilixの名称が、Obelixと発音が似ており混乱を引き起こすと裁定したGerman court has ruled 。Mobilixは、モバイル装置うえでUnixの領域を扱うウエブサイトである。この判決の最終的な扱いは明確でないが、Mobilixのウエブサイトon the Mobilix websiteで全容を知ることが出来る。
 
DRM
Slashdotは最近ACM Digital Rights Management Workshopに関して報じたreported。目立つのは、Ed Feltenのコメントbrief commentary can be read hereである。DRMがハリウッド情報保持者が案じる著作権のため本当に万能薬になるかとの懐疑論が報じられている。無関係ではない話として、Register はMicrosoftのPalladiumの将来reported on the future of Microsoft's Palladium とTrusted Computing Platform Alliance (TCPA)について報じている。システムの弁護者は、これが全く安全ではなく、インテリジェントなハードウエア攻撃に対して弱いことを認めている。
 
 
 
▼▼▼一般ニュース▼▼▼
MySQL, NuSphere とGPL
MySQL ABは、NuSphere社との抗争で和解したsettled its dispute。MySQL ABは、NuSphereがGPLを侵害してMySQL商用を盗用したと主張していた。 (NuSphereがその製品の強化にMySQLを含めた)。NuSphereは、MySQLに対する貢献に関する著作権をMySQL AB に譲渡した。偶然の一致ではなく、MySQL ABは無料ソフトウエア基金のGPL合致Labに対し$25,000を寄付したばかりでdonated $25,000 to the Free Software Foundation's GPL Compliance Lab、これがGPL侵害に関する会社のGPL化ソフトウエア追跡提案を助けた。FSFの執行役員Bradley Kuhnによると、殆どすべてのGPL侵害が、故意ではなくではなく不注意の違反である。
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
Debian
Debianウィクリニュースは、ALSAのインストールとコンフィギュアに関するLinuxOrbit手引き書 HOWTO on installing and configuring ALSAに焦点を当てているhighlighted。これは、課題を実行する正しい「Debianの方法」を説明している。
 
Knoppix
DebianウィクリニュースはDebian Weekly News Reported、Debian-Med サブプロジェクトDebian-Med subproject がKnoppix-Med プロジェクトを発足させたstarted と発表した。目的は、医療ソフトウエアの特殊版をDebianベースの Knoppix ディストリビューション Knoppix distributionに含むことにある。プロシージャの詳細はオンラインで入手することが出来るare available online

SuSE
SuSE Linux は、SuSE Linuxの企業用デスクトップ展開に関する多段階キャンペーンを発表した。2003年1月から、「SuSE Linux オフィス・デスクトップ」を使って中小企業がLinuxをデスクトップに移植することが出来る。大企業におけるデスクトップ展開のため最適化されたLinux版、「SuSE Linux エンタープライズ・デスクトップ」は、2003年第一四半期にリリースされる予定。
                 --------------
SuSE Linuxはまた、SuSE Linux Enterprise Server (SLES) が、IBMのDB2バージョン8データベース・ソフトウエア用の強力なLinuxプラットホームであることを、DB2用SLES最新構成を用いて証明した。SuSE Linuxエンタープライズ・サーバーは、Linux用DB2プラットホーム(IBM zシリーズを含む)でサポータされたすべてのハードウエアプラットホームで検証され、DB2エンタープライズ・サーバー版走ることを検証された検証最初のディストリビューションである。Linux検証のためのIBMのDB2に関する詳細情報は is available online.で。
 
UnitedLinux
The UnitedLinux groupは、そのUnitedLinux製品、ビジネスユーザを狙った標準に基づくLinux OSのバージョン1.0のリリースを発表した。UnitedLinuxは、世界中で一様な、Linux開発とLinuxのディストリビューション認証の簡潔化を計る産業主導の成果である。UnitedLinuxの基金提供会社は、Linux産業リーダーのConectiva S.A., The SCO グループ、 SuSE Linux AG、Turbolinux, Incである。
 
 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
新規kernels
新しい安定なkernel 2.4.20がリリースされた。中世に住んでいる人のためには、新しい旧kernel 2.2.23もリリースされた。近くのkernel mirror で更新されたい。

Mathematica をNECの Itanium Linux プラットホームに移植
Wolfram ResearchNECは共同で、来るMathematica 4.2.のリリースに備え、MathematicaをNECのItanium Linuxに移植した。

Appligent Alliance プログラム Appligent は、集成人とコンサルタントが、クライアントのためいっそう強力な電子文書管理アプリケーションを開発するのを助ける設計の新しいAllianceプログラムを公開した。Appligentの主製品は、特にRed Hat Linuxをサポートする様々なPDF-関連ソフトウエアである。

Intel 及び PowerPC上のLinuxのための更新Opera 6.1
Opera Software は、Intel 及びPowerPCユーザーのため、Linux用Opera 6.1 をリリースした。PowerPC版は、2001年5月にLinux用臨時Opera 5.1ベータ以来初めてこのプラットホーム上でリリースされた。幾つかのバグ修正に加え、この新版では、規定値でフォントアンチアライアスが有効なこと、中国語、日本語、韓国語のサポートを改善したことなど、フォントのサポートが良いのを特徴とする。 The changelogに、このリリースの新規開発のすべてがある。

Pygame
Pygame は、ゲームなどのマルチメディア・ソフトウエアをPythonで書くのを容易にする設計のクロス・プラットホーム・ライブラリである。PygameはPython言語とSDLマルチメディア・ライブラリを必要とする。主な利点は移植性で、Pygameに基づくゲームは、LinuxだけでなくNT4, MacOS, OSX, BeOS, FreeBSD, IRIXで走らせることが出来る。

  Cylant Secure
Cylantは、Linux侵入防止システム用管理コンソールをWindowsに移植した。管理者はWindowsワークステーションからWindowsコンコンソールにより、CylantSecureサーバー・エージェントを管理することが出来る。

Copyright © 2002, Michael Conry. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
最新Linuxディストリビューション
ハードウエアに挑戦されたPC
By Richard Johnson

緒言
Linuxには自家用マシンだけには不要のご自慢の能力がある。私は洗濯機を走らせようとはしないが、何時かそんな日が来ると思う。Linuxを多くの人に楽しんで貰うため、最近のLinuxディストリビューションは、インストレーション過程を、使いやすいGUIに包み込む携行にある。SuSE Linuxが問題の場合だ。そのインストレーションにはYaSTインストーラを使うがこれは、魅力的なインターフェイスを見せびらかし、Linuxのような難しいOSのインストールを楽しい経験にする。しかしこれには欠点がある−これらグラフィカル・インストーラは、コンピュータに力があることを必要とする。SuSEは、YaSTインストーラに最低64MB RAMがあることを推奨する。

しかし、OSが実際にインストールされると、Linuxにはこんなスペースに合致しないマシン上で働く能力がある。屋根裏で埃を被っていた古い486を使ってインストレーションを自分流におこなうことが出来る。これは予備機、ルータときにはウェブサーバとして使うことが出来る。

それなのに、こんなマシンで最近のLinuxをインストールしようとすると、魅力的で使いやすいインストーラは、働くのを単に拒絶するだけだ。

最近私は、最新Linuxディストロを、相当古いマシンにインストールする機会があった。問題を幾つか克服したので、この記事を書いた。他の人に役立って、余分な古いマシンに良い用途を見付けて下さればと思う。

インターネットの必要性
色々な理由で、私の勤める小会社がローカルネットワーク上でインターネット・サイトを利用する必要があるのが判った。複雑なことは何も要らない。各種社内文書その他の情報を扱い、それらを誰でもネットワーク上で容易く利用出来るようにするだけだ。

これは、Microsoftだけを使う我が社にLinuxを導入する良い言い訳になるとも思った。

小売業の利益は知れたものなので、Microsoftの IISなどを走らせるのに必要な強力な新マシンの費用を請求することは出来ない。しかし、今は使っていない予備機がある。このPCは、我が社の比較的新しい勘定組織では使えない旧型機なので、部屋の隅に追いやられていた。私は当然このPCを将来のインターネットサーバに割り当てていた。

この機械のメモリは最近の基準は比較的小さい−実のところ搭載OSは、ワークグループ3.11用ウインドウズを使うMS-DOS 6.22だ。このPCには200MHzペンティアムMMX、16MB RAMと、20GB HDDが搭載されている。我々のインターネットが機械に求める需要にはー少なくとも最初は−これで充分だと思った。将来RAMを増やす必要はあるだろうが、RAMは安くて、何時でも大きく出来る。これで始めることにした。

ディストリビューション
ボックスを純粋にローカルネットワーク上のウエブサーバとして働かせるため−Xサーバの搭載は不要−比較的小さいLinuxだけが必要だった。選んだディストリビューションはSuSE Linux 8だった。自分の家のPCで使っていて、SuZEのやり方に慣れていたからだ。色々試したが、矢張りSuZEが良かった。ライセンス秘密警察の訪問を心配しないで、自分のCDから新OSをインストール出来るのも気休めになった。

インストレーション
PCをブートアップしF2キイを叩いてBIOSに入った。クイックチェックが出て、先ずCD-ROMからブートせよと指示したので、次のように働くよう設定した。SuSE Linuxディスクを挿入して、新しいBIOS設定でPCをブートし直した。CDからのブートの後、出てきたSuSEメニューから'standard installation'を選んだ。

SuSE Linuxのインストレーション過程は、ハードディスクでなくramdiskを使って初期ファイルシステムを作り、Linuxのコピイをシステムメモリにロードすることから始まる。又は少なくとも−そのようにしようとする。システムは、ramディスクをメモリに解凍しようとする。暫く待つと、システムのメモリが小さいのが判って、動かなくなるようだ。そこでctrl-alt-delを押すとシステムは優雅に止まる。

もう一度試す−コンピュータをもう一度CD-ROMからブートするが、今度は、SuSEの 'safe installation'を試す。残念ながら、前と全く同じ結果だ。

ボックスの物理メモリが足りないためかと思う。SuSEのウエブサイトを調べると、セットアッププログラムを走らせるに必要な最低メモリは、前に言った通り 64MBで、私のボックスに恵まれた16 MBより遙かに大きい。

諦めないでもう一度CD-ROMからブートして、最初のSuSE画面がテキストベースのインストレーションを始めるとき、SuSEが通常作るGUIベースのインストレーションより少ないメモリが必要な筈と踏んで、F2キイを押した。旨く行った。Linuxの最初のコピイ、ramdiskそしてすべてが、システムメモリにロードされ、テキストベースのYaSTインストレーションが始まった。このような問題について、好きな言語として、二、三の質問を受けた。YaSTを走らせるにはメモリが充分でないとのメッセージが出た。また、インストレーションが止まった。

この段階でYaSTは、パーティションswapを起動して物理メモリの代わりに仮想メモリを作るオプションを与えた。残念ながら、ボックスには大きい2GB FAT16 DOS パーティションだけで、swapパーティションがなかった。だが、解決策が示された。実際にYaSTを走らせる前に、手動でディスクのパーティションを仕直す−純粋Linuxパーティションを作る−と、どこかに行ける筈だ。

パーティション
優れたパーティション用ソフトウエアへのアクセスがないので、FDISKのLinux版と一緒にLinuxブートディスクを入手することとし、自分のパーティションを始動させた。

このためTom's Root Boot Diskをダウンロードした。これは、完全にブートすることの出来るLinuxシステムで通常の1.44MBフロッピイディスクをフォーマットするDOS実行可能ファイルを、小さいファイルシステムと必要な小型ユティリティを含めて、提供する。Tom's Root Boot Diskは、http://www.toms.net/rb/ からダウンロード出来るが、余り推奨しない。

Tomの呉れるDOS実行可能ファイルは、私の通常のデスクトップ上のOS−Windows 2000 のプロンプトからは走らない。代わりに実際のDOS OS を必要とするので、ダウンロードしたzipファイルを、Linuxを搭載しようとするボックス−これにはMS-DOS 6.22が搭載されている−にコピイして解凍した。Win95/98 PCをMS-DOSモードでブートし直しても適切な環境が得られる。フロッピイを適切なドライブに入れて、Tomのプログラムにブートディスクを作らせた。最後に新しいLinuxブートディスクでコンピュータをブートし直した。

ここで、最初はFDISKが間違った作動したことを白状しなければならない。元のDOSパーティションを殺して新しいピカピカのLinux swapパーティションを作ったと思ったが、そのためFDISKがディスクのヘッド、シリンダ、セクタを間違って報告する結果となった。だから、新パーティション・テーブルを滅茶目茶に書いた。二度目にはFDISK自体が働いて旨く行った。だが−FDISKの作用に被害妄想が残ったので−ハードディスクの詳細を正しく検出したのを確認した。PCを切り離してディスク自体のラベルを点検した。

FDISKは、使うソフトウエアには恐ろしいものと言われることが多いが、いつでも真っ直ぐに働いてくれた。FDISKを立ち上げるには、次のようにタイプする:
      #> fdisk /dev/hda


勿論、パーティションするハードディスクは第一IDEディスクであると想定する。FDISKにどのデバイスをパーティションするか命令する。この場合は /dev/hdaだ。FDISKの文法に疑問があれば Tom's root boot diskにはマニュアルがあるので参照されたい。

FDISKを開始したら、単一文字コマンドでその行動を制御する。利用することの出来るコマンドのリストを見るにはmとタイプする。pは現行パーティションの詳細を画面にプリントする。

先ずdとタイプし、プロンプトされたとき、どのパーティションかを指定して、既存のパーティションを削除する。パーティション番号は画面にパーティション詳細をプリントしたとき判る。FDISKは、wコマンドを使って変更を書き込むまで、ディスクに何の変更も加えない。間違ったらqとタイプし、変更をセーブしないで立ち去る。しかし、一旦書き込むと、元に戻る方法はないので慎重にすること。nコマンドで、新しいパーティションがディスクに加わる。新パーティションは規定値でLinuxパーティションなので、新パーティションをLinux swapパーティションに変更するにはtコマンドを使う必要がある。lコマンドを使うとFDISKのサポートする各種パーティション型の全リストを見ることが出来る。Linux swapパーティションはタイプ82だ。

私の場合、別々の一次パーティション二つをディスク上に作った。第一は、サイズが128MBのLinux swapパーティションで、第二は、ディスクの残りを使ったLinuxパーティションだ。続いてパーティションをフォーマットする。swapパーティションには次のコマンドを使う:
      #> mkswap -c /dev/hda1


これは、デバイスhdaのパーティション1にLinux swap領域を作る。 -c フラッグは、パーティションに悪いブロックがないかをmkswapに点検させる。第二Linuxパーティションは、次のコマンドを使ってLinux第二拡張ファイルシステムでフォーマットした:
      #> mke2fs -c /dev/hda2


文法は、mkswapと似ている。

インストレーション− 一寸した後戻り
パーティションを作ったら、もう一度SuSE Linux CDからブートした−もう一度F2を押してテキストベースのインストレーションを最適化する。今回は、swapパーティションを起動したくなったとき、作ったばかりの /dev/hda1にあるパーティションを指定するためだ。YaSTは、このとき−少し遅いが−問題なく進行する。

これから先のインストレーションは簡単だ。SuSEのYaSTは巧みさと使い易さのバランスが取れた素晴らしいセットアップツールだ。監視すべき唯一の問題は、YaST自体のディスク・パーティショナだ。これは既存のパーティションを認識し、第二パーティションをReiserFSジャーナル・フォーマットでフォーマットし直すことを教える。これをするのは歓迎だが、swap パーティションのフォーマット仕直しも教えている。実際に使用しているswapパーティションのフォーマットは問題を起こしそうなので、これはしない方が良いと思った。

結言
YaSTは良いが、メモリを食うし、作ったswapパーティションを大幅に使うのは確実だ。Linuxをインストールして走らせると、16MBのRAMだけで必要なサービスだけは走っるのを確かめた。勿論swapパーティションには沢山の働きがある。

最終的には、ボックスにメモリを追加した。これにより、多数のユーザが求める要求を処理出来るようになった。Linuxが限られた資源でも旨く働くのに感心している。

Copyright © 2002, Richard Johnson. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
世界中の身障者よ、団結せよ!
By Janine M Lodato


この記事は、介助技術(AT)においてLinuxが果たせそうな役割を探求する。ATにより、多発性動脈硬化症者、身障者又は高齢者が健康と生活の独立性の維持を管理することが出来る。

はじめに
事業目的のため競争を排除するマイクロソフトの独占事業の最も犯罪的で不道徳な側面の幾つかは、今日のPCが
     * 高価過ぎる


     * とてつもなく信頼性が低い


     * 狂がいじみて複雑
であることだ。

Windowsの世界のこれら否定的特性のため、今日のPCは、次のような真に必要とする人が使えないものになっている:
     * 高齢者


     * 身体障害者


     * 学習障害者


     * 及び上記のため働く専門家
これらの人々の合計は、世界人口の半数以上に達する。これらの人々は、電話のように簡単に働く、協力介助技術(AT)システムを必要とする。ウエブで繋がれたATベースの端末−端末協力システムがあると、簡単な仮想社会の形で、専門家がグループ型の支援を提供することが出来る。

ここでLinuxが利用出来る。これは、低価格の荒削りで簡単なクライアントシステムを使って、この大きい市場に近付くのに適している。Linuxサーバに接続されたLinuxベースのクライアントシステムは、このような端末−端末ATシステムのため完璧である。信頼性があって簡単なLinuxの特徴をLinuxベースの低価格ハードウエア、プラットホーム及びアプリケーションとともに結びつけたものが、AT機能を必要とするエンドユーザのための唯一の解決策である。

なすべき仕事
ウエブを通じて接続された介助技術(AT)自助健康改善の著しい品質向上を果たすことが出来る。精神神経免疫學(PNI)を含む行動医学の分野における主要大学の最新科学研究は、協力グループ活動への参加に著しいリハビリ効果があることを示す。事実、行動医学は疾病を防止し、生活と社会復帰の質を改善する。勿論これは医薬品に代わるものではないが、その効果を高める。

身障者と高齢者を支援するウエブ接続ATクライアントとサーバに基づく協力仮想社会システムはまた、健全な体で目や手が忙しい専門家がその生産性を高めるため使うことが出来ることが示されている。学習障害児童もまた、ATをうまく利用することが出来る。この低価格ATプラットホームと関連のウエブ接続は、多くの政府及び企業雇用の場でも有用であるだろう。この二重使用方法は、必要な技術の価格をすべてのグループのため著しく低下するであろう。

勿論、なすべき仕事は残っている。健康サービス専門家又は社会福祉専門家と多くの人々との間の協力が出来るよう、AT技術用アプリケーションを開発し又は完成しする必要がある。Linuxサーバに接続されたLinuxクライアントマシン上で走るウエブ接続ATを指向するソフトウエア成分として、次のものを開発しなければならない:
     * 簡単でアプリケーション特有のユーザ・インターフェイス


     * コンピュータ/電話を通じる音声ベースの相互作用


     * 常時接続、常時利用可のシステム


     * 協力仮想社会システム
このようなシステムを使って、専門家は協力社会の会員を観察、助言、緩和、治療することが出来る。好例として、学習障害のある生徒を扱うとき、彼らの注意を引き、彼らの行動を支持し、最後に彼らの認識生産性を改善する必要がある。介助技術を使って、彼らの能力がさらに壊れるのを防止し、生活の質を改善しある程度社会復帰させることが出来る。生産的であるのと考えだけでも、人の自負心を著しく高める。

個人の一例
数年に渡るAT使用の経験から、私はこれがSPMS(二次進行性多発性動脈硬化)状態に極めて役立つことを見出した。自分の経験を以下に簡単に述べる。
ATについての膨大な経験に加えて、私はまたカリフォルニア州立大学(AT企業相互交流のセンター)と同時にサクラメントのCSU及びストックトンのUOPの卒業資格認定に関わった。
私も身障者だが、極めて当然の社会に対し価値あるプロジェクトでの仕事に集中するのに満足している。このようなことに参画することは、自分の治癒力にもなる。私は、個人的参加に基づくPNIの力のお陰で生きている。
車椅子監獄を生き抜くため、特に著作のための音声認識で、ATに頼りながら、二つの価値を見出した。一つは、使用が容易なため、目や手の忙しい専門家がその生産性を高めたこと、二つ目は、身体障害者による使用だ。
MSで障害者になって、私は物書きにIBM ViaVoice をMAC上で使っている。これを使って、eメールにより口頭で友人と連絡すると同時に自己表現の機会を獲得しATの場で価値あるプロジェクトに参画している。
一般的に、今の音声認識システムは大変良好だが、時々頓珍漢なタイプをする:
     * emerge -> eat March


     * inevitable -> in edit a bowl


     * Nazi -> not see


     * multiple schlerosis -> multiple skull roses


     * idiosyncracies -> HBO sink receives


     * 夫が私の近くでクシャミをしたらコンピュータは「アハ」とタイプした
私の知識力の発達から耐える充足感を受け取って、それらを積極的に使っている。54年の生涯で沢山の否定的な経験から学んだので、私は肯定的な経験を楽しんで楽天主義を学んでいる。これら知識力を使う最良の方法は、協力的チームワークと障害者社会の中の個人的意志疎通に参加し、この社会に介助技術を提供する会社に参加することである。
私にとって、健康を保って大切にしているものに参加することが重要である。そこで、傷害のある人に利用することが出来る最新のATシステムに参画する決心をした。特に、物書きのための音声認識及びお喋りのための音声起動電話サービスなど、障害者の自己表現を助ける技術に関心がある。
身障者が未だ持っている音声、唇の動き、目の動き、脳波などの身体能力に焦点を当て、それを利用するAT型の技術が沢山ある。これらの能力は、二、三を上げると、脳起動コンピュータ・システムと音声認識ソフトウエアで利用することが出来る。これら既存技術を、障害者クライアントが利用して自己表現をすることが出来る何かに統合すると、傷害にかかわらず彼らに自由度を与えるであろう。
このマーケットを指向することを捨てに探っている会社があることを理解することは、私に、この領域へ容易で全く自然な参加をさせる。次の私の使命は、脳起動コンピュータ制御システムを目指す会社を見出すことである。
精神的能力と音声を未だ制御している身障女性として、正しい人々を連絡させることにより、互いに有益な仮想社会を育てるためインターネットを通じてシステムを統合することが出来るような何かを提案したい。

終わりに
個人的連絡及び協力的チームワークは、傷害者の自尊心を押し進めるのに介助技術を必要とする。Linuxは、その低価格、オープンアーキテクチャ、国際的開発により、これら技術の構築のため理想的なプラットホームを提供する。傷害を持つ人々(及びその親戚友人)は、ATが提供することの出来る恩恵を直接体験で知っているので、この仕事に独特の貢献をすることが出来る。
ATプロジェクトへの参加は、別の方法でもまた障害者を助ける。彼らの問題からの気分転換だけでなく、自分の信じる大義を押し進めるため時間を費やすちの建設的な道を与える。
行動医学の積極的社会復帰効果は、MSの最終的治療法が開発されるまで生きて喜ぶ私の方法である。

[LG は介助技術に関するLinuxの応用について、追加の記事及び Mailbag レターを歓迎します。ご意見をお知らせ下さい。 -Ed.]

Copyright © 2002, Janine M Lodato. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
自家用x86 OSを作りませんか
By Patrick Mahoney
 
1. 緒言
趣味のプログラマが、自家用OSの開発を始めようとして、出会う困難の一つは、どこから始めるかを見出すことだ。沢山の書物が理論的OS概念を説明するが、趣味のプログラマの手を取ってこれら概念に差し向かわせるものはない。それが、この記事の目的だ。
 最近のLGで幾つかの記事がこの話題に関して現れた。私はプログラム指向ではない方法で、自家用OSの開発に必要なツールとヒントを読者に示すだけで、この問題を扱おうと思う。この記事を読み終えたら、関心のある読者はすべて、入手出来る資料を探して設計とコーディングを始められる筈だ。
 ご存知ないと思うが、OSの開発は最初からは始めない。確かなブートローダを書くのはそれ自体が大プロジェクトなので、OS開発プロジェクトをブートローダを書くことから始めるのは勧めない。信頼出来るものが沢山無料で手に入る(Grub, lilo, ppcbootなど)。自分で書く積もりなら、プロジェクトの後段まで延ばすことを勧める。この記事では、GNU Grub、Grand Unified Bootloader、を使う。

2. 開発環境の説明
 OS開発の苦労を軽くするため、適切な開発環境を整えなければならない。
* 新たにコンパイルしたkernelの迅速なテストができること。


* 開発マシンをブート仕直さないで済むこと。


* OSの記憶媒体としてフロッピイを使わないで済むこと


 この記事では、これらの要件に見合う多数の可能な環境のうち一つを示す。これは開発用マシンと試験用マシンを含み、両方とも共通ネットワークに入っている。

2.1開発用マシン
 明らかに、このマシンにはプログラミングツール、つまりアセンブリ、Cコンパイラ、リンカ及び'make'ユティリティ、を必ず搭載していなければならない。
 最初に考えたより役立ったのは、エミュレータだ。これはkernelのデバッグに役立ち、新たに加えたコード行を迅速にテストすることが出来る。但し、エミュレータは、良いマシンには敵わない。
 次に、TFTPサーバが必要だ。このツールがあると、試験用マシンのtftpが有効になり、kernelを開発用マシンからネットワーク接続経由で取得することが出来る。

2.2 試験用マシン
マシンで必要なすべては、ネットワーク・カードとそれをサポートするTFTP起動ブートローダだ。

3.開発環境の設定
3.1 開発用マシン
 選んだプログラム用ツールは:
* gcc 2.95.4


* ld 2.13.90.0.10


x86エミュレータにはBochsバージョン1.4.1を選んだ。デバッガモードを有効にしてコンパイルするのに特に注意すること。次のコマンドがジョブをおこなう筈。
 $ ./configure --enable-x86-debugger


 $ make


Bochesを正しく使うには、ディスクイメージを作る必要がある。このイメージは、ブートローダとファイルシステムの両方を持っていなければならない。これは mkbimage スクリプトを使っておこなう。面倒なら、この this gzipされた10MBディスクイメージを捕まえて.bochrcファイルに以下を加える:
diskc: file=c.img, cyl=24, heads=16, spt=63


 TFTPサーバと同じく、私はatftpdを選んだ。これはLinuxベースのTFTPサーバ・マシンで実行するのに楽に使える。

3.2 試験用マシン
 選んだブートローダはGNU Grub バージョン 0.92だ。ネットワークカードと対話するにはGrubのtftpクライアントを有効にするのを忘れないこと。私の試験用マシンは安いNE2000 ISA模造品だった。netboot/README.netbootの指示にしたがって、次のコマンドを使った:
$ ./configure --enable-ne --enable-ne-scan=0x220


$ make


 PnP PCIカードはコンフィギュアが楽なことに注意。ここで、Grubイメージを試験用マシンのMBR又はフロッピイのいずれかで試験用マシンがブートする方インストールすることが出来る。私の試験用マシンは別の用途にも使うので、HDをいじりたくないから、後者の方が好きだ。
 $ cat ./stage1/stage1 ./stage2/stage2 > /dev/fd0


 ここでフロッピイを試験用マシンに入れてネットワークカードが認識されるのを見る。手でコンフィギュアするか又はもしあれば、dhcpサーバーを使う。
grub> dhcp


Probing... [NE*000]


NE2000 base 0x220, addr 00:C0:A8:4E:5A:76


Address: 192.168.22.14


Netmask: 255.255.255.0


Server: 192.168.22.1


Gateway: 192.168.22.1


 ブートの度にこれらのパラメータを一々コンフィギュアする必要はない。詳細については、GNUドキュメントの'grub-install'スクリプトを見られたい。
 これで終わりだ、設定を試験しよう。

4.開発環境設定の試験
 前にも言ったように、OSプログラムの肝心なところは専門家に任せる。だから君の設定を試験するには、/docs ディレクトリにあるGNU Grubソースから例示kernelを使う。
 このkernelは三つのソースファイル:boot.S, kernel.c, multiboot.hから構築されている。そのkernelを次のようにして構築することが出来る。
$ gcc -I. -c ./boot.S


$ gcc -I. -c ./kernel.c


$ ld ./kernel.o ./boot.o -o kernel -Ttext 1000


手短かに不完全な説明をする。Multibootは、ブートローダのため、それがロードしようとするkernel情報を渡す方法を定義する。boot.S がこの情報を受けて、スタックを設定し、'cmain'を呼び出す。この機能がvgaディスプレーを設定し、渡された情報を読み取って、内容を幾つかプリントして離れる。次いでboot.Sがコントロールを取り戻し、文字列 'Halted.'をプリントして無限ループに入る。簡単だろう!コードの詳細に入ろう。

4.1 Bochを使って・・・
 計画は、ループバック装置を通してディスクイメージをマウントし、kernelをイメージのファイルシステムにコピイし、それをアンマウントし、Bochsを首にすることだ。勿論、ファイルシステムの最初にオフセットを加えなければならない。だが、それは判っているだろう。
 # /sbin/losetup -o 32256 /dev/loop1 ./c.img


 # /bin/mount -t ext2 /dev/loop1 /mnt/osdev/


 # cp /docs/kernel /mnt/osdev


 # umount /mnt/osdev/


 # /sbin/losetup /dev/loop1 -d


 $ bochs


 勿論、これはMakefileで自動化することが出来る。単に次のようにする:
 grub> kernel (hd0,0)/kernel


 grub> boot


  −
Bochs screenshot
   (フルサイズにするには画面をクリック)

4.2試験用マシンを使って
 先ず、TFTPサーバをを設定してクライアントがkernelを回収することが出来るようにする:
 # /usr/sbin/atftpd --daemon /home/bono/src/grub-0.92/docs


 試験用マシンをお払い箱にする。ネットワーク接続を上に示したように構成する。次いで、開発用マシンのipアドレスをTFTPサーバーアドレス及びkernelイメージの位置として規定する。このオプションはdhcpサーバにより設定出来ることに注意。最後にブートプロセスを開始する。
(...)





grub> tftpserver 192.168.22.36


Address: 192.168.22.14


Netmask: 255.255.255.0


Server: 192.168.22.36


Gateway: 192.168.22.1





grub> kernel (nd)/kernel


[Multiboot-elf, , ,


shtab=0x106190, entry=0x100568]





grub> boot


 Bochs と似た画面が試験用マシンのディスプレーに現れる筈

5. これから行く先
自家用OS開発のスタートを切った。ウエブには良いドキュメントが沢山ある。目を通して、書き込んで、聞いて、考える。kernelはモノリシックか、ミクロか?セグメンテーションか、ページングか?
デバッグで、エミュレータとkernelのprintkがからはみ出したら、OSに付け加えられる設定の一つはシリアル・デバッガだ。これはシリアルポートに入れた数バイトから、gdbコンパチブル・リモートデバッグ・エクステンションの範囲に渡る。この情報は、ヌルモデモ・シリアルケーブルを通して開発用マシンに回収し処理することが出来る。これはOS開発に共通の手軽な方法だ。

6.参考資料
* Tanenbaum' os dev book
OSシステム開発のバイブル
* alt.os.development
色々な問題の解決策がここで見付かる。
* Freenode IRC's #osdev (irc.debian.org)
眠らない友人
* Tim Robinsonを含むos開発個別指導幾つかA few osdev tutorials
Timがここにいた
* The Operating System Resource Center
* BosoKernel
良く出来た初心者用指導書(フランス語)
* Intel Architecture Software Developer's Manual Volume 3: System Programming
独立には必携。

7. 謝辞
 #osdev: pavloskii, geist, oink, byrdkernel, airに関する数々の質問に我慢強く答えてくださった方々に感謝する。

Copyright © 2002, Patrick Mahoney. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
ウエブ上でファックスを見る
By Mark Nielsen
 
緒言
この記事では、ウエブ上でファックスを扱うのに私が使っている簡単なPerlスクリプトを説明する。方法は荒っぽくて私と会社の同僚一人とだけが使っているが、役には立っている。これを使って小企業から超大企業までのファックスを扱う専門スクリプトを書くのは容易い。他のファックスシステム用にウエブインターフェイスを作るのも極めて易しいと思う。個人的には、ファックスをウエブペイジ経由で送っている。世界中どこからでもシステムにアクセス出来るからだ。

セットアップ用には、一寸付き合い難いefaxを使っている。良識を持てば HylaFax 又は別の案(mgettyに望みがある)を勧める。

Linux Focus.の別のefax記事も読まれたい。

Configuring Apache 2.0のコンフィギュア
先ず、Apache 2.0をcompiledしてconfiguredした私の方法を見られたい。沢山の中の一つだ。configファイルにはあるがPhpは私のウエブサーバーでは働いていない。

ディレクトリ /usr/local/apache2/htdocs/faxがあり、ここに私のPerlスクリプトを入れてファイルを.htaccess する。

このディレクトリの下に、次のディレクトリがある:
* home -- 私のファックスはここに行く


* ab -- その他の Audioboomerang ファックスの行く場所


* source -- オリジナルのファックスをここにおく


* display -- 未読/保管ファックスのリスト


* archives -- ps 及び pdf ファイルを保管する



.htaccess をこれらのディレクトリにおいて、人々のアクセスを制限する。.htaccessの一例は、次の通り:
 AuthName Test


 AuthType Basic


 AuthUserFile /usr/local/apache2/passwords/Passwords


 order deny,allow


 require user mark ted


htpasswdを使ってパスワードを変更/追加することが出来る。
,
次は、最後のperlスクリプト作成だ。私の荒削りのperlスクリプト示す。他にすることがあるとすれば、Pythonスクリプトに書き直す。Pythonはプログラムの次の波だからだ。Python, Zope, Apache, Linux, PostgreSQLは、私のプログラム作成の優先環境だ。これを "fax.pl"としてセーブし、セーブの後"chmod 755 fax.pl" を実行する。
これはdownload しても良いし、下記を見るだけでも良い。
#!/usr/bin/perl





use CGI;





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





my $Home = "/usr/local/apache2/htdocs/fax";


my $Source = "$Home/source";


my $Archives = "$Home/archives";


my $AB_Archives = "$Home/ab";


my $Display = "$Home/display";


my $Home_Archives = "$Home/home";





 `mkdir -p $Source`;


 `mkdir -p $Archives`;


 `mkdir -p $Display`;


 `rsync -av /var/spool/fax/incoming/fax* $Source`;


 `mkdir -p $AB_Archives`;





 #------------------------------------


 my @Files = <$Source/fax*>;


 foreach my $File (@Files)


   {


 #  print "$File\n";


   my (@Temp) = split(/\//, $File);


   my $File_Name = pop @Temp;


   if (!(-e "$Archives/$File_Name\.pdf"))


     {


     print "<br>Processing new fax: $File\n";


     my $Command = "tiff2ps $File > $Archives/$File_Name\.ps";


 #    print "$Command\n";


     `$Command`;


     my $Command = "/usr/bin/ps2pdf $Archives/$File_Name\.ps $Archives/$File_Name\.pdf";


 #    print "$Command\n";


     `$Command`;


     `cp $Archives/$File_Name\.pdf $Display/$File_Name\.pdf`;





     }


   }





 #---------------------------------------


 my $query = new CGI;


 my $Action = $query->param('action');


 my $File = $query->param('file');


 $File =~ s/[^a-zA-Z0-9\_\.]//g;





 if (!(-e "$Display/$File")) {}


 elsif ($Action eq "archive")


   {


   print "<br>Archiving $File\n";


   `rm -f $Display/$File`;


   }


 elsif ($Action eq "archive2")


   {


   print "<br>Archiving $File\n";


   `cp $Display/$File $AB_Archives/`;


   `rm -f $Display/$File`;


   }


 elsif ($Action eq "archive_home")


   {


   print "<br>Archiving $File\n";


   `cp $Display/$File $Home_Archives/`;


   `rm -f $Display/$File`;


   }








 print qq(<hr><a href="archives/">Archives</a> -- 多分パスワード保護。


 <br><a href="home/">Home Archives</a> -- 多分バスワード非保護。


 <br><a href="ab/">Audioboomerang Archives</a>\n);





 my $Table_Entries = "";


 my @Files = <$Display/fax*>;


 foreach my $File (sort @Files)


   {


   my (@Temp) = split(/\//, $File);


   my $File_Name = pop @Temp;


   my $Link = "<a href='display/$File_Name'>$File_Name</a>";


   my $Delete = "<a href='fax.pl?action=archive&file=$File_Name'>archive file</a>";


   my $AB ="<a href='fax.pl?action=archive2&file=$File_Name'>archive to AB</a>";


   my $Home ="<a href='fax.pl?action=archive_home&file=$File_Name'>archive for Home</a>";





   $Table_Entries .= qq(<tr><td>$Link</td><td>$Delete</td><td>$Home</td><td>$AB</td></tr>\n);


   }





 print "<table border=1><tr><th>View Fax</th><th>Archive the Fax</th>


 <th>Archive to AudioBoomerang</th></tr>\n";


 print $Table_Entries;


 print "</table>\n";





 if (@Files < 1) {print "<h1> No faxes or they are all archived.</h1>\n";}


読者のためのヒント 



1.最近は普通Python 2.2 で書いているので、これも書き直すべきだが、たまたまmod_perl とApache 2.0.を試していたのでPerlで書いた。
2.ファックスとして送り出すためLinuxがtiffに転換することが出来るPostScript, images, その他をアップロードさせるPythonスクリプトで書くこと。加えて、そのPythonスクリプトは、システムに融通性を持たせるため電話番号、カバーレター、その他を受け取るのがよい。
3.自分のApache 2.0 サーバーからファックスを送受信するためクライアント・プログラムとして働くPython/TK 又はwxPythonスクリプトを作ること。ここでの工夫は、人々がpostscriptファイルを先ず作って、ファックスをアップロードし、さらに、Pythonスクリプトを直接プリントする何かの方法を考えることである。
4.複数ペイジのファックスがあるときは、ウェブサーバ上でペイジを検出して順序に並べ、psmerge その他のツールを使って一つのpsファイルに合併するPerl/Pythonスクリプトを持つこと。
5.ファックスは繊細なので、ファックスを見たり送ったりするにはApache 2.0の確実なサービスを使うこと。

結言
efaxはファックスを送るとき扱い難いので、別のファックス・サービスに変えるのが賢明だと思う。私の次の目標は、ウエブペイジでファックスを送ることが出来るようにすることだ。先ず文書をpostscriptファイルにプリントして、アップロードする(又はLinuxが標準ツールを使って転換することの出来る画像その他をアプロードする)ように、それを設定しなければならない。
他のファックス設定がウエブを使うかどうか知らないが、私の予想では、ウエブを経由してファックスを送受信したい。

参考
この記事に変更があるときはhttp://www.tcu-inc.com/Articles/31/nielsen.htmlで入手出来る。
 


Copyright © 2002, Mark Nielsen. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
今月のPerlワンライナ−ダブルUIDの場合
By Ben Okopnik
 
第1章
そのe-メールは、簡潔に要点を述べていた。
Woomert様


簡潔にポイントだけ言う


三社の合併


神経質なシステム管理者


300名以上のユーザ


 /etc/passwd.


UID


宜しく


Frink Ooblick


頑固なコンピュータ探偵Woomert Foonlyは、ほくそ笑んだ。顧客は電話口で錯乱して怒鳴っていた。「動かないんだ。助けて呉れ」が言いたいことだった。WoomertはFrinkを偵察に出した。上が結果を充分に示していた。後は、顧客の閉店までの短時間で解決するだけだ。Woomertは、時間を有意義に使うことにした。居心地の良い場所はどこだ?

第2章
さっぱりした顔でWoomertが現場に現れるや否や、少し興奮したFrinkに出会った。

−「Woomert - ひどい状態だよ。ファイルは人力で検索するには長過ぎるし、UIDは地図一杯にある。システム管理者は後悔で狂乱しパニックで髪が抜けた。どうしよう」

−「心配するな。数時間前キャンベラにいたばかりだ。少し影響が残っている。恐ろしい経験から、明日はもっと悪くなると断言出来る。朝はダラスにいて、午後はニューヨークで、夜はテルアビブにいた。アクセントが消えるまで君は耳栓をした方が良い。旅行で困るのは・・・」

Frink は、明らかに冷静を失っていた。

−「Woomert -真面目に話せよ。重大問題なのは判るだろう」

−「あ、これか?落ち着けよ。見掛けほど悪くはないよ。本当は・・・」

Woomertは、厳かにタイプ用手袋をポケットから出して、手にはめた。」

−「Prelが簡単に解決する。システム管理者に2、3行のコマンド行ツールを渡せば、問題解決に使えるよ。それに、彼は'bash'を使っているから、必要なとき「上向き矢印」で呼び出せる。ほら、行くよ!」」

perl -F: -walne'$h{$F[2]}.="$F[0] ";END{$h{$_}=~/ ./&&print"$_: $h{$_}"for keys%h}' /etc/passwd

WoomertがENTERキイを押した後、ダブルUIDのリストが関連ユーザ名と一緒にスクロールダウンした。Woomert と Frink両人は、興味深くUID0-にトリプルエントリがあるのに気付いた。

   0: root sashroot kill3r


「よしよし。誰かがうまく押し入って、自分用ににUID0(ルート)アカウントを取ったようだ。 'sashroot' はOKだ。これは大凡の修理のための'スタンドアローン・シェル'だ。だが'kill3r'は? よしよし、ところで、クライアントに今の問題を知らせ給え。システム管理者はダブル全部のリストを持っているので−余り多くはなさそうだが−次に利用出来るUIDを検索するのは苦労だ。それには、別のツールがある。」

perl -wle'{getpwuid++$n&&redo;print$n}'

「これで、彼は物事を正しく解決出来る筈だ。さて、我々は−帰ろうか」

第3章
彼らがWoomertの家に帰って、暖炉の前に座ったとき、夜は寒くて、窓の外では風が鳴っていた。Frinkは気体に満ちてWoomertを見つめた。視線に気付いてWoomertが笑った。

「判ってるよ。説明しよう。神秘の見掛けは、切れ味が良くて気持ちが良いが、学習の喜びに比べれば何でもない。最初のものから始めよう」

perl -F: -walne'$h{$F[2]}.="$F[0] ";END{$h{$_}=~/ ./&&print"$_: $h{$_}"for keys%h}' /etc/passwd
「先ず、私の使ったコマンド行スイッチを見よう」
 


 -w 警告を有効にする


  -a オートスプリット ("-F"を参照)


  -l 行末処理を有効にする


  -n 暗黙の非プリントループ


  -e 続くコマンドを実行する


  -F:    '-a'オートスプリットのためのセパレータとして':' を用いる


「前の冒険(11 月号#84)を覚えているなら、上の全部は'-a' と'-F'を除いてもう判っている筈だ。オートスプリットすると、'-n' 又は '-p'で読み取った行を、規定値セパレータとして空白を使ってスプリットし、結果を '@F' アレーにセーブする。'-F' はオプションで、スプリットするセパレータを定義し直す」

「我々は '/etc/passwd'を読み取っているので、個別の行のフォーマットを見て見よう」

  borg:x:1026:127:All your base are belong to us!:/home/borg:/bin/bash
「標準フィールドが七つある。'name - passwd - UID - GID - GECOS - dir - shell' の順で並んでいる。今のところ関心があるのは、nameとUIDだ。しようとしていることは、hashの構築だ。これは、Perlでの極めて重要なデータ構造体で、基本的なもの三つのうち一つで、'/etc/passwd' の中のエントリすべてについて、UID(第三フィールド)をキイとし、スペースの続いたname(第一フィールド)をとして含む。

  $h{$F[2]}.="$F[0]

ユーザ名はその中にスペースを持つことは出来ないので、便利なセパレータになる。これをおこなったら、hash全体をループして、文字の続いたスペースを含む値を全部プリントアウトする:」

$h{$_}=~/ ./&&print"$_: $h{$_}"for keys%h}

「未だ良く判らないようだね。上をもっと読み易い方法で書いて見よう:」
    for ( keys %h ){              # "%h" hash全体をループする


        if ( $h{$_} =~ / ./ ){    # 前にスペースのある値を含むか


    by anything?


        print "$_: $h{$_}\n";     # そうなら、UID、コロン、スペースをプリント


    and the value


       }


   }


「これについて考えると、上のレゲエに一致する唯一のものは、一つ以上のnameを持つ値−ダブルUIDを意味する−であることが判るだろう」

「ええ−これで、結果を得た方法が判りました。次の表現はどうですか、”次に利用出来るUIDツール”のことです」

「ああ、これかね:」


perl -wle'{getpwuid++$n&&redo;print$n}'
「これは、'$n' で規定したUIDが存在するかどうかをチェックした短いループに過ぎない。このテストが成功したら−使っている '$n' に等しいUIDがあることを意味する− 'redo' が呼び出され、'$n' を一つ増やして、もう一度テストする。だが、失敗したら、'$n' をSTDOUTにプリントしてプログラムを出る。役に立って、余り複雑でない。一寸した働きで全部を仕上がる。セキュリティ違反は別の話だが、少なくとも皆が知っている」

Copyright © 2002, Ben Okopnik. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
コンピュータ馬鹿話
By Mike ("Iron") Orr
水に浸かったチップを洗う  By Philippe Rousselot


数年前、コンピュータがそんなに安くなく、五台の大変古いマシンでも洪水から助ける価値があった頃のことだ。
その時、研究所で働いていた。部屋に大型顕微鏡二台と画像解析用に古いMac五台があった。その部屋は、オートクレーブ(大きい圧力釜で生物野郎が殺菌用に使っていた)が壊れた後、洪水で終わった。顕微鏡は無事だったが、Macの載っている机がやられた。マシン全部が泥水を被った。
翌朝、私はMacを研究室に運んで分解する決心をした。運良く、ドライブと電源は濡れていなかったが、マザーボードは全く悪い状態だった。
カード全部を蒸留水とアルコールで洗った。そして40度Cのオーブンに一日入れた。
Macを組み立て直してもう一度働かせるのを皆がニヤニヤしながら見ていた。電子ボードが水に浸かったかのを知らないで、結果を見るまで確信がなかった。
そのうちに、保険で補償されたが保険屋は古いマシンを取り戻す価値はないと判定したので、コンピュータの投資が倍になって返った。
馬鹿げたHDD故障   By Onur Yalazý


昔々(4-5年前)80286ケースを昔の記念に持っていた。だがそのフロッピイドライブは働いていなかった。そこで、Pentium IIのフロッピイをそれに使うことにした。その上のDOS 6.22システムをインストールしようと考えた。だが、フロッピイを元のケースから取り外すことが出来なかった。少し軽業的にケースを並べ長いケーブルでフロッピイを286につないだ。うまく行った。
だが一寸具合の悪いことがあった。(Pentium は親父が細工目的で使っていたと言ったかな?)急いでいたのでケーブルの差し込み方を間違っているとは考えなかった。フロッピイのLEDが常時点灯した。PCはブートしなかった。システムがダウンした。運命だったのだろう。私は怒ってフロッピイドライブをハンマーで叩いた。その後、ケーブルのことに気付いた。やった!その時は全部うまく行ったようだった。だがHDDが壊れた。HDDはフロッピイの下にあった。全くの悲運だ。幸いドライブのバックアップがあった。
だから、必ずバックアップをとること、ケースの中をハンマーで叩かないこと。
コンピュータの誤使用  By Donovan Colbert


一番勉強したのは多分、数年前、中古の 20mb Miniscribe SCSI 3.5" をAmiga 2000に第二ドライブとしてを付けたときだ。SCSI端末処理についても、それが重要なことも知らなかった。ケーブル上の線1本が煙を出して第一ドライブに向かって燃えるのを呆然と眺めていた。多分最後のチャンスに、目が覚めて息を吸い込み、手探りでマシンの後ろの電源スイッチを切った。間に合った。20mb SCSIをなくしただけだった。
一年経って、中古コンピュータ販売会社に職を得た。廃品の中に、壊れたminiscribe 20mbを見付けた。コントローラカードを取って、私のドライブのコントローラと交換したら、私のドライブが生き返った。その夜、デスクの隅においていたら、同僚がぶつかってコンクリートの床に落とした。それがドライブの最後だった。
その中古ドライブには $200 払ったと思う。言うまでもないが、SCSIチェインの端末処理にはエキスパートになった。
Monsterハードドライブ By Josef Moffett


数年前(1989年頃)のことだが、誰もほしがらない古いXTを貰って喜んだ。それまで、コンピュータのハードウエアを細工したことはなかったが、それは部品に分かれて来たので、腕をまくり上げて、組み立てようとした。
元々持っていた古い plus 4を完全なCommodore 64 に変えるのは素晴らしかった。配線に問題があった。ハードドライブ(monsterと半分)−全部で20MBで2倍の高さのケース(だから重さが1トン)−を、マザーボードの上のIDEコントローラカードにつないだ。コンピュータのスイッチを入れたとき、すべては旨く行った。古いXTがその古い(DOS3だったと思う)でブートアップし、ちゃんと働いた。だが、古い中身をフォーマットして消去すると、次にブートまでは消えるが、ブート仕直すとまた、そこにある。疲れた。
途方に暮れてコンピュータ店に持って行った。技術者はハードドライブをIDEコントローラにつなぐフラットケーブルを見て、それを引き抜き、ピンの両方の列の上に差し込んだ。私がケーブルを差し込むとき、ピンの1列全体を落としていたのだ。
言うまでもないが、まごまごした十代だった。二度とこんなことをしないのも、言うまでもない。
 


  [コンピュータに関する失敗談、成功談をgazette@ssc.comまでお寄せ下さい
Copyright © 2002, Mike ("Iron") Orr. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
プログラム例−C#データ型
By Ariel Ortiz Ramirez
 
前の記事(11月号#84)でC# プログラム言語を紹介し、Mono環境−Microsoftの.NET組織の中で働くオープンソース実現−の文脈での働き方を説明した。ここで、C# プログラム言語がサポートするデータ型の詳細に進む。
以下の説明では、変数とオブジェクトを表すのに、次の図式記号を用いる:
   Variable and object diagram nota
変数の図(Valiable Diagram)は、プログラムのコンパイルと実行の間に関係する三つの特性(名称、値、型)を有する立方体である。ノイマンの伝統的アーキテクチャでは、変数を、読み取りと上書きの出来るメモリの塊と考える。オブジェクトの図(Object Diagram)は、角の丸い正方形で、これはランタイムに作られゴミ集めの出来るヒープメモリに割り当てられるオブジェクトを示す。どのオブジェクトについても、ある時点でそのタイプ(クラス)とそのインスタンス変数の現在値が判っている。

タイプのカテゴリ
C#プログラム言語においては、タイプが次の三つのカテゴリに分けられる:
*値タイプ
*参照タイプ
*ポインタ・タイプ
値タイプを持つ変数においては、変数に割り付けられたメモリ内に、データ自体が直接含まれる。例えば次のコード
  int x = 5;
は、xと言う名の符号付き整数変数が、値5で初期化されることを示す。下図は対応する変数図を示す
   A simple int variable diagram.
値5が変数自体の中に含まれることに注意。
他方、参照タイプを持つ変数は、ヒープメモリの中に記憶されたOPUじぇくとのアドレスを含む。次のコードは、タイプオブジェクトの変数yを宣言する。これは、新しい演算子のお陰で初期化され、オブジェクト・インスタンスに割り付けられた新しいヒープメモリを参照するようになる(オブジェクトは、C#タイプの基本クラスであるが、それ以上は後で述べる)。
  object y = new object();
対応する変数/オブジェクト図は次のようになる:
  An object diagram.
この場合、変数図の「値」部分が、参照オブジェクトを指す矢印の始点を含んでいるのが判る。この矢印はメモリヒープ内におけるオブジェクトのアドレスをあらわす。
ここで、新しい変数二つを導入して元の変数から何かをコピイするとき何が起こるかを解析しよう。次のコードを持っていると仮定する:
  int a = x;
  object b = y;
結果を下に示す:
  Results after copying values and
見られる通り、aはxの値のコピイを有する。これら変数のうち一つの値を変更すると、相手方の値は変更されないままである。yとbの場合は、両方の変数が同じオブジェクトを参照している。変数yを使ってオブジェクトの状態を変更すると、生じた変更は変数bを使って観測することが出来る。逆も真である。
ヒープメモリを参照するほかに、参照タイプ変数はまた、特別値ヌルを含む。これは存在しないオブジェクトを意味する。前の例を頭に置いて、次のステートメントを使うと、
  y = null;
  b = null;
変数yとbは、下に示すように最早特定のオブジェクトを参照しない:
  Making references equal to null.
見られる通り、オブジェクト・インスタンスに対する参照がすべてなくなっている。ここで、このオブジェクトは、他に生きた参照がないので「ゴミ箱」に入れられる。前に記したように、C#ではヒープメモリは集められたゴミである。つまり、これら「死んだ」オブジェクトが占めるメモリは、一定の時自動的に廃棄され、ランタイムシステムが再利用する。C++やPascalなど他の言語には、この種の自動メモリ管理構造がない。これらの言語を使うプログラマは、メモリ塊に割り付けたヒープメモリで最早必要としないものは、明確に解放しなければならない。それをしないと、メモリリークの場所が作られ、プログラムの一定の点のメモリが、再使用の最小を命じられないため無駄になる。経験では、明確なメモリ再割当は、面倒で間違いを起こし易い。多くの新しい言語(二,三例を挙げるとJava, Python, Scheme、Smalltalk,など)もまた、ランタイム環境の一部にゴミ集めを組み込んでいるのは、この理由である。
最後に、ポインタ・タイプは、CやC++のような言語でポインタが果たすのと同様の機能を与える。ポインタと参照は両方ともメモリアドレスを実際にあらわすが、似ているのはそれだけであることを理解するのが重要である。参照は、ゴミ収集者が追跡するが、ポインタはしない。ポインタ上でポインタの算術が出来るが、参照では出来ない。ポインタに付随する扱い難い性質のため、これはC#で不安全とマークされたコード内でだけ使われる。これは高級な話題なので、今回は深入りしない。

所定のタイプ
C#は所定のデータ型を豊富に有しており、これをプログラムに使用することが出来る。次の図は、C#にある所定のデータ型の階層を示す
  The C# type hierarchy.
これら各型の簡単な要約を示す

 
サイズ(バイト) 説明
 
bool   1 ブール型の値。真と偽のみ有効
sbyte   1 符号付きバイト整数
byte   1 符号なしバイト整数
short   2 符号付き短整数
ushort   2 符号なしバイト整数
int
 
  4
 
符号付き整数。文字は十進(既定値)
又は16進(接頭辞0x):26, 0x1Aなど
uint   4 符号なし整数。26U, 0x1AUなど (添字Uは必須)
long   8 符号付き長整数。26L, 0x1AL など(添字Lは必須)
ulong   8 符号なし長整数。26UL, 0x1AUL など(添字ULは必須)
char   2 ユニコード文字。'A' など(' 'で囲む)
float
 
  4
 
IEEE 754 単精度浮動小数点。1.2F, 1E10Fなど(添字F は必須)
double
 
  8
 
IEEE 754 倍精度浮動小数点。1.2, 1E10,1Dなど(添字Dは任意)
decimal
 
  16
 
計算、十進28桁以上を除く。123.45M など(添字 M は必須)
object   8+ 値及び参照タイプに関する究極基本タイプ。文字表現なし。
string
 
  20+
 
ユニコード文字の不変列。 "hello world!\n"など (" "で 囲む) 
 
C#は、統一されたタイプシステムを有するので、任意のタイプの値をオブジェクトとして扱うことが出来る。C#のいずれのタイプも、直接又は間接に、オブジェクト・クラスを導く。参照タイプは、単にこれをオブジェクト・タイプと理解するだけで、オブジェクトとして扱われる。値タイプは、 boxing unboxing 演算を実行することによりオブジェクトとして扱われる。これらの概念は次の記事で詳しく述べる。

クラスと構造体
C#では、新しい参照タイプと値タイプを定義することが出来る。参照タイプはクラスconstructを用いて定義する。値タイプはstructを用いて定義する。次のプログラムの作用からこれら両方を見よう。
 


struct ValType {


     public int i;


     public double d;


     public ValType(int i, double d) {


         this.i = i;


         this.d = d;


     }


     public override string ToString() {


         return "(" + i + ", " + d + ")";


     }


 }





 class RefType {


     public int i;


     public double d;


     public RefType(int i, double d) {


         this.i = i;


         this.d = d;


     }


public override string ToString() {


         return "(" + i + ", " + d + ")";


     }


}





 public class Test {


     public static void Main (string[] args) {





         // PART 1


         ValType v1;


         RefType r1;


         v1 = new ValType(3, 4.2);


         r1 = new RefType(4, 5.1);


         System.Console.WriteLine("PART 1");


         System.Console.WriteLine("v1 = " + v1);


         System.Console.WriteLine("r1 = " + r1);





         // PART 2


         ValType v2;


         RefType r2;


         v2 = v1;


         r2 = r1;


         v2.i++; v2.d++;


         r2.i++; r2.d++;


         System.Console.WriteLine("PART 2");


         System.Console.WriteLine("v1 = " + v1);


         System.Console.WriteLine("r1 = " + r1);


     }


 }



先ず、構造体ValTypeを作る。これは、それぞれタイプintとdoubleのインスタンス変数二つ、iとd、を定義する。これらはpublicと宣言する。プログラムのこの構造体を見ることの出来る場所どこからでもアクセス出来ることを意味する。この構造体はconstructorを定義する。constructorは、構造体自体と同じ名称を有し、メソッド定義と反対に、リターンタイプを有しない。我々のconstructorは、二つのインスタンス変数の初期化を担当する。キイワードthisは、ここでは、作られたインスタンスに対する参照を得るため使われるので、パラメータ名がインスタンス変数名と衝突するとき生じる曖昧さを避けるため明確に使用しなければならない。構造体はまた、ToStringと言う名のメソッドを定義する。これは、構造体インスタンスの外部表現を文字列として返す。このメソッドは 、この構造体の基本タイプ(オブジェクト・クラス)で定義されたToStringメソッドを上書きする(したがって上書き修飾子を使う)。このメソッドの本体は、文字列連続演算子(+)を使ってフォーム "(i, d)"の文字列を作る。ここで、iとdは、これらインスタンス変数の現在値をあらわす。そして、最後に予期した結果を返す。
見られる通り、RefTypeクラスは、ValTypeと基本的に同じコードを有する。両タイプを使って宣言された変数のランタイム行動を調べて、この相違がもっと良く理解できるようにしよう。Test クラスにはMainメソッドがあり、これがプログラムのエントリポイントを確定する。プログラムの最初の部分(コメント "PART 1"で標識)に、値タイプ変数一つと参照タイプ変数一つがある。これらが割当任務の面倒をみる様子を示す:
  Class and structure variable dia
値タイプ変数v1は、変数自体に含まれたそのインスタンス変数を有する。割当に使用された新演算子
   v1 = new ValType(3, 4.2);
は、別の言語で学んだ通り、ヒープメモリの中に何もメモリを割り当てない。ValTypeは値タイプで、新演算子はこの文脈上でそのconstructorを呼び出し、こうしてインスタンス変数を初期化するためだけに使われるからである。v1はローカル変数なので、実際はメソッドの起動レコード(スタックフレーム)の一部として記憶され、それが宣言されたと言うだけの理由で存在する。
参照タイプ変数が参照するオブジェクトは、プログラムのどこかで明確に作成しなければならない。割当
  r1 = new RefType(4, 5.1);


では、新演算子が予期されたダイナミックメモリ割当をおこなう。この場合は RefTypeが参照タイプだからである。その直後に対応するconstructorが呼び出される。変数v2もまた、(これもまたローカル変数なので)メソッドの起動レコードの一部として記憶されるが、新たに作成されたインスタンスの参照(アドレス)を保持するだけの大きさで充分だ。インスタンスのデータすべては、事実ヒープメモリに記憶される。
ここで、プログラムの第二部分(コメント "PART 2"で標識した後)を実行するとき何が起こるかを点検しよう。二つの新変数が導入され、これらに元のもの二つの値が割り当てられる。次いで、新変数のインスタンス変数の各々が、増分1だけ増加される(++演算子を使う)。)
  Class and structure instances af


v1をv2にコピイしたとき、ソースの各個別インスタンス変数が個別に目的物にコピイされ、全く独立の値を作る。だからv2におこなった変更は、v1には全く影響しない。参照(アドレス)だけがコピイされる r1 と r2 では、そうならない。r2が参照するオブジェクトの変更はいずれも、直ちにr1が眺める。これらは両方とも事実同一オブジェクトを参照するからだ。
上のタイプ階層図を調べると、int, bool, charなどの単純データ型は実際にstruct値タイプである一方、オブジェクトと文字列はクラス参照タイプであることに気付くだろう。
上の例のソースコード source code をコンパイルして走らせたいときは、Linuxシェルプロンプトで次のようにタイプする:
  mcs varsexample.cs


  mono varsexample.exe


出力は次のようになる筈。

PART 1


v1 = (3, 4.2)


r1 = (4, 5.1)


PART 2


v1 = (3, 4.2)


r1 = (5, 6.1)



参考資料
http://www.go-mono.com/
mono公式ホームペイジ、ここにダウンロードとMonoプラットホームのためのインストール指導がある。C#コンパイラ、ランタイム環境、クラス・ライブラリも含まれている。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cscon/html/vcoriCStartPage.asp
    C#プログラム言語の一般情報。
 
Copyright © 2002, Ariel Ortiz Ramirez. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
Ptraceを用いるプロセス追跡−パート3
By Sandeep S
 
Ptraceの基本特性はパート1(8月号#81)、パート2(10月号#83)で説明した。パート2では、プロセスのレジスタにアクセスし、余分なコードを挿入することにより、それらを変更してそのプロセスの出力を変更する小プログラムを見た。今回は、プロセスのメモリにアクセスする。この記事の目的は、ランタイムにバイナリに影響を与える方法を紹介することにある。この技術には使用することの出来る多数の領域がある。
 
1. 緒言
これまでPtraceについて、プロセス追加の技術、追跡の方法、最後に解放する方法を知った。Linuxバイナリフォーマット-ELFの構造についても判った。

今度の計画は、走っているバイナリを捕らえて変更することだ。だからバイナリの中でシンボルの位置を探さなければならない。ここでは、link_mapを必要とする。link_mapは、ダイナミックリンカの内部構造体で、これを用いてロードされたライブラリとライブラリ内のシンボルを追跡する。

link_mapのフォーマットは次の通りである(/usr/include/link.hから)



struct link_map


  {


    ElfW(Addr) l_addr;  /* 共有オブジェクトがロードされる基本アドレス */


    char *l_name;       /* オブジェクトが見出された絶対ファイル名 */


    ElfW(Dyn) *l_ld;    /* 共有オブジェクトのダイナミックセクション */


struct link_map *l_next, *l_DIVv; /* ロードされたオブジェクトの連鎖 */


   };



ファイルについての簡単な説明

* l_addr: 共有オブジェクトがロードされる基本アドレス。この値は /proc/<pid>/mapsでもまた見出すことが出来る。
* l_name:文字列テーブルの中のライブラリ名に対するポインタ
* l_ld :共有ライブラリのダイナミック(DT_*) セクションに対するポインタ。
* l_next:次の link_map ノードに対するポインタ。
* l_prev:前の link_map ノードに対するポインタ。

Link-mapはリンクされたリストで、リスト上の各項目がロードされたライブラリに対するポインタを有する。しなければならないのは、この連鎖を辿って、各ライブラリを通り抜け我々のシンボルを見出すことだ。問題は、このLink-mapが何処にあるかだ。
各オブジェクトファイルについて、バイナリの詳細を多数含むグローバル・オフセット・テーブル(GOT)がある。GOTの中では、第二エントリがlink_map用となっている。だからlink_mapのアドレスを GOT[1]から入手することが出来るので、シンボルの検索を進める。
 
2. 直ちにコードへ
メモリにアクセスするに必要な基本情報が集まった。始めよう。先ず、追跡のためプロセス 'pid' を付着する。ここで、必要な link_mapを見出すことから始める。read_data, read_str などのファンクションが見付かるだろう。これらはptraceを使う作業を楽にするヘルパーファンクションだ。ヘルパーファンクションの意味は自明であろう。

link_map を探すためのファンクションは次の通り:
struct link_map *locate_linkmap(int pid)


{


    Elf32_Ehdr *ehdr = malloc(sizeof(Elf32_Ehdr));


    Elf32_Phdr *phdr = malloc(sizeof(Elf32_Phdr));


    Elf32_Dyn *dyn = malloc(sizeof(Elf32_Dyn));


    Elf32_Word got;


    struct link_map *l = malloc(sizeof(struct link_map));


    unsigned long phdr_addr, dyn_addr, map_addr;


    


     read_data(pid, 0x08048000, ehdr, sizeof(Elf32_Ehdr));


    phdr_addr = 0x08048000 + ehdr->e_phoff;


    printf("program header at %p\n", phdr_addr);


    read_data(pid, phdr_addr, phdr, sizeof(Elf32_Phdr));





    while (phdr->p_type != PT_DYNAMIC) {


        read_data(pid, phdr_addr += sizeof(Elf32_Phdr), phdr,


                             sizeof(Elf32_Phdr));


    }


    


    read_data(pid, phdr->p_vaddr, dyn, sizeof(Elf32_Dyn));


    dyn_addr = phdr->p_vaddr;





    while (dyn->d_tag != DT_PLTGOT) {


        read_data(pid, dyn_addr += sizeof(Elf32_Dyn), dyn, sizeof(Elf32_Dyn));


    }





    got = (Elf32_Word) dyn->d_un.d_ptr;


    got += 4;           /* 第二 GOT エントリ、覚えているかな? */





    read_data(pid, (unsigned long) got, &map_addr, 4);


    read_data(pid, map_addr, l, sizeof(struct link_map));


    free(phdr);


    free(ehdr);


    free(dyn);


    return l;


}



ロケーション 0x08048000 からスタートして、追跡するプロセスのelfヘッダを入手する。elfヘッダを入手したら、そのフィールドからプログラムヘッダを入手することが出来る。(ヘッダのフィールドについてはパート2(8月号)で説明した)。プログラムヘッダを入手したら、ダイナミック・リンキング情報を使ったヘッダの点検に進む。ヘッダ構造体からダイナミック・リンキング情報を使って、情報の位置を取り出す。GOTの基本アドレスを入手するまで、検索を続ける。

GOTのアドレスを入手しGOTの第二エントリを取り出す(そこにlink_mapがある)。必要なlink_mapのアドレスを入手て戻る。

struct link_mapがあるので、symtabとstrtabを入手しなければならない。そのため、 link_mapの l_ld フィールドに移動してDT_SYMTAB とDT_STRTAB が見付かるまでダイナミック・セクションを横断する。結局DT_SYMTABからシンボルを探し出すことが出来る。 DT_SYMTAB とDT_STRTAB は、それぞれシンボル・テーブルと文字列テーブルのアドレスである。

ファンクション resolv_tables は次の通り:
void resolv_tables(int pid, struct link_map *map)


{


    Elf32_Dyn *dyn = malloc(sizeof(Elf32_Dyn));


    unsigned long addr;


    addr = (unsigned long) map->l_ld;


    read_data(pid, addr, dyn, sizeof(Elf32_Dyn));


    while (dyn->d_tag) {


        switch (dyn->d_tag) {


        case DT_HASH:


            read_data(pid, dyn->d_un.d_ptr + map->l_addr + 4, 


                       &nchains, sizeof(nchains));


            break;


        case DT_STRTAB:


            strtab = dyn->d_un.d_ptr;


            break;


        case DT_SYMTAB:


            symtab = dyn->d_un.d_ptr;


            break;


        default:


            break;


        }


        addr += sizeof(Elf32_Dyn);


        read_data(pid, addr, dyn, sizeof(Elf32_Dyn));


    }


    free(dyn);


}



ここで実際にしていることは、ダイナミック・セクションを一つ宛読み取ってタグがDT_STRTAB 又は DT_SYMTABであるか否か点検することである。イエスなら、それぞれのポインタを入手してstrtabsymtabに割り当てることが出来る。ダイナミック・セクションが終わったら一時停止する。

次のステップは、シンボル・テーブルからシンボルの値を入手することだ。このため各シンボル・テーブル・エントリを一つ宛点検して、ファンクション名であるか否かを調べる(我々はライブラリ・ファンクションの値を見付けることに関心がある)。そうであるときは、我々の示したファンクション名と比較し、一致したらシンボルの値が返される。

これで、実際に必要なシンボルの値を入手した。この値は何に役立つのか?答は読者次第だ。これを良くも悪くも利用することが出来る。

すべてが終わったと思うだろう。忘れてはいけないステップを忘れていた。追跡したプロセスを外すことだ。これはプロセスを永久に停止状態で放置する。その結果はパート1で説明した。だから最終のステップは追跡したプロセスを外すことだ。

プログラムは Ptrace.cから入手することが出来る。殆どのコードは自明だ。
次のようにタイプしてコンパイルする。
  #cc Ptrace.c -o symtrace


ここで、プログラムをテストしようと思う。何か別のコンソールで何かのプロセスを走らせ、戻ってタイプする。(ここで、私のテストプログラムは emacsで、私の与えたシンボルはstrcpyだ)。emacの代わりに、追跡可能な任意のプログラムと任意のシンボルを追跡することが出来る。
  #./symtrace `ps ax | grep 'emacs' | cut -f 2 -d " "` strcpy


として進行具合を観察されたい。

3.結語
これでptraceを用いる基本プログラム作成を通覧した三つの記事のシリーズを終わる。基本概念を理解すれば、自分でステップを作るのは難しくない。ptraceとelfの詳細は、 http://www.phrack.org/で入手することが出来る。もう一つ言いたいのは、主要な話題に触れることなく、ここまで来た。ptraceの主要な一つの特徴は、システム呼出に対する働きだ。ユーザモードLinuxでは、この特性を大規模に使う。私はクラスと最終学年計画で忙しいが、時間が許せば、このシリーズを続けてptraceのこの特性を検討することをお約束する。

ご意見を歓迎する。busybox@sancharnet.inまで。
 
Copyright © 2002, Sandeep S. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
多重ブートCDの作成

多重ブートCDを作る問題がインターネットでは余り扱われておらず、あっても希なのを知った。Windows販売業者は、そのソフトウエアにブート可能CDを作る可能性を含むが、そのパケージに多重CDを作るオプションを見たことがない。私に取ってLinuxで多重ブートCDを作るのはWindowsより遙かに易しい。Linuxブート可能のCDを作るのに役立つ無料ユティリティが沢山あるが、多重ブートであると素晴らしい。Linuxブートイメージの幾つかのバージョン−新聞閲覧ファイルシステム、修理ユティリティ、Linux又はBSDの各種系統、若しくはQNX、Plan9など、をサポートするバージョン−をCD上に持つことが出来る。
 
これが役立つと考える理由は次の通りだ。Linux と FreeBSDを同時に使うとしよう。多くのLinuxディストリビューションをハードディスクに搭載することが出来るが、システムに何かが起こる−最早データにアクセスする方法がない。ブート可能ディスケットを使うか(XFSジャーナルファイルシステムなどの特殊システム、又は暗号化ファイルシステムなどを使うとき多くの障碍があり、適合する最低五つのLinuxブート可能ディスケットを持たなければならないことに気付くだろう)又は各種の系統のLinux kernel及びユティリティを入れた多重ブートCDを作らなければならない。OSを十個入れた小さいCDが、何かが常に間違っていると思わせるこの世界の幻想からの救済である。
この記事が、容易で実用的で初心者にも理解出来るものであることを望み、多くの人が理解しない技術用語を避けようと思う。色々な読者の興味を引くのに役立つであろう。
ート可能CDは、所謂E1 Torrito 規格に基づく−だがこれを説明する別のサイトがある。 http://www.cdpage.com/Compact_Disc_Variations/danaboot.htmlなどを訪ねられたい。
 
我々に取って重要な情報は、BIOSがブート能力をサポートする場所どこでも、ブートすることの出来るOSを十こまでCD上に持てることであろう。ブート可能ISOイメージファイルは、1.44MBディスケット・エミュレーション、2.88MBディスケット・エミュレーション又はハードディスク・エミュレーションで作る。
 
ここでは、多重ブートCD作成方法に関する実用指針にしたがう
 
先ず、ブート可能DOS又はLinuxディスケット・イメージファイルを用意する。イメージとは、ディスク又はディスケットの内容を含むファイルである。色々な型のイメージファイルがある。コマンド

  dd if=/dev/hda1 of=/my_image.file

を使って、Linuxパーティション(Linuxパーティションは /dev/hda1 にあると仮定する)をdd(ディスクダンプ)すると、ファイルmy_image.file が、ファイルシステムの中に現れる。最も簡単なのは、このようなイメージファイルをインターネットからダウンロードすることだ。リンクは下記:

http://www.ibiblio.og/pub/Linux/system/recovery/
 
Ibiblioアーカイブは大変良い。上のURLからダウンロードするイメージファイルは、ブート可能な方法で作られているので、自分のイメージを構築する心配をする必要がない。しかし、自分のイメージを作りたいときは、上のURLでBootkit, CatRescue, SAR, disc-recovery-utilsなどのユティリティが見付かる。これらは、自分のブーとかのディスケット(又はブート可能イメージファイル)を作るのに役立つ。

多重ブートCDを作るため、我々の作業に必要なファイルは、fbsd-flp-1.0.3.bin (ブート可能 FreeBSD 2.8 MB ディスケットイメージ)、tomsrtbtであるが、手持ちのディスケットから自分のイメージを作ってもよい。DOS又はLinuxディスケットをディスケットドライブに入れて、次のコマンドをタイプする:

  dd if=/dev/fd0 of=boot.img bs=512 count=2880
 
http://freshmeat.net/ を訪ねてキイワード"mini"を検索するのも良い考えだ。すると、聞いたことのない秘密のミニLinuxディストリビューションが見付かる。

サイトhttp://www.ibiblio.org/pub/Linux/system/recovery/ には次のものがある(幾つかは省略)

     * Bootkit-1.01.tar.gz


     * CatRescue101E.tgz


     * SAR-2.25.tar.gz


     * banshee-linux.0.61.tar.bz2


     * brd-2.0.tar.gz


     * disc-recovery-utils-1.0.tgz


     * fbsd-iso-1.0.3.bin.gz


     * fspace.tgz


     * genromfs-0.5.1.tar.gz


     * mulinux-5r0.lsm


     * mulinux-5r0.tgz


     * picoboot-0.95.tar.gz


     * rescue02.zip


     * resque_disk-2.3.99-pre9-A.tgz


     * rip-10.exe


     * rip-51.iso.bin


     * sash.tar.z


     * tomsrtbt-2.0.103.ElTorito.288.img.bz2


     * tomsrtbt-2.0.103.dos.zip


     * trccs-0.8.1r2.iso.bz2


     * trccs-0.8.1r2.tar.bz2


     * trccs-0.8.1r2_boot_disk.img.bz2


     * yard-2.1.tar.gz


     * yard-prefabs-2.tgz


     * zdisk-2.14.tar.gz


 
別に、ブート可能ディスケットイメージをダウンロード出来る次のサイトがある:
LIAP (http://www.liap.eu.org/):LIAP はLinux in a Pillである−このサイトは、沢山のユティリティ及び各種の災害からの復旧に適したkernel系統とともに、沢山の1.44MBイメージを含む。

LEKA RESCUE FLOPPY (http://leka.muumilaakso.org/):Leka Rescue Floppy は小さい1.44Mb ディストリビューションである。

TOMSRTBT (http://www.toms.net/rb/):Tomsrtbt (Tom's Root Boot) は救済ユティリティである。大変良いものだ。上のサイトから2.88MB イメージファイルをダウンロードしてもよい。

 
ブート可能DOSイメージが手に入らなかったとき、http://www.bootdisk.com/などを訪ねて、DOSイメージをダウンロードすることも出来る。このサイトには、 DOS 5.00 乃至 6.22, Win 95/98/Meブートディスク、DOS/Windows 9X/2000/XP ブートディスク、 Win 95/98/ME - NT4/NT5ブートディスク、BiosフラッシングBasic用DrDOS 7.Xディスクなどがある。FreeDOS ブートディスケットを作ることも出来る。
先ず、用語を幾つか。ディスケット又はディスクのブート可能イメージファイルと、CDに結びつけるISOイメージファイルとの間の相違を見る。必要なものは、それからISOイメージファイル一つを作るブート可能ディスケット・イメージファイルである。
 
1)ブート可能ディスケット・イメージを、手持ちのディスケットから、次のコマンドを使って作るか、
dd if=/dev/fd0 of=/my_image.img
又は、インターネットからブート可能ディスケット・イメージファイルをダウンロードする(リンクを参照)。Linuxボックスに- /CDなどのディレクトリを作って、イメージをこのディレクトリにコピイする(ブート可能イメージは十個以下であるのを忘れないこと)。ファイル名は、8.3フォーマット−ファイル名8文字、添字3文字−であることを確認すること。この最大は、後で使うDOS makebt.exeプログラムとの互換性問題だけである。
2)CD上のスペースを使いたいときは(ブート可能イメージは十個以下は、14MBしか使わない)、サブディレクトリに /CD/Softなど、別のユティリティを入れる。CDへのアクセス方法は、この記事の最後にある。
3)/CDディレクトリから次のコマンドを走らせる:
dd if=/dev/fd0 of=/my_image.img
"boot.cat" 又は "boot.catalog"ファイルは自動的に作られるので、これらを /CDに持つ必要はない−見た通りのコマンドをタイプするだけ−それが /CDディレクトリに置かれたイメージファイル名である限り任意のイメージファイル名をタイプすることが出来る。上のコマンドに含まれるイメージファイル名は、そこからCDをブートするものである。イメージファイルはサイズが1.44MB又は2.8MBでなければならない。
4) / ディレクトリの中にcd.isoファイルが作られる(/cd.iso)。これをチェックしてマウントするとき (mount /cd.iso /mnt -o loop)、ISOファイルの内容は、マウントしたディれくとに中で見られる筈だ。CDに焼き付けると、このISOイメージはブートすることが出来るが、それからブートするイメージ一つだけが利用できる。
5)そこで、ISOイメージを編集して多重ブートCDを作らなければならない。そこで、CDをブートするとき見るメニュー(0, 1, 2, 3,など)に含まれる別のイメージを入手する(選択肢 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10のある多重メニューが迎えて呉れる。選んだ番号を押すと望みのOSがブートする)。
6)編集した後、CDを焼き付ける。
 
ISOイメージファイルの編集は、やや複雑で(この記事はできるだけ簡単にしたい)、編集するPerlスクリプトを書く暇がないので、インターネット上で入手出来る無料プログラムを利用するのが良い考えだ。このような無料プログラムの一つはmakebt.exeだ。昔、どこかのサイトでこのプログラムを見付けたが、今はネットで見付け損ねた。そこで、私のウエブサイトhttp://www.tankred.sk/~juro/freebsd/makebt.zipを作った。ここでダウンロードされたい。
 
DOSEMU, BOCHSエミュレータ(http://bochs.sourceforge.net/ )の中でmakebt.exeを走らせるか、又はhttp://www.bootdisk.com/で入手出来るDOSブート可能ディスケットを作るか、又はFreeDOSブート可能ディスケットを作ってそれでPCをブートしてmakebt.exeユティリティを走らせる。DOSパーティションがなければ、最も良いのはDOSMENUエミュレータを使うことだ−DOSMENUは、「把握される」のを待っているCD.ISOファイルのあるLinuxにもまたアクセスすることが出来る。
 
DOSプロンプトでMAKEBT.EXEを走らせると、修正すべきISOファイルの完全パスとファイル名を聞いて来る:多重ブートディスケット・イメージの入っているISOファイルの名称、CD.ISOなど、をタイプすると、次の画面が現れる。

---------------------------------------

Make Multiple Boot CD-ISO Image Modifier ver 1.02

ISO File path and name: cd.iso

Bootable Disk Image Boot media type Default LBA

------------------- --------------- ------- --------

BC ) BOOT.CAT

1 ) FBSD.IMG 1.44M Floppy Y

2 ) LINUX.IMG 2.88M Floppy -

3 ) PLAN9.IMG 1.44M Floppy -

4 ) QNX.IMG 1.44M Floppy -

5 ) OPENBSD.IMG 2.88M Floppy -

6 )

7 )

8 )

9 )

10 )

<TAB> = move between fields, up/down arrows = move between rows, F1 = Confirm

Press 'y' key to make this image as default boot

------------------------------------------------------------------------------------------------------

 
BCは、Boot Catalog(ブートカタログ)の略だ。boot.catを書くだけで、最早気にすることはない。上のmkisofsコマンドでこの文字列を既に使用しているからだ(だが、ISOイメージファイルがその中に"boot.cat"の文字列を含むのは重要なことだ)。ここで、イメージの名を、DOS 8.3フォーマット(これはファイル名に関するDOSの制限−最大8文字と添字3文字)、慎重にタイプする。
 
画面の中央で、1.44MBフロッピイ・エミュレーション、2.88MBフロッピイ・エミュレーション、ハードディスク・エミュレーション又はエミュレーション無しを選ぶ。今は1.44MB と2.88MBエミュレーションだけを使う(ハードディスク・エミュレーションそしたいときは、650MB Linuxパーティションを作って、ハードデスクをブートしたLinuxシステムをそこにコピイする)。エミュレーションのタイプを選ぶにはキイボード右矢印を使う。画面の右側で"Y".を押してブート可能イメージ一つを規定値として選ぶ。
 
完了したら、F1を押す(プログラムが毎回応答するとは限らないので、数回試みることがある)。プログラムは賢い−ファイル名のタイプが不正確であると、(F1を押した後)警告メッセージが出る。メニューの中のブートイメージでF1を押した後のものには何も説明を付けてはいけない。この特性はSCSI CD-ROMで利用出来るもので、余り研究していないからだ。
 
これで終わりだ。CDに焼き付けてよい。
 
cdrecord -v speed=8 dev=0,0,0 /cd.iso
 
CDをブートするとき、OSにに関する記述は出ないで番号だけが出る。第一と第二の番号は(0,1)で、通常同一OSをあらわす。この問題を深く研究する時間がないが、番号を書き下ろしておくと、どのOSからブートしているか判る。
 
ここでは、ディスケット・イメージとエミュレーションを扱ったので、作ったばかりの多重ブートCDを使ってイメージをブートするときは、"mount /dev/hdc /mnt"などとタイプしてCD-ROMにアクセスし、その上で、後に作業をしようとするユティリティの入った /Softディレクトリにもアクセスする。DOSシステムディスクの場合は、CD-ROMにアクセスするドライバも含めなければならない。
 
ISOファイルをパッチするLinuxプログラムを勉強又は作成したいときは、元のISOイメージファイルを、ブート可能性一つについてmakebt.exeユティリティを用いてパッチしたISOファイルだけと比較することが出来る。良いバイナリ・パッチャは、Giuliano Pochiniの作ったdiffユティリティである。Bdiffは簡単な小型プログラムで、極めて普通のユティリティ"diff" と "patch" がテキストファイルについておこなうことをするだけでなく、バイナリファイルにも働く。これは、http://space.virgilio.it/g_pochini@virgilio.it/ からダウンロードすることが出来る−しかし、両ISOファイルは同等でなければならない。diffユティリティは(比較ファイルについて)、多重ブートフラッグのついた情報の書き込まれた場所(オフセット)を示す。それはセクタ17(ブート・ボリューム・デスクリプタ)とブート・カタログ・セクタである。
 
上記の情報を用いて沢山の多重ブートCDを作ったが、問題を経験したことはない。だが、使えないCD-Rを書かないため−自分のOS/2イメージを作るのに少し問題があった−最初は再書込可能CD-RWにISOイメージを書き込むこと。
 
Copyright © 2002, Juraj Sipos. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
 
 
TUXで始めよう
By Vinayak Hegde
 
TUX - "ウエブサーバ" との出会い
サイトでペンギン(Linuxのマスコット)のTuxに関する記事を読むことになったら、失望するだろう。だが逃げないで、TUXウエブサーバが、性能の点で何が出来るか見出したら、必ず満足されるだろう。細工の出来る何かを発見する筈だ。これはLinuxに埋め込まれたウエブサーバ−TUXに関する記事だ。
 
TUXの名は、'Threaded linUX webserver' に由来する。TUXはRed Hatが書いたもので、2.4 kernelシリーズに基づく。これはkernelスペースHTTPサブシステムだ。ご推察の通り、TUXはGNU GPLの下でリリースされている。だから無料ソフトウエアの伝統で、自由に細工して修正し自分の要求に合わせることが出来る。TUXを自分の必要に合わせる一つの方法は、TUXモジュールを書くことだ。これはユーザースペース又はkernelスペースモジュールとすることが出来る。TUXを書いた主要目的は、Linux上で高性能ウエブサーブをすることであった。Linuxはウエブサーバ市場で広く普及しているので、これは特に重要であった。
 
TUXは、Apacheのように機能充足ではなく、幾つか限界がある。だが、それにも拘わらず、TUXは、HTTP/1.1適合ウエブサーバで、HTTP/1.1常時接続、パイプライン、CGI実行、ログ、仮想ホスト、各種形態のモジュール、その他多数のウェブサーバ機能をサポートする。TUXは、今や Red Hat Content Accelerator (RHCA)として公式に知られている。
 
TUXがして呉れること
今日のウエブ内容は極めて少量しか動的に作られておらず、殆どが静的だ。静止ウエブペイジとイメージを取り上げよう。apacheなどのユーザスペース・ウエブサーバは、内容を実際に提供するには、何かシステム呼出をしなければならないので、極めて労力を要する。kernelスペースとユーザスペース・プログラムとの間の頻繁な切り換えは、性能を大幅に下げる。TUXはこの点で賢い。TUXはモノシリックkernelに組み込むこともモジュールとして動的にロードすることも出来る。最初の方法は、ウエブサービング専用のサーバに好ましい。ロード出来るモジュールとして構築すると、サービスの開始と終了の時それぞれ、動的に挿入され除去される。この方法には、ある程度の融通性がある。
TUXは、動的内容の作成と提供をAbocheなどの背景ウエブサーバに委せ、主として静止内容の提供に使われる。今では、TUXの新バージョンが動的内容をもキャッシュする能力も有する。TUXモジュールは、ペイジキャッシュを使って記憶される「オブジェクト」を作ることが出来る。動的データに関する要求にこたえるため、TUXモジュールは、動的に作成されたデータと前に作られてキャッシュされたデータの混合物を送ることが出来る。こうして、「ネットワーク・コピイ」操作だけの要求の殆どを、TUXで効率良く扱うことが出来る。TUXの新バージョンは、TUX 1.0 のような一時バッファの代わりにゼロコピイブロックIOを使う。仮想ホスト・サボートもまたTUX用に強化され、サポートすることの出来る仮想ホストの数は、ディスクスペースとRAMだけで制限される。
 
TUXで始めよう
TUXの能力が判ったので、TUXのインストールとコンフィギュアに移ろう。以下の情報はすべてTUX-2.1.0-2を使ってRed Hat 7.2 の上で試験済みだ。使い易いのと慣れているので、ユーザスペース・ウエブサーブ・デーモンとしてはApacheを用いた。
 
ステップ1.TUXのインストール
次のコマンドを使ってインストールされたtuxがあるか否かをチェックする。
# rpm -q tux
以下のようなメッセージが出る筈だ:
1. tux-2.1.0-2 (TUX はインストール済みでバージョン番号がプリントされた)
2. package tux is not installed (インストールされていない)
TUXがインストールされていないときは、rpm(又はソースパケージ)をダウンロードし、次のコマンドを使ってインストールする:
1.RPM パケージでは
# rpm -ivh tux-2.1.0-2.i386.rpm
 
2.ソースパケージでは
patch the kernel
# patch -p0 < tux2-full-2.4.10
# make oldconfig (ここでtuxを有効にし、kernelを再度コンパイルしてインストール)
Install the user-space utilities
# tar xzvf tux-2.1.0.tar.gz
# cd tux-2.0.25
# make
# make install
 
ステップ2.ステージの設定
ディレクトリ /var/www/html (又は選んだ別のディレクトリ)を作り、/etc/sysconfig/tuxの中のDOCROOTの値を変更して、これをTUXのルート・ディレクトリとする。CGIスクリプトがCGIROOTに記憶されるパスを示すことも出来る。またTUXTHREADS変数をここで適切な数値に設定することも出来る。またルート・ディレクトリの中にindex.htmlペイジを作ることも出来る。これは後で試験に用いる。
 
ステップ3.TUXのスタート
TUXは次のコマンドを使ってスタートすることが出来る(スーパーユーザとして)
# service tux start ( RH システム上)
# ./tux.init start (非-RH システム上)
# lsmod
Module size  Used by
tux   75568  0
....
....
ここで、ローカルホストに対する好みのブラウザを指定すると、前に作ったindex.htmlペイジが見られる筈だ。何かを間違うかコンフィギュレーションが正しくないときは、ステップ8の詳細を見ること。
# lynx localhost
 
ステップ4.ロギングを有効にする
規定値で、ロギングは無効になっている。ロギングを有効にするには次のコマンドを与える。
# echo 1 > /proc/sys/net/tux/logging
# echo 1 > /proc/sys/net/tux/referer_logging
# cat /proc/sys/net/tux/logfile
/var/log/tux (this is the default logfile)
各リクエスト毎に、TUXは要求者のアドレス、日付及び1秒までの精度の時刻、要求ファイルの仕様、転送ファイルのサイズ、及び要求の最終状況を記録する。TUX用のログファイルは(上述の通り) /var/log/tuxにバイナリフォーマットで記憶される。このバイナリフォーマットで、ログファイルはほぼ50%標準ASCIIテキストログファイルより小さくなる。ログファイルを見るには、次のコマンドを発する。
# tux2w3c /var/log/tux 127.0.0.1 - - Wed Nov 20 00:22:24 2002 "GET /manual/sections.html HTTP/1.1" - 5523 200 127.0.0.1 - - Thu Nov 21 01:36:55 2002 "GET / HTTP/1.0" - 2890 200 127.0.0.1 - - Thu Nov 21 01:37:20 2002 "GET /manual/index.html HTTP/1.0" - 5557 200 127.0.0.1 - - Thu Nov 21 01:37:24 2002 "GET /manual/mod/index-bytype.html HTTP/1.0" - 6186 200 tux2w3cプログラムは、バイナリ・ログ。ファイルを標準W3適合HTTP化ログファイルに転換する。
 
ステプ5.Gzip圧縮を有効にする
既に判ったようにTUXは速度を早くするのがすべてだ。Gzip圧縮を使っても、ダウンロード時間を短縮すると同時に帯域幅をやや節約することが出来る。しかし、この特性を働かせるには、クライアントはGxip圧縮をサポートしていなければならない。規定値で、このデータ圧縮は無効になっている。有効にするには次をおこなう:
 
# echo 1 > /proc/sys/net/tux/compression
 
スタートアップで有効にするには、 /etc/sysctl.confに次の行を追加する
 
net.tux.compression=1
 
また、拡張子 .gzの付いたGxipファイルは、使いたいペイジの非圧縮版と同じディレクトリになければならない。
 
ステップ6.TUXの細工
コンフィギュレーションは未だ終わっていない。興味ある特性/細工で使えるものが幾つかある(このうち幾つかはRHCA v2.2でだけ利用出来る)。
 * application_protocol
  1に設定すると、RHCA FTP サーバを有効にする。規定値では1に設定。
 * virtual_server
1に設定すると、マス仮想ホストのスイッチを入れる。ホストは、自動的に$DOCROOT/ (仮想docrooot)に直接スイッチが入るブラウザからのヘッダである。こうしてTUXは全く性能を損なうことなく任意の数のホストに役立つことが出来る。
 * max_backlog
TUX聴取ソケットのSYNバックログの最大サイズ。SYNアタックを防止するため賢明に設定しなければならない。詳細は2048。
 * http_dir_indexing
1に設定すると、インデキス・ファイルがないときTUXが読み取り可能ディレクトリの中のファイルをリストする( index.htmlの自動作成)。
TUXウエブサーバの性能を最大にするためコンフィギュアすることの出来るパラメータが他にも沢山ある。利用して思うように細工されたい。
 
ステップ7.ApacheをTUXと働くように構成
前述のように、推奨する構成は、ポート80(httpポート規定値)の上で初期段階ウエブサーバ聴取としてTUXを使い、TUXの理解しない要求(PHPなど、一般的に動的に作成されたコンテント)に応えるためボート8080の上で最終段階ウエブサーバ(ここでは例としてApacheを使う)を使うことである。この構成のため、Apacheウエブサーバの httpd.confファイルを少々変更しなければならない。
 Port 80
の行を
 Port 8080 ( Apache が聴取するポート)
で置き換える。
またユーザがTUXを迂回して直接Apacheにアクセスするのを阻止するため、次の変更をおこなう。これはセキュリティのために必要。
 BindAddress *
の行を
 BindAddress 127.0.0.1 (loopback アドレス)
で置き換える。
最後に
 # service httpd restart
を使って、再スタートする。
 
ステップ8.TUXのデバッグと再スタート
次のコマンドでTUXを停止/再スタートさせることが出来る。
 # service tux stop (RH-システム用)
又は
 # ./tux-init stop(非RH-システム用)
 
 # service tux restart
又は
 # ./tux-init restart
デバッグの目的で、/usr/share/doc/tux-version/ディレクトリの中のgettuxconfigスクリプトを使うことが出来る。SMPシステムがあれば、checkbindingsスクリプトを使って、すべてのインターフェイスが正しく設定されたか否かをチェックすることが出来る。これも同じディレクトリに存在する。
 
まとめ
上で見たように、TUXは、幾つかの操作をユーザ・スペースからkernelスペースに移すことによりウエブサーバの効率を改善するのを大いに助ける。この結果、性能が良くなりサーバ資源の利用が良くなる。TUXは構造化しやすく面白い特性が沢山ある。記事を楽しんで頂けたのであれば幸い。
 
参考資料
Red Hat TechSupport for TUX (RHCA)
Latest Patches for TUX
・/usr/share/doc/tux-version/のローカル文書
 
Copyright © 2002, Vinayak Hegde. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 85 of Linux Gazette, December 2002
 
 
 
END
                    
 
 
拡大画面 (元に戻るには画面をクリック)