要想在LPD打印池 系统上使用打印机, 您需要 设置打印机硬件和 LPD软件。 这个 文档描述了这两级设置:
参见简单打印机 设置来了解怎样连接一个打印机, 告诉 LPD怎样与 它通讯, 并且打印纯文本到 打印机。
参见高级 打印机设置来了解怎样打印多种 特殊格式的文件, 怎样打印报头页, 怎样通过网络 打印, 怎样控制打印机的访问权限, 并且学会为打印 作业记帐统计。
这部分讲解怎样配置打印机硬件和 LPD使之与打印机配合。 讲解的基础知识有:
如果您正在设置一台通过网络协议 接收数据来打印而不是通过串行或者并行界面的打印机, 参见使用 网络数据流界面的打印机。
尽管这部分叫“简单打印机 设置”, 但还是相当复杂的。 使打印机 配合和LPD 打印池在计算机上正常运转是最难的 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐, 是相当简单的。
这部分讲述了打印机连接到计算机的多种 途径。 主要讨论了多种接口和 连接线, 还有允许 FreeBSD 与打印机通讯所需的 内核配置。
如果您已经连接好了您的打印机而且已经 用它在另外一个操作系统下成功的打印, 您 或许可以跳到这个部分软件设置。
现在所出售的在 PC 上使用的打印机通常至少有 以下三种接口中的一个:
串行接口, 也叫 RS232C, RS232D 或者 COM 口, 使用您计算机上的 串口来发送数据到打印机。 串行 接口在计算机上已经非常普遍, 而且电缆 也非常容易买到且容易制作。 串行 接口有时需要特殊的电缆, 而且可能需要 您去配置稍微有点儿复杂的通讯 选项。 大多数 PC 的串口的最高 传输速度只有 115200 bps, 这使得打印 很大的图像需要的时间很长。
并行界面使用 计算机上的并口来发送数据到 打印机。 并行接口在计算机上也已经非常普遍 而且速度高于 RS232 串行界面。 电缆非常容易买到, 但很难手工 制作。 并行接口通常没有 通讯选项, 这使得 配置它相当简单。
并口按打印机上的接头来命名也叫做 “Centronics”接口 。
USB 接口, 即通用串行 总线, 可以达到比并口和串口 高很多的速度。 而电缆简单又便宜。 USB 用来打印比串口和并口 更有优势, 但是 UNIX® 系统不能很好的支持它。 避免这个问题的方法就是购买一台 像大多数打印机一样的即有 USB 接口又有并口的 打印机。
一般来说并口只提供 单向通讯( 计算机到打印机), 而串口 和 USB 则可以提供双向通讯。 新的并口( EPP and ECP) 和打印机 在使用了 IEEE1284 标准的电缆之后, 可以在FreeBSD下 双向通讯。
与打印机通过并口双向通讯 通常由这两种方法中的一种来完成。 第一个方法是 使用为 FreeBSD 编写的可以通过打印机使用的语言 与打印机通讯的驱动程序。 这通常 用在喷墨打印机上, 并且可以用来报告 剩余墨水多少和其他状态信息。 第二种方法 使用在支持 PostScript® 的打印机上。
PostScript 任务 事实上由程序发送给打印机; 但它并不进行打印 而是直接将结果返回给计算机。 PostScript 也采取双向通讯来将打印中的问题 报告给计算机, 比如 PostScript 程序中的错误 或者打印机卡纸。 这些信息对于用户来说也许是非常 有价值的。 此外, 最好的在支持 PostScript 的打印机上记帐的方法需要双向 通讯: 询问打印机打印总页数 ( 打印机 从出厂一共打印过多少页 ), 然后发送 用户的任务, 之后再次查询总打印页数。 将打印前后得到 的两个值相减就可以得到该用户要付多少 纸钱。
用并口连接打印机需要用 Centronics 电缆把打印机与计算机连接起来。 具体说明指导应该在打印机, 计算机的说明书上有, 或者 干脆两个上面都有。
记住您用的计算机上的哪个并口。 第一个并口在 FreeBSD 上叫 /dev/ppc0 ; 第二个叫 /dev/ppc1, 依此 类推。 打印机设备也用同样的方法命名: /dev/lpt0 是连接在第一个并口 上的打印机, 依此类推。
用串口连接打印机需要用 合适的串口电缆把打印机与计算机连接起来。 具体 说明指导应该在打印机, 计算机的说明书上有, 或者 同样干脆两个上面都有。
如果您不确定什么样儿的电缆才是 “ 合适的串口 电缆 ” , 您可以尝试以下几种不同的 电缆:
调制解调器 电缆每一端的 每一根引脚都直接连接到另一端 相应的引脚 上。 这种电缆也叫做 “DTE-to-DCE” 电缆。
非调制解调器电缆上每一端的有些引脚 是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到 接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内 短接。 这种电缆也叫做 “DTE-to-DTE” 电缆。
一些特殊的打印机需要的串行打印机 电缆, 是一种和非调制解调器电缆类似的电缆, 只是一些信号还是送到了另一端, 而 不是直接在连接头儿内短路。
当然, 您还得为打印机设置通讯参数。 一般是通过打印机面板上的按钮或者 DIP 开关进行设置。 在计算机和打印机上都选择它们所支持的最高 波特 (每秒多少比特, 有时也叫 波特率) 的传输速率。 选择7或者8个数据位; 选择不校验, 偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量 控制协议: 无, XON/XOFF (也叫做 “in-band” 或 “软件”) 流量控制。 记住您的软件配置中的参数也要设成上面的 数值。
这部分描述了要使用FreeBSD系统中的 LPD 打印池进行打印所需的软件设置。
包括这几个步骤:
在需要的时候配置内核来允许您连接 打印机的端口; 配置内核 部分会告诉您 需要做什么。
如果您使用并口, 则需要设置一下 并口的通讯模式; 设置 并口通讯模式 部分会告诉您具体的 细节。
测试操作系统是否能够发送数据到打印机。 检测打印机 联机状况 部分会告诉您要怎样 做。
为 LPD 设置与打印机匹配的参数则 通过修改 /etc/printcap 这个文件来完成。 这章后面 的部分将讲解如何来完成设置。
操作系统的内核为了使某些特殊设备工作需要重新 编译。 打印机所用的串口、 并口就属于那些特殊设备。 因此, 可能需要 添加对串口或并口的支持, 如果内核并没有配置它们的话。
要想知道您现在使用的内核是否支持串口, 输入:
# grep sioN /var/run/dmesg.boot
其中 N 是串口的 编号, 从0开始。 如果您看到 类似下面的输出:
sio2 at port 0x3e8-0x3ef irq 5 on isa sio2: type 16550A
则说明您现在使用的内核支持串口。
要想知道您现在使用的内核是否支持并口, 输入:
# grep ppcN /var/run/dmesg.boot
其中 N 是并口的 编号, 同样从0开始。 如果得到类似 下面的输出:
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/8 bytes threshold
那么您现在使用的内核支持并口。
您可能必须为了使操作系统支持您打印机需要的串口或 并口而 重新配置内核。
要增加对串口的支持, 参见 内核配置这部分。 要增加对并口的支持, 除了参见 上面提到的那部分之外, 还要 参见下面的 部分。
Note: FreeBSD 5.0 支持 devfs 这种在需要的时候自动添加设备节点 的文件系统。 如果您正在使用的 FreeBSD 开启了 devfs 文件系统, 那么您可以安全的跳过 这部分。
尽管内核可能已经支持通过串口或者并口 通讯, 但您还是需要一个软件接口 来使您系统上的程序通过它发送和接收 数据。 这也是 /dev 目录中那些设备节点的作用。
要在 /dev 中为端口添加 一个设备节点:
使用 su(1) 命令切换到 root 帐号。 在出现提示的时候输入 root 帐号的密码。
将当前目录改变到 /dev 目录:
# cd /dev
输入:
# ./MAKEDEV port
其中 port 替换成 您需要添加端口的节点名。 当打印机连接在第一个并口上时, 替换成 lpt0 , 连接在第二个并口上时, 替换成 lpt1 , 依此类推; 当打印机连接在第一个串口上时, 替换成 ttyd0 , 连接在第二个串口上时, 替换成 ttyd1 , 依此类推。
输入:
# ls -l port
来检查设备节点是否正常建立。
在使用并口时, 您可以选择 让 FreeBSD 用中断方式还是轮询方式来 与打印机通讯。 在 FreeBSD 4.X and 5.X 上, 通用的打印机驱动 (lpt(4)) 使用 ppbus(4) 系统, 它由 ppc(4) 驱动来控制端口芯片。
中断 方式是 GENERIC 核心的默认方式。 在这种方式下, 操作系统占用一条中断请求线来检测什么时候 打印机做好接收数据的准备。
轮询 方式是 操作系统反复不断的询问打印机是否做好 接收数据的准备。 当它返回准备好时, 核心开始发送 下面要发送的数据。
中断方式速度通常会快一些, 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机 不能正常的工作在中断模式下, 是由于一些定时问题 (还没正确的理解) 造成的。 这些打印机需要使用轮询方式。 您应该使用 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以 工作, 但在中断模式下会慢的要命。
您可以用以下两种方法设定通讯模式: 通过 配置内核或者使用 lptcontrol(8) 这个程序。
要通过配置内核的方法设置 通讯模式:
修改内核配置文件。 找到 一个叫 ppc0 的记录。 如果您想要设置的是 第二个并口, 那么用 ppc1 代替。 使用第三个并口的时候用 ppc2 代替, 依此类推。
如果您想要使用中断方式, 在 FreeBSD 4.X 下的方法是指定一个 irq :
device ppc0 at isa? irq N
其中 N 是计算机并口 的中断编号。
在 FreeBSD 5.X 下, 修改下面这一行:
hint.ppc.0.irq="N"
它在 /boot/device.hints 这个文件中, 其中 N 用正确的中断 编号代替。 同时, 核心配置文件也必须 包括 ppc(4) 的驱动:
device ppc
如果您想要使用轮询方式, 则不用指定 irq :
在 FreeBSD 4.X 下, 在内核配置文件中使用下面 这行:
device ppc0 at isa?
在 FreeBSD 5.X 下, 只需要把 /boot/device.hints 这个文件中的下面这行 删除掉:
hint.ppc.0.irq="N"
在 FreeBSD 5.X 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数 情况是由于 acpi(4) 驱动造成的, 它 可以自动侦测到设备并将其挂载到系统上, 但也因此, 它控制着打印机端口的访问模式. 您 得检查 acpi(4) 的配置来 解决这个问题。
保存文件。 然后配置, 建立, 并安装刚配置的 内核, 最后重新启动。 参见 内核配置 这章来获得 更多细节。
使用 lptcontrol(8) 设置通讯模式 :
输入:
# lptcontrol -i -d /dev/lptN
将 lptN 设置成中断方式。
输入:
# lptcontrol -p -d /dev/lptN
将 lptN 设置成轮询方式。
您可以把这些命令加入到 /etc/rc.local 这个文件中, 这样每次启动系统 时都会设置成您想要的方式。 参见 lptcontrol(8) 来获得 更多信息。
在设置打印池系统之前, 您 应该确保您的计算机可以把数据 发送到打印机上。 分别独立调试打印机的通讯和打印池系统 会更简单。
我们为了测试打印机,将发送一些文本给它。 一个叫 lptest(1) 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的 字符: 它在每行打出 可以打印的 96 个 ASCII 字符。
当我们使用的是一台 PostScript ( 或者以其他语言为基础的 ) 打印机, 那么 需要更仔细的检测。 一段小小的 PostScript 程序足以完成检测的任务, 比如下面这段程序:
%!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage
可以把上面这段 PostScript 代码写进一个文件里, 并且像下面部分的例子里那样 使用。
Note: 上面的小程序是基于 PostScript 写成的, 而不是惠普 的 PCL 。 尽管 PCL 拥有强大的功能, 比如 您可以在打印纯文本的同时夹带着特殊的命令。 PostScript 不能直接打印纯文本, 所以 这类打印机语言是我们要特殊照顾的 对象。
这部分内容将指导您怎样检测FreeBSD是否 可以与一台已经连接在并口上的打印机 通讯。
要测试并口上的 打印机:
用 su(1) 命令转换到 root 用户。
发送数据到打印机。
如果打印机可以直接打印纯文本, 可以用 lptest(1) 。 输入:
# lptest > /dev/lptN
其中 N 是并口的 编号, 从0开始。
如果打印机支持 PostScript 或者 其他打印机语言, 可以发送一段小程序到 打印机。 输入:
# cat > /dev/lptN
然后, 一行一行的 输入 输入 这段程序。 因为在按下 换行 或者 回车 之后, 这一行就不能再修改了。 当您输入完 这段程序之后, 按 CONTROL+D, 或者其他 表示文件结束的键。
另外一种办法, 您可以把这段程序写在一个文件 里并输入:
# cat file > /dev/lptN
其中 file 是 包含这您要发给打印机程序的 文件名。
之后, 您应该看到打印出了一些东西。 如果打印出的东西 看起来并不正确, 请不要着急; 我们将在后面指导您怎样 解决这类问题。
这部分将告诉您如何检测FreeBSD是否可以与 连接在串口上的打印机通讯。
要测试一个连接在串口上 的打印机:
通过 su(1) 命令转换成 root 用户。
修改 /etc/remote 这个文件。 增加 下面这些内容:
printer:dv=/dev/port:br#bps-rate:pa=parity
其中 port 是 串口的设备节点 (ttyd0, ttyd1, 等等。 ), bps-rate 是 与打印机通讯时使用的波特, parity 是通讯时打印机要求 的校验方法 (either even, odd, none, or zero)。
这儿有一个串口打印机的例子, 它连接在第三个串口上, 速度为 19200 波特, 不进行校验:
printer:dv=/dev/ttyd2:br#19200:pa=none
用 tip(1) 连接打印机。 输入:
# tip printer
如果没能成功, 则要再次修改 /etc/remote 这个文件, 并且试试用 /dev/cuaaN 代替 /dev/ttydN。
发送数据到打印机。
如果打印机可以直接打印纯文本, 则用 lptest(1) 。 输入:
% $lptest
如果打印机支持 PostScript 或者其他 打印机语言, 则发送一段小程序到 打印机。 一行一行的输入程序, 必须 非常仔细 因为像退格 或者其他编辑键也许对打印机来说有它的 意义。 您同样也需要按一个特殊的 文件结束键, 让打印机知道它已经 接收了整个程序。 对于 PostScript 打印机, 按 CONTROL+D。
或者, 您同样也可以把程序存储在一个文件里 并输入:
% >file
其中 file 是 包含要发送程序的文件名。 在 tip(1) 发送这个文件之后, 按代表 文件结束的键。
您应该看到打印出了一些东西。 如果它们看起来 并不正确也不要着急; 我们将在以后的部分中解决它。
目前, 您的打印机应该已经连好了线, 系统内核 也为与打印机联机而重新配置好 ( 如果需要的话 ), 而且您也 已经可以发送一些简单的数据到打印机。 现在, 我们要 配置 LPD 来使其控制您的 打印机。
配置 LPD 要修改 /etc/printcap 这个文件。 LPD 打印池系统 在每次打印池被使用的时候都会读取这个文件, 所以对这个文件 的修改会立即生效。
printcap(5) 这个文件的格式很简单。 您可以用您最喜欢的文本编辑器来修改 /etc/printcap 这个文件。 这种格式和其他的 像 /usr/share/misc/termcap 和 /etc/remote 这类文件是一样的。 要得到完整的 关于这种格式的信息, 参见 cgetent(3) 。
简单的打印池配置包括下面的几 步:
为打印机起一个名字 ( 和一些方便的别名 ) , 然后把它们写进文件 /etc/printcap ; 参见 Naming the Printer 这章来得到更多的关于起名的帮助。
关掉报头页 ( 它默认是打开的 ), 通过 增加 sh 项目; 参见 Suppressing Header Pages 部分来得到更多信息。
建立一个打印池缓冲的目录, 并且通过 sd 项目指定它的位置; 参见 Making the Spooling Directory 部分来得到更多信息。
在 /dev 下设置打印机设备 节点, 并且在写在 /etc/printcap 文件中 lp 项目里; 参见 识别打印机 设备 这部分得到更多信息。 还有, 如果打印机连接在 串口上, 设置通讯参数要写在 ms# 项目中。 这些参数在 配置打印池 通讯参数 这部分已经讨论过。
安装纯文本过滤器; 参见 安装文本 过滤器 这章来得到细节。
Note: 基于打印机语言的打印机, 比如 PostScript 打印机, 不能直接打印纯文本。 简单的设置方法在上面 提到并且下面的部分也要讨论, 假如您正在 安装这样一台只能打印它明白的文件的 打印机。
用户总是希望他们能在任何一个安装在他们系统的打印机上打印 纯文本。 使用 LPD 接口的程序也通常这样 希望。 如果您正在安装这样一台打印机, 并且想要它能打印 基于它支持的打印机语言的任务 并且 还可以打印纯文本的任务, 那么强烈建议您在上面提到 的简单设置的步骤上增加一步: 安装一个 自动纯文本到 PostScript ( 或者其他打印机语言 ) 的 转化程序。 参见 在 PostScript 打印机上打印纯文本 将得到 更多有关信息。
第一步 ( 简单 ) 就是给打印机起一个名字。 您是按功能起名字还是干脆起个古怪的名字都没有关系, 因为您可以给打印机设置许多的 别名。
在 /etc/printcap 里至少有一个打印机必须指定, 别名是 lp. 这是默认的打印机名。 如果用户既没有 PRINTER 环境 变量, 也没有在任何 LPD 命令的命令行中指定打印机名, 则 lp 将是默认 要使用的打印机。
还有, 我们通常把最后一个别名设置成 能完全描述打印机的名字, 包括厂家 和型号。
一旦您选好了名字或者一些别名, 把它们 放进文件 /etc/printcap 里。 打印机的 名字应该从最左边的一列写起。 用 竖杠来隔开每个别名, 并且在最后一个别名后面 加上一个冒号。
在下面的例子中, 我们从一个基本的 /etc/printcap 开始, 它只定义了两台打印机 (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 PostScript 激光打印机 ):
# # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
在这个例子中, 第一台打印机被命名为 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 的例子:
# # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:
注意我们的正确格式: 第一行从 最左边一列开始, 而后的每一行用 TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个 反斜杠。
下一步设置就是要建立一个 打印池目录, 一个在任务被打印完 之前存放任务的目录, 也有很多其他 的打印池系统所用到的文件存在里面。
由于打印池目录的变量本质, 通常 把这些目录安排在 /var/spool 下。 您也没有必要去 备份打印池目录里的内容。 重新建立它们只要简单的使用 mkdir(1) 命令。
通常, 我们习惯将目录名起成和 打印机一样的名字, 像下面 这样:
# mkdir /var/spool/printer-name
然而, 如果您有很多网络打印机, 您可能想要把这些打印池目录放在一个单独的 您专门为使用 LPD 打印而准备的目录里。 我们 将用我们的两台打印机作为例子 rattan 和 bamboo:
# mkdir /var/spool/lpd # mkdir /var/spool/lpd/rattan # mkdir /var/spool/lpd/bamboo
Note: 如果您在关心用户任务的保密 性, 您可能想保护相应的打印池目录, 使它们 不能被公开访问。 打印池 目录应该被daemon用户拥有, 用户daemon和daemon组拥有读写和 搜索的权限, 并且其他用户没有。 我们将用我们的两台打印机作为例子:
# chown daemon:daemon /var/spool/lpd/rattan # chown daemon:daemon /var/spool/lpd/bamboo # chmod 770 /var/spool/lpd/rattan # chmod 770 /var/spool/lpd/bamboo
最后, 您需要通过/etc/printcap 文件告诉 LPD 这些 目录。 您可以用 sd 标记来指定 打印池目录的 路径:
# # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:
注意打印机的名字要从 第1列开始, 其他记录每行都要 用TAB键缩进一次, 写不开需要换行在最后加上反 斜杠。
如果您没用 sd 标记指定打印池目录, 打印池系统会将 /var/spool/lpd 目录作为默认目录。
在 为端口在 /dev 目录下增加设备节点 章节中, 我们确定了使用 /dev 目录中的哪个节点来让 FreeBSD 与打印机 通讯。 现在, 我们来告诉 LPD 这个 信息。 当打印池系统有任务需要打印, 它 将为过滤程序(负责传送数据到打印机)打开 指定的设备。
用 lp 标记在 /etc/printcap 里列出 /dev 下的设备节点 。
在我们的例子中, 假设打印机 rattan 在第一个并口上, 打印机 bamboo 在第六个串口上; 下面是 要对 /etc/printcap 文件里增加的内容 :
# # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:
如果您没在您的 /etc/printcap 文件中 用 lp 标记指定设备节点, LPD 将默认使用 /dev/lp 。 /dev/lp 目前在 FreeBSD 中不存在。
如果您正在安装的打印机是连接在 并口上的, 请跳到 安装文本 过滤器 这章。 如果不是的话, 还是最好按下面介绍的 步骤做。
对于连在串口上的打印机, LPD 可以为发送数据到打印机的过滤程序设置好波特率, 校验, 和其他串口通讯参数 。 这是有利的, 因为:
它可以让您只需简单的修改 /etc/printcap 就能尝试不同的通讯 参数; 您并不需要去重新编译过滤器 程序。
它使得打印池系统可以在 多台有不同串口通讯设置的打印机上使用 相同的过滤器程序。
下面这个 /etc/printcap 中 用 lp 标记来控制列出设备的 串口通讯参数 :
设置设备的通讯速度为 bps-rate, 这里 bps-rate 可以为 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, or 115200 比特每秒.
设置已打开的中端设备的选项 。 stty(1) 将详细 讲述可用的选项。
当 LPD 打开 用 lp 指定的设备时, 它会 将设备的特性设置成在 ms# 标记后指定的那样。 特别是 parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts, 和 ixon 这些模式, 它们在 stty(1) 手册中有详细说明。
我们举个例子来添加我们连在第6个串口上的 打印机。 我们将设波特为38400。 至于模式, 我们将用 -parenb 设置成不校验, 用 cs8 设置成8位字符, 用 clocal 设置成不要调制解调器控制, 用 crtscts 设置成硬件流量控制:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:
我们现在准备告诉 LPD 使用什么文本过滤器 给打印机发送任务。 文本过滤器, 也叫 输入过滤器, 是一个 在 LPD 有一个任务要发给 打印机时运行的程序。 当 LPD 为打印机运行文本过滤器时, 它设置过滤器的 标准输入为要发给打印机的任务, 而标准输出为 用 lp 标记指定的打印机 。 过滤器先从标准输入读取 任务, 为打印机进行一些转换 , 并将结果写到标准输出, 这些结果 将被打印。 想得到更多关于文本过滤器的信息, 见 过滤器 这节。
对于简单的打印机设置, 文本过滤器可以仅仅是一段 执行 /bin/cat 的 shell 脚本来 发送任务到打印机。 FreeBSD 还提供了一个叫做 lpf 的过滤器, 它可以处理退格和下划线来 使那些可能不能很好处理这类字符流的打印机正常工作。 而且, 当然, 您可以用任何其他的 您想用的过滤程序。 lpf 过滤器在 lpf: 一个文本 过滤器 这节将有详细描述。
首先, 我们来写一段叫做 /usr/local/libexec/if-simple 的简单 shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进 这个文件:
#!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2
使这个文件可以被执行:
# chmod 555 /usr/local/libexec/if-simple
然后用 if 标记在 /etc/printcap 里告诉 LPD 使用这个脚本。 我们将仍然为 一直作为例子的这两台打印机在 /etc/printcap 里增加这个标记:
# # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\ :if=/usr/local/libexec/if-simple:
Note: 一份 if-simple 脚本 的拷贝可以在 /usr/share/examples/printing 这个目录中找到。
lpd(8) 在 /etc/rc 中被运行, 它是否被运行由 lpd_enable 这个变量控制。 这个 变量默认是 NO。 如果您还没有修改 , 那么增加这行:
lpd_enable="YES"
到 /etc/rc.conf 文件当中, 然后既可以重启您的 机器, 也可以直接运行 lpd(8)。
# lpd
现在已经基本完成了 LPD 的基本设置。 但不幸的是, 还不是庆祝的时候, 因为我们还需要测试设置并且修正所有的 问题。 要测试设置, 尝试打印一些东西。 要 用 LPD 系统打印, 您可以 使用 lpr(1) 命令, 它可以提交一个任务来打印。
您可以联合使用 lpr(1) 和 the lptest(1) 程序, 在 检查打印机 通讯 这节介绍怎样生成一些测试文本。
要测试简单 LPD 设置:
输入:
# lptest 20 5 | lpr -Pprinter-name
其中 printer-name 是 在 /etc/printcap 中指定的打印机的一个名字 ( 或者一个别名) 。 要测试默认 打印机, 输入 lpr(1) 不带任何 -P 选项。 同样, 如果您正在测试一台使用 PostScript 的打印机, 发送一个 PostScript 程序到打印机而不是 使用 lptest(1)。 您可以把程序放在一个 文件里, 然后输入: lpr file.
对于一台 PostScript 打印机, 您应该得到那段程序的 结果。 而如果您使用的 lptest(1), 则您得到的 结果应该看起来像下面这样:
!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678
要更进一步的测试打印机, 尝试下载一些大的 程序 (为基于特定语言的打印机 ) 或者运行 lptest(1) 并使用不同的参数。 比如, lptest 80 60 将生成 60 行 每行 80 个字符。
如果打印机不能工作, 参考 故障排除 这节。