CUPS/プリンター共有
この記事では GNU/Linux システム間、あるいは GNU/Linux システムと Microsoft Windows の間でプリンターを共有する方法を説明しています。
複数プリンターでクラスを作成
CUPS におけるクラスはプリンターの集合を意味します。単一の CUPS サーバーに繋がる複数のプリンターがあって、それらをバランスよく使いたいことがありえます (自動的にプリントジョブが異なるプリンターに割り当てられます)。またリモートユーザーが単一のプリンターであるかのごとく操作できるのも利点です。これは、クラス内のあるプリンターを修理しなければならないときに特に便利です。管理者はクラスからそのプリンターを外すだけでよく、エンドユーザーにとっては何もかわらず、プリントジョブは CUPSサーバーによって別のプリンターに割り当てられます。CUPS のウェブインターフェイスからクラスを追加したり管理できます。
GNU/Linux システム間
サーバーはウェブインターフェイスを使用するか /etc/cups/cupsd.conf
を手動で編集することで設定できます。クライアントの設定については、CUPS#ローカルの CUPS サーバーを使わないを見てください。
ウェブインターフェイスを使う
サーバーのウェブインターフェイスを開いて、Administration タブを選択肢、Server の下にある "Share printers connected to this system" オプションを有効にしてください。Change Settings ボタンを押すことで変更が保存され、サーバーは自動的に再起動します。
複雑な設定を行いたい場合、Edit Configuration File を選択することで直接 /etc/cups/cupsd.conf
ファイルを編集できます。詳しくは#手動セットアップを見てください。
手動セットアップ
サーバー側のコンピュータ (プリンターに直接接続するコンピュータ) で、location ディレクティブを編集してサーバーへのアクセスを許可してください。例:
/etc/cups/cupsd.conf
<Location /> Order allow,deny Allow localhost Allow 192.168.0.* </Location> ...
また、クライアントが使用する IP アドレスでサーバーが待機するようにしてください:
/etc/cups/cupsd.conf
... Listen <hostname>:631 ...
自動的に設定する方法など、詳しい解説は Using Network Printers や cupsd.conf(5) を見てください。
編集したら、CUPS を再起動してください。
ソケットアクティベーションを使って CUPS を起動している場合、org.cups.cupsd.socket
のドロップインファイルを作成してリモート接続でもソケットアクティベーションができるようにしてください:
/etc/systemd/system/org.cups.cupsd.socket.d/override.conf
[Socket] ListenStream=631
ブラウジングの有効化
ブラウジング (共有プリンターの探知) を有効にするには、サーバーに Avahi をインストールして起動する必要があります。プリンターの探知が必要ない場合、サーバーとクライアントには Avahi が必要ありません。
ブラウジングを有効にするには、ウェブインターフェイスで Share printers connected to this system を選択するか、手動で Browsing をオンにして BrowseAddress を設定してください:
/etc/cups/cupsd.conf
... Browsing On BrowseAddress 192.168.0.*:631 ...
org.cups.cupsd
サービスを再起動してください。
印刷サーバーの「ブラウジング」はリモートのネットワークホストのブラウジングとは異なります。印刷サーバでは、cupsd
が avahi-daemon
で通信するための DNS-SD プロトコルのサポートを提供します。古い CUPS プロトコルを使用しなければならない場合や、他のネットワークプリンターも印刷サーバーで「ブラウジング」するのでないかぎり、印刷サーバーに cups-browsed
サービスは不要です。リモートのネットワークホストには、印刷サーバーのネットワーク通信を「ブラウズ」するための cups-browsed
サービスが必須であり、cups-browsed
を実行すると自動的に cupsd
が起動します。
USB プリンターは接続すると org.cups.cupsd.service
サービスが自動的に起動しますが、他の接続タイプでは自動的に起動するとは限りません。cupsd
が起動していないと avahi-daemon
は印刷サービスを提供することができず、その場合、systemd のサービスユニットファイルを起動時に実行するように修正する必要があります。さらに、依存関係が新しくなったらサービスを再度有効化・インストールしなければなりません。サービスファイルの [Install]
セクションを編集して WantedBy=default.target
を追加し、org.cups.cupsd.service
サービスを起動・有効化してください。
GNU/Linux と Windows
Linux サーバー - Windows クライアント
Windows クライアントを共有するには、#Bonjour で共有、#IPP で共有 あるいは #Samba で共有 する方法があります。
設定後、Windows コンピュータにプリンターのネイティブなプリンタードライバーをインストールしてください。CUPS のプリンタードライバーを使用するように CUPS サーバーを設定している場合、Windows クライアントでは汎用の postscript プリンターを選択します (例 'HP Color LaserJet 8500 PS' や 'Xerox DocuTech 135 PS2')。テストページを印刷してみて印刷設定をテストしてください。
Bonjour で共有
Bonjour Printing Services を利用すると簡単に Windows クライアントを Unix プリントサーバーに ブラウジングを有効にして 接続できます。
IPP で共有
Internet Printing Protocol はOS間で広くサポートされており、設定が簡単です。ポートフォワーディングやトンネリングなどの機能があります。IPP は Windows 2000 以降の Windows でネイティブでサポートされています。
まず、#GNU/Linux システム間に書かれているようにサーバーを設定してください。
Windows コンピュータ側で、コントロールパネル->デバイスとプリンターから「プリンターの追加」を選択します。Windows 10 の場合は「プリンターが一覧にない場合」をクリックしてください。次に、「共有プリンターの名前で選択する」を選んでプリンターの場所を入力してください:
http://hostname:631/printers/printer_name
hostname は GNU/Linux サーバーのホスト名や IP アドレスに、printer_name は接続されているプリンターの名前に置き換えてください。サーバーの完全修飾ドメイン名を使うこともできますが、/etc/cups/cupsd.conf
で ServerAlias my_fully_qualified_domain_name
を設定する必要があります。
Samba で共有
Samba は Windows におけるファイル共有やプリンター共有プロトコルの実装で、歴史のある実装です。
ただし Samba を使用したプリンター共有は、設定やメンテナンスが難しくなりがちです。
Linux サーバーの Samba を設定するために、/etc/samba/smb.conf
ファイルを編集してプリンターへのアクセスを許可してください。smb.conf
ファイルは以下のようになります:
/etc/samba/smb.conf
[global] workgroup=Heroes server string=Arch Linux Print Server security=user [printers] comment=All Printers path=/var/spool/samba browseable=yes # to allow user 'guest account' to print. guest ok=no writable=no printable=yes create mode=0700 write list=@adm root yourusername
プリンターを共有するには上記だけで十分ですが、個別のプリンターのエントリを追加するほうが好ましいでしょう:
/etc/samba/smb.conf
[ML1250] comment=Samsung ML-1250 Laser Printer printer=ml1250 path=/var/spool/samba printing=cups printable=yes printer admin=@admin root yourusername user client driver=yes # to allow user 'guest account' to print. guest ok=no writable=no write list=@adm root yourusername valid users=@adm root yourusername
上記の設定を使うにはユーザーがプリンターにアクセスするためのアカウントがないといけません。公開プリンターの場合は guest ok を yes に変更して、valid users 行を削除してください。アカウントを追加するには、通常の GNU/Linux アカウントをセットアップしてから、サーバーの Samba パスワードを設定してください。例:
# useradd yourusername # smbpasswd -a yourusername
設定後、Samba デーモンを再起動してください。
Samba の印刷サーバーの設定では様々なカスタマイズが可能です。詳しくは Samba や CUPS のドキュメントを参照してください。smb.conf.example
ファイルにも参考になる例があります。
Windows サーバー - Linux クライアント
LPD で共有
Windows 7, 8, 10 には LPD サーバーが組み込まれています。それを使うことでクライアントに Samba をインストールしたりサーバーで様々な設定を行うことなく簡単に共有が可能です。Control Panel を開いて Programs -> Activate Windows functions の Print services から有効にできます。プロパティによってプリンターの shared を有効にする必要があります。共有名には空白なカンマなどの特殊文字を使用してはいけません。
それから CUPS からプリンターを追加できます。LPD プロトコルを選択してください。プリンターアドレスは以下のようになります:
# lpd://windowspc/printersharename
プリンターを追加する前に、使用しているプリンターにあわせて適切なプリンタードライバーをインストールする必要があります。Generic PostScript や RAW ドライバーで動作するかもしれません。
IPP で共有
上記と同じく、プリンターを共有する際は IPP が推奨プロトコルです。ただし、下に書かれている Samba による方法よりも少しばかり難しくなります。Windows に IPP サーバーをセットアップするには労力が必要です。サーバーソフトウェアとしては一般的に Microsoft の Internet Information Services (IIS) が使われます。Windows 10 などクライアント版の Windows には IPP クライアントしか含まれていないため、IPP で共有することはできません。
Samba で共有
Samba 経由で Windows のネイティブのプリンター共有を使う方法はもっと簡単です。ほとんど設定が不要で、CUPS バックエンドから全て設定できます。上記の通り、何か問題が発生する場合、大抵は認証関連の問題や Windows のアクセス制限が原因です。
サーバー側で使用したいプリンターの共有を有効にして、クライアント側のユーザーにプリンターにアクセスする権限を付与してください。
以下のセクションでは (cupsd と smbd デーモンが動作している) クライアントを設定する方法を説明します。
ウェブインターフェイスを使って設定
Samba の CUPS バックエンドはデフォルトで有効になっていますが、何らかの理由で有効でない場合は以下のコマンドを実行してから CUPS を再起動してください:
# ln -s $(which smbspool) /usr/lib/cups/backend/smb
次に、CUPS ウェブインターフェイスにログインして新しいプリンターの追加を選択してください。デバイスは "Windows Printer via SAMBA" を選択します。
デバイスの場所は以下のように入力:
smb://username:password@hostname/printer_name
またはパスワードを使わない場合:
smb://username@hostname/printer_name
ユーザーが Windows コンピュータのプリンターにアクセスする権限を持っていることを確認して適切なドライバーを選択してください。コンピュータがドメイン上にある場合、URI にドメインを含めてください:
smb://username:password@domain/hostname/printer_name
手動設定
手動で設定する場合、CUPS デーモンを停止して以下のように /etc/cups/printers.conf
にプリンターを追加してください:
/etc/cups/printers.conf
<DefaultPrinter MyPrinter> AuthInfoRequired username,password Info My printer via SAMBA Location In my Office MakeModel Samsung ML-1250 - CUPS+Gutenprint v5.2.7 # <= use 'lpinfo -m' to list available models DeviceURI smb://username:password@hostname/printer_name # <= server URI as described in previous section State Idle Type 4 Accepting Yes Shared No JobSheets none none QuotaPeriod 0 PageLimit 0 KLimit 0 AllowUser yourusername # <= do not forget to change this OpPolicy default ErrorPolicy stop-printer </Printer>
設定したら CUPS デーモンを再起動してテスト印刷を行ってみてください。
Windows 印刷サーバーの URI を確認
Windows では正確なデバイス URI (デバイスの場所) が明確ではありません。CUPS でデバイスの場所を指定するときに問題が発生する場合、以下のコマンドを実行して特定の windows ユーザーから利用できる共有を確認できます:
$ smbtree -U windowsusername
Samba が正しく設定されていれば、上記のコマンドでローカルエリアネットワークサブネットで指定した Windows ユーザーから使える全ての共有が表示されます。以下のように出力されます:
WORKGROUP \\REGULATOR-PC \\REGULATOR-PC\Z \\REGULATOR-PC\Public \\REGULATOR-PC\print$ Printer Drivers \\REGULATOR-PC\G \\REGULATOR-PC\EPSON Stylus CX8400 Series EPSON Stylus CX8400 Series
上記の場合、最後の行がプリンターとわかります。上記の EPSON Stylus プリンターに印刷する場合、CUPS で使用する URI は以下のようになります:
smb://username.password@REGULATOR-PC/EPSON%20Stylus%20CX8400%20Series
リモート管理
#GNU/Linux システム間に書かれているようにサーバーをセットアップしたら、設定によってリモートで管理することができます。管理を許可するホストを /etc/cups/cupsd.conf
の <Location /admin>
ブロックに追加してください。使用する構文は#手動セットアップで説明されているものと同じです。3つのレベルで権限を与えることができます:
<Location /> #access to the server <Location /admin> #access to the admin pages <Location /admin/conf> #access to configuration files
リモートホストに与えたいレベルにあわせて、セクションに Allow
ステートメントを追加してください。Allow
ステートメントは以下の形式で使用することができます:
Allow from all Allow from host.domain.com Allow from *.domain.com Allow from ip-address Allow from ip-address/netmask Allow from @LOCAL
Deny ステートメントを使うこともできます。例えば、ローカルネットワークインターフェイスの全てのホストに完全な権限を与えてたい場合、/etc/cups/cupsd.conf
を以下のように編集:
# Restrict access to the server... # By default only localhost connections are possible <Location /> Order allow,deny Allow from @LOCAL </Location> # Restrict access to the admin pages... <Location /admin> Order allow,deny Allow from @LOCAL </Location> # Restrict access to configuration files... <Location /admin/conf> AuthType Basic Require user @SYSTEM Order allow,deny Allow from @LOCAL </Location>
以下の設定を追加することでリモートマシンから CUPS ウェブインターフェイスを使用した場合に起こる 426 - Upgrade Required
エラーを止めることができます:
DefaultEncryption Never
Kerberos
Kerberos を使ってリモートの CUPS サーバーにアクセスするユーザーを認証することができます。マシンにキータブが存在することが前提で、"HTTP" のチケットが必要です。http://localhost:631
の代わりに https://host.example.co.uk:631
を使ってください。認証するために暗号化 (https) が必要な上に Kerberos/Negotiate を機能させるために完全なホストネームが必要です。さらにサーバーの /etc/cups/cupsd.conf
を設定して DefaultAuthType
を Negotiate
にする必要があります。
Samba の winbind NSS サポートを使用する場合、AD グループ名を /etc/cups/cups-files.conf
に追加することができます。以下の例では sysadmin
が AD グループです:
SystemGroup sys root sysadmin
トラブルシューティング
一般的なトラブルシューティングについては CUPS/トラブルシューティングを見てください。
GTK アプリケーションで印刷できない
GTK アプリケーションから印刷しようとすると "getting printer information failed" と表示される場合、/etc/hosts
に次の行を追加してください:
# serverip some.name.org ServersHostname
Samba でプリンターを追加・編集できない
Samba を使ってプリンターを追加・編集しようとすると、インターフェイスによる CPU の使用率が 100% の状態が30秒も続いた後に以下のメッセージが表示される場合:
Unable to get list of printer drivers: Success
Gutenprint (https://bugs.archlinux.org/task/43708) の既知のバグが原因です。Gutenprint をアンインストールして foomatic-db だけをインストールしてください。次のコマンドで "Success" メッセージの代わりにドライバーのリストが返ってくるはずです:
# lpinfo -m
Windows でパーミッションエラー
ユーザーによっては別の構文を使うことで 'NT_STATUS_ACCESS_DENIED' エラーが解決する場合があります (Windows クライアント):
smb://workgroup/username:password@hostname/printer_name
他のオペレーティングシステム
他の印刷システムと CUPS を繋げる方法の詳細は CUPS マニュアルにあります。例: http://localhost:631/help/network.html