システム奮闘記:その82
Linuxとcupsでプリンターサーバー構築
(2009年11月8日に掲載)
プリンタサーバー導入の経緯
プリンターサーバー。
以前は、WindowsXPのパソコンにプリンターを接続し、
他のWindowsパソコンとネットワークで共有していた。
以前はWindowsXPにプリンターを接続していた |
|
この形態だと簡単に構築できる。
その反面、プリンターを接続しているパソコンは
電源を入れっ放しにする必要がある上、プリンターで
ジョブが詰まると、直接プリンタを接続しているパソコンで
ジョブの消去を行う必要があるから、その度に
そのパソコンを使っている人に「悪い、また詰まった」と言って
その人の仕事の手を止めてもらい、操作する必要があった。
|
結構、ジョブが詰まる事があったりする。
そこで、プリンターサーバーにしてしまえば、
パソコン利用者の手を止めなくても済む。
ある日
CUPSを使えば
Linuxでプリンターサーバー構築可能
を知った。
しかし、設定方法を見ても・・・
よくわからへん (TT)
だった。
でも、七転八倒する事はなかった。
適当に、OpenSuSE10.2をインストールして
プリンターのUSB接続すると、自動的に認識してくれた。
あとは
http://(プリンターサーバーのアドレス):631/
で、プリンターサーバーの制御画面が表示できた。
適当に触っただけで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の仕組みの概略 |
|
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) |
|
印刷だけでなく、スキャナーなどの色々な機能がついた
複合機なのだ。
|
早速、プリンターに電源を入れ、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のプリンターの該当ドライバーが
インストールされた様子 |
|
該当のプリンターを選択して「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を使って接続するのだ。
早速、接続してみる事にした。
いきなり接続拒否の表示 |
|
接続拒否されている画面だ。
|
これが出た時・・・
なんでやねん!! (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の印刷設定 |
|
CentOS5.xのGNOMEの画面だ。GUIを使った設定で
「システム」→「管理」→「印刷」を選択すれば良い
|
すると印刷設定画面が出てくるので、以下のような設定を行う。
GUIで印刷設定の変更 |
|
「リモートによる管理を許可する」に印をつければ良い。
|
Webで操作するため、他のマシンからの接続を許可する方法で
直接、設定ファイルを触る方法と、GUI上で簡単設定の方法を紹介しました。
さて、Webで操作画面を出します。
CUPSのWeb操作画面 |
|
赤く囲んだ「プリンタ」を選択すれば
登録されているプリンタが表示される。
|
「プリンタ」を選択すると、以下の画面になる。
登録されたプリンターの表示 |
|
エプソンのPM-870Cの登録情報がある。
|
Web画面を使っていけば、マウス操作で設定や変更ができるので
非常に手軽だし、遠隔からの操作も可能だ。
プリンタージョブの削除
無事、エプソンのPM-870Cを使ったプリンターサーバーが稼働した。
これで安心だと思った。
だが、運用開始からすぐに周囲から
印刷の取消ができへん!
の声が出てきた。
Windows上から印刷ジョブが消去できない様子 |
|
ジョブの取消をしたくても、エラーが出てしまう。
|
実は、これが初めてではなかった。
以前、適当に構築したプリンターサーバーの時も同じだった。
Webのcupsの操作画面でないと、ジョブが取消できないと
思い込んでいた私だった。
なので
ジョブを取り消して
と言われる度に、cupsの画面を開いてジョブを消していた。
WebのCUPS管理画面から印刷ジョブを消す |
|
拡大した部分でジョブの消去を行っていた。
|
ジョブ消去をする側は私に言わないといけないので手間。
そして、依頼される私も手間。
なんとか解消せんとアカン!
と思った。
色々、Webの管理画面を触っていると、全てのプリンター利用者でも
印刷ジョブの消去を可能にするための設定がわかった。
CUPSのWeb管理画面 |
|
赤く囲んだ部分の所に印をつける。
これだけで全ての利用者が印刷ジョブの取消ができる。
|
そして、実際に印刷ジョブを取り消す事ができるのか
試してみる事にした。
まずは印刷を行う。プリンターの電源はわざと落としておいて
印刷待ちの状態にしておく。
印刷待ちの状態 |
|
そして印刷ジョブの取消を行ってみる。
印刷ジョブの取消を行ってみる |
|
すると以下の画面が出てきた。
印刷ジョブの取消の確認画面 |
|
「はい」を押せば、印刷ジョブが取り消す事ができる。
|
結果は・・・
印刷ジョブの取消成功 (^^)
このお陰で、わざわざWeb管理画面を開いて
印刷ジョブの削除を行うという手間が省けた。
CUPSの仕組みを調べていく
これでCUPSの設定が終わったと思いたい所だが
この程度の内容だと、単に設定丸写しなので
わかった事にならないのらー (^^;;
という事でCUPSの印刷の仕組みを調べていく事にした。
Linuxサーバー上での印刷の仕組み
まずは日経ITProのサイトに載っていた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ファイルを開く |
|
解像度を100にしてみる事にした。
100にした理由は、特にありませんが (^^;;
どうやら全体の大きさは(826,1170)というピクセル値だ。
|
これが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プリンタの場合 |
|
テキストのみのデータのため、データ送信が早い。
そしてプリンターに描写するための頭脳を搭載する事で
プリンターで画像化し、印刷させる仕組みにした。
プリンターの性能は上がった。でも、価格が高いのだ。
|
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で印刷 |
|
早速、印刷してみる。
そして、スプールを見てみる。
スプールの中身を見てみる。 |
[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で印刷 |
|
そしてスプールを見てみる。
スプールの中身を見てみる。 |
[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を使った印刷の仕組み |
|
アプリケーションは印刷データとして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から印刷データを送る際、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でのネットワークプリンターの設定 |
|
接続先のプリンターの設定 |
|
プリンターの参照を選ぶと |
|
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見積書作成」を読む
目次:システム奮闘記に戻る