システム奮闘記:その82

Linuxとcupsでプリンターサーバー構築



Tweet
(2009年11月8日に掲載)
プリンタサーバー導入の経緯

 プリンターサーバー。
 以前は、WindowsXPのパソコンにプリンターを接続し、
他のWindowsパソコンとネットワークで共有していた。

以前はWindowsXPにプリンターを接続していた
プリンターサーバー導入前
この形態だと簡単に構築できる。
その反面、プリンターを接続しているパソコンは
電源を入れっ放しにする必要がある上、プリンターで
ジョブが詰まると、直接プリンタを接続しているパソコンで
ジョブの消去を行う必要があるから、その度に
そのパソコンを使っている人に「悪い、また詰まった」と言って
その人の仕事の手を止めてもらい、操作する必要があった。

 結構、ジョブが詰まる事があったりする。
 そこで、プリンターサーバーにしてしまえば、
パソコン利用者の手を止めなくても済む。
 ある日

 CUPSを使えば

 Linuxでプリンターサーバー構築可能

 を知った。

 しかし、設定方法を見ても・・・

 よくわからへん (TT)

 だった。

 でも、七転八倒する事はなかった。
 適当に、OpenSuSE10.2をインストールして
プリンターのUSB接続すると、自動的に認識してくれた。

 あとは

 http://(プリンターサーバーのアドレス):631/

 で、プリンターサーバーの制御画面が表示できた。
 適当に触っただけでLinuxでプリンタサーバーができたのだ。

cupsを使ってLinuxでプリンターサーバー構築
cupsでLinuxのプリンターサーバー導入後
Linuxのプリンターサーバーによって、誰かのパソコンを
プリンターサーバーにする事がなくなり
ジョブが詰まった時などに、仕事を止めなくても済んだりする。

ただ、Windos98のパソコン利用者は、cupsで立ち上げた
プリンターサーバーを使う事ができない問題点はあるが・・・

 こうして、cupsの知識が全くないまま

 エイヤ!

 の勢いと、適当にUSB接続でにプリンターを接続しただけで
プリンターの構築をしてしまったのだった


Linuxプリンターサーバーの再構築

 2009年9月に事件が起こる!  プリンターが永眠した!!  のだ。
永眠したプリンター
(エプソンPX-V630)
エプソンのプリンター
家庭用のプリンタを酷使し、かつ、内蔵のカウンターが
一杯になった時、カウンターを操作するソフトを使って
勝手にゼロに改竄(?)して、使いつづけたのだ。

 酷使の末、永眠したプリンター。南無阿弥陀仏。


 さて、cupsのでプリンターの設定。
 何せ、最初にプリンターサーバーを構築した時は
何も考えずに、単にUSB接続をしただけで構築してしまっただけに

 正しく設定を行うための知識がないのらー!!
 

 という事で、cupsが何なのかを勉強する事にした。

cupsって何?

 cupsとは何か?  調べてみると、以下の略語だという。  Common Unix Printer System  直訳すると「標準UNIXの印刷系統」となるのだろう。  UNIX系のプリンタの規格だと思ったりする。  でも、言葉だけでは、ピンと来るはずもないので、 具体的に、どんな物か調べてみる事にした。  すると日経ITProの記事を見つけた。 日経ITProのLinuxキーワード「CUPSとは」  CUPSの仕組みの概略が描かれていた。
CUPSの仕組みの概略
CUPSの仕組み

 PPDを検索サイトで見ると、Windowsでいうプリンタードライバだという。
 CentOS5.xの場合、以下のディレクトリに格納されている。

PPDが格納されているディレクトリ(CentOS5.x)
[root@server]# pwd
/usr/share/cups/model
[root@server]# ls
deskjet.ppd.gz   foomatic-db-ppds   pxlcolor.ppd     stphoto2.ppd.gz
deskjet2.ppd.gz  laserjet.ppd.gz    pxlmono.ppd      textonly.ppd
dymo.ppd.gz      okidat24.ppd.gz    stcolor.ppd.gz   zebra.ppd.gz
epson24.ppd.gz   okidata9.ppd.gz    stcolor2.ppd.gz  zebraep1.ppd.gz
epson9.ppd.gz    postscript.ppd.gz  stphoto.ppd.gz   zebraep2.ppd.gz
[root@server]# 
初期状態では、このディレクトリに格納されている。

 この時は「そうなの」という感じだった。
 そして、とりあえず実践あるのみという事で
前に進む事にした。


 さて、社内の別の所にあったエプソンのプリンター(PM-870C)を 使う事にした。  そこで、PM-870Cをプリンターサーバーに接続して 使えるようにするための設定を行う事にした。
後継機(?)のプリンター
(エプソンPM-870C)
エプソンのプリンター

 プリンターの電源を入れた状態でUSBを差し込むと
自動的にドライバの設定画面が出てくる。

プリンタードライバーの設定画面
プリンタードライバーの設定画面
でも、CentOS5,3の場合、初期状態では
エプソンのPM-870Cのドライバーは入っていないので
それに近い機種(?)のドライバーが選ばれる。

 これを見た時・・・

 なんで、ドライバーがあらへんねん (TT)

 だった。

 実は、ドライバーがRPM形式で提供されているのだが
その時は知らなかったので、このプリンターを使うのを断念した。

 PM-870Cのプリンターが使えない。  でも、その程度で諦める私ではない。  しかし、別の所で余ったプリンターがあった。
後継機(?)のプリンター
(HP Photosmart C3175)
HPのプリンター
印刷だけでなく、スキャナーなどの色々な機能がついた
複合機なのだ。

 早速、プリンターに電源を入れ、USB接続でパソコンと接続する。
 すると・・・

 ドライバーがあった!!

HP Photosmart C3175をUSB接続
該当にプリンタドライバが表示された

 さて、Linux側の設定が完了した。
 実は、CentOS5.xの場合、これで完了ではないのだが、
この時は、完了だと思い込んだ私。


 次にクライアント側のパソコンにプリンターの設定を行った。
 OSは、WindowsXPなのだ。

プリンター追加ウィザード画面
プリンター追加ウィザード画面

 このまま進める。

WindowsXPのプリンターの設定
プリンターの設定
赤く囲んだ「ネットワークプリンター」を選択する。

 そして次へ進む。

接続するプリンターを指定する
接続するプリンターの指定
プリンターを指定する。

http://(サーバーのアドレス):631/printers/(プリンタ名)

なのだ。本の丸写しで覚えたのだ (^^)

なぜ、WebのURLみたいなアドレス指定するのかについては
後述しています。

 これで接続できるかなぁと思いきや・・・

 接続できへん (TT)

 OpenSuSE10.2の時は、プリンターを認識できたのだが
CentOS5.3の場合、プリンターへ接続できない。
 調べてみると、CUPSの設定ファイルの変更が必要だという。

 初期状態では、CUPSは、自分自身以外からの接続を
拒否しているからだ。そのため、設定の変更が必要なのだ。

/etc/cups/cupsd.confの設定
変更前
# Only listen for connections from the local machine.
Listen localhost:631
Listen /var/run/cups/cups.sock
変更後
# Only listen for connections from the local machine.
Listen *:631
Listen /var/run/cups/cups.sock

 そしてプリンタードライバを選択する。

HP Photosmart C3100を選ぶ
プリンタドライバを選ぶ
該当のプリンターに近いドライバーを選ぶ。

 そして、常に使うプリンターかどうかを指定する。

常に使うプリンターかどうかの指定
常に使うかどうかの選択
ここでは「はい」を選んだ。

 これでプリンターが動くと思った。

 早速、WindowsXPのパソコンからテスト印刷を行ってみた。
 しかし・・・

 印刷できへん (TT)

 OpenSuSE10.2の時、UBS接続さえすれば、勝手にドライバーを選択し
そのまま何も触らずに、プリンターが使える状態になっていたが
CentOS5.3では勝手が違うようだ。

 そこでCUPSを使ったプリンターの設定方法を調べてみる事にした。

 以下のサイトを発見。
 「CUPSでLinuxのプリンタ (PIXUS) を共有する」
  http://www.nslabs.jp/linux-printing.rhtml

 すると、CUPSの設定ファイルで記述の変更が必要だと知る。

/etc/cups/mime.convsファイル
変更前
########################################################################
#
# Raw filter...
#
# Uncomment the following filter to allow printing of arbitrary files
# without the -oraw option.
#

#application/octet-stream        application/vnd.cups-raw        0       -
変更後
########################################################################
#
# Raw filter...
#
# Uncomment the following filter to allow printing of arbitrary files
# without the -oraw option.
#

application/octet-stream        application/vnd.cups-raw        0       -
コメントの「#」を外し、この部分を有効にした。

 そして次のファイルの記述も変更する。

/etc/cups/mime.typesファイル
変更前
########################################################################
#
# Raw print file support...
#
# Comment the following type to prevent raw file printing.
#

#application/octet-stream
変更後
########################################################################
#
# Raw print file support...
#
# Comment the following type to prevent raw file printing.
#

application/octet-stream
ここでも、コメントの「#」を外し、有効にした。

 なぜ、この設定を行うのか。
 調べてみると

 生データを中継してプリンターに送るため!

 なのだ。
 でも、生データとは何かと聞かれても・・・

 全くわからへん (^^;;

 だった。

 結局、2つのファイルの記述変更(「#」を外した)理由は
全くわからないままだったが、先に進める事にした。

 そして、CUPSデーモンを再起動させた。


 さて、仕切り直しだ。
 WindowsXPでテスト印刷を行ってみた。
 すると・・・

 うまく印刷できたのらー!! (^^)V

 これでプリンターの問題が片付いたと思った。

 同僚のパソコンにも、新しく取り付けたプリンターを使えるように
ネットワークプリンターの設定を行った。

 だが、数日以内に問題が発生した。
 上司が・・・

 PDFファイルが出力できへんで!

 と言ってきた。

 印刷ジョブが詰まっているわけでもない。
 他の形式のファイル(ワードやエクセルなど)は印刷できる。
 なので・・・

 なんで、PDFが印刷できへんねん (TT)

 これは困った。
 業務に支障が出る。でも、原因がわからない。
 なので・・・

 プリンターを交換するしかあらへん!

 と思った。
 でも、他にプリンターがないのだ。困った。


 でも、ふと思った。
 ドライバーがないと思って諦めたエプソンのPM-870Cの存在だ。

最後のプリンター
(エプソン PM-870C)
エプソンのプリンター

 でも、このままでは使えない。
 そこで、ドライバーが配布されていないのか調べてみる事にした。

 すると以下のサイトを発見。「Let's Use CUPS with Linux」
  http://home.g07.itscom.net/hfkowata/cups_jpn.html

 エプソンコーワのサイトからドライバーをダウンロードすれば
良いと書いてあった。

 なので、エプソンコーワに接続しようとしたら・・・

 そんな会社、あらへんやん (TT)

 だった。

 別のサイト「Desktop Linux Memo  CUPSの設定」を見ると、
アヴァシス株式会社からダウンロードできるのを知った。
 http://www10.atwiki.jp/gleaning/pages/23.html

 だが、「Let's Use CUPS with Linux」サイトの情報は
決して記述間違いではない。

頻繁な社名変更だと混乱する
私が参考にしたサイトは2006年に書かれた物だった。
だが、その後、エプソンコーワ社は社名変更で
2008年から「アヴァシス株式会社」と名乗るようになった。

元々は独立系の企業だったのが、エプソンの資本が入ったり
その後、他の資本が入ったりするたびに、社名が変わり
今の社名になったのだ。
そのためサイトの情報は記述間違いではないのだ。

 なので、アヴァシス株式会社のサイトからエプソンのプリンター
PM-870Cのドライバーをダウンロードする事にした。
 アヴァシス株式会社

 そしてRPMファイルをダウンロードした後、
インストールを行った。


エプソン PM-870Cのドライバーのインストール
[root@server]# rpm -ivh --nodeps pips870-cups-2.6.2-2.i386.rpm 
準備中...                ########################################### [100%]
   1:pips870-cups           ########################################### [100%]
Install Message > Described entry of PM870C in services.
Install Message > Backup file is /etc/services.bak.
Install Message > Start /usr/local/EPKowa/PM870C/setup to change setup.
[root@server]# 

 これでドライバーのインストールは完了した。
 そして、プリンターをUSB接続を行って、プリンターの電源を入れた。
 すると・・・

 ドライバーを認識してるやん!! (^^)

PM870Cのプリンターの該当ドライバーが
インストールされた様子
PM870Cが認識した様子
該当のプリンターを選択して「OK」ボタンを押すと
そのプリンターが使えるようになる。

 もちろん、CUPSの2つの設定ファイルの記述も
以下のようにしておく必要がある。

/etc/cups/mime.convsファイル
########################################################################
#
# Raw filter...
#
# Uncomment the following filter to allow printing of arbitrary files
# without the -oraw option.
#

application/octet-stream        application/vnd.cups-raw        0       -
コメントの「#」を外し、この部分を有効にした。

 そして次のファイルの記述も変更する。

/etc/cups/mime.typesファイル
########################################################################
#
# Raw print file support...
#
# Comment the following type to prevent raw file printing.
#

application/octet-stream
ここでも、コメントの「#」を外し、有効にした。

 サーバー側のプリンターの設定は完了。


 次にクライアント側のプリンターの設定。
 「HP Photosmart C3175」と同様の設定を行う。

プリンター追加ウィザード画面
プリンター追加ウィザード画面

 このまま進める。

WindowsXPのプリンターの設定
プリンターの設定
赤く囲んだ「ネットワークプリンター」を選択する。

 そして次へ進む。

接続先のプリンターの指定
プリンターの設定
プリンターを指定する。

http://(サーバーのアドレス):631/printers/(プリンタ名)

ここではプリンタ名は「pm-870c」になる。
なのだ。

 そしてプリンタードライバを選択する。

エプソンのPM-870Cを選ぶ
プリンタードライバの選択
エプソンのPM-870Cを選ぶ。

 そして、常に使うプリンターかどうかを指定する。

常に使うプリンターかどうかの指定
常に使うかどうかの選択
ここでは「はい」を選んだ。

 これでクライアントの設定も完了だ。


CUPSの運用について

 CUPSを使ったプリンターサーバーの管理。  Webの画面を使って管理ができるので非常に手軽だ。  その際のURLは以下のようになる。  http://(サーバーのアドレス):631/  ポート631を使って接続するのだ。  早速、接続してみる事にした。
いきなり接続拒否の表示
CUPSをWebで操作するが拒否される
接続拒否されている画面だ。

 これが出た時・・・

 なんでやねん!! (TT)

 と思った。

 設定などを調べると、/etc/cups/cupsd.confファイルを触る
必要があるという。
 設定ファイルの中身は、Apacheの設定ファイルhttpd.confに似た設定だ。

/etc/cups/cupsd.confの設定
変更前
# Restrict access to the server...
<Location />
  Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Encryption Required
  Order allow,deny
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>
変更後
# Restrict access to the server...
<Location />
  Order allow,deny
  allow 192.168.X.*
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Encryption Required
  Order allow,deny
  allow 192.168.X.*
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  allow 192.168.X.*
</Location>
本社のネットワークは192.168.X.1/24なので
接続許可の赤い部分の記述を「192.168.X.*」にした。

 これで良し。
 仕切り直しで、Webで管理画面を開いてみた。

 今度は、無事、開いたのらー (^^)V

 あとでわかった話、同じネットワーク上(セグメント)の場合
IPアドレスでの指定ではなく、以下の方法でも良い事を知った。

/etc/cups/cupsd.confの設定
変更前
# Restrict access to the server...
<Location />
  Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Encryption Required
  Order allow,deny
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>
変更後
# Restrict access to the server...
<Location />
  Order allow,deny
  allow @LOCAL
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Encryption Required
  Order allow,deny
  allow @LOCAL
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  allow @LOCAL
</Location>
接続許可の赤い部分を「@LOCAL」にすれば
同じネットワーク(セグメント)の接続許可の意味になる。

 もう1つの方法も紹介します。
 CentOS5.xでGNOMEを使っている場合、設定ファイルではなく
GUIを使って、簡単に接続拒否を解除できる方法もある。

Linuxサーバー側のGUIの印刷設定
Linux側での印刷の設定
CentOS5.xのGNOMEの画面だ。GUIを使った設定で
「システム」→「管理」→「印刷」を選択すれば良い

 すると印刷設定画面が出てくるので、以下のような設定を行う。

GUIで印刷設定の変更
GUIでCUPSの設定変更
「リモートによる管理を許可する」に印をつければ良い。

 Webで操作するため、他のマシンからの接続を許可する方法で
直接、設定ファイルを触る方法と、GUI上で簡単設定の方法を紹介しました。


 さて、Webで操作画面を出します。

CUPSのWeb操作画面
CUPSのWeb操作画面
赤く囲んだ「プリンタ」を選択すれば
登録されているプリンタが表示される。

 「プリンタ」を選択すると、以下の画面になる。

登録されたプリンターの表示
cups画面:登録されたプリンターの表示
エプソンのPM-870Cの登録情報がある。

 Web画面を使っていけば、マウス操作で設定や変更ができるので
非常に手軽だし、遠隔からの操作も可能だ。

プリンタージョブの削除

 無事、エプソンのPM-870Cを使ったプリンターサーバーが稼働した。  これで安心だと思った。  だが、運用開始からすぐに周囲から  印刷の取消ができへん!  の声が出てきた。
Windows上から印刷ジョブが消去できない様子
印刷ジョブ消去ができない様子
ジョブの取消をしたくても、エラーが出てしまう。

 実は、これが初めてではなかった。
 以前、適当に構築したプリンターサーバーの時も同じだった。

 Webのcupsの操作画面でないと、ジョブが取消できないと
思い込んでいた私だった。
 なので

 ジョブを取り消して

 と言われる度に、cupsの画面を開いてジョブを消していた。

WebのCUPS管理画面から印刷ジョブを消す
WebのCUPS操作画面から印刷ジョブ消去
拡大した部分でジョブの消去を行っていた。

 ジョブ消去をする側は私に言わないといけないので手間。
 そして、依頼される私も手間。

 なんとか解消せんとアカン!

 と思った。

 色々、Webの管理画面を触っていると、全てのプリンター利用者でも
印刷ジョブの消去を可能にするための設定がわかった。

CUPSのWeb管理画面
CUPSのWeb管理画面
赤く囲んだ部分の所に印をつける。
これだけで全ての利用者が印刷ジョブの取消ができる。

 そして、実際に印刷ジョブを取り消す事ができるのか
試してみる事にした。

 まずは印刷を行う。プリンターの電源はわざと落としておいて
印刷待ちの状態にしておく。

印刷待ちの状態
印刷待ちの状態

 そして印刷ジョブの取消を行ってみる。

印刷ジョブの取消を行ってみる
印刷ジョブ取消の様子

 すると以下の画面が出てきた。

印刷ジョブの取消の確認画面
印刷ジョブ取消確認画面
「はい」を押せば、印刷ジョブが取り消す事ができる。

 結果は・・・

 印刷ジョブの取消成功 (^^)

 このお陰で、わざわざWeb管理画面を開いて
印刷ジョブの削除を行うという手間が省けた。


CUPSの仕組みを調べていく

 これでCUPSの設定が終わったと思いたい所だが この程度の内容だと、単に設定丸写しなので  わかった事にならないのらー (^^;;  という事でCUPSの印刷の仕組みを調べていく事にした。

Linuxサーバー上での印刷の仕組み

 まずは日経ITProのサイトに載っていたCUPSの仕組みの 概略図を見てみる事にした。
CUPSの仕組みの概略
CUPSの仕組み

 最初から壁にぶつかった。

 Ghostscriptとは何やねん?

 そこで調べてみる事にしたら、2つの事がわかった。

Ghostscriptとは何か?
(1) Postscriptファイルの表示・印刷・変換ソフト
(2) PostscriptやEPSファイルを画像に変換するソフト

 いまいち、よくわからん。
 そもそも・・・

 Postscriptファイルって何やねん!

 Postscriptファイルという名称を知らないわけではない。
 学生時代に研究室配属があった。物理の学生だった私は
UNIXのある所へ配属。卒論はTeXが必須だった。

 学生時代という遠い記憶が、少し思い出してきた。

TeXとPostscriptファイルの関連
(1) TeXで文章作成。
当時、本の丸写しで作成した。TeXは完璧に忘れた (^^;;
(2) jlatex XXX.texでコンパイル

dvi形式のファイルが生成される。
(3) dvi2ps XXX.dviを実行する。

dvi2psコマンドでDVI形式ファイルが
postscriptファイル(psファイル)に変換される。
(4) lpr -P(プリンター名) XXX.ps で印刷

lprは印刷するためのUNIXのコマンド。

 でも、当時は印刷するための手順でpsファイルが生成されるとしか
思っていなかったので、いざ「postscriptファイルとは何か」と
聞かれると、全く答えられない。

 という事で、Postscriptファイルが何なのかを調べてみる事にした。

Postscriptファイルとは何か?
アドビ(Adobe)が開発したページ記述言語。
ファイルの中身は、テキストで記述されている。

 ところで・・・

 ページ記述言語って何やねん?

 そこで調べてみる事にした。

ページ記述言語
ページ記述言語(PDL:Page Description Language)は
文字や図形を点の集まりで表現せず、描写の記述で表現している。

例えば、円の場合は「中心(X,Y)の座標で半径Zの円」という形で
図形を表現をしている。そのため、画面解像度に依存しない
図形や文字の描写が可能になる。

 実際、点の集まりの画像と、ページ記述言語で表現された画像を
拡大させてみて、どうなるのかの実験してみる事にした。
 1枚の円を描いた画像がある。

円の画像
円の図形

 これを4倍の大きさに拡大して比較してみる。

4倍に拡大した時の比較
点の集まりの画像の場合 ページ記述言語の画像の場合
点の集まりの画像を拡大 ページ記述言語の画像を拡大

 点の集まりの画像の場合、拡大するとゴツゴツした粗い画像になるが
ページ記述言語の場合、滑らかな曲線を保っている。

 この2つの画像には、それぞれ名称がついている。

画像の名称
ラスタ画像 点の集まりで描写した画像
bmp、jpg、gifなどの画像データに使われる描写法だ。
ベクタ画像 図の位置、形、大きさを記述し、それを元に描写する画像。
PDFファイル、Postscriptファイルなどがある。

 思わず・・・

 こんな事、知らへんかった (--;;

 だった。
 でも、PDFファイルを拡大しても、綺麗に表示される理由がわかった。
 ベクタ画像なので、拡大しても、粗い点の画像になる事がないのだ。

 でも、PDFファイルでも、曲線を描く場合もある。
 その場合は、どんな風に表現しているのだろうか?
 調べてみると・・・

 ペジェ曲線なのらー (^^)

 でも、ペジェ曲線を理解しようにも、数式との格闘になる。
 いくら私が理系出身でも、10年以上、数式から離れているため

 そんなもん、わかるわけねぇーよ (^^)

 現在、事務職の私。微分積分や数列なんて遠く彼方へいってしまい
電卓を使った四則演算しか行わない。
 という事で、難しい数式表現で、曲線を描写している事だけを
頭に入れておく事にした。


 ところで、postscriptのようなページ記述言語の場合
解像度に関係なく綺麗な画像の描写以外に、どんな利点があるのか?
 調べてみると、postscriptファイルの方が容量を小さくする事が
可能だというのだ。

 Postscriptファイルの作成入門を公開しているサイトがあった。
 http://tutorial.jp/graph/index.html
 PDFファイルを掲載されておられるので、それを取り込んで読んでみた。
 わかりやすく説明されておられる。参考にして円の画像を記述してみた。

postscript形式で円を記述
%!PS-Adobe-3.0
newpath
300 600 100 0 360 arc
stroke
showpage
中心座標(300,600)で半径100で、0度から360度までの弧という意味だ。
まさに円図形なのだ。たった5行の記述になった。

 このpostscript記述ファイルをgimpで開いてみる事にした。
 画面解像度を100にしてみた。

gimpでpostscriptファイルを開く
gimpでpostscriptファイルを開く
解像度を100にしてみる事にした。
100にした理由は、特にありませんが (^^;;

どうやら全体の大きさは(826,1170)というピクセル値だ。

 これがgimpで開いた結果だ。

gimpで開いた結果
gimpで開いた結果
綺麗に円を描いている。たった5行の記述なのだ。

 さて、画像データの大きさを見てみる事にした。

画像データの大きさ比較
[suga@linux]$ ls -l
合計 2904
-rw-r--r-- 1 suga suga 2901654 11月  5 18:09 circuit.bmp
-rw-r--r-- 1 suga suga    3010 11月  5 18:09 circuit.gif
-rw-r--r-- 1 suga suga      60 11月  5 18:08 circuit.ps
[suga@linux]$ 
gifに変換した時、画像データのピクセル値が(826,1170)なので
容量が大きくなるのは当然だと思う。

postscriptが60バイトなのに、gifでは3Kバイト。
BMPだと2.9Mバイトになっている。

 postscriptのようなページ記述言語にすると画像データの容量を
小さくする事ができる。この利点は、1985年に発揮した。
 1985年にpostscriptプリンターが開発された。
 その時代ならではの問題点を解消する事だった。

通常のプリンターの場合
通常のプリンターの場合
印刷の際、パソコンからプリンターへデータを送信するのだが
当時は、データ送信の速度が遅かったため
それがプリンターの印刷性能を悪くする原因になっていた。

 データ送信を素早く完了させるために、データ量の少ない
ページ記述言語対応のプリンターが開発された。

postscriptプリンタの場合
postscriptの場合
テキストのみのデータのため、データ送信が早い。
そしてプリンターに描写するための頭脳を搭載する事で
プリンターで画像化し、印刷させる仕組みにした。
プリンターの性能は上がった。でも、価格が高いのだ。

 1985年といえば・・・

 阪神タイガース21年振りの優勝!!

 だった。
 日本中が六甲おろしの渦になった。
 そしてカーネルサンダースがバースに見立てられ、
道頓堀に放りこまれ、長年、発見されない状態になった。

 そんな昔の話なので、当時の伝送速度が遅かった事を意味する。
 今となっては、パソコンからプリンターへの伝送速度向上は
利点とは言えなくなっている。
 だが、メールなどで画像を送信する場合、PDFといった
ページ記述言語形式のファイルだと容量が小さい方が良いので
別の所で利点して作用しているのは間違いないと思う。


 回り道になったが、ghostscriptというソフトが
postscriptファイルを表示するためのソフトだというのがわかった。


 次にPPDについて、踏み込んで調べてみる事にした。
 すると以下の事がわかった。

PPDファイルとは何か?
psファイル(postscriptファイル)を印刷するのに必要なファイル

postscriptプリンターの機種ごとの情報が記録されているファイル。
印刷時にPostscriptプリンターのドライバが参照する。
そのため、プリンター記述ファイルと呼ばれる。

 PPDファイルが、どのディレクトリに格納されているのか見てみた。

PPDが格納されているディレクトリ(CentOS5.x)
[root@server]# pwd
/usr/share/cups/model
[root@server]# ls
deskjet.ppd.gz   foomatic-db-ppds   pxlcolor.ppd     stphoto2.ppd.gz
deskjet2.ppd.gz  laserjet.ppd.gz    pxlmono.ppd      textonly.ppd
dymo.ppd.gz      okidat24.ppd.gz    stcolor.ppd.gz   zebra.ppd.gz
epson24.ppd.gz   okidata9.ppd.gz    stcolor2.ppd.gz  zebraep1.ppd.gz
epson9.ppd.gz    postscript.ppd.gz  stphoto.ppd.gz   zebraep2.ppd.gz
[root@server]# 
初期状態では、このディレクトリに格納されている。

 ふと思った。

 Postscriptプリンターとは何やねん?

Postscriptプリンターとは何か?
Postscriptで記述されたデータを解読し、印刷できるプリンター。
でも、高価なので、家庭用などでは使われる事がない。

 なので、エプソンのPM-870Cは非postscriptプリンターになる。
 ここで素朴な疑問が生まれた。

 なんで、PM-870CにPPDファイルがあるねん!

PM-807C用のPPDが格納されている
ディレクトリ(CentOS5.x)
[root@server]# pwd
/etc/cups/ppd
[root@server]# ls
PM-870C.ppd
[root@server]# 
初期状態で格納されているPPDファイルのディレクトリとは
異なる場所に格納されている。

PM-870CのPPDファイルが格納されている。

 PPDファイルは、postscriptプリンターの機種の情報を記述した物だ。
 そのため、非postscriptプリンターであるPM-870Cに
PPDファイルが必要なのかが理解できない。

 だが、ふと次の事を思った。

 Linux上で印刷すると

 スプールには、どんなデータ形式で送られるのか?

スプールとは
スプール(spool)とは、印刷データを一時保存する場所だ。

元々、spoolとは、糸巻きや磁気テープの意味がある。
どう派生したのかは、わからないが、入出力データを
高速処理するために、一時的に保管する場所の事を指す言葉になった。

 スプールにどんなデータが送られているのか、自分の目で確かめるため
3種類のソフトで実験してみる事にした。

gimpで印刷
Linuxでgimpを使用

 早速、印刷してみる。
 そして、スプールを見てみる。

スプールの中身を見てみる。
[root@server]# ls -l /var/spool/cups/
合計 3000
-rw------- 1 root lp     829 10月 23 11:47 c00004
-rw-r----- 1 root lp 3067695 10月 23 11:47 d00004-001
[root@server]#
一時保管のディレクトリはCentOS5.xの場合
/var/spool/cupsになる。

そして送られてきた印刷データは「d0004-001」ファイルになる。

 さて、印刷データの中身を見てみる事にした。
 すると・・・

 postscriptファイルやん!!

d0004-001ファイルの中身(一部抜粋)
%!PS-Adobe-3.0
%%Creator: Print plug-in V4.2.7 - 15 Jul 2004 for GIMP/Gimp-Print 4.2.7 (15 Jul 2004)
%%CreationDate: Fri Oct 23 11:53:38 2009
%Copyright: 1997-2002 by Michael Sweet (mike@easysw.com) and Robert Krawitz (rlk@alum.mit.edu)
%%BoundingBox: 49 36 563 756
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
赤い部分でわかるように、まさにpostscriptファイルなのだ。

 でも、これだけでLinux上のソフトはpostscript形式のデータを
スプールに送っていると断言できない。
 そこで、次にもじらで実験してみる事にした。

もじらで印刷
もじらを開いた

 そしてスプールを見てみる。

スプールの中身を見てみる。
[root@server]# ls -l /var/spool/cups/
合計 3452
-rw------- 1 root lp     829 10月 23 11:47 c00004
-rw------- 1 root lp     758 10月 23 11:53 c00006
-rw-r----- 1 root lp 3067695 10月 23 11:47 d00004-001
-rw-r----- 1 root lp  458322 10月 23 11:53 d00006-001
[root@server]#
一時保管のディレクトリはCentOS5.xの場合
/var/spool/cupsになる。

そして、もじらから送られてきた印刷データは
「d0006-001」ファイルになる。

 早速、「d0006-001」ファイルを見てみる。

d0006-001ファイルの中身(一部抜粋)
%!PS-Adobe-3.0
%%Creator: cairo 1.6.4 (http://cairographics.org)
%%CreationDate: Fri Oct 23 11:47:38 2009
%%Pages: 4
%%BoundingBox: 0 0 612 792
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%EndComments
%%BeginProlog
赤い部分でわかるように、まさにpostscriptファイルなのだ。

 でも、まだpostscriptファイルをスプールに送ると
断言できない。
 そこで、OpenOffice2.3で実験する事にした。

OpenOffice2.3で印刷
OpenOfficeを開いた

 そしてスプールを見てみる。

スプールの中身を見てみる。
[root@server]# ls -l /var/spool/cups/
合計 3452
-rw------- 1 root lp     829 10月 23 11:47 c00004
-rw------- 1 root lp     758 10月 23 11:53 c00006
-rw------- 1 root lp     812 10月 23 11:57 c00007
-rw-r----- 1 root lp 3067695 10月 23 11:47 d00004-001
-rw-r----- 1 root lp  458322 10月 23 11:53 d00006-001
-rw-r----- 1 root lp   13597 10月 23 11:57 d00007-001
[root@server]#
一時保管のディレクトリはCentOS5.xの場合
/var/spool/cupsになる。

そして、OpenOffice2.3から送られてきた印刷データは
「d0007-001」ファイルになる。

 早速、「d0007-001」ファイルを見てみる。

d0007-001ファイルの中身(一部抜粋)
%!PS-Adobe-3.0
%%BoundingBox: (atend)
%%Creator: (OpenOffice.org 2.3)
%%For: (root)
%%CreationDate: (Fri Oct 23 11:57:06 2009)
%%Title: (Untitled1)
%%LanguageLevel: 3
%%DocumentData: Clean7Bit
%%Pages: (atend)
%%PageOrder: Ascend
%%EndComments
赤い部分でわかるように、まさにpostscriptファイルなのだ。

 3種類の印刷データの形式を見て

 やっぱりPostscriptファイルなんや!

 と思った。
 3例だけで断定するだけの自信はないが、Linux上のアプリケーションは
印刷する際、印刷データとしてPostscriptファイルを生成しているものと
考えて間違いないと思う。


 ここで実験してみる事にした。
 Linux上で、Postscriptファイルをlprコマンドを使って
実際に印刷できるのか試してみる事にした。

Linux上でlprコマンドを使って印刷
[suga@linux]$ lpr -Ppm-870c test.ps
[suga@linux]$
非Postscriptプリンターであるエプソンの「PM-870C」だが
lprコマンドを使って。Postscriptファイルを印刷してみた。

 すると・・・

 見事に印刷できた (^^)

 Linux上でPostscriptファイルを印刷する機会はないと思うが
こんな事ができるとは思わなかったので、得した気分。


 さて、cupsを使った印刷の仕組み。
 だいたい見えてきた。

cupsを使った印刷の仕組み
cupsの仕組み
アプリケーションは印刷データとしてPostscriptデータを送る。
そして、プリンターは非Postscriptプリンターであっても
postscriptプリンターと見なして、該当のプリンターに合わせた情報を元に
印刷を行えるようにする。

しかし、postscriptデータのままでは非postscriptプリンターでは
印刷不可能なため、ghostscriptでラスター画像に変換する。
ラスター画像は点の集まりの画像。
そのデータをプリンターに送り印刷するという仕掛けだ。

 この図式が思い浮かぶ事ができた時・・・

 これで終わった。めでたし、めでたし (^^)V

 だった。

クライアント(Windows)からの印刷の仕組み

 Linuxでの印刷の仕組み。  PostscriptからGhostscriptでラスター画像化して プリンターに送る方法は、  だが、解せない部分があった。  クライアント(Windows)から印刷可能にするため mine.typesとmine.convsの2つの設定ファイルで 生データを扱えるようにした。
/etc/cups/mime.convsファイル
########################################################################
#
# Raw filter...
#
# Uncomment the following filter to allow printing of arbitrary files
# without the -oraw option.
#

application/octet-stream        application/vnd.cups-raw        0       -
/etc/cups/mime.typesファイル
########################################################################
#
# Raw print file support...
#
# Comment the following type to prevent raw file printing.
#

application/octet-stream
赤い部分は「生ファイルの印刷」と記述されている。

 ここで思った。

 なんで、この設定が必要やねん?

 色々なWebサイトを見た時、奇妙な記述も発見した。

CUPSの設定のサイトで書かれていた記述
CUPSのために用意されたプリンタードライバーを
利用する事は考えていません

 一体、どういう事やねん?

 数日間、考え込んでしまった。

 でも、思った。
 クライアントであるWindowsから送られる印刷データは・・・

 Postscriptファイルとは考えられへん!!

 そこで、実際にクライアント(Windows)から印刷を行って
スプールに、どんなデータが送られているのか
確かめて見る事にした。

クライアントで印刷を行った後
スプールに送られたデータを見てみた
[root@server]# cat -v d00954-001 | more
^@^@^@^[^A@EJL 1284.4
@EJL     
^[@^[@^[(R^H^@^@REMOTE1PM^B^@^@^@TI^H^@^@^GM-Y
^W^N^F^HIR^B^@^@^CSN4^@^@^C^K^@^@^@^@^@^@^@^@^A^Gd(^BjM-^M^@3M-d^@ P^@M-^Gh^PM-^J^C8^B.^C^@@^
@^G^A^@baaaa^T^B^U^W1M-7
^GEX^F^@^@^@^@^@^E^@FP^C^@^@^@^@^[^@^@^@^[(G^A^@^A^[(U^E^@^D^D^DM- ^E^[U^@^[(i^A^@^@^[^Y1^[(e
^B^@^@^R^[(C^D^@q^P^@^@^
[(c^H^@^C^@^@^@M-+^O^@^@^[(S^H^@M- ^K^@^@q^P^@^@^[(K^B^@^@^A^[(D^D^@@8x(^[(v^D^@M-6^@^@^@^[($
^D^@P^E^@^@^[i^@^A^B(^@/

(以下、省略)
印刷データが、バイナリーデータだというのがわかる。

 クライアント(Windows)からの印刷データはバイナリーのまま
プリンターに送られる事がわかった。

 即ち、Windows上で既に印刷データ(バイナリー)に加工された物を
CUPSに送り、それをCUPSはプリンターに転送しているのだ。

 これだと合点がいく! (^^)

 そのため以下の図式になる。

クライアント(Windows)から印刷する場合
クライアント(Windows)から印刷する場合のcupsの仕組み
Windowsから印刷データを送る際、Windows側で印刷データが作られる。
そのデータが生データと呼ばれるバイナリーデータなのだ。
CUPSで生データを受け取った際、何も手を加えずに、
そのままプリンターに転送する仕掛けになっている。

 クライアント(Windows)から送られる印刷データの処理がわかった。



 ところで次の疑問が出てきた。

 なんで初期状態では生データは使えへんねん

 うーん、考えてみると不思議だ。
 初期状態で、生データを使えるようにしていれば
わざわざクライアントのWindowsからの印刷を行う際に、
この2つのファイルを触る必要もなくなるのだ。

 調べてみると、次のような理由だという。

初期状態で生データを不可にしている理由
テキストデータの場合だと、どんなデータかの判別は容易だが
生データ(バイナリデータ)だと、判別が困難になる。
変なデータを送り込まれたら大変なので、安全性を考えて
初期状態では、生データを扱えないようにしている。

 プリンターの印刷データで、怪しいデータは聞いた事がないだけに
いまいち合点がいかないのだが、私が知らないだけかもしれないので
「そんな物なのかぁ」で留める事にした。


 さて、ここでCUPSが動いているLinuxサーバーの場合と
クライアントであるWindowsからの印刷の場合を整理してみる。

印刷方法の比較
Linux上からの印刷(CUPSサーバー上)
Linux上のアプリは印刷データとしてPostscript形式のデータを送る。
それを該当のプリンターのPPDファイルと照らし合わせて
Ghostviewでラスター画像に変換し、そのデータをプリンターに送る。
クライアント(Windows)からの印刷
Windows上で印刷データを生成(バイナリーデータ)
それをLinuxサーバー(CUPS)に送信し、CUPSは受け取ったデータを
そのままプリンターに送る。

 これで整理ができた。
 2通りの方式があるのだなぁと思った。

IPPプロトコルとは何か?

 CUPSでプリンターサーバーを構築した時、プリンターのアドレスが  http://(プリンターサーバー):631/  といった、URLの形式になっているのか。  調べてみると、次の事がわかった。
IPPプロトコル
HTTPプロトコルを土台にしてできた通信規約だ。
印刷の標準規定・印刷ジョブの管理・プリンターに関するオプションを扱い
Web上で操作できるようになっている。

CUPSはIPPプロトコルを使っているため、プリンターのアドレスが
URL形式になっているのだ。

IPPのポートは631なので、URL表現でもポート631の指定になっている。

 CUPSを使ったLinuxプリンターサーバー。
 以前から、こんな問題があった。

 Windows98パソコンでは使えへん (--;;

 Windows98の場合、ネットワークプリンターの設定の際、
URL形式でプリンターを指定する箇所がないのだ。

Windows98でのネットワークプリンターの設定
Windows98でのプリンターの設定
接続先のプリンターの設定
接続先のプリンターの設定
プリンターの参照を選ぶと
プリンターの参照
Windowsのネットワーク(NetBIOS over TCP/IP)で結ばれた
プリンターしか使えない状態だ。

NetBIOS over TCP/IPについては「システム奮闘記:その17」を
ご覧ください。

 不便だなぁと思っていた。

 IPPで調べていくうちに、WindowsでIPPに対応しているのは
Windows2000からだという。
 これを知った時、ようやく・・・

 Windows98は対応してへんのや!

 と思った。

WindowsとIPPの対応について
2000/XP/Vista IPPに対応しているので問題なし。
Windows9x IPPに未対応。
だが、Sambaってプリンター共有という形にすれば
Windows98からも共有プリンターとして使える。

 ここで思った。

 そもそも、なんでIPPがあんねん?

 調べてみると、UNIXの印刷の歴史までたどり着いた。

UNIXとプリンター
どれくらい前かはわからないが、昔、UNIXには印刷データを
プリンターに転送するだけの機能(スプーラー)しかなかった。
プリンターの差異を吸収する機能はついていなかった。

そのためアプリケーション側でプリンターの差異を吸収する機能が必要だった。
だが、それを行うとアプリケーションが大きくなってしまう。
この状態が長く続いたため、印刷関係であまり進歩がなかった。

一方、Windows、Macは各プリンタードライバーを使ってプリンターの差異を
吸収する手法をとって、プリンターが手軽に使えるようにした上
アプリケーション側の実装が大きくなるのを防いだ。

UNIXもプリンターの差異を吸収するために、印刷システムの標準化として
IPPプロトコルを設け、CUPSではPPDを使ってプリンターの差異を吸収し
円滑に印刷ができるようになった。

 わかったような書き方をしているのだが・・・

 色々なサイトの記述をまとめただけです (^^)

 見栄を張ってもバレるので、最初からネタばらしをしておけば
気軽で良いのだ。

 詳しく掘り下げていくと、大変な事になるのが予想できるので
この辺りでやめておきます。

 だって、大変だもーん (^^;;

まとめ  Linuxでプリンターサーバーという事で、CUPSを使った プリンターサーバー構築の話を書きました。  単に使うだけなので、細かい設定には突っ込みませんでした。  最初にOpenSuSE10.2でプリンターサーバーを構築した時は 単にLinux機とプリンターとUSBで結んで、Linux機に プリンターを認識させただけでしたが、CentOS5.3では いくつかの手順が必要でしたが、そのお陰で、概略を知る事ができました。

次章:「cups-pdfでPDF変換システム構築」を読む
前章:「OpenOfficeのBaseとAS400の連動でPDF見積書作成」を読む
目次:システム奮闘記に戻る