Linux Gazette 2003年6月号 #91
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
n 書評:ウェブハッキング:攻撃と防御
n 簡易バックアップと復元
n Slackwareのインストールと安全対策
n シリコンバレー・ユーモア、団塊の世代スタイル
n 霧の中へ:Linuxコンソール・フォントの働き
n チューナ・カード−見て習う
n Perl 今月のワンライナ:逃げたファイルの冒険
n Eximを用いDebian[Woody]システム上でMailmanをコンフィギュアする
n gdを用いるイメージの作成/取扱
n sendfileシステム呼出の調査
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 
 
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼

OpenForum とソフトウエア特許
Bruce Perensは、ソフトウエア特許導入の可能性に関しOpenForum Europeが取った態度について注意を喚起している。Arlene McCarthyがソフトウエア特許に関して提案した改訂を支持する書面に彼らの代表者が署名したのを見て、Perens が報じるのはwrote::
偽物か又は間違った「オープンソース代表者」が、欧州議会メンバーに送られたソフトウエア特許を認めるようEUに呼び掛ける産業側決議に署名した。
公開質問状open letterで、オープン・フォーラム欧州の理事長Graham Taylorは、Perensの介入を拒否した。Taylorは、オープン・フォーラム欧州が、大部分は事業家と企業から構成されるメンバーを代表する簡単な声明をしただけで、広範囲のフリー・ソフトウエアやオープンソース社会を代表する努力も要求もしなかったことを指摘した。この差別が最初の書状の読者にも等しく明確であるか否かは疑問である。
 
SCOundrels?
ご承知の通り、SCO(公式にはCalderaと呼ばれるソフトウエア会社)が、詳細にはIBM、それに何とGNU/Linux共同体全体に敵対する法律攻撃を仕掛けた。詳細は法廷で争われるまで不明だが、SCOは、IBMがSCOから(AIXについて)ライセンスを受けたコードを取り上げてLinux開発者に見せたと主張している。GNU/Linux が今日の安定で強力なOSになったのは、このコードへが利用出来たためだ・・・などと話は進む so the story goes. 訴えの全容 entire suit は、SCOのウェブサイトで見ることが出来る

これで、UnitedLinuxの中の協力者をSCOが訴えると脅かしSCO threatening to sue、自分のGNU/Linux関連活動を疑うsuspension of its own GNU/Linux related activities.との奇妙な状態が生じた。怪しげな法的位置に取り残されたSCOの GNU/Linux顧客はどうなるかと思うだけだ。SCOはSCO所有の知的財産(又は何か)を不法に販売した訳だから、多分SCOを訴えることになるだろう。

この状態を理解するには、Eric RaymondのOSI position paper を読むと良い。これは読む価値がある。この文書には、法律事件関連のUNIXの歴史の面白い概観が示されている。SCOの主張には、一つか二つの矛盾、間違い及び明らかな虚偽と誤魔化しがある。この狂気の沙汰のうち幾つかは、どのコードが(少なくとも非公開協定に署名しないでsigning a nondisclosure agreement)知的財産の侵害に当たるかを明らかにするのをSCOが拒んだとのLinux Weekly Newsの記事が強調している:

「Linux 共同体は、法廷公聴会に出られる時には、時間で洗浄して、自分で勝手に公開するだろう(だから所有することが出来る)。そうしようとは思わない」
だが LWN は次のように指摘する
「Linux共同体には、勿論、コードを洗浄する力はない。SCOによれば、これ程進歩したものは盗む以外に改良する力がないからだ。
...
このような一連の出来事は、いずれにせよ、SCOの事件を変えないだろう。IBMは、SCOのコードを不正流用したのであれば、その行為は残る。行為は隠すことが出来ない。リコールしても証拠はインターネット全体を通じて、世界中に流布されている。
SCOの知的財産の「知的」な部分を盗んだ責任者を考えなければならない。

どんな結果に終わるかは誰もが考えるが、物語は未だ進行中だ。マイクロソフトのSCOソフトウエアにライセンスする決定 decision to license SCO softwareが、SCOの法的冒険に融資して、フリーでオープンソースなソフトウエアに対する信頼を損なう undermine confidence のを助けるのではないかとの疑いを生じる、味付けをする。Caldera-Microsoftの独禁法訴訟文書の書庫をSCOが壊したとの噂Reports がこのような推測に油を注いだ。新たな参加者 weighing inと意義を唱えられたコードの所有権主張とが、物事を更に混乱させた。面白い発展は、LinuxはSCO知的財産を不法に含むとSCOが言うのを禁止するドイツ法廷が与えた差し止め命令 granting by German courts of an injunction だ。

最良の行く末はRay Dessenが提案しproposed by Ray Dessen、Debian プロジェクト・リストとウィークリニュース報道されたものであろうで reported by Debian Weekly News

「この問題は、頽廃への道を進む会社からの根拠のない主張と噂から成り立っている。未だに証拠とは言えないものを作ろうとしているが、SCO自身がLinux kernelからのGPLされたファイルシステム・コードを自分の所有(Unixware?) kernelに取り込んでGPLを侵害しているとの確固たる徴候がある」
この「様子眺め」はLinux Torvaldが取る方法でもあるtaken by Linux Torvalds。もっと活動したいなら、"Hey SCO, Sue Me" を叩くか、又はEric Raymondの request for information に答えられたい。
 
 
 
 
 
▼▼▼一般ニュース▼▼▼

IBMが新Grid作品、Grid Ecosystemを作るパートナを発表
IBM が、Grid 計算を商業会社にさらに拡張する新作品を発表した。四つの産業−石油、電子、高等教育、農芸化学−のための新しいソリューションの導入を含む。加えて、IBMは、ネットワーク大手 Cisco システムを初めとする35社がIBMに加わってビジネス用Grid計算を育成する計画のGrid ecosystem の資金を作ると発表した。

IBMは、Royal Dutch Shellと地震データ処理のスピードアップの仕事をしている。Globus とGNU/Linuxを走らせるIBM eサーバとxサーバに基づくこのソリューションは、データの質を向上させながら、地震データの処理時間を短縮する。IBMはまた、RBC保険と関西電力を新しいGrid顧客として発表した。

Geekフェア
Free Geek は、オレゴン州ポートランドに本拠を置く501(c)(3)非営利団体で、使用済み技術を再利用して、社会奉仕のため交換を必要とする人にコンピュータ、教育及びインターネットへのアクセスを提供する。

6月29日(日)正午から6時までに オレゴン州ポートランド10番街1731で開かれるGEEK FAIR (バージョン3.0)を計画中である。フリー・コミュニティブロック・パーテーには、固定ディスクドライブ・シャッフルボード、生演奏、スケアダンス、食物、露店などがある。

地理的条件から大多数の読者はこの行事に参加するには問題があるだろうが、類似の催しをそれぞれの地域で計画する参考になるであろう。

GELATO Federation
GNU/Linux をイタリア製プロセッサで走らせようとのとんでもない試みがGelato Federation の会員を2倍の20校にした。Gelatoは、大学、国立研究所及び産業スポンサの世界的共同研究体で、拡張性のあるオープンソース・ツール、ユティリティ、ライブラリ及びアプリケーションの作成を専門とし、イタリーのシステムに対するGNU/Linuxの採用を促進している。

Gelatoの技術的重点は、会員とスポンサが決定し、共同作業はGelato portalを通じておこなわれる。この半年で、会員数の増加を反映して、po-rtalの活動は3倍になった。Gelato portal を通じて利用出来るようになった最近の会員ソフトウエアには、CERNからの二つの業績:物質を通る粒子経路のシミュレーション用ツールキット GEANT4と、高エネルギ物理学用クラス・ライブラリCLHEP、及び、Gelato会員 NCARからの:多重ヘッド分光変形のライブラリSpectral Toolkitがある。

 
 
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼

College Linux
Tux が学校へ、Tux goes to college.。NewsForgeの Russell Pavlicek が、スイスのロバート・ケネディ高校で開発された College Linuxについて報じている。ディストリビューションにとって高校での稼働は極めて重要だ。何人かの生徒はインターネットを通じて全ても学ぶからだ。
 
Debian
Debian Weekly News は、Debian woodyの完全に解体した変形を提供するminiwoody CDを Bonzai Linux.と名前を変えた renamed と報じた。

SuSE
SuSE Linux は、UnitedLinuxが動かすSuSE Linuxエンタープライズ・サーバの通信業者グレード(CGL)版が市場で入手出来ると発表した。HP、IBM 、インテル社との協力で開発し、初めはインテルベースのハードウエア・プラットホームを目標にするSuSE Linux CGL版は、リアルタイム・システムからバックエンド処理までの廣い拡張性を提供し、顧客が単一プラットホームを使うことが出来るようにする。オペーレーション及び美ビジネス・サポート・システム、ゲートウエイ、信号及び管理サーバ、及び次世代音声、てー多及び無線ソリューションなど−現在のアプリケーションのため、GCLは顧客が、厳格な規格と性能、信頼性、有効性に関する要求に固執しながら、さらに費用効率良く信頼性の高い最新アプリケーションを展開出来るようにする。

SuSE Linux CGL 版は、SuSE Linuxエンタープライズ・サーバ8の顧客に対しては、サービス・パックとして無料で提供する。GCLはOSDLの通信業者グレードLinuxワーキンググループ、つまりSuSE, HP, IBM, Intel 及び主要テレコム及びネットワーク装置プロバイダ をメンバーに含む.主導者、が定義した技術を組み込んでいる。

 United Linux
UnitedLinuxは、資金提供4社が、OracleのUnbreakable Linux共同出資発議のISV participants に対して特別サポートプログラムと文書を提供すると発表した。OracleのUnbreakable Linux共同出資発議は、経済的技術的奨励金を、OracleのUnbreakable Linuxソフトウエア・インフラストラクチャにソリューションを渡すISVに提供する。OracleのUnbreakable Linux共同出資発議は、Oracleの共同出資を、戦略的に選んだLinuxプラットホーム・プロバイダとハードウエア会社とともに補完する。
 
 
 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼

Mammoth PostgreSQL 7.3.2がリリースされた
Mammoth PostgreSQL 7.3.2Command Prompt, Inc. からリリースされた。Mammoth PostgreSQLは、頑丈な信頼性の高いSQL互換オブジェクト・リレーショナル・マネージメント・システム(ORDBMS)である。これは、中小規模事業に、望みの力、能力、オープン規格サポートを与える。

PostgreSQL 7.3.2 リリースと100%互換性があるMammoth PostgreSQL は、Win32、MacOSX 及びRed Hat Linux x86 のため、商業的に支援され最適化されたPostgreSQLサーバを提供する。

GNU/Linux とWindowsで利用することの出来るプラットホーム無関係PostgreSQL アドミニストレータ Mammoth pgManage 1.0もまたリリースされた。

Linuxゲーム出版から、Majesty
長い間待たれたLinux Game Publishingのゲーム Majestyが入荷してデモDemo を入手することが出来、ゲームは即納で入手することが出来る。

AppligentのAppendPDF Pro 3.0
ポータブル・ドキュメント・フォーマット(PDF)関連ソフトウエア・ソリューションのプロバイダAppligent, Inc.は、AppendPDF Pro 3.0のリリースを発表した。これは、企業と組織がPDF文書からセクションをダイナミックに組み立てて、カバーペイジや情報内容の表など、個別の工夫を選んで完全に新しいバージョンを構築するのを可能にする。これによりどのようなPDFファイルでも各個人が要求する個別情報の需要に合わせて構築することが出来る。AppendPDF Pro 3.0は、 Windows NT/2000/XP、ソラリス、Red Hat Linux、AIX 及びHP-UXと同時に Mac OS X にも利用することが出来る。

AppendPDF Pro は、購入用に http://www.appligent.com/からと同時に、米国. General Services Administration (GSA) Advantage ウェブサイトから.入手出来る。

Opera 7 がLinuxで利用出来るようになった
Opera Software は、Linux用Opera 7 をリリースした。新バージョンは、Opera 6 からLinux のための新しい特性変更と同時に、以前はLinux用Operaでは利用出来なかったビルトインe-メール・クライアントを含む。Linux用Opera 7.11は www.opera.com/downloadからダウンロードする。

その他のソフトウエア
The LyX チームは、LyX 1.3.2のリリースを発表した release of LyX 1.3.2

 

Copyright © 2003, Michael Conry. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003
 
 
 
 
 
書評:Web Hacking:攻撃と防御
By John B Cole
 

アジソン・ウェルズレイにいる人々が、私にこの本の書評を依頼したのは賢明だった。ウエブサイト・セキュリティは読者が完全には理解出来ない事柄だ。ここで本の帯の宣伝文や著者の推薦をしたりする気はない。代わりに単純な疑問に重点を置く。ウエブ開発者に実用的なことを教えて暮れるか?もしそうなら、$49.99払う価値があるかだ。そうでなければ暖炉にくべる。私は高価な分厚い結果読者を満足させない本には批判的だ。"Web Hacking" (ウェブハッキング)の中身を見てみよう。

"Web Hacking" は四つの章に分かれる。E-Commerce? Playground(電子取引?遊び), URLs Unraveled(URLの内幕)、How Do They Do It?(彼らの手口)及び、Web Kung Fu(ウェブ・カンフー)だ。著者の出だしは良い−URLに雰囲気は不要なことを実感する。残りの部分に文法の間違いなどがあっても、ネット使用からは、これだけで十分だ。著者は、学問的なスタイルの上に、この本に適したオシャベリの会話的スタイルを重ねている。

「電子取引?遊び」は、簡単な事例研究から始めてHTTPだけを用いる小さい事業用ウエブサイトに対する効果的な攻撃を立証する。攻撃者は下手に書かれたPerlスクリプトを探す(ユーザは認めても、問題には役立つ)。著者は、ファイヤウォールと侵入検出が殆ど役に立たないと指摘し、この本では一貫してこれを主張する。これは覚えて置いた方が良い。確かに事例研究の攻撃は、Amazon又はDellには無効だが、摘み取りるばかりに熟した小型ウエブサイトは沢山あり、これらサイトのうち一つが、君のクレディット番号を持っていることもある。

1章 Web Languages(ウェブ言語)は、PerlからASP まで、あらゆることを、小さく纏めている。ここの考え方は、どの言語にも、賢いハッカーに狙われる弱点があると言うことだ。殆どのウエブ開発者とシステム管理者が、ここで学ぶ新しいことはないが、会社の将来のウェブサイトに完全な言語を採用するまでは、この章を飛ばさないのが良い。

2章Web and Database Servers(ウェブとデータベース・サーバ)は、極めて短くて、ウェブサーバ・フロント上のApache とIIS及びデータベースフロント上のMS SQL サーバとOracle だけを論じる。他のウエブサーバを論じていないが、各種HTTPサーバが沢山あってこれは最も変わった場所で起こるので、これは余り価値がない。Oracle及びMS SQL サーバについて実際にライセンスを有する種類の、企業レベル顧客のため書かれたセキュリティを扱う章は、別の本にした方が良い。ここで MySQL又はPostgreSQL を扱っていないのには失望した。世界では、気付くより多いサイトが、特にパパママ型の事業で、バックグラウンドにMySQL を使っており、正しく安全を確保したMySQL インストレーションが沢山ある。

3章Shopping carts and Payment Gateways(ショッピング・カートと支払い窓口)は、私に取って新しい材料だった。重要(価格など)情報の記憶に顧客側クッキーとGET変数を用いるシステムへの古い攻撃には慣れているが、支払い検証システムを巻き込む攻撃もあるとは考えなかったので、本の実例が供給設計の重要性を強調した。

4章HTTP and HTTPS: The Hacking Protocols,(HTTPとHTTPS、ハックキング・プロトコル)は、大部分を、攻撃者に必要な全ては、URLがキャリア選択を後悔させるようにすること事実の強調に費やしている。HTTPと HTTPSプロトコル取材ががサムネール調査に有用なことはさておいて、ネットワーク初心者に価値があるか疑わしい。

5章URL:The Web Hacker's Sword(ハッカーの剣)で第1部を終わる。この章には「スターウオース・エピソードIV:新しい望み」からの引用を前書きにしており、著者のおたく風を示している。5章は、URL構造やエンコードなど、、実際にURLハックを扱うと同時に、メタ文字いたずらとHTML形式を扱う。記述された攻撃の幾つかはGET変数のみに働く。これらはユーザに対するURLを通じる変数だ。だから、容易なウエブハックに対する簡単なヒントは:永続的なデータにセッションの使い、ブラウザからサーバに対しPOST変数でデータを渡すことと、警告している。私は、大学で長い時間働いたので、ユーザ入力を信じてはいけないと言われたときは信じる。抑も、"Web Hacking" の第1部は、全体として、新任の管理者、開発者に有用で、熟練専門家に取って新しいことがあるとは思えない。

第2部URLs Unraveled(URLの内幕)は、別の事例研究から始まる。この事例研究は、賢いハッカーが公開されたURLに基づいてウエブサイトを解析し、そこのの知識を攻撃の立ち上げに使う方法を示す。この事例研究は、後の章の動機付けに役立っている。

6章 Web: Under Cover(ウェブの内幕)は、ウェブ・アプリケーション構造の概観、と同時に目標システムを解剖するのにハッカーが使う方法を示す。ここには、ウェブサーバAPI、ODBC、JDBCをはじめとする異様な方法が全部ある。サーバプラットホームに対し内線を適合させるのに役立つ小さな章さえもある。著者は、露出を限定するため出来ることも述べており、良い考えは(私見によれば)エラーとメッセージがブラウザに漏れるのを防ぐことであると言う。この章をザッと眺めて事例を見るとよい。

7章Reading Between the Lines,(行間を読む)は、弱点を見付けて攻撃を仕掛けるため("View Page Source"経由で)HTMLソースを解析する方法に重点を置く。短い開発サイクルでは見逃し勝ちな内容が冷静に述べられている。wgetとgrepの不埒な使用例もある。

8章Site Linkage Analysis(サイトリンケージ解析)は、解析方法の説明を続ける。この章は、主としてサイト解析用ソフトウエアツール幾つかの使用に重点をおく。それら全部は、(wgetを除き)ウィンドウズ・ツールである。この章では涙が出た。殆どの題材は明白だが、既に良く知っていたからだ。初心者全部と中級専門家は、掛け値なきこの章から学ぶことが多い。

第3部How Do They Do It(彼らの手口)は、この本の心臓部で、ウエブハッカー世界の「偉大な魔術の種明かし」となっている。9章Cyber Graffiti(サイバーの落書き)は、一般にメディアで報じられたウエブサイト汚損攻撃を扱う。詳細な事例研究が、プロキシサーバ構成、HTTP認証、直接ブラウズを含む多数のセキュリティ問題、を扱う。

10章 E-Shoplifting?(e-万引き)は、幾つかの販売業者をつなぎ合わせたe-取引システムの事例研究を示す。基本的な攻撃は、顧客側書式認証と価格情報を渡す隠しフィールドに基づいていた。監査人が明らかにしたリスクを目的とするサイト修理が詳細に述べられている。

11章Database Access(データベースアクセス)は、短いが興味のある攻撃と、しっかりした防御を述べる。

12章Java: Remote Command Execution(Java:遠隔コマンド実行)は、私には新しい分野だった。JavaよりCOBOLのプログラムに興味があるが、賢い開発者として、JAVAが普及しているのは知っている。この章では、スマートなことを学んだが、持ち帰りたい重要なことは、常にユーザ入力を殺菌して濾過することだ。servlet管理に基づく対策もまた述べられている。

13章Impersonation(擬人化)は、セッション、セッション乗っ取り、及びクッキーを扱う。この章は面白いが、開発者が、推測可能なセッションIDを作ったり、クライアント使用のクッキーに重要データを記憶するなど、余程馬鹿げたことをしない限り、これらの攻撃は、怖くない。

14章Buffer Overflows: On-the-Fly?(バッファ・オーバーフロー:進行中?)は、これだけで一冊の本に纏められる。近頃聞く弱点の殆ど全部は、バッファ・オーバーフローによる。この章は、極めて技術的な題材を扱うので、C又はASMコードに出会うことがある。この章は、サイトの弱点全部が、情報システムの消費者側の下手なプログラム作成又はシステム管理によることを強調するより他に価値があるかは、良く分からない。Sun、IBM、Microsof、及びそれらの同族は全部、既に知られたバッファ・オーバーフローを伴って出荷されている。販売業者さえも間違いをする。第3部は、必読の部分である。全体として、読むに値する。著者は攻撃を解剖するのに良い仕事をしており、「身元に拘わらず入力全部を検証」するとの簡単な対策を強調する。

第4部Advanced Web Kung Fu(最新ウェブ・カンフー)には、目を見開いた。全くの驚きだった。15章Web Hacking: Automated Tools(ウエブハッキング自動化ツール)は、普通に使われるハッキングツールの単なる概観だ。正直なところ、知っているのはnetcatだけだった。論じられた唯一のUnixツールだからだ。この比率に苦情を述べる気はない。

16章Worms(虫)は、インターネットを破壊した有名な虫の単なる概観だ。

17章Beating the IDS(IDS退治)は、侵入検出システム(IDS)に対しすることの出来る面白いことを扱うが、それは単なる好奇心だけだ。この章は、「最新ウェブ・カンフー」より「酔っ払いを見ていない間に棒で叩く」のに似ていて、この本では最も詰まらない部分だ。

17章Beating the IDS(IDS退治)は、侵入検出システム(IDS)に対しておこなうことの出来る興味ある事項を扱うが、単に好奇心だけだ。この章は「最新ウェブ・カンフー」より「酔っ払いを、見えない時、棒で叩く」のに似ていて、この本で最も失望する部分だ。PHBの自己満足のため書かれたような気がする。上手くやっている人への侮辱だ。

近頃の有能な開発者が、この本で詳説する攻撃に敏感なアプリケーションを展開することが(セッションの使用だけでもこれらの攻撃が無効になる)少しの言い訳になるが、この本は、一般的に開発初心者と管理者が読むのに値する。もっと熟練した開発者は、立ち読みするかインターンに売りつけると良い。492頁あるが、$49.99は高過ぎる、$24.99でも高い。

著者紹介:
John は、1993年以来 Linux を使っている科学者でプログラマだ。発狂したとき−及び幾らか肝を潰したとき−学校は別の道を強制した。John は無料ソフトウエアのサポータで、自分の研究のためと、イライラを治めるため、PHPとPythonで、幾つかのアプリケーションを書いた。記念すべき時期には、出力流を解析し結果を示す Python プログラムと呼ばれるPHPプログラムを書いた。
John は現在、自分のデスクトップマシンで Mandrake 9.1 を使っているが、Gentoo に切り換えて、いつか大胆さを占めそうとしている。
John は、論文の切り抜きを見付けたとき、動物繁殖と量的遺伝学の研究に付いて話すのが好きだ。。今度は少し技術的になる・・・
 
Copyright © 2003, John B Cole. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003

 

 
 
 
簡易バックアップと復元
By Alan Keates

緒言

最近まで、バックアップ作業の範囲は、時々自分のホームディレクトリのCDコピイを取って、重要ファイルのコピイを、普通は別のディスク・パーティションかフロッピイなど別の場所に保管するだった。

これら全てはWindows遺産アプリケーションを走らせる必要から変わってしまった。この仕事に適した唯一のマシンは、私の主ワークステーション、四つのディストリビューションに多重ブートする1.2 GHz Athlonマシンだった。私は、Mandrake 9.0,を保持する第一基本パーティションを首にして、Windows パーティションを設定することにした。

内容を7番パーティションに移して第一基本パーティションを空け、拡張可能Vector Linux 3.0 ディストリビューションを上書きした。安全のためDebian 3.0にブートし、両パーティションを /mntににある個々のmount点にマウントし、ルートとしてtarとpipeを使って、全てのリンクとパーミッションを含む何もかもをソースパーティションから目標パーティションに移した。数分経って、grubブートメニューを変えた後、7番パーティションにあるMandrake 9.0 Linuxにブートすることが出来たので、全てが予想通りであることを確かめた。

この時点で、空けた第一パーティションをDOSフォーマットしてWindowsをインストールするのが普通だが、少し心配になった。Windowsはドライブ全体をフォーマットしたり何かへまをすることがある。そのときは、パーティションをfdiskして初めから何も彼もインストールし直さなければならない。元のディスクには、自分でインストールしたものを除いて、勿論アプリケーションすべてが入っているが、特注コンフィギュレーションが無くなってしまう。

マシンは現在、Mandrake 9.0、Debian 3.0、Slackware 8.1を走らせている。このうち、Slackwareを喪うだけでも悲しかった。これはサインを含め、KDE 3.0に30秒以下でブートした。とてつもなく安定だった。LAN上のプリンタ用CUPSプリントシステムも持っている。だから、この設定は何としても保つ必要がある。解決策は、Slackwareインストールから全てをバックアップすることだ。

この点から、簡便で誰でも出来るバックアップと復元の方法が欲しくなった。

バックアップと復元のシステムに必要なものは?

ホーム又はSOHO Linux ユーザであれば、以下を薦める:

・手持ち以外の装置やソフトウエアを必要としない。
・バックアップ媒体が廉価である。
・定期的に使うのが容易、そうでないと全く使わなくなる。
・検証が容易、そうでないと使うとき役立たない。
・ハードウエアとしては、メディアとマシンだけが必要。
・危機のときの復旧に必要なのは、最低の復元知識だけ。

最近のGazette 記事見直しと、ウェブ検索により、多数のバックアップ解決策がある。多くはバックアップ機能を専門的に扱い、その多くは、予め定めて状態に戻るための全体作業の修復とシステム復旧を扱っている。自分のシステムや固有の要求に合わせたものはないので、自分の解決策を見付ける必要がある。それをここでおこなう。

使えるもの

ホーム又はSOHOユーザの多くは、テープドライブを持っておらず、バックアップの目的で買う気もない。テープ・システムもソフトウエアもコンピュータ自体より高い。必然的に可動ディスク、同一又は別のハードディスク、CD、ネットワーク経由で別のハードディスクへのバックアップとなる。この最後は、自分のシステムがダウンした時を除いて、複雑なバックアップとなる。そこで三つの選択肢を検討する。

フロッピイ −日常の追加パックアップに良く、進行にしたがって仕事をバックアップするのに最適だが、システム全体の復元には実用にならない。 LS120 Disk とthe Zipディスクはここで考える簡便で完全なバックアップには十分でない。

ハードドライブ −同一ドライブの別のパーティションにパックアップ出来るが、そのドライブが故障すると使えない。同一コンピュータの別のドライブにバックアップ出来る。これは良い方法だが、停電や近くの落雷で(又はコンピュータ盗難)両ドライブが壊れると復元のため何も残らない。

ネットワークファイルシステム −これは、インストールの方法を正しく知っている人には、ファイルのバックアップと復元に良い方法だが、ファイルを復旧できる時点までシステムを戻すには役立たない。複雑過ぎる。

CD-ROM −これには興味がある。殆どのLlinuxにCDバーナがありCD-RWの入手も容易で、在来の回転パックアップシステムと似ている。これが我々のためのものだ。

CD-ROM バックアップ

最も基本的な要件は、CDバーナがあることだ。今のLinuxディストリビューションには必要なツールがあるので、費用を最低にするには、約4ドルで良質なCD-RW2枚が買える。日常のバックアップには約5年半持つので、週一度のマシン使用なら永久に持つ。

ここで提案する計画は、2枚のCD-RWを交互に使う方法で、私は、交替を正しくするためディスクケースの背に赤と緑でカラーコードを付けた。

バックアップ・ディスク自体が実働Linuxシステムにブートする必要もある。これはマスター・ブート・レコード(MBR)と必要あれば元の残りのパーティションを再建することが出来るのを確実にするためだ。これは、大多数のディストリビューションで普通に供給されたままのブート・デスク・イメージの使用を禁止する。

自己ブートCD上の小型Linuxを早読みした後、TomsRtBt ディスクを2.88 MBイメージ・フォーマットで試すこととした。これはISOイメージではないが、焼き付けるISOのブート・イメージにするには適している。これは、ウェブにある別の各種のソースでも見出される。私はこれをフロッピイ・フォーマットで使ったが、良好で完璧だった。これにはTomのFAQもある。

稼働中のLinuxシステムを与えられた状態に復旧するには、日の単位で変わる、つまり処理インストールから変わった現在のディレクトリ内容全部を記録する必要がある。これは、復元しなければならないものを最低にする検査と詳細リストにより難儀しておこなうか、又は、これらディレクトリの内容全部をバックアップすれば、容易におこなうことが出来る。.

私は、Slackware 8.1パーティションの /home /etc /usr/local /opt /var /root /boot の内容全部をバックアップすることに決めた。

・/home は、勿論各ユーザのファイル全部を保持する。
・/etc は、コンフィギュレーション情報全部を保持する。
・/usr/local は、通常、インストール以後追加された余計なプログラム全部を保持する。
・/opt もまた、アプリケーションがファイルをインストールするのに普通使われる。
・/var は、変数の性質のデータ全部を保持する。
・/root は、ルート・ユーザに所属し、不可欠のカスタマゼーションを有する。
・/boot は、システム・ブートのためのファイル全部と、ブート.conf ファイルを有する。

上述の各ディレクトリ内容に加えて、ブートに突然の不具合があったとき無いと困る極めて重要な情報がある。MBRのバイナリコピイ、、パーティション・テーブルのテキスト・リスト、どのパーティションがどのファイルシステムに相当するか忘れた場合のfstbファイルのコピイ、及び任意選択で今のXF86Configファイル及び/又はlsdevやlspciなどのコマンドの全システム情報に関するテキスト出力だ。

この情報全部を、完全に自己充足で手元の課題に使えるよう、確実にCDに収容するためどのように構造化するが問題だ。

私のしたことは、先ずバックアップする情報全部を収容するディレクトリを作る。ルートとしては、mkdir /tmp/backup。ここで、バックアップCDの定数部分のレポジトリとして /tmp を使っていることに注意。Slackwareではこれが安全だが、他ではそうでもないかも知れない。安全で、tarにより自分自身をバックアップしない場所を選ぶこと。

バックアップ・ディレクトリにTomsRtBt Img ファイルをコピイする:cp ./tomsrtbt288.img /tmp/backup/tomsrtbt288.img 。ここで Img ファイルは、私のホーム・ディレクトリだ。

バックアップ・ディレクトリにマスター・ブート・レコードをコピイする: dd if=/dev/hda bs=512 count=1 > /tmp/backup/MBR.bin。この MBRは、採用するブート機構の第一ステージを保持する。私の場合はCrubのステージ1、GRand Unifiedブート・ローダ、又はLILOである。基本パーティションに関するパーティション情報も保持する。拡張パーティション情報は、ディスク上のどこかに保持されるので、必要ならば、次に詳説するfdiskコマンドから記録する情報とともに記録することが出来る。

バックアップ・ディレクトリにパーティション情報のリストを入れる:fdisk -l > /tmp/backup/Partition_Table,、これは復旧する前に、パーティション・テーブルのTomのリストと比較するのに使われる。

バックアップ・ディレクトリに、ファイルシステムのマウント点を定義する fstab をコピイする。ここでエラーがあると、ファイルとデバイスにアクセス出来なくなる。cp /etc/fstab /tmp/backup/fstab.bak

任意選択で、新しく復旧したLinuxシステムにブート出来るようになる前に利用したい別の情報があれば、コピイする。アクセスを容易にするため、私はXF86Configをディスクにコピイして、新システム更新をインストールするときであっても、常にXを自分の望む方法で設定出来るのを確実にした。またGrubをブート・ローダに使うのでmenu.lstもコピイした。 cp /etc/X11/XF86Config /tmp/backup/XF86Config.bak ... cp /boot/grub/menu.lst /tmp/backup/menu.lst.bak

これらのファイルは、焼き付けるバックアップ・ディスクの各コピイに追加したので、そのうち一つが変更されたとき、上書きして変更するだけが必要だ。

自己ブート・バックアップディスクを作るため、なす必要のあること

1.選んだディレクトリの圧縮TAR ファイルを作り、/tmp/backupに加える。
2. mkisofsを用いて、バックアップ・ディレクトリのブート可能ISOを作る。
3.ISO のサイズが選んだCD-RW ディスクに合うか点検する。
4.cdrecordを使ってCD-RWに焼き付ける。
5.適切な段階で標準出力、md5sumsなどに対するメッセージをecho する。
6.不要のファイルを消去する。

これをおこなうスクリプトを下に示す。テキストコピイは backup.を見ること。.sh.txt部分のないファイルは必ずrenameして実行可能にすること - chmod 755 ./backup - また、ルートPATHのどこか、/usr/local/bin が良い場所、にコピイして、同じことを次のスクリプトにおこなうこと

#!/bin/bash
#  バックアップ
#------------------------------------------------------------------------------
#  重要Linuxファイル全部の簡易バックアップを可能にし
#  特注システム修復ディスクを作るためのスクリプト
#  バックアップ交替のため"赤"と"緑”ラベルのついたCD-RWケース二つを使う。
#------------------------------------------------------------------------------
# バックアップディレクトリには、既にブート用と修復用のディレクトリがある。
# もっと追加することが出来る−私のSlackware 8.1 システムバックアップは、< 580MB.

Backup_Dirs="/home /etc /usr/local /opt /var /root /boot"
Backup_Dest_Dir=/tmp/backup
Backup_Date=`date +%b%d%Y`
Image_File=/tmp/backup.iso
declare -i Size

# 識別を容易にする目的で、本日の年月日のついたファイルを作る
tar cvzf $Backup_Dest_Dir/$Backup_Date.tar.gz $Backup_Dirs &> /dev/null

# ローカル CD-RW ドライブに対するバックアップ処理を開始
echo "Backing up $Backup_Dest_Dir to CD-RW Drive - $Backup_Date"
echo "Creating ISO9660 file system image ($Image_File)."

mkisofs -b toms288.img -c boot.cat -r \
        -o $Image_File $Backup_Dest_Dir  &> /dev/nul

# 焼き付けるディレクトリのサイズを MBで点検
Size=`du -m $Image_File | cut -c 1-3`
if [ $Size -lt 650 ]
then
   echo "Size of ISO Image $Size MB, OK to Burn"
else
   echo "Size of ISO Backup Image too Large to burn"
   rm $Backup_Dest_Dir/$Backup_Date.tar.gz # Remove dated tar file
   rm $Image_File   # ISO は次のバックアップが上書きするが、いずれは消去される
   exit 1
fi

# CD-RWを焼き付ける
Speed=4                 # 自分のシステムのCD-RWに最適の速度を用いる
echo "Burning the disk."
                              # cdrecord -scanbusから dev=x,x,x を設定
cdrecord -v speed=$Speed blank=fast dev=1,0,0 $Image_File &> /dev/null
Md5sum_Iso=`md5sum $Image_File`
echo "The md5sum of the created ISO is $Md5sum_Iso"

# md5sums を検証するため、ここでMd5sum_Isoを使ってTESTすることが出来るが、問題は、扱い難い
echo "To verify use script md5scd, this will produce the burned CD's md5sum"
echo "run this as User with backup CD in drive to be used for recovery."
echo "This verifies not only the md5sum but that disk will read OK when needed."

# イメージファイルを削除してファイルをtarする
echo "Removing $Image_File"
rm $Image_File
echo "Removing : $Backup_Dest_Dir/$Backup_Date.tar.gz"
rm $Backup_Dest_Dir/$Backup_Date.tar.gz
echo "END BACKUP $Backup_Date"
echo "Be sure to place this backup in the RED CD case and previous CD in GREEN"
echo "------------------------------------------------------------------------"
exit 0

バックアップ・システムの利用

使用の過程は簡単だ。私は毎日、システムを余り使わないときは毎週、バックアップする。バックアップ開始の度に、緑のCDをバーナーに入れる。xterm でルートにsu して、コマンドnohup backup &> /tmp/backup.log & を発し、xtermを選んで寝てしまう。バックアップには15分位しか掛からないので、便利な時間にすれば良い。次にはコンピュータで、cat /tmp/backup.log してるバックアップが上手くいったことを確認する。

バックアップISOを検証したいときは、記載されたISO md5sumの最初と最後の4,5文字を記録する。私のバーナーは書き込んだばかりのCDを信頼性高く読まないので、CDを自分のcdromに移してスクリプトmd5scd(下を見よ)を使ってmd5sumsが同じであることを検証する。同じなら、新しく焼き付けたCDを赤のケースに入れ、最後に焼き付けたCDを緑のケースに入れて、次のバックアップに備える。混同のおそれがあるときは、tarファイルの日付を点検することが出来る。バーナーはバックアップCDを正しく読まないことがあるので、md5sumsの自動チェックは含まなかった。検証の失敗がCDのエラーではなくバーナーからの読取だけしか意味しないからだ。事実、cdromを使ったときは md5sumの比較に失敗したことがない。MD5チェックサムは不可欠である。たった一つのビットエラーでも圧縮アーカイブ全体を損傷することがあるからだ。

#!/bin/bash
#------------------------------------------------------------------------
# md5scd ---- Data CD md5sum Verifier
# ISO9660 CDのため Md5sum を自動判定するスクリプト
# 注記 - このスクリプトは正しいmd5sumが知られているとき
# 特定のCDコピイが正しく焼き付けられたことを検証したい場合を想定する。
# ダウンロードISO イメージで作業するときは、コマンド行で "md5sum ISO" を使う。
#------------------------------------------------------------------------
# Linux ディストリビューション全部に見られる標準ツールが必要。
# ユーザとしてこのスクリプトを呼び出すときは、パーミッション、グループなど全部を点検のこと.

# アーギュメント脱落?
if [ $# -ne 2 ]
then
  echo "Usage - md5scd mountpoint device, ex - md5scd /mnt/cdrom /dev/hdc"
  exit 1
else
    : OK have arguments
fi

# md5sum 判定全体をループ ... install-festのため良いコピイ100?
again=yes
while [ "$again" = yes ]
   do
     echo "Please insert CD at $1 and press ENTER when ready"
     read                        #ディスク挿入を待つ
     mount $1
     Block_Count=`df -k $1 | grep $1 | cut -c 25-30`
               #700Mb ディスクはこの^^^^^ カラム限界を1k ブロック超えられない
     umount $1
     Md5sum_Cd=`dd if=$2 count=$Block_Count bs=1024 | md5sum`
     echo "The md5sum of the CD at $1 is " $Md5sum_Cd
     echo
     echo -n "Verify another CD? [yes/no]"
     read again   # Wait for "yes" -> repeat, anything else -> drop through'
   done
exit 0

システムが壊れたとき、為すこと

バックアップがブートすることを最終的に確かめる前に、tomsrtbtの限界を承知し、利用出来る唯一のエディタはVIなので、バックアップ・ディスクに置かれた各種ファイルの読取に習熟すること。ディスクは先ず mount -t iso9660 /dev/xxx /mntでマウントしなければならない。tarしたファイルは、先ずgzip 次いで tarを用いることによりtomsrtbt を使って unzip しuntar することが出来る。

しかし、先ずパーティション・テーブルが正しいことをfdisk -lを使い、記憶したテーブルを参照してチェックし、正しくなければ、MBRを修復するのが良いだろうdd if=/mnt/MBR.bin of=/dev/hda bs=1 count=512 。これは、基本パーティションとブートローダを修復する。次いで fdisk とパーティション・テーブル・ファイルを使って人手で拡張パーティションと中の論理パーティションを修復する。これには神経と経験が必要だ。しかし、確信が無いか練習だけなら変更全部を中止することが出来る。

次に、今は正常になったパーティションに正常なインストールをおこなう。ルート・コンソールのある場所にブートし直す。バックアップCDを取り付けて tar xvzf /Mount_Dir/Backup_Tar_Filenameを実行する。これで、以前のディレクトリ全部を正しい場所に復元して、殆ど完全に復旧したシステムを残す。

問題が喪失又は破壊されただけのファイルであるときは、セーブした任意のディレクトリを任意の時期にtar xvzf /Mount_Dir/Backup_Tar_Filename /homeなどを、用いて復元することが出来る。

実益の証拠

あらゆるシステムのてすとは、「働くか?」だ。私は最初にバックアップCDがTomのLinuxシステムにブートして、テキスト資料全部が読めることを検証した。勿論fdisk -l が記憶したバージョンに対応していた。MBRは、バイナリ・イメージ・ファイルから元に戻すことはしなかったが、必要ならそこにある。

最終テストは、私のSlackware 8.1システムを、Windowsのインストール前で、多分復旧を必要とする前に、元のMandrake 9.0の場所に戻すことだった。

短く言うと、

1.私はmenu.lst を変更して、MandrakeでなくSlackwareをブートすし、パーティションをフォーマットつまり mke2fs -j /dev/hda1した事実を反映させた。
2.ドライブにあるSlackwareインストールディスクとcdromからのブートに設定したbiosを用いて再ブートした。15分で全部がインストールされた。
3.新システムにブートし直し、ルート・コンソールで最新のバックアップCDを /mnt に取り付け tar xvzf /mnt/last_dated_backup.tar.gzを発した。

これは追加の5分で、バックアップしたパーティション内容全部をインストールし直し、X設定とkdeログインで復元したslackware 8.1 に入った。/dev をセーブしなかったので、デバイス・パーミッションの幾つかを再設定しなければならなかったが、細かいことだ。全体の処理に掛かったのは半時間以下だった。通常のインストールと、それに続く好きなプログラムロードの長い手順には程遠い。.

まとめ

バックアップはするのも続けるのも易しい。 使用の際には、数多くの改良を加えることが出来る。人手のバックアップと検証のコマンドは、シェル変数にして単一の言葉で呼び出すことが出来る。またファイルの全サイズが使用の要因になるときはtarの--除外フラッグを使って不変なコードの大きい部分をtarファイルに含ませないか、又はbzip2圧縮を使うことが出来る。今のままで、完全なディレクトリがルートからセーブされる。

Windowsアプリケーションに関する差し迫った必要はそれほど緊急ではなくなったが、定期的にバックアップする製品を作った。私の次の計画は、多分Wineをインストールしてこの厄介なアプリケーションを再ブートの必要なくLinuxの中で動かすことだろう。

改善のご意見に興味がある。どんなご意見も歓迎する。明らかな欠点や脱落は特に歓迎するこのアドレス this addressに連絡されたい。この計画は短時間しか使っていないが、今のところ満足している。定期的バックアップの確立をお薦めする。迅速な既製方法をお望みならこれを使われたい。スクリプトを少し変更すれば日々のバックアップに役立つ筈。

著者紹介:
退職した制御システムエンジニアで、経歴の大部分は、カナダのCANDU原子核研究所でコンピュータ制御とシャットダウンシステムの設計と改良に費やした。40年以上のプログラマで、1994年以来Linuxのファンになった。最初の登録、386 DX33 マシン上の7.83 Bogomipsが未だ走っている。沢山の趣味の中で、Lunuxとゴルフが1位と2位を占める。

Copyright © 2003, Alan Keates. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003
 
 
 
 
 

Slackwareのインストールと安全対策

By Cezary M Kruk

この記事は著者がポーランド語から翻訳した。原文はCHIP Special Linuxの夏季号で発表される。

好みのディストリビューションの新バージョンが出たときはいつでも、何もかも初めからインストールするか、更新するか使い慣れたものを続けるかで迷う。

極端な可能性二つを考える:システムを初めからインストールしてコンフィギュアするのは、新しい特性全部を見付けて使うことが出来る一方、今のままに止まると何の障害もなく今のプロジェクトを続けることができる。直面するのは、革新と安定との間のありふれたが抗争だ。

システムの基本的コンフィギュレーションは難しくない。必要が多ければ、作業量も多くなる。システムのインストレーションとコンフィギュレーションを楽にする方法はあるだろうか?完全で明確に設計した基本に、導入した変更に関する情報を含み、システムの前のバージョンで働かせると、新バージョンへの適合が遙かに容易になる。この方法は、データを集めればそんなに複雑ではないが、コンフィギュレーションを復元するとき作業量が多くなる。どうしたら自動化して簡単にすることが出来るだろうか?

幸い、Linuxは各サービスのコンフィギュレーションに付いての情報をテキストファイルに記憶する。その上、このファイルの処理のため沢山の極めて良いツールを与える。だから、正しいスクリプトを作り、システムをもう一度インストールするとき、それを使うだけで十分だ。

インストレーションからセキュリティまで

この記事は、スクリプトのグループを二つ述べる。第一のものは個別パケージのインストールと削除に、第二のものは、システムを侵入に対し安全にするのに用いる。両方ともSlackware Linux用に設計した。パケージのインストールと削除のためのツールは、SlackPkg 又はPackwareからのプログラムのように洗練されていないが、システム全体を完全に制御する。システム安全のスクリプトについても同じだ。これらは、基本的動作だけをする。ツールの両セットは、slack*moreバンチに集めた。

パターンにすると、任意のサービス又はコンフィギュレーションの処理を自動化するため別のツールを用意することが出来る。人手ではシステムを全く合わせないが、引き続くプロシージャで適切なスクリプトを補完すると決めたときは、システムをコンフィギュアするための自分のプログラムが手に入る。さらに、これらのプログラムを自分で作るので、好みに合ったものとなる。.

Slackware Linuxを例に説明したのは、これが自然な方法でユーザをコンフィギュレーション・ファイル・ディレクトリにつなぐからだ。この目的で複雑なプログラムを提供する他のLinuxは、コンフィギュレーションに付いての情報を含むファイルからユーザを遠ざける。したがってそのプログラムはユーザを怠け者にするか又は、システムの中で所謂フレンドリなプログラムで実際に変えられたのは何で何時かを確かめるのに高等な調査を強制する。

Slack*more は、二つの部分に分かれる。INSTALL.tgz アーカイブは、プログラムの搭載、削除又は更新のためのツールを含む。SECURE.tgz アーカイブは、システムを予備的に安全確保するためのものだ。

d group packages

図1../Slackware-9.0 ディレクトリからのSCRIPT.sh スクリプトのお陰で、個別グループから沢山の明確なリストを作ることが出来る。図は、d(開発)グループからのパケージのリストを示す。

パケージのインストールと削除

INSTALL.tgz パケージの最も重要な成分は INSTALL.sh スクリプトと、SCRIPT.sh スクリプトとSlackware fileファイルを含む ./Slackware-9.0 ディレクトリだ。

これらのツールを初期化するには、 /mnt/cdromディレクトリににSlackwareのインストール版をセットアップし、次いで /Slackware-9.0ディレクトリからSCRIPT.shを走らせる必要がある。スクリプトがCD-ROMのディレクトリを調べ、そこにあるtagfileの案内で、パケージに関する情報を含むファイルを作る(図1)。各ファイルは、示されたグループの名に相当する名を有する。例えば、e-ファイルは、Emacsを構築するパケージを登録する。とりわけ、以下の登録を見出す筈だ:

emacs: ADD 
emacs-misc: REC 
emacs-nox: OPT 

Slackware Linuxを知っているユーザは、ADD カテゴリがプログラムの中で使うのが不可欠のパケージを指摘、REC カテゴリは推奨パケージを、OPT カテゴリは任意選択のものを意味することは承知している。

パケージ関するこのような基本的情報があると、どの成分が必要でどれが不要かが分かる。だから上述のe-ファイルの内容を次のように変更すると、

emacs: ADD 
#emacs-misc: REC 
!emacs-nox: OPT 

emacs パケージはインストールされると予想され、emacs-misc パケージは無視され、emacs-nox パケージは無視されないだけでなく、−前にインストールされていれば−削除される。

./Slackware-9.0 ディレクトリからのSlackware ファイルには、パケージの個別グループに関する情報が幾つかある:

a 
ap 
d 
e 
f 
... 

これに基づいて、スクリプトは、パケージのどのグループを考慮に入れるかを決定する。このファイルを次のように変更すると:

a 
ap 
#d 
!e 
f 
... 

d グループは無視され、前にシステムにインストールされたe グループからの各パケージは削除される。

こうして、パケージ又はグループの名の前に#を置くとそれは除外され、!を置くと対応する成分がシステムから削除される。パケージ又はパケージのグループがインストールされていないときは、#と!の意味は同じになる。グループ名を含むファイルからの登録は、パケージ名を含むファイルからの登録に優先する。だから、グループ全体を無視するか又はそれに属するパケージを削除したいときは、ファイルに書かれた情報に無関係に、スクリプトが個別パケージの名を集めてそれをおこなう。

Slackware ファイルと個別パケージに関する情報を含むファイルが整ったら、INSTALL.sh を走らせる。スクリプトが、対応する成分をシステムに追加又は削除する。Slackwareの予備インストールで、システムが適切に調整されていないときは、新ディストリビューション用プラットホームとして使うハードドライブの作業を最適化するのが良い。それには、INSTALL.hda 又は INSTALL.hdbスクリプトのうち一つを使うことが出来る。このお陰で、パケージのインストール又は削除が速くなる。

INSTALL.sh は、多重使用の設計となっている。することがないときは、何もしない。このスクリプトを使って、Slackwareの基本的インストールが出来る。Slackwareのセットアップ・プログラムを使って最初に一つのグループからパケージをインストールするだけで十分だ。次にスクリプトをシステムに入れて不要なパケージ又はグループをコメントし、INSTALL.shを呼び出して、残りをインストールする。

パケージに関する情報

./Packages ディレクトリにはSCRIPT.sh スクリプトがある。Slackware CD-ROM,を取り付けて既述のスクリプトを走らせると、システムの個別パケージに関する情報のあるファイルを含むディレクトリ構造を作る。パケージに関するこのような参照データベースは、選択したパケージの用途を知りたいとき一々インストレーションディスクを取り付けないで済むので便利である。このようなベースの構築に理由があるのは、Slackware Linux全部をインストールしないときだけだ。インストールすれば/var/log/packagesディレクトリに情報がある。

パッチ

./Patches ディレクトリには、二つのスクリプトが含まれる。使いたいときは、先ず0.check を走らせる。これが sunsite.icm.edu.pl サーバを点検して、Slackware 9.0 用に利用出来る更新を探し、更新に関する情報を含むPackages.html ファイルと、パケージ名を含むPackages.txtファイルを作る:

mutt-1.4.1i-i386-1 
sendmail-8.12.9-i386-1 
sendmail-cf-8.12.9-noarch-1 

1.get script は、最後のファイルを使ってパケージ、適切な .txt ファイルと.tgz.asc ファイルを入手する。これをするため、このスクリプトは、コマンド wget -c -t0 を使うので、同じファイルを繰り返し入手するおそれはない。他方、示されたファイルが入手済みであるとのチェックには時間が掛かるので、1.getを開始する前にPackages.txt ファイルを閲覧し、入手済み又は気にしないパケージ名をそれから削除するのが賢明だが、これは不要だ。

ファイル入手のためのコマンドを wget -c -t0 -b に変更することが出来る。すると全てのファイルが同時にサーバから−バックグランドに−与えられる。サーバ全部でこのような同時接続を出来る訳ではない。sunsite.icm.edu.pl サーバがニーズに合わないときは、 0.check と1.get スクリプトに別のホストを登録することが出来る。次いで、Packages.html ファイルからPackages.txt ファイルを適切に作ってコマンド内容を適切に作り直さなければならない:

cat Packages.html | grep ".tgz.asc" | sed 's/.tgz.asc//g' | sed \ 
's/.*A HREF="//' | sed 's/">.*//' > Packages.txt 

1.get スクリプトは、カジュアルなパケージの情報だけを登録する。Slackware用の巨大な更新は別のディレクトリ(kde, kdeiなど)に入れられる。これらが欲しいときは、人手でおこなうか又は元のスクリプトを適切に変更しなければならない。

./usr/local/bin ディレクトリ

/usr/local/bin ディレクトリには、atpkg スクリプトがある。これは、システムにインストールされたパケージ全部についての情報に関し /var/log/packages の中で利用することの出来るファイルを容易に調べる。 INSTALL.sh は、ローカル ./usr/local/bin の内容全部をシステム全体の同等物にコピイする。だから、ここにシステムに対する初期作業の間に使いたいスクリプトを、入れることが出来る。

removed SUID and SGID bits

図2.SECURE.sh スクリプトは、選んだファイルからSUID とSGID ビットを取り去ってそれに関する情報を表示する。

セキュリティ

SECURE.tgz アーカイブの主スクリプトはSECURE.sh. である。これは次を実行する:

・/etc/login.defs ファイルで PASS_MAX_DAYS 変数を182に設定する。.そのお陰で、新ユーザのパスワードの検証時間が6ヶ月に制限され。

・/etc/profile ファイルで HISTFILESIZE 変数を100 に設定する。そのお陰で、コマンド歴のファイルが百行に制限される。

・/root/.bashrc ファイルで TMOUT 変数を900 に設定する。そのお陰で、ルートの不活動セッションが15分後に中止される。

・/etc/inetd.conf ファイルでコメントされていないもの全部をコメントするが、ネットワークサーバには危険の可能性がある。

・マシンに対する外部アクセスをブロックするため /etc/hosts.deny ファイルに ALL: ALL@ALL エントリを入れる 。

・/etc/hosts.allow ファイルにe ALL: ALL@127.0.0.1 : ALLOW エントリを入れて, ローカルマシンのリソースに対するアクセスを与える。

・/etc/host.conf で order hosts, bind シーケンスを、もっと安全な order bind, hosts に変更し nospoof on シーケンスを追加する。

・/etc/securetty ファイルで /dev/tty1 を除く全コンソールに対しルートへのアクセスをブロックする。

・/etc/group から殆どの場合に余計なnews とuucp グループを削除する。これは groupdel news groupdel uucp コマンドを与えるのと同等である。

・/etc/passwd ファイルから news, uucp, operator, sync, shutdown users を削除する。これは適切なパラメータを取る連続の userdel コマンドと同等である。

・Performs the parallel actions with reference to /etc/shadow ファイルを参照し平行作用を実行する。

・/etc/inittab ファイルでca::ctrlaltdel:/sbin/shutdownから始まる行にコメント記号を設定する。そのお陰で、Ctrl-Alt-Delete shortcut が、マシンの再ブートが起こるのを止める。

・Takes away from all the scripts from /etc/rc.d ディレクトリからの全スクリプトから、グループ又は他のユーザがそれをを読み取り又は実行する権利を取り去る。

・/etc/rc.d/rc.local ファイルに、別のサービスに切り換える数個のコマンドを追加する。 これらのコマンドを働かせるには、Kernelに IP: TCP syncookie support mモジュールを追加しなければならない。

・数十個のトラブル・プログラムをテストし、それらからSUID ビットを取り去る。これは、これら修正に関する情報をログファイルに記憶する(図2)。

・SUID と SGID ビットを取り去る同様の作業を数十個のプログラムに対しておこなう。

・ /etc/mail/sendmail.cf config ファイルにエントリ O PrivacyOptions=noexpn O PrivacyOptions=novrfy を入れる。これはシステムがアカウントの遠隔点検をするのを禁止する。

・削除スクリプトを /etc/cron.daily ディレクトリにコピイする。これは各種一時ディレクトリ又はファイルをシステムから自動削除するのに使われる。

・有用スクリプト数個を /root/bin ディレクトリにコピイする。

これらの処置は、システムのセキュリティを著しく向上するが、起こりそうな割れ目の弥縫策の始まりに過ぎない。SECURE.sh スクリプトは繰り返し走るように書かれた。だから、スクリプトに任意のプロシージャを追加して問題なく摘要することが出来る。

このスクリプトは各種サービスを修正するが、過負荷にはしない。/etc/inetd.conf,を読み直すには killall -HUP inetd コマンドを用いる。変更した /etc/inittabを実行するには、 init q コマンドを走らせる。sendomailを再スタートするには /etc/rc.d/rc.sendmail restart 又は kill -HUP `head -1 /var/run/sendmail.pid` コマンドを用いる。.

これらのコマンドをスクリプトに含むことが出来るが、危険性もあるのを考慮しなければならない。sed プログラムの呼出に小さな間違いがあると、修正 /etc/inittab の代わりに、空のファイルに入ってしまう。その結果initの再ブートの後、システムへのアクセスを失って、別のパーティション又はディスクにインストールされたLinuxシステムを使って、コピイから /etc/inittab を記憶し直す羽目になる。これは、特にLinuxのあるパーティションが無いときは、余り気持ち良くない。

the files of the huge size

図3.巨大サイズのファイルのリスト。見られるように、/opt ディレクトリにインストールされたOpenOffice.orgスーツのファイルが大部分を占めると同時に、RealPlayer とPingusファイルがある。

テスト

TEST-SECURE.sh スクリプトは、ある種のファイルをシステムから捜し出す:

・SUID 又はSGID ビットを設定したふぁいる。.

・巨大で古いファイル(1 MB 以上のファイル、修正又は三ヶ月以上使用しないもの)

・飛び抜けて大きいファイル (図3.)。

・システム内のユーザ又はグループに無関係のファイル。

ファイルの各カテゴリに関する情報は別のログファイルに登録される。さらに、TEST-SECURE.sh が、SECURE.sh スクリプトの作業結果を使用して、ログファイルの内容を、SUID 又はSGIDビットのないプログラムについての情報を表示する。

これら全部の課題を纏めて実行するとは限らないので、/root/bin ディレクトリには、各々が特定のテストをおこなう 1.suid, 2.巨大+旧, 3.巨大, 4.誰も書かない、がある。.

その他...

SECURE.sh スクリプトを、追加特性のコンフィギュレーションとインストレーション担当する別のプロシージャで拡張するのは、価値がある。スクリプトで使用したプロシージャに続けて、サービスの切り換え、ユーザ・アカウントの構成、ネットワーク設定、e-メールとWWWサービスとクライアント、X Window などのための次のスクリプトを書くことが出来る。唯一の制約は、君の想像力だ。Linuxは殆ど何事でもこんな方法で扱うことが出来るからだ。これらのスクリプトを完成したら、Enterキイを数回押すだけで、自分のニーズに合わせてシステムを構成することが出来る。

参考資料

Slack*more:
freshmeat.net/projects/slackmore
SlackPkg:
freshmeat.net/projects/slackpkg
パックウエア (ポーランド語サイト):
hacking.pl/packware.php
 
著者紹介:
Cezaryは、ポーランド、ロクロウに住む。ポルトガル語季刊誌 CHIP Special Linux. の編集者だ。
 
Copyright © 2003, Cezary M Kruk. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003
 
 
 
 
 
シリコンバレー・ユーモア、団塊の世代スタイル
By Janine M Lodato
 

私は幸運だ。重要な高校レベルの会合すべてに夫Lazioに同伴し、洗練されたシリコンバレー幹部社員が夫の革新的情熱を楽しむかを聞いている。彼はハンガリーの革命家でソビエトと戦い、あの悪魔の帝国に最初の割れ目を作った。だが今では、彼の革命は実在の悪魔の帝国マイクロソフトに対するものだ。新しい武器はLinuxとインターネットだ。

コーヒーブレーク一つの間、Lasioは、革命世界でのコーヒーの重要さを説かずにはいられない。1956年のブタベストの学生は、ブタのキャッスルヒルのコーヒーハウスでエスプレッソを啜りながら革命の種を育てた。1953年のスターリンの死以来、ブタペストの青年達は殆ど毎日集まって共産主義暴君に立ち向かう計画を練った。

今でも、1956年10月22日に機が熟していたとは思えない。

大学の彼の同僚と彼は、どのシティスケアで平和な抵抗をおこなうか判断した。ベンスケアの工科大学、革命詩人のスケアにある医科大学、別の場所にある科学工芸大学。

百年にわたって、コーヒーは、考えを刺激し、気分を高揚させ、眠気を防ぎ、支配者に対する反抗を育てるとの評判を勝ち取った。歴史を通じる支配者のある者は(ナポレオン、フレデリック大王、クレメント法王)は、評判のため使用の普及を止めようとした。16世紀末にクレメント法王は、コーヒーが大変好きで、止めないことにした。

1700年に、英国のコーヒーハウスは革命の温床として禁止された。1789年に、ダントンはパリのコーヒーハウスで革命仲間と会ってフランス革命を計画した。1956年にハンガリーでコーヒーハウスは禁止されなかったので、彼と彼の同僚はエスプレッソを啜って、明日始める革命の戦略を話した。


会合は、サンフランシスコのサンフランシスコ・ヨット・クラブで、雰囲気はコーヒーハウスに似ており革命的な議論にふさわしかった。役員はマリーナに早朝到着したので、深い霧と小雨に迎えられた。昼になって霧が晴れ、サンフランシスコの夏特有の涼しい快晴になった。大きい窓とベランダのあるヨットクラブの環境は、片側にアルカトラ反対側に金門橋のあるサンフランシスコ湾の壮大な光景が見渡せる。デッキに急降下して撒いてやった肉塊を取り上げる鴎の叫びが会合に音響効果を与える。

だが、会合は大変長いので、車椅子に座っている私の脚は何度もむくむ

会合の主題は深くて重要だ。補助的技術に何が出来よう、団塊の世代のため何をすべきか。


団塊の世代が老齢になるにつれ、祖父母、叔父叔母、両親、映画俳優や歌手が我々の前の世代から亡くなるのを認める。稀な例だが、二つの埠頭、両ビートル、有名でない埠頭幾つか、最も悪いのは、子供達の死を認めさせられた。今や我々自身の死と言う現実に直面しなければならない。1980年に私が複合硬化症(MS)と診断されて以来直面して来たものだ。

マーロン・ブランドやリス・テーラーを含む俳優の世代にさよならを言はなければならないまで長くはないだろう。1970年に彼らのようになろうと努力した。今は、彼らのようになろうとは思わない。間もなく、ダスチン・ホフマン、メリル・ストリープ、残った二人のビートルズ、エルトン・ジョーン、コングレス、クリントンなど他の俳優や歌手及び家族又は時間切れになた人々と別れるだろう。

ろくでなしは、有り難い支社の音楽を慰めのため聴くのに慣れた。今はジャック・ケボキアン博士を思い出す。

1994年に、スーパーマンを勇気のある、英雄的な想像のキャラクタと見なし、その勇敢さに憧れた。彼の1995年の事故の後、世界はスーパーマン(クリストファー。リーブ)を勇気のある、英雄的な実世界の人物とみなし、前よりも彼の勇敢さに憧れた。

今、私は車椅子に縛られているので、何物からも逃げられない。コンピュータと電話に音声認識を使う必要があり、両方とも口を動かしボタンを押すのに夫の手助けが要る。テレビとCDプレーヤのリモコンも同様だ。ハンズフリーのコンピュータ、電話、テレビ、CDプレーヤ、車椅子の制御を必要としている。

重要なのは、私の周りに良い物があることだ。私は盲目ではない、一文無しでない、退屈していない、裏切られていないし、脳死状態でもない。

ハイテク産業にいる人々には、精度を高めるため読唇と対になった音声認識で制御されるハンズフリー製品を作る義務がある。その日が来ると確信する。何時か知らないだけだ。差し当たっては、2002年にある音声認識を使わなければならないので、コンピュータに話し掛けて夫に怒鳴るが、コンピュータの方が良く答えて勿体振らない。

誰でも生涯のうち何時かは身障者になる。道路を見続けなければならないドライバを考えると、電話呼出を起動し、会話し、終わるのに音声を使うのが良いだろう。何時の日か、車を音声で運転するだろう。時間の問題だ。

技術開発者は、団塊の世代と市場の大部分を占めることを覚えて置かなければならない。彼らが家庭や自動車にその世代のため速度で技術を持ち込むなら、多大の時間を勝ち取るだろう。


ヨットクラブでの疲れる会合の後、夫は私の脚に手を伸ばし膝の上に載せて休ませた。これを見て、役員の一人が、君の夫は優しいねと要った。私は、ええ、易しいこともあるけど、護りを固めないと、嫌な奴になることもあるのよ、と答えた。

Laszlo はこれを聞いて、付け加えた、嫌な奴でも、気高い嫌な奴だ。

 

Copyright © 2003, Janine M Lodato. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003
 
 
 
 
 
霧の中へ:Linuxコンソール・フォントの働き
By En D Loozzr
 

コンソール・ドライバ

Linux 2.4.x,の時点で、kernel はキイボード・ドライバとスクリーン・ドライバに細分されるコンソール・ドライバを含む。コンソール・ドライバは、Linux 2.6.0 のため完全に書き直されたが、この段階では、基本的に、キイボード・ドライバが文字をアプリケーションに送り、アプリケーションが仕事をして、ディスプレー上への何らかの出力をスクリーン・ドライバに要求する。コンソール・ドライバは、 /usr/share/kbd/ 又は /usr/lib/kbd/に常駐すると思われるkbbパケージにより補完される。

キイボード・ドライバからアプリケーションへ更にスクリーン・ドライバへの経路で、文字はコード(16進数)以外の何物でもない。また、最後に画面で小さい画(象形文字)を見たいので、象形文字をこれらの文字と結合する方法がある筈だ。

この記事は、キイボードとアプリケーションとの間で起こるが与えるものを取り上げで、何かスクリーン・ドライバだけに重点を置く。フォントの基本的概念の幾つかが必要である。またユティリティ 'setfont' に関するマニュアルを手元に置くこと。この記事は、以下からの資料に基づく:

ftp://win.tue.nl/pub/linux-local/utils/kbd
ftp://ftp.debian.org/debian/pool/main/c/console-tools
http://qrczak.home.ml.org/programy/linux/fonty/


ユニコード

伝統的に、文字エンコードには8ビットを使うので、 2^8=256 文字に限られ、これでは十分でない。勿論、昔は、プリンタやモニタは特殊記号(アクサン、ウムラウトなど)を知らず、もっと前には、大文字と馬鹿にされた小文字しかなかった。この時代は、 i18n (国際化)256文字をおつまみと格各付けして終わった。

ユニコードとも言われるUCS (ユニバーサル文字セット)は、中国、韓国、日本の象形文字を含む世界中の活字を扱うため作られた。これはに65000 文字以上で発足したが、2^31まで増やすことが出来る。想像されたい。

UCS は、32-ビット/4-バイトエンコードである。ISOが10646-1規格として規格化した。UCSから元雄も広く使われる文字は、その UCS-2 16-ビット・サブセットに含まれる。これは現在Linuxコンソールで使われているサブセットである。Linuxが南北アメリカ、西ヨーロッパ及びアフリカで規定値として使う文字セットは latin1又はISO 8859-1と呼ばれる。

便利のため、UTF-8 と言うエンコードは、ASCII逆互換のため設計された。UCSエンコードを有する文字は全部UTF-8シーケンスで表現することが出来る、逆も真である。それでもUTF-8とユニコードは別々のエンコードである。

UTF-8モードでは、コンソール・ドライバはASCII範囲の文字を前と全く同様に扱うので、古いテキストビューワもASCIIの表示を続けることが出来る。ASCII範囲を超える文字は、バイトの可変長シーケンス(文字当たり6バイトまで)に変換される。UTFは文字通りユニコード変換フォーマット(Unicode Transformation Format)を意味し、UTF-8は−在来の文字セットが占めた−8-ビット文字の転換を含む。

ユニコードは複雑である。任意の文字にIDを割り当てると思えば良い。そのIDは完全な形で四バイト、UCS-2 sサブセットでは二バイトを含むので、ユニコードIDは0x2502 のようになり、U+2502とも書く。IDが分かると、適切なフォントからその文字に関する象形文字(絵)を拾い上げることが出来る。実際象形文字の名称さえも規格化されているので全ての大文字、例えば:

FEMININE ORDINAL INDICATOR

全て明白だろうか?

問題 1: 与えられたユニコードの公式名を見付ける

問題 2: 与えられたユニコードの象形文字を入手する

問題1 は、Linuxコンソール・ドライバに関する限り重要でない。最も普通の公式名はkbdディレクトリ ../consoletrans の中の *.trans ファイル、又はkbdディレクトリ../unimapsの中の*.uni ファイルで見出すことが出来る。詳細は下記を参照:

http://partners.adobe.com/asn/developer/typeforum/unicodegn.html

本当に厄介なのは問題2だ。

象形文字

象形文字については既に説明し直感的に明らかになったと思うが、少し追加する。

winword又はワープロを立ち上げて 'a' を数回フォントとサイズを変えてタイプして見る。これらのaすべては同じに見えるが形とサイズが異なる。共通なのは一つの象形文字、'a'の象形文字と言う事だけだ。

象形文字への参照は、何かを見るため使う必要のある特定のフォントからの抽出のようなものだ。

フォント a は、特定の形の象形文字の集積だ。グラフィック・モードの間、書体(形)が重視される。コンソールでは主にどの象形文字が含まれ又は含まれないか−及びフォントサイズ−を気にする。コンソール用のソフトフォントは、バイナリ・ファイルに各象形文字のビットパターンで入る。そしてVGAアダプタのROMにはハードウエア・フォントがある。これは、ブート時にソフトフォントをロードしとき見られるフォントだ。

ユニマップ

画面フォントマップ(Screen Font Map)は、コンソールフォントの位置毎に、描写文字のリストを与える。Linux 2,4xの下で、スクリーンドライバはUCS-2エンコードに基づく。.

画面フォントマップはまた、ユニコードマップ又はユニマップ又はコンソールマップ又はスクリーンマップpsfテーブルなどとも呼ばれる。技術は多岐に変化するので、理解するのは容易でない。特にユニコードが出る前はこれらの用語が違う意味を持っていた。同じ目的で同じフォーマットを有するファイルに、異なる拡張子を付けて命名していた。普及していて明確だと思うので、ユニマップを選んでファイルを *.uniとする。kbdパケージからのこれ以外のユティリティに出会ったら、技術の迷路に注意されたい。

常に一つのユニマップがある。フォントに含まれるか又は明確なファイルからロードするか−最後の手段として−デフォルト直行フォント又は直接フォント又は雑マッピング又は直接マッピング又はゼロマッピング又はidem(同語)マッピング又は識別マッピングとなる。ここでも、用語は確定しておらずユーザ環境を邪魔している。idemマッピングは、文字0xB3などの要求を受けるとフォント内の0xB3位置にある象形文字が直接拾い出されることを意味する。混乱を面倒にするのは、直行フォントがユニマップとは見なされないことがあることだ。こでは、kbd パケージからのsetfont が別の表現をしていても、常にユニマップがあると言う事にする。これらはオプション
setfont -u none
を使って、直行フォントを強化する。ここでsetfontと合体したmapscmは、直行フォントを特殊ユニマップと呼ぶ。これは分かり易い選択なので、これにしたがう。

象形文字一つは、別のユニコードにも役立つ。同じ象形文字が沢山の名を持つことがあるからだ。例えば、重要な文字 'A' はロシア語でも英語でも別の名で利用されるが、英語とロシア語を含むフォントに 'A' の象形文字を二つは必要としない。だからこの場合別々のユニコードが同じ物を示す。

二つの象形文字が別のものだが互いに似ており、空間の節約と他の代理に役立てるため、そのうち一つだけをフォントに含むことがある。これはタイプライタの時代に似ている。例えば、開きと閉じの引用符は、活字は違うが、同じである。

代用は、代替登録を用いて公式化する。代替動録は、空白で別れた二つ以上のUCS-2コードのシリーズである。最初のものが、象形文字の欲しいユニコードで、続くものは、最初のコード専用に象形文字が設計されていないとき使う象形文字の物である。コードの順序は、優先度の順を示す(あれば自分の象形文字、次に第二候補、第三候補、など)

代替登録は、次のような行を用いてユニマップに入れると有効になる:
0x04a U+20AC U+004A
(意味は、0x04a 番文字のためユーロ記号 が欲しい。なければ通貨記号を使う)

スクリーン・モード

二つのスクリーンモードがある。1バイトモード(最近まで広く使われた規定値)と、UTF-8モードだ。画面をUTF-8モードに又はから切り換えるには、プロンプトでエスケープシーケンス '\e%G' と'\e%@' を用いる。 次を送る::
unicode_start
unicode_stop
キイボードとコンソールがト UTF-8.に又はから切り替わる。

UTF-8 モードでは、アプリケーションから受け取り画面に書かれるバイトは、UTF-8シーケンスと解釈され、ユニコードに転換してユニマップを探し、使用する象形文字を決める。

1バイトモードでは、アプリケーションが送ったバイトに対し、ユニマップを使用する前に、追加の中間マップを適用する。

この中間マップは、Application Charset Map又はApplication Console Map (ACM 又は acm)と呼ばれて来た。残念乍ら、これは静かに消えたと思われるコンソール−ツール・パケージの用語である。.

kbd パケージは、マップに固有の名を付けていない。翻訳テーブルと呼ぶか又は拡張子 .transの付いたファイルに格納する。setfontのマニュアルでは、ユニコード・コンソール・マップと呼ぶが、これはユニコード・マップ(unimap)を連想させるので、おかしい。袋小路から逃げる方法として、ここでは、至る所にあらわれる略語、cmapと呼ぶ。

二つのモードの簡単な図解を示す:

    1バイトモード:
        アプリケーション->      cmap ->         unimap -> 画面
                     (bytes)      (UCS-2)

    UTF-8 mode:
        アプリケーション->                      unimap -> 画面
                     (UTF-8 / UCS-2)

この図は文書の森を切り開く鉈なので、覚えておくこと。cmapとunimapの違いを確認しておくこと。

CMAP の役割

cmapには幾つかのフォーマットがあるが、マップが実際にすることを理解出来るのは一つだけだ。例として、kbdパケージの../consoletrans ディレクトリにあるcp437_to_iso01.transファイルを見てみよう。 コードペイジ437は早期のDOSに芽生え、未だにあらゆるVGAアダプタのROMにあるフォントとなっている。

このファイルには、16進数の2カラムがある。第一カラムは、フォントの中のスロットを列挙し、256位置が最大となっている。cmapでは256個だけ扱う。

第二カラムは、翻訳である。考えているファイルにより、cp437フォントを latin1フォントであるように扱うことが出来る。翻訳は完全ではないが役に立つ。例えば:
0xA1 0xAD
cp437の文字 0xA1は、アクセントのある母音で、latin1のこのコードは正しくない。だからcmapはコンソール・ドライバに、文字要求が0xADである時の反応をするよう情報を送る。コンソール・ドライバはunimapに行って(直行フォント)0xAD位置にあるユニコードを読む。これは逆感嘆符のU+00a1である。次のステップはフォントで、U+00a1のための象形文字が拾われる。結局、0xA1 を要求したが、cp437の位置でその文字が得られなかったことになる。位置0xA1では、laitin1の逆感嘆符を入手した。cmapのお陰で我々のcp437はlaitin1のように行動する。

この例は完全に働くが、cp437とlatin1は大いに異なるので、別の場合には、文字の一般的置換による間違いに出会う。又は近似、代替に出会う。例えば、シルコンフレッククス記号が上にあるaが欲しいとき大文字の'A'を与えられる。

256 文字フォントを使うときは、cmapが実際に翻訳するのは代替を意味する。代替が不要なときは、cmapは直行フォントである。各文字はそれ自体に翻訳され、unimapだけが関係する。これが最も自然で普通の場合だ。

しかし、フォントは一つ以上の文字セットを対象とする設計にすることが出来る。これは512文字セットで明らかだが、実際には(部分的にだが)一つ以上の文字セットを扱うことの出来る256文字フォントがある。このようなフォントを使っているときは、cmapに対象とする文字セットの一つを選ばせることが出来る。一例(lat1-16.psfu)を下で論じる。

G0/G1 LEGENDS

一時に作動するcmapは一つしかないが、kernelはそれらを四つ知っている。そのうち三つは、ビルトインで変わることはない。これらはIBMコードペイジ 437から早期のDOS版までをボックスドロー文字で、DEC VT100 charsetもまたボックスドロー文字で、及びISO latin1 charsetを定義する4番目のkernel charset は、ユーザ定義で、規定値では直行フォント・マッピングで、これだけがソフトフォントをロードして変えることが出来る。

コンソール・ドライバには、G0とG1のラベルが付いた二つのスロットがある。それぞれが、四つのkernel charsetのうち一つと関連している。G0とG1は、cp437, vt100, latin1を指す限り、コンソールからコンソールに変わることが出来る。これら三つと異なるcmapを任意のコンソールのG0又はG1スロットいずれかに入れると、他のコンソールが同じユーザ定義文字セットに切り換わる。規定値では、GOがlatin1を指し、G1がvt100を指す。G0とG1はプロンプトでエスケープシーケンスを用いて作用させることが出来る。だから何度も言ったが、単独のままにするのが良い。理由は?

ソフトフォントをロードし、エスケープシーケンスを送ってkernel charsets間で切り換えると、沢山のがらくたを生じる翻訳をソフトフォントに適用することになる。選んだcmap は、フォントに適したもので、現在のユニマップと共同作業するものでなければならない。この関係で持っている唯一の保証は、setfontに頼ってomapとunimapの両方を制御することだ。setfontコマンドをエスケープシーケンスをコンソールに対して混ぜることと、部分的に規定値に頼ることから出発すると、どのような方向感覚も失う結果となる。omapとunimap を制御下に置くにはunimapビルトインを有するフォントを使って、256文字ソフトフォントをロードするとき、以下を使う
setfont -m none this_beauty_of_font.psfu
これは、同時にキイボード・ツールを使っていないときは、干渉のない良い保証を与える。キイボード・ツールはコンソール・フォントに影響するからである。512文字フォントについては、中にあるものを承知し、含まれる文字セット(つまり対応する*.transファイル)を承知しなければならない。でないと相互の切り替えが出来ない。

ユーザ定義の文字セットはどうだろうか?ソフトフォントをロードしているときは(そして現在のフォントをディスクにセーブするだけの時を除いて、setfontを走らせるとソフトフォントをロードするときは)kernelからユーザ定義文字セットを拾い上げるエスケープシーケンスが、ソフトフォントをcmapとしてそれに絶対的なchrsetとともに作動状態にして、ROMフォントに戻ることが出来なくなる。softfontのソースコードを見ると、それらはソフトフォントの文字セット兎に角作動させているのが分かる。ユーザ定義文字セットは何の役にも立たないので忘れて、setfontに任せる。

他方、ROMフォントを走らせてソフトフォントをロードしないと、ユーザ定義文字セットの要求はcp437をリセットするだけだ。理由は、ユーザ定義文字セットは規定値直行フォントを有するからだ。例えば、小文字を持たない vt100 を選んだとすると、たちまちがらくたが表示される。ユーザ定義文字セット(これは未だ定義していないので未だに規定値を有する)のためのエスケープシーケンスを送るとがらくたは消えて、再び小文字があらわれる。

しかし、明確にkernel charsetに対処するソフトフォントがある。このフォントは
lat1-16.psfu
と呼ばれ、名前のようなlatin1ではなく、混血だ。cp437に設定されたcmapではcp437のほとんどを渡し(ブロックとボックスドロー要素全部)、latin1に設定したcmapを使うとlatin1を渡す。また望む人にはvt100も渡す。ユーザ定義cmapを要求すると、通常は空の範囲(0-31, 128-159)を使って、cp437とlatin1からの文字を纏めてパックしているのが分かる。

助言:latin1が適切でない地域にいるときは、自分のディストリビューションが提供するフォントに貼り付くこと(ボックスドロー要素にはさよなら)。latin1で良いなら、lat1-16.psfuを用いる。これでlatin1文字とファイルマネージャ用ボックスラインが得られる。

ドキュメンテーション又はその欠落

Linux コンソール・フォントを巡る問題は、殆ど文書化されていない。マニュアルは薄いし、用語は大袈裟で、kbdパケージに付いて来るハウツーには落胆する。これを推薦する人は読んだことがあるのかと思う。

この記事で示した内容は、基本的なもので、理解するにはまたまだ努力が要る。別の角度から纏めて見る。害にはならない。

・以下の区別を覚えておくこと:
(i) ROMフォント(常に256 文字) (ii) コンソールソフトフォント
(a) 最大256 文字 (b) 257-512 文字
・ROM フォントは、古い DOS cp437である。ROM フォントからソフトフォントに変えた後は、ブートし直し以外ではROMフォントに戻らない。
・cmap とunimapは、フォントに会わないとがらくたが出る。マッピングが合っているときは、別の正確で使うことが出来、複数の文字セットを含む。これは512文字フォントを使うとき証拠として明らかだ。
・512 文字フォントが「自然で」分かり易いソリューションと思ったら、考え直すこと。512 文字フォントは、太字カラーを無効にするからだ。Red Hat 8.0 には規定値でこのようなフォントがあるので、Red Hat 8.0 は喜んでいない。Mandrakeに付き下で言うことをチェックすること。
・今のコンソール・フォントにある文字だけを表示することが出来る。つまり、作動中にフォントAからBに切り換えることは出来ない。Bにある表示文字はAになくAに切り換わる。元のAに戻ると、闖入者B文字は次の画面更新で上書きされる。ファイルマネージャ、Midnight Commanderなど、が、純粋なlatin1フォント(これにはボックスライン要素がない)使っているとき、ボックスラインを表示しないのは、この理由だ。
誰かが、Linux 2.6.0用新コンソールドライバで仕事をしている。カスタマイズすることが出来るだろうか?512文字より多いコンソールフォントを使う仕掛けは、各コンソールに独自のフォント、大字カラー・フォントの干渉無しだ。

質疑応答

ROM フォントをコンソールで強化する方法は?

そのためのユティリティがどこかにある筈だが、kbdパケージにはない。このようなユティリティが無いとき、ROM フォントを強化する唯一の方法は、ROMフォントにブートすること。 init スクリプトを点検して、ソフトフォントがロードされていないのを確認する。失敗したら、ソフトフォントのあるディレクトリの名称を変えると、ブート時に見つからなくする。
ROM フォントをファイルにセーブする方法は?f
ROM を使っているとき、プロンプトで、次を発する

echo -ne '\e(U'
setfont -o cp437-16.psf

ファイルcp437-16.psf ROM フォントを格納する。このフォントの高さは16ピクセル。

コンソールが今使っているフォントを見出す方法は?
フォントの名を知りたいのであれば、ブートスクリプトを見るか及び/又はシェルヒストリを見て最近ロードしたソフトフォントを見付ける(多分ないので、ROMフォントが生きている)。フォントの内部配置にしたがう文字を見たいときは、次を発し

echo -ne '\e(K'
setfont -om current_font.trans

エディタを使ってcurrent_font.trans の中を見る。これは、100% は働かない。一定の文字範囲(0-31 と128-159) は、象形文字を記憶していても、正しく表示されないからだ。フォントがunimapを有しているときは、その unimap が公式名で文字全部をリストする。これで象形文字が分かる。

私はlatin1を基に自分のフォントを作ったが、通常でない範囲128-159にボックスドロー要素を追加した。これは働くが水平線に隙間がある。対策は?
文字は幅8ピクセルだが、互いに間隔を開けて表示するためVGAハードウエアが空白の9番カラムを追加する。これは殆どの文字に適切だが、互いに近づかなければならない水平線には適しない。そのため、VGAハードウエアはボックスドロー要素に除外を作り、ピクセルの9番カラムで8番カラムを繰り返すことにした。その限りでは良いのだが、VGAアダプタはボックスドロー要素がどこに入っているか知る方法はないので、cp437であったのと同じ範囲に置かないと隙間が出来る。
512 文字フォントを使って自分の太字カラーをセーブする方法は?
framebufferにブートしなければならない。詳細は Framebuffer-HOWTO.htmlを参照のこと。framebufferに関する意見は別れている。Mandrakeは規定値でframebufferにブートするが、SuSEは逆を助言する。Red Hatの公式意見は不明だが、太字カラーを無効にする512文字コンソールフォントを使うけれども、framebufferにはブートしない。、
lati1-16.psfu は 256 文字フォントだが、それでも一つ以上のcharsetをカバーする。どうすれば出来るのか?
これは、 charsets を部分的にだけカバーするか、又は256文字より小さいcharsetをカバーするときだけ出来る。cp437 は丁度256も文字なので、lat1-16.psfu は部分的にカバーする。一方、latin1には制御範囲 0-31と128-159 を空にしているので、192文字しかない。vt100 は128文字として扱われるが、160-255範囲はlatin1で補完する。だから、lat1-16.psfu がすることは、本質的に、ボックス及びドロー要素をcp437で置かれていた場所に保って、latin1文字をどこかに移すことだ。こうして何も彼もが256文字に納まる。めでたし。
コンソール・フォントは全コンソールで同じか、それともコンソール毎に換わるのか?
コンソール・フォントは全コンソールで同じだ。変えられるのは、コンソールで使う文字セット(cmap)
 
Copyright © 2003, En D Loozzr. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 91 of Linux Gazette, June 2003
 
 
 
 
 
チューナ・カード−見て習う
By Cherry George Mathew

要約:

この記事が、チューナ・カード用ドライバを書く人と、TVチューナ・カードの働きを知りたいに役立つと良いと思う。

1 素人の曲芸

今は、働くのに忙しい。返事の要るe-メールが沢山来る。午後に提出する品質解析報告広報に渡す宣伝文書、書式エラーを直すため点検するコードの山がある。その上、絶対に見逃したくないTV番組がある。どうするか?勿論TVチューナ・カードに切り換える。コンピュータ画面の片隅でTV番組を見る。皆が働いていて、遊んでいる者はいない。上梓が肩越に覗こうとしたれ何時でも、ウインドウを最小にする。いっそ全画面にして、一緒に見ませんかと誘う。技術の夢だ!

Linux プラットホームは、ビデオカメラや、メディア装置の組合せと同時に、多数のチューナ・カードをサポートする。他のOSと同じく、アプリケーション・プログラムやkernel自体とは、一線を画して明確に切られている。技術で言う Video4Linux (又は V4L)は、草案バージョン1から、もっと頑丈なバージョン2に未だ発展中である。途中で、沢山のデバイスドライバが、主としてbrooktreeチップセットを巡って開発されたが、次第に他のモデルにも及んでいる。アプリケーション・プログラムは、ユーザのため、TV視聴、ディスクへの記録、文字多重放送の解読読取などなどに、GUIベースのインターフェイスに重点を置いている。TVを見るには、画面上に正しいサイズのウインドウを作ること、それを生きたビデオせ満たす(オーバーレイ)ための関係デバイスドライバを要求すること、画面上の目視範囲のサイズ変更とそれにしたがう調整をドライバに依頼すること、ユーザ要求を渡して特定のチャンネルに同調したりチューナからの入力をAVモードに変えたり無音にしたりすること、などの課題は、アプリケーション・プログラマの仕事である。アプリケーションはチューナドライバの最前線で、ユーザの要求を、アプリケーション・プログラマ・インターフェイス(API)と言う名の、定まった方法でドライバに渡す。

 


API   figure


この詳細は、後のデバイスドライバ・プログラマで、上述のユーザ要求を特定チューナ・カードに対するハードウエア命令に集中して、説明する。これはまた、V4L APIを使ってアプリケーションと交信することを確認する。デバイスドライバはしたがって、ハードウエアとアプリケーションとの間に介在し、これらから命令を受け取り、翻訳して、マシン特有の専門語で、ハードウエアに渡す。

次の数頁では、読者も筆者も我慢が必要だ。TVチューナ・カードの働き、作り、各種の型、Linuxで働かせる方法などなどを、互いに示す。「互いに示す」と言ったのは、この記事を一緒に書きたいからだ。私が少し研究するのは、読者のためだ。お互い様なので、紙とペンを用意して読み進められたい。

警告:居眠りしてはいけない。後でテストがある。
重要な言葉: PCI バス、I2C バス、IF (インターフェイス頻度)、ビデオ・プロセッサ、フレーム・バッファ、DMA、IRQ。

   脚注1:"Linux kernel" に対する引用はすべて kernel version 2.4 以降 

2 裸のチューナ・カード


API   figure

TV チューナ・カードを見てみよう。ボード上には最低三つのチップがある。

2.1 チューナ・モジュール

実際のチューナ「チップ」は、高周波成分を取り付け、保護シールドの銀箔で綺麗に包んだボード全体体だ。図を見ると、チューナ・モジュールは、目立ったパケージになっていて、殆ど同じ外観だ。アンテナ・ケーブルはカード右端のソケットに入る。チューナ・モジュールの仕事は、特定TV番組に同調する高周波混合の魔術をすることだ。TV番組がどんな周波数であろうと、所定の中間周波数(IF)に変換される。この「所定の」周波数が、歴史的な(政治的な?)理由で、全くの曲者だ。各TVシステム(PAL、SECAM、NTSC、など)に独特のIFがある。IFがどうであろうと、チューナは、一つだけの仕事、宇宙の無数の高周波の中から、命令にしたがって、正しいTV番組を篩い分ける。5.I2Cバスの章で、好きなスポーツ・チャンネルに同調させるためチューナ・モジュール命令する方法が分かる。

2.2 ビデオプロセッサ a.k.a TV デコーダ

チューナ・モジュールからのIF は、デコードして、目視可能のフォーマットに変形する必要がある。これがビデオ・プロセッサの仕事だ。目視可能のフォーマットもまた、歴史的理由で、色々な形と大きさになる。既に、平易な古いビットマップ・フォーマット、パレット化し平坦化したVGAフォーマット、RGB(赤、緑、青)フォーマット、YUVフォーマット(及びその難解な変形))その他数々の特許フォーマットがある。行間を敏感に読めば、上述の「変形」には復調とAD変換が含まれると推測するだろう。それがTVチューナ・カードのすべてなのだ。コンピュータ画面でTVを見るとき、実際に見ているのは、ビデオ・プロセッサからのデジタル化ビデオデータをVGAアダプタが表示したものなのだ。これを、二つのステップに分けよう:

1.ビデオ・プロセッサがビデオデータをデジタル化して「フレームバッファ」にダンプする。
2.VGAアダプタがフレームバッファからビデオデータを取り出して、画面に表示する。

どうしてそうなるかを見る前に、フレームバッファを理解する必要がある。フレームバッファは、ビデオバッファとかフレームRAMとも呼ばれ、通常VGAカード(熟練者は我慢して、暫くAGPを無視されたい)

API figure  (フレームバッファの働きの図)

フレームバッファ内のデータはすべて、直ちに画面に反映される。これはVGAコントローラの仕事だ。画面に何かを表示したいときは、データをフレームバッファにダンプしさえすれば、直ちに画面で見ることが出来る。ほとんどのプラットホームでは、フレームバッファが物理メモリアドレス空間に配置されているので、他と同じ只のメモリ対メモリのコピイだ。しかし、何かのメモリ保護をおこなっているシステムでは、アプリケーションはシステムRAMへの直接アクセスを許されていない。Linuxでは、これを /dev/ram デバイスノード又はフレームバッファ・デバイスドライバとの関連で、nmap()システム呼出を用いて制御される。詳細は mmap() のマニュアルを参照。勿論、これを敏感に働かせるためには、表示したいもの、フレームバッファバッファに書き込むもの及び場所についてVGAコントローラが同意しなければならない。これは、「VGAモード設定」によりおこなう。VGA「モード」の設定により、フレームram内のあらゆるビットの意味を、VGAコントローラが知ることになる。例えば、VGAモードを8 bppで"640x480" に設定すると、VGAコントローラは表示について、二つのことを知る:

1.画面は480列で表示され、各列は水平に640ドット(又はピクセル)で作られる。
2.に表示される各ドットは、フレームバッファ内の対応するバイト(8ビット)で示される。8bppは、8 Bits Per Pixelの略だからだ。

ここに別の可能性がある。ピクセルフォーマットだ。各ピクセルには、輝度と色と言う二つの特性がある。色々なピクセル表示法が何年もの間に発達した。最も有名なのはRGBとYUVフォーマットだ。両者の説明は論議の範囲を超えるが、詳細は取るに足らぬので前に進む。したがって、我々のビデオモードの完全な設定は、RGBフォーマットで、解像度8bppにおける "640x480" となる。だからこの画面を表示するフレームバッファの大きさは640 x 480バイトとなる。

API figure  (ピクセルフォーマットの図)

ここで、典型的なチューナ・カードを想像する。特定のチャンネルに同調し、ビデオデータをピクセル毎にデジタルフォーマット(8 bpp 又はYUVなど)で取り込んで、RAMにダンプする。この過程を「ビデオ・キャプチャ」と言う。ビデオ・キャプチャには二,三の可能性がある:

・問題のRAM がビデオバッファであるときは、TV放送を直ちに画面で見ることが出来る。この過程を「ビデオオーバーレイ」と言う。
・ここで言うRAMが別のRAMであるか、又はシステムRAMであると、DMAによりデータ全部をフレームバッファの中に呼び出す必要がある。DMAとは、後でPCIバスの章に詳細を述べるが、直接メモリアクセス(Direct Memory Access,)の略である。DMAが始まると、TVが見られるようになり、これを「ビデオオーバーレイ」が働いていると言う。
・システムRAMであろうとフレームRAMであろうと、捕らえたビデオデータはディスクにダンプすることが出来る。ここでも物事のスピードアップにDMAを使うことが出来る。そこで、実際には、VCDをチューナ・カード経由で捕らえたビデオから切り取ることも出来る。ついでだが、データをディスクに移動するか否かの決定はディスク装置ドライバの担当なので、完全にこの議論の範囲外にある。

チューナ・モジュールはRFをIFに復調するのに忙しい。ビデオ・プロセッサにはADコンバータがある。これが各ピクセルからサンプルを取り、このサンプルがビデオプロセッサからの制御信号の助けを借りて、RAM内のフレームに組み立てられる。この記事では、例として、極めて簡単なビデオプロセッサ−ITT VPX3224D−を考察する。

2.3 オーディオ・プロセッサ

チューナ・カードは、一般に音響を二つの異なる方法で扱う。第一の方法は、IFから音響を復調するのにオーディオ・プロセッサを使う(IFには音響と映像両方の情報が含まれる)。こうして得られた音響信号が、外部音響ジャックに送られ、そこからは適切なケーブルを使って別のサウンドカードのライン入力に送り直さなければならない。サウンドカードを持つほど金持ちでなければ、ハイファイセットのライン入力でも良い。

第二の方法は、オーディオ・プロセッサにIFからの音を復調させ、これをデジタル・サンプルに転換して、DMA(PCIバスの章で説明)などの技術を用いて、これらのサンプルを内部システムバス(PCIバスなど)経由でサウンドカードに送る。そこからは、サウンドカードを使ってデジタル・サンプルを音響信号に再変換する。この方法は、複雑だがTV音響レベルをチューナカード自体で調節出来るので、融通性がある。第一の方法は、別のサウンドカードのサウンドドライバに命令することによってのみ贅沢な品を利用することが出来る。いずれにせよ、要求される事項と、チューナ・カードの有能なデバイスドライバ作者として何が必要かを纏めてみよう:

2.3.1 要求されている事項:

・作る必要のあるアプリケーションは、API(Applications Programmers' Interface )と言う、ファンクションのインターフェイスが付いたアプリケーション。
・API は、チューナ・カード・ハードウエアのプログラム作成詳細をLinuxアプリケーション用ビデオから隠すインターフェイスを作らなければならない。
・API経由のアプリケーション要求を、チューナ・ハードウエアに対するハードウエア要求に適切に翻訳しなければならない。
・ハードウエア要求は、大まかに次のように分類することが出来る:
・チューナ・モジュールに対する要求:
示された周波数に対する同調、IF変更、など
・ビデオプロセッサに対する要求:
ビデオ捕捉の開始/停止、文字放送とTVの間のモード変更、捕捉バッファ位置の設定、PAL, SECAM, NTSCなどTV規格間の変更、など
・オーディオ・プロセッサに対する要求:
ミュート、ステレオのオン/オフ、ボリューム設定など
・ビデオ・ウィンドウ制御:
ビデオ・ウィンドウのスイッチ・オン/オフ、ウィンドウの位置/大きさ、他の重畳ウィンドウの上/下に置く、彩度決定(次章で詳説)など
次章「ドライバの要求」で、APIに無関係な標準ハードウエアが、Linux kernl で既に定義されていることが分かる。加えて、kernelはAPIの一部を制御し、/procツリー登録も管理する。/procツリー登録は、実質的に登録デバイスドライバに関する稼働中情報を興味あるアプリケーションに対して与える。これは、デバイスドライバ作者としては少し楽になり、単調な帳簿付けに時間を潰す必要がないことを意味する(sprintf()の説明をせよ)

2.3.2 我々の要求:

・kernel 機能にPCIインターフェイス経由でカードを調査させたい。
・kernel 機能に、チューナ・カード上のチップと交信するI2Cプロトコル細部の仕事をさせたい。
・沢山の労力を必要とすることなく(つまり、ビデオのフレームを呼び出している間マウスは使わない)ビデオ・データを動かすようkernelに命令するため、DMA 機能を必要とする。
うむ・・・これは、Linux kernel内のツールを嗅ぎ回って、ドライバ設計を面白いものにしそうだ。

3 ドライバの要求

Alan Cox が、Linux API 用ビデオに関しキャプチャカードのため優れた記事をLinuxに(Documentation/DocBook/videobook.tmpl)脚注2)書いており、Video4Linux APIに関連する問題も扱っている。扱っていないのは、チューナ・カード処理の詳細である。一つの記事で各種TVキャプチャカード全部の詳細を扱うのは不可能だが、入手可能なチューナ・カードは、ここで示すことに合致すると思う(USBポートに入るWebカメラなどは断言出来ない)。

linux/videodev.h脚注3)は、V4L APIに関する権威ある参考資料なので、ここではV4L APIに関する詳細説明は省く。これに関する概念的詳細は、上述のAlan Cox の文書にある。その上V4L API は、発展中の規格である。今日は良くても明日適当であるがは分からない。

3.1 ドライバに対する命令

先ず、アプリケーションとデバイスドライバとの間の連絡に従事する機構を見る。キャラクタデバイスについてご存知なら、これは繰り返しなので、ここは飛ばして構わない。

あらゆるUnixシステムでは、/devサブディレクトリにdevice nodeと言う特殊ファイルがある。各device nodeは、kernelに登録された固有デバイス番号に結び付いている。Linuxでは、video4linuxドライバがデバイス番号81で登録されている。慣例で、このデバイス番号に結び付くnodeの名は /dev/video0である。番号付けの詳細は、 (Documentation/devices.txt)を参照。/dev/video0は、ないときは、下に示すようにルートシェルからmknodコマンドを用いて作る:
root@maverick# mknod /dev/video0 c 81 0
上の議論により、ユーザ空間脚注4)からドライバにアクセスする三つの簡単な方法が直ちに明らかになる。オープン、クローズ及び読取システム呼出だ。ビデオ捕捉をドライバがサポートしているときは、次のコード・スクリプトにより、捕捉したデータを読み取り、STDOUTにダンプすることが出来る。C言語のプログラムが理解出来なければ、先に進む前にKerninganとRichieの「Cプログラム作成言語」を読まれたい。

------------- コード・スクリプト ------------

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main(){

int fd;

char *buffer;

/* 出来るだけ大きいバッファを割り当てる */

buffer = malloc(65535);

/* デバイスノードを読取で開く*/

if((fd = open("/dev/video0", O_RDONLY))<0)

{

fprintf(stderr, "Sorry, error opening device /dev/video0\n");

exit(-1);

}

/* プログラムの中断又はデバイスがデータを使い尽くす(あり得ぬ)まで読み取る*/

while( read(fd, buffer, 65535)) write(0, buffer, 65535);

free(buffer);

}

---------- コード・スクリプト終わり----------

上のコードで目立つのは、device nodeに他のファイルと同じくアクセスすることが出来ると言うことだ。類似性はこれで終わる。open(), read(), write(), seek()の他、device nodeは、ioctl()と言う特殊システム呼出を有する。V4L API経由で「ドライバに命令」する魔術が働くのはioctl呼出である。

ビデオ表示に切り換えたいときは、

ioctl(fd, VIDIOCCAPTURE, 1);
をおこなう。オーディオをミュートにしたいときは、
{
v.flags |= VIDEO_AUDIO_MUTE;

ioctl(fd, VIDIOCSAUDIO, &v);

   }
が魔術をおこなう、ここで、v は
struct video_audio v;
で宣言する。VIDIOCXXXXX 内容の全部、上述のビデオ−オーディオ構造体などは、linux/videodev.hで定義され、これはV4L1 API 特有であることに注意。linux/videodev.hは、したがって、上のコードスクリプトを意味あるものとするためインクルードする必要がある。次にしなければならないことは、linux/videodev.hをよく見ることだ。

デバイスドライバに利用出来るファンクションがある:
int video_register_device(struct video_device *vfd, int type, int nr);
説明:
新ドライバにマイナー番号 'nr' と、VFL_TYPE_GRABBER, VFL_TYPE_VTX、VFL_TYPE_VBI 又は VFL_TYPE_RADIOいずれかのタイプを登録する。'video_device' 構造体はそのドライバの名称などの詳細を与える。マイナー番号が登録されると、ロックされて別のチューナドライバが登録し直すことは出来ない。

このファンクションはまた、 /proc/video/dev/ に新しい登録を作る。

これの登録はビデオ・ハードウエアについての詳細を有する:
登録のリストをえるには
cat /proc/video/dev/*
を試してみよ。
void video_unregister_device(struct video_device *vfd);
説明:
マイナー番号が解放され、デバイスの登録がなくなり、 /proc 登録が再呼出される。
int video_exclusive_open(struct inode *inode, struct file *file);

int video_exclusive_release(struct inode *inode, struct file *file);

int video_usercopy(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg, int (*func)(struct inode *inode, struct file *file, unsigned int cmd, void *arg));

説明:
video_exclusive_open() は、kernelが与えるロックで、一時に一つのopenしか出来ないのを保証する。これは、ドライバが再登録問題などを扱うことから解放する。ビデオ・オーバーレイが進んでいる間に、別のアプリケーションが同じデバイスノードをビデオ捕捉用に開いたらどうなるか?video_exclusive_release()は、video_exclusive_open()に対する補完ファンクションである。video_user_copy()は、データをユーザ空間から、kernel空間へ又は逆にコピイする。適切なkernelメモリを、スタックから又はkmalloc()−kernelメモリ・マネージャ経由で、利用出来ることを保証する。

4 ハードウエアに対する命令

このとき出来ることは、我々の技術者が、プログラムに、捕捉を開始し、音響スイッチをオンにし、ビデオデータを前後に動かすなど、色々なことをチューナ・ハードウエアがするコードを書くのに重点を置くことだ。ほとんどのV4L ioctlは、これらの問題から逃げている。最後に、全てが整ったら、最新最大のV4L API を、基礎になる我々のコードに橋渡しすることが出来る。これが標準の技術手順だ。

--------------- 断章-------------------
工兵旅団長「中尉、日没までに橋を架けたいのだ」
工兵「不可能です。構築前に、土地測量をして、補給所に必要部品を発注する必要があります。それだけで最低2,3週掛かります」
旅団長「杭もネジも、アングルもIジョイントも、仕事の始められる何もないのか???」
工兵「ありません。こんな短期間で補修部品が要るとは考えませんでした」
砲声.
第1場、終わり
--------------- 断章の終わり----------------
部品の構築から始めようではないか。
我々の作ったデバイスドライバ機能は、大まかに二つに分けることが出来る。ビデオ取得とビデオ表示だ。

4.0.1 ビデオ取得

ドライバの一部は、チューナ・モジュールが正しく同調していること、ビデオ・プロセッサが正しい規格(PAL, NTSCなど)でデコードしたこと、ビデオ・プロセッサ・ハードウエアがサポートする輝度、色相、彩度などの特性が正しく調整済みか又は規定値になっていること、を確認した上で、ビデオデータ取得に関係する。音響取得もまた、ドライバのこの部分の仕事だ。これらはI2Cの章で詳しく述べる。

4.0.2 ビデオ表示

ドライバの別の部分は、取得したデータが正しく画面に表示されていることの確認に関係する。ドライバのこの部分は、ウインドウでビデオが見られていいるか、他のアプリケーションのウインドウとの重畳問題が正しく扱われているか、を確認しなければならない。ビデオウインドウのピッチ、取得したライン数、取得したピクセル数など、ビデオウインドウのサイズ変更や別の位置にドラッグしたとき影響を受けるパラメータの詳細は、ドライバのこの部分の仕事だ。Xwindowsなどのウィンドウ作成環境では、ビデオ重畳はウインドウ内でおこなう必要がある。重畳問題は、別のアプリケーション・ウインドウの隅がビデオウインドウの一部に重なったとき始まる。


API   figure

ここで二つのオプションがある:

・ウインドウ環境にビデオ・ウインドウ優先と告げる。それに重なる別のウインドウはない。重なるウインドウは要注意!これは下手なオプションで、別の方法がないときの最後の手段だ。
・生きたビデオと重なり合った隅に上書きするのを明確に避ける。重なり合った隅をVideo4linuxの専門語でクリップ(clips)と言う。

ウインドウの重なり合った隅に上書きしない方法が二つある:
1.重なった領域にビデオデータを上書きするのを避ける。これは二つの方法のいずれかで果たされる:
1.クリップ・リスト:ビデオプロセッサの中には、クリップ・リストと言う座標のリストを登録するものがある。これが基本的に、これら座標が規定するフレームバッファ領域への上書きを阻止する。
2.彩度キイ:上書きされそうな画面上の領域に相当するフレームバッファ内の領域すべてに、彩度キイ(chroma key)と言う特殊色相値で満たす。取得したビデオデータをこのバッファに書き込むとき、ビデオ・プロセッサが彩度キイを探して比較し、一致したときだけバッファに上書きする。重なり合う領域には彩度キイが書かれないので、ビデオデータで上書きされるのを勘弁して貰える。
これら両方法は、カードがビデオをフレームバッファに直接捕捉するとき働く。
読者への問題がある。彩度キイでバッファを埋めるのは誰か?

答えは、この章の最後にある。
2.表示するビデオデータを、ブレームバッファでなくXサーバに書き込むことにより、Xサーバを用いて表示する:
これにより、Xサーバが重畳問題を扱うこととなる。これは手の込んだ遅い方法であるのを知ること。Xサーバはリアルタイムビデオを表示するが極めて遅いので、チューナ・カードとXサーバとの間のバッファアクセスとXサーバプログラムの同期が不可能だからだ。重なったフレームと馬鹿な絵は除く。

Pixelview Combo TV plus の紹介

ここで出来ることは、彩度キイの設定、ビデオウインドウのサイズ設定、ウインドウの位置決めなど、細かいことをするルーチンを書くことだ。これらを習う最良の方法は実例だ。学習の基礎を、私が非公式に作業中のPixelview Combo TV plus用ドライバからのコード断片に置く。これは、チューナ・カードと同じ位、簡単なカードである。チューナ・モジュール、ビデオ・プロセッサ及びVGAコントローラ全てが同じカードに乗っている。カードはPCIスロットに差し込んで、チューナ・カードとVGAカードを兼ねる。

カードの概要:

・チューナ・モジュール- Phillips FM1216ME MK3
・Video Processor - VPX 3225D
・VGA コントローラ - Cirrus Logic GD-5446 オンボード2MB RAM 付き
・音声復調 - Phillips TEA5582
・音声スイッチはVPX 3225Dからの1ピンで制御
今はビデオ表示に関心があるので、Cirrus Logic GD-5446 VGA コントローラに焦点を当てる。GD-5446には、固有の特徴がある。フレームバッファ自体の中に一定の領域を規定っして、実行されるビデオウインドウには無関係にハードウエア内に表示させるビデオデータをこの中に収容することが出来る。これをビデオバッファと呼ぼう。

API figure   (ビデオバッファの図)

ビデオバッファはフレームバッファ内の任意の場所に置くことが出来るが、普通は、フレームバッファの最後に置く。これは、捕捉ビデオデータを既にフレームバッファに存在するグラフィックサンプルから保存し逆もおこなう。

例を用いて説明しよう:

・[
 
フレームバッファ・サイズ = 2MB
]
・[
 
ディスプレー・モード = 640x480 @ 16bpp.
]
・[


 
VGA ディスプレーに必要な全メモリ = 640 x 480 x 2 バイト
= 614400 バイト
= 0.59 MB
]
・[

 
フレームバッファ端の未使用メモリ = 2MB - 0.59MB
= 1.41 MB
]
したがって、フレームバッファの中に約0.6MBのオフセットで始まり、サイズが1.4MBを超えないビデオバッファを安全に定義することが出来る。ハードウエア・ビデオ・ウインドウのスイッチが入るまで、ビデオバッファの内容は画面で見えない。この規則を破る唯一の方法は、ビデオバッファが、グラフィックとして表示されるフレームバッファの一部と重なってる設定されたときである。例えば、上の図でビデオバッファ・オフセットを0.5MBに設定すると、捕捉ビデオデータは、ハードウエア・ウインドウがオフのときでも、画面の下部に干渉する。

ハードウエア・ウインドウは、VGAモードが管理するのと全く異なって、その管轄下のデータを翻訳して表示する。このビデオ・ウインドウの位置を大きさは、VGAレジスタ関連のプログラム作成で変更することが出来る。GD-5446 には、三つのレジスタ、つまりコントロール・レジスタ、グラフィック・レジスタ、シーケンス・レジスタ、がある。これらVGAレジスタの各々は、ハードウエア・ポートに対する複数の読取と書込によりアクセスされるので、専門ファンクションの中に包まれる。私はこれらを gd_read_cr(), gd_write_cr() などと名付ける。これにより、コードの信頼性が改善され、エラーのチャンスが減る。私のドライバから2,3のルーチンを示す。短くするため裸にした:

#define GD_SR_OFFSET 0x3c4

#define GD_GR_OFFSET 0x3ce

#define GD_CR_OFFSET 0x3d4

/* アダプタ - 低レベル・ファンクション */

unsigned gd_read_cr(, unsigned reg){

unsigned value;

io_writeb(reg, gd_io_base + GD_CR_OFFSET);

value = io_readb(gd_io_base + GD_CR_OFFSET + 1);

return value;

}

VGAレジスタに対する単一アクセスは、ハードウエアioポートへの書込に続いて
io_writeb(reg, gd_io_base + GD_CR_OFFSET);
隣接ポートからの読取を含むことに注意。
value = io_readb(gd_io_base + GD_CR_OFFSET + 1);
引き続くファンクションは、gd_read_cr()のバリアントを用いて構築する;

高レベルのファンクション二、三を示す

/* VGA ハードウエア・ビデオプログラム作成ファンクション*/

void gd_enable_window();

ハードウエア・ビデオ・ウインドウを有効にする。
void gd_disable_window();
ハードウエア・ビデオ・ウインドウを無効にする。
void gd_set_vbuf1(,);
フレームバッファ内に、捕捉ビデを書き込む位置を設定する。
void gd_set_vbuf2(,);
このようなバッファが二つある。
unsigned long gd_get_vbuf1();
フレームバッファ内で、現在の捕捉バッファの位置を入手する。このファンクションはgd_set_vbuf1()を補完する;
unsigned long gd_get_vbuf2();
上を見よ。
void gd_set_pitch(,);
captured _video_ data のラインが作られているピクセル数を設定する。ビデオウインドウのサイズは変えられるので、ウインドウ幅を変更したときは何時でも、ピッチリセットしなければならない。
unsigned long gd_get_pitch();
現在のピッチ値を入手する。
/* VGA video window functions */

static void gd_set_window(,,,);

メイン画面に対するハードウエア・ウインドウの座標を設定する。座標は、構造体に対するポインタに渡される。詳細はファイル (pvcl.h) を参照。
static void gd_get_window(,,);
ハードウエア・ビデオ・ウインドウの現在寸法を入手する。ハードウエア・レジスタからの読取がある。ルーチン一つだけの内容を見て、詳細に一歩踏み込もう:

void gd_set_pitch(

struct clgd54xx_card * card_p, unsigned long offset)

{

unsigned long CR3C, CR3D;

CR3C = gd_read_cr(card_p, 0x3c);

CR3D = gd_read_cr(card_p, 0x3d);

/* CR3C[5] = offset[11], CR3D = offset[10:3]*/

gd_bit_copy(&CR3C, 5, &offset, 11, 11);

gd_bit_copy(&CR3D, 0, &offset, 3, 10);

gd_write_cr(card_p, CR3C, 0x3c);

gd_write_cr(card_p, CR3D, 0x3d);

}
ファンクション gd_bit_copy() とgd_write_cr() を見ただろうか?これらは、VGAレジスタを揺するファンクションだ。gd_bit_copy() は特定変数内の特定ビットを変更する。その変数は、後で、gd_write_cr()などを使って、VGAレジスタに書き込まれる。VGAレジスタ内の各ビットは、極めて重要で注意深く扱う必要があるので、ファンクションが、VGAレジスタにビット毎で対抗するのが適切だと考えた。

gd_write_cr() は、値を特定のVGAレジスタに書き込むのに使われる。変数 card_p は、今の所無視されたい。これは、ドライバに付いての全体状態情報を記憶する構造体だ。card_p は、帳簿付け目的のみのためgd_write_cr に使われる。gd_write_cr (card_p, CR3C, 0x3c)は、変数CR3Cの内容をコンソール・レジスタ0x3cに書き込む(CR3Cの名前に騙されてはいけない 、これは 'unsigned long foo' 程度の変数だ)。

チューナ・カードの一般の場合は、VGAコントローラが別のハードウエア・ビデオ・ウインドウを作らないので、ビデオ・プロセッサがフレームをグラフィックデータの中間にダンプしなければならない。これは、VGAコントローラがフレームバッファの新しい内容を表示するとき、ビデオフレームが正しく現れて歪まない、ようにおこなわなければならない。これは、ビデオデータをピクセル境界上に合わせること必要とする(8bppの各バイト、16bppの一つおきのバイト、32bppの4バイト毎)。その他に、ビデオプロセッサ内のピクセル表示は、VGAコントローラの現在モードに合致しなければならない。ビデオプロセッサはビデオを32bppで取得して16bppフレームバッファにダンプすることは出来ない。また、ビデオデータは、線型で連続な方法ではかぶせることが出来ない。各ラインのバッファ・オフセットは下図のように計算しなければならない。

API figure   (オフセット計算図)

  ビデオバッファ・オフセット

    = ビデオバッファ・オフセット+ ビデオウインドウ・ピッチ×ライン番号

言い換えると、Xサーバがアプリケーション・ウインドウを描く間にXサーバがおこなう予防措置と計算を、ビデオプロセッサも考慮する必要がある。ここでは、ビデオプロセッサは、グラフィックバッファに直接書き込むので、ビデオデータとグラフィックデータとの間に区別はない。

しかし、GD-5446の場合は、ビデオプロセッサはグラフィック領域に書き込まないので、整列問題を気にする必要はない。ビデオプロセッサが保証しなければならない全ては、ビデオがフレームバッファ内に、ビデオバッファがスタートする場所に、正しいオフセットで捕捉されることだけだ。gd_set_vbuf1() ルーチンがこの面倒を見る。ウインドウする細目は、このときGD-5446ハードウエアが面倒を見る。.

For detailed descriptions of GD5446 ハードウエア・レジスタの詳細説明は、GD-5446 技術参照マニュアルを見られたい。

IOCTL 通覧

IOCTL 呼出を案内する時期が来た。 xawtv (http://bytesex.org/参照)などのvideo4linuxアプリケーションが、TVウインドウに切り換えるため、 ioctl() を呼び出した瞬間を考えてみよう。


API   figure

・アプリケーションはioctl() システム呼出を呼び出す。ioctl() システム呼出は、cライブラリによって(GNU/Linuxの場合はglibc), kernelルーチンにジャンプするアセンブリ言語命令に翻訳される。
・背景: kernel ルーチンに入ることは、暗黙でユーザ・モードからkernelモードに切り換えることを意味する。Linuxは非プリエンプチブルkernelなので、デバイスドライバがschedule()に対する呼出により制御を放棄するまで、それを呼び出したプロセスの前後関係で走っている。(LinuxはマルチタスクOSで、一つ以上のプロセス(又はアプリケーション)が同時に走っていることを想起さ