diff --git a/ja_JP.eucJP/books/handbook/Makefile b/ja_JP.eucJP/books/handbook/Makefile index 7a17e0ae09..4fefd930e3 100644 --- a/ja_JP.eucJP/books/handbook/Makefile +++ b/ja_JP.eucJP/books/handbook/Makefile @@ -1,106 +1,104 @@ # -# $FreeBSD: doc/ja_JP.eucJP/books/handbook/Makefile,v 1.48 2001/06/21 03:38:31 chris Exp $ +# $FreeBSD: doc/ja_JP.eucJP/books/handbook/Makefile,v 1.49 2001/07/18 19:29:08 hrs Exp $ # # Build the FreeBSD Handbook (Japanese). # # Original revision: 1.40 # # ------------------------------------------------------------------------ # # Handbook-specific variables # # WITH_PGPKEYS The print version of the handbook only prints PGP # fingerprints by default. If you would like for the # entire key to be displayed, then set this variable. # This option has no affect on the HTML formats. # # ------------------------------------------------------------------------ MAINTAINER=kuriyama@FreeBSD.ORG DOC?= book FORMATS?= html-split INSTALL_COMPRESSED?= gz INSTALL_ONLY_COMPRESSED?= NO_TIDY= YES #IMAGES = advanced-networking/isdn-bus.eps #IMAGES+= advanced-networking/isdn-twisted-pair.eps #IMAGES+= advanced-networking/natd.eps # # SRCS lists the individual SGML files that make up the document. Changes # to any of these files will force a rebuild # # SGML content SRCS= book.sgml SRCS+= advanced-networking/chapter.sgml SRCS+= backups/chapter.sgml SRCS+= basics/chapter.sgml SRCS+= bibliography/chapter.sgml #SRCS+= config/chapter.sgml SRCS+= boot/chapter.sgml SRCS+= contrib/chapter.sgml SRCS+= cutting-edge/chapter.sgml SRCS+= disks/chapter.sgml SRCS+= eresources/chapter.sgml SRCS+= install/chapter.sgml SRCS+= introduction/chapter.sgml SRCS+= kernelconfig/chapter.sgml SRCS+= kernelopts/chapter.sgml SRCS+= l10n/chapter.sgml SRCS+= linuxemu/chapter.sgml SRCS+= mail/chapter.sgml SRCS+= mirrors/chapter.sgml SRCS+= pgpkeys/chapter.sgml SRCS+= ppp-and-slip/chapter.sgml SRCS+= printing/chapter.sgml SRCS+= security/chapter.sgml SRCS+= serialcomms/chapter.sgml SRCS+= sound/chapter.sgml SRCS+= staff/chapter.sgml SRCS+= users/chapter.sgml SRCS+= x11/chapter.sgml SRCS+= ports/chapter.sgml # Entities -SRCS+= authors.ent SRCS+= chapters.ent # Japanese only SRCS+= jcontrib/chapter.sgml -SRCS+= jauthors.ent SYMLINKS= ${DESTDIR} index.html handbook.html # Turn on all the chapters. CHAPTERS?= ${SRCS:M*chapter.sgml} JADEFLAGS+= ${CHAPTERS:S/\/chapter.sgml//:S/^/-i chap./} # XXX The Handbook build currently overflows some internal, hardcoded # limits in pdftex. Until we split the Handbook up, build the PDF # version using ps2pdf instead of pdftex. book.tex-pdf: touch book.tex-pdf book.pdf: book.ps ps2pdf book.ps book.pdf DOC_PREFIX?= ${.CURDIR}/../../.. # # Handbook-specific variables # .if defined(WITH_PGPKEYS) JADEFLAGS+= -V withpgpkeys .endif DOC_PREFIX?= ${.CURDIR}/../../.. .include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/ja_JP.eucJP/books/handbook/book.sgml b/ja_JP.eucJP/books/handbook/book.sgml index a856a9a468..764082e98a 100644 --- a/ja_JP.eucJP/books/handbook/book.sgml +++ b/ja_JP.eucJP/books/handbook/book.sgml @@ -1,183 +1,185 @@ %man; %bookinfo; %freebsd; %chapters; - - + +%ja-authors; + %authors; - %jauthors; - %mailing-lists; + +%ja-mailing-lists; %newsgroups; ]> FreeBSD ハンドブック FreeBSD ドキュメンテーションプロジェクト 1999 年 2 月 1995 1996 1997 1998 1999 2000 2001 The FreeBSD Documentation Project &bookinfo.legalnotice; FreeBSD へようこそ! このハンドブックは FreeBSD Release &rel.current; のインストールおよび, 日常での使い方について記述したものです. 本ハンドブックは改編作業中であり, さまざまな人々が編集に携わっています. 多くのセクションはまだ存在しませんし, いま存在するセクションにも更新作業の必要があるものも含まれています. もし, このハンドブックを編集するプロジェクトに協力したいとお考えなら, &a.doc; まで電子メールを(英語で)送ってください. この文書の最新バージョンは, いつでも 日本国内版 FreeBSD World Wide Web サーバ および FreeBSD World Wide Web サーバ で入手することができます. また, 他のさまざまな文書形式, 圧縮形式のものが FreeBSD FTP サーバや数多くのミラーサイトからダウンロードすること ができます. このハンドブックの書籍版 (英語版) は, FreeBSD Mall から購入することができ, ハンドブックの検索を行なうことも可能です. 日本語版の作成は FreeBSD 日本語ドキュメンテーションプロジェクト(FreeBSD doc-jp)がおこなっています. 日本語訳および, 日本語版のみに関することは FreeBSD &a.jp.doc-jp; において日本語で議論されています. 文書の日本語訳に関するお問い合わせや, 文書の原文に関する問い合わせをしたいが英語が得意でないという方は FreeBSD &a.jp.doc-jp; まで, 日本語でコメントをお寄せください. 導入 システム管理 ネットワーク通信 さらに進んだ話題 付録 &chap.index; diff --git a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml index 701895051c..f93aee3788 100644 --- a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml @@ -1,793 +1,793 @@ Linux バイナリ互換機能 オリジナルは &a.handy; と &a.rich; によるものですが, &a.jim; が 2000 年 3 月 22 日に再構成と一部の更新を行ないました. 訳: &a.jp.kiroh;, 1996 年 9 月 24 日. この章では この章では FreeBSD における Linux バイナリとの互換機能について, インストール方法やその仕組みを解説します. 現時点では, 一体なぜ FreeBSD が Linux バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか? 答えはきわめて簡単です. Linux は現在コンピュータの世界では最もホットなモノなのでたくさんの会社や開発者たちが Linux のためだけに開発を行なっています. そのため, 残された私たち FreeBSD ユーザは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです. 問題は, FreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない, ということであり, そのため Linux 版のみを開発しているということなのです. そこで FreeBSD では Linux バイナリ互換機能が役に立つのです. 簡単に言ってしまえば, この機能により全ての Linux アプリケーションの 90 % が修正なしに FreeBSD 上で起動できます. この中には Star Office や Linux 版の Netscape, Adobe Acrobat, RealPlayer 5 と 7, VMWare, Oracle, WordPerfect, Doom, Quake などがあります. また, ある状況においては Linux バイナリを Linux で動かすよりも FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります. しかしながら, いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません. 例えば, Linux の /proc ファイルシステムを過度に使うような Linux バイナリは FreeBSD では動きません (FreeBSD の /proc ファイルシステムとは異なるのです) し, 仮想 8086 モードを有効にするような i386 特有の呼び出しも動きません. Linux バイナリ互換モードのインストールに関しては次のセクションをご覧ください. インストール 3.0-RELEASE以降であればカーネルのコンフィギュレーションファイルに options LINUXoptions COMPAT_LINUX といった行を加える必要はありません. Linux バイナリ互換機能は今は KLD オブジェクト (Kernel LoaDable object) として実現されており, リブートしなくても on-the-fly で組み込むことができるのですが, /etc/rc.confに次の行を加える必要があります. linux_enable=YES この設定により, /etc/rc.i386 では次のような操作が行なわれます. # Start the Linux binary compatibility if requested. # case ${linux_enable} in [Yy][Ee][Ss]) echo -n ' linux'; linux > /dev/null 2>&1 ;; esac 望みの KLD モジュールがロードされているか確認したい時には kldstat を利用します. &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko 何らかの理由で Linux KLD をロードしたくない, あるいはロードできないような場合には, options LINUX をカーネルの設定ファイルに指定して, Linux バイナリ互換機能をカーネルにスタティックリンクしてください. そして, FreeBSD カーネルのコンフィギュレーション の記述にしたがって新しいカーネルをインストールしてください. Linux ランタイムライブラリのインストール これは, linux_base の port を用いるか, もしくは 手動でインストールします. linux_base の port を用いたインストール ランタイムライブラリをインストールするには最も簡単な方法です. ports コレクションから他の port をインストールするのと全く同じようにできます. &prompt.root; cd /usr/ports/emulators/linux_base &prompt.root; make install distclean これで Linux バイナリ互換機能が使えるはずです. いつかのプログラムはシステムライブラリのマイナーバージョンが違うと文句を言うかもしれませんが一般的には大した問題ではありません. 手動でのライブラリのインストール portsコレクションをインストールしていない場合, 代わりに手動でライブラリをインストールすることができます. プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です. また Linux ライブラリ用の shadow root ディレクトリ, /compat/linux, を作成する必要があります. FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは, まずこのファイルツリーから検索されます. 例えば, Linux のプログラムが /lib/libc.so をロードしようとした場合には, FreeBSD はまず /compat/linux/lib/libc.so を開こうとします. これが存在しなかった場合には, 次に /lib/libc.so を試します. シェアードライブラリは, Linux の ld.so が報告するパスではなく, /compat/linux/lib 以下にインストールする 必要があります. Linux のプログラムが必要とする シェアードライブラリを探す必要があるのは, FreeBSD のシステムに Linux のプログラムをインストールする最初の数回だけでしょう. それが過ぎれば, 十分な Linux のシェアードライブラリがシステムにインストールされ, 新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります. シェアードライブラリの追加 linux_base port をインストールした後に, アプリケーションが必要なライブラリが存在しないというエラーを出したらどうしたらよいでしょうか? Linux のバイナリがどのシェアードライブラリを必要とし, そしてどこで入手できるか, どのように探したらよいでしょうか? 基本的には, 以下の 2 種類の方法があります (以下の手順に従う場合には, 必要なインストール作業をおこなう FreeBSD システム上で root として作業をおこなう必要があります). Linux システムにアクセス可能ならば, そのアプリケーションがどういうシェアードライブラリを必要としているのか調べ, 単に FreeBSD にそのライブラリをコピーするだけです. 次の例を見てみましょう. FTP を使って Doom の Linux バイナリを取ってきて, アクセスできる Linux システムに置いたとしましょう. 次のように ldd linuxdoom とするだけでどのシェアードライブラリが必要かチェックできます. &prompt.user; ldd linuxxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 最後のカラムに表示されているすべてのファイルを持って来て, /compat/linux の下に置き, 最初のカラムに示されるファイル名にシンボリックリンクを張ります. すなわち, FreeBSD システムでは以下のようなファイルが必要となります. /compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
最初のカラムに表示されているファイルとメジャーバージョンが同じ Linux シェアードライブラリを既にインストールしている場合は, 新たにコピーする 必要はありません. 既にあるライブラリで動作するはずです. ただ, 新しいバージョンのものをコピーすることをお奨めします. 新しいライブラリにシンボリックリンクを変更したら, 古いライブラリは削除してかまいません. /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 従って, 以上のようなライブラリがインストールされており, 新しいバイナリに対する ldd の出力が以下のようになる場合を考えます. libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 このように最後の番号が1つか2つ古いだけならば, 普通は /lib/libc.so.4.6.29 をコピーする必要はありません. わずかに古いライブラリでもプログラムは動作するはずだからです. もちろん, 以下のように新しいライブラリと置き換えても構いません. /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
シンボリックリンクのメカニズムは Linux バイナリにのみ必要なことに注意してください. FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので, ユーザが気にする必要はありません.
Linux の ELF バイナリのインストール ELF のバイナリを使うためには, マークをつける (branding) 作業が必要になります. マークのない ELF バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう. &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort カーネルが FreeBSD の ELF バイナリと Linux のバイナリとを 見分けられるようにするためには, &man.brandelf.1; ユーティリティを以下のようにして使ってください. &prompt.user; brandelf -t Linux my-linux-elf-binary 今ではGNU のツールたちが ELF バイナリに自動的に適切なマークを付加するようになったので, 今後はこの作業もだんだんと必要なくなってゆくでしょう. ホストネームリゾルバの設定 DNS がうまく動作しなかったり, 以下のようなエラーメッセージが表示され る場合は, /compat/linux/etc/host.conf ファイルを設定する必要があります. resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword ファイルの内容を以下のように設定してください. order hosts, bind multi on ここで, order は /etc/hosts を最初に検索し, 次にDNSを検索するように指定します. /compat/linux/etc/host.conf がインストールされていない場合, Linux アプリケーションは FreeBSD の /etc/host.conf を使用しようとして, 文法の違いによる警告を出力します. /etc/resolv.conf を利用してネームサーバの設定をしていない場合には, bind を削除してください.
Mathematica のインストール Mathematica 4.x 用に &a.murray; がアップデートし, Bojan Bistrovic bojanb@physics.odu.edu がマージしました. この章では, Mathematica 4.X Linux 版の FreeBSD へのインストールについて説明します. Linux 版の Mathematica は FreeBSD においても完璧に動きます. ただ, 実行する際に Linux ABI を用いる必要があることを FreeBSD に教えるために, Wolfram によって出荷されているバイナリにマーク付け (branded) をする必要があります. Mathematica や Mathematica for Students の Linux 版は Wolfram (http://www.wolfram.com/) から直接注文することができます. Linux バイナリへのマーク付け (branding) Linux 用バイナリは Wolfram の Mathematica CD-ROM の Unix ディレクトリにあります. インストーラーを起動する前にこのディレクトリをローカルディスクにコピーし, &man.brandelf.1; により Linux バイナリにマークを付けます. &prompt.root; mount /cdrom &prompt.root; cp -rp /cdrom/Unix/ /localdir/ &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm &prompt.root; cd /localdir/Installers/Linux/ &prompt.root; ./MathInstaller また以下のようにすると, マーク付けされていない ELF バイナリすべての扱いを, デフォルトで Linux バイナリとすることが可能です. &prompt.root; sysctl -w kern.fallback_elf_brand=3 これは FreeBSD システムに対して, マーク付けされていない ELF バイナリが Linux ABI を利用するように設定します. こうすることで, CDROM から直接インストーラを実行することが可能になります. Mathematica パスワードの取得 Mathematica を起動する前に Wolfram から自分の マシン ID に対応したパスワードを取得しなければいけません. 一旦 Linux 互換ランタイムライブラリをインストールし, Mathematica を展開すれば Install ディレクトリにある mathinfo プログラムを起動して マシン ID を得ることができます. このマシン ID は, 最初に見つかったイーサネットカードの MAC アドレスをベースに生成されます. &prompt.root; cd /localdir/Files/SystemFiles/Installation/Binaries/Linux &prompt.root; mathinfo disco.example.com 7115-70839-20412 電子メールや電話, FAXなどでWolfram に登録する時にはこの マシン ID を渡します. するといくつかの数字から構成されるパスワードが返されるので, 他の Mathematica プラットホームでするのと全く同じように最初に Mathematica を立ち上げる時にその情報を入力します. ネットワーク経由での Mathematica フロントエンドの起動 Mathematica は標準フォントセットにない特別な記号 (積分記号, 総和記号, ギリシャ文字など) を表示するために特殊なフォントを使用します. X プロトコルは, これらのフォントがローカルマシンにインストールされていることを要求します. これはつまり, ローカルマシンに (CD-ROM や Mathematica がインストールされているホストマシンから) そのフォントをコピーしなければならないということです. これらのフォントは通常, CD-ROM の /cdrom/Unix/Files/SystemFiles/Fonts か, もしくはハードディスクの /usr/local/mathematica/SystemFiles/Fonts に置かれており, 実際に使用されるフォントは Type1X のサブディレクトリに格納されています. これらを利用するには次のような二つ方法があります. 一つは, フォントファイルをすべて /usr/X11R6/lib/X11/fonts/ 以下にある既存のフォントディレクトリにコピーする方法です. この場合, fonts.dir にフォント名を追加し, 先頭行のフォント総数を変更することも必要になります. あるいは, フォントをコピーしたディレクトリで mkfontdir を実行するだけでもかまいません. もう一つの方法は, /usr/X11R6/lib/X11/fonts/ にフォントディレクトリごとコピーする方法です. &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X &prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; cd /usr/X11R6/lib/X11/fonts/X &prompt.root; mkfontdir &prompt.root; cd ../MathType1 &prompt.root; mkfontdir そして, フォントパスに新しいフォントディレクトリを追加します. &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash XFree86 サーバを使用しているなら, /etc/XF86Config に加えることでこれらのフォントを自動的に読み込むことができます. /usr/X11R6/lib/X11/fonts/Type1 という ディレクトリが存在していない場合には, 上記例の MathType1Type1 とすることができます. Oracle のインストール Marcel Moolenaar 寄贈 marcel@cup.hp.com はじめに このドキュメントでは Oracle 8.0.5 と Oracle 8.0.5.1 Enterprise Edition の Linux 版を FreeBSD にインストールするための手順を解説します. Linux 環境のインストール - まずは ports コレクションから linux_base と + まずは Ports Collection から linux_baselinux_devtools をインストールしてください. - これらの ports は FreeBSD 3.2 のリリース後にコレクションに加えれれました. + これらの ports は FreeBSD 3.2 のリリース後にコレクションに加えられました. もし FreeBSD 3.2 もしくはそれよりも古いものを使っている場合は ports コレクションをアップデートしましょう. ついでに FreeBSD をアップデートするのもいいでしょう. もし linux_base-6.1linux_devtools-6.1 でうまくいかなければ 5.2 を試してみてください. もし賢いエージェント (intelligent agent) を起動したいなら Red Hat TCL パッケージ tcl-8.0.3-20.i386.rpm もインストールする必要があるでしょう. - オフィシャルな RPM パッケージをインストールするには一般的に次のようにします. + 公式の RPM パッケージをインストールするには一般的に次のようにします. &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package パッケージのインストール時にエラーが出てはいけません. Oracle 環境の構築 Oracleをインストールする前に, 適切な環境を設定する必要があります. このドキュメントでは, Oracle のインストールガイドに書いてあるようなことではなく FreeBSD で Linux 用 Oracle を動かすために特別に必要なことのみを解説します. カーネルのチューニング Oracle インストールガイドにあるように, シェアードメモリーの最大サイズを設定しなければいけません. FreeBSD では SHMMAX を使わないようにしてください. SHMMAX は単に SHMMAXPGSPGSIZE から計算されるだけなのです. 従って, SHMMAXPGS を使うようにしましょう. インストールガイドに記述されている他のオプションは使えます. 例えば以下のようにします. options SHMMAXPGS=10000 options SHMMNI=100 options SHMSEG=10 options SEMMNS=200 options SEMMNI=70 options SEMMSL=61 これらのオプションを意図した Oracle の使い方に合わせて設定してください. また, 次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します. options SYSVSHM #SysV shared memory options SYSVSEM #SysV semaphores options SYSVMSG #SysV interprocess communication Oracle 用アカウント 他のアカウントを作るのと同じように Oracle 用のアカウントを作ります. Oracle 用のアカウントに特別なのは Linux のシェルを割り当てるところだけです. /etc/shells/compat/linux/bin/bash を加え, Oracle 用のアカウントに設定します. 環境設定 ORACLE_HOMEORACLE_SID といった通常の Oracle 用の変数の他に次の変数も設定しなければなりません. 変数 LD_LIBRARY_PATH $ORACLE_HOME/lib CLASSPATH $ORACLE_HOME/jdbc/lib/classes111.zip PATH /compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin 全ての環境変数は .profile で設定することをお勧めします. 完璧なサンプルは以下の通りです. ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH ORACLE_SID=ORCL; export ORACLE_SID ORACLE_TERM=386x; export ORACLE_TERM CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip export CLASSPATH PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:$ORACLE_HOME/bin export PATH Oracle のインストール インストーラーを起動する前に, /var/tmp.oracle という名前のディレクトリを作る必要がありますが, これは Linux エミュレーターにおけるちょっとした不整合のためです. このディレクトリは誰でもが書けるか, もしくは oracle ユーザーのものにしておきます. これで特に問題なく Oracle がインストールできるでしょう. もし問題が起こったら, まずは Oracle の配布物や設定をチェックしてください. Oracle のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます. よくあるトラブルは, TCP プロトコルアダプターが正しくインストールされていないことです. そのため, 一切 TCP リスナーを起動することができないのです. 次の操作はこの問題を解決するのに役立ちます. &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk ntcontab.o &prompt.root; cd $ORACLE_HOME/lib &prompt.root; ar r libnetwork.a ntcontab.o &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk install もう一度 root.sh を起動するのを忘れないように! root.sh へのパッチ Oracle をインストールする時, root で行なう必要のあるいくつかの操作は root.sh と呼ばれるシェルスクリプトに記録されます. root.shorainst ディレクトリにあります. 次のパッチを root.sh に当てて 正しい場所にある chown コマンドを使うようにするか, 代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう. *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/bin/chown # # Define variables to be used in this script --- 31,37 ---- # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/usr/sbin/chown # # Define variables to be used in this script CD-ROM からのインストールでない場合は root.sh のソースにパッチを当ててもいいでしょう. rthd.sh という名前でソースツリーの orainst というディレクトリにあります. genclntsh へのパッチ genclntsh スクリプトは一つの共有クライアントライブラリを生成するのに用いられます. これはデモを作る時に使われます. PATH の定義をコメントアウトするために次のパッチを当ててください. *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998 *************** *** 32,38 **** # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst --- 32,38 ---- # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst Oracle の起動 インストラクションに従えば, Linux でと同じように Oracle を起動できるでしょう. 高度なトピックス Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください. 以下の文章で説明されていることのほとんどは &a.chat; に投稿された Terry Lambert (tlambert@primenet.com) 氏のメール (Message ID: <199906020108.SAA07001@usr09.primenet.com>). をもとにしています. どのように動くのでしょう? FreeBSD は, “実行クラスローダ(execution class loader)” と呼ばれる抽象的な機構を持っています. これは &man.execve.2 システムコールへの楔という形で実装されています. FreeBSD は, シェルインタプリタやシェルスクリプトを実行するための #! ローダを持った単一のプログラムローダではなく, ローダのリストを持っているのです. 歴史的には, UNIX プラットフォーム上の唯一のローダーがマジックナンバー (一般的にはファイルの先頭の 4 ないし 8 バイトの部分) の検査を行ないシステムで実行できるバイナリかどうかを検査し, もしそうならバイナリローダーを呼び出すというようになっていました. もし, そのシステム用のバイナリでない場合には, &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し, シェルがシェルコマンドとして実行しようと試みていたわけです. この仮定は現在利用しているシェルがどのようなものであっても変わりません. 後に &man.sh.1; に変更が加えられ, 先頭の 2 バイトを検査した結果 :\n であれば代わりに &man.csh.1; を呼び出す, というようになりました(この変更は SCO が最初に行なったと思われます). 現在の FreeBSD は, プログラムローダリストを走査します. その際, 空白文字までの文字列をインタプリタとして認識する, 通常の #! ローダを用いるため, 該当するものが存在しなければ最終的に /bin/sh がロードされます. Linux ABI をサポートするため, FreeBSD は ELF バイナリを示すマジックナンバを確認します. (ただし, この段階では FreeBSD, Solaris, Linux, そしてその他の ELF イメージ形式を使っている OS を区別することはできません). ELF ローダは, 特殊なマーク (brand) があるかどうか探します. このマークとは, ELF イメージのコメントセクションのことです. SVR4/Solaris の ELF バイナリには, このセクションは存在しません. Linux バイナリを実行するためには, ELF バイナリに &man.brandelf.1; で説明されている Linux のマークが付けられていなければなりません. &prompt.root; brandelf -t Linux file 上のようにすることで, 指定されたファイルは Linux のマークが付けられ, ELF ローダが認識できるようになります. ELF ローダが Linux マークを確認すると, ローダは proc 構造体内の ある一つのポインタを置き換えます. システムコールは全て, このポインタ (伝統的な UNIX システムではこれは構造体の配列 sysent[] で, システムコールが含まれています) を通してインデックスされます. さらに, そのプロセスには Linux カーネルモジュールに必要な シグナルトランポリンコード(訳注: シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や, 他の(細かな)調整のための設定が行なわれます. Linux システムコールベクタは, さまざまなデータに加えて sysent[] エントリーのリストを含んでおり, それらのアドレスはカーネルモジュール内にあります. Linux バイナリがシステムコールを発行する際, トラップコードは proc 構造体を用いてシステムコール関数ポインタを 解釈します. そして FreeBSD ではなく Linux 用のシステムコールエントリポイントを得るわけです. さらに, Linux モードは状況に応じてファイルシステム本来のルートマウントポイントを置き換えてファイルの参照を行ないます. これは, union オプションを指定してマウントされたファイルシステム (unionfs ではありません!)が行なっていることと同じです. ファイルを検索する際にはまず /compat/linux/original-path ディレクトリを, それから見つけられなかったときにのみ, /original-path を調べます. こうすることで, 他のバイナリを要求するバイナリの実行を可能にしています (したがって, Linux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです). またこれは, もし対応する Linux バイナリが存在しない場合に Linux バイナリが FreeBSD バイナリをロードしたり, 実行したりすることが可能であること, その Linux バイナリに自分自身が Linux 上で実行されていないことを 気付かせないようにする目的で, &man.uname.1; コマンドを /compat/linux ディレクトリに置くことができる, ということを意味します. 要するに, Linux カーネルが FreeBSD カーネルの内部に存在しているわけです. カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は FreeBSD システムコールテーブルエントリと Linux システムコールテーブルエントリの両方で共通に利用されています. これらにはファイルシステム処理, 仮想メモリ処理, シグナル伝送, System V IPC などが含まれますが, FreeBSD バイナリは FreeBSD グルー (訳注: glue; 二者の間を仲介するという意味) 関数群, そして Linux バイナリは Linux グルー関数群を用いる, という点だけが異なります(過去に存在したほとんどの OS は, 自分自身のためのグルー関数群しか備えていません. 前述したように, システムコールを発行する際, 各々のプロセスの proc 構造体内にある, ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに, 静的でグローバルな sysent[] 構造体の配列に システムコール関数のアドレスが直接格納されているのです). さて, どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface; 同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと) と呼ぶべきなのでしょうか? 実は, どちらが本来のものであるかということを論ずることに意味はありません. 基本的に, FreeBSD グルー関数群はカーネルの中に静的にリンクされていて, Linux グルー関数群は静的にリンクすることも, カーネルモジュールを介して利用することもできるようになっている, という違いがあるだけ (ただしこれは現時点においての話であり, 将来のリリースで変更される可能性がありますし, おそらく実際に変更されるでしょう) です. あ, 「でもこれは本当にエミュレーションと呼べるのか」って? 答えは「いいえ」です. これは ABI の実装であり, エミュレーションとは異なります. エミュレータが呼び出されているわけではありません (シミュレータでもないことをあらかじめ断っておきましょう). では, これがよく Linux エミュレーションと呼ばれるのは何故でしょうか? それはもちろん FreeBSD の売りにするため 8-) でもあるのですが, 実際には, 次のような理由によります. この機能が初めて実装された頃, 動作原理を説明する以外にこの機能を表現する言葉はありませんでした. しかし, コードをコンパイルしたりモジュールをロードしない場合, 「FreeBSD 上で Linux バイナリを実行する」という表現は, 厳密に考えると適切ではありません. そこで, その際にロードされているもの自身を表現する言葉—すなわち Linux エミュレータが必要だったのです.
diff --git a/ja_JP.eucJP/books/handbook/mirrors/chapter.sgml b/ja_JP.eucJP/books/handbook/mirrors/chapter.sgml index 12b0fb42ab..72d9d21375 100644 --- a/ja_JP.eucJP/books/handbook/mirrors/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/mirrors/chapter.sgml @@ -1,3776 +1,3766 @@ FreeBSD の入手方法 CDROM 出版社 FreeBSD の CDROM は, 以下の取り扱い業者から入手できます.
Daemon News 2680 Bayshore Parkway, Suite 307 Mountain View, CA 94043 USA 電話: +1 650 694-4949 Email: sales@daemonnews.org WWW: http://www.bsdmall.com/
Wind River Systems 500 Wind River Way Alameda, CA 94501 USA 電話: +1 510 749-2872 WWW: http://www.freebsdmall.com/
あなたが小売業を営んでいて FreeBSD の CDROM 製品を取り扱いたいと考えているなら, Wind River Systems の関連部署, もしくは次の場所に連絡してください.
Cylogistics 2680 Bayshore Parkway, Suite 307 Mountain View, CA 94043 USA 電話: +1 650 694-4949 Fax: +1 650 694-4953 Email: sales@cylogistics.com WWW: http://www.cylogistics.com/
DVD 出版社 FreeBSD の DVD は以下の業者から入手できます:
FreeBSD Services Ltd 11 Lapwing Close Bicester OX26 6XR United Kingdom WWW: http://www.freebsd-services.com/
FTP サイト FreeBSD の公式な情報は anonymous FTP によって以下の場所から 入手できます:
ftp://ftp.FreeBSD.org/pub/FreeBSD/.
FreeBSD ミラーサイトデーターベース FreeBSD ハンドブックの “ミラーサイト一覧” よりも正確です.というのはその情報を DNS から取得するので, 静的に記述されたリストよりも信頼性が高いのです. さらに, FreeBSD は以下のミラーサイトから anonymous FTP によって 入手できます. もし FreeBSD を anonymous FTP によって手にいれる場合は, 近くのサイトを利用するようにしてください. Argentina, Australia, Brazil, Canada, China, Czech Republic, Denmark, Estonia, Finland, France, Germany, Hong Kong, Hungary, Ireland, Israel, Japan, Korea, Lithuania, Netherlands, New Zealand, Poland, Portugal, Russia, Saudi Arabia, South Africa, Spain, Slovak Republic, Slovenia, Sweden, Taiwan, Thailand, UK, Ukraine, USA. アルゼンチン 何か問題がある場合は,このドメインの hostmaster hostmaster@ar.FreeBSD.org に連絡してください. ftp.ar.FreeBSD.org/pub/FreeBSD/ オーストラリア 何か問題がある場合は, このドメインの hostmaster hostmaster@au.FreeBSD.org に連絡してください. ftp://ftp.au.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.au.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.au.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.au.FreeBSD.org/pub/FreeBSD/ ブラジル 何か問題がある場合は, このドメインの hostmaster hostmaster@br.FreeBSD.org に連絡してください. ftp://ftp.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.br.FreeBSD.org/pub/FreeBSD/ ftp://ftp7.br.FreeBSD.org/pub/FreeBSD/ カナダ 何か問題がある場合は, このドメインの hostmaster hostmaster@ca.FreeBSD.org に連絡してください. ftp://ftp.ca.FreeBSD.org/pub/FreeBSD/ 中国 何か問題がある場合は, このドメインの hostmaster phj@cn.FreeBSD.org に連絡してください. ftp://ftp.cn.FreeBSD.org/pub/FreeBSD/ チェコ 何か問題がある場合は, このドメインの hostmaster hostmaster@cz.FreeBSD.org に連絡してください. ftp://ftp.cz.FreeBSD.org/pub/FreeBSD/ 連絡先: calda@dzungle.ms.mff.cuni.cz デンマーク 何か問題がある場合は,このドメインの hostmaster hostmaster@dk.FreeBSD.org に連絡してください. ftp://ftp.dk.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.dk.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.dk.FreeBSD.org/pub/FreeBSD/ エストニア 何か問題がある場合は, このドメインの hostmaster hostmaster@ee.FreeBSD.org に連絡してください. ftp://ftp.ee.FreeBSD.org/pub/FreeBSD/ フィンランド 何か問題がある場合は, このドメインの hostmaster hostmaster@fi.FreeBSD.org に連絡してください. ftp://ftp.fi.FreeBSD.org/pub/FreeBSD/ フランス 何か問題がある場合は, このドメインの hostmaster hostmaster@fr.FreeBSD.org に連絡してください. ftp://ftp.fr.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.fr.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.fr.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.fr.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.fr.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.fr.FreeBSD.org/pub/FreeBSD/ ドイツ 何か問題がある場合は, このドメインのミラー管理者 de-bsd-hubsr@de.FreeBSD.org に連絡してください. ftp://ftp.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.de.FreeBSD.org/pub/FreeBSD/ ftp://ftp7.de.FreeBSD.org/pub/FreeBSD/ 香港 ftp://ftp.hk.super.net/pub/FreeBSD/ 連絡先: ftp-admin@HK.Super.NET. ハンガリー 何か問題がある場合は, このドメインの hostmaster mohacsi@ik.bme.hu に連絡してください. ftp://ftp.hu.FreeBSD.org/pub/FreeBSD/ アイルランド 何か問題がある場合は, このドメインの hostmaster hostmaster@ie.FreeBSD.org に連絡してください. ftp://ftp.ie.FreeBSD.org/pub/FreeBSD/ イスラエル 何か問題がある場合は, このドメインの hostmaster hostmaster@il.FreeBSD.org に連絡してください. ftp://ftp.il.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.il.FreeBSD.org/pub/FreeBSD/ 日本 何か問題がある場合は, このドメインの hostmaster hostmaster@jp.FreeBSD.org に連絡してください. ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.jp.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.jp.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.jp.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.jp.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.jp.FreeBSD.org/pub/FreeBSD/ 韓国 何か問題がある場合は, このドメインの hostmaster hostmaster@kr.FreeBSD.org に連絡してください. ftp://ftp.kr.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.kr.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.kr.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.kr.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.kr.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.kr.FreeBSD.org/pub/FreeBSD/ リトアニア 何か問題がある場合は, このドメインの hostmaster hostmaster@lt.FreeBSD.org に連絡してください. ftp://ftp.lt.FreeBSD.org/pub/FreeBSD/ オランダ 何か問題がある場合は, このドメインの hostmaster hostmaster@nl.FreeBSD.org に連絡してください. ftp://ftp.nl.FreeBSD.org/pub/FreeBSD/ ニュージーランド 何か問題がある場合は, このドメインの hostmaster hostmaster@nz.FreeBSD.org に連絡してください. ftp://ftp.nz.FreeBSD.org/pub/FreeBSD/ ポーランド 何か問題がある場合は,このドメインの hostmaster hostmaster@pl.FreeBSD.org に連絡してください. ftp://ftp.pl.FreeBSD.org/pub/FreeBSD/ ポルトガル 何か問題がある場合は, このドメインの hostmaster hostmaster@pt.FreeBSD.org に連絡してください. ftp://ftp.pt.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.pt.FreeBSD.org/pub/FreeBSD/ ルーマニア 何か問題がある場合は, このドメインの hostmaster hostmaster@ro.FreeBSD.org に連絡してください. ftp://ftp.ro.FreeBSD.org/pub/FreeBSD/ ロシア 何か問題がある場合は, このドメインの hostmaster hostmaster@ru.FreeBSD.org に連絡してください. ftp://ftp.ru.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.ru.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.ru.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.ru.FreeBSD.org/pub/FreeBSD/ サウジアラビア 何か問題がある場合は, ftpadmin@isu.net.sa に連絡してください. ftp://ftp.isu.net.sa/pub/mirrors/ftp.freebsd.org/ 南アフリカ 何か問題がある場合は, このドメインの hostmaster hostmaster@za.FreeBSD.org に連絡してください. ftp://ftp.za.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.za.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.za.FreeBSD.org/pub/FreeBSD/ スロヴァキア共和国 何か問題がある場合には, このドメインの hostmaster hostmaster@sk.FreeBSD.org に連絡してください. ftp://ftp.sk.FreeBSD.org/pub/FreeBSD/ スロベニア 何か問題がある場合には, このドメインの hostmaster hostmaster@si.FreeBSD.org に連絡してください. ftp://ftp.si.FreeBSD.org/pub/FreeBSD スペイン 何か問題がある場合は, このドメインの hostmaster hostmaster@es.FreeBSD.org に連絡してください. ftp://ftp.es.FreeBSD.org/pub/FreeBSD/ スウェーデン 何か問題がある場合は, このドメインの hostmaster hostmaster@se.FreeBSD.org に連絡してください. ftp://ftp.se.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.se.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.se.FreeBSD.org/pub/FreeBSD/ 台湾 何か問題がある場合は, このドメインの hostmaster hostmaster@tw.FreeBSD.org に連絡してください. ftp://ftp.tw.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.tw.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.tw.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.tw.FreeBSD.org/pub/FreeBSD/ タイ ftp://ftp.nectec.or.th/pub/FreeBSD/ 連絡先: ftpadmin@ftp.nectec.or.th. ウクライナ ftp://ftp.ua.FreeBSD.org/pub/FreeBSD/ 連絡先: freebsd-mnt@lucky.net. イギリス 何か問題がある場合は, このドメインの hostmaster hostmaster@uk.FreeBSD.org に連絡してください. ftp://ftp.uk.FreeBSD.org/pub/FreeBSD/ ftp://ftp2.uk.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.uk.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.uk.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.uk.FreeBSD.org/pub/FreeBSD/ アメリカ 何か問題がある場合は, このドメインの hostmaster hostmaster@FreeBSD.org に連絡してください. ftp://ftp2.FreeBSD.org/pub/FreeBSD/ ftp://ftp3.FreeBSD.org/pub/FreeBSD/ ftp://ftp4.FreeBSD.org/pub/FreeBSD/ ftp://ftp5.FreeBSD.org/pub/FreeBSD/ ftp://ftp6.FreeBSD.org/pub/FreeBSD/ ftp://ftp7.FreeBSD.org/pub/FreeBSD/ ftp://ftp8.FreeBSD.org/pub/FreeBSD/ ftp://ftp9.FreeBSD.org/pub/os/FreeBSD/ ftp://ftp10.FreeBSD.org/pub/FreeBSD/
Anonymous CVS 訳: &a.jp.sugimura;, 1998 年 7 月 19 日. <anchor id="anoncvs-intro">導入 Anonymous CVS (もしくは, anoncvs として知られています) は離れたところにある CVS リポジトリと同期を取るために FreeBSD に付属している CVS ユーティリティに含まれている機能です. 他にもありますが, それは FreeBSD のユーザが, 特別な権限なしに FreeBSD プロジェクトの公式な anoncvs サーバに読み取り専用で CVS の操作をすることができるようにするためのものです. それを使うには, 単に CVSROOT 環境変数を設定して適切な anoncvs サーバを指定し, cvs login を使って パスワード anoncvs を入力してください. そして次に &man.cvs.1; コマンドを使うことで, 手元にあるリポジトリと同じようにアクセスできるようになります. CVSup と anoncvs のサービスは本質的に同じ機能ではないかということも言われていますが, ユーザが同期を取る方法を選ぶときに影響を与える, さまざまなトレードオフが存在します. 要約して言えば, CVSup はネットワーク資源の使い方においては非常に効率が良く技術的にもはるかに洗練されたものですが, 相当な手間がかかります. CVSup を使うには特別なクライアントをまずインストールして設定しなくては 1 bit も取ってくることができませんし, さらにそのとき CVSup で取ってくることができるのは, コレクション(collection) と呼ばれる, かなり大きなかたまりだけです. それに対して anoncvs では, CVS モジュールの名前を指定することで特定のプログラムの (lsgrep のような) 個々のファイルから調べることができます. もちろん, anoncvs は CVS リポジトリの読み取り専用の操作に対してのみ適しているので, もしあなたが FreeBSD プロジェクトのものと共有されたなにか ローカルなリポジトリを作ってそこでの開発を 行おうというときには, CVSup だけが唯一の手段となってしまいます. <anchor id="anoncvs-usage">Anonymous CVS を使う &man.cvs.1; を設定して Anonymous CVS リポジトリを使うには単に CVSROOT 環境変数を設定して FreeBSD プロジェクトの anoncvs サーバを指定するだけのことです. この文書を書いているときには, 次のサーバが利用できるようになっています. USA: :pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs (cvs login コマンドを使い, プロンプトが表示されたらパスワード anoncvs を入力してください) CVS はかつて存在した (もしくはこれから存在するものも) ほとんどどんなバージョンの FreeBSD のソースを check out することができますが, あなたは &man.cvs.1; の リビジョン () のオプションや FreeBSD プロジェクトのリポジトリの中で それをどのように指定したらいいものかということを よく知っておく必要があります. タグには 2 種類あって, リビジョンタグとブランチタグがあります. リビジョンタグは特定の改訂版を指しており, それはいつも同じものを意味しています. 一方ブランチタグは, 指定されたときの指定された開発の流れにおける 最も新しい改訂版を示しています. ブランチタグは特定の改訂版を指していないために, その意味はきょうと明日では違うものになっているでしょう. ユーザが興味を持つと思われるブランチタグの一覧です (Ports Collectionに有効なタグは HEAD だけだという事を心に留めておいてください). HEAD 主要部をなす流れ, すなわち FreeBSD-CURRENT のための名前です. また, どのリビジョンも 指定されなかったときにはこれになります. RELENG_4 FreeBSD-4.X の開発のための流れです. FreeBSD-STABLE としても知られています. RELENG_4_3 FreeBSD-4.3 用のリリースブランチです. これはセキュリティ勧告や重要な修正が行なわれる場合にのみ使われます. RELENG_3 FreeBSD-3.X の開発のための流れです. 3.X-STABLE としても知られています. RELENG_2_2 FreeBSD-2.2.X の開発のための流れです. 2.2-STABLE としても知られています. このブランチは大部分が すたれています. ユーザが興味を持つであろうリビジョンタグの一覧です. これらはいずれも Ports Collection に対して使うことはできません. Ports Collection は複数のリビジョンを持っていないからです. RELENG_4_3_0_RELEASE FreeBSD 4.3 です. RELENG_4_2_0_RELEASE FreeBSD 4.2 です. RELENG_4_1_1_RELEASE FreeBSD 4.1.1 です. RELENG_4_1_0_RELEASE FreeBSD 4.1.0 です. RELENG_4_0_0_RELEASE FreeBSD 4.0 です. RELENG_3_5_0_RELEASE FreeBSD-3.5 です. RELENG_3_4_0_RELEASE FreeBSD-3.4 です. RELENG_3_3_0_RELEASE FreeBSD-3.3 です. RELENG_3_2_0_RELEASE FreeBSD-3.2 です. RELENG_3_1_0_RELEASE FreeBSD-3.1 です. RELENG_3_0_0_RELEASE FreeBSD-3.0 です. RELENG_2_2_8_RELEASE FreeBSD-2.2.8 です. RELENG_2_2_7_RELEASE FreeBSD-2.2.7 です. RELENG_2_2_6_RELEASE FreeBSD-2.2.6 です. RELENG_2_2_5_RELEASE FreeBSD-2.2.5 です. RELENG_2_2_2_RELEASE FreeBSD-2.2.2 です. RELENG_2_2_1_RELEASE FreeBSD-2.2.1 です. RELENG_2_2_0_RELEASE FreeBSD-2.2.0 です. ブランチタグを指定したときには, 普通はその開発の流れにおける 最も新しいバージョンのファイルを受け取ることができます. もし以前のバージョンのものが欲しいときには, 日付を オプションを使って指定すればよいです. これ以上のことは &man.cvs.1; man page を見てください. 本当はなにかする前には &man.cvs.1; のマニュアルページの全体をちゃんと読んでからのほうがいいのですが, Anonymous CVS の使い方の本質的なところを簡単に例を挙げて説明します. -CURRENT (&man.ls.1;) をちょっと確認してから消してみます. &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs &prompt.user; cvs login プロンプトが表示されたら, パスワード anoncvs を入力します. &prompt.user; cvs co ls &prompt.user; cvs release -d ls &prompt.user; cvs logout &man.ls.1; のバージョンを 3.X-STABLE ブランチから調べてみます. &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs &prompt.user; cvs login プロンプトが表示されたら, パスワード anoncvs を入力します. &prompt.user; cvs co -rRELENG_3 ls &prompt.user; cvs release -d ls &prompt.user; cvs logout &man.ls.1; の変更点のリストを (unified diff で) 作ってみます. &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs &prompt.user; cvs login プロンプトが表示されたら, パスワード anoncvs を入力します. &prompt.user; cvs rdiff -u -rRELENG_3_0_0_RELEASE -rRELENG_3_4_0_RELEASE ls &prompt.user; cvs logout 他のどんなモジュールの名前が 使われているか検索してみます. &prompt.user; setenv CVSROOT :pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs &prompt.user; cvs login プロンプトが表示されたら, パスワード anoncvs を入力します. &prompt.user; more modules/modules &prompt.user; cvs release -d modules &prompt.user; cvs logout 他の資料 次の資料は CVS を学ぶのに役に立つでしょう. CVS チュートリアル. Cal Poly によるものです. Cyclic Software, 商用として CVS を保守しています. CVSWeb は FreeBSD Project の CVS のための WWW インターフェースです. CTM を使う 訳: &a.hanai;, 1997 年 9 月 13 日. CTM はリモートのディレクトリツリーを中央のツリーに同期させるための 手段です. これはFreeBSDのソースツリーの配布を行なうために開発されまし たが, 時が経つにつれて別の目的にも有用であることがわかるかも しれません. デルタを作り出す処理に関するドキュメントは現在ほとんど ありません. 従って, もしあなたがCTM を他のことに使いたいなら &a.phk;にさらなる情報を問い合わせてください. なぜ<application>CTM</application>を使うの? CTM を使うことにより FreeBSD ソースツリーのローカルコピーを手にいれることができます. ソースツリーが使えることの魅力は数多くあります. 完全な cvs ツリーを追いかけるにしても, ひとつのブランチを追いかける にしても CTM は必要な情報を与えてくれます. もしあなたがFreeBSDのアクティブな開発者であるにもかかわらず お粗末なTCP/IP接続しか持っていなかったり, またはTCP/IP接続が 行なえないとしたら, あるいは単に変更が自動的に送られてきて ほしいというのであれば CTM はそんなあなたのために 作られたのです. アクティブなブランチでは 1 日に最大三つまでのデルタを受け取る必要があります. これが自動的に e-mail で送られてくるという方法を ぜひ検討してみてください. デルタのサイズは常にできるだけ小さく保たれています. 大抵の場合5KBよりも小さく, たまに(10回に1回程度)10-50KBになり, ときおり100KBかもっと大きくなるでしょう. 開発ソースから直接に得られたものを使うことについては, あらかじめパッケージにされたリリースとは違い, いろいろと注意することが あります. これは特に “current” のソースを選んでいるときは重要です. 最新の FreeBSD を追いかけるを読むことをお勧めします. <application>CTM</application>を使うには何が必要? 二つのものが必要でしょう: CTM プログラムとそれに与える (“current” レベルを得るための)最初のデルタです. CTM プログラムはバージョン2.0のリリース以来FreeBSDの一部にな りました. もしソースのコピーを持っているなら /usr/src/usr.sbin/CTMにあります. もしFreeBSDの2.0以前のバージョンなら, 最新のCTMのソースを直接 ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/src/usr.sbin/ctm/ から入手できます. CTM に与える “デルタ” は二つの方法, FTPまたはe-mail, で得ること ができます. もしインターネットにFTPアクセスできるなら, 次のFTPサイト: ftp://ftp.FreeBSD.org/pub/FreeBSD/CTM/ または, その ミラーサイト が CTM へのアクセスをサポートします. 適切なディレクトリに FTP して README ファイルを入手し, そこからスタートしてください. e-mail によってデルタを得たいという場合は: CTM 配布メーリングリストのいずれかに参加するために &a.majordomo; へ subscribe のメールを送ってください. “ctm-cvs-cur” は完全な CVS ツリー をサポートします. “ctm-src-cur” は開発先端ブランチをサポートします “ctm-src-2_2” は 2.2 リリースのブランチのサポートです. (もし majordomo を使って参加する方法を知らないのであれば, 最初に help という語を含むメッセージを送ってください. — 使い方の説明が送られてくるでしょう.) メールで CTM による更新ファイルを受け取り始めると, 中身を取り出して使用 するために ctm_rmail プログラムを使うかもしれません. それを完全 に自動で行ないたいなら, /etc/aliases から ctm_rmailプロ グラムを直接使うこともできます. さらに詳しいことはctm_rmail manページを御覧ください. CTM デルタを得るためにどの方法を使うのであっても, ctm-announce@FreeBSD.org メーリングリストに参加するべきです. このメーリングリストは将来的には CTMシステムの操作に関する アナウンスがポストされる唯一の場になるでしょう. メーリングリストに加わるためにはsubscribe ctm-announce と書いた一行だけのメールを &a.majordomo; へ送ってください. はじめて<application>CTM</application>を使い始める CTM デルタを使い始めるためには, これは以降作られる全ての デルタの出発点を手にいれる必要があります. 最初にあなたが何をすでに持っているかをはっきりさせましょう. すべての人は “空”のディレクトリから始めなければなりません. ツリーをサポートしてるあなたの CTM を稼働するためには 指定した“空” のデルタを使う必要があります. いくつかの分岐点 では, あなたの都合により CD 内に分配されている“スタータ” デルタを使用できるようになっています. しかしながら, これは 頻繁に行われることではありません. 適切な出発点が決まれば, その出発点を CTM が 維持するツリーへ変換するための “スタータ” 初期デルタを使う必要が あります. 移行デルタは番号の後ろに X をつけたものがそうです (たとえばsrc-cur.3210XEmpty.gz). X の後ろは最初の開始ポイントに対応します. Empty は 空のディレクトリです. ルールとして Empty からの移行デルタは 100 デルタごとに 作られます. ところで, これらは非常に大きいです! XEmptyのデルタは 数十MBの gzip で圧縮されたデータというのが普通です. 一度スタートするためのベースデルタを得ると, それに続く多数の全てのデルタも必要になるでしょう. <application>CTM</application>を日常で使う デルタを適用するためには, 単に &prompt.root; cd /where/ever/you/want/the/stuff &prompt.root; ctm -v -v /where/you/store/your/deltas/src-xxx.* とします. CTM はどれがgzipされているか理解します. 従って最初に gunzip しておく必要はありません. ディスクの節約にもなります. 全体の処理に関して確信するまでは CTM は(ソース)ツリーに対して 何もしません. また, デルタを確かめるためには フラグを使うことができます. このフラグがあると CTM はツリーに対して実際には何も行ないません. 単にデルタの完全性を確認し, 現在のツリーに問題なく使用できるかを確認 するだけです. CTM には他にもオプションがあります. 詳細に関しては マニュアルページを参照するかソースを見てください. 以上でやることは本当に全部です. 新しいデルタを入手した時には, ソースを最新のものにするためにそれを CTMに通すだけです. もしデルタを再ダウンロードするのが 骨の折れる作業であれば, デルタを 消さないでおいてください. なにかおかしなことが起こった場合には置いておけば良かった と思うかもしれません. もしフロッピーディスクしか持っていない状況 であってもコピーを取るのに fdwriteを使うことを考えてください. ローカルの変更を保存する 開発者としてはソースツリー中のファイルを 使って実験したり変更したく なるものです. CTM はローカルの変更を制限つきでサポートします: ファイル foo の存在をチェックする前に, foo.ctm を参照しにいきます. このファイルが存在する場合, CTM は foo の代りにこれを処理します. この動作はローカルの変更を保持する簡単な手段を 提供します: 単に変更したいファイルを拡張子 .ctm 付きのファイル名で コピーするだけです. あとは自由にコードをハックでき, .ctm ファイルの方は CTM が最新状態に保ってくれます. <application>CTM</application> のその他の面白いオプション 更新で変更されるファイルを正確に知る CTM のソースリポジトリに対する変更のリストを オプションを使って決定することができます. これは, 変更のログを保存したい, 変更されたファイルをなんらかの方法で 前・後処理したい, または単にこだわりたい場合には, 役に立つでしょう. 更新前にバックアップを取る CTM の更新によって変更されるファイルすべてのバックアップを 取りたくなることがあります. オプションを指定すると CTM は デルタで変更されるファイルすべてを backup-file としてバックアップするようになります. 更新で変更されるファイルを制限する CTM の更新の範囲を制限したり一連のデルタのから ほんの数ファイルを抽出したくなることがあります. オプションを用い正規表現を指定することで, CTM が処理するファイルのリストを制御することが できます. 例えば, lib/libc/Makefile の最新のコピーを保存してある CTM デルタのコレクションから抽出するには, 以下のコマンドを実行します. &prompt.root; cd /where/ever/you/want/to/extract/it/ &prompt.root; ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.* CTM デルタで指定されたファイルごとに, そして オプションがコマンドラインで指定された順序で適用されます. すべての そして オプションが適用された後に更新対象と選択された場合に限り, CTM はそのファイルを処理します. <application>CTM</application>の将来計画 重要なもの なんらかの CTM システムへの認証機構を用い, 不正な CTM の更新の検出を可能とする. CTM へのオプションを整理する. さもないと混乱し, 直観に反したものになります. その他 ports コレクションに対するデルタもあるのですが, これに興味を持っている人はまだ少ないようです. もしこれに対するメーリングリストが欲しい時はセットアップを行ないますので, わたしの方まで連絡ください. CTM サイト CTM/FreeBSD は以下のミラーサイトから anonymous FTP によって入手できます. もし CTM を anonymous FTP によって手にいれる場合は, 近くのサイトを利用するようにしてください. 何か問題がある場合は, &a.phk;に連絡してください. カリフォルニア, サンフランシスコ近辺, 公式なソース ftp://ftp.FreeBSD.org/pub/FreeBSD/CTM/ ドイツ, トリエル ftp://ftp.uni-trier.de/pub/unix/systems/BSD/FreeBSD/CTM/ 南アフリカ, ctm, sup, CVSupなどの古い差分ファイルのバックアップサーバ ftp://ftp.za.FreeBSD.org/pub/FreeBSD/CTM/ 台湾/中華民国, チャーイー(嘉義) ftp://ctm.tw.FreeBSD.org/pub/freebsd/CTM/ ftp://ctm2.tw.FreeBSD.org/pub/FreeBSD/CTM/ ftp://ctm3.tw.FreeBSD.org/pub/freebsd/CTM/ 近くにミラーサイトがない場合やミラーが不完全な場合は, http://ftpsearch.ntnu.no/ftpsearchFTP search を試してください. FTP search はノルウェーの Trondheim にある, フリーの素晴らしい アーカイブサーバです. CVSup を使う 訳: &a.jp.iwasaki;, 1997 年 2 月 27 日. 紹介 CVSup は, リモートのサーバホストにあるマスタ CVS リポジトリから ソースツリーを配布し更新するための ソフトウェアパッケージです. FreeBSD のソースは, カリフォルニアにある中心的な開発マシンの CVS リポジトリの 中でメンテナンスしています. CVSup を使用することで, FreeBSD ユーザは 簡単に自分のソースツリーを最新の状態に しておくことができます. CVSuppull モデルとよばれる更新のモデルを採用しています. pull モデルでは, 各クライアントが更新したい場合に更新したい時点で, サーバに更新の問い合わせをおこないます. サーバはクライアントからの 更新の要求を受け身の状態で待ちます. したがって, すべての更新はクライアント主導でおこなわれます. サーバは頼まれもしない更新情報を送るようなことはしません. ユーザは CVSup クライアントを手動で実行して更新をおこなうか, cron ジョブを設定して定期的に自動実行する必要があります. 用語 CVSup のように大文字で表記しているものは, ソフトウェアパッケージ 全体を指します. 主な構成物は, 各ユーザマシンで実行するクライアントである cvsup, FreeBSD の各ミラーサイトで実行するサーバ cvsupd です. FreeBSD の文書やメーリングリストを読んだ際に, sup についての言及を 見かけたかもしれません. supCVSup の前に存在していたもので, 同様の目的で使われていました. CVSup は sup と同じように使用されており, 実際, sup と互換性のあるコンフィグレーションファイルを使用します. CVSup の方がより高速で柔軟性もあるので, もはや sup は FreeBSD プロジェクトでは使用されていません. インストール CVSup をインストールする最も簡単な方法は, FreeBSD Ports コレクションのパッケージ からコンパイル済みの net/cvsup パッケージをインストールすることです. もしくは, net/cvsup でも構いません. ただし, net/cvsup は Modula-3 システムに依存していて, 構築にかかる時間, ディスクスペースは比較的大きくなります. もし, あなたに CVSup に関して全く知識がなく, 自動で設定ファイルをセットアップして, クリックするだけで転送を行なえるインターフェイスを提供してくれるような, 単一のパッケージをインストールしたいと考えているなら, cvsupit パッケージを利用して下さい. これは &man.pkg.add.1; するだけで良く, 設定は, その際にメニュー形式で行なうことができるようになっています. CVSup のコンフィグレーション CVSup の動作は, supfile と呼ばれるコンフィグレーションファイルで 制御します. supfile のサンプルは, ディレクトリ /usr/share/examples/cvsup/ の下にあります. supfile には以下の cvsup に関する質問への答えを記述します: どのファイルを受け取りたいのか? どのバージョンのものが欲しいのか? どこから入手したいのか? 自分のマシンのどこに置きたいのか? どこに status ファイルを置きたいのか? 次のセクションで, これらの質問に順番に答えながら典型的な supfile を組み立てていきます. 最初に supfile の全体構造を説明します. supfile はテキストファイルです. コメントは # から行末までです. 空行とコメントだけの行は無視します. 残りの各行には, ユーザが受け取りたいファイル群について記述します. 行の始めは, サーバ側で定義した論理的なファイルのグループである コレクションの名称です. コレクションの名称を指定して, 欲しいファイル群を サーバに伝えます. コレクション名の後には, ホワイトスペースで区切られた 0 個以上のフィールドが続きます. これらのフィールドが上記の質問に対する答えになります. フィールドには 2 種類あります: flag フィールドと value フィールドです. flag フィールドは deletecompress のような 単独のキーワードから成ります. また, value フィールドもキーワードで始まりますが, キーワードの後にはホワイトスペースは入らず, = と二つめの単語が続きます. 例えば, release=cvs は value フィールドです. 通常, supfile には受け取りたいコレクションを一つ以上指定します. supfile を組み立てる一つの方法として, コレクション毎にすべての関係の あるフィールドを明示的に指定する方法があります. しかし, これでは supfile のすべてのコレクションに対して ほとんどのフィールドが同じになるため, 行が非常に長くなってしまい不便になります. これらの問題を避けるため, CVSup ではデフォルトを指定することのできる メカニズムが提供されています. 特殊な擬似コレクション名 *default で始まる行は, supfile 中の後続の コレクションに対して使用する flag フィールドと value フィールドのデフォルトを設定するために利用できます. 個々のコレクションで固有の値を指定すると, デフォルト値を無効にできます. また 行を追加すると, supfile の途中からデフォルト値の変更や追加が可能になります. これまでの予備知識を基に, FreeBSD-current のメインのソースツリーを受け取って更新するための supfile を組み立ててみましょう. どのファイルを受け取りたいのか? CVSup を通して入手できるファイルは コレクション と呼ばれる名前の付けられたグループにまとめられています. 利用可能なコレクションについては ここ で説明しています. ここでは, FreeBSD システムのメインのソースツリー全体 を受け取るための設定例を紹介します. すべてを含む src-all という単一の大きなコレクションがあります. supfile を組み立てる最初のステップとして, これらのコレクションを一行に一つずつ記述します (この場合は一行だけです). src-all どのバージョンのものが欲しいのか? CVSup を使用すると, かつて存在していたことのある, 事実上どのバージョンの ソースでも受け取ることができます. これは cvsupd サーバがすべてのバージョンを含む CVS リポジトリに基づいて動作することにより, 実現されています. tag= および の value フィールドを使用して, 欲しいバージョンの 一つを指定します. tag= のフィールドの指定は正確に行うように十分注意 してください. いくつかのタグは特定のコレクションに 対してのみ有効です. タグの綴りが違っていたり不適切なタグを指定すると, CVSup はユーザが消し たくないファイルまで削除してしまいます. 特に ports-* のコレクション に対しては tag=. だけ を指定するようにしてください. tag= フィールドはリポジトリ中のシンボリックタグを指定します. tag には revision tag と branch tag の二種類があります. revision tag は特定のリビジョンを指します. これは, 毎日同じ状態に保つことになります. 一方 branch tag は, ある時点での開発分流の最新のリビジョンを指します. branch tag は特定のリビジョンを指定している訳ではないので, 今日と明日では 異なるリビジョンを参照することになるかもしれません. 以下はユーザが興味を持っていると思われる branch tag です. tag=. だけが ports コレクションには 適切であることに注意してください. tag=. メインの開発分流であり, FreeBSD-CURRENT として知られています. 注意: . は句読点ではありません. tag の名称です. このタグの指定は総ての コレクションに対して有効です. tag=RELENG_4 FreeBSD-4.X 用の開発分流であり, FreeBSD-STABLE として知られています. tag=RELENG_3 FreeBSD-3.X 用の開発分流です. tag=RELENG_2_2 FreeBSD-2.2.X 用の開発分流であり, 2.2-STABLE として知られています. 以下はユーザが興味を持っていると思われる revision tag です. 以下は ports コレクションには不適切であることに 再度注意してください. tag=RELENG_4_2_0_RELEASE FreeBSD-4.2 です. tag=RELENG_4_1_1_RELEASE FreeBSD-4.1.1 です. tag=RELENG_4_1_0_RELEASE FreeBSD-4.1.0 です. tag=RELENG_4_0_0_RELEASE FreeBSD-4.0 です. tag=RELENG_3_5_0_RELEASE FreeBSD-3.5 です. tag=RELENG_3_4_0_RELEASE FreeBSD-3.4 です. - tag=RELENG_3_5_0_RELEASE - - - FreeBSD-3.0 です. - - - - - tag=RELENG_3_3_0_RELEASE FreeBSD-3.3 です. - tag=RELENG_3_2_0_RELEASE FreeBSD-3.2 です. tag=RELENG_3_1_0_RELEASE FreeBSD-3.1 です. tag=RELENG_3_0_0_RELEASE FreeBSD-3.0 です. tag=RELENG_2_2_8_RELEASE FreeBSD-2.2.8 です. tag=RELENG_2_2_7_RELEASE FreeBSD-2.2.7 です. tag=RELENG_2_2_6_RELEASE FreeBSD-2.2.6 です. tag=RELENG_2_2_5_RELEASE FreeBSD-2.2.5 です. tag=RELENG_2_2_2_RELEASE FreeBSD-2.2.2 です. tag=RELENG_2_2_1_RELEASE FreeBSD-2.2.1 です. tag=RELENG_2_2_0_RELEASE FreeBSD-2.2.0 です. tag 名を示した通りにタイプされているか十分注意してく ださい. CVSup は tag 名が正しいかどうかを見分けることはできません. tag が間違っていた場合, たまたまファイルがまったく存在しない正しい tag が 指定されたものとしてCVSup は動作します. その場合は, 現在あるソースが削 除されるでしょう. branch tag を指定した際には, 通常はその開発分流の最新バージョンの ファイルを受け取ります. いくらか前のバージョンを受け取りたい場合は, の value フィールドを使って日付を指定することで, これを実現することが できます. &man.cvsup.1; のマニュアルページで, その方法を説明しています. 例として, FreeBSD-current を受け取りたいとします. 次の行を supfile の始めに追加します: *default tag=. tag= フィールドも date= フィールドも指定しなかった場合に 動き出す重要な特殊なケースがあります. そのケースでは, 特定のバージョンの ファイルを受け取るのではなく, サーバの CVS リポジトリから実際の RCS ファイルを直接受け取ります. 一般的に開発者はこの処理のモードが 好きなようです. 彼らのシステム上にリポジトリそのものの コピーを維持することで, リビジョン履歴を閲覧し過去のバージョンの ファイルを検査できるようになります. しかし, これには大きなディスクスペースが必要になります. どこから入手したいのか? 更新情報をどこから入手するかを cvsup に伝えるために host= フィールドを使用します. CVSup ミラーサイト のどこからでも入手できますが, ネット上での最寄りのサイトを選ぶべきでしょう. この例では, 仮想上の FreeBSD 配布サイト cvsup666.FreeBSD.org を使用します: *default host=cvsup666.FreeBSD.org CVSup を実行する前にホスト名を 実在のものに変更する必要があります. どのように cvsup を実行しても, この設定は を 使用してコマンドラインで変更することができます. 自分のマシンのどこに置きたいのか? prefix= フィールドは, cvsup に受け取ったファイルをどこに置くかを 伝えます. この例では, ソースファイルを直接メインのソースツリー /usr/src に置きます. src ディレクトリはすでにファイルを受け取るために 選択したコレクションで暗黙に指定しているので, これは正しい仕様となります: *default prefix=/usr どこに status ファイルを置きたいのか? CVSup クライアントは base ディレクトリと呼ばれる場所に, ある status ファイルを維持しています. すでに受け取った更新情報を追従し続けることで, これらのファイルは CVSup がより効果的に動作することを支援します. 標準の base ディレクトリ /usr/local/etc/cvsup を使用します: *default base=/usr/local/etc/cvsup supfile に指定がない場合は, この設定をデフォルトで使用しますので, 実際には上の行は必要ありません. base ディレクトリが存在しない場合は作成しておきましょう. base ディレクトリが存在しない場合, cvsup クライアントは実行を拒否します. その他もろもろの supfile の設定: 通常 supfile に入れておくべき行がもう一つあります: *default release=cvs delete use-rel-suffix compress release=cvs は, サーバがメインの FreeBSD CVS リポジトリから その情報を取得するように指示します. ほとんどの場合はこのようにしておきますが, ここでの説明の範疇をこえるような 状況では他の指定をすることも可能です. deleteCVSup にファイルを削除することを許可します. CVSup が ソースツリーを完全に最新の状態に 保てるようにするためには, これは常に 指定しておくべきでしょう. CVSup は, これらの責任範囲のファイルだけを 慎重に削除します. たまたま存在する他の余分なファイルについては, まったく手をつけずに残しておきます. use-rel-suffix は ... 神秘的なものです. これについて本当に知りたい人は, &man.cvsup.1; のマニュアルページをご覧ください. でなければ, 何も考えずに指定してみてください. compress は通信チャネルで gzip 形式の圧縮の使用を有効にします. ご使用のネットワーク接続が T1 speed 以上である場合, この圧縮を使用しない方がよいかもしれません. そうでない場合は十分に役に立ちます. supfile の例のまとめ: 以下は supfile の例の全体です: *default tag=. *default host=cvsup666.FreeBSD.org *default prefix=/usr *default base=/usr/local/etc/cvsup *default release=cvs delete use-rel-suffix compress src-all 拒否ファイル(refuse file) 既に述べたように, CVSup取り寄せ法(pull method)を用いるのですが, これは基本的に次のようなことを意味します. まずあなたが CVSup サーバに接続します. するとサーバは あなたがダウンロードできるのはこれこれですと言います. それに対し, あなたが使っているクライアントは わかりました. では, これとこれとこれをもらいますと答えます. デフォルトの設定の CVSup クライアントは, 設定ファイルで選んだコレクションとタグに適合する すべてのファイルを取得します. しかし, これは常にあなたの望む動作と一致するとは限りません. 特に doc や ports や www のツリーを同期させる場合などはそうでしょう. ほとんどの人は四か国語も五か国語も操れるわけではありませんから, 特定の言語のファイルのダウンロードは必要ないでしょう. Ports コレクションを CVSup で取得する場合には, 各コレクションを個別に指定することができます (たとえば, 単に ports-all とするかわりに ports-astrology, ports-biology などと書きます). 一方, doc と www のツリーは言語別のコレクションになっていません. そこであなたは CVSup のたくさんある洗練された機能の一つ, 拒否ファイル(refuse file) 機能を使う必要があります. 拒否ファイル(refuse file)CVSup に対し, コレクションに含まれる一部のファイルを取得することを伝えます. 言い換えれば, それはクライアントに対し, サーバから来る一部のファイルを拒否するよう指定するということです. 拒否ファイルは base/sup/refuse にあります(もしファイルがない場合には作成してください). base は supfile 内で定義されています. デフォルトでは /usr/local/etc/cvsup です. つまり, 拒否ファイルのデフォルトは /usr/local/etc/cvsup/sup/refuse ということになります. 拒否ファイルの書式は, 単にダウンロードしたくないファイルや ディレクトリの名前が書いてあるだけの非常にシンプルなものです. たとえば, 英語以外にはドイツ語を少し話せるだけの人で, ドイツ語のアプリケーションを必要と感じなければ 以下のような拒否ファイルが考えられます. ports/chinese ports/german ports/japanese ports/korean ports/russian ports/vietnamese doc/es_ES.ISO8859-1 doc/ja_JP.eucJP 他の言語についても同様です. 拒否ファイルの中ではリポジトリの名前が ディレクトリの先頭部分に対応することに注意してください. この実に便利な機能を使うと まったく必要としないファイルをダウンロードする必要がなくなり, インターネット接続の回線が遅かったり従量制で課金されている人は 貴重な時間を節約できるようになります. 拒否ファイルの詳細や CVSup が持つその他の便利な機能に関しては マニュアルページを参照してください. <application>CVSup</application> の実行 さて, 更新の準備ができました. これを実行するコマンドラインは実に簡単です: &prompt.root; cvsup supfile もちろん, ここでの supfile は作成したばかりの supfile のファイル名です. X11 環境で実行するものと仮定して, cvsup は 通常の操作に必要なボタンを持つ GUI ウィンドウを表示します. go ボタンを押して, 実行を監視してください. この例では実際の /usr/src ツリーを更新しているので, cvsup にファイルを更新するのに必要なパーミッションを与えるために, ユーザ root で実行する必要があります. コンフィグレーションファイルを作ったばかりで, しかも以前にこのプログラムを実行したことがないので, 神経質になるのは無理もない話だと思います. 大切なファイルに触らずに試しに実行する簡単な方法があります. どこか適当な場所に空のディレクトリを作成して, コマンドラインの引数で指定するだけです: &prompt.root; mkdir /var/tmp/dest &prompt.root; cvsup supfile /var/tmp/dest 指定したディレクトリは, すべての更新されるファイルの 更新先ディレクトリとして使用します. CVSup/usr/src の下のファイルを検査しますが, 変更や削除はまったくおこないません. かわりに /var/tmp/dest/usr/src に更新されたすべてのファイルが置かれるようになります. この方法で実行した場合は, CVSup は base ディレクトリの status ファイルを更新せずにそのままにします. これらのファイルの新しいバージョンは指定されたディレクトリ に書き込まれます. /usr/src の読み取り許可がある限り, このような試し実行のためにユーザ root になる必要はありません. X11 を利用していないとか単に GUI が気に入らない場合は, cvsup 起動時にコマンドラインに 二つほどオプションを追加する必要があります: &prompt.root; cvsup -g -L 2 supfile オプションは CVSup に GUI を使用しないように伝えます. X11 を利用していない場合には自動的に指定されますが, そうでない場合は 明示的に指定します. オプションは cvsup にファイル更新中の詳細情報をプリントアウト するように伝えます. 冗長性には から までの三つのレベル があります. デフォルトは 0 であり, エラーメッセージ以外はまったく出力 しません. たくさんの他のオプション変数があります. それらの簡単な一覧は cvsup -H で表示されます. より詳しい説明はマニュアルページをご覧ください. 動作している更新の方法に満足したら, &man.cron.8; を使って CVSup を定期的に 実行させる準備をすることができます. cron から起動する際には, 明示的に CVSup が GUI を使わないようにする必要があります. <application>CVSup</application> ファイルコレクション CVSup 経由で入手できるファイルコレクションは 階層的に組織化されています. いくつか大きなコレクションがあり, それらは小さなサブコレクションに 分割されています. 大きなコレクションは, そのサブコレクション毎に 受信することと同じことになります. 下の一覧ではコレクション間の階層関係を 字下げして表現します. 最も一般的に使用するコレクションは src-all, ports-all です. 他のコレクションは特別な目的を持つ人達だけが使用しており, ミラーサイトはそれらのすべてを 持っていないかもしれません. cvs-all release=cvs メインの FreeBSD CVS リポジトリであり, 暗号のコードを含んでいます. distrib release=cvs FreeBSD の配布とミラーに関連するファイルです. doc-all release=cvs FreeBSD ハンドブックおよびその他のドキュメントの ソースです. ports-all release=cvs FreeBSD の Ports コレクションです. ports-archivers release=cvs アーカイビングのツール. ports-astro release=cvs 天文学関連の ports. ports-audio release=cvs サウンドサポート. ports-base release=cvs /usr/ports のトップにあるその他のファイル. ports-benchmarks release=cvs ベンチマークプログラム. ports-biology release=cvs 植物学関連のプログラム. ports-cad release=cvs CAD ツール. ports-chinese release=cvs 中国語サポート. ports-comms release=cvs 通信ソフトウェア. ports-converters release=cvs 文字コードコンバータ. ports-databases release=cvs データベース. ports-deskutils release=cvs コンピュータが発明される前に 卓上で使われていたものたち. ports-devel release=cvs 開発ユーティリティ. ports-editors release=cvs エディタ. ports-emulators release=cvs 他の OS のエミュレータ. ports-ftp release=cvs FTP クライアントとサーバ. ports-games release=cvs ゲーム. ports-german release=cvs ドイツ語サポート. ports-graphics release=cvs グラフィックユーティリティ. ports-irc release=cvs インターネットリレーチャット(IRC)用のユーティリティ ports-japanese release=cvs 日本語サポート. ports-java release=cvs Java ユーティリティ ports-korean release=cvs 韓国語サポート. ports-lang release=cvs プログラミング言語. ports-mail release=cvs メールソフトウェア. ports-math release=cvs 数値計算ソフトウェア. ports-mbone release=cvs MBone アプリケーション. ports-misc release=cvs 色々なユーティリティ. ports-net release=cvs ネットワーキングソフトウェア. ports-news release=cvs USENET ニュースのソフトウェア. ports-palm release=cvs 3Com Palm(tm) シリーズ用ソフトウェア. ports-print release=cvs 印刷ソフトウェア. ports-russian release=cvs ロシア語サポート. ports-security release=cvs セキュリティユーティリティ. ports-shells release=cvs コマンドラインシェル. ports-sysutils release=cvs システムユーティリティ. ports-textproc release=cvs 文書処理ユーティリティ (デスクトップパブリッシングは含まない). ports-vietnamese release=cvs ベトナム語サポート. ports-www release=cvs World Wide Web 関連のソフトウェア. ports-x11 release=cvs X window システムをサポートする ports. ports-x11-clocks release=cvs X11 上で動作する時計の数々. ports-x11-fm release=cvs X11 上で動作するファイラ. ports-x11-fonts release=cvs X11 のフォントとフォントユーティリティ. ports-x11-toolkits release=cvs X11 のツールキット. ports-x11-servers 各種 X11 サーバ ports-x11-wm release=cvs X11 のウィンドウマネージャ. src-all release=cvs メインの FreeBSD ソース群であり, 暗号のコードを含んでいます. src-base release=cvs /usr/src のトップにあるその他のファイル. src-bin release=cvs シングルユーザモードで必要な ユーザユーティリティ (/usr/src/bin). src-contrib release=cvs FreeBSD プロジェクト外部からの ユーティリティおよびライブラリ, 比較的無修正 (/usr/src/contrib). src-crypto release=cvs FreeBSD プロジェクトの外部で開発された暗号ユーティリティとライブラリ. ほとんどそのままの形で使われます. (/usr/src/crypto). src-eBones release=cvs Kerberos と DES (/usr/src/eBones). 現在の FreeBSD リリースでは使われていません. src-etc release=cvs システムコンフィグレーションファイル (/usr/src/etc). src-games release=cvs ゲーム (/usr/src/games). src-gnu release=cvs GNU Public License 下にあるユーティリティ (/usr/src/gnu). src-include release=cvs ヘッダファイル (/usr/src/include). src-kerberos5 release=cvs Kerberos5 セキュリティパッケージ (/usr/src/kerberos5). src-kerberosIV release=cvs KerberosIV セキュリティパッケージ (/usr/src/kerberosIV). src-lib release=cvs ライブラリ (/usr/src/lib). src-libexec release=cvs システムプログラムであり, 通常は他のプログラムから実行される (/usr/src/libexec). src-release release=cvs FreeBSD の release を構築するために必要なファイル (/usr/src/release). src-secure release=cvs DES (/usr/src/secure). src-sbin release=cvs シングルユーザモード用の システムユーティリティ (/usr/src/sbin). src-share release=cvs 多様なシステム間で共有可能なファイル (/usr/src/share). src-sys release=cvs カーネル (/usr/src/sys). src-sys-crypto release=cvs カーネル用の暗号コード (/usr/src/sys/crypto). src-tools release=cvs FreeBSD の保守用の色々なツール (/usr/src/tools). src-usrbin release=cvs ユーザユーティリティ (/usr/src/usr.bin). src-usrsbin release=cvs システムユーティリティ (/usr/src/usr.sbin). www release=cvs World Wide Web のデータ用のソースです. distrib release=self CVSup サーバ自身のコンフィグレーションファイルです. CVSup ミラーサイトが使用します. gnats release=current GNATS バグトラッキングデータベースです. mail-archive release=current FreeBSD 関連メーリングリストのアーカイブ. www release=current インストールされた World Wide Web のデータです. WWW ミラーサイトが使用します. 詳細について CVSup の FAQ や CVSup に関するその他の情報については The CVSup Home Page をご覧ください. CVSup のほとんどの FreeBSD 関連の議論は &a.hackers; でおこなわれています. ソフトウェアの新しいバージョンは &a.announce; で アナウンスされます. 質問とバグ報告はプログラムの作者, cvsup-bugs@polstra.com へ 送ってください. CVSup サイト FreeBSD の CVSup サーバは以下のサイトで稼働しています: アルゼンチン cvsup.ar.FreeBSD.org (保守担当 msagre@cactus.fi.uba.ar) オーストラリア cvsup.au.FreeBSD.org (保守担当 dawes@xfree86.org) cvsup3.au.FreeBSD.org (保守担当 FreeBSD@admin.gil.com.au) オーストリア cvsup.at.FreeBSD.org (保守担当 postmaster@wu-wien.ac.at) ブラジル cvsup.br.FreeBSD.org (保守担当 cvsup@cvsup.br.FreeBSD.org) cvsup2.br.FreeBSD.org (保守担当 tps@ti.sk) cvsup3.br.FreeBSD.org (保守担当 camposr@matrix.com.br) カナダ cvsup.ca.FreeBSD.org (保守担当 dan@jaded.net) cvsup2.ca.FreeBSD.org (保守担当 hostmaster@ca.freebsd.org) 中国 cvsup.cn.FreeBSD.org (保守担当 phj@cn.FreeBSD.org) チェコ cvsup.cz.FreeBSD.org (保守担当 cejkar@dcse.fee.vutbr.cz) デンマーク cvsup.dk.FreeBSD.org (保守担当 jesper@skriver.dk) エストニア cvsup.ee.FreeBSD.org (保守担当 taavi@uninet.ee) フィンランド cvsup.fi.FreeBSD.org (保守担当 count@key.sms.fi) cvsup2.fi.FreeBSD.org (保守担当 count@key.sms.fi) フランス cvsup.fr.FreeBSD.org (保守担当 hostmaster@fr.FreeBSD.org) cvsup2.fr.FreeBSD.org (保守担当 ftpmaint@uvsq.fr) ドイツ cvsup.de.FreeBSD.org (保守担当 rse@freebsd.org) cvsup1.de.FreeBSD.org (maintainer (保守担当 wosch@FreeBSD.org) cvsup2.de.FreeBSD.org (保守担当 cvsup@nikoma.de) cvsup3.de.FreeBSD.org (保守担当 ag@leo.org) cvsup4.de.FreeBSD.org (保守担当 cvsup@cosmo-project.de) cvsup5.de.FreeBSD.org (保守担当 rse@freebsd.org) ギリシャ cvsup.gr.FreeBSD.org (保守担当 ftpadm@duth.gr) cvsup2.gr.FreeBSD.org (保守担当 paschos@cs.uoi.gr) アイスランド cvsup.is.FreeBSD.org (保守担当 adam@veda.is) アイルランド cvsup.ie.FreeBSD.org (保守担当 dwmalone@maths.tcd.ie), トリニティ大学, ダブリン 日本 cvsup.jp.FreeBSD.org (保守担当 cvsupadm@jp.FreeBSD.org) cvsup2.jp.FreeBSD.org (保守担当 max@FreeBSD.org) cvsup3.jp.FreeBSD.org (保守担当 shige@cin.nihon-u.ac.jp) cvsup4.jp.FreeBSD.org (保守担当 cvsup-admin@ftp.media.kyoto-u.ac.jp) cvsup5.jp.FreeBSD.org (保守担当 cvsup@imasy.or.jp) cvsup6.jp.FreeBSD.org (保守担当 cvsupadm@jp.FreeBSD.org) 韓国 cvsup.kr.FreeBSD.org (保守担当 cjh@kr.FreeBSD.org) cvsup2.kr.FreeBSD.org (保守担当 holywar@mail.holywar.net) リトアニア cvsup.lt.FreeBSD.org (保守担当 domas.mituzas@delfi.lt) オランダ cvsup.nl.FreeBSD.org (保守担当 xaa@xaa.iae.nl) cvsup2.nl.FreeBSD.org (保守担当 cvsup@nl.uu.net) ノルウェー cvsup.no.FreeBSD.org (保守担当 Per.Hove@math.ntnu.no) ポーランド cvsup.pl.FreeBSD.org (保守担当 Mariusz@kam.pl) ポルトガル cvsup.pt.FreeBSD.org (保守担当 jpedras@webvolution.net) ロシア cvsup.ru.FreeBSD.org (保守担当 ache@nagual.pp.ru) cvsup2.ru.FreeBSD.org (保守担当 dv@dv.ru) cvsup3.ru.FreeBSD.org (保守担当 fjoe@iclub.nsu.ru) cvsup4.ru.FreeBSD.org (保守担当 zhecka@klondike.ru) cvsup5.ru.FreeBSD.org (保守担当 maxim@macomnet.ru) cvsup6.ru.FreeBSD.org (保守担当 pvr@corbina.net) スロヴァキア共和国 cvsup.sk.FreeBSD.org (保守担当 tps@tps.sk) cvsup2.sk.FreeBSD.org (保守担当 tps@tps.sk) スロベニア cvsup.si.FreeBSD.org (保守担当 blaz@si.FreeBSD.org) 南アフリカ cvsup.za.FreeBSD.org (保守担当 markm@FreeBSD.org) cvsup2.za.FreeBSD.org (保守担当 markm@FreeBSD.org) スペイン cvsup.es.FreeBSD.org (保守担当 jesusr@FreeBSD.org) cvsup2.es.FreeBSD.org (保守担当 jesusr@FreeBSD.org) cvsup3.es.FreeBSD.org (保守担当 jose@we.lc.ehu.es) スウェーデン cvsup.se.FreeBSD.org (保守担当 pantzer@ludd.luth.se) cvsup2.se.FreeBSD.org (保守担当 cvsup@dataphone.net) 台湾 cvsup.tw.FreeBSD.org (保守担当 jdli@freebsd.csie.nctu.edu.tw) cvsup2.tw.FreeBSD.org (保守担当 ycheng@sinica.edu.tw) cvsup3.tw.FreeBSD.org (保守担当 foxfair@FreeBSD.org) ウクライナ cvsup2.ua.FreeBSD.org (保守担当 freebsd-mnt@lucky.net) cvsup3.ua.FreeBSD.org (保守担当 ftpmaster@ukr.net), キエフ cvsup4.ua.FreeBSD.org (保守担当 phantom@cris.net) イギリス cvsup.uk.FreeBSD.org (保守担当 joe@pavilion.net) cvsup2.uk.FreeBSD.org (保守担当 brian@FreeBSD.org) cvsup3.uk.FreeBSD.org (保守担当 ftp-admin@plig.net) アメリカ cvsup1.FreeBSD.org (保守担当 skynyrd@opus.cts.cwu.edu), ワシントン州 cvsup2.FreeBSD.org (保守担当 jdp@FreeBSD.org), カリフォルニア州 cvsup3.FreeBSD.org (保守担当 wollman@FreeBSD.org), マサチューセッツ州 cvsup4.FreeBSD.org (保守担当 rgrimes@FreeBSD.org), オレゴン州 cvsup5.FreeBSD.org (保守担当 mjr@blackened.com), アリゾナ州 cvsup6.FreeBSD.org (保守担当 jdp@FreeBSD.org), フロリダ州 cvsup7.FreeBSD.org (保守担当 jdp@FreeBSD.org), ワシントン州 cvsup8.FreeBSD.org (保守担当 hostmaster@bigmirror.com), ワシントン州 cvsup9.FreeBSD.org (保守担当 qbsd@uswest.net), ミネソタ州 cvsup10.FreeBSD.org (保守担当 jdp@FreeBSD.org), カリフォルニア州 cvsup11.FreeBSD.org (保守担当 cvsup@research.uu.net), バージニア州 cvsup12.FreeBSD.org (保守担当 will@FreeBSD.org), インディアナ州 cvsup13.FreeBSD.org (保守担当 dima@valueclick.com), カリフォルニア州 cvsup14.FreeBSD.org (保守担当 freebsd-cvsup@mfnx.net), カリフォルニア州 cvsup15.FreeBSD.org (保守担当 cvsup@math.uic.edu), イリノイ州 cvsup16.FreeBSD.org (保守担当 pth3k@virginia.edu), バージニア州 cvsup17.FreeBSD.org (保守担当 cvsup@mirrortree.com), ワシントン州 AFS サイト FreeBSD の AFS サーバは以下のサイトで稼働しています: スウェーデン ファイルは以下の場所にあります: /afs/stacken.kth.se/ftp/pub/FreeBSD/ stacken.kth.se # Stacken Computer Club, KTH, Sweden 130.237.234.43 #hot.stacken.kth.se 130.237.237.230 #fishburger.stacken.kth.se 130.237.234.3 #milko.stacken.kth.se (保守担当 ftp@stacken.kth.se)
diff --git a/ja_JP.eucJP/books/handbook/printing/chapter.sgml b/ja_JP.eucJP/books/handbook/printing/chapter.sgml index fb2070e7d8..7528eb2f51 100644 --- a/ja_JP.eucJP/books/handbook/printing/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/printing/chapter.sgml @@ -1,5283 +1,5315 @@ プリンタの利用 原作: &a.kelly;, 1995 年 9 月 30 日. 改訂: &a.jim;, 2000 年 3 月 訳: &a.jp.kimura;, 1996 年 9 月 3 日 この章では + LPD スプーリングシステム + 印刷 FreeBSD でプリンタを使用するためには, - バークレイラインプリンタスプーリングシステム + バークレーラインプリンタスプーリングシステム (LPD スプーリングシステムとしても知られています) が機能するようにプリンタをセットアップする必要があります. 本章では設定例を通して, LPD スプーリングシステム (大抵の場合, 単に LPD と呼ばれる) について紹介します. もし, LPD や他のプリンタスプーリングシステムについてすでに詳しい知識をお持ちの方は, スプーリングシステムのセットアップから読み始めても構いません. はじめに LPD はあるホストのプリンタに関する制御の一切を行ないます. ここで言う制御としては, 次のことがあげられます. ホストに接続されたプリンタ, あるいはネットワーク上の他ホストに接続されたプリンタに対するアクセス制御を行ないます. + プリントジョブ ファイルをプリントする要求に対して許可を与えます. この要求は特にジョブと呼ばれています. 各々のプリンタのキューを管理することにより, 複数のユーザがあるプリンタに対して同時にアクセスすることを防ぎます. ヘッダページ (バナーまたは バーストページとしても知られています) をプリントすることができます. これにより, プリントアウトの山の中から自分がプリントしたジョブを見つけやすくなります. シリアルポートに接続したプリンタ用に通信パラメータを管理します. ネットワーク経由で他のホスト上の LPD スプーラにジョブを送ることができます. 様々なプリンタ言語やプリンタの能力に応じてジョブの形式を整えるため, 特別なフィルタを起動することができます. プリンタの使用に対して課金を行なうことができます. 設定ファイルを通して, あるいは特別なフィルタプログラムを用いることにより, 多種多様なプリンタ機器に対して, 上述の機能の全部または一部を LPD システムに行なわせることができます. どうしてスプーラを使うべきなのか あなたのシステムを利用するのがあなた一人だけだとしたら, アクセス制御もヘッダページも プリンタ利用に対する課金も必要ないのに, なぜわざわざスプーラに煩わされなければならないのか疑問に思うかも知れません. プリンタに対する直接アクセスを許可することもできるのですが, とにかくスプーラを使用するべきです. その理由は, LPD はジョブをバックグラウンドで処理します. データがプリンタに送信されるまで待つ必要がなくなります. + TeX LPD ではジョブをフィルタを通してプリントすることが簡単にできます. これにより, 印刷物のヘッダに時刻や日付を入れたり, 特別なファイル形式 (TeX の DVI ファイルなど) をプリンタが処理できる形式に変更することができ, これらの作業を手動で行なう必要がなくなります. プリント処理を行なうフリー, または商用のプログラムのほとんどは, システムのスプーラとやりとりするように作られています. スプーリングシステムをセットアップすることで, 今後加えるかもしれない, あるいは, すでに持っている別のソフトウェアをより簡単にサポートすることができるでしょう. 基本的なセットアップ LPD スプーリングシステムを用いてプリンタを使用するためには, プリンタ機器と LPD 用ソフトウェアの両方を準備する必要があります. 本文書では次の二段階のレベルに分けて説明をします. プリンタを接続する方法, プリンタにどのように通信するかを LPD に指示する方法や, プレインテキストをプリンタで印字する方法については, プリンタの簡単な設定をご覧ください. 様々な形式のファイルを印字する方法, ヘッダページを印字する方法, ネットワーク経由でプリンタに印字する方法, プリンタを制御する方法, プリンタの使用に対する課金を行なう方法についてはプリンタ設定 上級編をご覧ください. プリンタ設定導入編 この節では, プリンタ機器やプリンタを使用するための LPD 用ソフトウェアを設定する方法について述べます. この節の概要は次のとおりです. プリンタ機器の設定では, プリンタをコンピュータに接続するためのヒントがいくつか書かれています. ソフトウェアの設定では, LPDのスプーラ設定ファイル /etc/printcap の設定方法について書かれています. - データをプリンタに送るためにシリアルまたはパラレルインタフェー スではなく, + データをプリンタに送るためにシリアルまたはパラレルインタフェースではなく, ネットワークプロトコルを使用する場合は, ネットワークにおけるデータストリームインタフェースを持つプリンタをご覧ください. この節のタイトルはプリンタ設定導入編ですが, 実際の設定はかなり複雑です. プリンタをコンピュータに接続し, - LPD スプーラを 起動させることは一番困難な作業です. + LPD スプーラを起動させることは一番困難な作業です. ヘッダページを出力させたり課金したりするオプションの設定は, 一度プリンタがうまく動くようになればとても簡単です. プリンタ機器の設定 この節では, プリンタに PC を接続するための様々な方法について説明しています. ここでは, ポートやケーブルの種類, FreeBSD がプリンタとの通信に必要なカーネルコンフィグレーションについても言及しています. もしプリンタが既に接続されていて, 他のオペレーティングシステム上でプリンタからの印字に成功している場合は, ソフトウェアの設定まで読み飛ばすことが多分できるでしょう. ポートとケーブル 最近の PC 用のプリンタほとんどには次のインタフェースの一つもしくは両方がついています. + + プリンタ + シリアル + シリアルインタフェースでは, プリンタにデータを送信するためにコンピュータにあるシリアルポートが使用されます. シリアルインタフェースはコンピュータ業界で共通して使用されています. そのケーブルは容易に手に入りますし, 簡単に自作することもできます. シリアルインタフェースの場合は時々, 特別なケーブルや何か複雑な通信方式選択の設定が必要になることがあります. + + プリンタ + パラレル + パラレルインタフェースではプリンタにデータを送信するために, コンピュータにあるパラレルポートを使用します. パラレルインタフェースは PC 業界では良く使われます. ケーブルの入手は容易ですが, 自作するのはシリアルよりも困難です. パラレルインタフェースには通常, 通信方式の選択はなく, 設定は極めて単純です. + + セントロニクス + パラレルプリンタ + パラレルインタフェースはセントロニクスインタフェースとして知られています. これは, プリンタ用のコネクタタイプとして採用された後に名付けられました. シリアルインタフェースはパラレルインタフェースよりも普通はデータの伝送速度が遅くなります. - パラレルインタフェースで は, 通常, + パラレルインタフェースでは, 通常, (コンピュータからプリンタへの) 単方向通信のみを行なうのに対して, シリアルインタフェースは双方向通信を行ないます. FreeBSD でも IEEE1284 準拠のケーブルを使えば, 最近のパラレルポートとプリンタの多くで双方向通信を行なうことができます. + PostScript 通常, プリンタで双方向通信が必要となるのは, プリンタが PostScript 言語に対応しているときだけです. PostScript プリンタは非常に冗長に動作させることができます. 事実, PostScript によるジョブでは, プログラムを本当にプリンタに送信します. このことは, 印字作業を必ずしもする必要がないことを意味しますし, そのプログラムの結果はコンピュータに直接返されるかも知れません. PostScript プリンタでは双方向通信を使って PostScript プログラムのエラーや紙づまりといった問題をコンピュータに報告します. ユーザはそれらの情報を知りたいと思うかも知れません. また, PostScript プリンタで課金作業をもっとも効率よく行なうためには, 双方向通信が必要となります. この方法ではまず, プリンタの現在のページカウント (起動してから今まで何枚の紙を印字したか) の情報を得ます. 次に, ユーザのジョブを実行し, 終了後, 再びページカウントを得ます. この二つの数を差によって, 課金対象となる紙の枚数を知ることができるのです. パラレルポート プリンタをパラレルインタフェースを使って接続する場合は, セントロニクスケーブルでプリンタとコンピュータを接続してください. 詳しい説明はプリンタやコンピュータに付属する説明書に書かれているはずです. その際, どのパラレルポートを使用したかを覚えておいてください. FreeBSDでは最初のポートは /dev/lpt0, 二番目 /dev/lpt1 であ り, 三番目以降も同様に続きます. シリアルポート シリアルインタフェースを使ってプリンタを使う場合は, 適切なシリアルケーブルでプリンタとコンピュータを接続してください. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属する説 明書に書かれているはずです. 適切なシリアルケーブルが良くわからないときは, 次のどれかを試してみてください. モデム用ケーブルでは, それぞれのピンは他方のコネクタの対応するピンと線でつながっています. このタイプのケーブルは DTE-DCE 間ケーブルとしても知られています (訳注: - 日本ではストレートケーブルという名前で売られています). - + 日本ではストレートケーブルという名前で売られています). + ヌルモデム用ケーブル ヌルモデム用ケーブルでは, あるピンは対応するピンとを接続していますが, あるピン (たとえば, データ送信用とデータ受信用のピン) が交差して接続したり, いくつかのピンは内部で短絡していたりします. このタイプのケーブルは, DTE-DTE 間ケーブルと呼ばれています (訳注: 日本ではクロスケーブルという名前で売られています). A シリアルプリンタ用ケーブルは, ある特定のプリンタで必要とされるものです. ヌルモデムケーブルと似ていますが, 内部で短絡させる代わりに, ある信号を他方側に送るために使用しています. + ボーレート + パリティ + フローコントロールプロトコル この他に, プリンタ用の通信パラメータを設定する必要があります. 通常, プリンタのフロントパネルや DIP スイッチによって制御します. コンピュータとプリンタの双方で設定できる最高の通信速度 [bps] (ビット/秒. ボーレートと示されているときもある) を選んでください. そして, データビット (7 または 8), パリティ(偶/奇/なし), ストップビット (1 または 2) を選んでください. そして, フローコントロールの有無 (制御なし, または XON/XOFF (イン・バンド または ソフトウェアフローコントロールとも呼ばれる)) を選びます. 以下に続くソフトウェアの設定のために, ここでの設定を覚えておいてください. ソフトウェアの設定 本節では FreeBSD の LPD スプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています. 本節の概要は次のようになります. - プリンタで使用するポートのために, 必要があれば, カー - ネルの書き変えをおこないます. 「プリンタで使用するポートのために, 必要があれば, + カーネルの書き変えをおこないます. 「カーネルの変更」で, - このためにしなくてはなら ないことを説明しています. + このためにしなくてはならないことを説明しています. - パラレルポートを使用している場合は, パラレルポートの - ための通信モードの設定します. 詳細は, 「パラレルポートを使用している場合は, + パラレルポートのための通信モードの設定します. 詳細は, 「 パラレルポートの通信モードを設定する 」で説明しています. オペレーティングシステムからプリンタにデータが送ら れているかをテストします. 「 - プリンタとの通信状況を調べる」で, どのように - テストするかの提案をいくつかおこなっています. + プリンタとの通信状況を調べる」で, + どのようにテストするかの提案をいくつかおこなっています. ファイル/etc/printcapを変更し, LPDの設定を おこないます. この節で, どのように変更するかを 説明しています. カーネルの変更 オペレーティングシステムのカーネルの - コンパイルをおこなうこと によって, - 指定されたのデバイスが機能するようになります. シリ アル, + コンパイルをおこなうことによって, + 指定されたのデバイスが機能するようになります. シリアル, または, パラレルインタフェースをプリンタで使用する場合, 必要なデバイスがこの指定の中に含まれていなくてはなりません. したがって, - 必要なデバイスがカーネルに組み込まれていない場合, 追 - 加のシリアル, または, パラレルポートをサポートするために, - カー ネルの再コンパイルが必要となるかもしれません. + 必要なデバイスがカーネルに組み込まれていない場合, + 追加のシリアル, または, パラレルポートをサポートするために, + カーネルの再コンパイルが必要となるかもしれません. シリアルポートが現在使用しているカーネルで - サポートされている かどうかを調べるためには, + サポートされているかどうかを調べるためには, 次のように入力します. &prompt.root; dmesg | grep sioN ここで, N はシリアルポートの番号を示し, この番号は0から 始まります. - 次のような出力があった場合, カーネルはそのポー - トをサポートしています. + 次のような出力があった場合, + カーネルはそのポートをサポートしています. sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A パラレルポートが現在使用しているカーネルで - サポートされている かどうかを調べるためには, + サポートされているかどうかを調べるためには, 次のように入力します. &prompt.root; dmesg | grep lptN ここで, N - はパラレルポートの番号を示し, この番号は0から 始まります. - 次のような出力があった場合, カーネルはそのポー - トをサポートしています. + はパラレルポートの番号を示し, この番号は 0 から始まります. + 次のような出力があった場合, + カーネルはそのポートをサポートしています. lpt0 at 0x378-0x37f on isa 上記の出力が得られない場合, プリンタを使うため, - オペレーティ ングシステムにパラレル, または, - シリアルポートを認識し, 使用 できるようにするためには + オペレーティングシステムにパラレル, または, + シリアルポートを認識し, 使用できるようにするためには カーネルを変更する必要があります. シリアルポートをサポートさせるには, 「 FreeBSDカーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, - あ わせて, + あわせて, この節に続く節もご覧ください. ポート用エントリを <filename>/dev</filename> に追加する カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうための - ソフトウェアインタフェース がさらに必要になります. - そのインタフェースは, /dev + ソフトウェアインタフェースがさらに必要になります. + そのインタフェースは, /dev ディレクトリにあるエントリに相当します. /dev エントリにポートを加えるために &man.su.1; コマンドで root になります. suコマンド でパスワードを聞かれたら, ルート用のパスワードを入力し ます. /dev ディレクトリに移動します. &prompt.root; cd /dev 次のように入力します. &prompt.root; ./MAKEDEV port ここで, port は, 作成するポート名です. 1番目 のパラレルポートのときは lpt0 に, 2番目のときは lpt1 になり, 以降同様になります. 1番目のシリア ルポートのときは, ttyd0 に, 2番目のときは ttyd1 になり, これも以降同様となります. - 次を入力し, デバイスのエントリができたか確認し - ます. + 次を入力し, デバイスのエントリができたか確認します. + &prompt.root; ls -l port パラレルポートの通信モードを設定する パラレルインタフェースを使用している場合, FreeBSDでは, 割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監 視させるかのいずれかを選択できます. GENERIC カーネルでは割り込み駆動方式が, デフォルトになっています. この方式では, オペレーティングシ ステムはプリンタがデータを受け付けられるかどうかを調べ るために, IRQ ラインを一つ使用します. 監視方式では, オペレーティングシステムにプ リンタがもっとデータを受け付けられるかどうかを繰り返し 尋ねるように指示します. そして, 受け付けるという応答を 受けたとき, カーネルはさらなるデータを送信します. 割り込み駆動方式は, いくらか高速になりますが, 貴重な IRQ ラインを一つ消費します. うまく機能するものをお使いください. 通信モードを設定するためには2つの方法があります. 1つはカー ネルを変更することで, もう一つは &man.lptcontrol.8; プログラムを使用する方法です. カーネルを設定することによって, 通信モードを変更する. - カーネルコンフィグレーションファイルを変更しま す. + カーネルコンフィグレーションファイルを変更します. lpt0 のエントリを探すか追加してください. 2番目 のパラレルポートを設定するときは, 代わりに lpt1 を使います. 以下, 3番目のポートは lpt2 となってい きます. イベント駆動方式にする場合は, - irq 指 定を追加します. + irq 指定を追加します. device lpt0 at isa? port? tty irq N vector lptintr ここで, N - はパラレルポート用の IRQ 番号で す. + はパラレルポート用の IRQ 番号です. 監視方式を使用する場合は, - irq を追加 してはいけません. + irq を追加してはいけません. device lpt0 at isa? port? tty vector lptintr - ファイルをセーブし, config プログラムを起動 し, - カーネルの構築, インストールをおこないます. そして, リ - ブートしてください. 詳細は, 「ファイルをセーブし, config プログラムを起動し, + カーネルの構築, インストールをおこないます. そして, + リブートしてください. 詳細は, 「 FreeBSDカーネルのコンフィグレーション」を参照 してください. &man.lptcontrol.8; - で通信モードを設定する場合 + で通信モードを設定する場合 lptN をイベント駆動方式に設定する場合は, - 次のように入力します. + 次のように入力します. &prompt.root; lptcontrol -i -u N lptN を監視方式に設定する場合は, 次のように入力します. &prompt.root; lptcontrol -p -u N これらのコマンドを /etc/rc.local ファイルに追加 しておくと, システムをブートする度に通信モードを設定する ことができます. 詳細については, &man.lptcontrol.8; をご覧ください. プリンタとの通信状況を調べる スプーリングシステムの設定に進む前に, オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう. これにより, 印字がうまくいかないと き, プリンタとの通信が問題なのか, スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります. プリンタをテストするためには, プリンタに何かのテキストを送 信してみます. 送信した文字をすぐに印字してくれるプリンタに は, &man.lptest.1; コマンドを使うと有用です. このコマンドは印 字可能な96文字のASCII文字すべてを96行生成します. + PostScript PostScript (または他の言語に対応した) プリンタの場合 は, もっと巧妙なテストが必要になります. 次のような, 簡単な PostScript プログラムを使えば十分でしょう. %!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage 上の PostScript コードはファイルに保存し, 以降の節で例として示されているように利用することができます. + PCL - このドキュメントでプリンタ用言語を参照するとき は, + このドキュメントでプリンタ用言語を参照するときは, PostScript のような言語を仮定しており, Hewlett Packard の PCL は考慮していません. PCL は非常に機能的なの ですが, プレインテキストにエスケープシーケンスを混ぜること ができます. PostScript ではプレインテキストを直接印字 することはできません. - このような種類のプリンタ言語に対して は, + このような種類のプリンタ言語に対しては, 特別な対応をおこなわなければなりません. パラレルポートのプリンタとの接続を調べる + + プリンタ + パラレル + この節では, FreeBSDがパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています. パラレルポートのプリンタをテストするために &man.su.1; コマンドで root になります. プリンタにデータを送ります. プリンタがプレインテキストを印字できる場合, &man.lptest.1; コマンドを使います. - 次のように入力してください. + 次のように入力してください. &prompt.root; lptest > /dev/lptN ここで, N はパラレルポートの番号で, 番号は 0から始まります. プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを送信してください. 次のように入力します. &prompt.root; cat > /dev/lptN そして, 一行一行, プログラムを慎重に入力して 下さい. RETUREN または ENTER キーを入力してしま うと, その行は編集できなくなります. プログラムの 入力が終わったら, CONTROL+Dか, あなたが設定して いるファイル終了のキーを押してください. もしくは, プログラムを入力したファイルがある - 場合は, 次のように入力してください. + 場合は, 次のように入力してください. &prompt.root; cat file > /dev/lptN ここで, file はプログラムが格納されていて, プリンタに送信するファイルの名前です. これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します. シリアルポートのプリンタとの接続を調べる + + プリンタ + シリアル + この節では, FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています. シリアルポートのプリンタをテストするために - - &man.su.1; コマンドで root になります. /etc/remote - ファイルを編集します. 次の エントリを加えてください. + ファイルを編集します. 次のエントリを加えてください. printer:dv=/dev/port:br#bps-rate:pa=parity + bit/秒 + シリアルポート + パリティ ここで, port シリアルポート (ttyd0, ttyd1 など) のデバイスエントリで, bps-rateは プリンタとの通信の転送速度[bit/秒], parityはプリ ンタとの通信で必要とされるパリティ (even, odd, none, zeroのいずれか) を表わしていま す. 次の例は, プリンタをシリアルケーブルでパリティなし, 転送速度 19200bpsで第3番目のシリアルポートに接続した場 合です. printer:dv=/dev/ttyd2:br#19200:pa=none - &man.tip.1; コマンドでプリンタと接続します. 次のよ - うに入力してください. + &man.tip.1; コマンドでプリンタと接続します. + 次のように入力してください. &prompt.root; tip printer これがうまくいかなかった場合は, - /etc/remoteを 編集して, + /etc/remoteを編集して, /dev/ttydN の代わりに /dev/cuaaN を試してみてください. - プリンタにデータを送ります. + プリンタにデータを送ります. プリンタがプレインテキストを印字できる場合, &man.lptest.1; コマンドを使います. - 次のように入力してください. + 次のように入力してください. ~$lptest プリンタが PostScript か他のプリンタ 言語を使用している場合, そのプリンタに簡単なプロ グラムを入力します. 一行一行, プログラムを慎 重に入力してください. - バックスペースキーや他の編 集用のキーは, + バックスペースキーや他の編集用のキーは, プリンタの制御コードに割り当てられ ているかもしれません. プログラムが終了したことを プリンタに伝えるための特別なファイル終了キーを入 力する必要があるかもしれません. PostScript プリンタの場合, CONTROL+Dを入力します. もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください. ~>file ここで, file - はプログラムが格納されている - ファイル名です. - &man.tip.1; コマンドでファイルを送 - 信した後は, ファイル終了を表わすキーを入力する必要 - があります. + はプログラムが格納されているファイル名です. + &man.tip.1; コマンドでファイルを送信した後は, + ファイル終了を表わすキーを入力する必要があります. これで何かがプリントされることでしょう. 印字されたテキ - ストがおかしくても心配しなくても構いません. それについ - ては, 後で修正します. + ストがおかしくても心配しなくても構いません. + それについては, 後で修正します. スプーラに許可を与える: <filename>/etc/printcap</filename> ファイル ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, LPDにプリ ンタへのアクセスを 制御させる設定をおこなう準備が整いました. LPDの設定は /etc/printcap を編集することでおこないます. LPDスプーリングシステムはスプーラが使われる毎にこのファイル を参照します. そのため, ファイルを更新するとすぐにその変更が 反映されます. + + プリンタ + ケイパビリティ + &man.printcap.5; ファイルの書式は簡単です. /etc/printcap の編集はお好みのテキストエディタをお 使いください. このファイルの書式は, /usr/share/misc/termcap/etc/remote といった他のケイパビリティファイルと一致しています. この書式 のついての詳細な情報については &man.cgetent.3; をご覧ください. スプーラの単純な設定法は, 次のステップでおこないます. プリンタに名前 (と簡単な別名2〜3個) を付け, それを /etc/printcap ファイルに記述します. - これについ ては, 「 + これについては, 「 プリンタに名前を付ける」 を参照してください. + ヘッダページ sh の項目を追加することで, - ヘッダページの出 力を禁止します (デフォルトは許可). + ヘッダページの出力を禁止します (デフォルトは許可). これについては, 「 ヘッダページの印字を禁止する」 を参照してください. スプール用のディレクトリを作成し, その位置を sd 項目で指定します. これについては, 「 スプーリングディレクトリの作成」 を参照してください. プリンタを使用するために /dev - エントリを 設定し, /etc/printcap の - lp 項目でそのエ ントリを指定します. + エントリを設定し, /etc/printcap の + lp 項目でそのエントリを指定します. これについては, 「 プリンタデバイスの特定」 を参照してください. プリンタをシリアルポートに接続した場合は, fs, fc, xs, xc - の項目を設定する必要があります. こちらについては, + の項目を設定する必要があります. こちらについては, 「 スプーラのための通信パラメータの設定」 を参照してください. プレインテキスト用の入力フィルタのインストールを おこないます. 「 テキストフィルタのインストール」 を参照してください. &man.lpr.1; コマンドで何かを印字することで設定のテス トをおこないます. 印字してみよう と トラブルシューティング を参照してください. - PostScript プリンタのような, プリンタ言語を - 使用しているプリンタには, プレインテキストを直接印字させる - ことができません. 上にアウトラインを示し, 以下の節で説明す - る簡単な設定方法の説明では, そのようなプリンタを設置してい - る場合は, プリンタが認識できるファイルだけを印字の対象とし - ているという仮定をしています. + PostScript プリンタのような, + プリンタ言語を使用しているプリンタには, + プレインテキストを直接印字させることができません. + 上にアウトラインを示し, + 以下の節で説明する簡単な設定方法の説明では, + そのようなプリンタを設置している場合は, + プリンタが認識できるファイルだけを印字の対象としているという + 仮定をしています. 多くの場合, - 利用者はシステムに設置されているプリンタすべてでプ - レインテキストが印字できることを期待しています. 印字作業を - おこなうために LPD のインタフェースを利用するプログラムでも, + 利用者はシステムに設置されているプリンタすべてで + プレインテキストが印字できることを期待しています. + 印字作業をおこなうために LPD + のインタフェースを利用するプログラムでも, 通常, そのような仮定を置きます. プリンタ言語を使用するプリンタを設置しており, そのプリンタ言語で記述されたジョブと, これに加えて, - プレインテキストのジョブも印字できるよ うにしたいならば, - 上で示した簡単な設定方法に加えて, さら - なる設定をおこなうことを強くお勧めします. すなわち, - 原始的なプ レインテキストから PostScript (もしくは, - 他のプリンタ 言語) + プレインテキストのジョブも印字できるようにしたいならば, + 上で示した簡単な設定方法に加えて, + さらなる設定をおこなうことを強くお勧めします. すなわち, + 原始的なプレインテキストから PostScript (もしくは, + 他のプリンタ言語) に変換するプログラムをインストールしてください. 「 プレインテキストのジョブを PostScript プリンタで印字する」 - で, それをどのようにおこなえばよいのかが - 説明されています. + で, それをどのようにおこなえばよいのかが説明されています. - 訳注: + 訳注 + 日本語を印字したい場合は, プリンタ言語を使用し ていない「日本語プリンタ」についても, - プリンタ固有のエスケー プシーケンスを送る必要があります. + プリンタ固有のエスケープシーケンスを送る必要があります. また, 漢字コードをプリン - タが設定しているものに変換したりする必要があり, 各プリンタ - 毎に, 日本語用のフィルタが必要になります. + タが設定しているものに変換したりする必要があり, + 各プリンタ毎に, 日本語用のフィルタが必要になります. プリンタに名前を付ける 最初の (簡単な) ステップで, プリンタの名前を考えます. - プ リンタには別名をいくつか付けることもできるので, + プリンタには別名をいくつか付けることもできるので, 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく 問題はありません. 少なくとも1つのプリンタには, - /etc/printcap の中 で, + /etc/printcap の中で, lp という別名を持たせるべきでしょう. - この名前は デフォルトのプリンタ名になっています. - ユーザが環境変数 PRINTER を設定しておらず, - かつ, LPDコマンドのコマンドラインでプリ - ンタの名前が指定されていない場合, lp - がデフォルトのプリ ンタ名となり, + この名前はデフォルトのプリンタ名になっています. + ユーザが環境変数 PRINTER を設定しておらず, + かつ, LPDコマンドのコマンドラインで + プリンタの名前が指定されていない場合, lp + がデフォルトのプリンタ名となり, そのプリンタに出力されます. それから, これは共通の慣習ですが, プリンタの最後の別名には, メーカーやモデル名を含むプリンタの完全な名称をつけることに なっています. 名前と別名のいくつかを決めたら, - /etc/printcap ファ イルに設定します. - プリンタ名は一番左のカラムから書き始めま す. - 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに - コロンを置きます. + /etc/printcap ファイルに設定します. + プリンタ名は一番左のカラムから書き始めます. + 別名はそれぞれ縦棒によって区切られ, + 最後の別名の後ろにコロンを置きます. 次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義 されている /etc/printcap のスケルトンを記しています. # # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4: この例では, 最初のプリンタに rattan - という名前と別名 として, line, + という名前と別名として, line, diablo, lp そして Diablo 630 Line Printer が付けられています. 別名とし て lp があるので, このプリンタはデフォルトのプリンタとなっ - ています. 2番目は bamboo と名付けられ, - 別名として, ps と + ています. 2 番目は bamboo と名付けられ, + 別名として, psPS, S, panasonic, Panasonic KX-P4455 - PostScript v51.4 が付けられていま す. + PostScript v51.4 が付けられています. ヘッダページの印字を禁止する + + 印刷 + ヘッダページ + LPDスプーリングシステムでは, - デフォルトでジョブ毎にヘッ - ダページを印字します. - ヘッダページにはジョブを要求したユー ザ名, + デフォルトでジョブ毎に + ヘッダページを印字します. + ヘッダページにはジョブを要求したユーザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 - らしい大きな文字で印字されています. 残念なことに, この余分 - なテキストすべてが, - 簡単なプリンタ設定法のデバッグの際に紛れ - 込んできてしまいます. このため, ヘッダページの出力を禁止し - ておきます. + らしい大きな文字で印字されています. + 残念なことに, この余分なテキストすべてが, + 簡単なプリンタ設定法のデバッグの際に紛れ込んできてしまいます. + このため, ヘッダページの出力を禁止しておきます. ヘッダページの出力を禁止するには, /etc/printcap にあるプリンタのエントリに sh の項目を追加します. 次 に, sh を加えた /etc/printcap の例を示します. # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: この書式を正しく使うための注意をしておきます. - 最初の行は左 端のカラムから始まります. それに続く行は TAB - ひとつ分だけ 字下げします. 最後の行以外のすべての行は, - 行末にバックスラッ シュを記述します. + 最初の行は左端のカラムから始まります. それに続く行は TAB + ひとつ分だけ字下げします. 最後の行以外のすべての行は, + 行末にバックスラッシュを記述します. スプーリングディレクトリの作成 + プリンタスプール + プリントジョブ スプーラの簡単な設定の次のステップでは, - スプーリン - グディレクトリを作成します. - プリンタに送られるジョブ は, - その印字が終了するまでこのディレクトリに置かれます. また, - 他のたくさんのスプーラもこのディレクトリにファイ - ルを置きます. + スプーリングディレクトリを作成します. + プリンタに送られるジョブは, + その印字が終了するまでこのディレクトリに置かれます. また, + 他のたくさんのスプーラもこのディレクトリにファイルを置きます. 様々な事情によりスプーリングディレクトリは, 通常, 慣例 として /var/spool の下に置きます. - また, スプーリングディレクトリの内容はバックアップをす - る必要はありません. + また, スプーリングディレクトリの内容は + バックアップをする必要はありません. &man.mkdir.1; によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します. - スプーリングディレクトリの名前は, これも慣例ですが, 次 - のようにプリンタの名前と同じにします. + スプーリングディレクトリの名前は, これも慣例ですが, + 次のようにプリンタの名前と同じにします. &prompt.root; mkdir /var/spool/printer-name しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ rattan と - bamboo につい て, この方式を採用すると, + bamboo について, この方式を採用すると, 次のようになります. &prompt.root; mkdir /var/spool/lpd &prompt.root; mkdir /var/spool/lpd/rattan &prompt.root; mkdir /var/spool/lpd/bamboo 各ユーザが印字するジョブのプライバシを守りた いと考えているならば, スプーリングディレクトリを保護し て, これを誰からでもアクセスできないようにしたいと思う かもしれません. スプーリングディレクトリは, deamon ユー ザと daemon グループに所有され, 読み込み, 書き込み, 検 索可能であり, 他からはアクセスできないようにするべきで す. 例題のプリンタに対して, 次のようにすることにしましょ う. &prompt.root; chown daemon:daemon /var/spool/lpd/rattan &prompt.root; chown daemon:daemon /var/spool/lpd/bamboo &prompt.root; chmod 770 /var/spool/lpd/rattan &prompt.root; chmod 770 /var/spool/lpd/bamboo 最後に, /etc/printcap ファイルで, これらのディ レクトリの位置を LPD に伝える必要があります. スプーリ ングディレクトリのパス名は sd 項目で指定します. # # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo: プリンタ名が最初のカラムから始まっており, そのプリンタ に関して記述される他のエントリは TAB で字下げされてい ること, 各行がバックスラッシュで終わっていることに注意 してください. sd によりスプーリングディレクトリが指定されていな い場合, スプーリングシステムは /var/spool/lpd デフォルト値として使用します. プリンタデバイスの特定 ポート用エントリを /dev に追加する」では, FreeBSD でプリン タとの通信に使用される /dev - ディレクトリ内の エントリを特定します. そして, LPD - にその情報を伝えま す. 印字するジョブを受け取ると, + ディレクトリ内のエントリを特定します. そして, LPD + にその情報を伝えます. 印字するジョブを受け取ると, スプーリングシステムは, (プリンタにデータを渡す義務がある) フィルタプログラムに 代わって指定されたデバイスをオープンします. /etc/printcap ファイルで lp 項目を使って /dev エントリを記入します. ここでの例では, rattan - は1番目のシリアルポートに, bamboo - は6番目のシリアルポートに接続されているこ とにしましょう. + は1番目のシリアルポートに, bamboo + は6番目のシリアルポートに接続されていることにしましょう. このとき, /etc/printcap には 次のようになります. # # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5: /etc/printcap でプリンタの lp 項目が指定 されていない場合は, LPD - はデフォルトとして /dev/lp - を使用します. /dev/lp は, 現在の + はデフォルトとして /dev/lp + を使用します. /dev/lp は, 現在の FreeBSD には存在していません. 設置したプリンタがパラレルポートに 接続されている場合は, 「 テキストフィルタのインストール」 まで読み飛ばしてください. そうでない場合は, 次節の説明に続いてください. スプーラのための通信パラメータの設定 + + プリンタ + シリアル + - シリアルポートにプリンタを接続した場合, プリンタにデー - タを送信するフィルタプログラムに代わり, 通信速度やパリ - ティ, その他のシリアル通信パラメータを設定することがで - きます. このことによる利点は, + シリアルポートにプリンタを接続した場合, + プリンタにデータを送信するフィルタプログラムに代わり, + 通信速度やパリティ, + その他のシリアル通信パラメータを設定することができます. + このことによる利点は, /etc/printcap - を編集するだけで, 様々な - 通信パラメータを試してみることができます. フィルタプロ - グラムを再コンパイルする必要はありません. + を編集するだけで, + 様々な通信パラメータを試してみることができます. + フィルタプログラムを再コンパイルする必要はありません. - スプーリングシステムで, シリアル通信の設定が異 - なっているかもしれない複数のプリンタに同じフィルタプロ - グラムを使うことが可能になります. + スプーリングシステムで, + シリアル通信の設定が異なっているかもしれない複数のプリンタに + 同じフィルタプログラムを使うことが可能になります. 次の /etc/printcap の項目で, - lp で指定 - されたデバイスのシリアル通信 - パラメータを制御できます. + lp で指定された + デバイスのシリアル通信パラメータを制御できます. br#bps-rate デバイスの通信速度を bps-rate に設定します. ここ で, bps-rate は 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400[bit/秒] のいずれかです. fc#clear-bits デバイスをオープンした後で, sgttyb 構造体の clear-bits フラグビットをクリアします. fs#set-bits sgttyb 構造体の clear-bits - フラグビットをセッ トします. + フラグビットをセットします. xc#clear-bits デバイスをオープンした後で, ローカルモードビット clear-bits をクリアします. xs#set-bits ローカルモードビット set-bits をセットします. fc, fs, xc, そして xs - のビットに関 する詳しい情報については, + のビットに関する詳しい情報については, /usr/include/sys/ioctl_compat.h - を参照してく ださい. + を参照してください. 項目 lp で指定されたデバイスを LPD - がオープンする とき, LPD は sgttyb - 構造体のフラグビットを読み出 します. そして, 項目 - fc の全ビットをクリアします. 次に, + がオープンするとき, LPD は sgttyb + 構造体のフラグビットを読み出します. そして, 項目 + fc の全ビットをクリアします. 次に, 項目 fs のビットをセットし, - その結果を設定 します. + その結果を設定します. ローカルモードビットに関しても同様におこなわれます. - 例題のプリンタで6番目のシリアルポートに接続されたプリ - ンタの設定を追加してみましょう. 通信速度は38400bpsに設 - 定します. フラグビットとして, TANDEM, ANYP, LITOUT, + 例題のプリンタで6番目のシリアルポートに接続された + プリンタの設定を追加してみましょう. + 通信速度は38400bpsに設定します. + フラグビットとして, TANDEM, ANYP, LITOUT, FLUSHO, PASS8 をセットします. ローカルモードビットでは, LITOUT と PASS8 フラグをセットします. bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000c1:xs#0x820: テキストフィルタのインストール + プリントフィルタ ここまでで, プリンタにジョブを送るために使うテキストフィ ルタを LPD - に設定する準備が整いました. テキストフィ - ルタとは, + に設定する準備が整いました. + テキストフィルタとは, 入力フィルタとしても知られていますが, - 印字するジョブがあるときに LPD が起動するプログラムで す. - LPD がプリンタのためにテキストフィルタを起動する とき, LPD - はフィルタの標準入力からプリントするジョブ を入力し, - フィルタの標準出力に項目 lp で指定され - たプリンタデバイスを接続します. フィルタは, 標準入力か - らジョブを読み込み, プリンタのための必要な変換をおこなった - 後, その結果を標準出力に出力する, これにより印字がなさ - れることを期待されています. テキストフィルタについての - 更に詳しい情報については, 「lp + で指定されたプリンタデバイスを接続します. フィルタは, + 標準入力からジョブを読み込み, + プリンタのための必要な変換をおこなった後, + その結果を標準出力に出力する, + これにより印字がなされることを期待されています. + テキストフィルタについての更に詳しい情報については, 「 フィルタはどのように機能しているか」 をご覧ください. ここでの簡単なプリンタ設定では, - プリンタにジョブを送るため, /bin/cat - を実行するだけの簡単なシェルスクリプ トで間に合います. - FreeBSD に標準で付属している lpf - というフィルタでは, バックスペース文字を使っ - た下線引きの動作をおこなう文字ストリームをうまく扱うことが - できないプリンタのための代替処理をおこなってくれます. + プリンタにジョブを送るため, /bin/cat + を実行するだけの簡単なシェルスクリプトで間に合います. + FreeBSD に標準で付属している lpf + というフィルタでは, バックスペース文字を使った + 下線引きの動作をおこなう文字ストリームをうまく扱うことができない + プリンタのための代替処理をおこなってくれます. もちろん, 他のどんなフィルタプログラムを使っても構いません. フィルタ lpf については, 「テキストフィルタ lpf」で詳しく説明します. 最初に, 簡単なテキストフィルタであるシェルスクリプト /usr/local/libexec/if-simple - を作ってみましょ う. + を作ってみましょう. 次のテキストをお好みのテキストエディタでファイルに 書き込んでください. #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2 - そして, このファイルを実行可能にします. + そして, このファイルを実行可能にします. &prompt.root; chmod 555 /usr/local/libexec/if-simple LPD にこのテキストフィルタを使うことを設定するためには, /etc/printcap に - if 項目を使って指定しま す. これまでの - /etc/printcap の例のプリンタ 2台に, - このフィルタを加えてみましょう. + if 項目を使って指定します. これまでの + /etc/printcap の例のプリンタ 2 台に, + このフィルタを加えてみましょう. # # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\ :if=/usr/local/libexec/if-simple: LPD を起動します &man.lpd.8; は lpd_enable 変数に従って - /etc/rc から実行されます. この変数の - デフォルト値は NO です. まだ + /etc/rc から実行されます. この変数の + デフォルト値は NO です. まだ そうしていなかったならば lpd_enable="YES" の行を /etc/rc.conf に追加して 計算機を再起動するか, そのまま &man.lpd.8; を 起動してください. &prompt.root; lpd 印字してみよう 簡単な LPD 設定も終わりにたどり着きました. 残念ながら, 設定はこれでおしまいというわけではありません. なぜなら, - さらに, 設定をテストし, すべての問題点を解決しなくては - ならないからです. 設定をテストするために, 何かを印字し - てみましょう. LPD システムで印字をするためには, - &man.lpr.1; コマンドを使います. このコマンドは, 印字する - ためのジョブを投入する働きをします. + さらに, 設定をテストし, + すべての問題点を解決しなくてはならないからです. + 設定をテストするために, + 何かを印字してみましょう. LPD システムで印字をするためには, + &man.lpr.1; コマンドを使います. このコマンドは, + 印字するためのジョブを投入する働きをします. &man.lpr.1; コマンドを 「 プリンタとの通信状況を調べる」で紹介した, あるテスト用のテキストを生成してくれる &man.lptest.1; プログラムと一緒に使うこともできます. 簡単な LPD 設定をテストするために: 次のように入力してください. &prompt.root; lptest 20 5 | lpr -Pprinter-name ここで, printer-name/etc/printcap で指定したプリンタ名 (もしくはその別名) です. デフォルト のプリンタを使用する場合は, 引数を付けないで - &man.lpr.1; を打ち込んでください. もう一度述べますが, ポス - トスクリプトを期待しているプリンタをテストするならば, - &man.lptest.1; を使う代わりに PostScript で書かれたプ - ログラムをプリンタに送ってください. プログラムを送るた - めには, プログラムをファイルに格納して, lpr - file + &man.lpr.1; を打ち込んでください. もう一度述べますが, + ポストスクリプトを期待しているプリンタをテストするならば, + &man.lptest.1; を使う代わりに PostScript で書かれた + プログラムをプリンタに送ってください. + プログラムを送るためには, プログラムをファイルに格納して, + lpr file と打ち込みます. - PostScript プリンタの場合, 送信したプログラムによ - る結果が得られるでしょう. + PostScript プリンタの場合, + 送信したプログラムによる結果が得られるでしょう. &man.lptest.1; を使った場合は, 以下のような結果が見られるでしょう. !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678 - 更にプリンタをテストしたい場合は, (言語ベースのプリン - タのための) もっと大きなプログラムを送信するか, 引数を - 変えて + 更にプリンタをテストしたい場合は, + (言語ベースのプリンタのための) もっと大きなプログラムを送信するか, + 引数を変えて &man.lptest.1; を実行します. 例えば, lptest - 80 60 で それぞれ80文字の行を60 + 80 60 で, それぞれ 80 文字の行を 60 行生成します. プリンタがうまく動かなかった場合は, 次の節, 「 トラブルシューティング」をご覧ください. プリンタ設定上級編 この節では, 特殊な形式のファイルを印字するためのフィルタ, ヘッダページ, ネットワーク越しのプリンタへの印字, そして, - プリンタ 使用の制限や課金について説明しています. + プリンタ使用の制限や課金について説明しています. フィルタ - - LPD では, ネットワークプロトコル, キュー, アクセス制御, そ - して, 印字のためのその他の側面について扱いますが, - 実際の 作業のほとんどは - フィルタ によっておこなわれています. - フィルタ は, プリンタと通信し, - プリンタのデバイス依存性や特殊な要求を扱 うプログラムです. - 簡単なプリンタ設定では, プレインテキストのた - めのフィルタをインストールしました. このプレインテキストフィル - タは, ほとんどのプリンタで機能する極めて単純なものでした. + プリントフィルタ + + LPD では, ネットワークプロトコル, キュー, アクセス制御, + そして, 印字のためのその他の側面について扱いますが, + 実際の作業のほとんどは + フィルタ よっておこなわれています. + フィルタは, プリンタと通信し, + プリンタのデバイス依存性や特殊な要求を扱うプログラムです. + 簡単なプリンタ設定では, + プレインテキストのためのフィルタをインストールしました. + このプレインテキストフィルタは, + ほとんどのプリンタで機能する極めて単純なものでした. (「 テキストフィルタのインストール」を参照) しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖, など をうまく利用するためには, フィルタがどのように機能するかという - ことを理解しておくべきです. これらの側面を扱うためには, 最終的 - には, フィルタの責任であるからです. そして, これは悪い情報です - が, ほとんどの場合において, - あなた自身がフィルタを供給す - る必要があるということです. また都合のよいことには, - たくさんのフィルタが 一般的に利用できるということです. - もしフィルタがなかったとし ても, 普通は, - フィルタを作るのは簡単です. + ことを理解しておくべきです. これらの側面を扱うためには, + 最終的には, フィルタの責任であるからです. + そして, これは悪い情報ですが, ほとんどの場合において, + あなた自身が + フィルタを供給する必要があるということです. また都合のよいことには, + たくさんのフィルタが一般的に利用できるということです. + もしフィルタがなかったとしても, + 普通はフィルタを作るのは簡単です. FreeBSD にも, プレインテキストを印字させることができる /usr/libexec/lpr/lpf というフィルタが1つ付いています. - (このフィルタはファイルに含まれるバックスペースやタブを扱いま - す. また, 課金をすることもできますが, できることはこれだけしか - ありません.) いくつかのフィルタとフィルタの構成要素は + (このフィルタはファイルに含まれるバックスペースやタブを扱います. + また, 課金をすることもできますが, + できることはこれだけしかありません.) + いくつかのフィルタとフィルタの構成要素は FreeBSD Ports Collection にもあります. この節で述べることは次の通りです. フィルタはどのように機能しているか」では, 印字の過程におけ るフィルタの役割を概説します. - この節を読むことで, LPD がフィルタを使うときに, - 見えないところで何が起こっている - かが理解できるでしょう. このことを知っておくと, プリン - タそれぞれに様々なフィルタをインストールしたときに遭遇 - するかもしれない問題を予期したり, デバッグするときに役 - 立つでしょう. + この節を読むことで, LPD がフィルタを使うときに, + 見えないところで何が + 起こっているかが理解できるでしょう. このことを知っておくと, + プリンタそれぞれに様々なフィルタをインストールしたときに + 遭遇するかもしれない問題を予期したり, + デバッグするときに役立つでしょう. - LPD では, すべてのプリンタからデフォルトでプレインテ - キストを印字できることを期待しています. このことは, プ - レインテキストを直接印字できない PostScript (また + LPD では, すべてのプリンタからデフォルトで + プレインテキストを印字できることを期待しています. このことは, + プレインテキストを直接印字できない PostScript (また は他の言語用の) プリンタでは問題を引き起こします. 「 プレインテキストのジョブを PostScript プリンタで印字する」 で, この問題を克服する方法について述べます. PostScript プリンタをお持ちの方は, この節をお読みになることをおすすめします. PostScript は様々なプログラムのための有名な出 力形式です. ある人たちは (著者自身を含めて) PostScript のコードさえも直接書いてしまいます. しかし, PostScript プリンタは高価です. 「非 PostScript プリンタで PostScript をシミュレートする」では, PostScript データを非 PostScript プリンタに受けつけさせ, 印字させるために, - どのようにしてプリンタ用のテキストフィルタをさらに変更 - すればよいのか, ということについて述べます. PostScript - プリンタを持っていない方は, この節をお読みになる - ことをおすすめします. + どのようにしてプリンタ用のテキストフィルタをさらに変更すればよいのか, + ということについて述べます. PostScript + プリンタを持っていない方は, + この節をお読みになることをおすすめします. - 変換フィルタ」では, 図形や組版データといっ - た特定のファイル形式を, プリンタが理解できる形式へ変換 - する作業を自動的におこなわせる方法について述べます. この節 - を読むと, troff のデータを印字するには lpr - -t, または, TeX DVI を印字するには - lpr -d, ラスタイ - メージデータを印字するには lpr -v, - などといったよ - うにユーザが入力することができるようにプリンタの設定を - おこなうことができます. この節もお読みになることをお薦めし - ます. + 変換フィルタ」では, + 図形や組版データといった特定のファイル形式を, + プリンタが理解できる形式へ変換する作業を自動的におこなわせる方法について述べます. + この節を読むと, troff のデータを印字するには lpr + -t, または, TeX DVI を印字するには + lpr -d, + ラスタイメージデータを印字するには lpr -v, + などといったようにユーザが入力することができるように + プリンタの設定をおこなうことができます. + この節もお読みになることをお薦めします. 出力フィルタ」 - では, あまり使われない LPD の機能のすべて, すなわち, - 出力フィルタに関することが記述されています. ヘッダページ + では, あまり使われない LPD の機能のすべて, すなわち, + 出力フィルタに関することが記述されています. ヘッダページ (「 ヘッダページ」参照) を印字させていない場合は, 多分, この節は飛ばしても構わないでしょう. テキストフィルタ lpf」では, lpf - についての説明が, ほぼ完全におこなわれています. これは + についての説明が, ほぼ完全におこなわれています. これは FreeBSD に付属するラ インプリンタ (または, - ラインプリンタのように動作するレー ザプリンタ) のための, - 単純なテキストフィルタです. プレ - インテキストを印字したことに対して課金をおこなう方法が至急 - 必要な場合, もしくは, バックスペース文字を印字しようと + ラインプリンタのように動作するレーザプリンタ) のための, + 単純なテキストフィルタです. + プレインテキストを印字したことに対して課金をおこなう方法が + 至急必要な場合, もしくは, バックスペース文字を印字しようと すると煙を発するプリンタを持っている場合は, 絶対に lpf を検討するべきです. フィルタはどのように機能しているか - 既に言及したように, フィルタとは, プリンタにデータを送る - 際に, デバイスに依存した部分を取り扱うために LPD - によって起動 される実行プログラムです. + 既に言及したように, フィルタとは, プリンタにデータを送る際に, + デバイスに依存した部分を取り扱うために LPD + によって起動される実行プログラムです. LPD がジョブ中のファイルを印字しようとするとき, LPD - はフィル タプログラムを起動します. このとき, - フィルタの標準入力を印字す るファイルに, - 標準出力をプリンタに, そして, 標準エラー出力をエ - ラーログファイル (/etc/printcap 内の - lf 項目で指 定されたファイル, または, - 指定されていない場合は, デフォルトと して + はフィルタプログラムを起動します. このとき, + フィルタの標準入力を印字するファイルに, + 標準出力をプリンタに, そして, 標準エラー出力を + エラーログファイル (/etc/printcap 内の + lf 項目で指定されたファイル, または, + 指定されていない場合は, デフォルトとして /dev/console) にセットします. + + troff + LPD が起動するフィルタと, その引数が何であるかは, /etc/printcap - ファイルの内容と, ジョブの起動時に - ユーザが指定した - &man.lpr.1; コマンドの引数に依存しています. 例え - ば, ユーザが lpr -t と入力した場合は, - LPD は出力先のプリ - ンタ用の tf 項目で指定されている troff - 用のフィルタを起動 - させるでしょう. + ファイルの内容と, ジョブの起動時にユーザが指定した + &man.lpr.1; コマンドの引数に依存しています. + 例えば, ユーザが lpr -t と入力した場合は, + LPD は出力先のプリンタ用の + tf 項目で指定されている troff + 用のフィルタを起動させるでしょう. ユーザがプレインテキストの印字を指示したときは, - if で指定されたフィルタが - 起動されるでしょう (このことはほ - とんどの場合にあてはまります. + if で指定されたフィルタが起動されるでしょう + (このことはほとんどの場合にあてはまります. 詳細については, 「 出力フィルタ」をご覧ください). /etc/printcap - で指定可能なフィルタは次の3種類がありま す. + で指定可能なフィルタは次の3種類があります. テキストフィルタ - (LPD のドキュメントでは紛ら - わしいことに - 入力フィルタと呼んでいますが) は一般の - テキストの印字を扱います. これはデフォルトのフィルタと - 考えてください. LPD では, すべてのプリンタに対して, デフォ - ルトでプレインテキストが印字できることを期待しています. - さらに, バックスペースやタブを正しく扱い, また, 他の特 - 殊な文字が入力されてもプリンタに混乱を来さないようにす - るのはテキストフィルタの仕事であると考えています. + (LPD のドキュメントでは紛らわしいことに + 入力フィルタと呼んでいますが) + は一般のテキストの印字を扱います. これはデフォルトのフィルタと + 考えてください. LPD では, すべてのプリンタに対して, + デフォルトでプレインテキストが印字できることを期待しています. + さらに, バックスペースやタブを正しく扱い, また, + 他の特殊な文字が入力されてもプリンタに混乱を来さないように + するのはテキストフィルタの仕事であると考えています. プリンタの使用に対して課金をしなくてはならない環境にあ るときは, テキストフィルタが印字したページ数を数える作 業もしなくてはなりません. この作業は, 通常, 印字した行 数を数え, これをプリンタが1ページ当たりに印字できる行 数と比較することでおこなわれます. テキストフィルタは, 次のような引数を付けて起動されます. filter-name -c -wwidth -llength -iindent -n login -h host acct-file ここで, lpr -l - によってジョブが入力されたときに与 - えられます. + によってジョブが入力されたときに与えられます. width /etc/printcap で指定された pw (page width) - 項目の値が与えられます. デフォル トは, + 項目の値が与えられます. デフォルトは, 132です. length pl (page length) - 項目で指定された値が与え られます. + 項目で指定された値が与えられます. デフォルトは66です. indent lpr -i - によって与えられた字下げの量で, デ - フォルトは0です. + によって与えられた字下げの量で, + デフォルトは 0 です. login ファイルを印字したユーザのアカウント名が - 与えら れます. + 与えられます. host ジョブが入力されたホスト名が 与えられます. acct-file af 項目で指定されている課金データファイル の名前が与えられます. + + プリンタ + フィルタ + 変換フィルタは, 特定のファイル形式をプリンタ - が紙に印字できるようなものに変換します. 例えば, プリン - タで ditroff 組版データを直接印字することはできません. - しかし, ditroff データをプリンタが消化し, 印字するこ - とができる形式へ変換するために, ditroff ファイル用フィ - ルタをインストールすることができます. + が紙に印字できるようなものに変換します. 例えば, + プリンタで ditroff 組版データを直接印字することはできません. + しかし, ditroff データをプリンタが消化し, + 印字することができる形式へ変換するために, ditroff + ファイル用フィルタをインストールすることができます. 「 変換フィルタ」 で, これらに関するすべてについて説明します. - プリンタの課金をする必要がある場合は, 変換フィルタでも - 印字ページを数える作業が必要となります. + プリンタの課金をする必要がある場合は, + 変換フィルタでも印字ページを数える作業が必要となります. 変換フィルタは次の引数をとって起動されます. filter-name -xpixel-width -ypixel-height -n login -h host acct-file ここで, pixel-width は, - px 項目で指定され - た値 (デフォルトは0), + px 項目で指定された値 + (デフォルトは0), pixel-height は, - py 項 - 目で指定された値 (デフォルトは0) です. + py 項目で指定された値 + (デフォルトは0) です. 出力フィルタは, テキストフィルタが指定されて - おらず, かつ, ヘッダページの出力が許可されている場合に - のみ使われます. + おらず, かつ, + ヘッダページの出力が許可されている場合にのみ使われます. 「 - 出力フィルタ」で, これらのことについて説明し - ます. アウトプットフィルタに対する引数は次の2つだけです. + 出力フィルタ」で, これらのことについて説明します. + アウトプットフィルタに対する引数は次の2つだけです. filter-name -wwidth -llength ここで, は, - テキストフィルタの場合 - と同じです. + テキストフィルタの場合と同じです. フィルタは, 次に示すの終了状態をもってプログラムを - exit するべきです. + exit するべきです. exit 0 フィルタがファイルを正常に印字した場合. exit 1 フィルタはファイルの印字に失敗したが, LPD - に再度ファ イルの印字を試みて欲しい場合. - この終了状態で終了した場 合, LPD + に再度ファイルの印字を試みて欲しい場合. + この終了状態で終了した場合, LPD はフィルタを再スタートします. exit 2 フィルタはファイルの印字に失敗し, かつ, LPD - に再出力 を試みて欲しくない場合. この場合, LPD - はそのファイル を放棄します. + に再出力を試みて欲しくない場合. この場合, LPD + はそのファイルを放棄します. FreeBSD に付属するテキストフィルタ /usr/libexec/lpr/lpf は, FORM FEED - 文字が送られたと - きやプリンタ使用に対する課金をどのようにするかを - 決定するために, ページ幅やページ長の引数を利用します. また, - 課金用のエントリを 作成するため, ログイン名, ホスト名, - 課金ファイル名の引数を利用 します. + 文字が送られたときやプリンタ使用に対する課金をどのようにするかを決定するために, + ページ幅やページ長の引数を利用します. また, + 課金用のエントリを作成するため, ログイン名, ホスト名, + 課金ファイル名の引数を利用します. もし, フィルタの購入を検討しているならば, LPD - と互換性がある かどうかを確認してください. もしそうならば, - 上述の引数リストをサ ポートしていなければなりません. - 一般向けの使用のためにフィルタ - を作成する計画をしている場合は, - 同じ引数リストと終了コードをサ ポートしてください. + と互換性があるかどうかを確認してください. もしそうならば, + 上述の引数リストをサポートしていなければなりません. + 一般向けの使用のためにフィルタを作成する計画をしている場合は, + 同じ引数リストと終了コードをサポートしてください. - プレインテキストのジョブを PostScript プリン - タで印字する + プレインテキストのジョブを PostScript プリンタで印字する + プリントジョブ - コンピュータと PostScript (または, 他の言語に対応し た) + コンピュータと PostScript (または, 他の言語に対応した) プリンタをあなたしか使用しない場合は, プリンタにプレ インテキストを絶対に送らない, そして, - プリンタにプレインテキス - トを送りたがっている様々なプログラムの機能を決して - 使わないこと にしてください. そうすれば, - この節に書かれたことに心を煩わせる必 - 要はまったくなくなります. + プリンタにプレインテキストを送りたがっている + 様々なプログラムの機能を決して使わないことにしてください. そうすれば, + この節に書かれたことに心を煩わせる必要はまったくなくなります. しかし, PostScript - とプレインテキストの両方のジョブをプリン - タへ送りたいと思っている場合は, - プリンタ設定についての要求が増 えるでしょう. - 両者をプリンタへ送信するためには, 到着 - したジョブがプレインテキストであるか PostScript であるかを - 検出するテキストフィルタが必要です. PostScript のジョブは - すべて %! + とプレインテキストの両方のジョブをプリンタへ送りたいと思っている場合は, + プリンタ設定についての要求が増えるでしょう. + 両者をプリンタへ送信するためには, + 到着したジョブがプレインテキストであるか + PostScript であるかを検出するテキストフィルタが必要です. + PostScript のジョブはすべて %! で始まらなければならないことになっています (他のプリンタ言語に関しては, - プリンタのドキュメントをご覧くだ さい). - ジョブの最初の2文字がこれならば, PostScript である - ことが分かります. したがって, - ジョブのそれ以降の部分をプリンタに直 接送ることができます - (訳注:PostScript では, % + プリンタのドキュメントをご覧ください). + ジョブの最初の2文字がこれならば, PostScript であることが分かります. + したがって, + ジョブのそれ以降の部分をプリンタに直接送ることができます + (訳注: PostScript では, % 以降はコメントとして扱われるので, 最初の %! の行を 読み捨てても問題はない). - 最初の2文字が %! でない場 - 合は, フィルタはテキストを PostScript に変換し, その結果を - 使って印字をおこないます. + remap=tt>%! の行を読み捨てても問題はない). + 最初の2文字が %! でない場合は, + フィルタはテキストを PostScript に変換し, + その結果を使って印字をおこないます. この作業をどうやってやればよいのでしょうか. + + プリンタ + シリアル + シリアルポートにプリンタを接続した場合は, - lprps をインス - トールすることをお勧めします. lprps は - PostScript 用のフィルタで, - プリンタとの双方向通信をおこないます. このフィルタでは, - プリンタか らの冗長な情報を得ることで, - プリンタの状況を示すファイルが更新 されていきます. + lprps をインストールすることをお勧めします. + lprps は PostScript 用のフィルタで, + プリンタとの双方向通信をおこないます. + このフィルタでは, プリンタからの冗長な情報を得ることで, + プリンタの状況を示すファイルが更新されていきます. したがって, ユーザや管理者は (トナー残量少紙詰まりといった) - プリンタの状況を正確に知ることができます. しかし, + プリンタの状況を正確に知ることができます. しかし, もっと重要なことは, psif - と呼ばれるプログラムが 含まれているということです. - このプログラムは, 入力されたジョブ - がプレインテキストかどうかを検出し, これを PostScript に変 - 換するために, textps - (lprps に付属する別のプログラ ム) + と呼ばれるプログラムが含まれているということです. + このプログラムは, + 入力されたジョブがプレインテキストかどうかを検出し, + これを PostScript に変換するために, textps + (lprps に付属する別のプログラム) を呼び出します. そして, このジョブをプリンタに送るために, lprps が使われます. lprps は FreeBSD Ports Collection に含まれています (Ports Collection を参照してください). もちろん,自分自身でプログラムを取ってきて, コンパイルし, - インストールす ることもできます. lprps - をインストールした後は, lprps + インストールすることもできます. lprps + をインストールした後は, lprps の一部である psif - プログラムのパス名を指定する だけです. Ports Collection から + プログラムのパス名を指定するだけです. Ports Collection から lprps をインストールしたときは, /etc/printcap の中のシリアル接続した PostScript プリンタのエントリに対して, 次を使ってください. :if=/usr/local/libexec/psif: LPD にプリンタをリード・ライトモードでオープンさせるために, rw 項目も指定すべきです. パラレルポートに接続したプリンタの場合 (すなわち, lprps が 必要としているプリンタとの双方向通信ができない), - テキストフィ - ルタとして次のシェルスクリプトを使うことができます. + テキストフィルタとして次のシェルスクリプトを使うことができます. #!/bin/sh # # psif - Print PostScript or plain text on a PostScript printer # Script version; NOT the version that comes with lprps # Installed in /usr/local/libexec/psif # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # PostScript job, print it. # echo "$first_line" && cat && printf "\004" && exit 0 exit 2 else # # Plain text, convert it, then print it. # ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi 上記のスクリプトにおいて, textps はプレインテキストから PostScript - へ変換するために別にインストールしたプログラム です. + へ変換するために別にインストールしたプログラムです. テキストから PostScript へ変換するのには, お好みのどんなプロ グラムでも使うことができます. FreeBSD Ports Collection (Ports Collection - を参照してください) には, a2ps - と呼ばれるテキストから PostScript に変換するプログラムが - 入っています. + を参照してください) には, a2ps + と呼ばれるテキストから + PostScript に変換するプログラムが入っています. - 訳注: 上記スクリプトでは, - 先頭の行を読み込むために read を使っていますが, - 困ったことに, read は読み込んだ文字列の先頭 - の空白文字を取り除いてしまいます. 従って, - これらの空白文字は印 字されないことになり, - 印字結果がファイルのイメージと異なる場合 が出てきます. - この事情は csh を利用した場合でも変わりません. 仮に, - 先頭の空白文字を除去しない read コマンドを作ったとしても, + 訳注 + + 上記スクリプトでは, + 先頭の行を読み込むために read を使っていますが, + 困ったことに, + read は読み込んだ文字列の先頭の空白文字を取り除いてしまいます. + 従って, + これらの空白文字は印字されないことになり, + 印字結果がファイルのイメージと異なる場合が出てきます. + この事情は csh を利用した場合でも変わりません. + 仮に, 先頭の空白文字を除去しない read コマンドを作ったとしても, 「echo $first_line」の $first_line - 変数の内容をシェルが展開す る際に $first_line - の先頭の空白文字が失われるため, 問題の解決 にはなりません. - 残念ながら, 訳者はこの問題をシェルプログラムだ - けで解決する方法をしりません. perl か C - 言語の力を借りないと解 決できないと思います. + 変数の内容をシェルが展開する際に $first_line + の先頭の空白文字が失われるため, 問題の解決にはなりません. + 残念ながら, + 訳者はこの問題をシェルプログラムだけで解決する方法をしりません. + perl か C 言語の力を借りないと解決できないと思います. 非 PostScript プリンタで PostScript をシミュレートする + + PostScript + エミュレーション + + Ghostscript PostScript は質の高い組版と印字をおこなうための事実 上の標準です. しかしながら, PostScript は, - 高価な標 準です. ありがたいことに, + 高価な標準です. ありがたいことに, Alladin Enterprises から Ghostscript と呼ばれる, - PostScript 互換の動作をするフリー - のプログラムが出されていて, FreeBSDで動きます. Ghostscript - はほとんどの PostScript ファイルを読むことができ, これらの - 各ページをたくさんのブランドの非 PostScript プリンタを含む - 様々なデバイス用に変換することができます. Ghostscript をイン - ストールし, - プリンタ用の特別なテキストフィルタを使うことによっ て, 非 - PostScript プリンタをあたかも本物の PostScript + PostScript 互換の動作をするフリーのプログラムが出されていて, + FreeBSD で動きます. + Ghostscript はほとんどの PostScript ファイルを読むことができ, + これらの各ページをたくさんのブランドの非 PostScript プリンタを含む + 様々なデバイス用に変換することができます. + Ghostscript をインストールし, + プリンタ用の特別なテキストフィルタを使うことによって, + 非 PostScript プリンタをあたかも本物の PostScript プリンタであるかのように動作させることができます. Ghostscript は FreeBSD Ports Collection に入っていますので, - そこからインストール することができます. また, + そこからインストールすることができます. また, 自分でソースプログラムを持ってきて, コンパイルし, インストー ルすることもできます. この作業はとても簡単にできます. PostScript プリンタをシミュレートさせる場合は, - テキストフィ ルタに PostScript - ファイルを印字しようとしているかどうかを 検出させます. - PostScript ファイルでない場合は, フィルタは - そのファイルを直接プリンタに送ります - (訳注:テキストファイルを直 接印字できない場合は, もちろん, - 変換フィルタを通す必要がありま す). PostScript の場合は, - まず, Ghostscript を使い, ファ - イルをそのプリンタが理解できる形式へ変換します. + テキストフィルタに PostScript + ファイルを印字しようとしているかどうかを検出させます. + PostScript ファイルでない場合は, + フィルタはそのファイルを直接プリンタに送ります + (訳注: テキストファイルを直接印字できない場合は, もちろん, + 変換フィルタを通す必要があります). PostScript の場合は, + まず, Ghostscript を使い, + ファイルをそのプリンタが理解できる形式へ変換します. 次の例のスクリプトは, Hewlett Packard DeskJet 500 プリンタ用 のテキストフィルタです. - 他のプリンタで用いるときは, + 他のプリンタで用いるときは, 引数を gs (Ghostscript) - コマンドに変えてくだ さい. (gs -h - と入力すると, 現在インストールされている Ghostscript - でサポートされているデバイスのリストが得られます). + コマンドに変えてください. (gs -h + と入力すると, 現在インストールされている Ghostscript + でサポートされているデバイスのリストが得られます). #!/bin/sh # # ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500 # Installed in /usr/local/libexec/hpif # # Treat LF as CR+LF: # printf "\033&k2G" || exit 2 # # Read first two characters of the file # read first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # It is PostScript; use Ghostscript to scan-convert and print it. # # Note that PostScript files are actually interpreted programs, # and those programs are allowed to write to stdout, which will # mess up the printed output. So, we redirect stdout to stderr # and then make descriptor 3 go to stdout, and have Ghostscript # write its output there. Exercise for the clever reader: # capture the stderr output from Ghostscript and mail it back to # the user originating the print job. # exec 3>&1 1>&2 /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ -sOutputFile=/dev/fd/3 - && exit 0 # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \ && exit 0 else # # Plain text or HP/PCL, so just print it directly; print a form # at the end to eject the last page. # echo $first_line && cat && printf "\033&l0H" && exit 0 fi exit 2 最後に, if 項目を通して, LPD - にこのフィルタを教えてやる 必要があります. + にこのフィルタを教えてやる必要があります. :if=/usr/local/libexec/hpif: これでおしまいです. lpr plain.text とか lpr whatever.ps - と入力してみましょう. どちらも正常に印字されるは - ずです. + と入力してみましょう. どちらも正常に印字されるはずです. - 訳注: 日本語を印字する場合は, - 日本語対応の Ghostscript が必要で す. 日本語対応版の + 訳注 + + 日本語を印字する場合は, + 日本語対応の Ghostscript が必要です. 日本語対応版の Ghostscript も Ports Collection に入っています. 変換フィルタ プリンタ設定導入編」 - に書かれた簡単な設定が完了したら, 最初に, やってみたいと思 - うことは, 多分(プレイン ASCII テキストに加えて) - 好みのファイル形式 - のための変換フィルタをインストールすることでしょう. + に書かれた簡単な設定が完了したら, 最初に, + やってみたいと思うことは, 多分(プレイン ASCII テキストに加えて) + 好みのファイル形式のための変換フィルタをインストールすることでしょう. + なぜ, 変換フィルタをインストールするのか? - - 変換フィルタによって, 様々な種類のファイルを印字するこ - とが簡単になります. 例えば, TeX - 組版システムでたくさんの仕事 をしたと仮定しましょう. + + TeX + dvi ファイルの印刷 + + + 変換フィルタによって, + 様々な種類のファイルを印字することが簡単になります. 例えば, TeX + 組版システムでたくさんの仕事をしたと仮定しましょう. そして, PostScript プリンタが接続 されているとします. - すると, TeX で DVI ファイルを作成する度に, DVI - ファイルを印字するために, これを PostScript ファイルに - 変換する必要があります. - このコマンドは次のようになるでしょう. + すると, TeX で DVI ファイルを作成する度に, DVI + ファイルを印字するために, + これを PostScript ファイルに変換する必要があります. + このコマンドは次のようになるでしょう. &prompt.user; dvips seaweed-analysis.dvi &prompt.user; lpr seaweed-analysis.ps DVI ファイル用の変換フィルタがインストールしてあると, LPD に 変換を肩代わりさせることで毎回毎回 - おこなわなければならなかった面倒 - な変換作業を省くことができます. つまり, DVI を生成したら, + おこなわなければならなかった面倒な変換作業を省くことができます. + つまり, DVI を生成したら, 次のような1回のコマンド入力だけで, これが印字されます. &prompt.user; lpr -d seaweed-analysis.dvi LPD に DVI ファイルの変換をさせるためには, オプション を指定します. 変換オプションのリストは「 整形と変換に関するオプション」 に載せてあります. 変化のオプションのそれぞれをプリンタに サポートさせるためには, 変換フィルタをインストールし, - そのパス名を /etc/printcap - の中で指定しなくてはなりません. 変換フィ ルタは, - プレインテキストを印字する代わりに, フィルタはファイル - をプリンタが理解できる形式に変換するところを除けば, - 「プリンタ の簡単な設定」で説明したテキストファイル + そのパス名を /etc/printcap + の中で指定しなくてはなりません. 変換フィルタは, + プレインテキストを印字する代わりに, フィルタはファイルを + プリンタが理解できる形式に変換するところを除けば, + 「プリンタの簡単な設定」で説明したテキストファイル (「 テキストフィルタのインストール」 を見て下さい) に似ています. どの変換フィルタをインストールすべきか? 使いたいと思う変換フィルタをインストールすべきです. DVI のデータを頻繁に印字するならば, DVI 変換フィルタ をインストールするのが適切でしょう. 印字しなくてはなら - ない troff を大量に抱えている場合は, 多分, troff フィ - ルタが欲しくなるはずです. + ない troff を大量に抱えている場合は, 多分, + troff フィルタが欲しくなるはずです. 次の表は, LPD で動作するフィルタと, /etc/printcap - ファイルでのエントリする項目, そして, + ファイルでのエントリする項目, そして, lpr - コマンドで呼び出す方法をまとめたもの です. + コマンドで呼び出す方法をまとめたものです. ファイル形式 /etc/printcap項目 lpr オプション cifplot cf DVI df plot gf ditroff nf FORTRAN text rf troff tf raster vf プレインテキスト if なし, , または 先の例のように, lpr -d - を使うためには, 出力先の プリンタの + を使うためには, 出力先のプリンタの /etc/printcap 内のエントリで, df 項目が必要であることが分かります. + fortran 反論はあるかも知れませんが, FORTRAN テキストや plot - のような形式は, 多分, 廃れ てていくでしょう. - あなたのサイトで, 自前のフィルタをイ ンストールするだけで, - プリントオプションのいくつか, あ るいは, + のような形式は, 多分, 廃れてていくでしょう. + あなたのサイトで, 自前のフィルタをインストールするだけで, + プリントオプションのいくつか, あるいは, 全部に新しい意味を与えることができます. 例えば, - Prinerleaf ファイル (Interleaf デスクトップパブリッシン - グプログラムによるファイル) を直接印字したいとします. + Prinerleaf ファイル (Interleaf + デスクトップパブリッシングプログラムによるファイル) + を直接印字したいとします. そして, Printerleaf 用の変換フィルタを gf 項目で 指定したパスにインストールすれば, lpr - -g の意味 はPrinterleaf - ファイルを印字する意味だとユーザに教 - えることができます. + -g の意味はPrinterleaf + ファイルを印字する意味だとユーザに教えることができます. + 変換フィルタのインストール 変換フィルタは FreeBSD - の基本システムのインストールとは別 - にインストールするプログラムなので, 変換フィルタは, 多 分, - /usr/local ディレクトリの下に置くべ - きです. フィルタは LPD だけが実行する特別なプログラム, - すなわち, 一般ユーザが実行する必要すらない - プログラムなので, /usr/local/libexec - ディレ クトリに置くのが普通です. + の基本システムのインストールとは別にインストールするプログラムなので, + 変換フィルタは, 多分, + /usr/local ディレクトリの下に置くべきです. + フィルタは LPD だけが実行する特別なプログラム, + すなわち, 一般ユーザが実行する必要すらないプログラムなので, + /usr/local/libexec + ディレクトリに置くのが普通です. 変換フィルタを使用可能にするためには, /etc/printcap の目的のプリンタの適切な項目に フィルタがあるパス名を指定します. DVI 変換フィルタをプリンタ bamboo - のエントリに加 えてみましょう. プリンタ - bamboodf 項目を - 新たに加えた/etc/printcap - ファイルの例を以下 に再掲します. + のエントリに加えてみましょう. プリンタ + bamboodf + 項目を新たに加えた /etc/printcap + ファイルの例を以下に再掲します. # # /etc/printcap for host rose - added df filter for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: DVI フィルタは /usr/local/libexec/psdf という - 名前のシェルスクリプトです. このスクリプトは次のように - なっています. + 名前のシェルスクリプトです. + このスクリプトは次のようになっています. #!bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@" このスクリプトでは, dvips - をフィルタモード (引数 ) で, - 標準入力上で起動しています. 標準入力は印字 するジョブです. - それから, PostScript プリンタ用フィ ルタ + をフィルタモード (引数 ) で, + 標準入力上で起動しています. 標準入力は印字するジョブです. + それから, PostScript プリンタ用フィルタ lprps (これについては「 プレインテキストのジョブを PostScript プリンタで印字する」 を参照してください) を LPD - に与えられた引数を付けて起動 します. + に与えられた引数を付けて起動します. lprps - はこれらの引数を印字されたページ分 - の課金をおこなうために使われます. + はこれらの引数を印字されたページ分の課金をおこなうために使われます. + + 変換フィルタのその他の例 - 変換フィルタのインストールには決まったステップがないの - で, その代わりに, 例をもっと挙げることにします. これを, - 自分でフィルタを作る際のガイドにしてください. 適当な例が - あったら, それをそのまま使ってください. + 変換フィルタのインストールには決まったステップがないので, + その代わりに, 例をもっと挙げることにします. + これを自分でフィルタを作る際のガイドにしてください. + 適当な例があったら, それをそのまま使ってください. - 次のスクリプト例は, Hewlett Packard LaserJet III-Si の - ための, raster (ええと・・実は, GIF ファイル) 用の変 - 換フィルタです. + 次のスクリプト例は, Hewlett Packard LaserJet III-Si + のための, raster (ええと・・実は, GIF ファイル) + 用の変換フィルタです. #!/bin/sh # # hpvf - Convert GIF files into HP/PCL, then print # Installed in /usr/local/libexec/hpvf PATH=/usr/X11R6/bin:$PATH; export PATH giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \ && exit 0 \ || exit 2 - ここでは, GIF ファイルから PNM (portable anymap) 形式 - に変換し, 次に PGM (portable graymap) 形式に変換してか ら, + ここでは, GIF ファイルから PNM (portable anymap) + 形式に変換し, 次に PGM (portable graymap) 形式に変換してから, LaserJet/PCL-互換データに変換しています. - 上記のフィルタを使うプリンタのためのエントリを付け加え - た /etc/printcap - ファイルは次のようになります. + 上記のフィルタを使うプリンタのためのエントリを付け加えた + /etc/printcap + ファイルは次のようになります. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf: 次のスクリプトは, PostScript プリンタ - bamboo のための groff 組版システムの - troff データのための変換 フィルタです. + bamboo のための groff 組版システムの + troff データのための変換フィルタです. #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@" 上記のスクリプトではプリンタとの通信をおこなうため, lprps をまた利用しています. - プリンタがパラレルポー トに接続されている場合は, 代わりに, - 次のスクリプトを使 うかもしれません. + プリンタがパラレルポートに接続されている場合は, 代わりに, + 次のスクリプトを使うかもしれません. #!/bin/sh # # pstf - Convert groff's troff data into PS, then print. # Installed in /usr/local/libexec/pstf # exec grops これで完成しました. 次に, フィルタを使用可能にするため に /etc/printcap - に加える必要があるエントリを 示します. + に加える必要があるエントリを示します. :tf=/usr/local/libexec/pstf: - 次の例をみたら, FORTRAN のベテランは赤面するかもしれ - ません. この FORTRAN テキストフィルタは, プレインテキ - ストを直接印字できるすべてのプリンタで利用できます. この - フィルタをプリンタ teak - にインストールすることに しましょう. + 次の例をみたら, FORTRAN のベテランは赤面するかもしれません. + この FORTRAN テキストフィルタは, + プレインテキストを直接印字できるすべてのプリンタで利用できます. + このフィルタをプリンタ teak + にインストールすることにしましょう. #!/bin/sh # # hprf - FORTRAN text filter for LaserJet 3si: # Installed in /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0 exit 2 そして, このフィルタを使用可能にするため, 以下の行を /etc/printcap のプリンタ - teak のエントリ に加えます. + teak のエントリに加えます. :rf=/usr/local/libexec/hprf: これが最後の, そして, 若干複雑な例です. 前に紹介した LaserJet プリンタ teak に, DVI フィルタを加える ことにしましょう. 最初に, - 簡単な部分をおこないます. すなわ ち, DVI フィルタの位置を - /etc/printcap に書 き加えます. + 簡単な部分をおこないます. すなわち, DVI フィルタの位置を + /etc/printcap に書き加えます. :df=/usr/local/libexec/hpdf: さて, 難しい部分であるフィルタの作成をおこないます. - このた めに, DVI から LaserJet/PCL - への変換プログラムが必要 です. FreeBSD の Ports Collection + このために, DVI から LaserJet/PCL + への変換プログラムが必要です. FreeBSD の Ports Collection (Ports Collection - を参照してください) には, それがあ ります. - dvi2xx というのがそのパッケージの名前で - す. これをインストールすると, 必要なプログラム + を参照してください) には, それがあります. + dvi2xx というのがそのパッケージの名前です. + これをインストールすると, 必要なプログラム dvilj2p が使えます. このプログラムは - DVI を LaserJet IIp, LaserJet III, そして LaserJet 2000 - の互 換コードへ変換してくれます. + DVI を LaserJet IIp, LaserJet III, そして LaserJet 2000 + の互換コードへ変換してくれます. dvilj2p はフィルタ - hpdf を極めて複雑にしてい ます. + hpdf を極めて複雑にしています. なぜなら, dvilj2p - は標準入力からデータを読 み込むことができないからです. - このプログラムを働かせる ためには, ファイル名が必要です. - もっと悪いことに, ファ イル名は .dvi - で終わっている必要があり, 標準入力 の代わりに, - /dev/fd/0 を使うのは問題がありま す. + は標準入力からデータを読み込むことができないからです. + このプログラムを働かせるためには, ファイル名が必要です. + もっと悪いことに, ファイル名は .dvi + で終わっている必要があり, 標準入力の代わりに, + /dev/fd/0 を使うのは問題があります. この問題は, (.dvi で終わる) - 一時的なファイル名 から/dev/fd/0 に + 一時的なファイル名から/dev/fd/0 に (シンボリックな) リンクを張る ことで回避することができます. これで, - dvilj2p に 強制的に標準入力からデータを - 読み込ませることができます. + dvilj2p + に強制的に標準入力からデータを読み込ませることができます. もう1つの問題は, 一時的なリンクを張るために - /tmp ディ - レクトリを使うことができないという事実です. シンボリッ - クリンクはユーザ, グループが bin - であるユーザに所 有されています. フィルタはユーザ - daemon として起 動します. そして, - /tmp ディレクトリはスティッ - キービットが立っています. フィルタはリンクを作ることが - できます. しかし, リンクは別のユーザに所有されているた め, - 作業が終了したとき, このリンクを削除することができ - ません. - - その代わりに, シンボリックリンクは現在の作業ディレクト - リ, すなわち, スプーリングディレクトリ + /tmp + ディレクトリを使うことができないという事実です. + シンボリックリンクはユーザ, グループが bin + であるユーザに所有されています. フィルタはユーザ + daemon として起動します. そして, + /tmp + ディレクトリはスティッキービットが立っています. + フィルタはリンクを作ることができます. しかし, + リンクは別のユーザに所有されているため, + 作業が終了したとき, このリンクを削除することができません. + + その代わりに, シンボリックリンクは現在の作業ディレクトリ, + すなわち, スプーリングディレクトリ (/etc/printcap の - sd 項目で指定する) に作 ることにします. - フィルタが作業するにはここの場所は完璧 な場所で, なぜなら, + sd 項目で指定する) に作ることにします. + フィルタが作業するにはここの場所は完璧な場所で, なぜなら, 特に, スプーリングディレクトリのディ スクの空き容量は - (ときどき) /tmp ディレクトリ - よりもたくさんあるからです. + (ときどき) /tmp + ディレクトリよりもたくさんあるからです. - 以下に示すのが最後のフィルタです. + 以下に示すのが最後のフィルタです. #!/bin/sh # # hpdf - Print DVI data on HP/PCL printer # Installed in /usr/local/libexec/hpdf PATH=/usr/local/bin:$PATH; export PATH # # Define a function to clean up our temporary files. These exist # in the current directory, which will be the spooling directory # for the printer. # cleanup() { rm -f hpdf$$.dvi } # # Define a function to handle fatal errors: print the given message # and exit 2. Exiting with 2 tells LPD to do not try to reprint the # job. # fatal() { echo "$@" 1>&2 cleanup exit 2 } # # If user removes the job, LPD will send SIGINT, so trap SIGINT # (and a few other signals) to clean up after ourselves. # trap cleanup 1 2 15 # # Make sure we are not colliding with any existing files. # cleanup # # Link the DVI input file to standard input (the file to print). # ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0" # # Make LF = CR+LF # printf "\033&k2G" || fatal "Cannot initialize printer" # # Convert and print. Return value from dvilj2p does not seem to be # reliable, so we ignore it. # dvilj2p -M1 -q -e- dfhp$$.dvi # # Clean up and exit # cleanup exit 0 自動変換: その他の変換フィルタ - ここまでに述べてきたフィルタによって, 印字環境の能率が - 上がったことと思います. しかし, これはどのフィルタを使 - うかを ( &man.lpr.1; のコマンドライン上で) ユーザが指定しな - くてはならないという代価を支払って実現されています. コ - ンピュータの事情にあまり詳しくないユーザにとって, フィ - ルタのオプションを指定させられるということはいらいらさ - せられるものになるでしょう. 更に悪いことに, 間違ったフィ - ルタオプションを指定されると, 間違った形式のファイルが - そのフィルタに適用されることになり, その結果, 何百枚も - の紙を掃き出すことになるかもしれません. - - そのような結果になるならば, 変換フィルタをインストール - するよりもむしろ, テキストフィルタ (これがデフォルトフィ - ルタなので) に印字するよう要求されたファイルの形式を検 - 出させ, 自動的に, 適切な変換フィルタを起動するようにし - たいと思うかもしれません. ここでは file - コマンド のようなツールを役立たせることができます. + ここまでに述べてきたフィルタによって, + 印字環境の能率が上がったことと思います. しかし, + これはどのフィルタを使うかを ( &man.lpr.1; のコマンドライン上で) + ユーザが指定しなくてはならないという代価を支払って実現されています. + コンピュータの事情にあまり詳しくないユーザにとって, + フィルタのオプションを指定させられるということは + いらいらさせられるものになるでしょう. 更に悪いことに, + 間違ったフィルタオプションを指定されると, + 間違った形式のファイルがそのフィルタに適用されることになり, + その結果, 何百枚もの紙を掃き出すことになるかもしれません. + + そのような結果になるならば, + 変換フィルタをインストールするよりもむしろ, + テキストフィルタ (これがデフォルトフィルタなので) + に印字するよう要求されたファイルの形式を検出させ, 自動的に, + 適切な変換フィルタを起動するようにしたいと思うかもしれません. + ここでは file + コマンドのようなツールを役立たせることができます. もちろん, いくつかの - ファイル形式の違いを見分けることは難しい ことでしょう. - そして, もちろん, それらのファイルに対し ては, - 変換フィルタを提供するだけで済ますこともできるの - です. - + ファイル形式の違いを見分けることは難しいことでしょう. + そして, もちろん, それらのファイルに対しては, + 変換フィルタを提供するだけで済ますこともできるのです. + + apsfilter + + プリンタ + フィルタ + apsfilter + FreeBSD Ports Collection には, apsfilter と呼ばれる自 動変換をおこなうテキストフィルタがあります. このフィルタは プレインテキスト, PostScript, DVI - ファイルを検 出し, 適当な変換をおこなった後, - データを印字することができ ます. + ファイルを検出し, 適当な変換をおこなった後, + データを印字することができます. 出力フィルタ LPD スプーリングシステムでは, - ここまでにまだ取り上げていな いフィルタ形式, - 出力フィルタをサポートしています. 出力 フィルタは, - テキストフィルタのように, プレインテキスト - のみを印字するために意図されたものですが, 非常に簡単化 - されています. テキストフィルタを用いずに, 出力フィルタ - を使っている場合は, 次のようになります. + ここまでにまだ取り上げていないフィルタ形式, + 出力フィルタをサポートしています. 出力フィルタは, + テキストフィルタのように, + プレインテキストのみを印字するために意図されたものですが, + 非常に簡単化されています. テキストフィルタを用いずに, + 出力フィルタを使っている場合は, 次のようになります. - LPD はジョブ中の各ファイルに一度ではなく, ジョブ - 全体に対して一度だけ出力フィルタを起動します. + LPD はジョブ中の各ファイルに一度ではなく, + ジョブ全体に対して一度だけ出力フィルタを起動します. - LPD は出力フィルタに対し, ジョブ中のファイルの先 - 頭や末尾を特定するための対策を一切 - おこなっていません. + LPD は出力フィルタに対し, + ジョブ中のファイルの先頭や末尾を特定するための対策を + 一切おこなっていません. - LPD はユーザのログイン名やホスト名をフィルタに渡 - しません. したがって, 課金の処理をおこなうことは考えてい - ません. 実際, 出力フィルタには, 以下2つの引数しか与え - られません. + LPD はユーザのログイン名やホスト名をフィルタに渡しません. + したがって, 課金の処理をおこなうことは考えていません. + 実際, 出力フィルタには, 以下2つの引数しか与えられません. filter-name -wwidth -llength ここで, width - は対象となるプリンタの pw 項 目, + は対象となるプリンタの pw 項目, lengthpl 項目に指定された数です. - 出力フィルタの簡便さに誘惑されてはいけません. もし, ジョ - ブ中のそれぞれのファイルに別のページ番号を付加しようと - しても, + 出力フィルタの簡便さに誘惑されてはいけません. もし, + ジョブ中のそれぞれのファイルに別のページ番号を付加しようとしても, 出力フィルタはうまく動作しないでしょう. - そのような動作を期待しているならば, (入力フィルタとし - ても知られている) テキストフィルタを使ってください. 詳 - しくは, 「 + そのような動作を期待しているならば, + (入力フィルタとしても知られている) テキストフィルタを使ってください. + 詳しくは, 「 テキストフィルタのインストール」をご覧ください. - さらに, 出力 フィルタは, 実のところ, - もっと複雑になっています. まず, - 特殊なフラグ文字を検出するために, フィルタに送ら - れてくるバイトストリームを検査する必要があります. また, LPD - に代わって, 自分自身にシグナルを送らなければなりま - せん. + さらに, 出力フィルタは, 実のところ, + もっと複雑になっています. まず, + 特殊なフラグ文字を検出するために, + フィルタに送られてくるバイトストリームを検査する必要があります. + また, LPDに代わって, + 自分自身にシグナルを送らなければなりません. しかしながら, ヘッダページの印字をおこないたい場合, また, - エスケープシーケンスやヘッダページを印字できるようにす - るその他の初期化文字列を送信する必要がある場合, 出力ファ - イルが必要です. + エスケープシーケンスやヘッダページを印字できるようにする + その他の初期化文字列を送信する必要がある場合, + 出力ファイルが必要です. 1台のプリンタに対し, LPD では出力フィルタとテキスト, - または, 他のフィルタを両方使うことができます. このよう - な場合, LPD はヘッダページ (「 ヘッダページ」 を参照してください) - だけを印字させるために, 出 力フィルタを起動させます. - それから LPD では, アウトプッ トフィルタに2バイトの文字 + だけを印字させるために, 出力フィルタを起動させます. + それから LPD では, アウトプットフィルタに 2 バイトの文字 (ASCII 031 の次に ASCII 001) を送ることで, - 出力フィルタが自力で停止することを - 期待しています. 2バイト (031, 001) が出力フィルタに送られ - たとき, 出力フィルタは自分自身にシグナル SIGSTOP を送 - ることによって停止するべきです. LPD がその他のフィル - タの起動を完了したとき, LPD は出力フィルタにシグナル + 出力フィルタが自力で停止することを期待しています. + 2 バイト (031, 001) が出力フィルタに送られたとき, + 出力フィルタは自分自身にシグナル SIGSTOP + を送ることによって停止するべきです. + LPD がその他のフィルタの起動を完了したとき, + LPD は出力フィルタにシグナル SIGCONT を送ることで, 出力フィルタを再起動させます. 出力フィルタがあり, - テキストフィルタがない場合, LPD - はプレインテキストのジョブをおこなう際に, 出力フィル - タを使います. 前述したように, 出力フィルタでは, ジョブ - 中の各ファイルの並びの間に FROM FEED 文字や紙を排出す - る他の文字を入れることはしません. この動作は多分, あな - たが求めているものとは - 異なっているでしょう. ほと - んどすべての場合において, テキストフィルタが必要とされる - はずです. + テキストフィルタがない場合, LPD + はプレインテキストのジョブをおこなう際に, + 出力フィルタを使います. 前述したように, 出力フィルタでは, + ジョブ中の各ファイルの並びの間に FROM FEED + 文字や紙を排出する他の文字を入れることはしません. + この動作は多分, + あなたが求めているものとは異なっているでしょう. + ほとんどすべての場合において, + テキストフィルタが必要とされるはずです. プログラム lpf は, - テキストフィルタの項で既に紹介 しましたが, - 出力フィルタとしても動作させることができま す. もし, - 簡便で極悪な出力フィルタが必要で, かつ, バイ - トストリームを検査したりシグナルを送るコードを書きたく - ないときには, lpf をお試しください. - あるいは, プ リントが要求する初期化コードを送るために, - lpf を - シェルスクリプトに包んで使うこともできます. + テキストフィルタの項で既に紹介しましたが, + 出力フィルタとしても動作させることができます. もし, + 簡便で極悪な出力フィルタが必要で, かつ, + バイトストリームを検査したりシグナルを送るコードを書きたくないときには, + lpf をお試しください. + あるいは, プリントが要求する初期化コードを送るために, + lpf + をシェルスクリプトに包んで使うこともできます. テキストフィルタ <command>lpf</command> プログラム /usr/libexec/lpr/lpf は, FreeBSD の バイナリ配布に付属しているテキストフィルタ - (入力フィル タ) で, 出力を字下げしたり (lpr + (入力フィルタ) で, 出力を字下げしたり (lpr -i でジョブが入力さ れたとき), 文字を未処理のままプリンタに送ったり (lpr - -l でジョブが入力されたとき), ジョブ中のバッ - クスペースやタブの印字位置を調節したり, 印字したページ - に対して課金したりすることができます. また, このフィル - タは出力フィルタとしても動作させることができます. + -l でジョブが入力されたとき), + ジョブ中のバックスペースやタブの印字位置を調節したり, + 印字したページに対して課金したりすることができます. また, + このフィルタは出力フィルタとしても動作させることができます. lpf - は多くの印字環境において使用することに適して います. - このフィルタには, プリンタに初期化文字列を送る - 機能はありませんが, 必要とされる初期化をおこない, それから + は多くの印字環境において使用することに適しています. + このフィルタには, プリンタに初期化文字列を送る機能はありませんが, + 必要とされる初期化をおこない, それから lpf - を実行させるためのシェルスクリプトを作成する - のはたやすいことです. + を実行させるためのシェルスクリプトを作成するのはたやすいことです. + + ページ課金 + + 課金 + プリンタ + lpf に対して, - 印字ページへの課金を正確におこなわせる ためには, + 印字ページへの課金を正確におこなわせるためには, /etc/printcap ファイルの中の pwpl - の項目に正確な値を入れておく必要が あります. これらの値は, - どのくらいの量のテキストがペー ジにフィットするか, また, - ユーザのジョブが何ページある のかを調べるために使われます. - プリンタの課金についての 詳しい情報については, 「 プリンタの利用に対する課金」をご覧ください. ヘッダページ あなたが管理するシステムのユーザが - たくさんおり, ユー - ザ全員が様々なプリンタを使用する場合, 多分, 必要悪である - ヘッダページ - を印字させることを検討したいと思うかもしれま せん. - + たくさんおり, + ユーザ全員が様々なプリンタを使用する場合, 多分, + 必要悪であるヘッダページを + 印字させることを検討したいと思うかもしれません. + + + バナーページ + ヘッダページ + + ヘッダページ ヘッダページは, バナー とか - バーストページ としても知ら れていますが, - 出力されたジョブが誰によるものなのかを特定させる - 働きがあります. 印字結果の山の中において, ユーザのジョブによっ - て印字された本物のドキュメント部分よりも際立たせるために, ヘッ - ダページは, 通常, 多分, 縁が装飾されている大きな太文字で印字さ - れます. ヘッダページにより, ユーザは自分が出したジョブがどこに - あるのかをすばやく見つけることができます. - ヘッダページの欠点は, 明らかに, すべてのジョブに対して, - 紙が1枚余分に印字されるという ことです. + バーストページ としても知られていますが, + 出力されたジョブが誰によるものなのかを特定させる働きがあります. + 印字結果の山の中において, + ユーザのジョブによって印字された本物のドキュメント部分よりも際立たせるために, + ヘッダページは, 通常, 多分, 縁が装飾されている大きな太文字で印字されます. + ヘッダページにより, + ユーザは自分が出したジョブがどこにあるのかをすばやく見つけることができます. + ヘッダページの欠点は, 明らかに, すべてのジョブに対して, + 紙が1枚余分に印字されるということです. この紙の有効期間は短く, 2〜3 分も続きません. 最終的に, - これらの紙は再利用紙入れの中か - くずの山に入れられることでしょう. + これらの紙は再利用紙入れの中かくずの山に入れられることでしょう. (ヘッダページはジョブ中の各ファイル毎に印字されるのではなく, ジョブ毎に印字されるということに注意してください. したがって, - 紙の 消費はそれほどひどくはないかもしれません). + 紙の消費はそれほどひどくはないかもしれません). もし, - プリンタがプレインテキストを直接印字できるならば, LPD - システムは印字物に対して自動的にヘッダページを付けることが - できます. PostScript プリンタを使っている場合は, ヘッダペー - ジを生成する外部プログラムが必要になります. これについては, + プリンタがプレインテキストを直接印字できるならば, LPD + システムは印字物に対して自動的にヘッダページを付けることができます. + PostScript プリンタを使っている場合は, + ヘッダページを生成する外部プログラムが必要になります. これについては, 「PostScript プリンタでのヘッダページ」をご覧ください. ヘッダページの印字を許可する プリンタ設定導入編 」 では, /etc/printcap ファイルの sh (``suppress header'' : ヘッダを供給しないという意味) を指定して, - ヘッダペー ジの印字を止めていました. - プリンタでのヘッダページの印字を許可 するには, + ヘッダページの印字を止めていました. + プリンタでのヘッダページの印字を許可するには, sh 項目を取り除くだけよい訳です. とても簡単そうに見えるけど, 本当かな? それは本当です. - プリンタに初期化文字列を送るための出力フィ - ルタを用意しなくてはならないかもしれません. 次に, Hewlett + プリンタに初期化文字列を送るための + 出力フィルタを用意しなくてはならないかもしれません. 次に, Hewlett Packard PCL 互換プリンタの例を挙げます. #!/bin/sh # # hpof - Output filter for Hewlett Packard PCL-compatible printers # Installed in /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf of - 項目に出力フィルタのパス名を指定してください. 詳細につ - いては, 「出力フィルタ」 をご覧ください. 次に, 以前紹介したプリンタ teak - のための /etc/printcap - ファイルの例を示します. ここでは, ヘッ - ダページの印字を許可し, 上記の出力フィルタを追加しました. + のための /etc/printcap + ファイルの例を示します. ここでは, + ヘッダページの印字を許可し, 上記の出力フィルタを追加しました. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif:\ :vf=/usr/local/libexec/hpvf:\ :of=/usr/local/libexec/hpof: さて, ユーザが teak - からジョブを印字させたとき, それぞれ - のジョブ毎にヘッダページが印字されます. - もし, ユーザが印字物を - 探すのに時間を費やしたいと思うなら, - lpr -h によってジョ - ブを入力することで, + からジョブを印字させたとき, + それぞれのジョブ毎にヘッダページが印字されます. + もし, ユーザが印字物を探すのに時間を費やしたいと思うなら, + lpr -h によってジョブを入力することで, ヘッダページの印字を止めることができます. これ以外の &man.lpr.1; のオプションについては, 「 ヘッダページ用オプション」 をご覧ください. LPD では, ヘッダページの最後に, FORM FEED 文字が印 字されます. プリンタに紙排出をさせるために, 別な文字, - もしくは, 別な文字列が利用されている場合は, + もしくは, 別な文字列が利用されている場合は, /etc/printcap 中の ff 項目で指定することができます. ヘッダページを制御する ヘッダページの印字が許可されていると, LPD は 長いヘッ ダを作ります. これには, - 紙全面に大きな文字でユーザ名, ホスト 名, + 紙全面に大きな文字でユーザ名, ホスト名, ジョブ名が書かれています. 次に, このヘッダページの例を示 します (kelly が ジョブ名 outline を rose というホストから印字 された場合). k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995 LPD はこのテキストの終わりに FROM FEED 文字を加えます ので, ジョブは新しいページから開始されます (ただし, /etc/printcap - で出力先のプリンタのエントリに sf + で出力先のプリンタのエントリに sf (suppress form feeds) が指定されているときはこ の限りではありません). お望みならば, LPD - に短いヘッダページを出力させる - こともできます. この場合は, - /etc/printcap ファ イルの中で + に短いヘッダページを出力させることもできます. + この場合は, + /etc/printcap ファイルの中で sb (short banner) を指定してください. ヘッダページは次のようになります. rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 - デフォルトでは, LPD はヘッダページを最初に印字し, 次 - にジョブの印字をおこないます. この順番を逆にするときは, + デフォルトでは, LPD はヘッダページを最初に印字し, + 次にジョブの印字をおこないます. この順番を逆にするときは, /etc/printcaphl - (header last) を指定 してください. + (header last) を指定してください. ヘッダページに対する課金 - LPD に備わっているヘッダページ出力機能を使うと, 入力され - たジョブに対して課金をおこなうことができても, - ヘッダページは無 - 料で提供しなくてはならない, + LPD に備わっているヘッダページ出力機能を使うと, + 入力されたジョブに対して課金をおこなうことができても, + ヘッダページは無料で提供しなくてはならない, という特有のやり方を強要されます. なぜでしょうか. 出力フィルタは単なる外部プログラムなので, - 課金をするための制御 をおこなうとすれば, - それはヘッダページを印字するときですが, 出力フィ ルタには, + 課金をするための制御をおこなうとすれば, + それはヘッダページを印字するときですが, 出力フィルタには, ユーザ名とホスト名 - の情報や課金情報を格納するファ イルがどれな + の情報や課金情報を格納するファイルがどれな のかということが知らされません. それゆえ, 出力ファイルには, - 誰 - にプリンタ利用の課金をおこなえばよいのかが分からないのです. - テキス トフィルタやその他の変換フィルタ - (これらのフィルタはユーザやホ ストの情報が知らされます) + 誰にプリンタ利用の課金をおこなえばよいのかが分からないのです. + テキストフィルタやその他の変換フィルタ + (これらのフィルタはユーザやホストの情報が知らされます) が出力ページの枚数に1ページ分水増しするだけでは十分ではありません. なぜなら, ユーザは lpr -h に よってヘッダページの出力を止めることができるからです. - やみくも に1ページを水増しすると, + やみくもに 1 ページを水増しすると, 印字されてもいないヘッダページに対する 料金をとることになります. 基本的に, lpr - -h は環境に優し - い心を持つユーザに好まれるオプションですが, - これを使うように奨 励することもできません. + -h は環境に優しい心を持つユーザに好まれるオプションですが, + これを使うように奨励することもできません. 各々のフィルタに独自のヘッダページを生成させる - (その結果, ヘッ ダページに課金することができる) - という方法でも十分であると - はいえません. この場合, LPD はフィルタに - の情報を送 りませんので, lpr - -h によってヘッダページを印字しないオ - プションを選択したとしても, + (その結果, ヘッダページに課金することができる) + という方法でも十分であるとはいえません. + この場合, LPD はフィルタに + の情報を送りませんので, lpr + -h + によってヘッダページを印字しないオプションを選択したとしても, 依然としてヘッダページは印字され, その分の課金がおこなわれてしまいます. では, どのような選択肢があるのでしょうか. ヘッダページへの課金に関しては, 次のことができます. LPD のやり方を受け入れ, ヘッダページは無料とする. LPRng などの LPD の代替品をインストールする. LPD と入れ替えが可能な他のスプーリングソフトウェアに関しては, 標準スプーラの代替品をご覧ください. スマートな - 出力フィルタを作成する. 通常, 出力 - フィルタはプリンタを初期化するか, 単純な文字列変換をす - る程度の働きしかしません. (テキスト (入力) フィルタがな - い場合) 出力フィルタはヘッダページとプレインテキストの - 印字をおこなうのに適しています. - - プレインテキストを印字するためのテキストフィルタがない - 場合, LPD はヘッダページを印字するためだけの目的で出 - 力フィルタを起動します. そして, LPD が生成するヘッダ - ページのテキストを解析することにより, 出力フィルタはヘッ - ダページに課金するために必要なユーザ名とホスト名を取得 - することができます. この方式の唯一の問題点は, 出力フィ - ルタは課金情報を格納するデータファイルの名前を知ることが + 出力フィルタを作成する. 通常, + 出力フィルタはプリンタを初期化するか, + 単純な文字列変換をする程度の働きしかしません. + (テキスト (入力) フィルタがない場合) + 出力フィルタはヘッダページとプレインテキストの印字をおこなうのに適しています. + + プレインテキストを印字するためのテキストフィルタがない場合, + LPD はヘッダページを印字するためだけの目的で出力フィルタを起動します. + そして, LPD が生成するヘッダページのテキストを解析することにより, + 出力フィルタはヘッダページに課金するために必要なユーザ名と + ホスト名を取得することができます. この方式の唯一の問題点は, + 出力フィルタは課金情報を格納するデータファイルの名前を知ることが できないということです - (af 項目で指定されたファイ - ル名は出力ファイルに渡されません). しかし, 既知の - 名前の課金データファイルを使うのならば, その名前を出 - 力フィルタのプログラム中に埋め込むことができます. + (af 項目で指定されたファイル名は + 出力ファイルに渡されません). しかし, 既知の + 名前の課金データファイルを使うのならば, + その名前を出力フィルタのプログラム中に埋め込むことができます. 解析の手順を簡単にするためには, /etc/printcap - で sh 項目 (短いヘッダを指 - 定) を使うとよいでしょう. - - そしてまた, ここまでの方法は少なからぬトラブルを生じさ - せるかもしれません. - そうなれば, もちろんユーザはヘッダペー - ジを無料で - 提供してくれる気前のよいシステム管理者に感謝することで - しょう. + で sh 項目 + (短いヘッダを指定) を使うとよいでしょう. + + そしてまた, + ここまでの方法は少なからぬトラブルを生じさせるかもしれません. + そうなれば, もちろんユーザはヘッダページを無料で + 提供してくれる気前のよいシステム管理者に感謝することでしょう. + PostScript プリンタでのヘッダページ - これまでに述べたように, LPD ではプレインテキストのヘッ - ダページをたくさんのプリンタに合うように生成することが - できます. 残念ながら, PostScript プリンタは, - プレインテキストを直接 印字することができません. ですから, - LPD のヘッダページ機能は まったく役に立たない, + これまでに述べたように, LPD ではプレインテキストのヘッダページを + たくさんのプリンタに合うように生成することができます. + 残念ながら, PostScript プリンタは, + プレインテキストを直接印字することができません. ですから, + LPD のヘッダページ機能はまったく役に立たない, あるいはほとんどの場合で役に立ちません. ヘッダページを出力するための自明な方法の1つに, - すべての変換フィ - ルタとテキストフィルタにヘッダページを生成させる - 方法があります. フィルタは, - 適切なヘッダページを生成するために, ユーザ名とホス - ト名の引数を使うべきです. この方法の欠点は, いつでも, + すべての変換フィルタとテキストフィルタにヘッダページを生成させる方法があります. + フィルタは, + 適切なヘッダページを生成するために, + ユーザ名とホスト名の引数を使うべきです. この方法の欠点は, いつでも, lpr -h - によってジョブが入力された場合でさえも, ヘッダページが印字 - されるということです. + によってジョブが入力された場合でさえも, + ヘッダページが印字されるということです. この方法で試してみましょう. 次のスクリプトは, 3つの引数 (ユーザ のログイン名, ホスト名, ジョブ名) をとり, 簡単な PostScript 用 のヘッダページを生成します. #!/bin/sh # # make-ps-header - make a PostScript header page on stdout # Installed in /usr/local/libexec/make-ps-header # # # These are PostScript units (72 to the inch). Modify for A4 or # whatever size paper you are using: # page_width=612 page_height=792 border=72 # # Check arguments # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Save these, mostly for readability in the PostScript, below. # user=$1 host=$2 job=$3 date=`date` # # Send the PostScript code to stdout. # exec cat <<EOF %!PS % % Make sure we do not interfere with user's job that will follow % save % % Make a thick, unpleasant border around the edge of the paper. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Display user's login name, nice and large and prominent % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Now show the boring particulars % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % That is it % restore showpage EOF そして, 変換フィルタやテキストフィルタがそれぞれ, - 最初にこのス クリプトを起動することで, - ヘッダページが出力され, それから, ユー - ザのジョブの印字をおこないます. 次に, - このドキュメントの始めのほう で紹介した DVI 変換フィルタを, - ヘッダページを印字するように変 更したものを示します. + 最初にこのスクリプトを起動することで, + ヘッダページが出力され, それから, + ユーザのジョブの印字をおこないます. 次に, + このドキュメントの始めのほうで紹介した DVI 変換フィルタを, + ヘッダページを印字するように変更したものを示します. #!/bin/sh # # psdf - DVI to PostScript printer filter # Installed in /usr/local/libexec/psdf # # Invoked by lpd when user runs lpr -d # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args このフィルタがユーザ名やホスト名を決定するために - 引数リストをど - のように解析しなくてはならないかという点に注意してください. - こ の解析方法は他の変換フィルタに対しても同様です. - しかしながら, テキストフィルタについては, - 引数の設定が少し異なっています (こ れについては, 「 フィルタはどのように機能しているか」 をご覧ください). 前述の通り, 上記の手法は, 極めて単純なのにも関らず, lprヘッダページを印字しないオプション - ( オプション) が 使えなくなっています. - ユーザが森林資源を (あるいは, ヘッダペー - ジが課金されているならば, その僅かな金額を), - 節約したいと望んでい る場合でも, + ( オプション) が使えなくなっています. + ユーザが森林資源を (あるいは, + ヘッダページが課金されているならば, その僅かな金額を), + 節約したいと望んでいる場合でも, すべてのフィルタがすべてのジョブ毎にヘッダページを印字 することになっているので, 節約することはできません. ジョブ毎に印字されるヘッダページを - ユーザが抑制できるようにする ためには, 「 ヘッダページに対する課金」で紹介したトリックを - 使う必要があります. すな わち, LPD + 使う必要があります. すなわち, LPD が生成するヘッダページの解析をおこない, PostScript - 版のヘッダページを出力させる出力フィルタを作るのです. この場 - 合, ユーザが lpr -h でジョブを入力すると, - LPD はヘッダペー ジを生成しなくなり, また, - 出力フィルタも起動されません. そうで ないならば, - 作成した出力フィルタが LPD からのテキストを読み込 み, - ヘッダページを印字する適当な PostScript のコードがプリ - ンタに送られるでしょう. + 版のヘッダページを出力させる出力フィルタを作るのです. + この場合, ユーザが lpr -h でジョブを入力すると, + LPD はヘッダページを生成しなくなり, また, + 出力フィルタも起動されません. そうでないならば, + 作成した出力フィルタが LPD からのテキストを読み込み, + ヘッダページを印字する適当な + PostScript のコードがプリンタに送られるでしょう. PostScript プリンタがシリアルポートに接続されている場合, 出力フィルタとして lprps を, - 上記の動作をおこなうものとして psof + 上記の動作をおこなうものとして psof を使うことができます. ただし, psof - はヘッダペー - ジに対して課金をおこないませんので注意してください. + はヘッダページに対して課金をおこないませんので注意してください. + リモートプリンタからの出力 - - FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ - モートプリンタに送ることをサポートしています. リモートプリンタ - からの出力をするには, 一般に, 次の2つを参照してください. + + プリンタ + ネットワーク + + ネットワークプリンタ + + FreeBSD では, ネットワーク越しの印字, すなわち, + ジョブをリモートプリンタに送ることをサポートしています. + リモートプリンタからの出力をするには, 一般に, + 次の2つを参照してください. - リモートホストに接続されたプリンタにアクセスする方 法. - プリンタがあるホストのシリアル, または, パラレルイ - ンタフェースに接続されている場合, ネットワーク上の他の - ホストからこのプリンタにアクセスできるように LPD を設 - 定します. 「リモートホストに接続されたプリンタにアクセスする方法. + プリンタがあるホストのシリアル, + または, パラレルインタフェースに接続されている場合, + ネットワーク上の他のホストからこのプリンタにアクセスできるように + LPD を設定します. 「リモートホストに 接続されたプリンタ」 - でどのよう にするかを説明します. + でどのようにするかを説明します. - ネットワークに直接接続されているプリンタにアクセ - スする方法. プリンタに, 旧来のシリアル, または, パラレ - ルインタフェースに加えて (もしくは, これらに代わって) ネッ - トワーク用のインタフェースがある場合. そのようなプリン - タは次のように動作するでしょう. + ネットワークに直接接続されているプリンタにアクセスする方法. + プリンタに, 旧来のシリアル, または, + パラレルインタフェースに加えて (もしくは, これらに代わって) + ネットワーク用のインタフェースがある場合. + そのようなプリンタは次のように動作するでしょう. - そのプリンタが LPD のプロトコルを理解でき, リモー - トホストからのジョブを - キューに入れることさえできる場合. この場合, - プリンタは, LPD が起動している一般のホスト - のように振る舞います. そのようなプリンタを設定するため - に, 「 + そのプリンタが LPD のプロトコルを理解でき, + リモートホストからのジョブを + キューに入れることさえできる場合. この場合, + プリンタは, LPD が起動している一般のホストのように振る舞います. + そのようなプリンタを設定するために, + 「 リモートホストに接続されたプリンタ」 - と同様の手 順をおこなってください. + と同様の手順をおこなってください. - そのプリンタが, データストリームによるネットワー - ク接続をサポートしている場合. この場合, ネットワーク上 - の1つのホストとしてプリンタを接続します. - このホス トは, ジョブをスプーリングする責任を負い, - スプーリング されたジョブはプリンタに送られます. - そのようなプリンタ - をインストールするためのいくつかの提案が「そのプリンタが, + データストリームによるネットワーク接続をサポートしている場合. + この場合, ネットワーク上の1つのホストとしてプリンタを + 接続します. + このホストは, ジョブをスプーリングする責任を負い, + スプーリングされたジョブはプリンタに送られます. + そのようなプリンタをインストールするためのいくつかの提案が + 「 ネットワークにおけるデータストリームの インタフェースを持つプリンタ」にあります. リモートホストに接続されたプリンタ - LPD スプーリングシステムでは LPD (または LPD 互換のシス - テム) - が起動している他のホストへジョブを送る機能が始めからサポー - トされています. この機能により, - あるホストに接続されたプリンタ へ, - 他のホストからアクセスできるようになります. また, LPD プ - ロトコルを理解するネットワークインタフェースを持った - プリンタに 対しても, この機能は働きます. + LPD スプーリングシステムでは LPD (または LPD 互換のシステム) + が起動している他のホストへジョブを送る機能が + 始めからサポートされています. この機能により, + あるホストに接続されたプリンタへ, + 他のホストからアクセスできるようになります. また, + LPD プロトコルを理解するネットワークインタフェースを持ったプリンタに対しても, + この機能は働きます. リモートプリンタへの出力を許可するためには, 最初に, あるホスト (これを, プリンタホストと呼びます) にプリンタを接続します. そして, 「 プリンタ設定導入編」 に書かれた簡単なプリンタの設定をおこなってください. 必要ならば, 「プリンタ設定上級編」 - にあ る, 更に進んだ設定をおこなってください. そして, - そのプリンタをテス トしてうまく動作することを確認し, LPD - に許可した機能がうまく働 くかどうかを見てください. さらに - ローカルホスト が - プリンタホスト の LPD サービスの使用を - 許可されているか確認して 下さい (「ローカルホストが + プリンタホストの LPD サービスの使用を + 許可されているか確認して下さい (「 リモートホストからのプリンタの利用を制限する 」参照). + + プリンタ + ネットワーク + + ネットワークプリンタ LPD - 互換のネットワークインタフェースを持つプリンタを使用してい - る場合は, そのプリンタ自身が以下で説明する - プリンタホスト になります. そして, - プリンタ名とは, そのプリンタに設定し - た名前のことを指します. これについては, プリンタ, および - (また は), - プリンタのネットワークインタフェースに付属するドキュメン - トを参照してください. + 互換のネットワークインタフェースを持つプリンタを使用している場合は, + そのプリンタ自身が以下で説明する + プリンタホストになります. そして, + プリンタ名とは, + そのプリンタに設定した名前のことを指します. + これについては, プリンタ, および (または), + プリンタのネットワークインタフェースに付属するドキュメントを参照してください. ヒューレット・パッカード社の Laserjet シリーズを使用している場合には, プリンタ名を text とすると, 自動的に LF から CRLF への変換が行なわれます. そのため, hpif スクリプトは必要ありません. 次に, そのプリンタにアクセスしたいと思っている他ホストにおいて, そのホストの /etc/printcap - ファイルに次にあげるエント リを作ります. + ファイルに次にあげるエントリを作ります. - 名前のエントリ. どんな名前でもよいのですが, 簡単 - のため, 多分, プリンタホストで設定されたプリンタ名や別 - 名と同じものを使いたいと思うでしょう. + 名前のエントリ. どんな名前でもよいのですが, 簡単のため, 多分, + プリンタホストで設定されたプリンタ名や別名と同じものを使いたいと思うでしょう. lp - 項目で指定されるデバイスは明示的に空にす る + 項目で指定されるデバイスは明示的に空にする (:lp=: とする). スプーリングディレクトリを作成し, - sd 項目で その位置を指定する. LPD - では, プリンタホストにジョブ を送信するまでの間, - このディレクトリにジョブを格納しま す. + sd 項目でその位置を指定する. LPD + では, プリンタホストにジョブを送信するまでの間, + このディレクトリにジョブを格納します. rm 項目でプリンタホストの名前を指定します. rp 項目で - プリンタホスト に接続したプリン - タ名を指定します. + プリンタホストに接続したプリンタ名を指定します. これで終わりです. 変換フィルタやページの大きさやその他の事項を /etc/printcap に加える必要はありません. 次に, リモートホストに接続されたプリンタで印字するための設定例 を示します. ホスト rose には2台のプリンタ bamboorattan が接続されています. これらのプリンタをホスト orchid のユーザが使えるようにしましょう. 最初に orchid/etc/printcap を示します (このファイルは, 「 ヘッダページの出力を許可する」 で参照することができます). このファイルには, 既に, プリンタ teak 用のエントリがありました. 以下では, これに, ホスト rose - にある2台のプリンタ用のエントリが加えられ ています. + にある2台のプリンタ用のエントリが加えられています. # # /etc/printcap for host orchid - added (remote) printers on rose # # # teak is local; it is connected directly to orchid: # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: # # rattan is connected to rose; send jobs for rattan to rose: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: # # bamboo is connected to rose as well: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo: orchid - で必要となる作業はスプーリングディレクトリを - 作ることだけです. + で必要となる作業はスプーリングディレクトリを作ることだけです. &prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo &prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo &prompt.root; chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo これで, orchid のユーザが rattanbamboo で印字す ることができるようになりました. - 例えば, orchid のユーザが次の - ように入力したとします. + 例えば, orchid のユーザが次のように入力したとします. &prompt.user; lpr -P bamboo -d sushi-review.dvi - すると, orchid の LPD システムは, ジョブをスプーリングディレ - クトリ /var/spool/lpd/bamboo + すると, orchid の LPD システムは, + ジョブをスプーリングディレクトリ + /var/spool/lpd/bamboo にコピーし, これが DVI ファイルを印字するジョブであることを記録します. ホスト rose の bamboo - 用のスプーリングディレクトリに十分な容量が確保でき - 次第, 両者の LPD は, ジョブのファイルを rose に転送します. こ - のファイルは, そのすべてが印字されるまで, rose - のキューに留まり - ます. (bamboo は PostScript プリンタなので) DVI から PostScript + 用のスプーリングディレクトリに十分な容量が確保でき次第, + 両者の LPD は, ジョブのファイルを rose に転送します. + このファイルは, そのすべてが印字されるまで, rose + のキューに留まります. + (bamboo は PostScript プリンタなので) DVI から PostScript への変換は rose でおこなわれます. - ネットワークにおけるデータストリームのインタ - フェースを持つプリンタ - - プリンタのネットワークインタフェースカードは, 2種類に分 - 類することができます. 1つはスプーラをエミュレートするもの - (高価) で, もう 1 - つはシリアルやパラレルポートを使うようにプリンタにデー - タを送ることができるだけのもの (安価) です. この節では, - 後者の使 い方を説明します. 前者のプリンタは, 前節「ネットワークにおけるデータストリームの + インタフェースを持つプリンタ + + プリンタのネットワークインタフェースカードは, + 2種類に分類することができます. + 1つはスプーラをエミュレートするもの (高価) で, もう 1 + つはシリアルやパラレルポートを使うように + プリンタにデータを送ることができるだけのもの (安価) です. この節では, + 後者の使い方を説明します. 前者のプリンタは, 前節「 リモートホストに接続されたプリンタ」 の方法が適用できます. /etc/printcap ファイルでは, - シリアルかパラレルのイン タフェースのどちらを使うのか, - そして, (シリアルインタフェース を使う場合) + シリアルかパラレルのインタフェースのどちらを使うのか, + そして, (シリアルインタフェースを使う場合) そのボーレートはいくらであるか, フロー制御は使うのか, タブのための遅延を加えるのか, - 改行文字を変換するかなどの指定を おこなうことができます. - しかし, TCP/IP や他のネットワークポートか - らデータを受け取るプリンタを接続するための - 指定をおこなうことはでき ません. + 改行文字を変換するかなどの指定をおこなうことができます. + しかし, TCP/IP や他のネットワークポートからデータを受け取るプリンタを + 接続するための指定をおこなうことはでき ません. ネットワーク接続されたプリンタにデータを送るためには, - テキスト フィルタと変換フィルタから呼び出すことができる - 通信プログラムを 開発する必要があります. 以下に, - そのようなプログラムの例を示し ます. スクリプト - netprint では, 標準入力から印字データを - すべて受け取り, + テキストフィルタと変換フィルタから呼び出すことができる + 通信プログラムを開発する必要があります. 以下に, + そのようなプログラムの例を示します.スクリプト + netprint では, + 標準入力から印字データをすべて受け取り, ネットワーク接続されたプリンタにこれを送ります. netprint - の最初の引数でプリンタのホスト名を, 2番目の引数 - で接続するポート番号を指定します. + の最初の引数でプリンタのホスト名を, + 2番目の引数で接続するポート番号を指定します. このプログラムでは単方向通信 (FreeBSD からプリンタ) - のみをサポートしていることに注意してくだ さい. - ネットワークプリンタの多くは双方向通信をサポートしていま - すので, その恩恵 (プリンタの状態を得たり, - 課金をおこなうなど) にあず かりたいと思われるかもしれません. + のみをサポートしていることに注意してください. + ネットワークプリンタの多くは双方向通信をサポートしていますので, + その恩恵 (プリンタの状態を得たり, + 課金をおこなうなど) にあずかりたいと思われるかもしれません. #!/usr/bin/perl # # netprint - Text filter for printer attached to network # Installed in /usr/local/libexec/netprint # $#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>"; $printer_host = $ARGV[0]; $printer_port = $ARGV[1]; require 'sys/socket.ph'; ($ignore, $ignore, $protocol) = getprotobyname('tcp'); ($ignore, $ignore, $ignore, $ignore, $address) = gethostbyname($printer_host); $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) || die "Can't create TCP/IP stream socket: $!"; connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!"; while (<STDIN>) { print PRINTER; } exit 0; このスクリプトは, 様々なフィルタが利用することができます. 仮に, Diablo 750-N - ラインプリンタを持っており, これがネットワークに - 接続されているとしましょう. - プリンタはポート番号5100にて印字す るデータを受け取ります. - プリンタのホスト名は scrivener としま す. このとき, - このプリンタのテキストフィルタは次のようになりま す. + ラインプリンタを持っており, + これがネットワークに接続されているとしましょう. + プリンタはポート番号 5100 にて印字するデータを受け取ります. + プリンタのホスト名は scrivener とします. このとき, + このプリンタのテキストフィルタは次のようになります. #!/bin/sh # # diablo-if-net - Text filter for Diablo printer `scrivener' listening # on port 5100. Installed in /usr/local/libexec/diablo-if-net # exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100 プリンタの利用に制約を与える - 本節では, プリンタの利用に制約を与えるための情報を記して - います. LPD システムでは, プリンタ (ローカル, リモートのいずれ - に接続されていても) にアクセスできる人を制限する機能, 複数部の - コピーの印字の可否を制御する機能, ジョブのサイズの最大値やプリ - ンタキューに入るジョブの最大個数を制御する - 機能を提供しています. + + プリンタ + 利用制限 + + 本節では, プリンタの利用に制約を与えるための情報を記しています. + LPD システムでは, プリンタ (ローカル, + リモートのいずれに接続されていても) + にアクセスできる人を制限する機能, + 複数部のコピーの印字の可否を制御する機能, + ジョブのサイズの最大値やプリンタキューに入る + ジョブの最大個数を制御する機能を提供しています. 複数部のコピーの印字を制限する LPD システムではユーザが複数部のコピーの印字を簡単におこなう 機能を提供しています. ユーザが, (例えば) lpr - -#5 コマ ンドを使ってジョブを印字すると, - ジョブのそれぞれのファイルのコ ピーを5部得ることができます. - これがよい機能であると思うかどう - かは人それぞれでしょう. + -#5 コマンドを使ってジョブを印字すると, + ジョブのそれぞれのファイルのコピーを5部得ることができます. + これがよい機能であると思うかどうかは人それぞれでしょう. 複数部のコピーの印字によってプリンタが - 必要以上に消耗してしまう - と感じるならば, /etc/printcap - ファイルに sc 項 - 目を加えてください. これにより, - &man.lpr.1; の オプションの使用 - が禁止されます. このオプションが指定されているにも関らず, + 必要以上に消耗してしまうと感じるならば, + /etc/printcap + ファイルに sc + 項目を加えてください. これにより, + &man.lpr.1; の + オプションの使用が禁止されます. + このオプションが指定されているにも関らず, オプションを使うと, 次のようなメッセージが表示され, - このオプションの利用できない旨を伝えます. + このオプションの利用できない旨を伝えます. lpr: multiple copies are not allowed リモートホストからプリンタをアクセスできる 設定にしている場合 (この 設定については, 「 リモートホストに接続されたプリンタ」 - をご覧ください), その リモートホストの + をご覧ください), そのリモートホストの /etc/printcap にも同じように sc 項目を追加する必要があることに注意してください. そうしないと, ユーザは別なホストから複数部のコピーの - 印字することができてしま います. + 印字することができてしまいます. 例を使って説明しましょう. 次に示す - /etc/printcap ファ イルは, ホスト + /etc/printcap ファイルは, ホスト rose のものです. プリンタ - rattan は極めて 頑丈なので, - 複数部のコピーの印字は許可されています. しかし, レー - ザプリンタの bamboo - はもう少しデリケートで, このプリンタ - から複数部のコピーを印字することを sc - 項目を追加すること で禁止しています. + rattan は極めて頑丈なので, + 複数部のコピーの印字は許可されています. しかし, + レーザプリンタの bamboo + はもう少しデリケートで, + このプリンタから複数部のコピーを印字することを sc + 項目を追加することで禁止しています. # # /etc/printcap for host rose - restrict multiple copies on bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: さらに, orchid の /etc/printcap - にも sc 項目を - 追加する必要があります (orchid - でこの編集をおこなっているときに, つ いでに, プリンタ - teak でも複数部のコピーの印字を禁止する - ことにしましょう). + にも sc + 項目を追加する必要があります (orchid + でこの編集をおこなっているときに, ついでに, プリンタ + teak + でも複数部のコピーの印字を禁止することにしましょう). # # /etc/printcap for host orchid - no multiple copies for local # printer teak or remote printer bamboo teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\ :if=/usr/local/libexec/ifhp:\ :vf=/usr/local/libexec/vfhp:\ :of=/usr/local/libexec/ofhp: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc: sc 項目を指定することにより, - lpr -# の使用を防 - ぐことができます. しかし, この状態では - &man.lpr.1; を複数回起動し - たり, 1回のジョブで次のように同じファイルを - 複数個指定すること - を防ぐまでには至っていません. + lpr -# + の使用を防ぐことができます. しかし, この状態では + &man.lpr.1; を複数回起動したり, + 1回のジョブで次のように同じファイルを複数個指定することを防ぐまでには至っていません. &prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign このような悪用を防ぐ方法は - (その指示を無視することも含めて) たく さんあります. + (その指示を無視することも含めて) たくさんあります. 各自で調べてみてください. プリンタを使用できる人を限定する - それぞれのプリンタを使用できる人を限定するには, UNIX の + それぞれのプリンタを使用できる人を限定するには, Unix の グループ権限のメカニズムを利用し, さらに, /etc/printcaprg 項目を指定することでおこないます. あるプリンタにアクセスさせてもよいと思うユーザすべてを - UNIXのある グループに入れてください. そして, - そのグループ名を rg で 指定します. + Unix のあるグループに入れてください. そして, + そのグループ名を rg で指定します. このとき, そのグループに含まれないユーザ - (root も含む) には, 次のようなメッセー - ジが表示され, プリンタの使用はできません. + (root も含む) には, 次のようなメッセージが表示され, + プリンタの使用はできません. lpr: Not a member of the restricted group sc (suppress multiple copies : - 複数部のコピーの印字を禁止 - する) を指定するときと同様に, rg - が指定されたプリンタがリ - モートホストからもアクセスでき + 複数部のコピーの印字を禁止する) + を指定するときと同様に, rg + が指定されたプリンタがリモートホストからもアクセスでき (この設定については, 「 リモートホストに接続されたプリンタ」 - をご覧ください), かつ, そ - のホストでもプリンタを使用できる人を限定するのが - 妥当であると思 - う場合は, そのホストの - /etc/printcap にも - rg 指 - 定をおこなう必要があります. + をご覧ください), かつ, + そのホストでもプリンタを使用できる人を限定するのが + 妥当であると思う場合は, + そのホストの /etc/printcap にも + rg + 指定をおこなう必要があります. 例えば, プリンタ rattan は誰でも利用できるが, bamboo はグループ - artists に属している人のみが利用で - きるようにしてみましょう. 以下に, もうお馴染みとなったホスト + artists + に属している人のみが利用できるようにしてみましょう. + 以下に, もうお馴染みとなったホスト rose/etc/printcap - を示します. + を示します. # # /etc/printcap for host rose - restricted group for bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: これ以外の /etc/printcap ファイル (ホスト orchid のもの) はそのままにしておくことにします. もちろん, - orchid のユーザは 全員 + orchid のユーザは全員 bamboo を利用することができます. これは, - orchid に - は特定のユーザのみにしかアクセスさせておらず, - そのユーザにはプ - リンタを利用させたいと思っているからなのかもしれませんし, - そう でないかもしれません. + orchid + には特定のユーザのみにしかアクセスさせておらず, + そのユーザにはプリンタを利用させたいと思っているからなのかもしれませんし, + そうでないかもしれません. - 1台のプリンタを複数グループのユーザに利用させること - はできません. + 1台のプリンタを複数グループのユーザに利用させることはできません. 入力可能なジョブのサイズを制限する + プリントジョブ たくさんのユーザからプリンタが利用される場合には, 多分, ユーザが印字要求を出すことができるファイルのサイズに - 上限値を置 く必要が生じるでしょう. 結局のところ, + 上限値を置く必要が生じるでしょう. 結局のところ, スプーリングディレクトリ が置かれているファイルシステムの空き容量がその - 上限値になる訳で すが, - あるユーザがこれを独占的に使用すること避けるために, 他ユー - ザからのジョブ用の空き容量を確保する必要もあります. - + 上限値になる訳ですが, + あるユーザがこれを独占的に使用すること避けるために, + 他ユーザからのジョブ用の空き容量を確保する必要もあります. + + + プリントジョブ + 制御 + LPD では, mx - 項目を指定することにより, ジョブ中の個々のファ - イルのサイズの上限値を制限する機能を提供しています. + 項目を指定することにより, + ジョブ中の個々のファイルのサイズの上限値を制限する機能を提供しています. 指定される ファイルサイズの単位は BUFSIZ ブロックで, 1 BUFSIZ ブロックは 1024バイトを表わします. この - mx 項目の値として0が指定されると, + mx 項目の値として 0 が指定されると, ファイルサイズの制限はなくなります. mx が指定されない場合は, デフォルトの制限として 1000 ブロックが使われます. この制限はジョブ中の各 ファイルに対して適用されるものであり, ジョブ全体のサイズ を制限するものではありません. ところで, - プリンタに設定された上限値を超えるファイルサイズのファ - イルが入力された場合でも, LPD はこれを拒否しません. その代わ - りに, このファイルは, - その先頭から上限値のファイルサイズまでし - かキューに入れられません. そして, その部分までが印字され, - 残り の部分は捨てられます. - これが正しい動作といえるのかどうかは議 - 論の余地があるところです. + プリンタに設定された上限値を超えるファイルサイズの + ファイルが入力された場合でも, LPD はこれを拒否しません. + その代わりに, このファイルは, + その先頭から上限値のファイルサイズまでしかキューに入れられません. + そして, その部分までが印字され, + 残りの部分は捨てられます. + これが正しい動作といえるのかどうかは議論の余地があるところです. それでは, 設定例に登場しているプリンタ rattanbamboo の印字可能なファイルサイズに制限を加えてみましょう. artists グループの人達が作る PostScript ファイルのサイズは 巨大になる傾向があるので, 上限値を5Mバイトとします. それから, - プレインテキスト用のラインプリンタは無制限とします. + プレインテキスト用のラインプリンタは無制限とします. # # /etc/printcap for host rose # # # No limit on job size: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:mx#0:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: # # Limit of five megabytes: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: この場合もそうですが, この制限はローカル (ホスト rose) - のユーザ のみに適用されます. - リモートホストからプリンタを利用できるよう - に設定している場合は, - そのリモートホストのユーザはこの制限を受 けません. - これらのユーザにも制限を加える場合は, リモートホスト の + のユーザのみに適用されます. + リモートホストからプリンタを利用できるように設定している場合は, + そのリモートホストのユーザはこの制限を受けません. + これらのユーザにも制限を加える場合は, リモートホストの /etc/printcapmx を指定する必要があります. リモートホストから印字するための詳しい情報については, 「 リモートホストに接続されたプリンタ」 を参照してください. リモートホストに接続されたプリンタへのジョブの - サイズを制限する 特別な方法は他にもあります. これについては, + サイズを制限する特別な方法は他にもあります. これについては, 「 リモートホストからのプリンタの利用を制限する」 を参照してください. リモートホストからのプリンタの利用を制限する - LPD スプーリングシステムでは, リモートホストから要求され - たジョブの印字を制限するための方法がいくつか - 提供されています. + LPD スプーリングシステムでは, リモートホストから要求された + ジョブの印字を制限するための方法がいくつか提供されています. ホストの制限 ローカルの LPD - が印字要求を受け付けるリモートホストは, ファイル + が印字要求を受け付けるリモートホストは, ファイル /etc/hosts.equiv/etc/hosts.lpd - によって制御することができます. LPD では, - あるホストから印字の要求がきたとき, このホス - トの名前がこれら2つのファイルのどちらかに含まれている + によって制御することができます. LPD では, + あるホストから印字の要求がきたとき, + このホストの名前がこれら2つのファイルのどちらかに含まれている かどうかを調べます. これが含まれていない場合は, LPD はこの要求を拒否します. これらのファイルの形式は単純です. 各行にホストの名前を 1つずつ書いていきます. ファイル /etc/hosts.equiv の方は - &man.ruserok.3; プロトコル - でも利用され, &man.rsh.1; や &man.rcp.1; - といったプログラム - の動作に影響するので注意が必要です. + &man.ruserok.3; プロトコルでも利用され, + &man.rsh.1; や &man.rcp.1; + といったプログラムの動作に影響するので注意が必要です. /etc/hosts.equiv の記述は慎重におこないましょう. 例として, 以下にホスト rose の - /etc/hosts.lpd を示します. + /etc/hosts.lpd を示します. orchid violet madrigal.fishbaum.de この例では, rose はホスト orchid, violet, - そして madrigal.fishbaum.de - からの要求を受け付けることになり ます. + からの要求を受け付けることになります. その他のホストが rose の LPD - にアクセスしようと しても, LPD はそのジョブを拒否します - (訳注:拒否されるのは, そのホストが - /etc/hosts.equiv にも含まれてい - ない場合です). + にアクセスしようと しても, LPD はそのジョブを拒否します + (訳注: 拒否されるのは, そのホストが + /etc/hosts.equiv + にも含まれていない場合です). サイズの制限 スプーリングディレクトリがある - ファイルシステムに残して - おく必要がある空き容量の大きさを制御することが - できます. + ファイルシステムに残しておく必要がある + 空き容量の大きさを制御することができます. ローカルプリンタ用のスプーリングディレクトリに minfree という名前のファイルを作成します. そして, - そのファイルの中にリモートホストからのジョブの要求を受 - け付けるために必要な空き容量のディスクブロックサイズ - (1 ディスクブロック=512バイト) を記します. + そのファイルの中にリモートホストからのジョブの + 要求を受け付けるために必要な空き容量のディスクブロックサイズ + (1 ディスクブロック =512 バイト) を記します. これで, - リモートホストのユーザにファイルシステムを満杯 - にされないことが保証されます. この機能を使うと, ローカ - ルホストのユーザに対してある種の優先権を与えることもで - きます. ローカルホストのユーザは, - minfree ファイ - ルで指定された値よりもディスクの空き容量が下回った後で - もずっと, + リモートホストのユーザにファイルシステムを満杯にされないことが保証されます. + この機能を使うと, + ローカルホストのユーザに対してある種の優先権を与えることもできます. + ローカルホストのユーザは, + minfree + ファイルで指定された値よりもディスクの空き容量が下回った後でもずっと, ジョブをキューに入れることができるのです. 例えば, プリンタ bamboo 用の - minfree を作っ てみましょう. - このプリンタのスプーリングディレクトリを 調べるために, - /etc/printcap を調べてみましょ - う. 以下に, bamboo - のエントリ部分を示します. + minfree を作ってみましょう. + このプリンタのスプーリングディレクトリを調べるために, + /etc/printcap を調べてみましょう. + 以下に, bamboo + のエントリ部分を示します. bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\ :if=/usr/local/libexec/psif:\ :df=/usr/local/libexec/psdf: スプーリングディレクトリは - sd で指定されます. LPD - がリモートホストからのジョブを受け付けるために必要 - なファイルシステムの空き容量を3Mバイト - (=6144ディスクブ ロック) にすることにしましょう. + sd で指定されます. LPD + がリモートホストからのジョブを受け付けるために必要な + ファイルシステムの空き容量を 3M バイト + (=6144 ディスクブロック) にすることにしましょう. &prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree 利用ユーザの制限 /etc/printcaprs 項目を指定することで, - ローカルプリンタを利用できるリモートホストのユーザを制 - 限することができます. ローカルホストに接続されたプリン - タ用のエントリに rs - 項目が指定されている場合, LPD - は印字を要求したユーザのアカウントと同じログイン名 - がローカルホストに登録されている場合に限り - , その - ジョブが受け付けられます. そうでないユーザからのジョブ - は LPD は拒否します. + ローカルプリンタを利用できるリモートホストのユーザを + 制限することができます. + ローカルホストに接続されたプリンタ用のエントリに + rs 項目が指定されている場合, LPD + は印字を要求したユーザのアカウントと同じログイン名が + ローカルホストに登録されている場合に限り, + そのジョブが受け付けられます. + そうでないユーザからのジョブは LPD は拒否します. この機能は, (例えば) - 複数の部署がネットワークを共有して おり, - この内のあるユーザが部署の境界を越えて活動してい - る場合には特に有用です. そのようなユーザに対して, シス - テムのアカウントを与えるだけで, これらのユーザは自分が - 所属する部署のシステムからそのシステムに接続されている - プリンタを使用することができます. これらのユーザにはむ - しろ, プリンタの使用だけを認め, - その他のコンピュー タ資源を利用させたくないときは, - それらのユーザにはホー ムディレクトリを与えず, - ログインシェルはシェルとしては 何の役にも立たない - /usr/bin/false などを指定 して, + 複数の部署がネットワークを共有しており, + この内のあるユーザが部署の境界を越えて活動している場合には特に有用です. + そのようなユーザに対して, システムのアカウントを与えるだけで, + これらのユーザは自分が所属する部署のシステムから + そのシステムに接続されているプリンタを使用することができます. + これらのユーザにはむしろ, + プリンタの使用だけを認め, + その他のコンピュータ資源を利用させたくないときは, + それらのユーザにはホームディレクトリを与えず, + ログインシェルはシェルとしては何の役にも立たない + /usr/bin/false などを指定して, これらのユーザのアカウントはプリンタ用の形式的なものとします. プリンタの利用に対する課金 - という訳で, 印字するためには料金をとることが必要です. 取ら - ない理由などありましょうか. 紙やインクにはお金がかかります. そ - して, プリンタの維持費もかかります. プリンタには可動部分が搭載 - されており, これらの部分は壊れやすいという傾向があります. プリ - ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー - ト, 1メートルなど) 当たりにかかるコストを調べておいてください. - これに基づき, プリンタの利用に対する課金を, 実際に, どのように - 始めればよいのでしょうか. + + 課金 + プリンタ + + という訳で, 印字するためには料金をとることが必要です. + 取らない理由などありましょうか. 紙やインクにはお金がかかります. + そして, プリンタの維持費もかかります. + プリンタには可動部分が搭載されており, + これらの部分は壊れやすいという傾向があります. + プリンタや, その利用形態, 維持費について調査をし, 1 ページ + (1 フィート, 1 メートルなど) 当たりにかかるコストを調べておいてください. + これに基づき, プリンタの利用に対する課金を, 実際に, + どのように始めればよいのでしょうか. さて, 残念ながら, この部分に関しては LPD - スプーリングシステム はほとんど役に立ちません. - 課金は使用しているプリンタの種類, 印 - 字するもののファイルの形式, + スプーリングシステムはほとんど役に立ちません. + 課金は使用しているプリンタの種類, 印字するもののファイルの形式, プリンタの利用に対する課金での あなた自身の要求に大きく左右されます. 課金システムを実現するためには, プリンタのテキストフィルタ - (プ レインテキストのジョブに対して課金するため) と変換フィルタ - (その 他のファイル形式に対して課金するため) を変更して, - 印字したペー ジを数えたり, - プリンタに印字したページ数を取得するための要求を - 送る必要があります. ただし, 出力フィルタのみを利用している場合 - は, 課金をおこなうことができません. フィルタに関しては, + (プレインテキストのジョブに対して課金するため) と変換フィルタ + (その他のファイル形式に対して課金するため) を変更して, + 印字したページを数えたり, + プリンタに印字したページ数を取得するための要求を送る必要があります. + ただし, 出力フィルタのみを利用している場合は, + 課金をおこなうことができません. フィルタに関しては, 「 - フィルタ」をご覧く ださい. + フィルタ」をご覧ください. - 一般に, 課金方式には次の2つがあります. + 一般に, 課金方式には次の2つがあります. 定期的に課金する方法 - はよく利用される方法です. この理由は, 恐らく, - 比較的簡単に実現できるからです. 誰 - かがジョブを印字する度に, フィルタはそのユーザ名, ホス - ト名, 印字したページ数を課金データファイルに記録します. - 毎月, 毎学期, 毎年, あるいは, お好みの時期に, 様々なプ - リンタの課金用ファイルを集め, それぞれのユーザが印字し - たページ数を合計し, その分の課金をおこないます. 次回の課金 - 時期のためのデータを0にして課金を再開するために, この - 処理をおこなった後, すべてのログファイルを削除し, + はよく利用される方法です. この理由は, + 恐らく比較的簡単に実現できるからです. + 誰かがジョブを印字する度に, フィルタはそのユーザ名, + ホスト名, 印字したページ数を課金データファイルに記録します. + 毎月, 毎学期, 毎年, その他お好みの時期に, + 各プリンタの課金用ファイルを集め, + それぞれのユーザが印字したページ数を合計して + その分の課金をおこないます. + 次回の課金期間をデータを 0 にして課金を再開するために, + すべてのログファイルを削除します. 利用毎に課金する方法 はあまり利用されていません. これは, 実現するのが比較的難しいからです. この方式では, - プリンタを使用したらすぐに, フィルタがユーザにその利用 - に対する課金をおこないます. ディスククオータのように, 課金 - 作業は瞬時におこなわれます. この方式では, ユーザのアカウン - トが赤字になる場合に, ユーザが印字をおこなうことを拒否する - ことができます. また, ユーザにプリンタ版 quotaを調べたり, + プリンタを使用したらすぐに, + フィルタがユーザにその利用に対する課金をおこないます. + ディスククオータのように, 課金作業は瞬時におこなわれます. + この方式では, ユーザのアカウントが赤字になる場合に, + ユーザが印字をおこなうことを拒否することができます. + また, ユーザにプリンタ版 quotaを調べたり, 調整したりする方法を提供したいと思うかもしれ ません. - これを実現するためには, ユーザとその quota を - 追跡するために, あるデータベース用のコードが必要となり - ます. + これを実現するためには, ユーザとその quota を追跡するために, + あるデータベース用のコードが必要となります. - LPD スプーリングシステムでは, 両方式を簡単にですがサポー - トしています. これは, (ほとんどの場合で) 印字作業をフィ - ルタがおこなっていたように, 課金作業もこのためのコードも用 - 意することで実現されています. しかし, 明るい面もありま す. - それは, 課金方式に関して, 非常に大きな柔軟性が与え - られたということです. 例えば, 「定期的に課金する方法」 か, - 「利用毎に課金する方法」のどちらかを選びまず, そし て, - どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印 - 字された頁数, 使用した紙の大きさ, 印字をするために要した - 時間など) をログに記録するかを決めます. 以上のことをおこな - うには, 上記の情報を保持するために, フィルタを変更しな - くてはなりません. + LPD スプーリングシステムでは, + 両方式を簡単にですがサポートしています. これは, (ほとんどの場合で) + 印字作業をフィルタがおこなっていたように, + 課金作業もこのためのコードも用意することで実現されています. + しかし, 明るい面もあります. + それは, 課金方式に関して, 非常に大きな柔軟性が与えられたということです. + 例えば, 「定期的に課金する方法」か, + 「利用毎に課金する方法」のどちらかを選びまず, そして, + どんな情報 (ユーザ名, ホスト名, ジョブのタイプ, 印字された頁数, + 使用した紙の大きさ, 印字をするために要した時間など) + をログに記録するかを決めます. + 以上のことをおこなうには, 上記の情報を保持するために, + フィルタを変更しなくてはなりません. 手軽なプリンタ課金方法 - FreeBSD には, 「定期的に課金する方法」による課金をすぐに - 設定できるように, 2個のプログラムを添付しています. そ - の内の1つはテキストフィルタ lpf で, - これについて - は, 「 + FreeBSD には, 「定期的に課金する方法」による課金を + すぐに設定できるように, 2個のプログラムを添付しています. + その内の1つはテキストフィルタ lpf で, + これについては, 「 テキストフィルタ lpf」をご覧ください. もう1つは, &man.pac.8; で, これはプリンタの課金データファイルからのエントリを集め, これを合計するプログラムです. フィルタはどのように機能しているか」で述べたように, - LPD では テキストフィルタや変換フィルタを起動しますが, - そのコマ - ンドラインで使用している課金データファイルの名前が指定 - されます. 両フィルタはこの引数を使って, どの課金データ - ファイルのエントリに書き込めばよいのかを知ることができ ます. + LPD ではテキストフィルタや変換フィルタを起動しますが, + そのコマンドラインで使用している課金データファイルの名前が指定されます. + 両フィルタはこの引数を使って, + どの課金データファイルのエントリに書き込めばよいのかを知ることができます. このファイルの名前は /etc/printcap 中の af 項目によって指定されます. このファイルが絶対パ スで指定されない場合は, - スプーリングディレクトリからの - 相対パスとして扱われます. + スプーリングディレクトリからの相対パスとして扱われます. LPD は, 紙のページの幅と行数 (pwpl 項目で 指定される) を引数として lpf を起動します. lpf - では, 何ページ印字したかを決定するためにこれ - らの引数を使用します. ファイルをプリンタに送った後, 課 - 金情報を課金データファイルに書き込みます. このファイル - は次のようになります. + では, 何ページ印字したかを決定するためにこれらの引数を使用します. + ファイルをプリンタに送った後, + 課金情報を課金データファイルに書き込みます. + このファイルは次のようになります. 2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang - 課金データファイルはプリンタ毎に分けて作るべきです. こ - れは, lpf - にはデータファイルをロックする機構が組 - み込まれていないためです. したがって, lpf - が2つ起動 されたとき, + 課金データファイルはプリンタ毎に分けて作るべきです. + これは, lpf + にはデータファイルをロックする機構が組み込まれていないためです. + したがって, lpf + が2つ起動されたとき, 同じファイルに同時に書き込みをおこなった場合, - お互いのエントリが破壊されてしまうかもしれません. 課金 - 用ファイルを各プリンタ毎に確実に分けるには, + お互いのエントリが破壊されてしまうかもしれません. + 課金用ファイルを各プリンタ毎に確実に分けるには, /etc/printcap 中の - af=acct 項目を使いま す. + af=acct 項目を使います. プリンタの利用に対してユーザに課金する準備ができたら, スプーリングディレクトリに移動した後, - &man.pac.8; と入力 - してください. 次のような, ドル中心主義の課金リストが表 - 示されます(訳注:ドル中心主義という表現は, 表示がドルで - 出ることへの著者の皮肉でしょう. セントがあるので小数点 - 以下が表示されますが, この機能も日本では邪魔ですね). + &man.pac.8; と入力してください. + 次のような, ドル中心主義の課金リストが表示されます + (訳注: ドル中心主義という表現は, + 表示がドルで出ることへの著者の皮肉でしょう. + セントがあるので小数点以下が表示されますが, + この機能も日本では邪魔ですね). Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74 - &man.pac.8; が受け付ける引数には - 次のようなものがあります. + &man.pac.8; が受け付ける引数には次のようなものがあります. プリンタ printer - の利用に対する課金リストを作成し ます. + の利用に対する課金リストを作成します. このオプションは, /etc/printcap - の af - が絶対パスで指定されていた場合に限り, 動作しま - す. + の af + が絶対パスで指定されていた場合に限り, 動作します. ユーザ名のアルファベット順ではなく, - 課金額の低い順にリ ストを並べます. + 課金額の低い順にリストを並べます. 課金データファイルにあるホスト名を無視します. - このオプショ ンを使用すると, ホスト + このオプションを使用すると, ホスト alpha のユーザ smith とホスト gamma のユーザ smith は同一人物として扱われます. - この オプションが指定されない場合は, - 両者は別なユーザとして 扱います. + このオプションが指定されない場合は, + 両者は別なユーザとして扱います. /etc/printcap の - pc 項目で指定された値, または, - デフォルトの値 (2セント) に代わり, 紙1ページ, ま たは, + pc 項目で指定された値, または, + デフォルトの値 (2セント) に代わり, 紙1ページ, または, 1フィート当たりの価格を指定します. - price として, + price として, 浮動小数点数を指定することができます. リストの並べる順番を逆順にします. 課金リストを作成し, 課金データファイルを削除します. name ユーザ names に対する課金情報のみを表示します. &man.pac.8; が生成するデフォルトのリストには, - 各ホストのユーザ別 - に印字ページ数が表示されます. - (ユーザがサイト内のすべてのホスト - を使用できるため) ホスト名の情報が意味を持たない場合, + 各ホストのユーザ別に印字ページ数が表示されます. + (ユーザがサイト内のすべてのホストを使用できるため) + ホスト名の情報が意味を持たない場合, pac -m を実行してください. 次のようなリストが得られます. Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74 課金額を決めるために, - &man.pac.8; は /etc/printcap ファ - イルの pc - 項目で指定された値 (デフォルト値は200, すなわち1 + &man.pac.8; は /etc/printcap + ファイルの pc + 項目で指定された値 (デフォルト値は 200, すなわち1 ページ当たり2セント) - を使います. この項目で, 印字物に課金したい - と思う1ページ当たり, - または, 1フィート当たりの価格を100分の1セ - ント単位で指定します. - &man.pac.8; を オプション付きで起動 - すると, この値を置き換えることができます. - この オプショ - ンで指定する額の単位は, - 100分の1セント単位ではなく, ドル単位で - す. 例えば, 次の指定では, - 1ページ当たりの単価が1ドル50セントに - なります. + を使います. この項目で,印字物に課金したい + ファと思う 1 ページ当たり, + または, 1 フィート当たりの価格を100分の1セント単位で指定します. + &man.pac.8; を オプション付きで起動すると, + この値を置き換えることができます. + この オプションで指定する額の単位は, + 100 分の 1 セント単位ではなく, ドル単位です. 例えば, 次の指定では, + 1 ページ当たりの単価が 1 ドル 50 セントになります. &prompt.root; pac -p1.50 このオプションを使うと, 実際の課金額を集計することができます. 最後に, pac -s - を起動すると, 課金情報は課金データ累計ファ - イルに保存されます. - このファイルの名前は, プリンタの課金データ - ファイルの後ろに - _sum を付けたものとなります. そして, 課 - 金データファイルは削除されます. 次に + を起動すると, 課金情報は課金データ累計ファイルに保存されます. + このファイルの名前は, プリンタの課金データファイルの後ろに + _sum を付けたものとなります. そして, + 課金データファイルは削除されます. 次に &man.pac.8; が起動されると, その時点までの累計金額を得るために, - 課金データ累計ファイルが読 - み込まれ, 通常の課金データファイルからの情報に - 加算されます. + 課金データ累計ファイルが読み込まれ, + 通常の課金データファイルからの情報に加算されます. 印字されたページ数をどのように数えるか? 課金を, リモートホストからの印字でさえも, - 正確におこなうため には, - ジョブで使用された紙が何ページであるかを特定でき - る必要があります. このことは, プリンタ利用に対する課金 - をおこなう上の根本的な問題です. - - プレインテキストのジョブの場合, 問題を解決するのはさほ - ど難しくはありません. ジョブが何行であったかを数え, プ - リンタがサポートしている紙1ページに印字できる最大の行 - 数と比較すればよいのです. 重ね打ちするために利用される - ファイル中のバックスペース文字や, 物理的に複数の行に渡 - る長い論理行に対する取り扱いを - 忘れずにおこなってください. + 正確におこなうためには, + ジョブで使用された紙が何ページであるかを特定できる必要があります. + このことは, プリンタ利用に対する課金をおこなう上の根本的な問題です. + + プレインテキストのジョブの場合, + 問題を解決するのはさほど難しくはありません. + ジョブが何行であったかを数え, プリンタがサポートしている紙 + 1 ページに印字できる最大の行数と比較すればよいのです. + 重ね打ちするために利用されるファイル中のバックスペース文字や, + 物理的に複数の行に渡る長い論理行に対する取り扱いを忘れずにおこなってください. (「テキストフィルタ lpf」で紹介した) テキストフィルタ - lpf では, 課金をおこなうときに, - これらの取り扱いをおこなってくれます. 課 - 金をおこなうために必要なテキストフィルタを作成している方は, + lpf では, 課金をおこなうときに, + これらの取り扱いをおこなってくれます. + 課金をおこなうために必要なテキストフィルタを作成している方は, lpf のソースコードが参考になるでしょう. これに対して, 他のファイル形式の処理はどのようにすれば よいのでしょうか. まず, DVI から LaserJet, または, DVI から PostScript への変換の場合, フィルタが dviljdvips の 出力メッセージを解析することで, - 何ページ分の変換がおこなわ れたかを知ることができます. - 他のファイル形式とその変換 プログラムに関しても, + 何ページ分の変換がおこなわれたかを知ることができます. + 他のファイル形式とその変換プログラムに関しても, 同様のことができるかもしれません. - しかし, この方式には問題点があります. それは, 変換され - たページがすべて印字されるとは限らないということです. 例 - えば, プリンタが紙詰まりを起こしたり, トナー切れになっ たり, - はたまた, 爆発したりするかもしれません. そのよう - な状況により印字が途中で中止されたとしても, この方式で は, + しかし, この方式には問題点があります. それは, + 変換されたページがすべて印字されるとは限らないということです. + 例えば, プリンタが紙詰まりを起こしたり, トナー切れになったり, + はたまた, 爆発したりするかもしれません. + そのような状況により印字が途中で中止されたとしても, この方式では, ユーザは全ページ分の料金を課されてしまうのです. - それでは, どのような対策をたてることができるのでしょう - か. + それでは, どのような対策をたてることができるのでしょうか. 正確な 課金をおこなうための唯一の確実な方法は, - 何 ページ印字したのかを知らせることができるプリンタを入手 - し, これをシリアルポートかネットワークに接続することで す. - ほとんどすべての PostScript プリンタではこの概念 - がサポートされています. 他のプリンタも同様です (Imagen - レーザプリンタをネットワーク接続するなど). それぞれの - プリンタのフィルタを, ジョブを印字した後で印字ページ数 - を得るように, 変更してください. そして, 課金情報はここ - で得られた値のみに - 基づいて記録してください. 行数 を数えたり, - エラーが生じやすいファイルの調査は必要とさ れません. - - もちろん, 気前よく印字料 - 金をすべて無料にすることもできます. + 何ページ印字したのかを知らせることができるプリンタを入手し, + これをシリアルポートかネットワークに接続することです. + ほとんどすべての PostScript + プリンタではこの概念がサポートされています. + 他のプリンタも同様です (Imagen + レーザプリンタをネットワーク接続するなど). + それぞれのプリンタのフィルタを, + ジョブを印字した後で印字ページ数を得るように変更してください. + そして, 課金情報はここで得られた値のみに + 基づいて記録してください. 行数を数えたり, + エラーが生じやすいファイルの調査は必要とされません. + + もちろん, + 気前よく印字料金をすべて無料にすることもできます. プリンタを使う - この節では, FreeBSD で設定したプリンタを使う方法について説明 - します. ここでは, ユーザレベルでのコマンドを概説します. + + プリンタ + 使い方 + + この節では, FreeBSD で設定したプリンタを使う方法について説明します. + ここでは, ユーザレベルでのコマンドを概説します. &man.lpr.1; 印字をおこないます. &man.lpq.1; プリンタキューを調べます. &man.lprm.1; プリンタキューにあるジョブを削除します. 管理者用コマンド &man.lpc.8; もありますが, - これは 「プリンタを管理する」 - に記 - します. このコマンドは, プリンタやそのキューの制御のために用い - られます. + これは「プリンタを管理する」 + に記します. このコマンドは, + プリンタやそのキューの制御のために用いられます. &man.lpr.1;, &man.lprm.1;, そして &man.lpq.1; の 3 コマンドは, オプションをとり, これによって, /etc/printcap のように操作の対象となる - プリンタやキュー - を指定します. これによって, 様々なプリンタに対してジョブを送る - , 取り消す, 調査することができます. - が使われなかった場 - 合は, これらのコマンドは - PRINTER 環境変数で指定されたプリンタ - を使用します. - そして, PRINTER 環境変数がなかった場合は, これ - らのコマンドはデフォルトのプリンタ + プリンタやキューを指定します. + これによって, 様々なプリンタに対してジョブを送る, + 取り消す, 調査することができます. + が使われなかった場合は, これらのコマンドは + PRINTER 環境変数で指定されたプリンタを使用します. + そして, PRINTER 環境変数がなかった場合は, + これらのコマンドはデフォルトのプリンタ lp を使います. 以下では, デフォルトプリンタ - という用語が意味するプリンタ は, PRINTER + という用語が意味するプリンタは, PRINTER 環境変数で指定されたプリンタ, もしくは, PRINTER 環境変数がない場合は, lp という名前のプリンタです. 印字する ファイルを印字するためには, 次のように入力してください. &prompt.user; lpr filename ... + 印刷 これにより, 入力されたファイルのそれぞれをデフォルトのプリンタ から印字します. ファイル名が与えられなかった場合, &man.lpr.1; - は標準入力から印字するデータを読み込みます. 例えば, 次のコマン - ドにより, ある重要なシステムファイルが印字されます. + は標準入力から印字するデータを読み込みます. 例えば, + 次のコマンドにより, ある重要なシステムファイルが印字されます. &prompt.user; lpr /etc/host.conf /etc/hosts.equiv 印字させるプリンタを選択するためには, - 次のように入力します. + 次のように入力します. &prompt.user; lpr -P printer-name filename ... 次の例では, プリンタ rattan に, - カレントディレクトリにあ - るファイルの詳細なリストを印字しています. + カレントディレクトリにあるファイルの詳細なリストを印字しています. &prompt.user; ls -l | lpr -P rattan 上記の &man.lpr.1; コマンドではファイル名の指定がないので, lpr は標準入力から印字するデータ, この場合, ls -l コマンドの出力, を読み込みます. &man.lpr.1; コマンドでは, - 出力の整形を制御したり, ファイル変換を - 適用したり, 複数部数のコピーを作成したり, などといた様々な幅広 - いオプションを受け付けることもできます. + 出力の整形を制御したり, ファイル変換を適用したり, + 複数部数のコピーを作成したり, + などといた様々な幅広いオプションを受け付けることもできます. 詳細については, 「 - その他の印字オプション」をご - 覧ください. + その他の印字オプション」をご覧ください. ジョブの処理状況を調べる + プリントジョブ &man.lpr.1; コマンドを使って印字をする場合, プリントしようと - するデータはプリントジョブ - と呼ばれる箱に一緒に置かれ, これが LPD スプーリングシステムに送られます. + するデータはプリントジョブと呼ばれる箱に一緒に置かれ, + これが LPD スプーリングシステムに送られます. プリンタにはそれぞれジョブ用のキューがあり, 送られてきたジョブはあなたや他のユーザからの別のジョブと一緒にそのキューで並んで, 処理される順番を待ちます. プリンタは到着順にこれらのジョブの印字をおこないます. デフォルトプリンタのキューの状態を表示するには, - &man.lpq.1; と入 - 力します. プリンタを指定するときは, - オプションを使い - ます. 例えば, 次のコマンド + &man.lpq.1; と入力します. プリンタを指定するときは, + オプションを使います. 例えば, 次のコマンド &prompt.user; lpq -P bamboo は, プリンタ bamboo - のキューの状態を表示します. この lpq - コマンドの出力結果の例を次に示します. + のキューの状態を表示します. この lpq + コマンドの出力結果の例を次に示します. bamboo is ready and printing Rank Owner Job Files Total Size active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes 2nd kelly 10 (standard input) 1635 bytes 3rd mary 11 ... 78519 bytes この例では, bamboo - のキューに3つのジョブがあることが分か ります. + のキューに3つのジョブがあることが分かります. 最初のジョブはユーザ kelly からのものであり, ジョブ番号 9 が割り当てられています. - プリンタのすべてのジョブには一意 - なジョブ番号が付けられています. ほとんどの場合, このジョブ番号 - は無視することができますが, ジョブをキャンセルするときにはこの - 番号が必要になります. このことの詳細については, 「ジョブの削除 」をご覧ください. ジョブ番号9のジョブは2つのファイルを処理します. すなわち, &man.lpr.1; のコマンドラインに複数のファイル名が与えられたときは, - 1つのジョブとして扱われるのです. このジョブは, 現在, アクティ - ブジョブ (Rank - の欄の active という後に注目) になってい - ます. これは, プリンタからそのジョブが現在印字されているはずで - あることを意味しています. 2番目のジョブでは, - &man.lpr.1; コマン - ドに標準入力からデータが与えられています. - 3番目のジョブはユー - ザ mary から与えられました. - このジョブのサイズはとても大きくなっ - ています. 彼女がプリントしようとしたファイルのパス名はここで表 - 示させるには長すぎるため, - &man.lpq.1; コマンドはドットを3つだけ - 表示しています. - - &man.lpq.1; からの - 出力で一番最初の行もまた有益な情報を与えていま - す. この行から, プリンタが現在何をしているか (あるいは, 少なく - とも LPD がプリンタが - していると思っていること) が分かります. + 1つのジョブとして扱われるのです. このジョブは, 現在, + アクティブジョブ (Rank + の欄の active という後に注目) になっています. + これは, プリンタからそのジョブが現在印字されているはずであることを意味しています. + 2 番目のジョブでは, + &man.lpr.1; コマンドに標準入力からデータが与えられています. + 3番目のジョブはユーザ mary から与えられました. + このジョブのサイズはとても大きくなっています. + 彼女がプリントしようとしたファイルのパス名はここで表示させるには長すぎるため, + &man.lpq.1; コマンドはドットを3つだけ表示しています. + + &man.lpq.1; からの出力で一番最初の行もまた有益な情報を与えています. + この行から, プリンタが現在何をしているか (あるいは, 少なくとも + LPD がプリンタがしていると思っていること) が分かります. &man.lpq.1; コマンドは - オプションもサポートしています. こ - れにより, - 詳しい情報が表示されます. lpq -l の実行例を次 - に示します. + オプションもサポートしています. + これにより, + 詳しい情報が表示されます. + lpq -l の実行例を次に示します. waiting for bamboo to become ready (offline ?) -kelly: 1st [job 009rose] - /etc/host.conf 73 bytes - /etc/hosts.equiv 15 bytes +kelly: 1st [job 009rose] + /etc/host.conf 73 bytes + /etc/hosts.equiv 15 bytes -kelly: 2nd [job 010rose] - (standard input) 1635 bytes +kelly: 2nd [job 010rose] + (standard input) 1635 bytes -mary: 3rd [job 011rose] +mary: 3rd [job 011rose] /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes ジョブの削除 印字するようジョブを 送った後で印字を中断したくなったときは, &man.lprm.1; コマンドで, - キューの中からそのジョブを削除することが - できます. 大抵の場合, アクティブジョブでさえも - &man.lprm.1; を使っ - て削除することができますが, - そのジョブの一部またはすべてが印字さ - れてしまうかもしれません. + キューの中からそのジョブを削除することができます. + 大抵の場合, アクティブジョブでさえも + &man.lprm.1; を使って削除することができますが, + そのジョブの一部またはすべてが印字されてしまうかもしれません. デフォルトプリンタへのジョブを削除するためには, 最初に, &man.lpq.1; を使ってそのジョブ番号を調べます. すなわち, それから, - 次のように入力して, ジョブを削除します. + 次のように入力して, ジョブを削除します. &prompt.user; lprm job-number 特定のプリンタへのジョブを削除するときは, - オプション - を使ってそのプリンタを指定します. + オプションを使ってそのプリンタを指定します. 例えば, プリンタ bamboo - のキューからジョブ番号 - 10のジョブを削除するには次のようにします. + のキューからジョブ番号 10 のジョブを削除するには次のようにします. &prompt.user; lprm -P bamboo 10 - &man.lprm.1; コマンドには略記法がいくつかあります. + &man.lprm.1; コマンドには略記法がいくつかあります. lprm - あなたが (デフォルトプリンタへ) - 送ったジョブをすべて削除し ます. + 送ったジョブをすべて削除します. lprm user ユーザ user が - (デフォルトプリンタへ) 送ったジョブ をすべて削除します. - 他のユーザのジョブを削除できるのはスー パユーザだけです. - あなたは, あなた自身のジョブしか削 - 除することはできません. + (デフォルトプリンタへ) 送ったジョブをすべて削除します. + 他のユーザのジョブを削除できるのはスーパユーザだけです. + あなたは, あなた自身のジョブしか削除することはできません. lprm ジョブ番号もユーザ名もシンボル - も指定されない - ときは, &man.lprm.1; は現在のアクティブジョブを, そのジョ - ブを送ったのがあなた自身であるときに限り, デフォルトプ - リンタから削除します. ただし, スーパユーザは任意のア - クティブジョブを削除することができます. + も指定されないときは, + &man.lprm.1; は現在のアクティブジョブを, + そのジョブを送ったのがあなた自身であるときに限り, + デフォルトプリンタから削除します. ただし, + スーパユーザは任意のアクティブジョブを削除することができます. 上記の略記法をデフォルトプリンタではなく - 特定のプリンタに対して おこなうときは, + 特定のプリンタに対しておこなうときは, オプションでそのプリンタを指定するだけよ いのです. 例えば, - プリンタ rattan のキューへあなたが送っ - たジョブをすべて削除するためには次のようにします. + プリンタ rattan のキューへあなたが送ったジョブを + すべて削除するためには次のようにします. &prompt.user; lprm -P rattan - - ネットワーク環境で作業をしている場合, あるホストか - ら送られたプリンタジョブは, これを送ったホストで - &man.lprm.1; を - 使った場合に限って, - これを削除することができます. 他のホストで - 同じプリンタを使えたとしても, - このジョブを削除することはできま - せん. - 次の例では, 他ホストからジョブを削除することを試みていま - す. + ネットワーク環境で作業をしている場合, + あるホストから送られたプリンタジョブは, これを送ったホストで + &man.lprm.1; を使った場合に限って, + これを削除することができます. + 他のホストで同じプリンタを使えたとしても, + このジョブを削除することはできません. + 次の例では, 他ホストからジョブを削除することを試みています. &prompt.user; lpr -P rattan myfile &prompt.user; rlogin orchid &prompt.user; lpq -P rattan -Rank Owner Job Files Total Size -active seeyan 12 ... 49123 bytes +Rank Owner Job Files Total Size +active seeyan 12 ... 49123 bytes 2nd kelly 13 myfile 12 bytes &prompt.user; lprm -P rattan 13 rose: Permission denied &prompt.user; logout &prompt.user; lprm -P rattan 13 dfA013rose dequeued cfA013rose dequeued その他の印字オプション &man.lpr.1; コマンドには, テキストの整形や, - 図や他のファイル形 - 式の変換, 複数部コピーの生成, ジョブの扱いなどをを制御すること - ができます. - この節では, これに関するオプションについて記してい - ます. + 図や他のファイル形式の変換, 複数部コピーの生成, + ジョブの扱いなどをを制御することができます. + この節では, これに関するオプションについて記しています. 整形と変換に関するオプション 以下の &man.lpr.1; 用のオプションはジョブにおける - ファイルの - 整形の制御に関するものです. - このオプションは, ジョブにプレイン - テキストが含まれない場合や - &man.pr.1; ユーティリティを使ってプレイ - ンテキストを整形する場合に用いてください. + ファイルの整形の制御に関するものです. + このオプションは, ジョブにプレインテキストが含まれない場合や + &man.pr.1; + ユーティリティを使ってプレインテキストを整形する場合に用いてください. + TeX 次の例では, プリンタ bamboo に (TeX 組版システムによる) DVI ファイル - fish-report.dvi を印字しています. + fish-report.dvi を印字しています. &prompt.user; lpr -P bamboo -d fish-report.dvi このオプションは, - ジョブに含まれるすべてのファイルに対して適用さ れます. + ジョブに含まれるすべてのファイルに対して適用されます. したがって, 1つのジョブに (例えば) DVI ファイルと ditroff ファイルを混在させることはできません. その代わりに, - ファイルを 形式毎に別々のジョブに分け, - それぞれのジョブでその形式用の変換 - オプションを使って印字してください. + ファイルを形式毎に別々のジョブに分け, + それぞれのジョブでその形式用の変換オプションを使って印字してください. を除くすべてのオプションを使用 するためには, 出力先プリンタ用の変換フィルタが必要です. 例えば, オプションを使用するには, DVI 用の変換フィルタが必要 です. 詳細については, 「 変換フィルタ」で説明しています. cifplot ファイルを印字します. DVI ファイルを印字します. FORTRAN プログラムを印字します. plot のデータを印字します. 出力に対して, number カラム分の字下げをおこないます. number が省略されると, 8カラム分字下げされます. - このオプションはある変換フィルタと一緒の指定されたとき - のみに機能します. + このオプションはある変換フィルタと一緒の指定されたときのみに機能します. と数字の間に空白を入れてはいけません. - 制御文字を含む文字通りの - テキストデータを印字します. + 制御文字を含む文字通りのテキストデータを印字します. - ditroff (device independent troff) データ - を印字します. + ditroff (device independent troff) データを印字します. -p 印字する前に &man.pr.1; - によってプレインテキストを整形し - ます. 詳細については &man.pr.1; をご覧ください. + によってプレインテキストを整形します. + 詳細については &man.pr.1; をご覧ください. &man.pr.1; コマンドにより生成されるヘッダを, - ファイル名の - 代わりに title とする. + ファイル名の代わりに title とする. このオプションは, と一緒に使ったときのみ機能する. troff データを印字します. ラスタのデータを印字します. - 次の例では, &man.ls.1; の - マニュアルを美しく整形したものをデフォ - ルトプリンタで印字しています. + 次の例では, &man.ls.1; + のマニュアルを美しく整形したものをデフォルトプリンタで印字しています. + &prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t &man.zcat.1; コマンドで &man.ls.1; のマニュアルのソースファイルの圧縮を復元し, これを &man.troff.1; コマンドに渡しています. これによりソースファイルが整形され GNU troff の形式となります. その結果は &man.lpr.1; に渡され, LPD スプーラへジョブの要求が発せられます. &man.lpr.1; には オプションが使われているため, スプーラでジョブを印字したときに GNU troff の形式から, デフォルトプリンタ解釈できる形式へと変換されます. ジョブに関するオプション - 以下のオプションは, &man.lpr.1; によって, そのジョブを特殊 - な扱いにするよう LPD に指示するためのものである. + 以下のオプションは, &man.lpr.1; によって, + そのジョブを特殊な扱いにするよう LPD に指示するためのものである. -# copies ジョブに含まれるファイルのそれぞれを - 1部だけ印字するの ではなく, + 1部だけ印字するのではなく, copies 部のコピーを生成させるものです. 管理者によっては, - プリンタの消耗を避け, コピー機による - 複製を奨励するためにこのオプションの使用が禁止されてい - るかもしれません. これに関しては, 「 複数部のコピーの印字を制限する 」をご覧ください. 次の例では, デフォルトプリンタで parser.c を3 部コピーし, 次に, parser.h を3部コピーしています. &prompt.user; lpr -#3 parser.c parser.h -m 印字ジョブが完了した後で, メールを送ります. このオプショ ンを付けると, LPD - システムはジョブの扱いが終了したと きに, - あなたのアカウントにメールを送ります. メールのメッ - セージには, ジョブが正常終了したのか, あるいは, 何か異 - 常があり, (しばしば) - その異常が何であったのかが書かれて います. + システムはジョブの扱いが終了したときに, + あなたのアカウントにメールを送ります. + メールのメッセージには, ジョブが正常終了したのか, あるいは, + 何か異常があり, (しばしば) + その異常が何であったのかが書かれています. -s 印字ファイルをスプールディレクトリにコピーせず, 代わりに, シンボリックリンクを作成するよう指示します. - 印字させるジョブのサイズが大きいとき, このオプショ - ンを使うと便利かもしれません. このオプションにより, + 印字させるジョブのサイズが大きいとき, + このオプションを使うと便利かもしれません. このオプションにより, スプー ルディレクトリの容量が節約されます (それに, - 巨大なジョ - ブのお陰でスプールディレクトリのあるファイルシステムの - 空き容量がなくなってしまうかもしれません). さらに, - LPD - がいちいちすべてのデータをコピーする必要がなくなりま - すので, 時間の節約にもなります. + 巨大なジョブのお陰でスプールディレクトリのあるファイルシステムの空き容量がなくなってしまうかもしれません). + さらに, LPD + がいちいちすべてのデータをコピーする必要がなくなりますので, + 時間の節約にもなります. ただし, 欠点もあります. LPD - はオリジナルのファイルを 直接参照するので, - 印字が終了するまでそのファイルを変更 - したり削除することができません. + はオリジナルのファイルを直接参照するので, + 印字が終了するまでそのファイルを変更したり削除することができません. - リモートのプリンタで印字している場合, LPD は, - 結局のところ, ローカルホストからリモートホストにファ - イルをコピーする必要があります. したがって, - オプ - ションはローカルのスプーリングディレクトリの - 空き容量を 節約するだけで, - リモート側では節約されません. それに も関わらず, + リモートのプリンタで印字している場合, LPD は, + 結局のところ, + ローカルホストからリモートホストにファイルをコピーする必要があります. したがって, + オプションはローカルのスプーリングディレクトリの空き容量を節約するだけで, + リモート側では節約されません. それにも関わらず, このオプションはそれでも有用です. -r ジョブに含まれるファイルを, スプーリングディレクトリに ファイルをコピーした後に削除します. もしくは, - オプションと一緒に使われた場合は, - 印字終了後に削除され ます. + オプションと一緒に使われた場合は, + 印字終了後に削除されます. このオプションの使用には十分注意して下さい. ヘッダページ用オプション 以下のオプションにより, ジョブのヘッダページに通常印字さ れるテキストを - &man.lpr.1; に調整させることができます. 対象のプリ - ンタからヘッダページが出力されない場合は, - これらのオプションは - 何の効力も持ちません. + &man.lpr.1; に調整させることができます. + 対象のプリンタからヘッダページが出力されない場合は, + これらのオプションは何の効力も持ちません. ヘッダページの設定に関する情報については, 「 ヘッダページ」を参照してください. -C text ヘッダページに印字されるホスト名を - text に置き換 えます. なお, - ホスト名の場所には, 通常, ジョブの要求が - あったホストの名前が印字されます. + text に置き換えます. なお, + ホスト名の場所には, 通常, + ジョブの要求があったホストの名前が印字されます. -J text ヘッダページに印字されるジョブ名を - text に置き換 えます. - ジョブ名の場所には, 通常, ジョブの最初のファイ ル名, + text に置き換えます. + ジョブ名の場所には, 通常, ジョブの最初のファイル名, または, 標準入力からデータが印字されたときは - stdinが印字されます. + stdin が印字されます. -h ヘッダページを出力を禁止します. - サイトによっ ては, - そのヘッダページの生成方法により, このオプション - の効果が現れないかもしれません. 詳細は, 「サイトによっては, + そのヘッダページの生成方法により, + このオプションの効果が現れないかもしれません. + 詳細は, 「 ヘッダページ」をご覧ください. プリンタを管理する プリンタの管理者として, プリンタの設置, 設定, - そして, それ - らのテストをおこなう必要がありました. + そして, それらのテストをおこなう必要がありました. &man.lpc.8; コマンドにより, これまでとは別な管理方法がプリンタと対話的におこなわれます. &man.lpc.8; により, 次のことが可能となります. プリンタの起動, 停止をおこなう. キューへの入力の許可, 禁止をおこなう. それぞれのキューにあるジョブの順番を変更する. 最初に用語に関する注意をしておきます. - プリンタが停止してい るとは, + プリンタが停止しているとは, キューの中にあるどのジョブも印字されることがない状態 を言います. この状態においても, - ユーザはまだジョブの要求をおこなう ことができますが, + ユーザはまだジョブの要求をおこなうことができますが, これらのジョブはキューの中で, プリンタがスタートする状態になるまで, - あるいは, キューの内容が削除され - るまで待たされることになります. + あるいは, キューの内容が削除されるまで待たされることになります. キューが禁止状態にあるとは, (root 以外の) すべてのユーザが プリンタにジョブを要求することができない状態のことを言います. キューが許可状態にある場合は, ジョブの入力が許可されます. キューが禁止状態にある場合でも, プリンタをスタートす る状態にすることは可能です. この場合は, キューが空になるまで, キュー内のジョブの印字が続けられます. 一般的に, - &man.lpc.8; コマンドを使用するには root の権限を持って - いる必要があります. 一般のユーザも - &man.lpc.8; コマンドを使うこと - はできますが, プリンタの状態を取得することとハングしたプリンタ + &man.lpc.8; コマンドを使用するには + root の権限を持っている必要があります. 一般のユーザも + &man.lpc.8; コマンドを使うことはできますが, + プリンタの状態を取得することとハングしたプリンタ を再スタートすることだけに使用が制限されています. 以下に, - &man.lpc.8; コマンドに関する説明の要約を述べます. ほとん - どのコマンドでは, 操作対象となるプリンタを指定するため + &man.lpc.8; コマンドに関する説明の要約を述べます. + ほとんどのコマンドでは, 操作対象となるプリンタを指定するため printer-name 引数を与えます. - printer-name の代わり - に all が与えられると, 操作は - /etc/printcap 内に - ある全プリンタに対しておこなわれることになります. + printer-name の代わりに + all が与えられると, 操作は + /etc/printcap + 内にある全プリンタに対しておこなわれることになります. abort printer-name 現在のジョブをキャンセルし, プリンタを停止させます. - キュー が許可状態にある場合は, - ユーザはまだジョブを入力する ことができます. + キューが許可状態にある場合は, + ユーザはまだジョブを入力することができます. clean printer-name プリンタのスプーリングディレクトリから, - ジョブの古いファ イルを削除します. 状況によって, - とりわけ, 印字途中でエ ラーが発生していたり, + ジョブの古いファイルを削除します. 状況によって, + とりわけ, 印字途中でエラーが発生していたり, 管理操作が頻発していた場合には, - ジョブで作られたファイルを LPDが完全に削除しないことが - あります. このコマンドでは, スプーリングディレクトリに - 入っていないファイルを見つけ出し, + ジョブで作られたファイルを LPD が完全に削除しないことが + あります. このコマンドでは, + スプーリングディレクトリに入っていないファイルを見つけ出し, それを削除しています. disable printer-name キューに新しいジョブを入れることを禁止します. プリンタ がスタート状態にあるときは, - キューに残っているジョブの 印字は続けられます. ただし, - キューが禁止状態にあったと しても, スーパーユーザ (root) - は常にジョブを入力するこ とができます. + キューに残っているジョブの印字は続けられます. ただし, + キューが禁止状態にあったとしても, スーパーユーザ (root) + は常にジョブを入力することができます. このコマンドは, - 新しいプリンタやフィルタを設置している - 間に使用すると有用です. すなわち, キューを禁止状態にし - ておくと, root によるジョブのみが入力されます. そして, + 新しいプリンタやフィルタを設置している間に使用すると有用です. + すなわち, キューを禁止状態にしておくと, + root によるジョブのみが入力されます. そして, その他のユーザは, テストが完了し, - enable コマン - ドでキューが再度許可状態になるまで, ジョブの入力はでき - なくなります. + enable + コマンドでキューが再度許可状態になるまで, + ジョブの入力はできなくなります. down printer-name message プリンタをダウンさせます. これは, - disable をおこなっ - た後で, stop をおこなった場合と - 等価になります. + disable をおこなった後で, + stop をおこなった場合と等価になります. message は, ユーザが - &man.lpq.1; コマンドでプリンタ - のキューの状態を調べたり, lpc status - でプリンタの - 状態を調べたときに, プリンタの状況として表示されるメッ - セージです. + &man.lpq.1; コマンドでプリンタのキューの状態を調べたり, + lpc status + でプリンタの状態を調べたときに, + プリンタの状況として表示されるメッセージです. enable printer-name プリンタのキューを許可状態にします. ユーザはジョブの入 力ができるようになりますが, プリンタがスタートの状態に なるまでは, プリンタからは何も印字されません. help command-name command-name - コマンドのヘルプメッセージを表示しま - す. command-name - が指定されなかった場合は, 利用 - できるコマンドの要約が表示されます. + コマンドのヘルプメッセージを表示します. + command-name + が指定されなかった場合は, + 利用できるコマンドの要約が表示されます. restart printer-name - プリンタをスタートさせます. 通常のユーザは, LPD があ - る異常な状況でハングしたときに限り, このコマンドを使用 - することができます. しかし, stop + プリンタをスタートさせます. 通常のユーザは, + LPD がある異常な状況でハングしたときに限り, + このコマンドを使用することができます. しかし, + stop または down コマンドにより, 停止状態にあるプリンタをスター トさせることはできません. restart コマンドは, abort の後に start - をおこなったことと同じになり ます. + をおこなったことと同じになります. start printer-name プリンタをスタートさせます. - プリンタのキューにあるジョ - ブを印字することでしょう. + プリンタのキューにあるジョブを印字することでしょう. stop printer-name プリンタを停止します. プリンタは, - 現在のジョブを終了さ せ, そして, + 現在のジョブを終了させ, そして, キューにあるその他のジョブは印字しません. - プリンタが停止状態にあったとしても, まだ, 許可状態にあ - るキューに対して, ジョブを送ることができます. + プリンタが停止状態にあったとしても, まだ, + 許可状態にあるキューに対して, ジョブを送ることができます. topq printer-name job-or-username printer-name のキューに対して, ジョブ番号 job のジョブ, または, ユーザ - username から送 - られたジョブを置き換えて, キューの先頭に持ってきます. + username + から送られたジョブを置き換えて, キューの先頭に持ってきます. このコマンドに関しては, printer-name の代わりに all を使用することはできません. up printer-name プリンタをアップ状態にします. これの反対のコマンドが down です. start - の次に enable をおこなっ - たことと等しくなります. + の次に enable + をおこなったことと等しくなります. コマンドラインから上記のコマンドを入力すると, - &man.lpc.8; はこれ - を受け付けます. コマンドが入力されなかった場合は, - &man.lpc.8; は - 対話モードに入り, + &man.lpc.8; + はこれを受け付けます. コマンドが入力されなかった場合は, + &man.lpc.8; は対話モードに入り, exit, quit, - または, ファイル終端 - 文字が入力されるまでコマンドの入力ができます. + または, + ファイル終端文字が入力されるまでコマンドの入力ができます. 標準スプーラの代替品 このマニュアルを最初から通読されている方ならば, ここまでで, FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき - ことすべてを学ばれたことと思います. 多分, このシステムに - あるたくさんの欠点について認識できたことでしょう. すると, + ことすべてを学ばれたことと思います. + 多分, このシステムにあるたくさんの欠点について認識できたことでしょう. + すると, (FreeBSD 上で動作する) - スプーリングシステムには他にどのような - ものがあるのかという疑問が自然と湧いてきます. + スプーリングシステムには他にどのようなものがあるのか + という疑問が自然と湧いてきます. - LPRng + + LPRng + + LPRng LPRng は, その称するところの意味は次世代の LPR です. これは PLP を完全に書き換えたものになっています. Patrick Powell と Justin Mason (PLP の主要な管理者) の共同で LPRng が作成されました. LPRng の主要サイトは ftp://dickory.sdsu.edu/pub/LPRng/ です. トラブルシューティング &man.lptest.1; を使った簡単なテストをおこなった結果, 正しい出 - 力を得られずに, 以下に示すような出力が得られるかもしれ - ません. + 力を得られずに, 以下に示すような出力が得られるかもしれません. しばらくしたら出力される, または, - 紙の全体が出て こない + 紙の全体が出てこない プリンタは上で示されたような印字を - おこなったのですが, しばら くして止まってしまい, - 動かなくなってしまいました. 印字 - された結果をプリンタから取り出すためには, - プリンタにある PRINT REMAINING ボタン, また は, FORM + おこなったのですが, しばらくして止まってしまい, + 動かなくなってしまいました. + 印字された結果をプリンタから取り出すためには, + プリンタにある PRINT REMAINING ボタン, または, FORM FEED ボタンを押す必要があるようです. この場合は, - おそらくジョブはプリントをする前に更にデー - タが送られてこないか待ち続けているのでしょう. + おそらくジョブはプリントをする前に + 更にデータが送られてこないか待ち続けているのでしょう. この問題を解決するためには, プリンタに FORM FEED 文字 (あるいは特定の必要な文字コード) を 送るテキストフィルタを使ってください. - プリンタ内部に残っ - たデータをプリンタにすぐに印字させるには, 普通は, - これ で十分です. + プリンタ内部に残ったデータをプリンタにすぐに印字させるには, + 普通はこれで十分です. 次のジョブが前のジョブの最終ページの中央の どこかから印字を開始させないためにも, - 紙の途中で印字の - ジョブが終了したかどうかを確認するのは有益です. + 紙の途中で印字のジョブが終了したかどうかを確認するのは有益です. シェルスクリプト /usr/local/libexec/if-simple を次のように変更して, プリンタへジョブを送信した後に - FORM FEED 文字を印字させるようにします. + FORM FEED 文字を印字させるようにします. #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf "\f" && exit 0 exit 2 階段効果が現れた - 次のような印字結果が得られた. + 次のような印字結果が得られた. !"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 + MS-DOS + OS/2 + ASCII あなたは「階段効果」 - の新たなる犠牲者になってしま いました. この原因は, + の新たなる犠牲者になってしまいました. この原因は, 改行を表わすべき文字がなんであるか - の解釈が混乱していることにあります. UNIX - スタイルのオ ペレーティングシステムでは, 改行文字は + の解釈が混乱していることにあります. Unix + スタイルのオペレーティングシステムでは, 改行文字は ASCII コード10 の line feed (LF) の1文字が使われています. MS-DOS や OS/2などは ASCII - コード10の LF , ASCII コード + コード10の LF , ASCII コード 13の文字 (carriage return または CR) をペアで使います. (訳注:Machintosh では CR のみで表現されています). 大抵のプリンタでは, - 改行を表わすために MS-DOS の慣習にしたが - います. + 改行を表わすために MS-DOS の慣習にしたがいます. FreeBSD で印字する場合, 印字したテキストは LF 文字だけ が使われていました. プリンタでは LF 文字を見つけると, 紙を1行分送り出しました. しかし, 次の文字を印字するた めの紙の水平方向の位置は維持されました. すなわち, CR 文字が意味することは, - 次の文字を印字する位置を紙の左端 - に動かすことです. + 次の文字を印字する位置を紙の左端に動かすことです. FreeBSD - がプリンタに動作をして欲しいと思っている動作を - 以下に示します. + がプリンタに動作をして欲しいと思っている動作を以下に示します. + プリンタが CR を受け取ったとき CR 動作 (復帰) をおこなう プリンタが LF を受け取ったとき CR + LF 動作 (復帰, 改行) をおこなう - このように動作させるための方法が - いくつかあります. + このように動作させるための方法がいくつかあります. - これらの文字の解釈を変えるために, プリンタ - の設定スイッチかコントロールパネルを操作する方 - 法. どのようにして設定をするかはプリンタのマニュ - アルを参照してください. + これらの文字の解釈を変えるために, + プリンタの設定スイッチかコントロールパネルを操作する方法. + どのようにして設定をするかはプリンタのマニュアルを参照してください. - FreeBSD 以外のオペレーティン - グシステムを切り替えて使う場合, CR と LF 文字 - の解釈をそのオペレーティングシステムで使われて - いるようにプリンタを - 再設定する必要がある - かもしれません. 以下に示す解決方法のいずれかを + FreeBSD + 以外のオペレーティングシステムを切り替えて使う場合, + CR と LF 文字の解釈をそのオペレーティングシステムで使われているようにプリンタを + 再設定する必要があるかもしれません. + 以下に示す解決方法のいずれかを 選ぶのがよいかもしれませんね. 自動的に LF を CR+LF に変換してくれる - FreeBSD 用のシリアルドライバを入手する方法. も - ちろん, このドライバはプリンタ専用に接続される + FreeBSD 用のシリアルドライバを入手する方法. + もちろん, このドライバはプリンタ専用に接続される シリアルポート - のみで動作します. この機能 - を許可するためには, - /etc/printcap ファ - イルで対象プリンタの fs - 項目で CRMOD ビッ トをセットします. + のみで動作します. + この機能を許可するためには, + /etc/printcap + ファイルで対象プリンタの fs + 項目で CRMOD ビットをセットします. LF - 文字の扱いを一時的に変更するためのエ - スケープコードをプリンタに送る方法. - プリンタ - がサポートしているかもしれないエスケープコード - については, プリンタのマニュアルを参照してくだ - さい. 適切なエスケープコードが見つかったら, 最 - 初にそのコードを送り, 次にプリントジョブを送信 + 文字の扱いを一時的に変更するための + エスケープコード + をプリンタに送る方法. + プリンタがサポートしているかもしれないエスケープコード + については, + プリンタのマニュアルを参照してください. + 適切なエスケープコードが見つかったら, + 最初にそのコードを送り, 次にプリントジョブを送信 するようにテキストフィルタを変更してください. + PCL 次に, Hewlett Packard 社の PCL - エスケープコー - ドに対応しているプリンタのためのテキストフィル - タの例を示します. このフィルタでは, プリンタ に + エスケープコードに対応しているプリンタのための + テキストフィルタの例を示します. + このフィルタでは, プリンタ に LF 文字を LF と CR の2文字として扱わせます. その後に, プリンタにジョブを送ります. 最後に, ジョブの最終ページの紙を排出するため, FROM FEED 文字を送ります. このフィルタは Hewlett Packard - 社のほとんどすべてのプリンタで機能するは - ずです. + 社のほとんどすべてのプリンタで機能するはずです. #!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Ejects the page when done. printf "\033&k2G" && cat && printf "\f" && exit 0 exit 2 ホスト orchid にある - /etc/printcap の - 例を以下に示します. ここには, 一番目のパラレル - ポートにプリンタ (Hewlett Packard LaserJet 3Si) + /etc/printcap + の例を以下に示します. ここには, + 一番目のパラレルポートにプリンタ + (Hewlett Packard LaserJet 3Si) が一台接続されており, そのプリンタ名は - teak です. + teak です. # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif: - 訳注: LF を CR+LF - に置き換える cat コマンド - を作る方法も当然考えられます. そして, このコマ - ンドと, if-simple の cat の部分 - を置き換えればよいわけです. 具体的にどのように - するかは, 読者への練習問題としましょう. + 訳注 + + LF を CR+LF + に置き換える cat コマンドを作る方法も当然考えられます. + そして, このコマンドと, if-simple の cat + の部分を置き換えればよいわけです. + 具体的にどのようにするかは, + 読者への練習問題としましょう. 各行が重ね書きされてしまった プリンタは紙送りをまったくしませんでした. - テキストすべての行 - がある行の上で重ねて印字されてしまいました. + テキストすべての行がある行の上で重ねて印字されてしまいました. + この問題は, - 階段現象とは正反対な問題で, ほとんどま - れにしか起こりません. FreeBSDでは行末として扱われる + 階段現象とは正反対な問題で, + ほとんどまれにしか起こりません. FreeBSDでは行末として扱われる LF 文字が, 紙の左端に印字位置を復帰しますが, - 紙送りはしな い CR 文字として扱われています. + 紙送りはしない CR 文字として扱われています. - プリンタの設定スイッチかコントロールパネルを - 使って, LF と CR + プリンタの設定スイッチかコントロールパネルを使って, + LF と CR の文字を次のような解釈をするようにしてください. プリンタが受け取ったとき プリンタがおこなう CR CR 動作 (復帰) LF CR + LF (復帰, 改行) - 訳注: LF を CR+LF - に置き換える cat コマンドを作る方法 - も当然考えられます. そして, このコマンドと, + 訳注 + + LF を CR+LF + に置き換える cat コマンドを作る方法も当然考えられます. + そして, このコマンドと, if-simple の cat - の部分を置き換えればよいわけ です. - 具体的にどのようにするかは, 読者への練習問題とし - ましょう. + の部分を置き換えればよいわけです. + 具体的にどのようにするかは, + 読者への練習問題としましょう. プリンタが文字を紛失してしまう 印字しているのですが, 各行の2〜3文字が印字されません. プリンタを動かせば動かすほど, - もっとたくさんの文字が紛 失されていき, - この問題は更に悪くなっていくかもしれませ - んでした. + もっとたくさんの文字が紛失されていき, + この問題は更に悪くなっていくかもしれませんでした. この問題は, - シリアルポートを通してコンピュータから送ら - れてくるデータの速度に, - プリンタがついていけないことに 起因します - (この問題は, パラレルポートに接続されたプリ - ンタでは発生することはありません). - この問題を克服する 方法が2つあります. + シリアルポートを通してコンピュータから送られてくるデータの速度に, + プリンタがついていけないことに起因します + (この問題は, パラレルポートに接続された + プリンタでは発生することはありません). + この問題を克服する方法が2つあります. プリンタが XON/XOFF のフロー制御をサポート している場合は, 項目 fs で TANDEM ビット をセットして, FreeBSD - にこの機能を使用させて ください. + にこの機能を使用させてください. プリンタがキャリアフロー制御をサポートして いる場合は, 項目 fs で MDMBUF - ビットをセッ トして下さい. それから, - プリンタとコンピュータ - を接続しているシリアルケーブルがキャリアフロー - 制御用に正しく配線されたものかどうかを確認して - ください. + ビットをセットして下さい. それから, + プリンタとコンピュータを接続しているシリアルケーブルが + キャリアフロー制御用に正しく配線されたものかどうかを確認してください. プリンタがフロー制御をまったく - サポートしていな い場合は, 項目 - fs の NLDELAY と TBDELAY, - CRDELAY, VTDELAY, BSDELA のいくつかのビッ - トを組み合わせて使い, プリンタへ送るデータの流 - れに適当な遅延を加えてください. + サポートしていない場合は, 項目 + fs の NLDELAY と TBDELAY, + CRDELAY, VTDELAY, BSDELA + のいくつかのビットを組み合わせて使い, + プリンタへ送るデータの流れに適当な遅延を加えてください. - プリンタは意味不明な - 文字列を印字した + プリンタは意味不明な文字列を印字した プリンタはランダムなゴミのように - 見えるものを印字しまし たが, + 見えるものを印字しましたが, 意図したテキストは印字してくれませんでした. この問題は, 通常, シリアルポートに接続したプリンタでの 通信パラメータの誤りからくる前項とは別の症状です. br 項目の通信速度と fsfc - 項目のパリ ティビットの設定を共に調べてみてください. - また, プリン タでの設定が + 項目のパリティビットの設定を共に調べてみてください. + また, プリンタでの設定が /etc/printcap ファイルで設定した 内容と一致しているかどうかも確認してください. - 訳注: simple-if - のような単純なフィルタだけの状態で, 日 - 本語を含むテキストを印字しようとした場合にも, - シリアル ポート, パラレルポートの使用に関係なく, - このような症状 は見られます. 日本語プリンタの場合, + 訳注 + + simple-if + のような単純なフィルタだけの状態で, + 日本語を含むテキストを印字しようとした場合にも, + シリアルポート, パラレルポートの使用に関係なく, + このような症状は見られます. 日本語プリンタの場合, 漢字コードそのもの を送信しただけでその漢字を印字してくれるものは, - 少なく とも訳者は見たことがありません. + 少なくとも訳者は見たことがありません. 漢字を印字するための制御 コードを別途送信するフィルタが必要となります. - また, そ のようなフィルタを使用していても, - そのフィルタが想定し - てる漢字コードと異なった文書を + また, そのようなフィルタを使用していても, + そのフィルタが想定してる漢字コードと異なった文書を プリントしようとしたとき もこのような症状は出ます. もちろん, これはプリンタ用の 言語を持たないプリンタの話で, PostScript プリンタ などにプレインテキストを送信しても, 日本語対応, - 非対応 に関らず, 意味不明な文字列が印字される - (もしくは, 何も 印字されない) ことでしょう. + 非対応に関らず, 意味不明な文字列が印字される + (もしくは, 何も印字されない) ことでしょう. 何も起きない もしプリンタが何の動作もしないのであれば, - ハード的な問 題ではなく, 多分 FreeBSD + ハード的な問題ではなく, 多分 FreeBSD の中に問題があります. /etc/printcap ファイルで, - デバッグしているプ リンタのエントリに - (lf 項目で) ログファイルを取るよ - うに設定を追加してください. 例えば, プリンタ + デバッグしているプリンタのエントリに + (lf 項目で) ログファイルを取るように + 設定を追加してください. 例えば, プリンタ rattan 用のエントリの項目 - lf は次のようになります. + lf は次のようになります. rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple:\ :lf=/var/log/rattan.log 次に, もう一度印字をおこなってみます. そして, - 発生したと思 - われるエラーメッセージを見るためにログファイル - (上記の 例では, + 発生したと思われるエラーメッセージを見るためにログファイル + (上記の例では, /var/log/rattan.log) - を調べます. そこ で見られたメッセージを元に, + を調べます. そこで見られたメッセージを元に, 問題を解決してみてください. 項目 lf が指定されていない場合, LPD はデフォルト のログファイルとして /dev/console を使います. diff --git a/ja_JP.eucJP/books/handbook/security/chapter.sgml b/ja_JP.eucJP/books/handbook/security/chapter.sgml index ebe81ad0ce..f558530068 100644 --- a/ja_JP.eucJP/books/handbook/security/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/security/chapter.sgml @@ -1,2988 +1,3203 @@ セキュリティ この章の多くの部分は&a.dillon;によって書かれた &man.security.7; マニュアルページからの引用です. 訳: &a.jp.hino;, (jpman プロジェクトの成果を利用させ - ていただきましたした). + ていただきました). この章では この章では, 基本的なシステムセキュリティの考え方, 覚えておくべき一般的なルールを紹介し, そして S/Key, OpenSSL, Kerberos などの高度な話題について簡単に説明します. はじめに セキュリティとは, システム管理者をいつも悩ませる仕事の一つです. すべての BSD UNIX マルチユーザシステムは, 従来からいくつかのセキュリティ機構を備えていますが, ユーザを疑心暗鬼に陥らせないように追加のセキュリティ機構を構築し 保守する仕事はおそらく, システム管理者としてもっとも大きな責務の一つでしょう. マシンの安全性に反映されるのは, 管理者が作業したことだけです. またセキュリティ問題は, 快適な環境に必要なものと競合します. 一般に UNIX システムは膨大な数のプロセスを同時に動作させることができ, そのプロセスの大部分は, サーバ – 外部から接続し, 通信するものとして動作します. かつてのミニコンとメインフレームがデスクトップにとってかわり, さらにコンピュータが相互に接続されたネットワークを形成するようになった今日, セキュリティは非常に大きな関心事になってきています. セキュリティを実装するには, タマネギのように階層化する手法 (a layered onion approach) が最適です. どうすれば良いのか簡単に説明すると, 便利な機能と同じ数だけセキュリティの階層を作り, システムへの侵入を注意深く監視するのです. あなたはセキュリティを過度に厳重にしたり, 侵入の監視に時間をとられたいとは思わないでしょう. この侵入の発見という部分は, あらゆるセキュリティ機構において最も重要な部分の一つなのです. たとえば, システムの各バイナリに schg フラグ を設定するのは, 大して意味がありません. フラグを設定すると一時的にバイナリが保護され, 侵入してきたクラッカーによってシステムに加えられる変更のうち, 容易に検出可能な変更は行なえなくなります. しかしその結果として, セキュリティ機構がその侵入者を検出することも まったくできなくなってしまうでしょう. また, システムセキュリティには, さまざまな形での攻撃に対処することとも関係しています. この攻撃には root 権限を奪おうとするものだけでなく, クラッシュやシステムの不安定状態を引き起こそうとするものを含まれます. このセキュリティ問題は, いくつかに分類することが可能です. サービス妨害攻撃 (denial of service attack) ユーザアカウントの不正利用 (user account compromise) アクセス可能なサーバを使った root 権限の不正利用 ユーザアカウントを経由した root 権限の不正使用 バックドアの設置 サービス妨害攻撃 (DoS 攻撃) とは, マシンから必要な資源を奪う行為です. 通常, サービス妨害攻撃はそのマシンで実行されるサーバや ネットワークスタックを過負荷状態にしてマシンをクラッシュさせたり, マシンを使えなくしたりするような力任せの方法です. サービス妨害攻撃の中には, ネットワークスタックのバグを利用して, パケット一つでマシンをクラッシュさせようとするものもあります. 後者には, カーネルにバグ修正を施すことによってのみ対応することができます. サーバプロセスに対する攻撃は, オプションを適切に指定することによって, 攻撃されている状況でサーバプロセスの負荷上昇に限界を設定することで 対応できる場合が多いです. これらに比べると, ネットワークへの力任せの攻撃への対応はずっと難しくなります. たとえば, 偽造パケットによる攻撃 (spoof-packet attack) は, インターネットからシステムを切り離す以外の方法で 防ぐことはほとんど不可能です. この攻撃によって, マシンを落としてしまうことはできないかもしれませんが, 接続しているインターネット回線を混雑させていっぱいにしてしまうことはできます. ユーザアカウントの不正利用は, サービス妨害攻撃 よりもずっとよくある問題です. このご時勢でも, 自分たちのマシンで 標準の telnetd, rlogind, rshd, ftpd サーバを実行させているシステ ム管理者は多いのです. これらのサーバは, デフォルトでは, 暗号化さ れたコネクション上で動作していません. その結果, 抱えているユーザ 数が標準くらいであれば, リモートログイン (そのシステムにログイン するには最も普通で便利な方法です) しているユーザのうち一人以上は, パスワードを覗き見られてしまうでしょう. システム管理者が注意深い 人ならば, たとえログインが成功していたとしても, リモートアクセス ログを解析して, 疑わしい送信元アドレスを探すものです. ひとたび攻撃者がユーザアカウントへのアクセス権を入手すると, 攻撃者が root の権限を破る可能性があることを仮定するべきです. し かし, セキュリティを十分維持し, 手入れの行き届いたシステムにおい ては, あるユーザアカウントへのアクセスが可能となっても, 攻撃者に 必ずしも root へのアクセス権を与えるとは限りません. こ の違いは重要です. というのは, 一般的に root へのアクセス権がなければ, 攻撃者は自分の侵入の痕跡を隠蔽することができませんし, そ のユーザのファイルを引っかき回したり, マシンをクラッシュさせたり できるのがせいぜいです. ユーザアカウントの不正利用は めずらしいことではありません. それは一般ユーザに, システム管 理者ほど注意を払わない傾向があるからです. システム管理者は「あるマシン上で root の権限を破る方法は, 潜 在的に何通りもあるのだ」ということを心しておかねばなりません. 攻撃 者が root のパスワードを知ってしまうかもしれませんし, 攻撃者が root の権限で実行されるサーバのバグを見つけ, ネットワークからそ のサーバへ接続して root の権限を破ることができるかもしれません. ひとたびユーザアカウントを破ると, ユーザアカウントから root の権 限を破ることを可能にするような suid-root プログラムに存在するバグを 攻撃者は知っているかもしれません. あるマシン上で攻撃者 が root の権限を破る方法を知ったとすると, 攻撃者は, 裏口を作る必 要はありません. これまでに発見され, ふさがれた root の 穴の多くには, クラッカーが侵入した跡を消そうとしてたくさん仕事し た結果が含まれています. そのためにこそ, 多くのクラッカーは裏口を 作るのです. 攻撃者は裏口を使ってシステムへの root アクセスを再び 簡単に得ることができます. しかしこの裏口は, クラッカーの検出をす るのに便利なものでもあります. クラッカーに裏口を作らせないように するということは, セキュリティにとっては実際には良くないことかも しれません. なぜなら, そうすることで, クラッカーが最初に侵入して くるために発見したセキュリティホールがふさがるわけではないからで す. セキュリティを改善する方法は, 常に, タマネギの皮 のように階層化する手法 (a multi-layered onion peel approach) で実装されるべきです. これら は次のように分類できます. root とスタッフのアカウントの安全性を高める. root の安全性を高める – root 権限で動作するサーバ と suid/sgid バイナリ. ユーザアカウントの安全性を高める. パスワードファイルの安全性を高める. カーネルのコア, raw デバイス, ファイルシステムの安全性を 高める. システムに対して行なわれた, 不適切な変更をすばやく検出す る. 必要と思われる以上の対応をとる (paranoia). 本章の次の節では, 上記の各項目についてより深く掘り下げていき ます. FreeBSDの安全性を高める 以下の節では, 本章の前節 でとりあげた FreeBSD システムの安全性を高める方法について 述べます. root アカウントとスタッフアカウントの安全性を高める root のアカウントの安全性を確保しないうちからスタッフのア カウントの安全性をうんぬんしてもしかたがありません. ほとんどの システムでは, root アカウントに割り当てたパスワードが 1 つあり ます. まず最初にすべきことは, このパスワードはいつで も不正利用の危険に晒されていると仮定することです. これは root のパスワードを消すべきだと言っているのではありません. root のパスワードは, マシンにコンソールからアクセスするのには, ほとんどいつでも必要なものです. ここで言いたいのは, コンソール 以外からは, そして可能なら &man.su.1; コマンドを実行する場合も root のパスワードを使えないようにするべきである, ということで す. たとえば, あなたが使っている pty が, /etc/ttys ファイルで unsecure と指定 されているか確認してください. そうすると, telnetrlogin 経由では root で直接ログインできないようになります. sshd のような, 別のログインサービス を使っている場合でも同様に, 直接 root へログインすることを許し ていないかどうか確認してください. すべてのアクセス手段 – たとえば ftp のようなサービスが, 良くクラックの対象となることを 考えましょう. root への直接ログインは, シス テムコンソール経由でのみ可能であるべきなのです. また当然, システム管理者として自分が root になれるようにしておく必要が ありますから, そのための穴をいくつか開けておきます. し かし, それらの穴を動作させるには, さらに追加のパスワード認証が 必要であるようにしておくことが重要です. root でアクセス可能と する方法の一つとして, 適切なスタッフアカウントを (/etc/group 中の) wheel グループに加えることがありま す. wheel グループに入っているスタッフメン バは su を使って root になることが許されま す. パスワードエントリにおいて, スタッフメンバを wheel グループに置くことによって直接 wheel 権限を与えてはいけません. スタッフメンバのアカウントは staff グループに所属させるべきで, そして /etc/group ファイルを通して wheel グループに加えるべきです. 実際に root アクセスの必要なスタッフメンバのみ wheel グ ループに置くようにすべきです. 他の認証方法の場合, たとえば kerberos を使用する場合には, root アカウントの .k5login ファイルを使って, 誰も wheel グループに置く必要なく &man.ksu.1; を 使って root になることを許すようにすることもできます. このやり 方はよりよい解決策なのかもしれません. なぜなら, wheel のメカニズムでは, 侵入者がパスワード ファイルを手に入れ, スタッフアカウントのいずれか 1 つを破るこ とができると, root を破ることがまだできてしまうからです. wheel のメカニズムを用いる方が, 何もしない よりは良いのですが, 必ずしも最も安全な選択肢とは限りません. root アカウントの安全性を高める間接的な方法として, 別のロ グインアクセスの方法を用いてスタッフのアカウントの安全性を高め, その上でそのスタッフのアカウントの暗号化パスワードを * にしておく方法があります. この方法だと, 侵入者がパスワードファイルを盗むことができた場合でも, スタッフ アカウントを破ることはできなくなります (また, たとえ root が暗 号化パスワードをパスワードファイルに付けていたとしても, 間接的 に root アカウントを破ることはできません). スタッフメン バがスタッフアカウントでログインする際には, &man.kerberos.1; や &man.ssh.1; のような, 公開鍵 / 秘密鍵の鍵の組を使う安全性の 高いログイン機構を使います. kerberos のようなログイン機構を使う 場合は一般に, kerberos サーバを実行するマシンと自分のデスクトッ プワークステーションとの安全性を確保しなければなりません. また ssh で公開鍵 / 秘密鍵の組を使う場合, 一般に, ログイン元マシン (通常は自分のワー クステーション) の安全性を確保しなければなりません. ここで, <&man.ssh-keygen.1; で公開鍵 / 秘密鍵の組を生成する際, 鍵の組 をパスワードで防御することにより, 鍵の組への防御層を追加するこ ともできます. スタッフアカウントのパスワードを * でつぶすことができると, 管理者自身が設定 した安全性の高い方法でしかスタッフメンバがログインできないこと も保証できます. こうして, 多くの侵入者が使う重大なセキュリティ の穴, すなわち, 安全性の低い無関係なマシンからネットワークを覗 き見る方法, を塞ぐようなセッションを提供する, 安全性の高い暗号 化されたコネクションを使うことを, スタッフメンバ全員に強制する ことができるのです. より間接的なセキュリティの仕組みでは, 制限の強いサーバから 制限の弱いサーバへログインすることを前提としています. たとえば, メインマシンで, 様々な種類のサーバを実行させている場合, ワーク ステーションではそれらのサーバを実行させてはなりません. ワーク ステーションを十分に安全にしておくためには, 実行するサーバの数 を, 一つもサーバが実行されていないというくらいにまでできる限り 減らすべきです. また, パスワードで保護されたスクリーンセーバを 走らせておくべきです. ワークステーションへの物理的アクセスが与 えられたとすると, もちろん言うまでもなく, 攻撃者は管理者が設定 したいかなる種類のセキュリティをもうち破ることができるのです. このことは, 管理者として必ず考えておかねばならない問題ですが, システム破りの大多数は, ネットワーク経由でリモートから, ワーク ステーションやサーバへの物理的アクセス手段を持たない人々によっ て行われるという事実もまた, 念頭に置いておく必要があります. kerberos のような方法を使うことで, スタッフアカウントのパ スワードの変更もしくは停止を一箇所で行なうことと, スタッフメン バがアカウントを持つすべてのマシンに即時にその効果を及ぼすこと が可能となります. スタッフメンバのアカウントが危険に晒されたと きに, すべてのマシンでスタッフメンバのパスワードを即座に変更す る能力を過小評価してはいけません. パスワードが分散されている状 況では, N 台のマシンでパスワードを変更すると, てんやわんやの事 態を招く可能性があります. kerberos を使用すると, パスワードの 再発行に制限 (re-passwording restriction) を課することもできま す. この機能を使うことにより, ある kerberos チケットをしばらく 経つとタイムアウトにすることができるだけでなく, 一定期間 ( 例 えば, 1 ヶ月に 1 回) 経つと, ユーザに新しいパスワードを選ぶよ うに要求することもできます. root 権限で実行されているサーバと SUID/SGID バイナリの安全性を高める 用心深いシステム管理者は, 自分に必要なサーバプロセスだけを 過不足なく実行させるものです. サードパーティ製のサーバは, よくバグを持っ ていがちだということに注意して下さい. たとえば, 古いバージョンの imapd や popper を実行させておくのは, 全世界に万能の root の切 符を与えているようなものです. 自分で注意深くチェックしていない サーバは, 決して実行してはいけません. root で実行させる必要の あるサーバはほとんどありません. たとえば, ntalk, comsat, finger デーモンを, 専用ユーザの 砂場 (sandbox) で実行させることができます. 管理者が膨大な数の問題に直面していないのなら, この「砂場」は完 璧ではありませんが, セキュリティに関するタマネギ的アプローチは ここでも成り立ちます. 砂場で実行されているサーバプロセスを経由 して侵入を果たすことができたとしても, 攻撃者はさらに砂場から外 に脱出しなければなりません. 攻撃者が通過せねばならない層の数が 増えれば増えるほど, それだけ攻撃者が侵入に成功する確率が減りま す. root の抜け穴は歴史的に, 基本システムサーバも含め, root 権 限で実行されるほとんどすべてのサーバプロセスで発見されています. ユーザが sshd 経由でのみログインし, telnetd, rshd, rlogind 経由でログインすることが決 してないマシンを稼働させているのであれば, それらのサービスを停 止させて下さい! FreeBSD では, 今では ntalkd, comsat, finger は砂場で実行させることがデフォ ルトになっています. 次に砂場で実行させるべきプログラムの候補と して, &man.named.8; があります. /etc/defaults/rc.conf ファイルには, named を砂場で実行するために必要な 引数がコメントアウトされた形式で含まれています. 新しいシステム をインストールしているか, それとも既存のシステムをアップグレー ドして使っているかに依存しますが, 砂場として使用する特別のユー ザアカウントがインストールされていないかもしれません. 用心深い システム管理者であれば, できるだけいつでも研究を怠らず, サーバ に砂場を仕込むものでしょう. 通常, 砂場で実行しないサーバが他にいくつかあります. sendmail, popper, imapd, ftpd などです. これらのうちいくつか のサーバには代わりとなるものがありますが, 代わりのものをインス トールするには, あなたが思うより多くの仕事が必要になるかもしれ ません (便利さという要素がまたも勝利を収めるわけです). これら のサーバは, root 権限で実行せねばならいかもしれません. また, これらのサーバ経由で生じる侵入を検出するためには, 他の仕組みに 頼らなくてはならないかもしれません. システムの root 権限の潜在的な穴で他に大きなものとして, シ ステムにインストールされた suid-root/sgid バイナリがあります. これらのバイナリは, rlogin のように, /bin, /sbin, /usr/bin, /usr/sbin に存在するものがほとんどです. 100% 安全なものは存在しないとは いえ, システムデフォルトの siud/sgid バイナリは比較的安全とい えます. それでもなお, root の穴がこれらのバイナリにときおり発 見されています. 1998 年に Xlib で見つかった root の穴は, xterm (普通, suid 設定 されています)を脆弱にしてしまいました. 安全である方がよいので, 用心深いシステム管理者は残念に思いながらも, スタッフのみが実行 する必要がある suid バイナリは, スタッフのみがアクセス可能な特 別なグループに含めるように制限を加え, 誰も使わない suid バイナ リは (chmod 000 を実行して) 片付けてしまう でしょう. ディスプレイを持たないサーバは, 一般的に xterm のバイナリを必要としません. sgid バイナリもほとんど同様の危険な存在になり得ます. 侵入者が kmem に sgid されたバイナリを破ることができた場合, その侵入者 は /dev/kmem を読み出すことができるように なるでしょう. つまり, 暗号化されたパスワードファイルを読み出す ことができるようになるので, パスワードを持つどのアカウントをも, 潜在的な危険に晒すことになります. 他にも, kmem グループを破った侵入者が pty を通して 送られたキーストロークを監視できるという危険があります. キース トロークには, 安全な方法でログインするユーザが使っている pty も含まれます. tty グループを破った侵入者は, ほぼ任意のユーザの tty へ書き込みができます. ユーザが端末プログラムやキーボードを シミュレーションする機能を持ったエミュレータを使っている場合, 侵入者は潜在的に, 結局そのユーザとして実行されるコマンドをユー ザの端末にエコーさせるデータストリームを生成できる可能性があり ます. ユーザアカウントの安全性を高める ユーザアカウントは, 普通, 安全性を高めることが最も困難です. スタッフに対しては, とても厳格なアクセス制限を強制しパスワード を * で外すことができるでしょうが, 管理者が 持ちうる一般ユーザすべてのアカウントに対して同じことはできない かもしれません. 管理者が十分に統率をとることができるなら, 管理 者は勝利し, ユーザのアカウントの安全を適切に確保できるかもしれ ません. それができないならば, よりいっそう気を配って一般ユーザ のアカウントを監視するよりほかありません. 一般ユーザアカウント に対し ssh や kerberos を利用するこ とには, システム管理がさらに増えたりテクニカルサポートが必要に なるなどの問題があります. それでも, 暗号化パスワードファイルと 比較するとはるかに良い解です. パスワードファイルの安全性を高める できるだけ多くのパスワードを * で外し, それらのアカウントのアクセスには ssh や kerberos を使うようにするこ とが, 唯一の確実な方法です. 暗号化パスワードファイル (/etc/spwd.db) は root でのみ読み出し可能 だといっても, 侵入者が root の書き込み権限は得られなくとも, 読 み出しアクセス権限を得ることは可能かもしれません. セキュリティスクリプトで常にパスワードファイルの変更をチェッ クし, 報告するようにすべきです (ファイルの完全性のチェック 参照). カーネルのコア, raw デバイス, ファイルシステムの安全性を 高める root の権限を破ると, 攻撃者は何でもできますが, 特に重宝さ れる特定の事柄もいくつかあります. たとえば, 最近のカーネルは, 組 み込みのパケット覗き見デバイス (packet sniffing device) ドライ バを備えているものがほとんどです. FreeBSD では bpf デバイスと呼ばれています. 侵入者 は普通, 侵入済みのマシンでパケット覗き見プログラムを実行させよ うと試みます. 侵入者にわざわざそういう機能を提供する必要はない ので, ほとんどのシステムで bpf デバイスを組み込むべきではあり ません. bpf デバイスを外しても, /dev/mem/dev/kmem という悩みの種がまだ残っていま す. この問題に関しては, 侵入者は raw ディスクデバイスに書き込 むこともできます. また, モジュールローダ, &man.kldload.8; とい う, 別のカーネル機能があります. やる気まんまんの侵入者は, KLD モジュールを使って自分独自の bpf もしくはその他覗き見デバイス を動作中のカーネルにインストールすることができます. この問題を 避けるため, システム管理者はカーネルをより高い安全レベル ( securelevel) , 少なくとも安全レベル 1 で実行させる必要がありま す. sysctl を使って kern.securelevel 変数に安全レベルを設定する ことができます. ひとたび安全レベルに 1 を設定すると, raw デバ イスに対する書き込みアクセスは拒否され, たとえば schg のような特別な chflags フラグの機能が 強制されます. システム起動に関わる重要なバイナリやディレクトリ, スクリプトファイルなど, 安全レベルが設定されるまでの間に実行さ れるすべてのものに対しても schg フラグを on にしておくことも確実に実行してください. この設定をやり過ぎても 構いませんが, より高い安全レベルで動作している場合, システムの アップグレードがはるかに困難になります. システムをより高い安全 レベルで実行させるようにするが, すべてのシステムファイルとディ レクトリに schg フラグを設定しないという妥 協をする方法もあります. もう一つの可能性としては, 単純に / および /usr を読み 込み専用でマウントすることです. ここで特筆すべきことは, システ ムを守ろうとして厳しくしすぎると, 侵入を検出するという非常に重 要なことができなくなってしまうということです. ファイルの完全性のチェック: バイナリ, 設定ファイルなど ことこの問題に至ると, システム管理者にできることは, 便利さ という要素がその醜い頭を上げない程度に, コアシステムの設定と制 御ファイルを防御することだけです. たとえば, / および /usr にある 大部分のファイルに schg ビットを設定するた めに chflags を使用するのは, おそらく逆効果 でしょう. なぜなら, そうすることでファイルは保護できますが, 侵 入を検出する窓を閉ざしてしまうことにもなるからです. セキュリティ のタマネギの最後の層はおそらく最も重要なもの – 検出で す. セキュリティの残りのものは, 突然の侵入を検出できなければ, まったく有用ではありません (あるいは, もっと悪ければ, 安全性に 対する間違った感覚を植え付けてしまいます). タマネギの仕事の半 分は, もう半分の検出側が攻撃者を攻撃の最中に捕えるようにするた めに, 攻撃者を食い止めるのではなく侵入を遅らせることなのです. 侵入を検出する最も良い方法は, 変更されていたり, 消えていた り, 入れた覚えがないのに入っているファイルを探すことです. 変更 されたファイルを探すのに最も良い方法は, もう一つの (しばしば中 央に集められた), アクセスが制限されたシステムから行なうもので す. さらに安全でアクセス制限されたシステム上でセキュリティ用ス クリプトを書けば, スクリプトは潜在的なクラッカー達からはほぼ見 えなくなります. これは重要なことです. この有効性を最大限に活用 するためには, 一般的に, アクセスの制限されたマシンから実際に使っ ている他のマシンへのかなりのアクセスを許す必要があります. 普 通は, 他のマシンからアクセス制限されたマシンへ読み込み専用の NFS エクスポートをしたり, アクセス制限されたマシンから他のマシ ンへ ssh を行なうために, ssh 鍵のペアを作ったりすることで行 います. ネットワークのトラフィックを別にして, NFS は最も可視性 のない方法です – 各クライアント上のファイルシステムを, 事実上検出されずに監視できるようになります. アクセス制限された サーバがスイッチを通してクライアントに接続されている場合, たい てい NFS がより良い選択肢です. アクセス制限されたサーバがハブ を通したり, いくつかのルーティング層を通したりしてクライアント に接続する場合, NFS はあまりにも危険な方法かもしれず (ネットワー クの面で) , ssh の方が認証の道筋は 跡となって残りますが, それでもより良い方法かもしれません. アクセス制限されたマシンに, 監視しようとするクライアントシ ステムへの少なくとも読み込みのアクセス権を与えたら, 次に実際に 監視するためのスクリプトを書かなくてはいけません. NFS マウント をすれば, &man.find.1; や &man.md5.1; などの単純なシステムユー ティリティでスクリプトを書くことができます. 少なくとも 1 日 1 回, クライアントのファイルを直接 md5 にかけ, さらにもっと頻繁 に /etc および /usr/local/etc にあるようなコントロール用 ファイルを試験するのが一番です. アクセス制限されたマシンが正し いと知っている, 基となる md5 情報と比べて違いが見つかった場合, システム管理者に調べて欲しいと悲鳴を上げるようにすべきです. 優 れたセキュリティ用スクリプトは, / および /usr などのシステムパーティション上で不適 当に suid されたバイナリや, 新たに作成されたファイルや削除され たファイルもチェックするでしょう. NFS ではなく, ssh を使用する場 合は, セキュリティ用スクリプトを書くのはずっと難しいことで す. スクリプトを動かすためには, クライアントに対してスクリプト を scp しなくてはいけませんし, それは目に見 えてしまいます. そして, 安全のためには, スクリプトが使うバイナ リ (find など) を scp する必要もあります. クライアントの ssh デーモンはすでに 攻撃されてしまっているかもしれません. 結局のところ, 安全でない リンク上の場合は ssh は必要かもしれ ませんが, ssh を扱うのはとても大変 なことです. 優れたセキュリティ用スクリプトは, ユーザやスタッフメンバの アクセス設定ファイルの変更もチェックするものです. .rhosts, .shosts, .ssh/authorized_keys など … MD5 チェックの範囲外になってしまうであろう ファイル群です. ユーザ用のディスク容量が非常に大きい場合は, パーティション 上の各ファイルを見て回るのに大変な時間がかかるかもしれません. この場合は, マウントフラグを設定して, このパーティションに suid されたバイナリやデバイスを置けないようにするのが良い考え です.nodev および nosuid オプション (&man.mount.8; 参照) が知るべきものでしょう. とにかく少なくとも週に 1 度はファイルシステムをスキャンするべきです. なぜなら, この層の目的は, 侵入が成功したかどうかに関わらず, 侵 入があったことの検出をすることだからです. プロセスアカウンティング (&man.accton.8; 参照) は, マシンへの侵入を検出するためのメカニズムとして推奨できる, 比較的オーバヘッドの少ないオペレーティングシステムの機能です. 侵入を受けた後でも当該ファイルが無傷である場合に, 侵入者が 実際にどのようにしてシステムに侵入したかを追跡するのに特に役立ちます. 最後に, セキュリティスクリプトはログファイルを処理するよう にし, ログファイル自体もできるだけ安全性の高い方法で生成するよ うにすべきです – リモート syslog は極めて有益になり得ま す. 侵入者は自分の侵入の痕跡を覆い隠そうとしますし, また, ログ ファイルはシステム管理者が最初の侵入の時刻と方法を追跡してゆく ために極めて重要です. ログファイルを永久に残しておくための 1 つの方法は, システムコンソールをシリアルポートにつないで走らせ, コンソールを監視している安全なマシンを通して絶えず情報を集める ことです. 偏執狂的方法 多少偏執狂的になっても決して悪いことにはなりません. 原則的 に, システム管理者は, 便利さに影響を与えない範囲でいくつでもセ キュリティ機能を追加することができます. また, いくらか考慮した 結果, 便利さに影響を与えるセキュリティ機能を追加することもでき ます. もっと重要なことには, セキュリティ管理者とは少し喧嘩にな るはずなのですが – もしあなたが, 本文書に書かれている勧 告をそのまま使用した場合は, 予想されるクラッカーはやはり本文書 を読んでいるわけですから, あなたの防御策を教えてしまうことにな ります. サービス妨害攻撃 このセクションではサービス妨害攻撃 (DOS 攻撃) を扱います. サービス妨害攻撃は, 普通は, パケット攻撃です. ネットワークを飽 和させる最先端の偽造パケット (spoofed packet) 攻撃に対してシス テム管理者が打てる手はそれほど多くありませんが, 一般的に, その 種の攻撃によってサーバがダウンしないことを確実にすることで, 被 害をある限度に食い止めることはできます. サーバの fork の制限. 踏み台攻撃の制限 (ICMP 応答攻撃, ping broadcast など). カーネルの経路情報のキャッシュ. よくあるサービス妨害攻撃は, fork するサーバプロセスに対す るものです. これは, サーバにプロセス, ファイル記述子, メモリを マシンが死ぬまで食い尽くさせようとするものです. inetd (&man.inetd.8; 参照) には, この種の攻撃を制限するオプションが いくつかあります. マシンがダウンすることを防止することは可能で すが, この種の攻撃によりサービスが中断することを防止することは 一般的に言ってできないことに注意する必要があります. inetd のマ ニュアルページを注意深く読んで下さい. 特に, , , オプションに注意して下さい. IP 偽造攻撃 (spoofed-IP attack) は inetd の オプションの裏をかけるので, 一般 にオプションを組み合わせて使用するべきであることに注意して下さ い. スタンドアロンサーバの中には, 自分自身で fork を制限するパ ラメータを持っているものがあります. Sendmail には, オプションがあります. シ ステム負荷の値変化には遅れがあるので, sendmail の負荷限界指定 オプションを使うよりも, このオプションを使う方がまともに動作す る可能性ははるかに高いです. sendmail の実行を開始する際に, MaxDaemonChildren パラメータを設定するべき です. その値は, 通常見込まれる負荷を扱える程度に十分高いが, そ れだけの数の sendmail を操作しよう とするとマシンが卒倒してしまうほどには高くないような値に設定す るべきです. sendmail をキュー処理モード () で実行することや, sendmail デーモン (sendmail -bd) をキュー処 理用プロセス (sendmail -q15m) と別に実行す ることも, 用心深いことと言えます. それでもなおリアルタイムでの 配送を望むのであれば, のようにすることで, キュー処理をはるかに短い時間間隔で行うことができます. いずれに しても, MaxDaemonChildren オプションに合理 的な値を確実に指定して, sendmail がなだれをうって失敗すること がないようにして下さい. syslogd は直接攻撃される可能性 があるので, 可能ならばいつでも オプション を用いることを強く推奨します. これができないなら, オプションを使って下さい. tcpwrapper の逆 identd などの接 続返し (connect-back) を行うサービスについては十分注意を払うよ うにするべきです. これらは直接攻撃を受ける可能性があります. こ ういう事情があるので, tcpwrapper の 逆 ident 機能を使おうとは思わないのが一般的です. 境界ルータのところでファイアウォールを設けて, 外部からのア クセスに対して内部サービスを防御するという考えは実によいもので す. この考えは, LAN の外部からの飽和攻撃を防ぐことにあり, 内部 サービスをネットワークベースの root 権限への攻撃から防御するこ とにはあまり考慮を払っていません. ファイアウォールは常に排他的 に設定して下さい. つまり, ポート A, B, C, D と M から Z まで以外 のすべてに防火壁を設ける というふうにです. このようにすることで, named (ゾーンのプライマリである場合), ntalkd, sendmail などのインターネットからア クセスできるサービスとして特に指定するもの以外の, 小さい番号の ポートすべてをファイアウォールで防御することができます. ファイ アウォールをこの他のやり方 – つまり包含的もしくは受容的 なファイアウォールとして設定しようとする場合, close することを忘れてしまうサービスがいくつか 出てきたり, 新しい内部サービスを追加したのにファイアウォールの 更新を忘れたりする可能性がよく出てきます. ファイアウォール上の 大きい番号のポートを開けておくことにより, 小さい番号のポートを 危険に晒すことなく受容的な動作を許すことができます. FreeBSD で は, net.inet.ip.portrange への sysctl (sysctl -a | fgrep portrange) をいろいろ使用することで, 動的バインドに使用される ポート番号の範囲を制御できることを記憶にとどめておいてください. これによりファイアウォールの設定を簡略化することもできます. たとえば, 通常の first/last 範囲として 4000 から 5000 を, 高位ポートの範囲として, 49152 から 65535 を指定し, (いくつかのインターネットアクセス可能 なポートをブロックから除外するのはもちろんですが) 4000 より下 のすべてをブロックするという設定が考えられるでしょう. また別のよくあるサービス妨害攻撃として, 踏み台攻撃 (springboard attack) と呼ばれるものがあります – これは, あるサーバを攻撃し, そこ結果として生成される応答が自分自身, ロー カルネットワーク, そして他のマシンを過負荷に追い込むようにする 攻撃です. この種の攻撃の中で最もありふれたものに, ICMP ping broadcast 攻撃があります. 攻撃 者は, 実際に攻撃したいマシンのアドレスを送信元アドレスに設定し た ping パケットを偽造して, 対象の LAN のブロードキャストアド レスに向けてパケットを送信します. 境界にあるルータがブロードキャ ストアドレスに対する ping パケットを握り潰すように設定されてい ない場合, LAN は, 詐称された送信元アドレスに向けて応答パケット を生成するはめになり, 犠牲となるマシンが飽和するところまで行っ てしまいます. 攻撃者が同じトリックを異なるネットワーク上のいく つものブロードキャストアドレスに対して同時に使用した場合, とく にひどいことになります. これまでに, 120 メガビット以上のブロー ドキャスト攻撃が観測されています. 2 番目の踏み台攻撃は, ICMP エラー報告の仕掛けを狙うものです. 攻撃者は ICMP エラー応答を生 成するパケットを生成し, サーバの受信ネットワークを飽和させ, そ の結果としてサーバが送信ネットワークを ICMP 応答で飽和させてし まうようにすることができます. mbuf を消費し尽くさせることによ り, この種の攻撃でサーバをクラッシュさせることも可能です. サー バが生成した ICMP 応答を十分速く送信できない場合, とくにひどい ことになります. FreeBSD カーネルには, この種の攻撃の効果を抑制 する ICMP_BANDLIM と呼ばれる新しいカーネルコンパイルオプション があります. 踏み台攻撃の 3 つめの主要なクラスに属する攻撃は, udp echo サービスのような, 特定の inetd 内部サービスに関連する ものです. 攻撃者は, 単に送信元アドレスがサーバ A の echo ポー トであり, 送信先アドレスがサーバ B の echo ポートであるように UDP パケットを偽造します. ここでサーバ A, B はともにあなたの LAN に接続されています. この 2 つのサーバは, この一つのパケッ トを両者の間で互いに相手に対して打ち返しあいます. このようにし てパケットをほんのいくつか注入するだけで, 攻撃者は両方のサーバ と LAN を過負荷状態にすることができます. 同様の問題が内部 chargen ポートにも存在します. 有能なシステム管理者はこの手の inetd 内部テストサービスのすべてを無効にしておくものです. 偽造パケット攻撃は, カーネルの経路情報キャッシュに過負荷を 生じさせるために用いられることもあります. net.inet.ip.rtexpire, rtminexpire, rtmaxcachesysctl パラメータを参照して下さい. でた らめな送信元 IP アドレスを用いた偽造パケット攻撃により, カーネ ルは, 一時的なキャッシュ経路を経路情報テーブルに生成します. こ れは netstat -rna | fgrep W3 で見ることがで きます. これらの経路は, 普通は 1600 秒程度でタイムアウトになり ます. カーネルがキャッシュ経路テーブルが大きくなり過ぎたことを 検知すると, カーネルは動的に rtexpire を減らしますが, rtminexpire より小さくなるようには決して減らしません. ここに問 題が 2 つあります: 負荷の軽いサーバが突然攻撃された場合, カーネルが十分素 早く反応できないこと. カーネルが持続的攻撃に耐えられるほど十分 rtminexpire が低く設定されていないこと. 自分のサーバが T3 もしくはそれより高速の回線でインターネッ トに接続されている場合, &man.sysctl.8; を用いて rtexpirertminexpire とを手動で上書きしておくことが思慮深いことといえます. どちらか 一方でも 0 には決してしないで下さい (自分のマシンをクラッシュ させたくないのであれば :-). 両パラメータを 2 秒 に設定すれば, 攻撃から経路情報テーブルを守るには十分でしょう. Kerberos および SSH を用いたアクセスの問題 もしあなたが, kerberos および ssh を使用したいのだとしたら, 両者 に関して言っておく必要のある問題がいくつかあります. kerberos V は大変優れた認証プロトコルですが, kerberos 化された telnetrlogin は, バイナリストリームを扱う のに不向きになってしまうようなバグがあります. さらに, デフォル トでは, kerberos は オプションを使わない限 りセッションを暗号化してくれません. ssh では, デフォルトですべてを暗号 化してくれます. ssh はあらゆる場面でとても良く 働いてくれます. ただし, デフォルトで暗号鍵を転送してしまうこと を除けばです. これはつまり, 暗号鍵を持った安全なワークステーショ ンがあって, この暗号鍵で残りのシステムとアクセスできるようになっ ている場合に, 安全でないマシンへ ssh を行なう時に暗号鍵が見えてしま うということです. 実際の鍵そのものが見えてしまうわけではありま せんが, ssh は, あなたが login して いる間, 転送用ポートを作ります. クラッカーが安全でないマシンの root を破ると, クラッカーは, このポートを使って暗号鍵を取得し, この暗号鍵でロックの外れる他のマシンへのアクセスを得ます. スタッフのログインには, kerberos を組み合せた ssh を使用することを勧めます. ssh は, kerberos サポート機能と一緒 にコンパイルできます. こうすると, 見えてしまうかもしれない ssh 鍵をあまりあてにしないで良いよ うになります. また, それと同時に, kerberos 経由でパスワードを 保護することもできます. ssh 鍵は, 安全なマシンからの自動化されたタスク (kerberos はこの用途には 不向きです) のみに使用するべきです. また, ssh の設定で鍵転送をしないようにす るか, あるいは, sshauthorized_keys ファイル中に書くことを許 している from=IP/DOMAIN オプションを使用し て, 特定のマシンからログインしてきたときのみ鍵が有効であるよう にすることも勧めます. DES, MD5, と Crypt 改訂: &a.unfurl;, 21 March  2000. 訳: &a.hanai;, 12 September 1996. 訳改訂: &a.jp.hino;, 12 March 2001. UNIX システムにおけるすべてのユーザは, そのアカウントに対応し た一つのパスワードを持っています. それらのパスワードはユーザ本人 と本当のオペレーティングシステムのみが知っているべきであるという ことは明らかでしょう. それらのパスワードを秘密に保っておくために, パスワードは一方向ハッシュとして知られる方式で暗 号化されます. 一方向ハッシュとは, 簡単に暗号化はできるが解読は難 しいという方法です. 言葉を換えると, 先ほど明らかであると書いたの は実は正しくないのです: オペレーティングシステム自身は 本当はパスワードを知らないのです. その代わりに 暗号化された形でのみパスワードを知っていま す.素のテキストとしてパスワードを得る唯一の方法は, 可能な限りのパスワード空間を検索するという力任せの方法です. 不幸なことに, UNIX が生まれようとしているときにパスワードを 安全な形で暗号化できる方式は DES(Data Encryption Standard) に基 づいたものだけでした. このことは米国に住んでいるユーザにとって は大して問題ではありませんでしたが, DES のソースコードを米国外に 輸出することはできないという問題がありました. そのために, FreeBSD は, 米国の法律を守ることと, 未だに DES を使っている他の UNIX 一族との互換性を保つこととを両立する方法を探し出す必要があ りました. その解決方法は, 米国のユーザは DES のライブラリをインストー ルして DES を使用できるが, 米国外のユーザは国外に輸出可能な他の ひとつの暗号化方式を使用することができる, というように暗号化ライ ブラリを分割することでした. これが FreeBSD がデフォルトの暗号化 方式として MD5 を使うようになったいきさつです. MD5 は DES よりも より安全であると考えられているため, DES をインストールする一番の 理由は互換性を保つためといえます. 暗号化機構を理解する FreeBSD がどの暗号化方式を使うようにセットアップされている かを判断するのは簡単です. /etc/master.passwd ファイルの中の暗号化さ れたパスワードを調べてみるのが一つの方法です. MD5 ハッシュで暗 号化されたパスワードは, DES ハッシュで暗号化されたパスワードよ りも長いですし, その上 $1$ と いう文字で始まるという特徴も持っています. DES のパスワードはこ れといって識別可能な特徴は持っていませんが, MD5 のパスワードよ りは短く, そして $ という文字を含ま ない 64 文字のアルファベットを使って表現されているので, 比較的 短い文字列でドル記号で始まっていないものはおそらく DES のパス ワードでしょう. 同様の方法で, ライブラリはパスワードを識別します. 結果とし て, DES のライブラリは MD5 パスワードを識別でき, そして MD5 を 使って MD5 で暗号化されたパスワードをチェックし, その他のパス ワードには DES を使ってチェックします. DES のライブラリは MD5 も含んでいるのでこのようなことが可能なのです. 残念なことに, 反 対は真ではありません. MD5 のライブラリは DES で暗号化されたパ スワードを認証することができません. あなたのシステムでプログラムがどちらのライブラリを使ってい るかを調べるのは非常に簡単です. crypt を使うプログラムは libcrypt をリンクしています. そしてそれぞれのライブラリに対す る適切な実装へのシンボリックリンクとなってい ます. たとえば, DES 版を使っているようなシステムにおいては次のようになっています: &prompt.user; ls -l /usr/lib/libcrypt* lrwxr-xr-x 1 root wheel 13 Mar 19 06:56 libcrypt.a -> libdescrypt.a lrwxr-xr-x 1 root wheel 18 Mar 19 06:56 libcrypt.so.2.0 -> libdescrypt.so.2.0 lrwxr-xr-x 1 root wheel 15 Mar 19 06:56 libcrypt_p.a -> libdescrypt_p.a MD5 に基づいたライブラリを使っているシステムにおいては, 同 じようなリンクが 見られるでしょうが, そのターゲットは libdescrypt ではなく libscrypt になっているでしょう. もし DES 機能を持った crypt ライブラリ libdescrypt をインストールしたのなら (つ まり "crypt" ディストリビューションをインストールした場合), 新 規パスワードがどちらのパスワード形式になるかは, /etc/login.conf の中の passwd_format ログインケーパビリティによって制 御されます. その値としては, des または md5 を設定することができます. ログインケーパビ リティに関するより詳細な情報は, login.conf(5) マニュアルページ をご覧ください. S/Key S/Key は一方向ハッシュ関数を基にしたワンタイムパスワード方式 です. FreeBSD では, 互換性のために MD4 ハッシュを用いていますが 他のシステムでは MD5 や DES-MAC を用いてます. S/Key は, バージョ ン1.1.5 以降のすべての FreeBSD に含まれていますし, FreeBSD 以外 の数多くのシステムの上でも利用されています. S/Key ば Bell Communications Research, Inc. の登録商標です. 以下の説明では, 三種類の異なる「パスワード」が使われます. まず一つ目は, あなたが普段使っている普通の UNIX スタイルの, もし くは Kerberos でのパスワードです. ここではこれを UNIX パ スワードと呼ぶことにし ます. 二つ目は, S/Key の key プログラムによって生成され, keyinit プログラムとログインプロンプトが受け 付けるパスワードです. ここではこれをワンタイムパスワード と呼ぶことにします. 三つ目のパスワードは, key (と場合により keyinit) プログラムに対してユーザが入力する秘密のパスワードで, ワンタイム パスワードを生成するのに使われます. ここではこれを秘密の パスフレーズもしくは単に “パスフレーズ” と呼 ぶことにします. (訳注: ユーザが頭の中だけにしまっておくべきもの が, この秘密のパスフレーズです. なお, 原文ではこれをパスワードと 表記していますが, 混乱を避けるために訳文ではすべて 秘密の パスフレーズに統一しています.) 秘密のパスフレーズは, UNIX パスワードと何の関連性もありませ ん: 両者を同一に設定することは可能ですが, お奨めしません. UNIX パスワードは長さが 8 文字に制限されています (訳注: FreeBSD で DES を導入していない場合はもっと長いパスワードも認識されます). これに対し, S/Key では秘密のパスフレーズを好きなだけ長くすること ができます (訳注: 実装上, key コマンドなどの バッファ長で制限されてしまう可能性があります. 200 文字程度に押 えておいた方がよいでしょう :-). 6 語から 7 語からなるパスフレー ズがふつうです. ほとんどの部分で, S/Key システムは UNIX のパスワー ドシステムと完全に独立して動作するようになっています. パスフレーズに加え, S/Key システムにとって重要な二種類のデー タがあります. 一つはシード (seed: 種)または キー (key: 鍵)と呼ばれるもので, 二つの文字と五つ の数字で構成されます. もう一つはシーケンス番号 (iteration count) で, 1 から 100 までの整数です. S/Key はここまで に述べたデータを利用してワンタイムパスワードを生成します. その方 法は, まずシードと秘密のパスフレーズを連結し, それに対してシーケ ンス番号の回数だけ MD4 ハッシュを繰り返し計算します. そしてその 結果を 六つの短い英単語に変換します. login プ ログラムと su プログラムは, 前回最後に受け付 けられたワンタイムパスワードを記録しています. そして, その前回 のワンタイムパスワードと, ユーザが入力したワンタイムパスワードを 一回ハッシュ関数にかけた結果とが一致した場合に, このユーザは認証 されます. 一方向ハッシュ関数を使っているので, もし正しく認証され たワンタイムパスワードが一回盗聴されたとしても, 次回以降に使われ る複数のワンタイムパスワードを生成することは不可能です. シーケ ンス番号はログインが成功するたびに一つずつ減らされて, ユーザとロ グインプログラムの間で同期が取られます. シーケンス番号が 1 まで 減ったら, S/Key を再度初期化する必要があります. 次に, S/Key 関連の四つのプログラムについて説明します. key プログラムは, シーケンス番号一つと, シー ド一つと, 秘密のパスフレーズ一つとを受け付けて, ワンタイムパスワー ドを一つ生成します. keyinit プログラムは, S/Key を初期化するのに使用され, また秘密のパスフレーズやシーケン ス番号やシードを変更するためにも使用されます. このプログラムを実 行するには, 秘密のパスフレーズか, または, シーケンス番号とシード とワンタイムパスワードの一組かの, どちらかが必要になります. keyinfo プログラムは, /etc/skeykeys というファイルを調べて, この プログラムを起動したユーザの現在のシーケンス番号とシードを表示し ます. 最後に, loginsu プログラムについてですが, これらは S/Key のワンタイムパスワード を, (訳注:システムが) ユーザを認証するものとして受理するのに必要 な処理をおこないます. login プログラムは, 指 定された特定のアドレスからの接続に対して, UNIX パスワードの使用 を認めなくする機能, 逆に言えば S/Key の利用を強制する機能も持っ ています. この文書では, 四種類の異なる操作について説明します. 一つ目は, keyinit プログラムを信頼できる通信 路上で利用する場合で, 一番始めに S/Key を設定する操作や, 使い始 めたあとで秘密のパスフレーズやシードを変更する操作です. 二つ目は, keyinit プログラムを信頼できない通信路上で利 用する場合で, 操作の目的は一つ目と同じです. この場合には key プログラムを併用する必要があります. 三つ 目は, key プログラムを使い, 信頼できない通信 路を通じてログインする操作です. 四番目は, key プログラムを使って, 複数のワンタイムパスワードを一気に生成する操 作です. ここで生成した複数のワンタイムパスワードは, メモしたり 印刷したりして携帯し, 信頼できる通信路が一切ないところで利用する ことができます. (訳注: ワンタイムパスワードを記録した紙をなくさ ないこと! 電話番号やIPアドレス, ユーザ名を一緒にメモしていたら 最悪です!!) 信頼できる通信路での初期化 信頼できる通信路 (たとえばあるマシンのコンソール画面や, ssh を使っている時など) を利用しているときに, S/Key を初めて初期化 すること, S/Key の秘密のパスフレーズを変更すること, またはシー ドを変更すること, をおこなうことができます. そのためには, まず あなた自身がログインし, keyinit コマンドを 以下のようにパラメタなしで実行します: &prompt.user; keyinit Adding unfurl: Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. ) `keyinit' コマンドが出力する注意です. 訳すと, ) 注意 - この動作モードはマシンに直接入力しているときのみ利用 ) すること. もし今 telnet や rlogin を使っているなら, 秘密のパ ) スフレーズを入力せずにこのままコマンドを終了し, かわりに ) keyinit -s を実行すること. Enter secret password: Again secret password: ID unfurl s/key is 99 to17757 DEFY CLUB PRO NASH LACE SOFT Enter secret password: というプロンプトに 対してあなたが考えた秘密のパスフレーズを入力します. このパスフ レーズはログインするときに使うものではなく, ログインするときに 使うワンタイムパスワードを生成するために使うものであることを覚 えておいてください. ID から始まる行は, S/Key に おける一回分のパラメタであり, あなたのログイン名とシーケンス番 号とシードです. (訳注: `keyinit' コマンドは 次回にログインするときに使えるパラメタを参考のためにここで表示 します.) S/Key を使ってログインするときには, システム側が自動 的にこれらのパラメタを表示してくれますから, これらのパラメタを 覚えておく必要はありません. 最後の行が, 今述べたパラメタと入力 された秘密のパスフレーズから計算されたワンタイムパスワードです. この例を実行した後, 次にログインするときに打ち込むべきワンタイ ムパスワードがこれです. 信頼できない通信路での初期化 信頼できない通信路を使って S/Key を初期化, または秘密のパ スフレーズを変更するためには, 信頼できる通信路として, その信頼 できない通信路とは別のものを用意する必要があります. その信頼で きる通信路は key プログラムを実行するために 必要となるもので, たとえばそれは, あなたが信頼できる Macintosh のデスクアクセサリや信頼できるマシンのシェルプロンプトだったり するでしょう. (訳注: ここでの通信路とはマシンそのものになりま す. 信頼できるマシンとは, 信頼できる人がしっかり管理しているマ シンということです.) 他に準備しておくものとして, シーケンス番 号 (100 は適切な値といえるでしょう) と, 場合によっては自分で考 えた, またはランダムに生成されたシードがあります. (あなたが S/Key を初期化しようとしているマシンへの) 信頼できない通信路を 使うときには, keyinit -s コマンドを以下のよ うに使用します: &prompt.user; keyinit -s Updating unfurl: Old key: to17758 Reminder you need the 6 English words from the key command. ) `keyinit' コマンドが出力する注意です. 訳すと, ) 注意 - skey コマンドの出力する 6 英単語が必要になります. Enter sequence count from 1 to 9999: 100 Enter new key [default to17759]: s/key 100 to 17759 s/key access password: デフォルトのシード (keyinit プログラム は困ったことにこれを key と読んでいるのです が, 混乱しないよう注意してください) で構わなければ, リターンキー を押してください. 次に, アクセスパスワードを入れる前に, あらか じめ用意しておいた信頼できる通信路(信頼できるマシンや信頼でき る S/Key デスクアクセサリなど) へ移って, 先ほどと同じパラメタ を入力します: &prompt.user; key 100 to17759 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <秘密のパスフレーズ> CURE MIKE BANE HIM RACY GORE ここで信頼できない通信路の方に戻って, key コマンドが出力したワンタイムパスワード をコピーして keyinit プログラムに入力します. s/key access password:CURE MIKE BANE HIM RACY GORE ID unfurl s/key is 100 to17759 CURE MIKE BANE HIM RACY GORE 後は, 前章で説明したことと同様です. ワンタイムパスワードを一つ生成する S/Key の初期化ができたら, ログインするときには以下のような プロンプトが出てくるでしょう: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <ユーザ名> s/key 97 fw13894 Password: ここでは表示していませんが, 便利な機能がログインプログラム に備わっています: パスワードプロンプトに対して, 何も入力せずに リターンを押すとエコーモードに切り替わります. つまりタイプし た文字がそのまま見えるようになるのです. これはS/Key のワンタイ ムパスワードを紙に印刷していた場合など, ワンタイムパスワードを 手で入力しなければならない場合に特に役立つ機能です. また, この ログインしようとしてるマシンが, 接続元のマシンから UNIX パスワードを使ってログインすることができないように設定さ れている場合には, ログインプロンプトには S/Key のワンタイムパ スワードのみが受け付けられることを示す (s/key required) という注釈が表示されます. 次に, このログインプロンプトに対して入力するためのワンタイ ムパスワードを生成しましょう. そのために, key プログラムを使える信頼できるマシンを用 意します. (key プログラムには DOS や Windows の上で動くもの, MacOS の上で動くものなどもあります.) key プログラムを使うときには, シーケンス番 号とシードを指定します. ログインしようとしているマシンのログ インプロンプトの右側をカットアンドペーストすると楽でしょう. 信頼できるシステムで: &prompt.user; key 97 fw13894 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: WELD LIP ACTS ENDS ME HAAG ここでワンタイムパスワードが得られました. ログインを続けま しょう: login: <username> s/key 97 fw13894 Password: <return to enable echo> s/key 97 fw13894 Password [echo on]: WELD LIP ACTS ENDS ME HAAG Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ... 以上の手順は, 信頼できるマシンが利用できる場合の みに使えるもっとも簡単な方法です. Java による S/Key の key applet もあり, The Java OTP Calculator からダウンロードして Java をサポートするブ ラウザ上でローカルに実行することができます. 複数のワンタイムパスワードを生成する 都合によっては, 信頼できるマシンや信頼できる通信路が一切確 保できないようなところで S/Key を使う必要があるでしょう. この ような場合には, key コマンドを使って複数の ワンタイムパスワードをあらかじめ一気に生成し, 紙に印刷して携帯 していくことができます. たとえば: &prompt.user; key -n 5 30 zz99999 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <秘密のパスフレーズ> 26: SODA RUDE LEA LIND BUDD SILT 27: JILT SPY DUTY GLOW COWL ROT 28: THEM OW COLA RUNT BONG SCOT 29: COT MASH BARR BRIM NAN FLAG 30: CAN KNEE CAST NAME FOLK BILK という引数によって 5 個のワンタイム パスワードを順に生成します. ここで は, 最 後のシーケンス番号となるべき数字です. 出力は普通に使う順番とは に出力されていることに注意してください (訳注: 一番最初に使うワンタイムパスワードは一番最後に出力され たものです). この結果をカットアンドペーストして lpr コマンドを使って印刷すると よいでしょう. もしあなたがセキュリティに偏執するなら, この結果を紙と鉛筆を使っ て手で書き移した方がよいかもしれません. ここで, 出力の各行はシー ケンス番号とそれに対応する一回分のワンタイムパスワードです. 消費済みの ワンタイムパスワードの行をペンで消していくと便利で しょう. UNIX パスワードの利用を制限する 設定ファイル /etc/skey.access を使っ て UNIX パスワードの利用を制限することができます. この場合の判 断基準として, ログインを受け付ける際のホスト名, ユーザ名, 端末 のポート, IP アドレスなどが利用できます. この設定ファイルの詳 細に関してはマニュアル &man.skey.access.5; をご覧ください. マ ニュアルにはこの機能に関わるセキュリティについて, いくつかの警 告が記述してあります. この機能を使ってセキュリティを高めようと するのならば絶対にこのマニュアルを読んでください. もし /etc/skey.access ファイルが存在 しないならば (FreeBSD のデフォルト状態ではそうです), すべての ユーザが UNIX パスワードを利用することができます. 逆に, もし ファイルが存在するならば, skey.access ファ イルに明示的に記述されていない限り, すべてのユーザは S/Key の 利用を要求されます. どちらの場合においても, そのマシンのコンソー ルからはいつでも UNIX パスワードを使ってログインすることが可能 です. 以下によく使われるであろう三種類の設定を含む設定ファイルの 例を示します: permit internet 192.168.0.0 255.255.0.0 permit user fnord permit port ttyd0 はじめの行 (permit internet) で, telnet などで接続するときの IP のソースアドレス (注意: これは偽造され るおそれがあります) が特定の値とマスクに一致している場合に, UNIX パスワードの利用を許可することを指定しています. この設定 自体はセキュリティを高めるための機能ではありません. そうでは なく, ログインの権利を持つ許可されたユーザに対して, 現在そのユー ザが使っているネットワークが信頼できないと考えられるので S/Key を使うべきである, ということを気づかせるための機能であると考え てください. 二行目 (permit user) によって, ある特定 のユーザ, この場合は fnord, に対して, いつ でも UNIX パスワードの利用を許可するように指定しています. 一般 的にはこの設定をおこなうべきではありません. key プログラムがどうしても使えない環境にい る人や, ダム端末しかない環境にいる人, または何度教えても聞く耳 を持たないような人をサポートする必要がある場合にのみ設定をおこ なってください. 三行目 (permit port) によって, ある特定 の端末ポートからログインしようとするすべてのユーザに対して UNIX パスワードの利用を許可するように指定しています. この設定 はダイヤルアップ回線に対する設定として利用できるでしょう. Kerberos 原作: &a.markm; (&a.md; からの寄稿に基づいています). 訳: &a.jp.arimura;. Kerberosは, サーバのサービスによってユーザが安全に認証を受けられる ようにするための, ネットワークの付加システム及びプロトコルです. リモートログイン, リモートコピー, システム間での安全なファイルのコピ ーやその他のリスクの高い仕事がかなり安全に, そしてこれまでより制御 できるようになります. 以下の文章は, FreeBSD用として配布されているKerberosをセットアップ する際のガイドとして読むことができます. しかし, 完全な説明が必要な場合には, マニュアルページを読んだ方がよい でしょう. FreeBSDのKerberosは, オリジナルの4.4BSD-Liteの配布に含まれているものではなく, FreeBSD 1.1.5.1のときに移植されたeBonesです. これはアメリカ/カナダの外で作成されており, そのため, アメリカか らの暗号技術の輸出制限があった時代でも, これら以外の国の人々が手に入れられるものでした. 初期データベースの作成 この作業はKerberosサーバだけでおこないます. まず, 古いKerberosの データベースが存在しないことを確認してください. ディレクトリ/etc/kerberosIVに移って, 次のファイルだけが 存在することをチェックします: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms もし他のファイル (principal.*master_key) が 存在する場合には, kdb_destroyというコマンドで古い Kerberosデータベースを消してください. Kerberosが走っていなければ, 単に余計なファイルを消せばよいです. まず, krb.confkrb.realmsを編集してKerberosの 管理領域 (realm) を定義してください. ここでは管理領域がGRONDAR.ZA で, サーバ名がgrunt.grondar.zaであるとします. krb.conf というファイルを次のように編集してください: &prompt.root; cat krb.conf GRONDAR.ZA GRONDAR.ZA grunt.grondar.za admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov この例にあるような他の管理領域は, 実際には必要ありません. この例は複数の管理領域を認識する方法を示したものですので, これらの行は含めなくても結構です. 1行目はこのシステムが動いている管理領域の名前です. 他の行は管理領域とホスト名のエントリです. 行の1つめの単語が管理領域で, 2つめがその管理領域の中で 鍵配布センター(Key Distribution Center) として働くホスト名です. ホスト名の次に admin server と書いてある場合には, そのホストが ``管理データベースサーバ''(Administrative Database Server) も提供 することを意味します. これらの単語について詳しく知りたい場合にはKerberosのマニュアル ページをご覧ください. ここで, GRONDAR.ZAという管理領域にgrunt.grondar.za およびその他の.grondar.za ドメインのすべてのホストを追加し なければなりません. krb.realmsは次のようになります: &prompt.root; cat krb.realms grunt.grondar.za GRONDAR.ZA .grondar.za GRONDAR.ZA .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU もう一度注意しますが, 他の管理領域を書く必要はありません. これらは複数の管理領域を認識できるようにマシンを設定する方法を 示した例ですので, これらの行は消して構いません. 1行目は名前をつけた管理領域に 特定の システムを含めるための ものです. 残りの行は名前をつけた管理領域にサブドメインのデフォルトの システムを含めるためのものです. これでデータベースを作成する準備ができました. この操作はKerberos サーバ (鍵配布センター) を起動するだけです. kdb_initコ マンドを次のように実行してください: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: GRONDAR.ZA You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: ここで鍵を保存して, ローカルのマシンにあるサーバが取り出せるように します. それにはkstashコマンドを使用します. &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! これで暗号化されたマスタパスワードが /etc/kerberosIV/master_key に保存されました. すべてが動くようにするための設定 Kerberosを導入する それぞれの システムのデータベースに, 2つ のprincipal (主体名) を追加する必要があります. その名前は kpasswdrcmdです. これら2つのprincipalは, 個々 のシステムにおいて, システム名と同じ名前のインスタンスと組にして作成 されます. これらの kpasswdrcmd というデーモンによって, 他の システムからKerberosのパスワードを変更したり, rcprlogin, rshといったコマンドを実行したりできるよ うになります. それでは実際にこれらのエントリを追加しましょう: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- ここは「RANDOM」と入力してください Verifying password New Password: <---- ここは「RANDOM」と入力してください Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- ここは「RANDOM」と入力してください Verifying password New Password: <---- ここは「RANDOM」と入力してください Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します サーバファイルの作成 次に, 各マシンにおけるサービスを定義している, すべてのインスタンス を展開します. これにはext_srvtabというコマンドを使用しま す. このコマンドで作成されるファイルは, Kerberosの各クライアン トの/etc/kerberosIVディレクトリに 安全な方法でコピーまたは 移動する必要があります. このファイルはそれぞれのサーバとクラ イアントに存在しなければならず, またKerberosの運用において重要なも のです. &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... このコマンドは一時的なファイルを作成するだけです. ファイル名をすべ てのサーバが読めるような srvtab という名前に変更しな ければなりません. mvコマンドを用いてシステムの場所に移動 してください. &prompt.root; mv grunt-new-srvtab srvtab そのファイルがクライアントに配るためのもので, ネットワークが安全で はないと思われる場合には, client-new-srvtab を移動 可能なメディアにコピーして物理的に安全な方法で運んでください. クラ イアントの/etc/kerberosIVディレクトリで, 名前を srvtabに変更し, modeを600にするのを忘れないでください: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab データベースへのユーザの追加 ここで, ユーザのエントリをデータベースに追加する必要があります. 始めに, ユーザjaneのエントリを作成してみましょう. kdb_edit を用いて次のように作成してください: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- 安全なパスワードを入れてください Verifying password New Password: <---- もう一度パスワードを入れてください Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します すべてのテスト まず始めにKerberosデーモンを起動する必要があります. /etc/rc.conf ファイルを正しく編集してあれば, マシンを再 起動することでに自動的にデーモンが起動します. これはKerberosサー バでのみ必要です. Kerberosクライアントは/etc/kerberosIVか ら必要なものを自動的に入手します. &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: GRONDAR.ZA &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! さあ, これで上で作成した jane というIDのチケットを kinitコマンドで得ることができます: &prompt.user; kinit jane MIT Project Athena (grunt.grondar.za) Kerberos Initialization for "jane" Password: klist コマンドを用いてトークンを見て, きちんとチケットを持って いるかどうか確認してください: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@GRONDAR.ZA Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.GRONDAR.ZA@GRONDAR.ZA passwd コマンドを用いてパスワードを変更して, kpasswdデーモ ンがKerberos データベースに対して認証されるかどうかチェックして ください: &prompt.user; passwd realm GRONDAR.ZA Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. <command>su</command>特権の追加 root権限が必要なユーザは誰でも, suコマンドのパス ワードをユーザ毎に別のもの として持つことができます. rootsu できる権利を与えられたidを追加します. これは, principalに付いているroot というインスタンスに よって制御されています. kdb_editを用いて jane.rootというエントリを Kerberosデータベースに作成します: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- 安全なパスワードを入れます Verifying password New Password: <---- もう一回パスワードを入れます Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- ここは短くしてください Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します 実際にトークンをもらって, ちゃんと働いているかどうか確認しましょう: &prompt.root; kinit jane.root MIT Project Athena (grunt.grondar.za) Kerberos Initialization for "jane.root" Password: ここでrootユーザの .klogin ファイルにユーザを追加する必要が あります. &prompt.root; cat /root/.klogin jane.root@GRONDAR.ZA suしてみましょう: &prompt.user; su Password: どのトークンを持っているか見てみましょう: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@GRONDAR.ZA Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.GRONDAR.ZA@GRONDAR.ZA 他のコマンドの使用 ここまでの例では, jane という principal を root とい うインスタンス付きで作成しました. これはユーザと同じ名前をprincipalと しており, Kerberosのデフォルトの値です; <username>.root という形式の <principal>.<instance>で, 必要なエント リがrootのホームディレクトリの .kloginファイルに あれば, <username>がrootに suすることができま す. &prompt.root; cat /root/.klogin jane.root@GRONDAR.ZA 同様に, ユーザのホームディレクトリの .kloginファイルに次の ような行がある場合には: &prompt.user; cat ~/.klogin jane@GRONDAR.ZA jack@GRONDAR.ZA jane または jack という名前で (前述のkinit によって) 認証されている GRONDAR.ZA という管理領域のユーザ なら誰でもrloginrsh, rcp等によってこ のシステム (grunt) のjaneのアカウントまたはファ イルにアクセスできます. たとえば, Janeが他のシステムにKerberos を用いてloginします: &prompt.user; kinit MIT Project Athena (grunt.grondar.za) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 次の例では, Jackが同じマシンの Jane のアカウントにloginします. Janeは .klogin ファイルを前述のように設定しており, Kerberosではjackというprincipal をインスタンスなしで設定してあ ります. &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.grondar.za) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 ファイアウォール 原作: &a.gpalmer;, Alex Nash;. 訳: &a.jp.saeki;. 11 November 1996. ファイアウォールは, インターネットに参加している人はもちろんのこと, プライベートネットワークのセキュリティ向上のための アプリケーションを 探している人にとっても, ますます興味深くなりつつある分野です. このセクションではファイアウォールとは何か, ファイアウォールの使用法, そしてファイアウォールを構築するために FreeBSD のカーネルで 提供されているファシリティ (機能) の使用法について説明したいと思います. 社内のネットワークと 巨大かつ信頼のおけない インターネットとの間にファイアウォールを構築することで セキュリティ上のすべての問題が解決できると考える人がいます. ファイアウォールはセキュリティ上の問題を 解決する助けになる場合もありますが, 充分な設定がなされていないファイアウォールは, まったくファイアウォールを 持たない場合よりもセキュリティ上の危険を増大させてしまいます. ファイアウォールにできることは, あなたのシステムにもう一つのセキュリティ層を 追加することだけで, 本気でアタックをしかけてくるクラッカーが内部ネットワークに 侵入するのを妨げることはできません. ファイアウォールを侵入不可能と過信して 内部のセキュリティをおろそかにすることは, 単にクラッカーの仕事を少し簡単にするだけでしか ありません. ファイアウォールとは何か ? 現在インターネットで普通に使用されている ファイアウォールには 二つの異なるタイプがあります. 一つは, 厳密には パケットフィルタリングルータ と 呼ばれるタイプのものです. これはマルチホームのホストマシン (複数の ネットワークに接続されているマシン) のカーネルが, ある規則にしたがって パケットを転送したりブロックしたりするものです. もう一つは, proxy (代理) サーバ として知られているタイプのものです. これは, おそらくはマルチホームのホストマシン上で, カーネルによるパケット転送を 禁止して, デーモンにより認証の提供とパケットの転送とを おこなうものです. 二つのタイプのファイアウォールを組み合わせて使用して, 特定のマシン ( 要塞ホスト と呼ばれる) だけが パケットフィルタリングルータを通して内部ネットワークへ パケットを送ることができるよう設定している サイトがしばしば存在します. proxy (代理) サービスは通常の認証機構よりもセキュリティを 強化してある 要塞ホストで動作させます. FreeBSD は (IPFW として知られる) カーネルパケットフィルタ込みで 提供されています. このセクションの後の方では, このフィルタについての 説明を集中しておこないます. サードパーティから提供されるソフトウェアを使用することにより, Proxy サーバを FreeBSD 上に構築することができます. しかし, 現在入手可能な proxy サーバは たいへんバラエティに富んでいるので, このドキュメントでそれらすべてを カバーすることは不可能です. パケットフィルタリングルータ ルータとは, 二つまたはそれ以上のネットワークの間で パケットの転送をおこなう マシンのことです. パケットフィルタリングルータは, そのカーネルの内部に, 一つ一つのパケットをルールリストと比較して 転送するかしないかを決める 特別なコードを持っています. 最近の IP ルーティングソフトウェアのほとんどは, 内部に パケットのフィルタリングをおこなうためのコードを持っていて, デフォルトでは すべてのパケットを転送するようになっています. このフィルタを有効にするためには, パケットの通過を許すべきかどうかを決める ルールを自分で定義する必要があります. パケットを通すべきか通すべきでないかを決めるために, パケットヘッダの内容にマッチするものが ルールリストから探されます. マッチするルールが見つかると, ルールアクションが実行されます. ルールアクションには, パケットを捨てる, パケットを転送する, またはパケットの発信元に ICMP メッセージを送り返すというものがあります. ルールの検索は先頭から順番におこなわれ, 通常は最初にマッチしたものだけが 適用されます. そのため, このルールリストはルールチェーン と呼ばれることもあります. パケットマッチングの基準は使用するソフトウェアに よって異なりますが, 通常はパケットの発信元 IP アドレス, 宛先 IP アドレス, 発信元ポート番号, 宛先ポート番号 (ポート番号はポートをサポートするプロトコルの場合のみ), パケットタイプ (UDP, TCP, ICMP など) に基づくルールを指定することができます. Proxy サーバ Proxy サーバとは通常のシステムデーモン (telnetd, ftpd など) を 特別なサーバで置き換えたマシンのことです. これらのサーバは, 通常は中継をおこなって特定方向への接続だけを許すため, proxy サーバ と呼ばれます. (たとえば) proxy telnet サーバをファイアウォールホストで走らせておきます. 外部からユーザがファイアウォールに対して telnet を実行すると, proxy telnet サーバが応答して, 何らかの認証機構を実行します. これを通過した後で, 内部ネットワークへのアクセスがおこなえるように なるのです. (内部ネットワークからの信号は proxy サーバがかわりに受け取り, 外へ向けて送り出します.) Proxy サーバは通常, 普通のサーバより堅固に構築されていて, しばしば 使い捨てパスワードシステムなどを含む, 多様な認証機構を持っています. 使い捨てパスワードシステムとは, どういうものなのでしょうか. 仮に誰かが何らかの方法で, あなたが使用したパスワードを手に入れたとします. しかし, 一度使用したことで, そのパスワードは既に無効になっているのです. ですから, そのパスワードをもう一度使用したとしても, あなたのシステムへ アクセスすることはできないというわけです. これらのサーバは中継をおこなうだけで, 実際のところサーバホスト自身への アクセスをユーザに許してはいません. そのため, 何者かがセキュリティシステムに 侵入用の裏口を取り付けることは, より困難になっています. proxy サーバはアクセス制限の方法をいくつも持っていて, 特定のホスト だけがサーバへのアクセス権を得ることができるように なっていることがあり ます. そして目的のマシンと通信できるユーザを制限するように 設定することもできます. もう一度言いますが, どんなファシリティ (機能) が使えるかは, どんな proxy サービスをおこなうソフトウェアを選ぶかに大きく 依存します. IPFW で何ができるか FreeBSD とともに配布されている IPFW は, カーネル内部にあって パケットのフィルタリングとアカウンティングを おこなうシステムであり, ユーザ側のコントロールユーティリティである &man.ipfw.8; を 含んでいます. ルーティングの決定をおこなう際に, これらは互いに協力して, カーネルで使用されるルールを定義したり, 現在使用されているルールを 問い合わせたりすることができます. IPFW は互いに関連する二つの部分からなっています. ファイアウォールセクションは パケットフィルタリングをおこないます. また, IP アカウンティングセクションはファイアウォールセクションのものと 似たルールに基づいてルータの使用を追跡します. これにより, (たとえば) 特定のマシンからルータへのトラフィックがどのくらい 発生しているか調べたり, どれだけの WWW (World Wide Web) トラフィックが フォワードされているかを知ることができます. IPFW は, ルータではないマシンにおいても入出力コネクションの パケットフィルタリングのために 使用することができるように設計されています. これは一般的な IPFW の使用法とは異なる特別な使い方ですが, こういった状況でも同じコマンドと テクニックが使用されます. FreeBSD で IPFW を有効にする IPFW システムの中心となる部分はカーネル内部にあります. そのため, どのファシリティ (機能) を必要とするかによって, 一つまたは それ以上のオプションをカーネルコンフィグレーション ファイルに追加し, カーネルを再コンパイルする必要があるでしょう. カーネルの再コンパイル方法の詳細については, カーネルコンフィグレーション を参照してください. 現在, IPFW に関係するカーネルコンフィグレーションオプションは 三つあります: options IPFIREWALL パケットフィルタリングのためのコードを カーネルに組み込みます. options IPFIREWALL_VERBOSE &man.syslogd.8; を通じて パケットのログを取るためのコードを有効にします. フィルタルールでパケットのログを取るように指定しても, このオプションが指定されていなければ, ログを取ることはできません. options IPFIREWALL_VERBOSE_LIMIT=10 &man.syslogd.8; を通じて ログを取るパケットの数をエントリ毎に制限します. 敵対的な環境においてファイアウォールの 動作のログを取りたいけれど, syslog の洪水によるサービス拒絶攻撃に対し 無防備でありたくないという場合に, このオプションを使用したいと思うことが あるかもしれません. チェーンエントリのログが指定された制限数に達すると, そのエントリに関するログ取りは停止されます. ログ取りを再開するには, &man.ipfw.8; ユーティリティを使用して 関連するカウンタをリセットする必要があります: &prompt.root; ipfw zero 4500 4500 とは, ログ取りを続行したいチェーンエントリの番号です. 以前のバージョンの FreeBSD は IPFIREWALL_ACCT というオプションを 持っていました. しかし, ファイアウォールコードがアカウンティングファシリティ (機能) を 自動的に含むようになったため, 現在では使用されることはなくなっています. IPFW の設定 IPFW ソフトウェアの設定は &man.ipfw.8; ユーティリティを 通じておこないます. このコマンドの構文は非常に 複雑に見えますが, 一旦その構造を理解すれば比較的単純です. このユーティリティでは今のところ四つの異なる コマンドカテゴリが 使用されています: それは追加 / 削除, 表示, フラッシュ, およびクリアです. 追加 / 削除はパケットの受け入れ, 拒絶, ログ取りをどのようにおこなうか というルールを構築するのに使用します. 表示はルールリスト (またはチェーン) と (アカウンティング用) パケットカウンタの 内容を調べるのに使用します. フラッシュはチェーンからすべてのエントリを 取り除くのに使用します. クリアは一つまたはそれ以上のアカウンティングエントリを ゼロにするのに 使用します. IPFW ルールの変更 この形式での使用法は: ipfw -N コマンド index アクション log プロトコル アドレス オプション この形式で使用する際に有効なフラグは一つだけです: -N アドレスやサービス名を 文字列に変換して表示します. コマンド は一意である限り短縮可能です. 有効な コマンド は: add ファイアウォール / アカウンティングルールリストに エントリを追加します. delete ファイアウォール / アカウンティングルールリストから エントリを削除します. 以前のバージョンの IPFW では, ファイアウォールエントリと パケットアカウンティングエントリが別々に利用されていました. 現在のバージョンでは, それぞれのファイアウォールエントリ毎に パケットアカウンティングエントリが備えられています. index が指定されていると, エントリはチェーン中の index で示される位置に置かれます. index が指定されて いなければ, エントリは (65535 番のデフォルトルールである パケット拒絶を別にして) 最後のチェーンエントリの index に 100 を足した 位置 (チェーンの最後) に置かれます. カーネルが IPFIREWALL_VERBOSE つきでコンパイルされている場合, log オプションはマッチしたルールを システムコンソールに出力させます. 有効な アクション は: reject パケットを捨てます, ICMP ホスト / ポート到達不能パケットを (適切な方を) 発信元へ送ります. allow 通常通りパケットを通過させます. (別名: pass および accept) deny パケットを捨てます. 発信元は ICMP メッセージによる 通知を受けません (そのためパケットが 宛先に到達しなかったように見えます). count このルールはパケットカウンタを更新するだけで, パケットを 通過させたり拒絶したりしません. 検索は次のチェーンエントリから続けられます. それぞれの アクション は一意な先頭部分だけでも認識されます. 指定可能な プロトコル は以下の通り: all 任意の IP パケットにマッチします. icmp ICMP パケットにマッチします. tcp TCP パケットにマッチします. udp UDP パケットにマッチします. アドレス の指定は: from address/mask port to address/mask port via interface port はポートをサポートする プロトコル (UDP と TCP) の 場合にだけ指定可能です. は必須ではなく, 特定のインターフェースを通ってきたパケット だけにマッチするように, IP アドレスまたはローカル IP インターフェースの ドメイン名, またはインターフェース名 (たとえば ed0) を 指定することができます. インターフェースユニット番号はオプションで, ワイルドカードで指定することが できます. たとえば, ppp* はすべてのカーネル PPP インターフェースに マッチします. address/mask の指定は: address または address/mask-bits または address:mask-pattern IP アドレスのかわりに有効なホスト名を指定することも可能です. はアドレスマスクで上位何ビットを1にするべきかを 示す十進数値です. たとえば次の指定, 192.216.222.1/24 はクラス C のサブネット (この場合 192.216.222) の任意のアドレスにマッチする マスクを作成します. は与えられたアドレスと 論理 AND される IP アドレスです. キーワード any任意の IP アドレスを指定するために 使用することができます. ブロックするポート番号は以下のように指定します: port, port, port のように単独のポートまたはポートのリストを指定します. または port- port のようにポートの範囲を指定します. 単独のポートとポートのリストを 組み合わせて指定することも可能ですが, その場合は常に範囲の方を 最初に指定しなければなりません. 使用可能な オプション は: frag データグラムの最初の フラグメントでなければマッチします. in 入力途中のパケットであればマッチします. out 出力途中のパケットであればマッチします. ipoptions spec IP ヘッダが spec に指定された カンマで区切られた オプションのリストを含んでいればマッチします. サポートされている IP オプションのリストは: ssrr (ストリクトソースルート), lsrr (ルーズソースルート), rr (レコードパケットルート), そして ts (タイムスタンプ) です. 特定のオプションを含まないことを指定するには ! を先頭につけます. established パケットが既に確立されている TCP コネクションの一部であれば (つまり RST または ACK ビットがセットされていれば) マッチします. established ルールをチェーンの最初の方に置くことで, ファイアウォールのパフォーマンスを向上させることが できます. setup パケットが TCP コネクションを確立しようとするものであれば (SYN ビットがセットされ ACK ビットはセットされていなければ) マッチします. tcpflags flags TCP ヘッダが flags に指定された カンマで区切られたフラグの リストを含んでいればマッチします. サポートされているフラグは, fin, syn, rst, psh, ackurg です. 特定のフラグを含まないことを指定するには ! を先頭につけます. icmptypes types ICMP タイプが types リストに 存在していればマッチします. リストはタイプの範囲または個々のタイプを カンマで区切った任意の組合せで指定できます. 一般的に使用されている ICMP タイプは: 0 エコーリプライ (ping リプライ), 3 相手先到達不可能, 5 リダイレクト, 8 エコーリクエスト (ping リクエスト), そして 11 時間超過 (&man.traceroute.8; で使用されているように, TTL 満了を示すのに使用されます) です. IPFW ルールリストの表示 この形式での使用法は: ipfw -a -t -N l この形式で使用する際に有効なフラグは三つあります: -a リスト表示の際にカウンタの値も表示します. このオプションは アカウンティングカウンタの 内容を見る唯一の手段です. -t 各チェーンエントリが最後に マッチした時刻を表示します. この時刻表示は &man.ipfw.8; ユーティリティで使用される入力形式と 互換性がありません. -N (可能であれば) アドレスやサービス名を文字列に変換して表示します. IPFW ルールのフラッシュ チェーンをフラッシュするには: ipfw flush カーネルに固定されているデフォルトルール (インデックス 65535 番) 以外の, ファイアウォールチェーンの中のすべてのエントリを削除します. デフォルトではすべてのパケットが拒絶されるので, 一旦これを実行すると, パケットを許可するエントリがチェーンに追加されるまで, あなたのシステムがネットワークから切り放されてしまいます. そのため, ルールのフラッシュをおこなうときは注意が必要です. IPFW パケットカウンタのクリア 一つまたはそれ以上のパケットカウンタをクリアするためには: ipfw zero index index が指定されていなければ, すべてのパケットカウンタが クリアされます. index が指定されていれば, 特定のチェーンエントリだけが クリアされます. ipfw に対するコマンドの例 このコマンドは, ホスト evil.crackers.org から ホスト nice.people.org の telnet ポートへの すべてのパケットを拒絶します: &prompt.root; ipfw add deny tcp from evil.crackers.org to nice.people.org 23 次の例は, ネットワーク crackers.org (クラス C) 全体から マシン nice.people.org (の任意のポート) への 任意の TCP トラフィックを拒絶し, ログを取ります. &prompt.root; ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org あなたの内部ネットワーク (クラス C のサブネット) に対する X セッションを 張れないようにする場合, 以下のコマンドで必要なフィルタリングがおこなえます: &prompt.root; ipfw add deny tcp from any to my.org/28 6000 setup アカウンティングレコードを見るには: &prompt.root; ipfw -a list または短縮形式で &prompt.root; ipfw -a l 最後にチェーンエントリがマッチした 時刻を見ることもできます. &prompt.root; ipfw -at l パケットフィルタリングファイアウォールの構築 以下の提案は, ただの提案にすぎません: 必要な処理はそれぞれのファイアウォールで異なるため, あなた独自の要求にあったファイアウォールを構築する方法を ここで述べることはできないのです. 最初にファイアウォールをセットアップするとき, コントロールされた環境でファイアウォールホストの 設定がおこなえるような テストベンチセットアップが用意できない場合には, カーネルのログ取りを 有効にしてログ取り版のコマンドを使用することを 強くおすすめします. そうすることで, 大した混乱や中断なしに問題となる範囲の特定と処置を 素早くおこなうことができます. 初期セットアップフェーズが完了してからであっても, アタックの可能性のあるアクセスをトレースしたり, 要求の変化に応じてファイアウォールルールを 変更したりできるので, `deny' に対するログ取りをおこなうことをおすすめします. accept コマンドのログ取りをおこなっていると, ファイアウォールをパケットが一つ通過する毎に 1 行のログが生成されるため 大量の ログデータが発生します. そのため, 大規模な ftp/http 転送などをおこなうと, システムが非常に 遅くなってしまいます. また, パケットが通過するまでにカーネルにより 多くの仕事を要求するため, パケットのレイテンシ (latency) を増加させてしまいます. syslogd もログをディスクに記録するなど, より多くの CPU タイムを 使用し始め, 実に容易に /var/log が置かれているパーティションを パンクさせてしまう可能性があります. ファイアウォールは, /etc/rc.conf.local か, もしくは /etc/rc.conf によって有効化されるべきです. 関連マニュアルページには, どのドアノブ(訳注: ポートや IP アドレスなど, ネットワークからの入口を示すもののこと)に手をつければ良いのかに ついての説明と, ファイアウォール設定の既定値のリストがあります. もし, 設定の既定値を使わない場合には, ipfw list とすることで, 現在のルールセットを rc.conf から読み込める形で ファイルに出力することができます. また, /etc/rc.conf.local/etc/rc.conf によってファイアウォールを 有効化しない場合には, ファイアウォールの有効化がすべての IP インターフェイス設定より先に行なわれるように確認することが重要です. 次の問題は, ファイアウォールが実際には何を する べきかです ! これは外部からそのネットワークへのどんなアクセスを許したいか, また内部から外界へのアクセスを どのくらい許したいかに大きく依存します. いくつか一般的なルールを挙げると: 1024 番以下のポートへのすべての TCP 入力アクセスをブロックします. ここは finger, SMTP (mail) そして telnet など, 最もセキュリティに敏感な サービスが存在する場所だからです. すべての 入力 UDP トラフィックをブロックします. これは UDP を使用しているサービスで有用なものは極めて少ないうえ, 有用なトラフィック (たとえば Sun の RPC と NFS プロトコル) は, 通常セキュリティに対する脅威となるためです. UDP はコネクションレスプロトコルであるため, 入力 UDP トラフィックを拒絶することは すなわち出力 UDP トラフィックに対する返答をも ブロックすることになるので, このことはそれなりの不利益をもたらします. たとえば外部の archie (prospero) サーバを使用している (内部の) ユーザに とって問題となる可能性があります. もし archie へのアクセスを許したければ, 191 番と 1525 番のポートから 任意の UDP ポートへ来るパケットがファイアウォールを通過することを 許可しなければなりません. 123 番のポートから来るパケットは ntp パケットで, これも通過の許可を考慮する必要がある もう一つのサービスです. 外部から 6000 番のポートへのトラフィックをブロックします. 6000 番のポートは X11 サーバへのアクセスに使用されるポートで, セキュリティに対する脅威となりえます. (特に自分のワークステーションで xhost + をおこなう癖を持っている人がいればなおさらです). X11 は実際に 6000 番以降のポートを使用する可能性があるため, 通過許可に 上限を定めると, そのマシンで走らせることのできる X ディスプレイの 個数が制限されます. RFC 1700 (Assigned Numbers) で定義されているように, 上限は 6063 です. 内部のサーバ (たとえば SQL サーバなど) がどのポートを使用するかを チェックします. それらのポートは通常, 上で指定した 1-1024 番の範囲から外れていますので, これらも同様にブロックしておくことは おそらく良い考えです. これとは別のファイアウォール設定に 関するチェックリストが CERT から 入手可能です. http://www.cert.org/tech_tips/packet_filtering.html 前にも述べたように, これはただの ガイドライン にすぎません. ファイアウォールでどのようなフィルタルールを使用するかは, あなた自身が 決めなければなりません. これまでのアドバイスにしたがったにも関わらず, 誰かがあなたのネットワークに 侵入してきたとしても, わたしたちは「いかなる」責任もとることはできません. OpenSSL FreeBSD 4.0 では, OpenSSL ツールキットが基本構成の一部に 含まれています. OpenSSL は, Secure Sockets Layer v2/v3 (SSLv2/SSLv3) や Transport Layer Security v1 (TLSv1) ネットワークセキュリティプロトコルと同様の 多目的な暗号化ライブラリを提供します. しかしながら, OpenSSL に含まれるアルゴリズムのひとつ (特に IDEA) は, 合衆国内, その他の地域において, 特許により保護されています. そのため, 無制約な利用は許されません. IDEA は FreeBSD の OpenSSL 配布に含まれていますが, デフォルトではコンパ イルされません. もし IDEA を使いたいなら, そしてあなたがそのライ センス条項に合致するなら, /etc/make.conf の中の MAKE_IDEA スイッ チを有効にして, 'make world' でソースをリビルドしてください. 現在は RSA アルゴリズムはアメリカとその他の国で自由に利用で きます. 以前は特許により保護されていました. ソースコードのインストール OpenSSL は src-cryptosrc-secure cvsup コレクションの一部です. - FreeBSD のソースコードの取得と更新の詳細は, + FreeBSD のソースコードの取得と更新の詳細は, FreeBSD の入手の項を参照して下さい. IPsec 原作: &a.shin;, 5 March - 2000. + 2000. 訳: &a.jp.hino;, 14 March - 2001. + 2001. - IPsec 機構は, IP 層とソケット層の両方に対して安全な通 - 信を提供します. 本章ではその使い方について説明します. IPsec の内 - 部実現法に関しては 23.5.4 - 章を参照してください. + 信を提供します. 実装の詳細に関しては The + Developers' Handbook を参照してください. + 現在の IPsec の実装は, トランスポートモードとトンネルモード の両方をサポートしています. しかし, トンネルモードにはいくつかの 制限事項があります. http://www.kame.net/newsletter/ にはより総合的な例が載っています. ここで述べる機能を利用するには, 以下のオプションをカーネルコ ンパイル時に指定する必要があることにご注意ください. options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/IPSEC) IPv4 におけるトランスポートモードの例 ホスト A (10.2.3.4) とホスト B (10.6.7.8) との間に安全なチャ ネルを配置するために, セキュリティアソシエーションを設定しましょ う. ここでは, 少し込み入った例を示します. ホスト A からホストB へは old AH のみを使います. ホスト B からホスト A へは new AH と new ESP を組み合わせます. ここで "AH"/"new AH"/"ESP"/"new ESP" に対応するアルゴリズ ムを決めないといけません. アルゴリズムの名前を知るには, &man.setkey.8; マニュアルページをご覧ください. ここでは, AH に MD5 を, new AH には new-HMAC-SHA1 を, new ESP には 8 バイト IV の new-DES-expIV を選びました. 鍵長はそれぞれのアルゴリズムに大きく依存します. たとえば, MD5 では鍵長は 16 バイトでなければなりませんし, new-HMAC-SHA1 では 20 バイトでなければなりませんし, new-DES-expIV では 8 バ イトでなければなりません. ここではそれぞれ "MYSECRETMYSECRET", "KAMEKAMEKAMEKAMEKAME", "PASSWORD", とします. 次に, それぞれのプロトコルに対して SPI (セキュリティパラメー タインデックス: Security Parameter Index) を割り当てます. 三種 類のセキュリティヘッダ (ホスト A からホスト B に一つ, ホスト B から ホスト A に二つ) を生成するので, この安全なチャネルには三 つの SPI が必要になることに注意してください. さらに, SPI は 256 以上である必要があることにも注意してください. ここではそれ ぞれ 1000, 2000, 3000 を割り当てます. (1) ホスト A ------> ホスト B (1)PROTO=AH ALG=MD5(RFC1826) KEY=MYSECRETMYSECRET SPI=1000 (2.1) ホスト A <------ ホスト B <------ (2.2) (2.1) PROTO=AH ALG=new-HMAC-SHA1(new AH) KEY=KAMEKAMEKAMEKAMEKAME SPI=2000 (2.2) PROTO=ESP ALG=new-DES-expIV(new ESP) IV length = 8 KEY=PASSWORD SPI=3000 次に, セキュリティアソシエーションを設定しましょう. ホスト A とホスト B の両方で, &man.setkey.8; を実行します: &prompt.root; setkey -c add 10.2.3.4 10.6.7.8 ah-old 1000 -m transport -A keyed-md5 "MYSECRETMYSECRET" ; add 10.6.7.8 10.2.3.4 ah 2000 -m transport -A hmac-sha1 "KAMEKAMEKAMEKAMEKAME" ; add 10.6.7.8 10.2.3.4 esp 3000 -m transport -E des-cbc "PASSWORD" ; ^D 実際には, セキュリティポリシのエントリが定義されるまでは IPsec による通信は行われません. この例の場合, 両方のホストを設 定する必要があります. A で: &prompt.root; setkey -c spdadd 10.2.3.4 10.6.7.8 any -P out ipsec ah/transport/10.2.3.4-10.6.7.8/require ; ^D B で: &prompt.root; setkey -c spdadd 10.6.7.8 10.2.3.4 any -P out ipsec esp/transport/10.6.7.8-10.2.3.4/require ; spdadd 10.6.7.8 10.2.3.4 any -P out ipsec ah/transport/10.6.7.8-10.2.3.4/require ; ^D ホスト A -------------------------------------> ホスト B 10.2.3.4 10.6.7.8 | | ========== old AH keyed-md5 ==========> <========= new AH hmac-sha1 =========== <========= new ESP des-cbc ============ IPv6 におけるトランスポートモードの例 IPv6 を使ったもう一つの例. ホスト-A とホスト-B 間の TCP ポート番号 110 番の通信には, ESP トランスポートモードが推奨されます. ============ ESP ============ | | ホスト-A ホスト-B fec0::10 -------------------- fec0::11 暗号化アルゴリズムは blowfish-cbc で, その鍵は "kamekame", 認証アルゴリズムは hmac-sha1 で, その鍵は "this is the test key" とします. ホスト-A の設定: &prompt.root; setkey -c <<EOF spdadd fec0::10[any] fec0::11[110] tcp -P out ipsec esp/transport/fec0::10-fec0::11/use ; spdadd fec0::11[110] fec0::10[any] tcp -P in ipsec esp/transport/fec0::11-fec0::10/use ; add fec0::10 fec0::11 esp 0x10001 -m transport -E blowfish-cbc "kamekame" -A hmac-sha1 "this is the test key" ; add fec0::11 fec0::10 esp 0x10002 -m transport -E blowfish-cbc "kamekame" -A hmac-sha1 "this is the test key" ; EOF そしてホスト-B の設定: &prompt.root; setkey -c <<EOF spdadd fec0::11[110] fec0::10[any] tcp -P out ipsec esp/transport/fec0::11-fec0::10/use ; spdadd fec0::10[any] fec0::11[110] tcp -P in ipsec esp/transport/fec0::10-fec0::11/use ; add fec0::10 fec0::11 esp 0x10001 -m transport -E blowfish-cbc "kamekame" -A hmac-sha1 "this is the test key" ; add fec0::11 fec0::10 esp 0x10002 -m transport -E blowfish-cbc "kamekame" -A hmac-sha1 "this is the test key" ; EOF SP の方向に注意してください. IPv4 におけるトンネルモードの例 二台のセキュリティゲートウェイ間のトンネルモード セキュリティプロトコルは old AH トンネルモード, すなわち RFC1826 で指定されるものです. 認証アルゴリズムは "this is the test" を鍵とする keyed-md5 です. ======= AH ======= | | ネットワーク-A ゲートウェイ-A ゲートウェイ-B ネットワーク-B 10.0.1.0/24 ---- 172.16.0.1 ----- 172.16.0.2 ---- 10.0.2.0/24 ゲートウェイ-A における設定: &prompt.root; setkey -c <<EOF spdadd 10.0.1.0/24 10.0.2.0/24 any -P out ipsec ah/tunnel/172.16.0.1-172.16.0.2/require ; spdadd 10.0.2.0/24 10.0.1.0/24 any -P in ipsec ah/tunnel/172.16.0.2-172.16.0.1/require ; add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any -A keyed-md5 "this is the test" ; add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any -A keyed-md5 "this is the test" ; EOF 上記の例のように, もしポート番号フィールドを書かないと, "[any]" と同じ意味になります. `-m' は使用される SA のモードを 指定します. "-m any" はセキュリティプロトコルのモードのワイル ドカードを意味します. この SA をトンネルモードとトランスポート モードの両方で使用できます. そしてゲートウェイ-B では: &prompt.root; setkey -c <<EOF spdadd 10.0.2.0/24 10.0.1.0/24 any -P out ipsec ah/tunnel/172.16.0.2-172.16.0.1/require ; spdadd 10.0.1.0/24 10.0.2.0/24 any -P in ipsec ah/tunnel/172.16.0.1-172.16.0.2/require ; add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any -A keyed-md5 "this is the test" ; add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any -A keyed-md5 "this is the test" ; EOF 二台のセキュリティゲートウェイ間の SA の束を作ります ゲートウェイ-A とゲートウェイ-B の間では, AH トランスポー トモードと ESP トンネルモードが要求されます. この例では, ESP ト ンネルモードが先に適用され, 次に AH トランスポートモードが適用さ れます. ========== AH ========= | ======= ESP ===== | | | | | ネットワーク-A ゲートウェイ-A ゲートウェイ-B ネットワーク-B fec0:0:0:1::/64 --- fec0:0:0:1::1 ---- fec0:0:0:2::1 --- fec0:0:0:2::/64 IPv6 におけるトンネルモードの例 暗号化アルゴリズムは 3des-cbc, ESP の認証アルゴリズムは hmac-sha1 とします. AH の認証アルゴリズムは hmac-md5 とします. ゲートウェイ-A での設定は: &prompt.root; setkey -c <<EOF spdadd fec0:0:0:1::/64 fec0:0:0:2::/64 any -P out ipsec esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require ah/transport/fec0:0:0:1::1-fec0:0:0:2::1/require ; spdadd fec0:0:0:2::/64 fec0:0:0:1::/64 any -P in ipsec esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require ah/transport/fec0:0:0:2::1-fec0:0:0:1::1/require ; add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10001 -m tunnel -E 3des-cbc "kamekame12341234kame1234" -A hmac-sha1 "this is the test key" ; add fec0:0:0:1::1 fec0:0:0:2::1 ah 0x10001 -m transport -A hmac-md5 "this is the test" ; add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10001 -m tunnel -E 3des-cbc "kamekame12341234kame1234" -A hmac-sha1 "this is the test key" ; add fec0:0:0:2::1 fec0:0:0:1::1 ah 0x10001 -m transport -A hmac-md5 "this is the test" ; EOF 異なる通信端での SA を作る ホスト-A とゲートウェイ-A の間では ESP トンネルモードが要 求されています. 暗号化アルゴリズムは cast128-cbc で, ESP の認 証アルゴリズムは hmac-sha1 です. ホスト-A とホスト-B との間で は ESP トランスポートモードが推奨されています. 暗号化アルゴリ ズムは rc5-cbc で, ESP の認証アルゴリズムは hmac-md5 です. ================== ESP ================= | ======= ESP ======= | | | | | ホスト-A ゲートウェイ-A ホスト-B fec0:0:0:1::1 ---- fec0:0:0:2::1 ---- fec0:0:0:2::2 ホスト-A での設定: &prompt.root; setkey -c <<EOF spdadd fec0:0:0:1::1[any] fec0:0:0:2::2[80] tcp -P out ipsec esp/transport/fec0:0:0:1::1-fec0:0:0:2::2/use esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require ; spdadd fec0:0:0:2::1[80] fec0:0:0:1::1[any] tcp -P in ipsec esp/transport/fec0:0:0:2::2-fec0:0:0:l::1/use esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require ; add fec0:0:0:1::1 fec0:0:0:2::2 esp 0x10001 -m transport -E cast128-cbc "12341234" -A hmac-sha1 "this is the test key" ; add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10002 -E rc5-cbc "kamekame" -A hmac-md5 "this is the test" ; add fec0:0:0:2::2 fec0:0:0:1::1 esp 0x10003 -m transport -E cast128-cbc "12341234" -A hmac-sha1 "this is the test key" ; add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10004 -E rc5-cbc "kamekame" -A hmac-md5 "this is the test" ; EOF + + + OpenSSH + + 原作: &a.chern;, + 2001 年 4 月 21 日. + + + セキュアシェル (secure shell) はリモートマシンへのセキュアなアクセスに使われる + ネットワーク接続ツールのセットです. それは rlogin, + rsh, rcp, + telnet を直接置き換えて使うことができます. + また, 他のあらゆる TCP/IP 接続を + ssh 経由でセキュアにトンネル/フォワードすることもできます. + ssh はすべてのトラフィックを暗号化し, + 盗聴や接続の乗っ取り等のネットワークレベルの攻撃を事実上無効化します. + + OpenSSH は OpenBSD プロジェクトによって維持管理されており, SSH v1.2.12 + に最新のすべてのバグ修正と更新を適用したものをベースにしています. + OpenSSH クライアントは SSH プロトコル 1 と 2 の両方に互換性があります. + OpenSSH は FreeBSD 4.0 以降ベースシステムに取り込まれています. + + + OpenSSH を使うことの利点 + + &man.telnet.1; や &man.rlogin.1; + を使う場合, 一般にデータはネットワークを平文で流れます. + ネットワークをクライアントとサーバの間のどこかで盗聴することで + あなたのユーザ/パスワード情報やセション中を流れるデータを盗むことが可能です. + OpenSSH はこれらを予防する為にさまざまな認証と暗号化の方法を提供します. + + + + sshd を有効にする + + rc.conf ファイルに + 以下の行を追加してください. + + sshd_enable="YES" + + 次に起動したときから ssh デーモンが起動します. + もしくは単に sshd + デーモンを実行しても構いません. + + + + SSH クライアント + + &man.ssh.1; ユーティリティは + &man.rlogin.1; と同様に働きます. + + &prompt.root ssh user@foobardomain.com +Host key not found from the list of known hosts. +Are you sure you want to continue connecting (yes/no)? yes +Host 'foobardomain.com' added to the list of known hosts. +user@foobardomain.com's password: ******* + + ログインは rlogin や telnet でセションを張った時と同様に続きます. + SSH はクライアントが接続した時, + サーバの信頼性の検証のために鍵指紋システム + (key fingerprint system) を利用します. + 初めての接続の際にのみ, ユーザは 'yes' と入力することを要求されます. + これ以降の login では保存されていた鍵指紋を照合することで検証されます. + SSH クライアントは保存されていた鍵指紋が + login しようとした際に送られてきたものと異なっていた場合には警告を表示します. + 指紋は ~/.ssh/known_hosts に保存されます. + + + + Secure copy + + scp コマンドが rcp と異なるのは, + セキュアになっているという点だけです. + つまりローカルのファイルをリモートマシンへ, + あるいはリモートマシンのファイルをローカルにコピーします. + + &prompt.root scp user@foobardomain.com:/COPYRIGHT COPYRIGHT +user@foobardomain.com's password: +COPYRIGHT 100% |*****************************| 4735 +00:00 +&prompt.root + + 前回の例でこのホストの指紋がすでに保存されていれば + この scp を使う時に検証が行なわれます. + + + + 設定 + + システム全体の設定ファイルは, OpenSSH デーモン, + クライアントの両方とも /etc/ssh ディレクトリにあります. + + ssh_config はクライアントの動作設定, + sshd_config はデーモンの動作設定を行ないます. + + + + ssh-keygen + + パスワードの代わりに &man.ssh-keygen.1; を使って + ユーザの認証用の RSA 暗号鍵を作ることができます. + + &prompt.user ssh-keygen +Initializing random number generator... +Generating p: .++ (distance 66) +Generating q: ..............................++ (distance 498) +Computing the keys... +Key generation complete. +Enter file in which to save the key (/home/user/.ssh/identity): +Enter passphrase: +Enter the same passphrase again: +Your identification has been saved in /home/user/.ssh/identity. +... + + &man.ssh-keygen.1; は認証に使う為の公開鍵と秘密鍵のペアを作ります. + 秘密鍵は ~/.ssh/identity に保存され, + 公開鍵は ~/.ssh/identity.pub に保存されます. + 公開鍵はリモートマシンの ~/.ssh/authorized_keys + にも置かなければなりません. + + これでパスワードの代わり RSA 認証を使って + リモートマシンに接続できるようになったはずです. + + &man.ssh-keygen.1; でパスフレーズを使っている場合は, + ユーザは秘密鍵を使うために毎回パスフレーズの入力を行なう必要があります. + + &man.ssh-agent.1; と &man.ssh-add.1; は + 多重にパスワード化された秘密鍵の管理に使われます. + + + + SSH トンネリング + + OpenSSH は暗号化されたセションの中に他のプロトコルを + カプセル化することでトンネルを作ることができます. + + 以下のコマンドは &man.ssh.1; で telnet + 用のトンネルを作成します. + + &prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.bar.com +&prompt.user; + + + + -2 は &man.ssh.1; にプロトコル + 2 を使うことを指示します. + (古い ssh サーバを使っているときには指定しないでください) + + + + -N + はトンネルだけでコマンドはないことを示します. + 省略されると &man.ssh.1; は通常のセッションを開始します. + + + -f は &man.ssh.1; + にバックグラウンド実行を強制します. + + + + -L はローカルトンネルとして + localport:localhost:remoteport + 形式を指示します. + + + + + foo.bar.com はリモート/ターゲットの + SSH サーバです. + + + + + SSH のトンネルは指定されたローカルホストとポートを listen する + ソケットを作ることで実現されています. + SSH はローカルのホスト/ポートへのすべての接続を SSH + 接続経由でリモートマシンの指定されたリモートポートへ + 転送 (フォワード) します. + + たとえば, ローカルホストのポート 5023 + がリモートマシンの 23 + に転送されるようになっているとします. + 23 は telnet なのでこれは SSH + トンネルを通るセキュアな telnet セッションを作ります. + + このようにして smtp や pop3, ftp 等のセキュアではない TCP + プロトコルをカプセル化することができます. + + 典型的な SSH トンネル + + &prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.foobar.com +user@mailserver.foobar.com's password: ***** +&prompt.user; telnet localhost 5025 +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +220 mailserver.foobar.com ESMTP + + &man.ssh-keygen.1; と別のユーザアカウントを組み合わせて使うことで + より透過的で悩まずに済むような SSH のトンネル環境を作ることができます. + パスワードを入力するところで暗号鍵を使い, + トンネルは別のユーザ権限で実行することが可能です. + + + + さらに知りたい人へ + + OpenSSH + + &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; + &man.ssh-agent.1; &man.ssh-add.1; + + &man.sshd.8; &man.sftp-server.8; + + diff --git a/ja_JP.eucJP/books/handbook/x11/chapter.sgml b/ja_JP.eucJP/books/handbook/x11/chapter.sgml index 3d7328db94..5034bd29e4 100644 --- a/ja_JP.eucJP/books/handbook/x11/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/x11/chapter.sgml @@ -1,1442 +1,1665 @@ X ウィンドウシステム ありがたいことに, この章は &a.grog; が彼の著書 『The Complete FreeBSD』から分けてくれました. したがって, 本章の著作権は彼に帰属します. ハンドブック用の修正は &a.jim; が行ないました. - また, XFree86のフォントの項は &a.murray; から提供されたものです. + また XFree86のフォントの項は &a.murray; から, + XDM の項は&a.sethk; から提供されたものです. この章では この章では X11 のインストールと設定について解説しています. X11 に関してさらに知りたい, ご自分のビデオカードがサポートされているか, といったようなことについては XFree86 のウェブサイトをご覧ください. はじめに FreeBSD には, いくつかある Intel ベースの UNIX をサポートした X11R6 の移植版, XFree86 が付属しています. この章では XFree86 サーバの設定方法について解説しますが, この解説は FreeBSD と一緒に配布されている資料, 特に /usr/X11R6/lib/X11/doc ディレクトリにある README.FreeBSD や README.Config といったファイルに基づいています. これらの文書はこの解説よりも最新の事情に触れていますので, もし何かおかしなことに気付いた場合はこれらのファイルにあたってみてください. また /usr/X11R6/lib/X11/doc/RELNOTES には, 現在のリリースについて OS に依存しない情報が記述されています. X はたくさんのメモリを使います. X を起動するには最低でも 8 MB のメモリを用意しなければなりませんが, そんなに小さなメモリでは動作が死ぬほど遅いでしょう. 現実的に考えた必要最低なメモリは 16 MB で, さらに足せばより快適にすることができます. もし X を使い倒すなら 128 MB くらいまで増やしていけば, パフォーマンスがどんどんと良くなっていくのがわかるでしょう. この章の残りの部分には非常にたくさんの有用な情報があります. でももしかすると, あなたはそれらには今すぐには興味がなく, とにかく X サーバを立ち上げたいと思っているかも知れません. しかし, 以下のことには注意してください. インストールを間違って行なうと, モニタやビデオボードを焼き焦がしてしまうことがあります. ただし, あなたが仕様を詳しく知っていて, 標準的な SVGA ボードとマルチスキャンモニタを持っているなら, この章は読まなくても恐らく問題ないでしょう. XFree86 のインストール XFree86 をインストールする最も簡単な方法は sysinstall プログラムを使うことです. システムのインストール時でも, 後から /stand/sysinstall を起動するのでもどちらでも構いません. この章の残りでは, 配布物の構成を見てゆき, 手動で X11 をインストールする方法についても見てみることにしましょう. XFree86 の配布物 XFree86 は困ってしまいそうな数のアーカイブとして配布されています. 次のセクションでは, どれをインストールすべきかということについて考えます. どれを選べばいいのかわからないし, 空いているディスク容量は 200 MB しかない‥‥という場合だとしても, それほど心配しないでください. それだけあればすべてを展開しても大丈夫です. 最低でも下の表にあるアーカイブと VGA ボードに合ったサーバの一つとを展開する必要があります. 最低限必要な実行時バイナリだけであればだいたい 10MB の容量が必要で, サーバは 17 MB から 3 MB くらいの容量が必要です. 下の表は, 必要となるものです. アーカイブ 解説 Xbin.tgz 実行可能な X クライアントと共有ライブラリの全て Xfnts.tgz misc と 75 dpi のフォント Xlib.tgz 実行時に必要なデータファイルとライブラリ X サーバ 上のアーカイブに加えて, 少なくとも一つのサーバが必要です. これは約 3 MB のディスクを消費します. どれを選ぶのか, というのはあなたが持っているボードの種類次第です. デフォルトのサーバ名は /usr/X11R6/bin/X ですが, これは特定のサーバのバイナリである /usr/X11R6/bin/XF86_xxxx へのリンクになります. もし CD-ROM のセットを持っているなら, 標準的な PC アーキテクチャ用のサーバアーカイブは /cdrom/XF86336/Servers から, 日本の PC98 アーキテクチャ用のものは /cdrom/XF86336/PC98-Servers から見つけることができます. また、FreeBSD の FTP サイトである ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/XF86336/Servers/ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/XF86336/PC98-Servers/ から入手することもできます. 標準的な PC アーキテクチャで利用可能な X サーバ: アーカイブ 解説 X8514.tgz IBM 8514 とその互換品用. 8 ビットカラー XAGX.tgz AGX や XGA ボード用. 8 ビットおよび 16 ビットカラー XI128.tgz I128 ボード用. 8 ビットおよび 16 ビットカラー XMa32.tgz ATI Mach 32 ボード用. 8 ビットおよび 16 ビットカラー XMa64.tgz ATI Mach 64 ボード用. 8, 16, 32 ビットカラー XMa8.tgz ATI Mach8 ボード用. 8 ビットカラー XMono.tgz VGA, SVGA, Hercules やその他のボード用. 1 ビットモノクロ XP9K.tgz Weitek P9000(Diamond Viper) ボード用. 8, 16, 32 ビットカラー XS3.tgz S3 ボード用. 8, 16, 32 ビットカラー XS3V.tgz S3 ViRGE ボード用. 8 および 16 ビットカラー XSVGA.tgz SVGA カード用. 8 ビット以上のカラー XVG16.tgz VGA や SVGA カード用. 4 ビットカラー XW32.tgz ET4000/W32, /W32i, /W32p そして ET6000 カード用. 8 ビットカラー PC98 アーキテクチャで利用可能な X サーバー: アーカイブ 解説 X9GAN.tgz PC98 GA-98NB/WAP ボード用. 8 ビットカラー X9GA9.tgz PC98 S3 GA-968 ボード用. 8, 16, 32 ビットカラー X9480.tgz PC98 PEGC 用. 8 ビットカラー X9NKV.tgz PC98 NEC-CIRRUS/EPSON NKV/NKV2 ボード用. 8 ビットカラー X9WBS.tgz PC98 WAB-S ボード用. 8 ビットカラー X9WEP.tgz PC98 WAB-EP ボード用. 8 ビットカラー X9WSN.tgz PC98 WSN-A2F ボード用. 8 ビットカラー X9EGC.tgz PC98 EGC 用. 4 ビットカラー X9TGU.tgz PC98 Trident Cyber9320/9680 ボード用. 8, 16 ビットカラー X9NS3.tgz PC98 NEC S3 ボード用. 8, 16 ビットカラー X9SPW.tgz PC98 S3 PW/PCSKB ボード用. 8, 16 ビットカラー X9LPW.tgz PC98 S3 PW/LB ボード用. 8, 16 ビットカラー それぞれのサーバには, サポートするチップセットやサーバ特有の設定オプションを記述したマニュアルが付属しています. また, X プログラマ用に提供されるアーカイブも数多くあります: アーカイブ 解説 Xprog.tgz クライアントをコンパイルするのに必要な設定ファイル, lib*.a および *.h. Xctrb.tgz 寄贈されたソース Xlk98.tgz PC98 用のサーバを構築するのに必要な リンクキット. Xlkit.tgz PC 用のサーバを構築するのに必要な リンクキット. Xsrc-1.tgz 完全なソース. パート 1 Xsrc-2.tgz 完全なソース. パート 2 Xsrc-3.tgz 完全なソース. パート 3 X ソフトウェアの ports をインストールする場合 Xprog.tgz は必須です. XFree86 には, 文書やセットアッププログラムといった付加的なものもたくさん含まれています. アーカイブ 解説 Xdoc.tgz README Xjdoc.tgz 日本語版 README Xps.tgz PortScript フォーマットの README Xhtml.tgz HTML 化された README Xman.tgz オンラインマニュアル Xcfg.tgz カスタマイズ可能な xinitxdm の実行時設定ファイル. Xset.tgz X86Setup; グラフィカルな xf86config ユーティリティ Xjset.tgz PC アーキテクチャ用の XF86Setup 日本語版 XF86Setup は XFree86 用のグラフィカルな設定プログラムで, 標準的な設定プログラムである xf86config よりもこちらを好む人は多いかも知れません. xf86config の場合には特別なアーカイブがあるわけではなく, Xbin.tgz に含まれています. 初めてインストールする時には, 最初の設定ファイルを作るために Xcfg.tgz が必要でしょう. 既にある設定ファイルを上書きしてしまいますので, アップグレードする時には使わないでください. また, XFree86 には他にもフォントがあります: アーカイブ 解説 Xf100.tgz 100 dpi フォント Xfscl.tgz Speedo と Type1 のフォント Xfnon.tgz 日本語, 中国語 や他の非英語フォント Xfcyr.tgz キリルフォント 上で述べた X サーバと異なり, 次に紹介するサーバのアーカイブはすべてメインのディレクトリにあります. アーカイブ 解説 Xfsrv.tgz フォントサーバ Xnest.tgz 別のディスプレイ上のクライアントウィンドウで動作するネストサーバ Xprt.tgz プリントサーバ Xvfb.tgz メモリや mmap されたファイル中に描画を行なう仮想フレームバッファ X サーバ XFree86 のマニュアルインストール sysinstall を使わずに X をインストールする場合は, 以下のようにたくさんのステップを踏む必要があります. ディレクトリを作成し, 必要なアーカイブを展開します. X サーバを選びインストールします. X にアクセスできるように環境を整えます. X を実行するための仮想端末を見つけます. ハードウェアに合わせて X を設定します. やることがたくさんあるように見えますが, きっちりとやればそう大変ではありません. このセクションの残りでは, それぞれのステップについて見ていきます. アーカイブの展開 多くの実行ファイルが set-user-id されていますので, アーカイブの展開は root で行なう必要があります. 通常のユーザとして展開した場合, 実行できないこともあります. また, umask の値として 022 (rwxr-xr-x の許可属性) を用いる必要があります. なぜなら X サーバは特別な許可属性を要求するからです. &prompt.user; su Password: &prompt.root; umask 022 /usr ファイルシステムに十分な空き容量がない場合, 他のパーティションにディレクトリを作成し, /usr にシンボリックリンクを張ってください. たとえば, /home に十分な空き容量がある場合は次のようにします. &prompt.root; cd /home &prompt.root; mkdir X11R6 &prompt.root; ln -s /home/X11R6 /usr/X11R6 次に, どのアーカイブをインストールするのかを決めます. 最小インストールであれば Xbin.tgz, Xfnts.tgz, Xlib.tgz, および Xcfg.tgz を選んでください. すでに X の設定を行なっているのなら Xcfg.tgz はなくても構いません. sh を使っている場合は次のようにして展開します. &prompt.root; mkdir -p /usr/X11R6 &prompt.root; cd /usr/X11R6 &prompt.root; for i in bin fnts lib cfg; do &prompt.root; tar xzf X$i.tgz &prompt.root; done csh なら次のようにしてください. &prompt.root; mkdir -p /usr/X11R6 &prompt.root; cd /usr/X11R6 &prompt.root; foreach i (bin fnts lib cfg) ? tar xzf X$i.tgz ? end サーバのインストール 自分の VGA カードに対応するサーバのアーカイブを選んでください. 上の表からは十分な情報が得られない場合にはサーバのマニュアル /usr/X11R6/man/man1/XF86_* をチェックしてください. それぞれのサーバでサポートするチップセットが載っています. たとえば ET4000 ベースのボードを持っている場合には XF86_SVGA サーバを用いるとよいでしょう. この場合には次のように操作します. &prompt.root; cd /usr/X11R6 &prompt.root; tar xzf XSVGA.tgz [substitute your server name here] 環境設定 次にシンボリックリンクを作って /usr/X11/bin/X が自分のビデオボードに合うサーバを指すようにしましょう. ここでは XF86_SVGA がサーバですから, 次のようにします. &prompt.root; cd /usr/X11R6/bin &prompt.root; rm X &prompt.root; ln -s XF86_SVGA X X が正しく動くためにこのシンボリックリンクが必要なのですが, 以下のように xf86config を実行中に設定するチャンスがあります. 次に, ディレクトリ /usr/X11R6/bin がデフォルトのパスに入っているかどうかチェックします. チェックするのは sh であれば /etc/profile, csh であれば /etc/csh.login です. パスがなければ加えておきましょう. エディタを使うのが最も良いのですが, 面倒な場合には次のようなテもあります. &prompt.root; echo 'PATH=$PATH:/usr/X11R6/bin' >>/etc/profile もしくは &prompt.root; echo 'set path = ($path /usr/X11R6/bin)' >>/etc/csh.login そして, そのシステム上で X を使うユーザの全員が シェル変数 PATH/usr/X11R6/bin を加えていることを確認しましょう. 次に ldconfig を使って共有ライブラリを ld.so のキャッシュに入れます. &prompt.root; ldconfig -m /usr/X11R6/lib X を使う前に再起動するのであれば ldconfig を起動する必要はありません. フォントファイルを圧縮する必要はないのですが, もしするなら忘れずに該当ディレクトリで mkfontdir を実行しなければいけません. そうしないとサーバは could not open default font `fixed' というメッセージを出して強制終了してしまうかも知れません. X への仮想端末の割り当て 次に getty が動いている予備の仮想コンソールがあることを確認しましょう. まずいくつの仮想コンソールがあるのかチェックします. &prompt.root; dmesg | grep virtual sc0: VGA color <16 virtual consoles, flags=0x0> そして, /etc/ttys をチェックして少なくとも一つの仮想端末 (ttyvxx デバイス) で getty が有効になっていないことを確認します. これは次のように off というキーワードを探します. &prompt.root; grep ttyv /etc/ttys ttyv0 "/usr/libexec/getty Pc" cons25 on secure ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 off secure この場合, カーネルが少なくとも 4 つの仮想端末を持っていれば /dev/ttyv3 が利用可能です. そうでなければ /etc/ttys で on を off に変更してgetty を無効にするか, 仮想端末を増やしたカーネルを作ります. 自分のハードウェア用に X を設定する X のインストールが終わったら, XF86Config ファイルをカスタマイズして X サーバにハードウェアの構成と, どう動作させたいのかを X サーバに教えます. XF86Config を設定するためには次にあげるようなハードウェア情報が必要です. マウスの種類, シリアルマウスであればビットレート, そしてマウスが接続されているデバイスの名前. 一般的には, シリアルマウスであれば /dev/ttyd0 もしくは /dev/ttyd1, PS/2 マウスであれば /dev/psm0, そして バスマウスであれば /dev/mse0 です. ビデオボードの種類と表示メモリの量. 名前がわからなければどんなチップセットを使っているのか確認しましょう. モニターのパラメータ. つまり垂直と水平の同期周波数のことです. ハードウェアの確認 ハードウェアがどういうものなのか, どうやって決めればいいのでしょう? ハードウェアメーカが教えてくれるとしても, たとえばディスプレイボードやモニタについて得られる情報は 76 Hz のリフレッシュレートで 16,777,216 色を表示できる SVGA のように非常に貧弱なことがしばしばです. この情報からはピクセルの最大の色深度がわかるくらいで, ディスプレイボードについては何もわかりません. 後でわかりますが, 本当に知る必要のあるパラメータは水平最大周波数, ドットクロック幅, チップセット, そして表示用メモリの量です. 不幸にもこういった情報を得ることができないかも知れませんが, そのうちのいくつかは SuperProbe プログラムを用いて得ることができます. 特にチップセットとボード上のメモリの量はどんなものでも調べられるはずです. SuperProbe は時々, システムをクラッシュさせてしまうこともあります. 実行する時には他に重要なものが動いていないことを確認してから行ないましょう. SuperProbe の出力は次のようになります. &prompt.root; SuperProbe (warnings and acknowledgments omitted) First video: Super-VGA Chipset: Tseng ET4000 (Port Probed) Memory: 1024 Kbytes RAMDAC: Generic 8-bit pseudo-color DAC (with 6-bit wide lookup tables (or in 6-bit mode)) SuperProbe はかなり気難しいコマンドなのでうまく動かないこともあります. その時には次のようなメッセージが出力されます. SuperProbe: Cannot be run while an X server is running SuperProbe: If an X server is not running, unset $DISPLAY and try again SuperProbe: Cannot open video 言い換えれば, X サーバが動いていないのに DISPLAY 環境変数が設定してあると SuperProbe は動きません. ではどうやればこの環境変数の設定を解除できるのでしょう? Bourne シェル系の場合は次のように入力してください. &prompt.root; unset DISPLAY C シェル系ならば次ようにします. &prompt.root; unsetenv DISPLAY <command>xf86config</command> の実行 設定ファイルを作成する簡単な方法は xf86config (すべて小文字であることに注意) か XF86Setup のどちらかのユーティリティを用いることです. 両方のツールとも, 一つ一つ手順を追って設定を行なうことができます. xf86config は CUI モードで動きますが, XF86Setup はグラフィカルなモードで動きます. XF86Setup は変わったハードウェアでは問題を起こし得るため, わたしは個人的に xf86config の方が好きです. sysinstall を使うこともできるのですが, 操作はほとんど変わりません. sysinstall は単に xf86config を起動するだけですし, 直接起動する方が簡単だからです. このセクションでは xf86config を使った設定を解説するための例を示します. 1 MB のメモリが載った懐しい Diamond SpeedStar, ロジテック MouseMan マウス, そして ADI MicroScan 5AP モニタ用に X をインストールするとしましょう. マウスは一つ目のシリアルポート /dev/ttyd0 に接続されています. xf86config を実行するには, そのコマンド名を入力します. 環境変数 PATH/usr/X11R6/bin 含まれていれば単に xf86config と入力するだけです. そうでない場合は xf86config へのフルパスを入力する必要があります. &prompt.root; /usr/X11R6/bin/xf86config このプログラムはメニューから選んだものを基にして基本的な XF86Config ファイルを生成します. XF86Config ファイルは通常 /usr/X11R6/lib/X11 もしくは /etc に置きます. サンプルの XF86Config ファイルが XFree86 とともに提供されていますが, これは標準的な VGA カードと 640x480 の解像度を持ったモニタ用に設定されたものです. このプログラムはファイルに書き出す時にパス名を尋ねてくるでしょう. サンプルの XF86Config を利用して編集しても良いですし, このプログラムに生成させてから細かく調整するのでも良いでしょう. 設定に関する詳細については /usr/X11R6/lib/X11/doc/README.Config を参照してください. 特別に対応したサーバ (SVGA ドライバ中の特別に対応したドライバも含む) の場合, チップセットやカードに特有のオプションと設定がたくさんあります. しかし, このプログラムはそれらの特別な設定については対応していません. いくつかの構成では, それらの設定が必要になります. サーバのマニュアルページやチップセット用の README ファイルをご覧ください. このプログラムを続ける前に, チップセットとビデオカード上のビデオメモリの量について確認しておきます. SuperProbe が役に立つでしょうし, またどのサーバを実行したいのかを知っておくと役に立ちます. Press enter to continue, or ctrl-c to abort. ENTER First specify a mouse protocol type. Choose one from the following list: 1. Microsoft compatible (2-button protocol) 2. Mouse Systems (3-button protocol) 3. Bus Mouse 4. PS/2 Mouse 5. Logitech Mouse (serial, old type, Logitech protocol) 6. Logitech MouseMan (Microsoft compatible) 7. MM Series 8. MM HitTablet 9. Microsoft IntelliMouse 2 ボタンマウスの場合はほとんどが 1 でしょうし, 3 ボタンマウスであれば, おそらく 1 も 2 もサポートしているでしょう. 後者の場合, 主に二つの組み合わせがあります. プロトコルを選択するためのスイッチが付いたマウスと, デフォルトは 1 で, プロトコル 2 を選択するには起動時にボタンを押す必要があるようなマウスです. シリアルポートに特別な命令列を送って 2 を使うようにできるマウスもあります (ClearDTR/ClearRTS オプションを参照してください). Enter a protocol number: 6 Logitech MouseMan You have selected a Logitech MouseMan type mouse. You might want to enable ChordMiddle which could cause the third button to work. Please answer the following question with either 'y' or 'n'. Do you want to enable ChordMiddle? n 多くの X クライアントが三番目のボタンを使うため, このボタンも欲しいところです. しかし, ロジテック純正のマウスの場合 ChordMiddle を有効にする必要はありません. X を起動した時に三番目のボタンが効かない場合には, 設定ファイルを編集して ChordMiddle を有効にします. – そのほうが XF86Setup をもう一度起動するよりもエラーになりにくいのです. Continuing through the setup: If your mouse has only two buttons, it is recommended that you enable Emulate3Buttons. Please answer the following question with either 'y' or 'n'. Do you want to enable Emulate3Buttons? n Now give the full device name that the mouse is connected to, for example /dev/tty00. Just pressing enter will use the default, /dev/mouse. Mouse device: /dev/ttyd1 このエントリには細心の注意を払ってください. マウスが接続されているデバイスの名前を正しく指定しなければいけません. xf86config は FreeBSD に特有のコマンドではなく, 例として示されているものは FreeBSD には存在しないデバイスなのです. シリアルマウスの場合には /dev/ttyd0 から /dev/ttyd3, PS/2 マウスでは /dev/psm0, バスマウスでは /dev/mse0 を使ってください. Continuing, we see: Beginning with XFree86 3.1.2D, you can use the new X11R6.1 XKEYBOARD extension to manage the keyboard layout. If you answer 'n' to the following question, the server will use the old method, and you have to adjust your keyboard layout with xmodmap. Please answer the following question with either 'y' or 'n'. Do you want to use XKB? y The following dialogue will allow you to select from a list of already preconfigured keymaps. If you don't find a suitable keymap in the list, the program will try to combine a keymap from additional information you are asked then. Such a keymap is by default untested and may require manual tuning. Please report success or required changes for such a keymap to XFREE86@XFREE86.ORG for addition to the list of preconfigured keymaps in the future. Press enter to continue, or ctrl-c to abort. List of preconfigured keymaps: 1 Standard 101-key, US encoding 2 Microsoft Natural, US encoding 3 KeyTronic FlexPro, US encoding 4 Standard 101-key, US encoding with ISO9995-3 extensions 5 Standard 101-key, German encoding 6 Standard 101-key, French encoding 7 Standard 101-key, Thai encoding 8 Standard 101-key, Swiss/German encoding 9 Standard 101-key, Swiss/French encoding 10 None of the above Enter a number to choose the keymap. 1 Choose the standard US keyboard さて, ここではモニタの設定を行います. 中心となる二つのパラメータは, スクリーン全体を書き換える時のレートである垂直リフレッシュレートと, 特に重要な, 走査線を表示するレートである水平同期周波数です. 水平同期と垂直同期の有効な範囲はモニタのマニュアルに記載されているでしょう. 疑問がある場合は自分のモニタがあるかどうか, モニタデータベースである /usr/X11R6/lib/X11/doc/Monitors をチェックしてみましょう. Press enter to continue, or ctrl-c to abort. ENTER You must indicate the horizontal sync range of your monitor. You can either select one of the predefined ranges below that correspond to industry- standard monitor types, or give a specific range. It is VERY IMPORTANT that you do not specify a monitor type with a horizontal sync range that is beyond the capabilities of your monitor. If in doubt, choose a conservative setting. hsync in kHz; monitor type with characteristic modes 1 31.5; Standard VGA, 640x480 @@ 60 Hz 2 31.5 - 35.1; Super VGA, 800x600 @@ 56 Hz 3 31.5, 35.5; 8514 Compatible, 1024x768 @@ 87 Hz interlaced (no 800x600) 4 31.5, 35.15, 35.5; Super VGA, 1024x768 @@ 87 Hz interlaced, 800x600 @@ 56 Hz 5 31.5 - 37.9; Extended Super VGA, 800x600 @@ 60 Hz, 640x480 @@ 72 Hz 6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @@ 60 Hz, 800x600 @@ 72 Hz 7 31.5 - 57.0; High Frequency SVGA, 1024x768 @@ 70 Hz 8 31.5 - 64.3; Monitor that can do 1280x1024 @@ 60 Hz 9 31.5 - 79.0; Monitor that can do 1280x1024 @@ 74 Hz 10 31.5 - 82.0; Monitor that can do 1280x1024 @@ 76 Hz 11 Enter your own horizontal sync range Enter your choice (1-11): 残念なことにわたしたちのモニタは /usr/X11R6/lib/X11/doc/Monitors には載っていませんでした. しかし, 偶然にもマニュアルのテクニカルデータセクションに載っていたのです. 水平周波数の範囲は 30 〜 64 kHz で垂直周波数の範囲は 50 〜 100 Hz です. 周波数範囲は選択肢 8 とほぼ同じですが, この設定はテクニカルデータシートのものよりも 0.3 kHz ほど高いほうに広がっています. 危険を冒したいですか? もしそのまま進めてもほとんど問題ありません. 仕様からのずれが小さければ, それでモニタが壊れてしまうようなことはありませんし, また XF86Config が実際に 64.0 から 64.3 kHz の間の水平周波数を出すこともないからです. とは言っても, この小さな危険を背負う必要があるわけではありません. 実際の値を指定すれば良いのです. Enter your choice (1-11): 11 Please enter the horizontal sync range of your monitor, in the format used in the table of monitor types above. You can either specify one or more continuous ranges (e.g. 15-25, 30-50), or one or more fixed sync frequencies. Horizontal sync range: 30-64 次に, 水平周波数の範囲を選びます. You must indicate the vertical sync range of your monitor. You can either select one of the predefined ranges below that correspond to industry-standard monitor types, or give a specific range. For interlaced modes, the number that counts is the high one (e.g., 87 Hz rather than 43 Hz). 1 50-70 2 50-90 3 50-100 4 40-150 5 Enter your own vertical sync range Enter your choice: 3 exactly the range of the monitor 次のステップでは識別のための文字列を指定します. 好きなものを使うことができますが, 非常に多くのハードウェアを扱わない限り xf86config に任せておけばいいでしょう. You must now enter a few identification/description strings, namely an identifier, a vendor name, and a model name. Just pressing enter will fill in default names. The strings are free-form, spaces are allowed. Enter an identifier for your monitor definition: ENTER Enter the vendor name of your monitor: ENTER Enter the model name of your monitor: ENTER 次はビデオボードの選択です. わたしたちは古い ET4000 チップの載った Ramdac とクロックチップが不明な Diamond SpeedStar Plus を持っています. どうやればいいのか見てみましょう. Now we must configure video card specific settings. At this point you can choose to make a selection out of a database of video card definitions. Because there can be variation in Ramdacs and clock generators even between cards of the same model, it is not sensible to blindly copy the settings (e.g., a Device section). For this reason, after you make a selection, you will still be asked about the components of the card, with the settings from the chosen database entry presented as a strong hint. The database entries include information about the chipset, what server to run, the Ramdac and ClockChip, and comments that will be included in the Device section. However, a lot of definitions only hint about what server to run (based on the chipset the card uses) and are untested. If you can't find your card in the database, there's nothing to worry about. You should only choose a database entry that is exactly the same model as your card; choosing one that looks similar is just a bad idea (e.g. a GemStone Snail 64 may be as different from a GemStone Snail 64+ in terms of hardware as can be). Do you want to look at the card database? y 0 2 the Max MAXColor S3 Trio64V+ S3 Trio64V+ 1 928Movie S3 928 2 AGX (generic) AGX-014/15/16 3 ALG-5434(E) CL-GD5434 4 ASUS 3Dexplorer RIVA128 5 ASUS PCI-AV264CT ATI-Mach64 6 ASUS PCI-V264CT ATI-Mach64 7 ASUS Video Magic PCI V864 S3 864 8 ASUS Video Magic PCI VT64 S3 Trio64 9 AT25 Alliance AT3D 10 AT3D Alliance AT3D 11 ATI 3D Pro Turbo ATI-Mach64 12 ATI 3D Xpression ATI-Mach64 13 ATI 3D Xpression+ PC2TV ATI-Mach64 14 ATI 8514 Ultra (no VGA) ATI-Mach8 15 ATI All-in-Wonder ATI-Mach64 16 ATI Graphics Pro Turbo ATI-Mach64 17 ATI Graphics Pro Turbo 1600 ATI-Mach64 Enter a number to choose the corresponding card definition. Press enter for the next page, q to continue configuration. ENTER かなりの数のボードがアルファベット順に定義されていますが, ついに次のようなものを見つけました. 108 DSV3325 S3 ViRGE 109 DSV3326 S3 Trio64V+ 110 DataExpert DSV3325 S3 ViRGE 111 DataExpert DSV3365 S3 Trio64V+ 112 Dell S3 805 S3 801/805 113 Dell onboard ET4000 ET4000 114 Diamond Edge 3D nv1 115 Diamond Multimedia Stealth 3D 2000 S3 ViRGE 116 Diamond Multimedia Stealth 3D 2000 PRO S3 ViRGE/DX 117 Diamond SpeedStar (Plus) ET4000 118 Diamond SpeedStar 24 ET4000 119 Diamond SpeedStar 24X (not fully supported) WD90C31 120 Diamond SpeedStar 64 CL-GD5434 121 Diamond SpeedStar HiColor ET4000 122 Diamond SpeedStar Pro (not SE) CL-GD5426/28 123 Diamond SpeedStar Pro 1100 CL-GD5420/2/4/6/8/9 124 Diamond SpeedStar Pro SE (CL-GD5430/5434) CL-GD5430/5434 125 Diamond SpeedStar64 Graphics 2000/2200 CL-GD5434 Enter a number to choose the corresponding card definition. Press enter for the next page, q to continue configuration. 117 Your selected card definition: Identifier: Diamond SpeedStar (Plus) Chipset: ET4000 Server: XF86_SVGA Press enter to continue, or ctrl-c to abort.ENTER Now you must determine which server to run. Refer to the man pages and other documentation. The following servers are available (they may not all be installed on your system): 1 The XF86_Mono server. This a monochrome server that should work on any VGA-compatible card, in 640x480 (more on some SVGA chipsets). 2 The XF86_VGA16 server. This is a 16-color VGA server that should work on any VGA-compatible card. 3 The XF86_SVGA server. This is a 256 color SVGA server that supports a number of SVGA chipsets. On some chipsets it is accelerated or supports higher color depths. 4 The accelerated servers. These include XF86_S3, XF86_Mach32, XF86_Mach8, XF86_8514, XF86_P9000, XF86_AGX, XF86_W32, XF86_Mach64, XF86_I128 and XF86_S3V. These four server types correspond to the four different "Screen" sections in XF86Config (vga2, vga16, svga, accel). 5 Choose the server from the card definition, XF86_SVGA. Which one of these screen types do you intend to run by default (1-5)? システムはすでに XF86_SVGA を選んでくれています. 違うものに変えますか? 変更するには, それなりの理由が必要でしょう. ここではさしたる理由もありませんので, カードの定義のままにしておきましょう. Which one of these screen types do you intend to run by default (1-5)? 5 The server to run is selected by changing the symbolic link 'X'. For example, the SVGA server. Please answer the following question with either 'y' or 'n'. Do you want me to set the symbolic link? y X を起動するすべてのプログラム (xinit, startx および xdm) は /usr/X11R6/bin/X を起動します. ここでのシンボリックリンクは /usr/X11R6/bin/X が自分のサーバを指すようにしてくれます. もしシンボリックリンクを行なわなければ X を起動することはできません. Now you must give information about your video card. This will be used for the "Device" section of your video card in XF86Config. You must indicate how much video memory you have. It is probably a good idea to use the same approximate amount as that detected by the server you intend to use. If you encounter problems that are due to the used server not supporting the amount memory you have (e.g. ATI Mach64 is limited to 1024K with the SVGA server), specify the maximum amount supported by the server. How much video memory do you have on your video card: 1 256K 2 512K 3 1024K 4 2048K 5 4096K 6 Other Enter your choice: 3 You must now enter a few identification/description strings, namely an identifier, a vendor name, and a model name. Just pressing enter will fill in default names (possibly from a card definition). Your card definition is Diamond SpeedStar (Plus). The strings are free-form, spaces are allowed. Enter an identifier for your video card definition: ENTER You can simply press enter here if you have a generic card, or want to describe your card with one string. Enter the vendor name of your video card: ENTER Enter the model (board) name of your video card: ENTER Especially for accelerated servers, Ramdac, Dacspeed and ClockChip settings or special options may be required in the Device section. The RAMDAC setting only applies to the S3, AGX, W32 servers, and some drivers in the SVGA servers. Some RAMDAC's are auto-detected by the server. The detection of a RAMDAC is forced by using a Ramdac "identifier" line in the Device section. The identifiers are shown at the right of the following table of RAMDAC types: 1 AT&T 20C490 (S3 and AGX servers, ARK driver) att20c490 2 AT&T 20C498/21C498/22C498 (S3, autodetected) att20c498 3 AT&T 20C409/20C499 (S3, autodetected) att20c409 4 AT&T 20C505 (S3) att20c505 5 BrookTree BT481 (AGX) bt481 6 BrookTree BT482 (AGX) bt482 7 BrookTree BT485/9485 (S3) bt485 8 Sierra SC15025 (S3, AGX) sc15025 9 S3 GenDAC (86C708) (autodetected) s3gendac 10 S3 SDAC (86C716) (autodetected) s3_sdac 11 STG-1700 (S3, autodetected) stg1700 12 STG-1703 (S3, autodetected) stg1703 Enter a number to choose the corresponding RAMDAC. Press enter for the next page, q to quit without selection of a RAMDAC. q We don't need this A Clockchip line in the Device section forces the detection of a programmable clock device. With a clockchip enabled, any required clock can be programmed without requiring probing of clocks or a Clocks line. Most cards don't have a programmable clock chip. Choose from the following list: 1 Chrontel 8391 ch8391 2 ICD2061A and compatibles (ICS9161A, DCS2824) icd2061a 3 ICS2595 ics2595 4 ICS5342 (similar to SDAC, but not completely compatible) ics5342 5 ICS5341 ics5341 6 S3 GenDAC (86C708) and ICS5300 (autodetected) s3gendac 7 S3 SDAC (86C716) s3_sdac 8 STG 1703 (autodetected) stg1703 9 Sierra SC11412 sc11412 10 TI 3025 (autodetected) ti3025 11 TI 3026 (autodetected) ti3026 12 IBM RGB 51x/52x (autodetected) ibm_rgb5xx Just press enter if you don't want a Clockchip setting. What Clockchip setting do you want (1-12)? ENTER For most configurations, a Clocks line is useful since it prevents the slow and nasty sounding clock probing at server start-up. Probed clocks are displayed at server startup, along with other server and hardware configuration info. You can save this information in a file by running imprecise; some clocks may be slightly too high (varies per run). At this point I can run X -probeonly, and try to extract the clock information from the output. It is recommended that you do this yourself and add a clocks line (note that the list of clocks may be split over multiple Clocks lines) to your Device section afterwards. Be aware that a clocks line is not appropriate for drivers that have a fixed set of clocks and don't probe by default (e.g. Cirrus). Also, for the P9000 server you must simply specify clocks line that matches the modes you want to use. For the S3 server with a programmable clock chip you need a 'ClockChip' line and no Clocks line. You must be root to be able to run X -probeonly now. Do you want me to run 'X -probeonly' now? この最後の質問はきちんと考える必要があります. あるポイントで X -probeonly を実行する必要はあるのですが, そうするためにはさらにいくつかの設定が必要です. 忠告通り, 後でやってみることにしましょう. Do you want me to run 'X -probeonly' now? n For each depth, a list of modes (resolutions) is defined. The default resolution that the server will start-up with will be the first listed mode that can be supported by the monitor and card. Currently it is set to: "640x480" "800x600" "1024x768" for 8bpp "640x480" "800x600" for 16bpp "640x480" for 24bpp "640x400" for 32bpp Note that 16, 24 and 32bpp are only supported on a few configurations. Modes that cannot be supported due to monitor or clock constraints will be automatically skipped by the server. 1 Change the modes for 8pp (256 colors) 2 Change the modes for 16bpp (32K/64K colors) 3 Change the modes for 24bpp (24-bit color, packed pixel) 4 Change the modes for 32bpp (24-bit color) 5 The modes are OK, continue. Enter your choice: 5 accept the defaults You can have a virtual screen (desktop), which is screen area that is larger than the physical screen and which is panned by moving the mouse to the edge of the screen. If you don't want virtual desktop at a certain resolution, you cannot have modes listed that are larger. Each color depth can have a differently-sized virtual screen Please answer the following question with either 'y' or 'n'. Do you want a virtual screen that is larger than the physical screen? n 物理的な画面の大きさよりも大きな仮想スクリーンが必要かどうかというのは難しい問題です. わたしはかなりうっとうしいと思うので n と答えることをお勧めしますが, 特に最も高い解像度でも小さい, という場合には便利だと感じるかも知れません. さて設定は終わりました. 後は sysinstall が設定ファイルを書くだけです. I am going to write the XF86Config file now. Make sure you don't accidently overwrite a previously configured one. Shall I write it to /etc/XF86Config? y File has been written. Take a look at it before running 'startx'. Note that the XF86Config file must be in one of the directories searched by the server (e.g. /usr/X11R6/lib/X11) in order to be used. Within the server press ctrl, alt and '+' simultaneously to cycle video resolutions. Pressing ctrl, alt and backspace simultaneously immediately exits the server (use if the monitor doesn't sync for a particular mode). For further configuration, refer to /usr/X11R6/lib/X11/doc/README.Config. 一旦この設定が終われば, X を起動する準備ができています. XFree86 におけるフォントの利用 TrueType フォント XFree86に付属しているデフォルトのフォントは, 通常の DTP アプリケーション用として決して理想的なものではありません. 大きなフォントはぎざぎざで未熟な面が目立ちますし, Netscape における小さいフォントははっきり見えません. しかし XFree86 では幸運にも, ほんの少しの作業で TrueTypeフォントを使うように変更できます. XFree86 4.0 は TrueType フォントをサポートしています. この機能を有効にできるモジュールには異なるものが二つありますが, 他のフォント表示用バックエンドと相性が良いため, ここの例では "freetype" モジュールを使います. freetype モジュールを有効にするには, /etc/X11/XF86Config ファイルのモジュールの項に次の行を加えるだけです. Load "freetype" XFree86 3.3.X では, 独立した TrueType フォントサーバを動かす必要があります. この用途に良く利用されるのは Xfstt です. この Xfstt は, /usr/ports/x11-servers/Xfstt にある port を使って簡単にインストールすることができます. 次に, TrueType フォント用ディレクトリ (たとえば /usr/X11R6/lib/X11/fonts/TrueType) を作り, このディレクトリの中にすべての TrueType フォントをコピーします. なお, Machintosh から直接 TrueType フォントを持ってくることはできない, ということを覚えておいてください. つまり XFree86 では, Unix/DOS/Windows フォーマットでなければならないということです. フォントファイルをコピーしたら, ttmkfdir を使って fonts.dir ファイルを作成する必要があります. これは, X のフォント処理部分に新しくインストールしたファイルを 認識させるためのものです. FreeBSD 用の ttmkfdir の port は, /usr/ports/x11-fonts/ttmkfdir にあります. &prompt.root; cd /usr/X11R6/lib/X11/fonts/TrueType &prompt.root; ttmkfdir > fonts.dir さて, 次にフォントパスに TrueType ディレクトリを加える必要があります. 最も簡単な方法は, ~/.xinitrc ファイルに次の項を加えることです. &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/TrueType &prompt.user; xset fp rehash 以上でおしまいです. Netscape, Gimp, StarOffice, そして他の X アプリケーションは, 現在インストールされた TrueType フォントを認識しているはずです. これで (高解像度ディスプレイで見るウェブページの文章などの) 極端に小さいフォントや (StarOffice の中での) 極端に大きなフォントが, より見やすくなったと思います. 注意: XFree86は現在, アンチエイリアスフォントの表示をサポートしていません. これは高解像度ディスプレイではさほど問題にはならないのですが, MacOS や Microsoft Windows と比較すると, - この出力はいまだ最善とは言えないものです. + この出力はいまだ最良とは言えないものです. + + + + + X ディスプレイマネージャ + + + 概要 + + X ディスプレイマネージャ (XDM) は X + Window System に含まれる追加機能の一つで, ログインセションの管理に使われます. + これは最小の X 端末 ( + の項を参照) やデスクトップ, + 大規模ネットワークディスプレイサービスといったさまざまな場面で有効です. + X Window System はネットワークやプロトコルに依存しませんので, + ネットワークで接続された異なる計算機上を用い, 非常に柔軟性が高い組み合せで + X クライアントや X サーバを実行することが可能です. + XDM はどのディスプレイサーバに接続するかの選択や, + ログインやパスワード等の認証情報の入力を行なうためのグラフィカルインターフェイスを提供します. + + XDM がユーザに提供する機能は &man.getty.8; ユーティリティ + (詳細は をご覧ください) + と同じではないかと考えるかもしれません. + XDM は接続されているディスプレイへのシステムログインを執り行い, + 次にログインしたユーザの権限でセションマネージャ + (通常は X のウィンドウマネージャ) を実行します. + そして XDM はそのセションマネージャが終了するのを待ち, + ユーザが完了してディスプレイからログアウトしなければならないことを示します. + ここで XDM は次のユーザがログインできるよう, + ログインとディスプレイチューザ画面を表示します. + + + + + XDM の利用 + + XDM のデーモンプログラムは /usr/X11R6/bin/xdm + にあります. あなたはいつでもこのプログラムを root 権限で + 実行することができ, それはローカルマシンのディスプレイの管理を + 始めます. もし XDM を計算機が起動するたびにバックグラウンドで + 実行させたいのなら, 便利な方法は /etc/ttys + にエントリを追加することです. このファイルのフォーマットや + 使い方に関する詳細は + をご覧ください. xdm デーモンを仮想端末上で実行するための行が + デフォルトの /etc/ttys ファイルにあります. + +ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure + + デフォルトではこのエントリは無効になっていて, これを有効にするには + 5 番目のフィールドを off から + on にして &man.init.8; を + を使って再起動する必要があります. + 最初のフィールドはこのプログラムが管理する端末の名前で + ttyv8 です. それは XDM が + 9 番目の仮想端末で起動されるということを意味します. + + + + XDM の設定 + + XDM の設定ディレクトリは + /usr/X11R6/lib/X11/xdm です. + このディレクトリには XDM の動作や見かけを変更するファイルがあります. + 通常は以下のファイルが置かれています. + + + + + + ファイル + 内容 + + + + + + Xaccess + クライアントの認証ルールセット. + + + + Xresources + デフォルトの X のリソース. + + + + Xservers + 管理対象のリモートとローカルのディスプレイのリスト. + + + + Xsession + ログインのためのデフォルトのセションスクリプト. + + + + Xsetup_* + + + + + xdm-config + この計算機上で実行されているすべてのディスプレイの + グローバルな設定. + + + + xdm-errors + サーバプログラムが出力するエラー. + + + + xdm-pid + 現在実行されている XDM のプロセス ID. + + + + + + このディレクトリには他にも, XDM が動作する時に + デスクトップを設定するのに使われるスクリプトやプログラムがあります. + 次の数節で各ファイルの目的を簡単に説明します. + これらのファイルの正確な書式や使い方は &man.xdm.1; + に書かれています. + + デフォルトの設定ではシンプルな四角のログインウィンドウが表示され, + 上部に大きなフォントで計算機のホスト名が, そしてその下に + Login:Password: + のプロンプトが表示されます. + あなたが XDM のスクリーンの外見 (ルックアンドフィール) をデザインしたいなら, + ここから手をつけるのがよいでしょう. + + + Xaccess + + XDM に制御されているディスプレイに接続するためのプロトコルは + X ディスプレイマネージャ接続プロトコル (XDMCP) + と呼ばれています. このファイルは基本的にはリモートマシンからの XDMCP + 接続を制御するルールセットに過ぎません. + デフォルトではすべてのクライアントから接続できますが + デフォルトの xdm-config ファイルはリモート接続を + listen するようになっていないのであまり意味はありません. + + + + Xresources + + これはディスプレイチューザやログイン画面用の + アプリケーションのデフォルトファイルです. + ここでログインプログラムの外見をカスタマイズすることができます. + 書式 XFree86 の文書で説明されている + app-defaults と同一です. + + + + Xservers + + チューザが選択肢として表示するリモートディスプレイのリストです. + + + + Xsession + + ユーザがログインした後 XDM が実行するデフォルトの + セションスクリプトです. 通常, 各ユーザはカスタマイズされた + セションスクリプトを ~/.xsessionrc + として持っており, セションスクリプトはそれが優先されます. + + + + Xsetup_* + + これらのファイルにはチューザやログインインターフェイスを + 表示する前に自動的に実行されるスクリプトが含まれています. + 各ディスプレイにつきそれぞれ使われるスクリプトが存在し, + Xsetup_ にローカルディスプレイの番号をつけたもの + (たとえば Xsetup_0) になっています. + 一般にこれらのスクリプトはバックグラウンドで + xconsole + 等のプログラムをひとつかふたつ実行します. + + + + xdm-config + + このファイルにはこのマシンが管理する各ディスプレイに適用される設定が + app-defaults 形式で含まれます. + + + + xdm-errors + + このファイルには XDM が実行しようとしている + X サーバの出力が含まれます. + XDM が立ち上げようとしているディスプレイがなんらかの理由で異常停止したときは, + この中からエラーメッセージを探したください. + この手のメッセージはセッション毎にユーザの ~/.xsession-errors + ファイルにも書き込まれます. + + + + + ネットワークディスプレイサーバの実行 + + ディスプレイサーバに他のクライアントを接続するためには, + アクセス制御のルールを書き換えて接続の listen を有効化する必要があります. + デフォルト値はセキュリティを考えて安全なものになっています. + XDM に接続を待ち受けさせるには xdm-config + ファイルの以下の行をコメントアウトしてください. + +! SECURITY: do not listen for XDMCP or Chooser requests +! Comment out this line if you want to manage X terminals with xdm +DisplayManager.requestPort: 0 + + + そして XDM を再起動します. + app-defaults ファイルでのコメントは + ! 文字で始まり, + # ではないので注意してください. + この後, さらに細かなアクセス制御が必要になるでしょう. + Xaccess ファイルの例, および + &man.xdm.1; マニュアルページを参照してください.