CUPS (简体中文)

From ArchWiki
Revision as of 07:03, 4 January 2012 by Wuxb (talk | contribs) (Download Printer PPD)
Jump to: navigation, search

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.

Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어

External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

Tango-preferences-desktop-locale.pngThis article or section needs to be translated.Tango-preferences-desktop-locale.png

Notes: please use the first argument of the template to provide more detailed indications. (Discuss in Talk:CUPS (简体中文)#)

来自 CUPS' site:

"CUPS 是苹果公司为Mac OS® X 和其他类 UNIX 的操作系统开发的基于标准的、开源的打印系统".


什么是 CUPS?

CUPS网站的介绍: "The Common UNIX Printing System ("CUPS")CUPS 是个跨UNIX平台的打印解决方案. 它基于“网络打印协议”并且为大多数Postscript和光栅打印机提供完整的打印服务。CUPS基于GUN GPL协议提供。”虽然有其他的打印程序包例如LPRNG,但CUPS是相当流行和相对容易使用的。它是Arch linux及许多其他Linux发行版缺省的打印系统。 It is based on the "Internet Printing Protocol" and provides complete printing services to most Postscript and raster printers. CUPS is provided under the GNU GPL..." Although there are other printing packages such as LPRNG, CUPS is quite popular and relatively easy to use. It is the default printing system on Arch Linux as well as many other Linux distributions.

Troubleshooting CUPS & components CUPS及组件的疑难解答

在‘/etc/cups/cupsd.conf’文件中设置‘LogLevel’是让打印机工作最好的方法:The best way to get printing working is to set 'LogLevel' in '/etc/cups/cupsd.conf' to:

LogLevel debug2

然后像这样查看'/var/log/cups/error_log'文件的输出:And then viewing the output from '/var/log/cups/error_log' like this:

tail -n 100 -f /var/log/cups/error_log

在输出中左边的字符排列如下:The characters at the left of the output stands for:

D = Debug
E = Error
I = Information

这些文件也可能被证明是有用的。These files may also prove useful.

/var/log/cups/page_log '每次打印成功后增加的词条spits out a new entry each time a print is successful.'
/var/log/cups/access_log '所有活跃的cupsd http1.1服务器列表lists all cupsd http1.1 server activity'

当然,如果想解决你的问题,重要的是知道CUPS怎样工作,这多多少少是正确的:Of course it's important to know how CUPS work if you want to solve your problems, this is somewhat correct:

  1. 当你选择‘打印’时,应用程序会发送一个.ps文件(PostScript,是主要用于电子产业和桌面出版领域的一种页面描述语言。)给CUPS(99%的程序会这样做)。An application sends a .ps file(PostScript, a script language that details how the page will look) to CUPS when you select 'print'(99% of apps do).
  2. CUPS然后读取你打印机的PPD文件(打印机描述文件)并且计算出它需要哪种解释器去将.ps文件转换成一种打印机认识的语言(像PJL,PCL)。通常它需要ghostscript。CUPS then looks at your printers PPD file(printer description file) and figures out what filters it needs to use to convert the .ps file to a language that the printer understands(like PJL,PCL). Usually it needs ghostscript.
  3. GhostScript取得输入并且计算出它需要哪个过滤器,然后将它们转变成打印机能读懂的.ps格式。GhostScript takes the input and figures out which filters it should use,then applies them and converts the .ps file to a format understood by the printer.
  4. 然后它被发送到后端。举个例子,如果你有打印机连接到USB端口,它就用USB后端。 Then it is sent to the backend. For example, if you have your printer connected to a USB port, it uses the USB backend.

打印一个文档并且查看'error_log'文件来得到关于打印队列更多的细节和正确地印象。Print a document and watch 'error_log' to get a more detailed and correct image of the printing process.



# pacman -S cups ghostscript gsfonts

如果正常的cups不起作用,你可以试试从 AUR 安装 cups-usblpAUR 。(建议三星的USB打印机试用)

  • cups - 就是传说中的CUPS软件
  • ghostscript - Postscript语言的解释器
  • gsfonts - Ghostscript标准Type1字体
  • hpoj - 如果你使用 HP Officejet, 你应该再安装这个包,遵循指导避免发生错误. 更多信息见 thread at launchpad/hplip.

如果你的系统要通过 Samba 使用网络打印机,或者这台机器要作为打印服务器向其它windows客户端提供服务,你还需要安装Samba:

# pacman -S samba



  • gutenprint - 一组质量非常好的驱动集合,支持的目标机型包括 Canon, Epson, Lexmark, Sony, Olympus;以及配合CUPS/GhostSscript/Foomatic/GIMP使用的 PCL printers。
  • foomatic-db, foomatic-db-engine, foomatic-db-nonfree, and foomatic-filters - Foomatic 是一个基于数据库的,集成自由软件打印机驱动和脱机打印程序的系统。安装 foomatic-filters 可以解决 cups error_log 报告错误 "stopped with status 22!".
  • hplip - HP GNU/Linux 驱动. 支持 DeskJet, OfficeJet, Photosmart, Business Inkjet 和一些 LaserJet printer 型的, 以及一些兄弟打印机。
  • splix - 三星驱动,支持SPL打印机(SPL:Samsung Printer Language) (USB打印机要配合使用 AURcups-usblpAUR )
  • ufr2 - 佳能 UFR2 驱动,支持LBP, iR 和 MF 系列打印机. 在 AUR 能找到这个包。
  • cups-pdf - PDF虚拟打印机,这个东西可以把发送给他的打印任务输出为PDF文件。


取决于你的打印机,这个步骤是可选的,很可能不需要,因为标准的CUPS安装已经携带了很多PPD(Postscript Printer Description)。 另外,foomatic-filters, gimp-print and hplip 已经自带了很多 PPD 文件,CUPS会自动检测他们.

这是一句来自 "Linux 打印网站" 的内容解释什么是 PPD 文件:

"For every PostScript printer the manufacturers provide a PPD file which contains all printer-specific information about the particular printer model: Basic printer capabilities as whether the printer is a color printer, fonts, PostScript level, etc., and especially the user-adjustable options, as paper size, resolution, etc."

如果打印机需要的PPD文件 在CUPS中, 那么:

  • AUR 寻找为打印机/制造商提供的包。
  • 去这个网站 OpenPrinting database 选择你需要的制造商和型号。
  • 浏览制造商的网站寻找GNU/Linux驱动程序。
提示: PPD文件放在这个路径 /usr/share/cups/model/

配置 Cups


Now that you have cups installed, you have a variety of options on how to setup CUPS. You can always use the tried and true command line. Likewise, various desktop environments such as Gnome and KDE have useful programs that can help you manage your printers. However, in order to make this process easy for the largest amount of users, we will use the web interface provided by CUPS.

Please note that if you are planning on connecting to a network printer, rather than one that is directly connected to your computer, you may wish to jump to the Printer Sharing section first. Linux to Linux printer sharing is quite easy and involves very little configuration. Windows to Linux and vice-versa requires a little bit more effort, but is relatively easy as well.

Kernel Modules

Before we can use the CUPS web interface, we must install the appropriate kernel modules. The following are steps that I got from the Gentoo Printing Guide.

USB printers

If you want to use a USB printer with a 2.6.x kernel, use the following command:

# modprobe usblp

If you are using a USB printer and a 2.4.x kernel, use the following command:

# modprobe printer

Note, this assumes that you are using the stock kernels from Arch Linux. If you custom-rolled your own, you may need to run this first:

# modprobe usbcore

Once you have the modules installed, you should plug in your printer and check if the kernel detected it by running the following:

# tail /var/log/messages.log


# dmesg

You should see something like this:

 Feb 19 20:17:11 kernel: printer.c: usblp0: USB Bidirectional
 printer dev 2 if 0 alt 0 proto 2 vid 0x04E8 pid 0x300E
 Feb 19 20:17:11 kernel: usb.c: usblp driver claimed interface cfef3920
 Feb 19 20:17:11 kernel: printer.c: v0.13: USB Printer Device Class driver

Parallel port printers

If you plan on using a parallel port printer, the configuration is pretty much the same. Kernel 2.6.x users have to first type in:

# modprobe lp

And then both 2.4.x and 2.6.x kernel users can enter in:

# modprobe parport
# modprobe parport_pc

Once again, you can check your setup by running:

# tail /var/log/messages.log

You should see something like this:

# lp0: using parport0 (polling).

Note: Installing my Brother HL 1250 i found that permissions for the device don't let cups to write on the device, so practically it doesn't print. To fix it:

[root@mihal usb]# cd /dev/usb/
[root@mihal usb]# ls
[root@mihal usb]# chgrp lp lp0


You may also want to have the system automatically load the kernel module every time the computer starts up. To do this use your favorite text editor to open up /etc/rc.conf and add the appropriate module to the MODULES=() line. Here's a portion of the text from my rc.conf file:

MODULES=(!usbserial scsi_mod sd_mod snd-ymfpci snd-pcm-oss lp parport parport_pc ide-scsi)

CUPS Daemon

With the kernel modules installed, you are now ready to start the actual CUPS daemon. To do this, simply run this command:

# /etc/rc.d/cupsd start

If you want to have cups start up automatically every time you start your computer, than you need to add it to your DAEMONS=() line in the /etc/rc.conf file. For example:

# DAEMONS=(pcmcia syslogd klogd !fam esd mono network autofs cupsd crond gdm)

Web Interface and tool kit.

Once the daemon is running, if a web interface is available. Open up your browser and go to:


(可能需要把 localhost'替换为你的主机名——可以在文件 /etc/hosts'里面看到')

or install "Gnome Cups Manager" GUI frontend (see Appendix: A.1 Alternative CUPS Interfaces)

From here, all you have to do is follow the various wizards to add your printer. To setup my Samsung ML-1250 printer, I started out by click on Manage Printers, and then Add Printer. I was then prompted for a username and password. I just logged in as root. I entered in ml1250 for my printer name, My Room for location and then Peter's Samsung ML-1250 Laster Printer for description. Next you will select the device. Since my printer is a USB device, I just selected USB Printer #1. The name of my printer also showed up next to the label USB Printer #1, so look for that. Next, I simply chose the appropriate drivers and the installation was complete.



Linux共享给 Linux

Once you have CUPS setup on your Linux print server, sharing the printer with another Linux box is relatively easy. There are several ways to configure such a scenario, here we will describe the manual setup. On the server computer (the one managing and connecting to the printer) simply open up the /etc/cups/cupsd.conf file and allow access to the server by modifying the location lines. For instance:

<Location />
  Order Deny,Allow
  Deny From All
  Allow From
  Allow From 10.0.0.*

You will also need to make sure the server is listening on the IP address your client will be addressing. Add the following line after "Listen localhost:631":



Add the IP address of the client computer by doing Allow From client_ip_address. After you make your modifications, you will want to restart CUPS by doing:

# /etc/rc.d/cupsd restart

On the client side, open up /etc/cups/client.conf and edit the ServerName option to match the ip address or the name of your server. For instance I named my server beast and have entry in my hosts file to point to it. So in my client.conf file, I just edited this line Factory: I did not have to do this step with cups 1.3.7. Going to localhost:631 on the client and then manage printers works fine without ever creating this file.:

ServerName beast

Next, run the following command to update the client computerFactory: Same as the previous step... I did not have to do this.:

# lpq

You should see something like this:

ml1250 is ready
no entries

There are more configuration possibilities including an automatic configuration which are described in detail on http://localhost:631/sam.html#CLIENT_SETUP (this link works on your printer server). Factory: This link brings the user to a "404 Not Found" page.

when prompted for username and password use root to access then follow the instructions from here if its a TCP/IP printer use Jetdirect

That's it for Linux to Linux printer sharing.

Linux 共享给 Windows

If you are connected to a Windows print server (or any other Samba capable print server), you can skip the section about kernel modules and such. All you have to do is start the CUPS daemon and complete the web interface as specified in section 3.3 and 3.4. Before this, you need to activate the Samba CUPS backend. You can do this by entering the following command:

# ln -s `which smbspool` /usr/lib/cups/backend/smb

Note that the symbol before is ` (underneath the ~ on a standard US keyboard) and not '. After this, you will have to restart CUPS using the command specified in the previous section. Next, simply login into the CUPS web interface and choose to add a new printer. For device, there should be an option that says something to the effect Windows Printer Via Samba near the button of the device list. For the device location enter:


Or without a password:


Make sure that the user actually has access to the printer on Windows computer. Select the appropriate drivers and that's about it. If the computer is located on a domain, make sure the username includes the domain:


Note: if your network contains many printers use "lpoptions -d your_desired_default_printer_name" to set your preferred printer

Note: I, thepizzaking, was having 'NT_STATUS_ACCESS_DENIED' errors and to fix them I needed to use a slightly different syntax:


Windows 共享给 Linux

有时,我们需要允许一台装windows系统的电脑连接到一台linux电脑上.方法有很多种,最常用的就是使用Samba.编辑samba配置文件 /etc/samba/smb.conf ,使其允许控制打印机。修改后的smb.conf 看起来如下:

workgroup = Heroes
server string = Arch Linux Print Server
security = user

    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 neocephas


    comment = Samsung ML-1250 Laser Printer
    path = /var/spool/samba
    printing = cups
    printable = yes
    printer admin = @admin root neocephas
    user client driver = yes
    # to allow user 'guest account' to print.
    guest ok = no
    writable = no
    write list = @adm root neocephas
    valid users = @adm root neocephas

Please note that in my configuration I made it so that users must have a valid account to access the printer. To have a public printer, set guest ok to yes, and remove the valid users line. To add accounts, you must setup a regular Linux account and then setup a Samba password on the server. For instance:

# useradd neocephas
# smbpasswd -a neocephas

After setting up any user accounts that you need, you will also need to set up the samba spool folder:

# mkdir /var/spool/samba
# chmod 777 /var/spool/samba

The next items that need changing are /etc/cups/mime.convs and /etc/cups/mime.types:


# The following line is found at near the end of the file. Uncomment it.
application/octet-stream        application/vnd.cups-raw        0       -


# Again near the end of the file.

The changes to mime.convs and mime.types are needed to make CUPS print Microsoft Office document files. Many people seem to need that.

After this restart your Samba daemon:

# /etc/rc.d/samba restart

Obvious, there are a lot of tweaks and customization that can be done with setting up a Samba print server, so I advise you to look at the Samba and CUPS documentation for more help. The smb.conf.example file also has some good samples to that you might want to look at.

Windows 2000 and Windows XP to Linux

For the most modern flavors of Windows an alternative way of connecting to your Linux printer server is to use the CUPS protocol directly. The Windows client will need to be using Windows 2000 or Windows XP. Make sure you allows the clients to access the print server by editing the location settings as specified in section 4.1.

On the Windows computer, go to the printer control panel and choose to Add a New Printer. Next, choose to give an url. For the url type in the location of your printer:


where host_ip_address is the Linux server's IP address and printer_name is the name of the printer you are connecting to. After this, install the printer drivers for the Windows computer. If you setup the CUPS server to use its own printer drivers, then you can just select a generic postscript printer for the Windows client. You can then test your print setup by printing a test page.

Others to Linux, Linux to others

More information on interfacing CUPS with other printing systems can be found in the CUPS manual, e.g. on http://localhost:631/sam.html#PRINTING_OTHER


Alternative CUPS Interfaces

A Pygtk CUPS configuration program from Red Hat is also available in the "community" repository:

pacman -S system-config-printer

You can also try hal-cups-utils, also from community:

pacman -S hal-cups-utils

KDE users can modify their printers from the Control Center. Refer the KDE documentation for more information on how to use the interface.

There is also gtklp for handling print jobs. It is in the "extra" repository.

pacman -S gtklp

PDF Virtual Printer

A nice little package that I submitted to the incoming folder ( is CUPS-PDF. This package allows one to setup a virtual printer that will generate a PDF from anything sent to it. For example, I wrote this document in AbiWord and then printed it to the Virtual Printer which generated a pdf in my /var/spool/cups-pdf/neocephas folder. Obviously, this package is not necessary, but it can be quite useful. After downloading the package from the ftp server and installing it, you can set it up as you would for any other printer in the web interface. Select Virtual PDF Printer as the device and choose Postscript -> Postscript Color Printer for the drivers.

Online Resources

Here is a listing of websites that may be of use to you:

Specialized Cases

This section is dedicated to specific problems and their solutions. If you managed to get some unusual printer working, please put the solution here.

Printing does not work/aborts with the HP Deskjet 700 Series Printers.

  • The solution is to install pnm2ppa printer filter for the HP Deskjet 700 series. Without this the print jobs will be aborted by the system. A PKGBUILD for pnm2ppa can be found in AUR.

Getting HP LaserJet 1010 to work

I had to compile ghostscript myself because ESP gs in rep was 7.07 and had not fixed some bugs like ESP 8.15.1 had. I never downloaded 'foomatic' in rep. I think that is an old package.

$ pacman -Qs cups a2ps psutils foo ghost
local/cups 1.1.23-3
    The CUPS Printing System
local/a2ps 4.13b-3
    a2ps is an Any to PostScript filter
local/psutils p17-3
    A set of postscript utilities.
local/foomatic-db 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-db-engine 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-db-ppd 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/foomatic-filters 3.0.2-1
    Foomatic is a system for using free software printer drivers with common
    spoolers on Unix
local/espgs 8.15.1-1
    ESP Ghostscript

I also had to set LogLevel in /etc/cups/cupsd.conf to debug2 before i saw that I missed some "Nimbus" fonts. Then I had to rename & put them where the log told me to. Some fancy google searching had to be applied, example: since the fonts turned out to be proprietary (i'm sure windows comes with these default). Nevertheless after downloading them(about 7 fonts) and putting them in the correct folder printing started working.

Before that i were getting all the errors said here: 'Unsupport PCL' etc...

I'm sure it could have worked with ESP gs 7.07 too(in rep) if i was smart enough to turn on DebugLevel2 sooner :/ UPDATE: yeah it did... maybe this info is useful for someone else though.. sorry for the inconvenience.

Getting HP LaserJet 1020 to work

After a lot of tries with hplib and gutenprint I finally found the solution to get my printer HP Laserjet 1020 printing.

First of all you only need to install cups and ghostscript. Then follow the link on to the printer driver page and follow the install instructions. Log in as root. After you downloaded the package and extracted the archive, change into the foo2zjs directory. Now you can follow the original installation instructions with a minor modification to change the userid for printing:

$ make
$ ./getweb 1020

Open the Makefile

$ nano Makefile

and search for the line

# LPuid=-olp

and modify it to

# LPuid=-oroot

then continue with the script

$ make install
$ make install-hotplug
$ make cups

Or you can use the package foo2zjs from AUR and modify the PKGBUILD: change the line

./getweb all


./getweb 1020

(or if you're setting another printer change this line to what you need).

As a last step add and configure the printer in the CUPS manager. The printer should be recognized automatically. It works fine for root and all users. When booting the operating system, the printer is initialized and indicates its working.

Printer connected to an Airport Express Station

The first thing to do is to scan the airport express station. It seems that there are different addresses depending on the model.

[root@somostation somos]# nmap

Starting Nmap 4.20 ( ) at 2007-06-26 00:50 CEST
Interesting ports on
Not shown: 1694 closed ports
5000/tcp  open  UPnP
9100/tcp  open  jetdirect
10000/tcp open  snet-sensor-mgmt
MAC Address: 00:14:51:70:D5:66 (Apple Computer)

Nmap finished: 1 IP address (1 host up) scanned in 25.815 seconds

With my station the port is 9100. The airport station is accessed like an HP JetDirect printer. After, you can edit your printer.conf file in this way:

# Printer configuration file for CUPS v1.2.11
# Written by cupsd on 2007-06-26 00:44
<Printer LaserSim>
Info SAMSUNG ML-1510 gdi
Location SomoStation
DeviceURI socket://
State Idle
StateTime 1182811465
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer

It should work. I had a few problems. There were resolved by removing foomatic and installing foomatic-db, foomatic-db-engine, foomatic-db-ppd instead.

Performing Utility Functions on Epson Printers


Here we explain how to perform some of the utility functions such as nozzle cleaning and nozzle checks on Epson printers. We will use the escputil utility, which is part of the gutenprint package.

There is a man page ("man escputil") that provides pretty good information, but it does not include necessary information on how to identify your printer. There are two parameters that can be used. One is --printer; what it expects is the name you used to identify your printer when you configured it. The other is --raw-device. What this option expects is is something beginning with "/dev". If your printer is a serial printer, and the only serial printer, it is "/dev/lp0". If it is an usb printer, it is "/dev/usb/lp0". If you have more than one printer, they will have names ending in "lp1", "lp2", etc.

  • To clean the printer heads:
  escputil -u --clean-head
  • To prints the nozzle-check pattern, allowing you to verify that the previous head cleaning worked. (Or to determine that you need to clean the heads)
  escputil -u --nozzle-check

If you want to perform an operation that requires 2-way communication with a printer, you must use the "--raw-device" specification, and your user must root or be a member of the group "lp".

  • The following is an example of getting the printer's internal identification:
  sudo escputil --raw-device=/dev/usb/lp0 --identify
  • To prints out the ink levels of the printer:
  sudo escputil --raw-device=/dev/usb/lp0 --ink-level


This is a printer status monitor which enables to get the remaining ink quantity, to print test patterns, to reset printer and to clean nozzle. It use an intuitive graphical user interface. Package can be downloaded from AUR.

Another Source for Printer Drivers

On is a really good printer driver for many printers not yet supported by Linux (especially Canon i*). The only problem is that high-quality-prints are either marked with a turboprint-logo or you have to pay for it... It's not Open-Source.



As a result of upgrade

Error with gnutls

After updating, if you get something like :

 /usr/sbin/cupsd: error while loading shared libraries: cannot open shared object file: No such file or directory

You need to update gnutls:

 pacman -S gnutls

In addition, in /etc/cups, there will be a file named cupsd.conf.pacnew. Rename it cupsd.conf.

All jobs are "stopped"

After updating CUPS, if all jobs sent to the printer become "stopped", delete the printer and add it again. Using the CUPS web interface (http://localhost:631), go to Printers > Delete Printer.

Note: If you don't remember your printer's settings, go to Printers > Modify Printer. Copy down the information displayed, click 'Modify Printer' to proceed to the next page(s), etc.