从 FreeBSD 8.0 起, 串口对应的设备名由
/dev/ttydN
变为
/dev/ttyuN
。
FreeBSD 7.X 用户应将这篇文档的示例中的设备名改为原先的样子。
要想在 LPD后台打印系统上使用打印机, 您需要设置打印机硬件和 LPD软件。 这个 文档描述了这两级设置:
这部分讲解怎样配置打印机硬件和 LPD使之与打印机配合。 讲解的基础知识有:
如果您正在设置一台通过网络协议 接收数据来打印而不是通过串口或者并口的打印机, 参见 使用网络数据流界面的打印机。
尽管这部分叫“简单打印机 设置”, 但还是相当复杂的。 使打印机 配合 LPD 后台打印系统在计算机上正常运转是最难的 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐, 是相当简单的。
这部分讲述了打印机连接到计算机的多种 途径。 主要讨论了多种接口和 连接线, 还有允许 FreeBSD 与打印机通讯所需的 内核配置。
如果您已经连接好了您的打印机而且已经 用它在另外一个操作系统下成功的打印, 您 或许可以跳到这个部分软件设置。
现在所出售的在 PC 上使用的打印机通常至少有 以下三种接口中的一个:
串口, 也叫 RS-232 或者 COM 口, 使用您计算机上的串口来发送数据到打印机。 串口在计算机上已经非常普遍, 而且电缆也非常容易买到且容易制作。 串口有时需要特殊的电缆, 而且可能需要您去配置稍微有点儿复杂的通讯选项。 大多数 PC 的串口的最高传输速度只有 115200 bps, 这使得打印很大的图像需要的时间很长。
并口 使用计算机上的并口来发送数据到打印机。 并口在计算机上也已经非常普遍, 而且速度高于 RS-232 串口。 电缆非常容易买到, 但很难手工制作。 并口通常没有通讯选项, 这使得配置它相当简单。
并口按打印机上的接头来命名也叫做 “Centronics”接口。
USB 接口, 即通用串行总线, 可以达到比并口和串口高很多的速度。 其电缆既简单又便宜。 USB 用来打印比串口和并口更有优势, 但 UNIX® 系统不能很好的支持它。 避免这个问题的方法就是购买一台 像大多数打印机一样的既有 USB 接口又有并口的 打印机。
一般来说并口只提供单向通讯 (计算机到打印机), 而串口和 USB 则可以提供双向通讯。 新的并口 (EPP 和 ECP) 及打印机在使用了 IEEE-1284 标准的电缆之后, 可以在 FreeBSD 下双向通讯。
与打印机通过并口双向通讯通常由这两种方法中的一种来完成。 第一个方法是使用为 FreeBSD 编写的可以通过打印机使用的语言与打印机通讯的驱动程序。 这通常用在喷墨打印机上, 且可以用来报告剩余墨水多少和其他状态信息。 第二种方法使用在支持 PostScript® 的打印机上。
PostScript® 任务事实上由程序发送给打印机; 但它并不进行打印而是直接将结果返回给计算机。 PostScript® 也采取双向通讯来将打印中的问题报告给计算机, 比如 PostScript® 程序中的错误或者打印机卡纸。 这些信息对于用户来说也许是非常有价值的。 此外, 最好的在支持 PostScript® 的打印机上记帐的方法需要双向通讯: 询问打印机打印总页数 (打印机从出厂一共打印过多少页), 然后发送用户的任务, 之后再次查询总打印页数。 将打印前后得到的两个值相减就可以得到该用户要付多少纸钱。
用并口连接打印机需要用 Centronics 电缆把打印机与计算机连接起来。 具体说明指导在打印机, 计算机的说明书上应该有, 或者干脆两个上面都有。
记住您用的计算机上的哪个并口。
第一个并口在 FreeBSD 上叫
/dev/ppc0
;
第二个叫
/dev/ppc1
,
依此类推。打印机设备也用同样的方法命名:
/dev/lpt0
是接在第一个并口上的打印机, 依此类推。
用串口连接打印机需要用 合适的串口电缆把打印机与计算机连接起来。 具体 说明指导应该在打印机, 计算机的说明书上有, 或者 同样干脆两个上面都有。
如果您不确定什么样儿的电缆才是 “ 合适的串口 电缆 ” , 您可以尝试以下几种不同的 电缆:
当然, 您还得为打印机设置通讯参数。
一般是通过打印机面板上的按钮或者 DIP
开关进行设置。 在计算机和打印机上都选择它们所支持的最高
波特
(每秒多少比特, 有时也叫
波特率) 的传输速率。
选择7或者8个数据位; 选择不校验,
偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量控制协议:
无, XON/XOFF (也叫做
“in-band” 或 “软件”) 流量控制。
记住您的软件配置中的参数也要设成上面的数值。
这部分描述了要使用 FreeBSD 系统中的 LPD 后台打印系统进行打印所需的软件设置。
包括这几个步骤:
在需要的时候配置内核来允许您连接 打印机的端口; 配置内核 部分会告诉您 需要做什么。
如果您使用并口, 则需要设置一下 并口的通讯模式; 设置 并口通讯模式 部分会告诉您具体的 细节。
测试操作系统是否能够发送数据到打印机。 检测打印机 联机状况 部分会告诉您要怎样 做。
为 LPD 设置与打印机匹配的参数则
通过修改
/etc/printcap
这个文件来完成。 这章后面
的部分将讲解如何来完成设置。
操作系统的内核为了使某些特殊设备工作需要重新 编译。 打印机所用的串口、 并口就属于那些特殊设备。 因此, 可能需要 添加对串口或并口的支持, 如果内核并没有配置它们的话。
要想知道您现在使用的内核是否支持串口, 输入:
其中 N
是串口的
编号, 从0开始。 如果您看到
类似下面的输出:
则说明您现在使用的内核支持串口。
要想知道您现在使用的内核是否支持并口, 输入:
其中 N
是并口的
编号, 同样从0开始。 如果得到类似
下面的输出:
那么您现在使用的内核支持并口。
您可能必须为了使操作系统支持您打印机需要的串口或 并口而 重新配置内核。
要增加对串口的支持, 参见 内核配置这部分。 要增加对并口的支持, 除了参见 上面提到的那部分之外, 还要 参见下面的 部分。
在使用并口时, 您可以选择 让 FreeBSD 用中断方式还是轮询方式来 与打印机通讯。 在 FreeBSD 上, 通用的打印机驱动 (lpt(4)) 使用 ppbus(4) 系统, 它利用 ppc(4) 驱动来控制端口芯片。
中断 方式是 GENERIC 核心的默认方式。 在这种方式下, 操作系统占用一条中断请求线来检测打印机是否已经做好接收数据的准备。
轮询 方式是操作系统反复不断的询问打印机是否做好接收数据的准备。 当它返回就绪时, 核心开始发送下面要发送的数据。
中断方式速度通常会快一些, 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机 不能正常的工作在中断模式下, 是由于一些定时问题 (还没正确的理解) 造成的。 这些打印机需要使用轮询方式。 您应该使用 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以 工作, 但在中断模式下会慢的要命。
您可以用以下两种方法设定通讯模式: 通过 配置内核或者使用 lptcontrol(8) 这个程序。
要通过配置内核的方法设置 通讯模式:
修改内核配置文件。 找到
一个叫 ppc0
的记录。 如果您想要设置的是
第二个并口, 那么用 ppc1
代替。 使用第三个并口的时候用 ppc2
代替,
依此类推。
如果您希望使用中断驱动模式, 则应编辑下面的配置:
它在 /boot/device.hints
这个文件中,
其中 N
用正确的中断
编号代替。 同时, 核心配置文件也必须
包括 ppc(4) 的驱动:
如果您想要使用轮询方式, 只需要把
/boot/device.hints
这个文件中的下面这行删除掉:
在 FreeBSD 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数情况是由于 acpi(4) 驱动造成的, 它可以自动侦测到设备并将其挂载到系统上, 但也因此, 它控制着打印机端口的访问模式. 您需要检查 acpi(4) 的配置来解决这个问题。
保存文件。 然后配置, 建立, 并安装刚配置的内核, 最后重新启动。 参见 内核配置 这章来获得更多细节。
使用 lptcontrol(8) 设置通讯模式:
输入:
将
lptN
设置成中断方式。
输入:
将
lptN
设置成轮询方式。
您可以把这些命令加入到
/etc/rc.local
这个文件中, 这样每次启动系统
时都会设置成您想要的方式。 参见 lptcontrol(8) 来获得
更多信息。
在设置后台打印系统之前, 您应该确保您的计算机可以把数据 发送到打印机上。 分别独立调试打印机的通讯和后台打印系统会更简单。
我们为了测试打印机,将发送一些文本给它。 一个叫 lptest(1) 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的 字符: 它在每行打出 可以打印的 96 个 ASCII 字符。
当我们使用的是一台 PostScript® ( 或者以其他语言为基础的 ) 打印机, 那么 需要更仔细的检测。 一段小小的 PostScript® 程序足以完成检测的任务, 比如下面这段程序:
可以把上面这段 PostScript® 代码写进一个文件里, 并且像下面部分的例子里那样 使用。
上面的小程序是针对 PostScript® 而不是惠普的 PCL 写的。 由于 PCL 拥有许多其他打印机没有的强大功能, 比如它支持在打印纯文本的同时夹带特殊的命令, 而 PostScript® 则不能直接打印纯文本, 所以需要对这类打印机语言进行特殊的处理。
这部分内容将指导您怎样检测 FreeBSD 是否可以与一台已经连接在并口上的打印机通讯。
要测试并口上的打印机:
用 su(1) 命令转换到 root
用户。
发送数据到打印机。
如果打印机可以直接打印纯文本, 可以用 lptest(1)。 输入:
其中 N
是并口的编号, 从0开始。
如果打印机支持 PostScript® 或其他打印机语言, 可以发送一段小程序到打印机。 输入:
然后, 一行一行地 输入
输入这段程序。 因为在按下 换行
或者
回车
之后, 这一行就不能再修改了。
当您输入完这段程序之后, 按
CONTROL+D
,
或者其他表示文件结束的键。
另外一种办法, 您可以把这段程序写在一个文件里, 并输入:
其中 file
是包含这您要发给打印机程序的文件名。
之后, 您应该看到打印出了一些东西。 如果打印出的东西看起来并不正确, 请不要着急; 我们将在后面指导您如何解决这类问题。
这部分将告诉您如何检测 FreeBSD 是否可以与连接在串口上的打印机通讯。
要测试连接在串口上的打印机:
通过 su(1) 命令转为 root
用户。
修改 /etc/remote
这个文件。
增加下面这些内容:
其中 port
是串口的设备节点 (ttyu0
、
ttyu1
, 等等),
bps-rate
是与打印机通讯时使用的速率, 而
parity
是通讯时打印机要求的校验方法 (应该是 even
、
odd
、 none
, 或
zero
之一)。
这儿有一个串口打印机的例子, 它连接在第三个串口上, 速度为 19200 波特, 不进行校验:
用 tip(1) 连接打印机。 输入:
如果没能成功, 则要再次修改
/etc/remote
这个文件, 并且试试用
/dev/cuaaN
代替
/dev/ttydN
。
发送数据到打印机。
您应该看到打印出了一些东西。 如果它们看起来并不正确也不要着急; 我们将在稍后的章节中介绍如何解决这类问题。
目前, 您的打印机应该已经连好了线, 系统内核也为与打印机联机而重新配置好 (如果需要的话), 而且您也已经可以发送一些简单的数据到打印机。 现在, 我们要配置 LPD 来使其控制您的打印机。
配置 LPD 要修改
/etc/printcap
这个文件。 由于
LPD 后台打印系统在每次使用后台打印的时候,
都会读取这个文件, 因此对这个文件的修改会立即生效。
printcap(5) 这个文件的格式很简单。
您可以用您最喜欢的文本编辑器来修改
/etc/printcap
这个文件。
这种格式和其他的像
/usr/share/misc/termcap
和
/etc/remote
这类文件是一样的。
要得到关于这种格式的详尽信息,
请参阅联机手册 cgetent(3)。
简单的后台打印配置包括下面的几步:
给打印机起一个名字 (记忆和使用的别名), 然后把它们写进文件
/etc/printcap
; 参见
如何为打印机命名
这章来得到更多的关于起名的帮助。
通过增加 sh
项关掉报头页
(它默认是启用的); 参见
如何禁用报头页
部分来得到更多信息。
建立一个后台打印队列的目录, 并且通过
sd
项目指定它的位置; 您可参见 创建后台打印队列目录
一节了解更多信息。
在 /dev
下设置打印机设备节点,
并且在写在 /etc/printcap
文件中 lp
项目里; 参见 识别打印机设备
这部分可以得到更多信息。 此外, 如果打印机连接在串口上,
通讯参数的设置需要写在
ms#
项中。 这些参数在 配置后台打印通讯参数
这在前面已经讨论过。
安装纯文本过滤器; 详情请参见 安装文本过滤器 小节。
使用打印机语言的打印机, 如 PostScript® 打印机, 通常是不能直接打印纯文本的。 前面提到, 并且将在后面继续进行介绍的简单的设置方法, 均假定您正在安装这种只能打印它能识别的文件格式的打印机。
用户通常会希望直接在系统提供的打印机上打印纯文本。 采用 LPD 接口的程序也通常是这样设计的。 如果您正在安装这样一台打印机, 并且希望它不仅能打印使用它支持的打印机语言的任务 而且 还能打印纯文本的任务的话, 那么强烈建议您在上面提到的简单设置的步骤上增加一步: 安装从自动纯文本到 PostScript® (或者其他打印机语言) 的转换程序。 更多的细节, 请参见 在 PostScript® 打印机上打印纯文本。
第一步 (简单) 就是给打印机起一个名字。 您是按功能起名字还是干脆起个古怪的名字都没有关系, 因为您可以给打印机设置许多的别名。
在
/etc/printcap
里至少有一个打印机必须指定, 别名是
lp
。 这是默认的打印机名。
如果用户既没有 PRINTER
环境变量, 也没有在任何
LPD 命令的命令行中指定打印机名,
则 lp
将是默认要使用的打印机。
还有, 我们通常把最后一个别名设置成能完全描述打印机的名字, 包括厂家和型号。
一旦您选好了名字或者一些别名, 把它们放进文件
/etc/printcap
里。
打印机的名字应该从最左边的一列写起。 用竖杠来隔开每个别名,
并且在最后一个别名后面加上一个冒号。
在下面的例子中, 我们从一个基本的
/etc/printcap
开始, 它只定义了两台打印机
(一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 PostScript®
激光打印机 ):
在这个例子中, 第一台打印机被命名为
rattan
并且设置了
line
, diablo
,
lp
, 和 Diablo 630 Line
Printer
这几个别名。 因为它被设置了
lp
这个别名, 所以它是默认打印机。 第二台
被命名为 bamboo
, 并且设置了
ps
, PS
,
S
, panasonic
, 和
Panasonic KX-P4455 PostScript v51.4
这几个别名。
LPD 后台打印系统默认 会为每个任务打印 报头页。 报头页 包含了发送这个任务的用户, 发送这个任务的计算机, 任务的名字, 并用大字母打出。 但不幸的是, 所有这些额外的文本, 都会给在对打印机进行最初的配置时排除故障带来困难, 所以我们将先不打印报头页。
要暂停打印报头页, 为打印机的记录增加 sh
标记, 在
/etc/printcap
文件中。 这儿有一个
/etc/printcap
文件中使用 sh
的例子:
注意我们的正确格式: 第一行从最左边一列开始, 而后的每一行用 TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个反斜杠。
下一步设置就是要建立一个 后台打印队列目录, 也就是在打印任务最终完成之前用于存放这些任务的目录, 这个目录中也会存放后台打印系统用到的其他一些文件。
由于后台打印队列目录的变量本质, 通常
把这些目录安排在
/var/spool
下。 您也没有必要去
备份后台打印队列目录里的内容。
重新建立它们只要简单的使用 mkdir(1) 命令。
通常, 我们习惯将目录名起成和 打印机一样的名字, 像下面 这样:
然而, 如果您有很多网络打印机,
您可能想要把这些后台打印的队列目录目录放在一个单独的专为使用
LPD 打印而准备的目录里。
我们将用我们的两台打印机
rattan
和
bamboo
作为例子:
如果担心用户任务的保密性,
可能会希望保护相应的后台打印队列目录, 使之不能被其他用户访问。
后台打印的队列目录的属主应该是 daemon 用户,
而 daemon
用户和 daemon
组拥有读写和搜索的权限,但其他用户没有。
接下来用我们的两台打印机作为例子:
最后, 您需要通过/etc/printcap
文件告诉 LPD
这些目录。 您可以用 sd
标记来指定后台打印队列目录的路径:
注意打印机的名字要从第 1 列开始, 其他记录每行都要用 TAB 键缩进一次, 写不开需要换行在最后加上反斜杠。
如果您没用
sd
标记指定后台打印队列目录, 后台打印系统会将
/var/spool/lpd
目录作为默认目录。
在 Hardware Setup
一节中,我们说明了 FreeBSD 与打印机通讯将使用哪个端口和
/dev
目录下的节点。
我们要告诉 LPD 这些信息。
当后台打印系统有任务需要打印,它将为过滤程序
(负责传送数据到打印机) 打开指定的设备。
用 lp
标记在 /etc/printcap
里列出 /dev
下的设备节点。
在我们的例子中, 假设打印机
rattan
在第一个并口上, 打印机
bamboo
在第六个串口上; 下面是
要对 /etc/printcap
文件里增加的内容 :
如果您没在您的 /etc/printcap
文件中
用 lp
标记指定设备节点,
LPD 将默认使用 /dev/lp
。
/dev/lp
目前在
FreeBSD 中不存在。
如果您正在安装的打印机是连接在 并口上的, 请跳到 安装文本 过滤器 这章。 如果不是的话, 还是最好按下面介绍的 步骤做。
对于连在串口上的打印机, LPD 可以为发送数据到打印机的过滤程序设置好波特率, 校验, 和其他串口通讯参数 。 这是有利的, 因为:
它可以让您只需简单的修改
/etc/printcap
就能尝试不同的通讯
参数; 您并不需要去重新编译过滤器
程序。
它使得后台打印系统可以在 多台有不同串口通讯设置的打印机上使用 相同的过滤器程序。
下面这个 /etc/printcap
中
用 lp
标记来控制列出设备的
串口通讯参数 :
br#bps-rate
设置设备的通讯速度为
bps-rate
, 这里
bps-rate
可以为 50, 75, 110,
134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
19200, 38400, 57600, or 115200 比特每秒。
ms#stty-mode
设置已打开的中端设备的选项 。 stty(1) 将详细 讲述可用的选项。
当 LPD 打开
用 lp
指定的设备时, 它会
将设备的特性设置成在
ms#
标记后指定的那样。 特别是
parenb
,
parodd
, cs5
,
cs6
, cs7
,
cs8
, cstopb
,
crtscts
, 和 ixon
这些模式, 它们在 stty(1)
手册中有详细说明。
我们举个例子来添加我们连在第6个串口上的
打印机。 我们将设波特为38400。 至于模式,
我们将用 -parenb
设置成不校验,
用 cs8
设置成8位字符,
用 clocal
设置成不要调制解调器控制,
用 crtscts
设置成硬件流量控制:
我们现在准备告诉 LPD
使用什么文本过滤器
给打印机发送任务。 文本过滤器,
也叫 输入过滤器, 是一个
在 LPD 有一个任务要发给
打印机时运行的程序。 当 LPD
为打印机运行文本过滤器时, 它设置过滤器的
标准输入为要发给打印机的任务, 而标准输出为
用 lp
标记指定的打印机
。 过滤器先从标准输入读取
任务, 为打印机进行一些转换
, 并将结果写到标准输出, 这些结果
将被打印。 想得到更多关于文本过滤器的信息, 见
过滤器
这节。
对于简单的打印机设置, 文本过滤器可以仅仅是一段
执行 /bin/cat
的 shell 脚本来
发送任务到打印机。
FreeBSD 还提供了一个叫做
lpf
的过滤器, 它可以处理退格和下划线来
使那些可能不能很好处理这类字符流的打印机正常工作。
而且, 当然, 您可以用任何其他的
您想用的过滤程序。 lpf
过滤器在
lpf: 一个文本
过滤器 这节将有详细描述。
首先, 我们来写一段叫做
/usr/local/libexec/if-simple
的简单
shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进
这个文件:
使这个文件可以被执行:
然后用
if
标记在
/etc/printcap
里告诉 LPD 使用这个脚本。 我们将仍然为
一直作为例子的这两台打印机在
/etc/printcap
里增加这个标记:
if-simple
脚本的副本可以在 /usr/share/examples/printing
目录中找到。
lpd(8) 在 /etc/rc
中被运行,
它是否被运行由 lpd_enable
这个变量控制。 这个
变量默认是 NO
。 如果您还没有修改
, 那么增加这行:
到 /etc/rc.conf
文件当中, 然后既可以重启您的
机器, 也可以直接运行 lpd(8)。
现在已经基本完成了 LPD 的基本设置。 但不幸的是, 还不是庆祝的时候, 因为我们还需要测试设置并且修正所有的 问题。 要测试设置, 尝试打印一些东西。 要 用 LPD 系统打印, 您可以 使用 lpr(1) 命令, 它可以提交一个任务来打印。
您可以联合使用 lpr(1) 和 lptest(1) 程序, 在 检查打印机 通讯 这节介绍怎样生成一些测试文本。
要测试简单 LPD 设置:
输入:
其中 printer-name
是
在 /etc/printcap
中指定的打印机的一个名字 ( 或者一个别名)
。 要测试默认
打印机, 输入 lpr(1) 不带任何 -P
选项。 同样, 如果您正在测试一台使用
PostScript® 的打印机, 发送一个 PostScript® 程序到打印机而不是
使用 lptest(1)。 您可以把程序放在一个
文件里, 然后输入: lpr
file
。
对于一台 PostScript® 打印机, 您应该得到那段程序的 结果。 而如果您使用的 lptest(1), 则您得到的 结果应该看起来像下面这样:
要更进一步的测试打印机, 尝试下载一些大的
程序 (为基于特定语言的打印机 ) 或者运行
lptest(1) 并使用不同的参数。 比如,
lptest 80 60
将生成 60 行 每行 80
个字符。
如果打印机不能工作, 参考 故障排除 这节。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.