diff --git a/zh_CN.GB2312/books/handbook/disks/chapter.sgml b/zh_CN.GB2312/books/handbook/disks/chapter.sgml
index ab81f49e33..d77e5b2b45 100644
--- a/zh_CN.GB2312/books/handbook/disks/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/disks/chapter.sgml
@@ -1,3669 +1,3669 @@
存储
概述
这章介绍了 FreeBSD 中磁盘的使用方法。包括内存盘,
网络附属磁盘和标准的 SCSI/IDE 存储设备,以及使用 USB 的设备。
读完这章,您将了解到:
FreeBSD 中用来描述硬盘上数据组织的术语 (partitions and slices)。
如何在您的系统上增加硬盘。
如何配置 &os; 来使用 USB 存储设备。
如何设置虚拟文件系统,例如内存磁盘。
如何使用配额来限制磁盘空间的使用。
如何增加磁盘安全来预防功击。
如何刻录 CD 和 DVD 。
用于备份的多种存储媒介。
如何在 FreeBSD 上使用备份程序。
如何备份到软磁盘。
文件系统快照是什么, 以及如何有效地使用它们。
在读这章之前,您应该:
知道怎样去配置和安装新的 FreeBSD 内核
().
设备命名
下面是在 FreeBSD 上被支持的物理存储设备和它们被分配的设备名。
物理磁盘命名规则
驱动器类型
驱动设备命名
IDE 硬盘驱动器
ad
IDE CDROM 驱动器
acd
SCSI 硬盘以及 USB 大容量存储设备
da
SCSI CDROM 驱动器
cd
各类非标准 CDROM 驱动器
用于 Mitsumi CD-ROM 的 mcd 以及用于
Sony CD-ROM 驱动器的 scd
Floppy drives
fd
SCSI tape drives
sa
IDE tape drives
ast
Flash drives
fla for &diskonchip; Flash device
RAID drives
aacd for &adaptec; AdvancedRAID,
mlxd and mlyd
for &mylex;,
amrd for AMI &megaraid;,
idad for Compaq Smart RAID,
twed for &tm.3ware; RAID.
David
O'Brien
Originally contributed by
添加磁盘
磁盘
添加
假设我们要给一台只有一个磁盘的机器增加一个新的 SCSI 磁盘。首先
需要关掉计算机,然后按操作规程来安装驱动器,控制器和驱动程序。由于
各厂家生产的产品各不相同,具体的安装细节不在此文档介绍之内。
以 root 用户登录。安装完驱动后,检查一下
/var/run/dmesg.boot 有没有找到新的磁盘。在我们
的例子中新增加的磁盘就是 da1,我们从
/1 挂上它。 (如果您正添加 IDE 驱动器,
则设备名应该是 ad1)。
partitions
slices
fdisk
因为 FreeBSD 运行在 IBM-PC 兼容机上,它必须遵循 PC BIOS 分区规范。
这与传统的 BSD 分区是不同的。一个 PC 的磁盘最高只能有四个 BIOS
主分区。如果磁盘只安装 FreeBSD 您可以使用 dedicated
模式。另外, FreeBSD 必须安装在 PC BIOS 支持的分区内。FreeBSD 把分区叫作
slices 这可能会把人搞糊涂。您也可以在只安装
FreeBSD 的磁盘上使用 slices,也可以在安装有其它操作系统的磁盘上使用
slices。这不会影响其它操作系统的 fdisk 分区工具。
在 slice 方式表示下,驱动器被添加到 /dev/da1s1e。
可以读作:SCSI 磁盘,编号为 1 (第二个SCSI 磁盘), slice 1 (PC BIOS 分区 1),
的 BSD 分区 e 。在有些例子中,也可以简化为
/dev/da1e。
由于 &man.bsdlabel.8; 使用 32-位 的整数来表示扇区号,
因此在多数情况下它的表现力限于每个磁盘
2^32-1 个扇区或 2TB。 &man.fdisk.8; 格式允许的起始扇区号不能高于
2^32-1 而分区长度也不能大于 2^32-1, 通常情况下这限制了分区大小最大为
2TB 而磁盘大小则是 4TB。 &man.sunlabel.8; 格式的限制是每个分区
2^32-1 个扇区, 但允许 8 个分区因此最大支持 16TB 的磁盘。
要使用更大的分区, 则应使用 &man.gpt.8;。
使用 &man.sysinstall.8;
sysinstall
adding disks
su
使用 Sysinstall
您可以使用 sysinstall
命令的菜单来分区和标记一个新的磁盘。 这一操作需要有 root 权限,
您可以直接使用 root 账户登录或者使用
su 命令来切换到 root 用户。运行
sysinstall ,然后选择
Configure 菜单。在
FreeBSD Configuration Menu 下,上下滚动,
选择 Fdisk 条目。
fdisk 分区编辑器
进入 fdisk 分区编辑器后,选择
A ,FreeBSD 将使用全部的磁盘。当被告知
remain cooperative with any future possible operating
systems
时,回答 YES。使用
W 保存刚才的修改。现在使用 q
退出 FDISK 编辑器。下面会看到有关 主引导区
的信息。 现在您已经在运行的系统上添加了一个磁盘,
因此应该选择 None。
Disk Label 编辑器
BSD partitions
接下来,您应该退出 sysinstall
并且再次启动它,并按照上面的步骤直接进入
Label 选项。进入 磁盘标签编辑器。
这就是您要创建的 BSD 分区。一个磁盘最多可以有 8 个分区,标记为
a-h。有几个分区标签有特殊的用途。
a 分区被用来作为根分区(/)。
系统磁盘(例如:从那儿启动的分区)必须有一个 a
分区。b 分区被用作交换分区,可以用很多磁盘用作交
换分区。 c 分区代表整个硬盘,或在 FreeBSD slice
模式下代表整个 slice。其它分区作为一般分区来使用。
sysinstall 的标签编辑器用 e
表示非 root 和非 swap 分区。在标签编辑器中,可以使用键入C
创建一个文件系统。当提示这是否是一个 FS(文件系统)或 swap 时,选择
FS,然后给出一个加载点(如: /mnt)。
当在 post-install 模式时添加一个磁盘, sysinstall
不会在 /etc/fstab 中创建记录,所以是否指定加载点并不重要。
现在已经准备把新标签写到磁盘上,然后创建一个文件系统,可以按下
W。出现任何错误都会不能创建新的分区。可以退出标签编辑
器然后重新执行 sysinstall 。
完成
下面一步就是编辑 /etc/fstab,为您的磁盘添加一个新
记录。
使用命令行工具
使用 Slices
这步安装将允许磁盘与可能安装在您计算机上的其它操作系统一起
正确工作,而不会搞乱其它操作系统的分区。推荐使用这种方法来安装
新磁盘,除非您有更好的理由再使用 dedicated
模式!
&prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1
&prompt.root; fdisk -BI da1 #初始化新磁盘
&prompt.root; bsdlabel -B -w da1s1 auto #加上标签
&prompt.root; bsdlabel -e da1s1 # 现在编辑您刚才创建的磁盘分区
&prompt.root; mkdir -p /1
&prompt.root; newfs /dev/da1s1e # 为您创建的每个分区重复这个操作
&prompt.root; mount /dev/da1s1e /1 # 挂上分区
&prompt.root; vi /etc/fstab # 完成之后,添加合适的记录到您的 /etc/fstab文件。
如果有一个 IDE 磁盘,记得要用 ad 替换前面的
da。
专用模式
OS/2
如果您并没有安装其它的操作系统,可以使用 dedicated
模式。记住这种模式可能会弄乱 Microsoft 的操作系统,但不会对它进行破坏。
它不识别找到的 IBM &os2 的 appropriate
分区。
&prompt.root; dd if=/dev/zero of=/dev/da1 bs=1k count=1
&prompt.root; bsdlabel -Bw da1 auto
&prompt.root; bsdlabel -e da1 # 创建 `e' 分区
&prompt.root; newfs /dev/da1e
&prompt.root; mkdir -p /1
&prompt.root; vi /etc/fstab # 为 /dev/da1e添加一个记录
&prompt.root; mount /1
另一种方法:
&prompt.root; dd if=/dev/zero of=/dev/da1 count=2
&prompt.root; bsdlabel /dev/da1 | bsdlabel -BR da1 /dev/stdin
&prompt.root; newfs /dev/da1e
&prompt.root; mkdir -p /1
&prompt.root; vi /etc/fstab # 为 /dev/da1e添加一个记录
&prompt.root; mount /1
RAID
软件 RAID
Christopher
Shumway
Original work by
Jim
Brown
Revised by
RAIDsoftware
RAIDCCD
连接磁盘驱动器配置 (CCD)
选择一个大容量存储比较好的解决方案,最重要的因素是产品的速度、
性能和成本。 通常这三者不可能都满足;要获得比较快和可靠的大容量存储设备,
就比较昂贵。但如果将成本降下来,那它的速度或可靠性就会打折扣。
在设计下面描述的系统时, 价格被选为最重要的因素,
接下来是速度和性能。 这个系统的数据传输速度基本上受限于网络。
性能也非常重要,
CCD 驱动器上的所有数据都被备份到了 CD-R 盘, 可以很容易地对数据进行恢复。
在选择一个大容量的存储解决方案时,第一步是要设计您自己的需求。
如果您的需求更偏重于速度和性能,那么您的解决方案将就不同于上面的设计。
安装硬件
除了 IDE 系统磁盘外,还有三个 Western Digital 30GB、5400 RPM
的 IDE 磁盘构成了大约 90G 的连接磁盘驱动存储空间。 理想情况是每个 IDE
硬盘都独占 IDE 控制器和数据线, 但为了尽可能降低成本, 通常并不会安装更多的控制器,
而是通过配置跳线,使每个 IDE 控制器都管理一个主盘和一个从盘。
重启动后,系统 BIOS 被配置成自动检测硬盘。FreeBSD 检测到它们:
ad0: 19574MB <WDC WD205BA> [39770/16/63] at ata0-master UDMA33
ad1: 29333MB <WDC WD307AA> [59598/16/63] at ata0-slave UDMA33
ad2: 29333MB <WDC WD307AA> [59598/16/63] at ata1-master UDMA33
ad3: 29333MB <WDC WD307AA> [59598/16/63] at ata1-slave UDMA33
如果 FreeBSD 没有检测到它们,请确定它们的跳线是否设置
正确。大多数 IDE 磁盘有一个 Cable Select
跳线。这个
不是 设置 master/slave 硬盘的跳线。查阅文档
信息来确定正确的跳线设置。
接下来考虑的是,如何创建文件系统。应该好好研究一下 &man.vinum.8; ()和 &man.ccd.4; 两种方式,在这里我们选择 &man.ccd.4;
安装 CCD
&man.ccd.4; 允许用户将几个相同的的磁盘通过一个逻辑文件系统
连接起来。要使用 &man.ccd.4;,您需要在内核中配置 &man.ccd.4;
支持选项。把这行加入到内核配置文件中,然后重建内核:
device ccd
对 &man.ccd.4; 的支持也可以内核模块的形式载入。
要安装 &man.ccd.4;, 首先需要使用 &man.bsdlabel.8; 来编辑硬盘:
bsdlabel -w ad1 auto
bsdlabel -w ad2 auto
bsdlabel -w ad3 auto
此处将整个硬盘创建为 ad1c, ad2c
和 ad3c。
下一步是改变 disklable 的类型。也可以使用 &man.bsdlabel.8; 来编辑:
bsdlabel -e ad1
bsdlabel -e ad2
bsdlabel -e ad3
这儿在每个已经设置了 EDITOR 环境变量的磁盘上打开了
disklable,在我我例子中使用的是 &man.vi.1;。
可以看到:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
添加一个新的 e 分区给 &man.ccd.4; 用。这可以是
c 分区的一个副本, 但 必须
是 4.2BSD。做完之后,您会看到一面这些:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597)
建立文件系统
现在已给每个磁盘都加上了标签,下面需要建立 &man.ccd.4;。要这样做,
需要使用 &man.ccdconfig.8; 工具,同时要提供类似下面的选项:
ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e
每个选项的意义和用法如下所示:
配置设备的第一个参数,在这是 /dev/ccd0c。
/dev/ 部分是任选项。
下一个参数是文件系统的插入页(interleave)。插入页定义了一个
磁盘块中一个分段或条带(stripe)的大小,通常是 512 个字节。所以一个为
32 的插入页将是 16,384 字节。
插入页为 &man.ccdconfig.8; 附带了标记。如果您要启用驱动器镜像,
需要在这儿指定它。在这个配置中没有做 &man.ccd.4; 的镜像,所以把它
设为 0 (zero)。
&man.ccdconfig.8; 的最后配置是设备的排列问题。使用完整的设备
路径名。
运行 &man.ccdconfig.8; 后 &man.ccd.4; 就配置好了。现在要创建文件
系统了,参考 &man.newfs.8; 选项,执行下同的命令:
newfs /dev/ccd0c
自动创建
最后,要挂上 &man.ccd.4; ,需要先配置它。把当前的配置文件写入
/etc/ccd.conf 中,使用下面的命令:
ccdconfig -g > /etc/ccd.conf
当重新启动系统时,如果 /etc/ccd.conf 存在,
脚本 /etc/rc 就运行 ccdconfig -C。
这样就能自动配置 &man.ccd.4; 以到它能被挂上。
如果启动进入了单用户模式,在 &man.mount.8; 上 &man.ccd.4;
之前,需要执行下面的命令来配置队列:
ccdconfig -C
要自动挂接 &man.ccd.4;,需要为 &man.ccd.4; 在
/etc/fstab 中配置一个记录,以便在启动时它能被挂上。
如下所示:
/dev/ccd0c /media ufs rw 2 2
Vinum 卷管理
RAIDsoftware
RAID
Vinum
Vinum 卷管理是一个实现虚拟磁盘的块驱动设备工具。它使磁盘从
块设备的接口和数据映射中独立出来。与传统的存储设备相比,增加了
灵活性、性能和可靠性。 &man.vinum.8; 实现了 RAID-0、RAID-1 和
RAID-5 三种模式,它们既可以独立使用,也可组合使用。
参考 得到更多 &man.vinum.8;
的信息。
硬件 RAID
RAID
hardware
FreeBSD 支持很多硬件 RAID 控制器。
这些硬件不需要 FreeBSD 指定软件来管理 RAID 系统。
使用 BIOS 支持的硬件,一般情况下这些硬件可以自行操作。
下面是一个简明的描述设置一个 Promise IDE RAID 控制器。
当硬件设备装好且系统重启后,屏幕上显示一个询问信息。接着进入硬件设置屏幕。在这里,
您可以把所有的磁盘联合在一起使用。这样 FreeBSD 将磁盘看作一个驱动器。其它
级别的 RAID 也可以相应的进行设置。
重建 ATA RAID1 阵列
FreeBSD 允许您热插拔阵列中损坏的磁盘。
在您重新启动系统之前请注意这一点。
您可能会在 /var/log/messages 或者在 &man.dmesg.8;
的输出中看到类似下面这些的内容:
ad6 on monster1 suffered a hard error.
ad6: READ command timeout tag=0 serv=0 - resetting
ad6: trying fallback to PIO mode
ata3: resetting devices .. done
ad6: hard error reading fsbn 1116119 of 0-7 (ad6 bn 1116119; cn 1107 tn 4 sn 11)\\
status=59 error=40
ar0: WARNING - mirror lost
使用 &man.atacontrol.8;,查看更多的信息:
&prompt.root; atacontrol list
ATA channel 0:
Master: no device present
Slave: acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0
ATA channel 1:
Master: no device present
Slave: no device present
ATA channel 2:
Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
Slave: no device present
ATA channel 3:
Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
Slave: no device present
&prompt.root; atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
首先您应将包含故障盘的 ata 通道卸下,
以便安全地将其拆除:
&prompt.root; atacontrol detach ata3
换上磁盘
重新挂接 ata 通道:
&prompt.root; atacontrol attach ata3
Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
Slave: no device present
将新盘作为热备盘加入阵列:
&prompt.root; atacontrol addspare ar0 ad6
重建阵列:
&prompt.root; atacontrol rebuild ar0
可以通过下面的命令来查看进度:
&prompt.root; dmesg | tail -10
[output removed]
ad6: removed from configuration
ad6: deleted from ar0 disk1
ad6: inserted into ar0 disk1 as spare
&prompt.root; atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
等待操作完成。
Marc
Fonvieille
Contributed by
USB 存储设备
USB
disks
到目前为止,有许多外部外部存储解决方案,
例如:通用串行总线 (USB):硬盘、USB thumbdrives、CD-R burners
等等。 &os; 为这些设备提供了支持。
配置
USB 大容量存储设备驱动,在 &man.umass.4;,
中提供了对 USB 存储设备的支持。如果您使用
GENERIC 内核,您不必要改变配置文件里的任何内容。
如果您使用了定制的内核,就要确定下面的行出现在您的内核配置文件里:
device scbus
device da
device pass
device uhci
device ohci
device usb
device umass
&man.umass.4; 驱动程序使用 SCSI 子系统来访问 USB 存储设备,
您的 USB 设备将被系统看成为一个 SCSI 设备。依靠您主板上的 USB 芯片,
您只须选择 device
uhci 或 device ohci 二者之一即可,
但是两者都加入内核配置文件当中也没有坏外。
不要忘了如果您加入了上面的几行要重新编译和安装内核。
如果您的 USB 设备是一个 CD-R 或 DVD 刻录机, SCSI CD-ROM
驱动程序, &man.cd.4;, 就必须加入内核中通过下面这行:
device cd
由于刻录机被视为 SCSI 设备, 因此, 不应该在内核配置文件中使用
&man.atapicam.4; 驱动程序。
在 &os; 中已经提供了对 USB 2.0 控制器的内建支持;
然而, 您必须在编译内核时在配置中加入:
device ehci
注意, 如果需要 USB 1.X 的支持, 您仍需要使用
&man.uhci.4; 和 &man.ohci.4; 驱动程序。
测试配置
配置好后准备进行测试:插入您的 USB 设备,
在系统信息中 (&man.dmesg.8;), 应该会出现像下面的设备:
umass0: USB Solid state disk, rev 1.10/1.00, addr 2
GEOM: create disk da0 dp=0xc2d74850
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)
当然啦,商标,设备标识
(da0) 和其它的细节信息会根据您的配置不同
而有所不同。
因为 USB 设备被看作 SCSI 设备中的一个,
camcontrol 命令也能够用来列出
USB 存储设备和系统的关联:
&prompt.root; camcontrol devlist
<Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0)
如果设备上已经包含了文件系统, 现在应该就可以挂接它了。 如果需要,
请参阅 来了解如何在 USB驱动器上格式化和创建分区。
如果希望设备能够被普通用户挂接,
还需要做一些其它操作。 首先, 在 USB 存储设备连接到计算机上时,
系统自动生成的设备文件, 必须是该用户能够读写的。
一种做法是让所有属于 operator 组的用户都可以访问该设备。
要完成这项工作, 首先需要用 &man.pw.8; 来给用户指定组。 其次,
在生成设备文件时, operator 组应能读写它们。 这可以通过在
/etc/devfs.rules 中增加一些相应的设置来实现:
[localrules=1]
add path 'da*' mode 0660 group operator
如果系统中已经有其它 SCSI 磁盘, 则上述操作必须做一些变化。
例如, 如果系统中已经存在了设备名为 da0 到
da2 的磁盘, 则第二行应改为:
add path 'da[3-9]*' mode 0660 group operator
这会将系统中已经存在的磁盘, 排除在属于 operator
组的设备之外。
另外, 您还需要在 /etc/rc.conf 文件中,
启用 &man.devfs.rules.5; 规则集:
devfs_system_ruleset="localrules"
接下来, 需要配置内核, 令普通用户能够挂接文件系统。
最简单的方法是将下面的配置加入到
/etc/sysctl.conf:
vfs.usermount=1
注意, 这个设置只有在下次重启系统时才会生效。
另外, 您也可以使用 &man.sysctl.8; 来设置这个变量。
最后一步是创建将要挂接文件系统的目录。
这个目录必须是属于将要挂接文件系统的用户的。
以 root 身份为用户建立属于该用户的
/mnt/$USER
(此处 $USER 应替换成用户的登录名):
&prompt.root; mkdir /mnt/$USER
&prompt.root; chown $USER:$USER /mnt/$USER
假设已经插入了一个 USB 读卡设备, 并且系统将其识别为
/dev/da0s1, 由于这些设备通常是 FAT
文件系统, 用户可以这样挂接它们:
&prompt.user; mount -t msdosfs -m 644 -M 755 /dev/da0s1 /mnt/$USER
如果拔出设备 (必须首先将其对应的磁盘卷卸下),
则您会在系统消息缓冲区中看到类似下面的信息:
umass0: at uhub0 port 1 (addr 2) disconnected
(da0:umass-sim0:0:0:0): lost device
(da0:umass-sim0:0:0:0): removing device entry
GEOM: destroy disk da0 dp=0xc2d74850
umass0: detached
深入阅读
除了 Adding
Disks 和 Mounting and
Unmounting File Systems 章之外,阅读
&man.umass.4;, &man.camcontrol.8;, 和 &man.usbdevs.8;
也是很有益的。
Mike
Meyer
Contributed by
创建和使用光学介质(CD)
CDROMs
creating
介绍
CD 与普通的磁盘相比有很多不同的特性。最初它们是不能被用户写入的。
由于没有磁头和磁道移动时的延迟,所以它们可以连续的进行读取。
方便的在两个系统之间进行数据的传输,比起相同大小的存储介质来说。
CD 有磁道,这关系到数据读取时的连续性而不是物理磁盘的性能。
要在 FreeBSD 中制作一个 CD,您要准备好要写到 CD 上的数据文件,
然后根据每个 tracks 写入到 CD。
ISO 9660
文件系统
ISO 9660
ISO 9660 文件系统被设计用来处理这些差异。
但令人遗憾的是, 它也有一些其他文件系统所没有的限制, 不过幸运的是,
它提供了一项扩展机制, 使得正确写入的 CD 能够超越这些限制,
而又能在不支持这些扩展的系统上正常使用。
sysutils/cdrtools
sysutils/
port 包括了 &man.mkisofs.8;, 这是一个可以用来生成包含 ISO 9660 文件系统的数据文件的程序。
他也提供了对于一些扩展的支持选项,下面将详细介绍。
CD burner (刻录机)
ATAPI
使用哪个工具来刻录 CD 取决于您的 CD 刻录机是 ATAPI 的,
还是其他类型的。 对于 ATAPI CD 刻录机, 可以使用基本系统附带的 burncd 程序。 SCSI 和 USB CD
刻录机, 则需要配合
cdrecord 程序使用,
它可以通过 sysutils/cdrtools port
安装。 除此之外, 在 ATAPI 接口的刻录机上, 也可以配合 ATAPI/CAM 模块 来使用 cdrecord 以及其它为 SCSI
刻录机撰写的工具。
如果您想使用带图形界面的 CD 刻录软件,
可以考虑一下
X-CD-Roast 或
K3b。 这些工具可以通过使用预编译安装包,
或通过 sysutils/xcdroast 和 sysutils/k3b ports 来安装。
X-CD-Roast 和
K3b 需要 ATAPI/CAM 模块 配合 ATAPI
硬件。
mkisofs
&man.mkisofs.8; 程序作为
sysutils/cdrtools port 的一部分,
将生成 ISO 9660 文件系统,其中包含 &unix; 命名空间中的文件名。
最简单的用法是:
&prompt.root; mkisofs -o imagefile.iso /path/to/tree
文件系统
ISO 9660
这个命令将创建一个包含 ISO9660 文件系统的 imagefile.iso
文件,它是目录树 /path/to/tree 的一个副本。 在处理过程中,
它将文件名称映射为标准的 ISO9660 文件系统的文件名,将排除那些不典型的 ISO
文件系统的文件。
文件系统
HFS
文件系统
Joliet
有很多选项能够用来克服那些限制。特别的, 选项能够启用
Rock Ridge 扩展一般的 &unix; 系统, 选项能启用用于
Microsoft 系统的 Joliet 扩展, 选项能用来创建用于
&macos; 系统的 HFS 文件系统。
对于那些即将要在 FreeBSD 系统中使用 CD 的人来说,
选项能用来消除所有文件名的限制。当使用 选项时,它会产生一个
文件系统映像,它与您从那儿启动 FreeBSD 树是一样的,虽然它在许多方面也违反了
ISO 9660 的标准。
CDROMs
创建启动光盘
最后一个常用的选项是 。
它用来指定启动映像的位置, 用以生成
El Torito
启动 CD。 这个选项使用一个参数,
用以指定将写入 CD 的目录的根。 默认情况下, &man.mkisofs.8;
会以常说的 软盘模拟
方式来创建 ISO,
因此它希望引导映像文件的尺寸恰好是 1200, 1440 或
2880 KB。 某些引导加载器, 例如
FreeBSD 发行版磁盘, 并不使用模拟模式; 这种情况下,
需要使用 选项。 因此, 如果
/tmp/myboot 是一个包含了启动映像文件
/tmp/myboot/boot/cdboot 的可引导的
FreeBSD 系统, 您就可以使用下面的命令生成 ISO 9660 文件系统映像
/tmp/bootable.iso:
&prompt.root; mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
完成这些工作之后, 如果您的内核中配置了 md,
就可以用下列命令来挂接文件系统了:
&prompt.root; mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
&prompt.root; mount -t cd9660 /dev/md0 /mnt
可以发现 /mnt 和 /tmp/myboot
是一样的。
还可以使用 &man.mkisofs.8;
的其它选项来调整它的行为。特别是修改 ISO 9660 的划分格式,创建 Joliet
和 HFS 格式的磁盘。查看 &man.mkisofs.8; 联机手册得到更多的帮助。
burncd
CDROMs
burning
如果用的是 ATAPI 的 CD 刻录机,可以使用 burncd
命令来刻录您的 CD ISO 映像文件。 burncd 命令是基本
系统的一部分,中以使用 /usr/sbin/burncd 来安装。
用法如下:
&prompt.root; burncd -f cddevice data imagefile.iso fixate
在 cddevice 上刻录一份
imagefile.iso 的副本。
默认的设备是
/dev/acd0。
请参考 &man.burncd.8; 以了解设置写入速度的参数,如何在刻录完成之后自动弹出CD,以及刻录音频数据。
cdrecord
如果没有一个 ATAPI CD 刻录机,必须使用 cdrecord
来刻录您的 CD 。 cdrecord 不是基本系统的一部分;必须
从 sysutils/cdrtools 或适当的
package 安装它。基本系统的变化可能会引起这个程序的错误。可能是由
coaster
引起的。当升级系统时,同时需要升级 port,
或者如果您 使用 -STABLE,
那么在升级到新版本时也要升级 port。
cdrecord 有许多选项,基本用法与 burncd
相似。刻录一个 ISO 9660 映像文件只需这样做:
&prompt.root; cdrecord dev=device imagefile.iso
使用 cdrecord 的比较巧妙的方法是找到使用的
。要找到正确的设置,可以使用 cdrecord
的 标记,这会产生这样的结果:
CDROMs
burning
&prompt.root; cdrecord -scanbus
Cdrecord-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling
Using libscg version 'schily-0.1'
scsibus0:
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
0,2,0 2) *
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100) *
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
1,7,0 107) *
这个列表列出了设备的的适当的 值。找到您的
CD burner ,使用三个用逗号分隔的数值来表示 .在
这个例子中,CRW 是 ,所以正确的输入应是
dev=1,5,0 。有一个很容易的方法可以指定这个值;看看 &man.cdrecord.1;
的介绍了解有关音轨,控制速度和其他的东西。
复制音频 CD
您可以这样复制 CD,把 CD 上面的音频数据解压缩出一系列的文件,
再把这些文件写到一张空白 CD 上。
这个过程对于 ATAPI 和 SCSI 驱动器来说有些微的不同。
SCSI 驱动器
使用 cdda2wav 来解压缩音频。
&prompt.user; cdda2wav -v255 -D2,0 -B -Owav
使用 cdrecord 来写
.wav 文件。
&prompt.user; cdrecord -v dev=2,0 -dao -useinfo *.wav
确保 2,0 被适当地设置了,
具体方法在 中有所描述。
ATAPI 驱动器
ATAPI CD 驱动用
/dev/acddtnn表示每个轨道,
这里 d 是驱动器号,
nn 是轨道号,由两位小数位组成,省略前缀零。
所以第一个盘片上的第一个轨道就是
/dev/acd0t01,第二个就是
/dev/acd0t02,第三个就是
/dev/acd0t03,等等。
请务必确认在
/dev 中出现了对应的文件。
如果您发现有某些项目缺失, 则应强制系统重新识别介质:
&prompt.root; dd if=/dev/acd0 of=/dev/null count=1
使用 &man.dd.1; 解压缩每个轨道。当解压缩文件的时候您也必须使用
一个特殊的块大小。
&prompt.root; dd if=/dev/acd0t01 of=track1.cdr bs=2352
&prompt.root; dd if=/dev/acd0t02 of=track2.cdr bs=2352
...
使用
burncd 把解压缩的文件刻录到光盘上。您必须指定
这些文件是音频文件,这样 burncd 会在刻录完成时
结束光盘。
&prompt.root; burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
复制数据 CD
您可以把数据 CD 复制成一个与之等价的映像文件,
可以使用 &man.mkisofs.8; 创建这种文件,
或使用它来复制任何数据 CD。 这里给出的例子假定您的 CDROM
设备是 acd0, 您应将其替换为您实际使用的 CDROM 设备。
&prompt.root; dd if=/dev/acd0 of=file.iso bs=2048
现在您有一个映像文件了,您可以像上面描述的那样把它刻录成 CD。
使用数据 CD
现在您已经创建了一张标准的数据 CDROM,您或许想要
挂载来读取上面的设备。
默认情况下,&man.mount.8; 假定文件系统是
ufs 类型的。如果您尝试下面的命令:
&prompt.root; mount /dev/cd0 /mnt
您会得到一条 Incorrect super
block 的错误信息,没有挂载成功。CDROM 不是
UFS 文件系统,所以试图这样挂载它是
是不行的。您需要告诉 &man.mount.8;
文件系统是 ISO9660 类型的,这样
就可以了。只需要指定 &man.mount.8; 的
选项。例如,
如果您想要挂载 CDROM 设备,
/dev/cd0 到
/mnt 目录,您需要执行:
&prompt.root; mount -t cd9660 /dev/cd0 /mnt
注意您的设备名
(在这个例子中是 /dev/cd0)可能
有所不同,取决于您的 CDROM 使用的接口。另外,
选项等同于执行
&man.mount.cd9660.8;。上面的例子可以缩短
为:
&prompt.root; mount_cd9660 /dev/cd0 /mnt
用这种方法您基本可以使用任何买到的数据 CDROM。
然而某些有 ISO 9660 扩展的光盘可能会行为古怪。
例如,joliet 光盘用两个字节的 unicode 字符存储所有的文件名。
FreeBSD 内核并不使用 Unicode, 但 &os; CD9660 驱动可以将
Unicode 字符自动转换为内核可以识别的形式。 如果您发现有些非英文字符显示为问号,
就绪要使用 选项来指定字符集了。
欲了解进一步的详情, 请参见联机手册 &man.mount.cd9660.8;。
如果希望通过 选项来进行字符集转换,
则内核会需要加载 cd9660_iconv.ko 模块。 这项工作可以通过在
loader.conf 中加入下列配置:
cd9660_iconv_load="YES"
并重新启动计算机来完成, 除此之外, 也可以通过 &man.kldload.8; 来手动加载。
有时候,当您试图挂载 CDROM 的时候,会得到一条 Device not
configured 的错误信息。这通常
表明 CDROM 驱动认为托盘里没有光盘,
或者驱动器在总线上不可见。
需要几秒钟时间等待 CDROM 驱动器辨别已经接到反馈的信息,
请耐心等待。
有时候,SCSI CDROM 可能会找不到,因为没有足够的
时间来应答总线的 reset 信号。如果您有一个 SCSI
CDROM 请将下面的选项添加到您的内核
配置文件并重建您的内核。
options SCSI_DELAY=15000
这个告诉您的 SCSI 总线启动时暂停 15 秒钟,
给您的 CDROM 驱动器足够的机会来应答
总线 reset 信号。
刻录原始数据 CD
您可以选择把一个文件目录刻录到 CD 上而不用
创建 ISO 9660 文件系统。有些人这么做是为了备份的
目的。这个运行的比刻录一个标准 CD 速度要快得多:
&prompt.root; burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate
要重新找回这样刻录到 CD 上的数据,
您必须从原始设备节点读取数据:
&prompt.root; tar xzvf /dev/acd1
您不能像挂载一个通常的 CDROM 一样挂载这张光盘。
这样的 CDROM 也不能在除了 FreeBSD 之外的任何操作系统上读出。
如果您想要可以挂载 CD,或者
和另一种操作系统共享数据,您必须像上面描述的那样使用
&man.mkisofs.8;。
Marc
Fonvieille
Contributed by
CD burner
ATAPI/CAM driver
使用 ATAPI/CAM 驱动
这个驱动允许 ATAPI 设备(CD-ROM, CD-RW, DVD
驱动器等...)通过 SCSI 子系统访问,
这样允许使用像 sysutils/cdrdao 或者
&man.cdrecord.1; 这样的程序。
要使用这个驱动, 您需要把下面这行添加到 /boot/loader.conf
文件中:
atapicam_load="YES"
接下来, 重新启动计算机。
如果您希望将 &man.atapicam.4; 以静态联编的形式加入内核,
则需要在内核配置文件中加入这行:
device atapicam
此外还需要在内核配置文件中加入:
device ata
device scbus
device cd
device pass
这些应该已经有了。 然后, 重新联编并安装新内核,
并重新启动计算机。
在引导过程中, 您的刻录机将会出现在内核的提示信息中,
就像这样:
acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4
cd0 at ata1 bus 0 target 0 lun 0
cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device
cd0: 16.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
驱动器现在可以通过
/dev/cd0 设备名访问了,例如要
挂载 CD-ROM 到 /mnt,只需要键入下面的
命令:
&prompt.root; mount -t cd9660 /dev/cd0 /mnt
作为 root,您可以运行下面的
命令来得到刻录机的 SCSI 地址:
&prompt.root; camcontrol devlist
<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)
这样 1,0,0 就是 SCSI 地址了,可以被
&man.cdrecord.1; 和其他的 SCSI 程序使用。
有关 ATAPI/CAM 和 SCSI 系统的更多信息,
可以参阅 &man.atapicam.4; 和 &man.cam.4; 手册
页。
Marc
Fonvieille
Contributed by
Andy
Polyakov
With inputs from
创建和使用光学介质(DVD)
DVD
burning
介绍
和 CD 相比,DVD 是下一代光学存储介质技术。
DVD 可以容纳比任何 CD 更多的数据,已经成为现今视频出版业的标准。
我们称作可记录 DVD 的有五种物理记录格式:
DVD-R:这是第一种可用的 DVD 可记录格式。
DVD-R 标准由 DVD Forum 定义。
这种格式是一次可写的。
DVD-RW:这是 DVD-R 标准的可覆写版本。
一张 DVD-RW 可以被覆写大约 1000
次。
DVD-RAM:这也是一种被 DVD Forum 所支持的可覆写格式。
DVD-RAM 可以被看作一种可移动硬盘。
然而,这种介质和大部分
DVD-ROM 驱动器以及 DVD-Video 播放器不兼容;
只有少数 DVD 刻录机支持 DVD-RAM。
请参阅
以了解关于如何使用 DVD-RAM 的进一步详情。
DVD+RW:这是一种由
DVD+RW
Alliance 定义的可覆写格式。一张 DVD+RW 可以被覆写大约 1000
次。
DVD+R:这种格式是 DVD+RW 格式的一次可写变种。
一张单层的可记录 DVD 可以存储
4,700,000,000 字节,相当于 4.38 GB 或者说
4485 MB (1 千字节等于 1024 字节)。
必须说明一下物理介质与应用程序的分歧。
例如 DVD-Video 是一种特殊的文件系统,
可以被覆写到任何可记录的 DVD 物理介质上:
DVD-R、DVD+R、DVD-RW 等等。在选择介质类型之前,
您一定要确认刻录机和
DVD-Video 播放器 (一种单独的播放器或者计算机上的 DVD-ROM 驱动器)
是和这种介质兼容的。
配置
&man.growisofs.1; 将被用来实施 DVD
刻录。 这个命令是
dvd+rw-tools 工具集 (sysutils/dvd+rw-tools) 的一部分。
dvd+rw-tools 支持所有的 DVD 介质类型。
这些工具将使用 SCSI 子系统来访问设备,因此
ATAPI/CAM 支持 必须加入内核。
如果您的刻录机采用 USB 接口则不需要这么做,请参考
来了解 USB
设备配置的进一步详情。
此外,还需要启用 ATAPI 设备的 DMA 支持。 这一工作可以通过在
/boot/loader.conf 文件中加入下面的行来完成:
hw.ata.atapi_dma="1"
试图使用
dvd+rw-tools 之前您应该参考
dvd+rw-tools
硬件兼容性列表 是否有与您的 DVD 刻录机有关的信息。
如果您想要一个图形化的用户界面,您应该看一看
K3b (sysutils/k3b),它提供了
&man.growisofs.1; 的一个友好界面和许多其他刻录工具。
刻录数据 DVD
&man.growisofs.1; 命令是 mkisofs 的前端,它会调用
&man.mkisofs.8; 来创建文件系统布局,完成到 DVD 上的刻录。
这意味着您不需要在刻录之前创建数据映像。
要把 /path/to/data 目录的数据刻录到 DVD+R
或者 DVD-R 上面,使用下面的命令:
&prompt.root; growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data
选项传递给
&man.mkisofs.8; 用于文件系统创建 (这表示创建带有带有
joliet 和 Rock Ridge 扩展的 ISO 9660 文件系统),
参考 &man.mkisofs.8; 联机手册了解更多细节。
选项 用来在任何情况下初始刻录会话:
不管多会话与否。
DVD 设备,/dev/cd0,
必须依照您的配置做出改变。
参数会结束光盘,
光盘成为不可附加的。这会提供更多的和
DVD-ROM 驱动器的介质兼容性。
也可以刻录成一个 pre-mastered 映像,
例如记录一个映像文件
imagefile.iso, 我们可以运行:
&prompt.root; growisofs -dvd-compat -Z /dev/cd0=imagefile.iso
刻录的速度可以被检测到并自动进行调整,
根据介质和驱动器的使用情况。如果您想强制改变速度,
可以使用
参数。更多的信息,请看 &man.growisofs.1;
联机手册。
DVD
DVD-Video
刻录 DVD-Video
DVD-Video 是一种特殊的基于 ISO 9660
和 micro-UDF (M-UDF) 规范的文件系统。 DVD-Video
也呈现了一个特殊的数据格式,
这就是为什么您需要一个特殊的程序像 multimedia/dvdauthor 来制作
DVD 的原因。
如果您已经有了 DVD-Video 文件系统的映像,
就可以以同样的方式制作另一个映像,可以参看前面章节的例子。
如果您想制作 DVD 并想放在特定的目录中,如在目录
/path/to/video 中,
可以使用下面的命令来刻录 DVD-Video:
&prompt.root; growisofs -Z /dev/cd0 -dvd-video /path/to/video
选项将传递给
&man.mkisofs.8; 并指示它创建一个 DVD-Video 文件系统布局。
除此之外。 选项也包含了
&man.growisofs.1;
选项。
DVD
DVD+RW
使用 DVD+RW
不像 CD-RW, 一个空白的 DVD+RW 在每一次使用前必须先格式化。
&man.growisofs.1; 程序将会适时的自动对其进行适当的处理,
这是 recommended 的方式。您也可以使用
dvd+rw-format 来对 DVD+RW 进行格式化:
&prompt.root; dvd+rw-format /dev/cd0
您只需要执行这样的操作一次,牢记只有空白的
DVD+RW 介质才需要格式化。您可以以前面章节同样的方式来刻录
DVD+RW。
如果您想刻录新的数据 (刻录一个新的完整的文件系统
而不仅仅是追加一些数据) 到 DVD+RW,您不必再将其格式化成空白盘,
您只须要直接覆盖掉以前的记录即可。
(执行一个新的初始化对话), 像这样:
&prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/newdata
DVD+RW 格式化程序为简单的向以前的记录追加数据提供了可能性。
这个操作有一个新的会话和一个已经存在的会话合并而成。
它不需要多个写会话过程,
&man.growisofs.1; 将在介质上 增加
ISO 9660 文件系统。
例如,我们想追加一些数据到到我们以前的
DVD+RW 上,我们可以使用下面的命令:
&prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata
在以后的写操作时, 应使用与最初的刻录会话时相同的 &man.mkisofs.8;
选项。
如果您想获得与 DVD-ROM 驱动更好的兼容性,可以使用
选项。 在 DVD+RW 这种情况下, 这样做并不妨碍您添加数据。
如果出于某种原因您真的想要空白介质盘,
可以执行下面的命令:
&prompt.root; growisofs -Z /dev/cd0=/dev/zero
DVD
DVD-RW
使用 DVD-RW
DVD-RW 接受两种光盘格式:增补顺序写入和受限式覆写。默认的
DVD-RW 盘是顺序写入格式。
空白的 DVD-RW 能够直接进行刻录而不需要格式化操作,
然而非空的顺序写入格式的 DVD-RW 需要格式化才能写入新的初始区段。
要格式化一张 DVD-RW 为顺序写入模式,运行:
&prompt.root; dvd+rw-format -blank=full /dev/cd0
一次完全的格式化 ()
在 1x 倍速的介质上将会花费大约 1 个小时。快速格式化可以使用
选项来进行,如果
DVD-RW 要以 Disk-At-Once (DAO) 模式刻录的话。要以
DAO 模式刻录 DVD-RW,使用命令:
&prompt.root; growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso
选项不是必需的,
因为 &man.growisofs.1; 试图最低限度的检测 (快速格式化) 介质并进行
DAO 写入。
事实上对于任何 DVD-RW 都应该使用受限式覆写模式,
这种格式比默认的增补顺序写入更加灵活。
在一张顺序 DVD-RW 上写入数据,使用和其他 DVD 格式相同的指令:
&prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/data
如果您想在您以前的刻录上附加数据,您必须使用
&man.growisofs.1; 的 选项。然而,
如果您在一张增补顺序写入模式的 DVD-RW 上附加数据,
将会在盘上创建一个新的区段,结果就是一张多区段光盘。
受限式覆写格式的 DVD-RW 在新的初始化区段前不需要格式化,
您只是要用 选项覆写光盘,这和
DVD+RW 的情形是相似的。也可以用和 DVD+RW 同样方式的
选项把现存的 ISO 9660 文件系统写入光盘。
结果会是一张单区段 DVD。
要把 DVD-RW 置于受限式覆写格式,
必须使用下面的命令:
&prompt.root; dvd+rw-format /dev/cd0
更改回顺序写入模式使用:
&prompt.root; dvd+rw-format -blank=full /dev/cd0
多区段
几乎没有哪个 DVD-ROM 驱动器支持多区段
DVD,它们大多数时候都只读取第一个区段。
顺序写入格式的 DVD+R、DVD-R 和 DVD-RW 可以支持多区段,
DVD+RW 和 DVD-RW 受限式覆写格式不存在多区段的概念。
在 DVD+R、DVD-R 或者 DVD-RW 的顺序写入格式下,
一次初始化 (未关闭) 区段之后使用下面的命令,
将会在光盘上添加一个新的区段:
&prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdata
对 DVD+RW 或者 DVD-RW 在受限式覆写模式下使用这条命令,
会合并新区段到存在的区段中来附加数据。
结果就是一张单区段光盘。
这是在这些介质上用于在最初的写操作之后添加数据的方式。
介质上的一些空间用于区段之间区段的开始与结束。
因此,应该用大量的数据添加区段来优化介质空间。
对于 DVD+R 来说区段的数量限制为 154,
对于 DVD-R 来说大约是 2000,对于双层 DVD+R 来说是 127。
更多的信息
要获得更多的关于 DVD 的信息
dvd+rw-mediainfo
/dev/cd0 命令可以运行来获得
更多的信息。
更多的关于
dvd+rw-tools 的信息可以在
&man.growisofs.1; 联机手册找到,在 dvd+rw-tools
web site 和 cdwrite mailing
list 联接中也可找到。
dvd+rw-mediainfo 命令的输出结果记录,
以及介质的问题会被用来做问题报告。 如果没有这些输出,
就很难帮您解决问题。
使用 DVD-RAM
DVD
DVD-RAM
配置
DVD-RAM 刻录机通常使用 SCSI 或 ATAPI
两种接口之一。 对于 ATAPI 设备, DMA 传输模式必须手工启用。
这一工作可以通过在
/boot/loader.conf 文件中增加下述配置来完成:
hw.ata.atapi_dma="1"
初始化介质
如本章前面的介绍所言,
DVD-RAM 可以视为一移动硬盘。 与任何其它型号的移动硬盘类似,
首次使用它之前, 应首先 初始化
DVD-RAM。
在下面的例子中, 我们将在全部空间上使用标准的 UFS2 文件系统:
&prompt.root; dd if=/dev/zero of=/dev/acd0 bs=2k count=1
&prompt.root; bsdlabel -Bw acd0
&prompt.root; newfs /dev/acd0
您应根据实际情况将 acd0 改为您所使用的设备名。
使用介质
一旦您在 DVD-RAM 上完成了前面的操作,
就可以像普通的硬盘一样挂接它了:
&prompt.root; mount /dev/acd0 /mnt
然后就可以正常地对 DVD-RAM 进行读写了。
Julio
Merino
原作
Martin
Karlsson
重写
创建和使用软盘
把数据存储在软盘上有时也是十分有用的。
例如, 在没有其它可靠的存储介质,
或只需将少量数据传到其他计算机时。
这一章将介绍怎样在 FreeBSD 上使用软盘。
在使用 DOS 3.5 英寸软盘时首要要涉及的就是格式化,
但其概念与其它的软盘格式化极为类似。
格式化软盘
设备
软盘的访问像其它设备一样是通过在
/dev 中的条目来实现的。
直接访问软盘时, 只需简单地使用
/dev/fdN 来表示。
格式化
一张软盘在使用这前必须先被低级格式化。
通常卖主已经做过了,但格式化是检测介质完整性的一种好方法。
尽管这有可能会强取大量(或少量)的硬盘大小,但
大部分磁盘都能被格式化设计为 1440kB 。
低级格式化软盘你需要使用
&man.fdformat.1; 命令。这个程序需要设备名作为参数。
要留意一切错误信息,这些信息能够帮助你确定
磁盘的好与坏。
软盘的格式化
使用
/dev/fdN
设备来格式化软盘。插入一张新的 3.5 英寸的软盘在你的设备中:
&prompt.root; /usr/sbin/fdformat -f 1440 /dev/fd0
磁盘标签
经过低级格式化后, 你需要给它分配一个标签。
这个磁盘标签以后会被删去, 但系统需要使用它来确定磁盘的尺寸。
新的磁盘标签将会接管整个磁盘,会包括所有合适的关于软盘的 geometry 信息。
磁盘标签的 geometry 值列在
/etc/disktab中。
现在可以用下面的方法来使用 &man.bsdlabel.8; 了:
&prompt.root; /sbin/bsdlabel -B -w /dev/fd0 fd1440
文件系统
现在对软盘进行高级格式化。
这会在它上面安置一个新的文件系统,可使 FreeBSD 来对它进行读写。
在创建完新的文件系统后,磁盘标签将被消毁,所以如果你想重新格式化磁盘,
你必须重新创建磁盘标签。
软盘的文件系统可以选择 UFS 或 FAT 。
FAT 是通常情况下软盘比较好的选择。
要制作新的文件系统在软盘上,可以使用下面的命令:
&prompt.root; /sbin/newfs_msdos /dev/fd0
现在磁盘已经可以进行读取和使用。
使用软盘
要使用软盘,需要先使用 &man.mount.msdosfs.8; 挂接它。
除此之外, 也可以使用在 ports 套件中的
emulators/mtools 程序。
用磁带机备份
tape media
主流的磁带机有 4mm, 8mm, QIC, mini-cartridge 和 DLT。
4mm (DDS: Digital Data Storage)
tape media
DDS (4mm) tapes
tape media
QIC tapes
4mm 磁带机正在逐步取代 QIC 成为工作站备份数据的首选设备。
在 Conner 收购了 QIC 磁带机领域领先的制造商 Archive 之后不久,
即不再生产这种磁带机, 这使得这一趋势变得愈加明显。
4mm 的驱动器更加小和安静,但对于数据保存的可靠性仍不及 8mm
驱动器。它要比 8mm 的便宜和小得多 (3 x 2 x 0.5 inches, 76 x 51
x 12 mm) 。和 8mm 的一样,读写关的寿命都不长,因为它们同样使用螺旋式
的方式来读写。
这些设备的数据传输的速度约在 ~150 kB/s 到 ~500 kB/s 之间,
存储空间从 1.3 GB 到 2.0 GB 之间,硬件压缩可使空间加倍。磁带库
单元可以有 6 台磁带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜,
磁带库的容量可达 240 GB 。
DDS-3 标准现在支持的磁带机容量最高可达到 12 GB (或压缩的 24 GB )。
4mm 和 8mm 同样都使用螺旋式读写的方式,所有螺旋式读写的优点及缺点,
都可以在 4mm 和 8mm 磁带机上看到。
磁带在经过 2,000 次的使用或 100 次的全部备份后,就该退休了。
8mm (Exabyte)
tape media
Exabyte (8mm) tapes
8mm 磁带机是最常见的 SCSI 磁带机,也是磁带交换的最佳选择。几乎每个
工作站都有一台 2 GB 8mm 磁带机。8mm 磁带机可信度高、方便、安静。
卡匣小 (4.8 x 3.3 x 0.6 inches; 122 x 84 x 15 mm)而且不贵。8mm 磁带机
的下边是一个短短的读写头,而读写头的寿命取决于磁带经过读写头时,相对高
速运动情况。
数据传输速度约在 250 kB/s 到 500 kB/s 之间,可存储的空间从
300 MB 到 7 GB,硬件压缩可使空间加倍。磁带库单元可以有 6 台磁
带机,120 个磁带匣,以自动切换的方式使用同一个磁带柜,磁带库的容量可达
840+ GB。
Exabyte Mammoth
模型支持 12 GB 的容量在一个磁带
上(压缩后可达 24 GB )相当于普通磁带的二倍。
数据是使用螺旋式读写的方式记录在磁带上的,读写头和磁带约相差 6 度,
磁带以 270 度缠绕着轴,并抵住读写头,轴适时地旋转,使得磁带具有高密度,
从一端到另一端并可使磁道紧密地分布。
QIC
tape media
QIC-150
QIC-150 磁带和磁带机可能是最常见的磁带机和介质了。
QIC 磁带机是最便宜的 正规
备份设备。
它的缺点在于介质的价格较高。 QIC 磁带要比 8mm 或 4mm 磁带贵,
每 GB 的数据存储价格可能最高高出 5 倍。 但是,
如果您的需求能够为半打磁带所满足的话, 那么 QIC
可能是明智之选。 QIC 是
最 常见的磁带机。 每个站点都会有某种密度的 QIC。
这有时是一种麻烦, QIC 有很多在外观上相似(有时一样),但是密度不同的磁带。
QIC 磁带机噪音很大。
它们在寻址以及读写时都会发出声音。 QIC 磁带的规格是 6 x 4 x 0.7 英寸
(152 x 102 x 17 毫米)。
数据传输的速度介于 150 kB/s 到 500 kB/s 之间,可存储的空间
从 40 MB 到 15 GB。较新的 QIC 磁带机具有硬件压缩的功能。 QIC
的使用率愈来愈低,渐渐被 DAT 所取代。
数据以磁道的方式记录在磁带上,磁道数及磁道的宽度会根据容量而有所不同。
通常新的磁带机具有的向后兼容的读取功能(通常也具备写入的功能)。对于数据
的安全性,QIC 具有不错的评价。
磁带机在经过 5,000 次的使用后,就该退休了。
DLT
tape media
DLT
在这一章列出的磁带机中 DLT 具有最快的数据传输率。 1/2" (12.5mm) 的
磁带包含在单轴的磁带匣 (4 x 4 x 1 inches; 100 x 100 x 25 mm)中。磁带匣
的一边是一个旋转匣道,通过匣道的开合,可以让磁带卷动。磁带匣内只有一个
轴,而本章中所提到的其他磁带匣都是有两个轴的(9磁道磁带机例外)。
数据传输的速度约 1.5 MB/s,是 4mm, 8mm, 或 QIC 磁带机的三倍。
可存储的空间从 10 GB 到 20 GB,具有磁带机数据库。磁带机数据库
单元可以有 1 to 20 台磁带机,5 到 900 个磁带匣,磁带机数据库的容量可达
50 GB 到 9 TB 。
如果要压缩的话,DLT 型 IV 格式的磁带机最高可支持 70 GB 的存储
容量。
数据存储在平行于磁带运行方向的磁道上(就像 QIC 磁带),一次写入两个
磁道。读写头的寿命相当长,每当磁带停止前进,磁带与读写头之间没有相对运动。
AIT
tape media
AIT
AIT 是 Sony 开发的一种新格式,每个磁带最高可以存储 50 GB。磁带
机使用内存芯片来保存磁带上的索引内容。这个索引能够被磁带机驱动器快速阅读
来搜索磁带机上文件所处的位置,而不像其他的磁带机需要花几分钟的时间才能找
到文件。像 SAMS:Alexandria 这样的软件:能够操
作四十或者更多的 AIT 磁带库,直接使用内存芯片来进行通信把内容显示在屏幕上,
以决定把什么文件备份到哪个磁带上,加载和恢复数据。
像这样的库成本大概在 $20,000 美元左右,零售市场可能还要贵一点。
第一次使用新的磁带机
当在一块完全空白的磁带上尝试定入数据时,会得到类似下面这样的错误信息:
sa0(ncr1:4:0): NOT READY asc:4,1
sa0(ncr1:4:0): Logical unit is in process of becoming ready
信息指出这块磁带没有块编号 (block 编号为 0)。在 QIC-525 之后的所有 QIC
磁带,都采用 QIC-525 标准,必须写入一个 Identifier Block 。对于这种问题,
有以下两种解决的办法:
用mt fsf 1 可以让磁带机对磁带写入 Identifier Block 。
使用面板上的按钮磁带。
再插入一次,并存储 dump 数据到磁带上。
这时dump 将传回 DUMP: End of tape
detected ,然后您会得到这样的错误信息: HARDWARE
FAILURE info:280 asc:80,96。
这时用 mt rewind 来倒转磁带。
磁带操作的后续操作就完成了。
用软盘备份
能够使用软盘来备份数据吗
backup floppies
floppy disks
软磁盘通常是用来备份的设备中不太合适的设备:
这种设备不太可靠,特别是长期使用。
备份和恢复都很慢
它们只有非常有限的存储容量。
然而,如果没有其它的备份数据的方法,那软盘备份总比没有备份要好。
如果必须使用软盘的话,必须确保盘片的质量。软盘在办公室中使用已经有许多
年了。最好使用一些名牌厂商的产品以确保质量。
如何备份数据到软盘
最好的备份数据到软盘的方法是使用 &man.tar.1; 程序加上 选项,
它可以允许数据备份到多张软盘上。
要备份当前目录中所有的文件可以使用这个命令 (需要有 root权限):
&prompt.root; tar Mcvf /dev/fd0 *
当第一张盘满的时候, &man.tar.1; 会指示您插入下一张盘,插入第二张盘之后就按回车。
Prepare volume #2 for /dev/fd0 and hit return:
这个步骤可能需要重复很多次,直到这些文件备份完成为止。
可以压缩备份吗
tar
gzip
compression
不幸的是,&man.tar.1; 在为多卷文件作备份时是不允许使用
选项的。当然,可以用 &man.gzip.1; 压缩所有的文件,把它们打包到磁盘,以后在用
&man.gunzip.1; 解开。
如何恢复备份
要恢复所有文件:
&prompt.root; tar Mxvf /dev/fd0
有两种方法来恢复软盘中的个别文件。首先,就要用第一张软盘启动:
&prompt.root; tar Mxvf /dev/fd0 filename
&man.tar.1; 程序会提示您插入后面的软盘,直到它找到所需要的文件。
如果您知道哪个文件在哪个盘上,您就可以插入那张盘,然后使用上同同样的命令。
如果软盘上的第一个文件与前面的文件是连续的,那 &man.tar.1; 命令会警告您它无法
恢复,即使您不要求它这样做。
Lowell
Gilbert
原作
备份策略
设计备份计划的第一要务是确认以下问题皆已考虑到:
磁盘故障
文件的意外删除
随机的文件损毁
机器完全损毁 (例如火灾), 包括破坏全部在线备份。
针对上述的每个问题采用完全不同的技术来解决是完全可行的。
除了只包含少量几乎没有价值数据的个人系统之外,
一般来说很少有一种技术能够同时兼顾前面所有的需要。
可以采用的技术包括:
对整个系统的数据进行存档, 备份到永久性的离线介质上。
这种方法实际上能够提供针对前面所有问题的保护, 但这样做通常很慢,
而且恢复时会比较麻烦。 您可以将备份置于近线或在线的状态,
然而恢复文件仍然是一个难题, 特别是对没有特权的那些用户而言。
文件系统快照。 这种技术实际上只对无意中删除文件这一种情况有用,
但在这种情况下它会提供
非常大 的帮助,
而且访问迅速, 操作容易。
直接复制整个文件系统和/或磁盘 (例如周期性地对整个机器做 &man.rsync.1;)。
通常这对于在网络上的单一需求最为适用。 要为磁盘故障提供更为通用的保护,
通常这种方法要逊于 RAID。
对于恢复无意中删除的文件来说, 这种方法基本上与
UFS 快照属于同一层次, 使用哪一个取决于您的喜好。
RAID。 它能够最大限度地减少磁盘故障导致的停机时间。
其代价是需要处理更为频繁的磁盘故障 (因为磁盘的数量增加了),
尽管这类故障不再需要作为非常紧急的事项来处理。
检查文件的指纹。 &man.mtree.8; 工具对于这种操作非常有用。
尽管这并不是一种备份的技术, 但它能够确保您有机会注意到那些您需要求助于离线备份的事情。
这对于离线备份非常重要, 而且应有计划地加以检查。
很容易列举更多的技术, 它们中有许多实际上是前面所列出的方法的变种。
特别的需求通常会需要采用特别的技术 (例如, 备份在线运行的数据库,
往往需要数据库软件提供某种方法来完成中间步骤) 来满足。
最重要的事情是, 一定要了解需要将数据保护起来免受何种风险,
以及发生问题时应该如何处理。
备份程序
有三个主要的备份程序 &man.dump.8;、&man.tar.1; 和 &man.cpio.1;。
Dump 和 Restore
备份软件
dump / restore
dump
restore
dump 和 restore 是 &unix;
传统的备份程序。它以 block 而不是以文件为单位来备份数据、链接或目录。
dump 备份的是设备上的整个文件系统,不能只备份一
一个文件系统的部分或是用到两个以上文件系统的目录树。
dump 不会写文件和目录到磁带机,而是写入包含文件
和目录的原始数据块。
如果在您的 root 目录使用 dump ,将不需要
备份 /home、/usr 或其他目录,
因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。
dump 是最早出现于 AT&T UNIX 的 Version 6 (约 1975)。
默认的参数适用于 9-track 磁带(6250 bpi),所以如果要用高密度的磁带(最高可达
62,182 ftpi),就不能用默认的参数,而要另外指定参数。这些默认值必须在命令行被
修改以更好地利用当前磁带机的功能。
.rhosts
rdump 和 rrestore 可以通过网络在另一
台计算机的磁带机上备份数据。这两个程序都是依靠 &man.rcmd.3; 和
&man.ruserok.3; 来访问远程的磁带机。因此,运行备份的用户必须要有远程
主机的 .rhosts 访问权。rdump 和
rrestore 的参数必须适用于远程主机(例如,当您从 FreeBSD 连到
一台 SUN 工作站 knomodo 去使用磁带机时,使用:
&prompt.root; /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
要注意的是:必须检查您在使用 .rhosts 时的安全情况。
也可以通过使用 ssh 用一个更安全的方式来使用 dump
和 restore 。
通过 ssh 使用 dump
&prompt.root; /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
或使用 dump 的 built-in 方法,
设置环境变量 RSH:
通过设置 ssh 环境变量 RSH 使用 dump
&prompt.root; RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr
tar
备份软件
tar
&man.tar.1; 也同样是在第 6 版 AT&T UNIX
(大约是 1975 前后) 出现的。 tar 对文件系统直接操作;
其作用是把文件和目录写入磁带。 tar 并不支持
&man.cpio.1; 所提供的全部功能, 但也不需要 cpio
所需要使用的诡异的命令行管道。
tar
在 FreeBSD 5.3 和更高版本中, 同时提供了 GNU tar
和默认的 bsdtar。
GNU 的版本可以通过 gtar 来使用。 它通过与
rdump 一样的语法来支持远程设备。
要 tar 到连接在名为
komodo 的 Sun 机器上的
Exabyte 磁带机, 可以使用:
&prompt.root; /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1
您也可以让
bsdtar 通过管道和
rsh 将数据发送到远程的磁带机上。
&prompt.root; tar cf - . | rsh hostname dd of=tape-device obs=20b
如果您担心通过网络备份会有安全问题,应当使用 ssh ,
而不是 rsh。
cpio
backup software
cpio
&man.cpio.1; 是 &unix; 最早用来作文件交换的磁带机程序。它有执行字节
交换的选项,可以用几种不同的格式写入,并且可以将数据用管道传给其他程序。
cpio 没办法自动查找目录树内的文件列表,必须通过标准
输入 stdin 来指定。
cpio
cpio 不支持通过网络的备份方式。可以使用 pipeline 和
rsh 来传送数据给远程的磁带机。
&prompt.root; for f in directory_list; do
find $f >> backup.list
done
&prompt.root; cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device"
这里的 directory_list 是要备份的目录列表,
user@host 结合了将
要执行备份的用户名和主机名,backup_device 是写
入备份的设备(如 /dev/nsa0)。
pax
backup software
pax
pax
POSIX
IEEE
&man.pax.1; 是符合 IEEE/&posix; 标准的程序。多年来各种不同版本
的 tar 和 cpio 间有些不兼容。
为了防止这种情况,并使其标准化,&posix; 出了这套新的工具程序。
pax 尝试可以读写各种 cpio
和 tar 的格式,并可以自己增加新的格式。它的命令
集比 tar 更接近 cpio。
Amanda
backup software
Amanda
Amanda
Amanda (Advanced Maryland
Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统
。一台 Amanda 服务器可以备份任意数量执行
Amanda 的客户机或是将连上 Amanda
服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超
过取行数据的时间,而 Amanda 解决了这个问题。它使用一个
holding disk
来同时备份几个文件系统。 Amanda
建立 archive sets
的一组磁带,用来备份在 Amanda
的配置文件中所列出的完整的文件系统。
Amanda 配置文件提供完整的备份控制及
Amanda 产生的网络传输。 Amanda
可以使用上述任何一个设备程序来向磁带写入数据。Amanda
可以从 port 或 package 取得,它并非系统默认安装的。
Do Nothing 备份策略
Do nothing
不是一个程序,而是被广泛使用的备份策略。
不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题,
忽略它!
如果您的时间和数据不值得您做这些事,那么 Do nothing
将是最好的备份程序。要注意的是,&unix; 是相当好用的工具,您可能在几个月
内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。
Do nothing
对于像 /usr/obj 和其他
可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或
&postscript; 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML
或 &postscript; 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。
哪个备份程序最好?
LISA
在&man.dump.8; 时期 Elizabeth D. Zwicky
测试了所有以上列出的备份程序。在各种各样怪异的文件系统中,
dump 是您明智的选择。Elizabeth 建立起各种各样、
奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份
及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件,
文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在
备份时建立或删除的文件。她将结果刑在: LISA V in Oct. 1991.
See torture-testing
Backup and Archive Programs.
应急恢复程序
在出现灾难前
在遇到灾难前,只需要执行以下四个步骤:
bsdlabel
第一,打出您的每个磁盘驱动器的磁盘标签 (例如:
bsdlabel da0 | lpr),文件系统表,
(/etc/fstab) ,以及所有启动信息,
并将其复制两份。
fix-it floppies
第二,确定遇到的情况时,用来启动及修复的软盘
(boot.flp 和 fixit.flp)
具有您所有的设备代号。最简单的方法是用软盘启动,然后检查启动信息,
如果设备都被列出,并且可以正常使用,就可以跳到第三步。
否则,必须建立两张传统的可启动软盘,并包含:
fdisk, bsdlabel,
newfs, mount, 以及所有使用的
备份程序。这些程序必须被静态的连接。如果使用的是 dump,
那么这张软盘就必须包含 restore。
第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将
磁盘写保护。
第四,测试在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张
可启动的软盘和磁带放在一起。也许您在恢复时会想要,而这份记录将防止您破坏
您的磁带 (怎么说呢?因为您可能将 tar xvf /dev/sa0 打成
tar cvf /dev/sa0 而重写了备份磁带)。
为了安全,您可以每次都做两份备份磁带及一张启动磁盘,并将其中
一份备份磁带存放在其它地方。其它地方不是指同一栋办公大楼的地下室
(世贸中心的一些公司应该学到了一些教训),而是真的要让人的磁带离您
的的计算机远远的。
一个建立启动磁盘的 shell 脚本例子:
/mnt/sbin/init
gzip -c -best /sbin/fsck > /mnt/sbin/fsck
gzip -c -best /sbin/mount > /mnt/sbin/mount
gzip -c -best /sbin/halt > /mnt/sbin/halt
gzip -c -best /sbin/restore > /mnt/sbin/restore
gzip -c -best /bin/sh > /mnt/bin/sh
gzip -c -best /bin/sync > /mnt/bin/sync
cp /root/.profile /mnt/root
chmod 500 /mnt/sbin/init
chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
chmod 555 /mnt/bin/sh /mnt/bin/sync
chmod 6555 /mnt/sbin/restore
#
# create minimum file system table
#
cat > /mnt/etc/fstab < /mnt/etc/passwd < /mnt/etc/master.passwd <
出现灾难后
关键问题是: 您的硬件是否幸免于难?
由于已经做好了定期的备份工作, 因此并不需要担心软件的问题。
如果硬件已经损毁, 这些部分应该在尝试使用计算机之前换掉。
如果硬件还能用, 检查一下您的软盘。 如果使用定制的引导软盘,
启动单用户模式 (在 boot: 提示后输入
-s)。 跳过下面一段。
如果您使用 boot.flp 和
fixit.flp 软盘, 请继续阅读。 将
boot.flp
软盘插到计算机的第一个软驱并启动机器。 此时,
最初的安装菜单将显示在屏幕上。
选择 Fixit--Repair mode with CDROM or floppy.
选项。 在得到提示后插入
fixit.flp 。
restore 以及其他需要的程序,
可以在 /mnt2/rescue
(对于 &os; 5.2 之前的版本, 则是
/mnt2/stand)。
分别恢复每一个文件系统
mount
root partition
bsdlabel
newfs
试着 mount 上您的第一个磁盘的 root 分区(例如: mount /dev/da0a
/mnt)。假如这个磁盘标签已经损坏,使用 bsdlabel
来重新分割并分配磁盘标签(利用您以前保留下来的数据)。使用 newfs
来建立文件系统,并重新挂上软盘读写的 root 分区 (mount -u -o rw
/mnt)。然后使用备份程序及备份磁带来修复文件系统 (例如: restore vrf
/dev/sa0)。最后 Unmount 这个文件系统 (例如: umount
/mnt)。对于每个损坏的文件系统都重复一次。
当您的系统正常启动后,将您的数据备份到新的磁带。任何造成数据丢失的
的灾难都可能再次发生。现在花一些时间,也许可以使您免于下次的灾难。
* I Did Not Prepare for the Disaster, What Now?
]]>
Marc
Fonvieille
Reorganized and enhanced by
网络、内存和 和以及映像文件为介质的虚拟文件系统
virtual disks
磁盘
虚拟
除了插在您计算机上的物理磁盘:
软盘、 CD、 硬盘驱动器, 等等之外, FreeBSD
还能识别一些其他的磁盘形式 - 虚拟磁盘。
NFS
Coda
disks
memory
这还包括, 如 网络文件系统 (Network File System) 和 Coda一类的网络文件系统、
内存以及映像文件为介质的虚拟文件系统。
随运行的 FreeBSD 版本不同,
用来创建和使用以映像文件介质文件系统和内存文件系统的工具也不尽相同。
系统会使用 &man.devfs.5; 来创建设备节点, 这对用户来说是透明的。
以映像文件为介质的文件系统
disks (磁盘)
file-backed (采用文件作为介质)
在 FreeBSD 系统中, 可以用 &man.mdconfig.8;
程序来配置和启用内存磁盘, &man.md.4;。 要使用
&man.mdconfig.8;, 就需要在内核配置文件中添加 &man.md.4; 模块来支持它:
device md
&man.mdconfig.8; 命令支持三种类型的虚拟文件系统:
使用 &man.malloc.9;,来分配内存文件系统,内存文件系统作为文件或作为
备用的交换分区。一种使用方式是在文件中来挂载一个软盘和
CD 镜像。
将一个暨存的映像文件作为文件系统挂载:
使用 mdconfig 挂载已经存在的映像文件
&prompt.root; mdconfig -a -t vnode -f diskimage -u 0
&prompt.root; mount /dev/md0 /mnt
使用 &man.mdconfig.8; 来创建新的映像文件:
使用 mdconfig 将映像文件作为文件系统挂载
&prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out
&prompt.root; mdconfig -a -t vnode -f newimage -u 0
&prompt.root; bsdlabel -w md0 auto
&prompt.root; newfs md0a
/dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048
using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.
super-block backups (for fsck -b #) at:
160, 2720, 5280, 7840
&prompt.root; mount /dev/md0a /mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0a 4710 4 4330 0% /mnt
如果没有通过 选项指定一个标识号
&man.mdconfig.8; 将使用
&man.md.4; 为它自动选择一个未用的设备标识号。
分配给它的标识名将被输出到标准输出设备, 其形式是与
md4 类似。 如果希望了解更多相关信息, 请参见联机手册
&man.mdconfig.8;。
&man.mdconfig.8; 功能很强大,
但在将映像文件作为文件系统挂载时, 仍需使用许多行的命令。 为此
FreeBSD 也提供了一个名为 &man.mdmfs.8; 的工具, 该程序使用
&man.mdconfig.8; 来配置 &man.md.4; 设备, 并用
&man.newfs.8; 在其上创建 UFS 文件系统, 然后用 &man.mount.8; 来完成挂载操作。 例如,
如果想创建和挂接像上面那样的文件系统映像,
只需简单地执行下面的步骤:
使用 mdmfs 命令配置和挂载一个映像文件为文件系统
&prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out
&prompt.root; mdmfs -F newimage -s 5m md0 /mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0 4718 4 4338 0% /mnt
如果你使用没有加标识号的 选项,
&man.mdmfs.8; 将使用 &man.md.4; 的自动标示号特性来自动为其
选择一个未使用的设备。更详细的
&man.mdmfs.8;,请参考联机手册。
以内存为介质的文件系统
disks (磁盘)
内存文件系统
一般来说, 在建立以内存为介质的文件系统时, 应使用 交换区作为介质
(swap backing)
。 使用交换区作为介质,
并不意味着内存盘将被无条件地换出到交换区,
它只是表示将根据需要从可换出的内存池中分配内存。
此外, 也可以使用
&man.malloc.9; 创建以内存作为介质的文件系统。
不过在内存不足时, 这种方式可能引致系统崩溃。
用 mdconfig
创建新的内存盘设备
&prompt.root; mdconfig -a -t swap -s 5m -u 1
&prompt.root; newfs -U md1
/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes.
with soft updates
super-block backups (for fsck -b #) at:
160, 2752, 5344, 7936
&prompt.root; mount /dev/md1 /mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md1 4718 4 4338 0% /mnt
使用 mdmfs 来新建内存介质文件系统
&prompt.root; mdmfs -s 5m md2 /mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md2 4846 2 4458 0% /mnt
从系统中移除内存盘设备
磁盘
移除内存盘设备
当不再使用内存盘设备时, 应将其资源释放回系统。
第一步操作是卸下文件系统, 然后使用
&man.mdconfig.8; 把虚拟磁盘从系统中分离, 以释放资源。
例如, 要分离并释放所有
/dev/md4 使用的资源, 应使用命令:
&prompt.root; mdconfig -d -u 4
mdconfig -l 命令可以列出关于配置
&man.md.4; 设备的信息。
Tom
Rhodes
Contributed by
文件系统快照
文件系统
快照
FreeBSD 提供了一个和 Soft Updates
关联的新功能: 文件系统快照
快照允许用户创建指定文件系统的映像,并把它们当做一个文件来对待。
快照文件必须在文件系统正在使用时创建,一个用户对每个文件系统创建的
快照不能大于20个。活动的快照文件被记录在超级块中,所以它们可以在系统
启动的时候一块进行挂接后摘掉。当一个快照不再需要时,可以使用标准的
&man.rm.1; 使用来使其删除。快照可以以任何顺序进行移除,但所有使用
的快照不可能同时进行移除,因为其它的快照将有可能互相引用一些块。
不可改的 文件标志,
是由 &man.mksnap.ffs.8; 在完成创建快照文件时设置的。
&man.unlink.1; 命令是一个特例, 以允许删除快照文件。
快照可以通过 &man.mount.8; 命令创建。 将文件系统
/var 的快照放到
/var/snapshot/snap 可以使用下面的命令:
&prompt.root; mount -u -o snapshot /var/snapshot/snap /var
作为选择,你也可以使用 &man.mksnap.ffs.8; 来创建一个快照:
&prompt.root; mksnap_ffs /var /var/snapshot/snap
可以查找文件系统中的快照文件 (例如 /var),
方法是使用 &man.find.1; 命令:
&prompt.root; find /var -flags snapshot
当快照文件被创建好后,可以用于下面一些目的:
有些管理员用文件快照来进行备份,
因为快照可以被转移到 CD 或磁带上。
文件系统一致性检查程序 &man.fsck.8; 可以用来检查快照文件。
如果文件系统在挂接前是一致的, 则检查结果也一定是一致的
(也就是不会做任何修改)。 实际上这也正是后台 &man.fsck.8;
的操作过程。
在快照上运行 &man.dump.8; 程序。
dump 将返回包含文件系统和快照的时间戳。&man.dump.8;
也能够抓取快照,使用
标志可以首先创建快照, 完成 dump 映像之后再自动删除它。
用 &man.mount.8; 来挂接快照作为文件系统的一个冻结的镜像。
要 &man.mount.8; 快照
/var/snapshot/snap 运行:
&prompt.root; mdconfig -a -t vnode -f /var/snapshot/snap -u 4
&prompt.root; mount -r /dev/md4 /mnt
现在你就可以看到挂接在 /mnt 目录下的 /var
文件系统的快照。 每一样东西都保存的像它创建时的状态一样。
唯一例外的是更早的快照文件将表现为长度为 0 的文件。
用完快照文件之后可以把它卸下,使用:
&prompt.root; umount /mnt
&prompt.root; mdconfig -d -u 4
想了解更多关于 和
文件系统快照的信息, 包括技术说明, 可以访问
Marshall Kirk McKusick 的 WWW 站点
。
文件系统配额
accounting
disk space
disk quotas
配额是操作系统的一个可选的功能,
它允许管理员以文件系统为单元,
限制分派给用户或组成员所使用的磁盘空间大小或是使用的总文件数量。
这经常被用于那些分时操作的系统上, 对于这些系统而言,
通常希望限制分派到每一个用户或组的资源总量,
从而可以防止某个用户占用所有可用的磁盘空间。
配置系统来启用磁盘配额
在决定使用磁盘配额前,确信磁盘配额已经在内核中配置好了。只要在在内核
中配置文件中添加下面一行就行了:
options QUOTA
在默认情况下 GENERIC 内核是不会启用这个功能的,
所以必须配置、重建和安装一个定制的内核。请参考 FreeBSD 内核配置
这章了解更多有关内核配置的信息。
接下来,需要在 /etc/rc.conf 中启用磁盘配额。可以
通过添加下面这行来完成:
enable_quotas="YES"
disk quotas
checking
为了更好的控制配额时的启动,还有另外一个可配置的变量。通常
启动时,集成在每个文件系统上的配额会被配额检查程序
&man.quotacheck.8; 自动检查。配额检查功能能够确保在配额数据库中
的数据正确地反映了文件系统的数
据情况。这是一个很耗时间的处理进程,它会影响系统的启动时间。如果
想跳过这一步,可以在文件 /etc/rc.conf 加入
下面这一行来达到目的:
check_quotas="NO"
最后,要编辑 /etc/fstab 文件,以在每一个
文件系统基础上雇用磁盘配额。这是启用用户和组配额,或同时启用用户
和组配额的地方。
要在一个文件系统上启用每个用户的配额,可以在 /etc/fstab
里添加 选项在要雇用配额文件的系统上。例如:
/dev/da1s2g /home ufs rw,userquota 1 2
同样的,要启用组配额,使用 选项来代替
选项。要同时启用用户和组配额,可以这样做:
/dev/da1s2g /home ufs rw,userquota,groupquota 1 2
默认情况下,配额文件是存放在文件系统的以 quota.user
和 quota.group 命名的根目录下。可以查看 &man.fstab.5;
联机手册了解更多信息。 尽管联机手册 &man.fstab.5; 提到,
可以为配额文件指定其他的位置, 但并不推荐这样做,
因为不同的配额工具并不一定遵循此规则。
到这儿,可以用新内核重新启动系统。 /etc/rc 将自动
运行适当的命令来创建最初的配额文件,所以并不需要手动来创建任何零长度的配额
文件。
在通常的操作过程中,并不要求手动运行 &man.quotacheck.8;、
&man.quotaon.8;, 或 &man.quotaoff.8; 命令,然而可能需要阅读与他们的操作
相似的联机手册。
设置配额限制
disk quotas
limits
一旦您配置好了启用配额的系统,可以检查一下它们是真的有用。
可以这样做:
&prompt.root; quota -v
您应该能够看到一行当前正在使用的每个文件系统启用的磁盘配额
使用情况的摘要信息。
现在可以使用 &man.edquota.8; 命令准备启用配额限制。
有几个有关如何强制限制用户或组可以分配到的磁盘空间大小的选项。
您可以限制磁盘存储块的配额, 或文件的数量, 甚至同时限制两者。
这些限制最终可分为两类: 硬限制和软限制。
硬性限制
硬性限制是一种不能越过的限制。 一旦用户达到了系统指定的硬性限制,
他就无法在对应的文件系统分配到更多的资源。
例如, 如果文件系统上分给用户的硬性限制是
500 KB, 而现在已经用掉了 490 KB,
那么这个用户最多还能再分配 10 KB 的空间。
换言之, 如果这时试图再分配 11 KB, 则会失败。
软性限制
而与此相反, 软性限制在一段时间内是允许越过的。
这段时间也称为宽限期, 其默认值是一周。
如果一个用户延缓时间太长的话,软限制将会变成硬限制,
而继续分配磁盘空间的操作将被拒绝。
当用户占用的空间回到软性限制值以下时, 宽限期将重新开始计算。
下面是一个运行 &man.edquota.8; 时看到的例子。当 &man.edquota.8;
命令被调用时,会被转移进 EDITOR 环境变量指派的编辑
器中,允许编辑配额限制。如果环境变量没有设置,默认在
vi 编辑器上进行。
&prompt.root; edquota -u test
Quotas for user test:
/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
inodes in use: 7, limits (soft = 50, hard = 60)
/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
inodes in use: 0, limits (soft = 50, hard = 60)
在每一个启用了磁盘配额的文件系统上,通常会看到两行。一行是
block 限制,另一行是 inode 限制。简单地改变要修改的配额限制的值。
例如,提高这个用户软限制的数值到 500 ,硬限制到 600 :
/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
to:
/usr: kbytes in use: 65, limits (soft = 500, hard = 600)
当离开编辑器的时候,新的配额限制设置将会被保存。
有时,在 UIDs 的范围上设置配额限制是非常必要的。这可以通过在
&man.edquota.8; 命令后面加上 选项来完成。首先,
给用户分配所需要的配额限制,然后运行命令
edquota -p protouser startuid-enduid。例如,如果
用户 test 已经有了所需要的配额限制,下面的命令
可以被用来复制那些 UIDs 为10,000 到 19,999 的配额限制:
&prompt.root; edquota -p test 10000-19999
更多细节请参考 &man.edquota.8; 联机手册。
检查配额限制和磁盘使用
disk quotas
checking
既可以使用 &man.quota.1; 也可以使用 &man.repquota.8; 命令来检查
配额限制和磁盘使用情况。 &man.quota.1; 命令能够检查单个用户和组的配置
使用情况。只有超级用户才可以检查其它用户的配额和磁盘使用情况。
&man.repquota.8; 命令可以用来了解所有配额和磁盘的使用情况。
下面是一个使用 quota -v 命令后的输出情况:
Disk quotas for user test (uid 1002):
Filesystem usage quota limit grace files quota limit grace
/usr 65* 50 75 5days 7 50 60
/usr/var 0 50 75 0 50 60
宽限期
前面以 /usr 作为例子。
此用户目前已经比软限制 50 KB 超出了 15 KB,
还剩下 5 天的宽限期。 请注意,
星号 * 说明用户已经超出了其配额限制。
通常, 如果用户没有使用文件系统上的磁盘空间, 就不会在
&man.quota.1; 命令的输出中显示, 即使已经为那个用户指定了配额。
而使用 选项则会显示它们, 例如前面例子中的
/usr/var。
通过 NFS 使用磁盘配额
NFS
配额能够在 NFS 服务器上被配额子系统强迫使用。在 NFS 客户端,
&man.rpc.rquotad.8; 命令可以使用 quota 信息用于 &man.quota.1;
命令, 可以允许用户查看它们的 quota 统计信息。
可以这样在 /etc/inetd.conf 中启用
rpc.rquotad:
rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad
现在重启 inetd:
- &prompt.root; kill -HUP `cat /var/run/inetd.pid`
+ &prompt.root; /etc/rc.d/inetd restart
Lucky
Green
Contributed by
shamrock@cypherpunks.to
加密磁盘分区
disks
encrypting
FreeBSD 提供了极好的数据保护措施,防止未受权的数据访问。
文件权限和强制访问控制(MAC)(看 )
可以帮助预防在操作系统处于运行状态和计算机加电时未受权的第三方访问数据。
但是,和操作系统强制受权不相关的是,如果黑客有物理上访问计算机的可能,
那他就可以简单的把计算机的硬件安装到另一个系统上复制出敏感的数据。
无论攻击者如何取得停机后的硬件或硬盘驱动器本身, &os; GEOM
Based Disk Encryption (基于 GEOM 的磁盘加密, gbde) 和
geli 加密子系统都能够保护计算机上的文件系统数据,
使它们免受哪怕是训练有素的攻击者获得有用的资源。
与那些只能加密单个文件的笨重的加密方法不同,
gbde 和 geli
能够透明地加密整个文件系统。 明文数据不会出现在硬盘的任何地方。
使用 gbde 对磁盘进行加密
成为 root
配置 gbde
需要超级用户的权力。
&prompt.user; su -
Password:
在内核配置文件中添加对 &man.gbde.4; 的支持
在您的内核配置中加入下面一行:
options GEOM_BDE
按照 所进行的介绍重新编译并安装内核。
重新引导进入新的内核。
另一种无需重新编译内核的方法, 是使用
kldload 来加载 &man.gbde.4;:
&prompt.root; kldload geom_bde
准备加密盘
下面这个例子假设您添加了一个新的硬盘在您的系统并将拥有一个单独的加密分区。
这个分区将挂接在 /private目录下。
gbde 也可以用来加密
/home 和 /var/mail,
但是这需要更多的复杂命令来执行。
添加新的硬盘
添加新的硬盘到系统中可以查看在 中的说明。
这个例子的目的是说明一个新的硬盘分区已经添加到系统中如:
/dev/ad4s1c。在例子中
/dev/ad0s1*
设备代表系统中存在的标准 FreeBSD 分区。
&prompt.root; ls /dev/ad*
/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
/dev/ad0s1a /dev/ad0s1d /dev/ad4
创建一个目录来保存 gbde Lock 文件
&prompt.root; mkdir /etc/gbde
gbde lock 文件包含了
gbde 需要访问的加密分区的信息。
没有 lock 文件,
gbde 将不能解密包含在加密分区上的数据。
每个加密分区使用一个独立的 lock 文件。
初始化 gbde 分区
一个 gbde 分区在使用前必须被初始化,
这个初始化过程只需要执行一次:
&prompt.root; gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
&man.gbde.8; 将打开您的编辑器,
提示您去设置在一个模板文件中的配置变量。
使用 UFS1 或 UFS2,设置扇区大小为 2048:
$FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $
#
# Sector size is the smallest unit of data which can be read or written.
# Making it too small decreases performance and decreases available space.
# Making it too large may prevent filesystems from working. 512 is the
# minimum and always safe. For UFS, use the fragment size
#
sector_size = 2048
[...]
&man.gbde.8; 将让您输入两次用来加密数据的密钥短语。
两次输入的密钥必须相同。
gbde
保护您数据的能力依靠您选择输入的密钥的质量。
这个提示教您怎样选择一个安全易记的密钥短语,
请看 Diceware
Passphrase 网站。
gbde init 命令为您的
gbde 分区创建了一个 lock 文件,
在这个例子中存储在
/etc/gbde/ad4s1c.lock中。
gbde lock 文件必须使用
.lock
扩展名才能够被
/etc/rc.d/gbde 启动脚本正确识别。
gbde lock
文件 必须 和加密分区上的内容同时备份。
如果发生只有 lock 文件遭到删除的情况时, 就没有办法确定
gbde 分区上的数据是否是解密过的。
另外, 如果没有 lock 文件, 即使磁盘的合法主人,
不经过大量细致的工作也无法访问加密分区上的数据,
而这是在设计 &man.gbde.8; 时完全没有考虑过的。
把加密分区和内核进行关联
&prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
在加密分区的初始化过程中您将被要求提供一个密码短语。
新的加密设备将在
/dev 中显示为
/dev/device_name.bde:
&prompt.root; ls /dev/ad*
/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde
在加密设备上创建文件系统
当加密设备和内核进行关联后,
您就可以使用 &man.newfs.8; 在此设备上创建文件系统,
使用 &man.newfs.8; 来初始化一个 UFS2
文件系统比初始化一个 UFS1 文件系统还要快,摧荐使用
选项。
&prompt.root; newfs -U -O2 /dev/ad4s1c.bde
&man.newfs.8; 命令必须在一个
gbde 分区上执行,
这个分区通过一个存在的
*.bde
设备名进行标识。
挂接加密分区
为加密文件系统创建一个挂接点。
&prompt.root; mkdir /private
挂接加密文件系统。
&prompt.root; mount /dev/ad4s1c.bde /private
校验加密文件系统是否有效
加密的文件系统现在对于
&man.df.1; 应该可见并可以使用。
&prompt.user; df -H
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 1037M 72M 883M 8% /
/devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1f 8.1G 55K 7.5G 0% /home
/dev/ad0s1e 1037M 1.1M 953M 0% /tmp
/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr
/dev/ad4s1c.bde 150G 4.1K 138G 0% /private
挂接已有的加密文件系统
每次系统启动后,
在使用加密文件系统前必须和内核重新进行关联,
校验错误和再次挂接。使用的命令必须由
root用户来执行。
关联 gbde 分区到内核
&prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
接下来系统将提示您输入在初始化加密的
gbde 分区时所用的密码短语。
校验文件系统错误
加密文件系统不能列在
/etc/fstab 文件中进行自动加载,
在加载前必须手动运行 &man.fsck.8;
命令对文件系统进行错误检测。
&prompt.root; fsck -p -t ffs /dev/ad4s1c.bde
挂接加密文件系统
&prompt.root; mount /dev/ad4s1c.bde /private
加密后的文件系统现在可以有效使用。
自动挂接加密分区
可以创建脚本来自动地附加、 检测, 并挂接加密分区,
然而, 处于安全考虑, 这个脚本不应包含 &man.gbde.8; 密码。
因而, 我们建议这类脚本在控制台或通过 &man.ssh.1;
执行并要求用户输入口令。
除此之外, 系统还提供了一个 rc.d 脚本。
这个脚本的参数可以通过
&man.rc.conf.5; 来指定, 例如:
gbde_autoattach_all="YES"
gbde_devices="ad4s1c"
gbde_lockdir="/etc/gbde"
在启动时将要求输入 gbde
的口令。 在输入正确的口令之后, gbde
加密分区将被自动挂接。 对于将 gbde
用在笔记本电脑上时, 这就很有用了。
gbde 提供的密码学保护
&man.gbde.8; 采用 CBC 模式的 128-位 AES 来加密扇区数据。
磁盘上的每个扇区都采用不同的 AES 密钥来加密。
要了解关于 gbde 的密码学设计,
包括扇区密钥如何从用户提供的口令字中生成等细节,
请参考 &man.gbde.4;。
兼容性问题
&man.sysinstall.8; 是和
gbde 加密设备不兼容的。
在启动 &man.sysinstall.8; 时必须将
*.bde
设备和内核进行分离,否则在初始化探测设备时将引起冲突。
与加密设备进行分离在我们的例子中使用如下的命令:
&prompt.root; gbde detach /dev/ad4s1c
还需要注意的是, 由于 &man.vinum.4; 没有使用
&man.geom.4; 子系统, 因此不能同时使用
gbde 与
vinum 卷。
Daniel
Gerzo
撰写者
使用 geli 对磁盘进行加密
从 &os; 6.0 开始提供了一个新的密码学 GEOM class —
geli。 它目前由
&a.pjd; 开发。 Geli 工具与
gbde 不同; 它提供了一些不同的功能,
并采用了不同的方式来进行密码学运算。
&man.geli.8; 最重要的功能包括:
使用了 &man.crypto.9; 框架 —
如果系统中有加解密硬件加速设备, 则 geli
会自动加以利用。
支持多种加密算法 (目前支持
AES、 Blowfish, 以及 3DES)。
允许对根分区进行加密。 在系统启动时,
将要求输入用于加密根分区的口令。
允许使用两个不同的密钥 (例如, 一个
个人密钥
和一个 公司密钥
)。
geli 速度很快 —
它只进行简单的扇区到扇区的加密。
允许备份和恢复主密钥。 当用户必须销毁其密钥时,
仍然可以通过从备份中恢复密钥来存取数据。
允许使用随机的一次性密钥来挂接磁盘
— 这对于交换区和临时文件系统非常有用。
更多 geli 功能介绍可以在
&man.geli.8; 联机手册中找到。
下面的步骤介绍了如何启用 &os; 内核中的
geli 支持,
并解释了如何创建新和使用 geli
加密 provider。
要使用 geli, 您必须运行
&os; 6.0-RELEASE 或更新版本。 由于需要修改内核,
因此您还需要拥有超级用户权限。
在内核中加入 geli 支持
在内核配置文件中加入下面两行:
options GEOM_ELI
device crypto
按照 介绍的步骤重新编译并安装内核。
另外, geli 也可以在系统引导时加载。 这是通过在
/boot/loader.conf 中增加下面的配置来实现的:
geom_eli_load="YES"
&man.geli.8; 现在应该已经为内核所支持了。
生成主密钥
下面的例子讲描述如何生成密钥文件, 它将作为主密钥 (Master Key)
的一部分, 用于挂接到
/private 的加密 provider。
这个密钥文件将提供一些随机数据来加密主密钥。 同时,
主密钥也会使用一个口令字来保护。 Provider 的扇区尺寸为 4kB。
此外, 这里的讨论将介绍如何挂载
geli provider, 在其上创建文件系统,
如何挂接并在其上工作, 最后将其卸下。
建议您使用较大的扇区尺寸 (例如 4kB),
以获得更好的性能。
主密钥将由口令字保护, 而密钥文件的数据来源则将是
/dev/random。 我们称之为 provider 的
/dev/da2.eli 的扇区尺寸将是 4kB。
&prompt.root; dd if=/dev/random of=/root/da2.key bs=64 count=1
&prompt.root; geli init -s 4096 -K /root/da2.key /dev/da2
Enter new passphrase:
Reenter new passphrase:
同时使用口令字和密钥文件并不是必须的;
您也可以只使用其中的一种来加密主密钥。
如果密钥文件写作 -
, 则表示使用标准输入。
下面是关于如何使用多个密钥文件的例子:
&prompt.root; cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2
将 provider 与所生成的密钥关联
&prompt.root; geli attach -k /root/da2.key /dev/da2
Enter passphrase:
新的明文设备将被命名为
/dev/da2.eli。
&prompt.root; ls /dev/da2*
/dev/da2 /dev/da2.eli
创建新的文件系统
&prompt.root; dd if=/dev/random of=/dev/da2.eli bs=1m
&prompt.root; newfs /dev/da2.eli
&prompt.root; mount /dev/da2.eli /private
现在加密的文件系统应该已经可以被 &man.df.1; 看到,
并处于可用状态了:
&prompt.root; df -H
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 248M 89M 139M 38% /
/devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr
/dev/ad0s1d 989M 1.5M 909M 0% /tmp
/dev/ad0s1e 3.9G 1.3G 2.3G 35% /var
/dev/da2.eli 150G 4.1K 138G 0% /private
卸下卷并断开 provider
一旦在加密分区上的工作完成,
并且不再需要 /private 分区,
就应考虑将其卸下并将 geli 加密分区从内核上断开。
&prompt.root; umount /private
&prompt.root; geli detach da2.eli
关于如何使用 &man.geli.8; 的更多信息,
可以在其联机手册中找到。
使用 geli rc.d 脚本
geli 提供了一个 rc.d 脚本,
它可以用于简化 geli 的使用。 通过
&man.rc.conf.5; 配置 geli 的方法如下:
geli_devices="da2"
geli_da2_flags="-p -k /root/da2.key"
这将把 /dev/da2 配置为一个
geli provider, 其主密钥文件位于
/root/da2.key, 而
geli 在连接 provider 时将不使用口令字
(注意只有在 geli init 阶段使用了
才可以这样做)。
系统将在关闭之前将 geli provider 断开。
关于如何配置 rc.d 的详细信息可以在使用手册的
rc.d 一节中找到。
Christian
Brüffer
原作
对交换区进行加密
swap (交换区)
encrypting (加密)
从 &os; 5.3-RELEASE 开始, &os; 提供了易于配置的交换区加密机制。
随所用的 &os; 版本, 可用的配置选项会有所不同,
而配置方法也会有一些差异。 从 &os; 6.0-RELEASE 开始,
已经可以使用 &man.gbde.8; 和 &man.geli.8;
两种加密系统来进行交换区的加密操作了。 在更早的版本中,
则只提供了 &man.gbde.8;。 前面所说的这两种加密系统,
都用到了 encswap 这个
rc.d 脚本。
在前面的小节 如何加密磁盘分区
中, 已经就不同的加密系统之间的区别进行了简单的讨论。
为什么需要对交换区进行加密?
与加密磁盘分区类似, 加密交换区有助于保护敏感信息。
为此, 我们不妨考虑一个需要处理敏感信息的程序, 例如,
它需要处理口令。 如果这些口令一直保持在物理内存中, 则一切相安无事。
然而, 如果操作系统开始将内存页换出到交换区,
以便为其他应用程序腾出内存时, 这些口令就可能以未加密的形式写到磁盘上,
并为攻击者所轻易获得。 加密交换区能够有效地解决这类问题。
准备
在本节余下的部分中, 我们约定使用 ad0s1b
作为交换区。
到目前为止, 交换区仍是未加密的。
很可能其中已经存有明文形式的口令或其他敏感数据。
要纠正这一问题, 首先应使用随机数来覆盖交换分区的数据:
&prompt.root; dd if=/dev/random of=/dev/ad0s1b bs=1m
使用 &man.gbde.8; 来加密交换区
如果使用 &os; 6.0-RELEASE 或更新的版本, 则 /etc/fstab
中与交换区对应的行中, 设备名应追加
.bde 后缀:
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.bde none swap sw 0 0
对于 &os; 6.0-RELEASE 之前的版本,
还需要在 /etc/rc.conf 中加入:
gbde_swap_enable="YES"
使用 &man.geli.8; 来加密分区
另一种方法是使用 &man.geli.8; 来达到加密交换区的目的,
其过程与使用 &man.gbde.8; 大体相似。 此时, 在 /etc/fstab
中交换区对应的行中, 设备名应追加
.eli 后缀:
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.eli none swap sw 0 0
&man.geli.8; 默认情况下使用密钥长度为 256-位的
AES 加密算法。
当然, 这些默认值是可以通过 /etc/rc.conf 中的
geli_swap_flags 选项来修改的。 下面的配置表示让 rc.d 脚本
encswap 创建一个 &man.geli.8; 交换区,
在其上使用密钥长度为 128-位 的 Blowfish 加密算法, 4 kilobytes
的扇区尺寸, 并采用 最后一次关闭时卸下
的策略:
geli_swap_flags="-e blowfish -l 128 -s 4096 -d"
For systems prior to &os; 6.2-RELEASE, use the following line:
geli_swap_flags="-a blowfish -l 128 -s 4096 -d"
请参见 &man.geli.8; 联机手册中关于 onetime
命令的说明, 以了解其他可用的选项。
验证所作的配置能够发挥作用
在重启系统之后, 就可以使用
swapinfo 命令来验证加密交换区是否已经在正常运转了。
如果使用了 &man.gbde.8;, 则:
&prompt.user; swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.bde 542720 0 542720 0%
如果使用了 &man.geli.8;, 则:
&prompt.user; swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.eli 542720 0 542720 0%
diff --git a/zh_CN.GB2312/books/handbook/printing/chapter.sgml b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
index ca8b1e2ec2..7cf277ab70 100644
--- a/zh_CN.GB2312/books/handbook/printing/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
@@ -1,4646 +1,4648 @@
Sean
Kelly
Contributed by
Jim
Mock
Restructured and updated by
打印
概述
LPD spooling system
printing
FreeBSD 可以支持众多种类的打印机,
从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机。
您可以使运行的应用程序产生高质量的打印输出。
FreeBSD 也可以被设置成一个网络上的打印服务器。 它可以从包括
FreeBSD、 &windows; 及 &macos; 在内的多种其他计算机上接收打印任务。
FreeBSD 将保证任务在某时被打印, 并且可以把哪台机器, 哪位用户打印的最多记录在统计表中,
生成 横幅
页, 显示哪份打印输出的是哪位用户的等等。
在读完这章后,您将知道:
怎样配置FreeBSD后台打印。
怎样安装打印过滤器来对特殊的打印任务做特殊的处理,
包括把传来的文档转换成打印机能理解的格式。
怎样在打印输出上开启报头或者横幅页功能。
怎样打印到连接在其他计算机上的打印机。
怎样打印到直接连接在网络上的打印机。
怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。
怎样记录打印机统计表和使用情况。
怎样解决打印故障。
在读这章之前, 您应该:
知道怎样配置并安装新内核
()。
介绍
为了在 FreeBSD 中使用打印机,
需要首先配置好伯克利行式打印机后台打印系统即
LPD。
它是 FreeBSD 的标准打印控制系统。 这章介绍 LPD
后台打印系统, 在接下来将简称为 LPD,
并且将指导您完成其配置。
如果您已经熟悉了
LPD 或者其他后台打印系统, 则可以跳到 设置后台打印系统 这部分。
LPD 完全控制一台计算机上的打印机。
它负责许多的事情:
它控制本地和连接在网络上其他计算机上打印机的访问。
print jobs
它允许用户提交要打印的文件;
这些通常被认为是任务。
它为每个打印机维护一个 队列 来防止多个用户在同一时刻访问一台打印机。
它可以打印报头(也叫做banner或者
burst页使用户可以轻松的从一堆打印输出中找到它们打印的任务。
它来设置连接在串口上的打印机的通讯参数。
它能通过网络将任务发送到另外一台计算机的
LPD后台打印队列中。
它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。
它记录打印机的使用情况。
通过配置文件
(/etc/printcap)和提供的特殊过滤程序,
您可以使LPD
系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。
为什么要用后台打印
如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制,
报头页或者打印机使用统计时为后台打印费心。
它可以设置成允许直接访问打印机, 但您还是应该使用后台打印, 因为:
LPD在后台打印任务; 您不用被迫等待数据被完全副本到打印机的时间。
&tex;
LPD可以可以方便的通过过滤器给任务加上日期/
时间的页眉或者把一种特殊的文件格式 (比如&tex; DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。
许多提供打印功能的免费和商业程序想要和您计算机上的的后台打印系统通讯。
通过设置后台打印系统, 您将更轻松的支持其他以后要添加的或者现有的软件。
基本设置
要想在 LPD后台打印系统上使用打印机,
您需要设置打印机硬件和
LPD软件。 这个
文档描述了这两级设置:
参见简单打印机
设置来了解怎样连接一个打印机, 告诉
LPD怎样与
它通讯, 并且打印纯文本到
打印机。
参见 高级打印机设置
来了解怎样打印多种
特殊格式的文件, 怎样打印报头页, 怎样通过网络
打印, 怎样控制打印机的访问权限, 并且学会为打印
作业记帐统计。
简单打印机设置
这部分讲解怎样配置打印机硬件和
LPD使之与打印机配合。
讲解的基础知识有:
硬件
设置部分将讲解怎样把一台打印机连接到
您计算机的一个端口上。
软件
设置部分将讲解怎样配置
LPD后台打印的配置
文件 (/etc/printcap)。
如果您正在设置一台通过网络协议
接收数据来打印而不是通过串口或者并口的打印机,
参见 使用网络数据流界面的打印机。
尽管这部分叫简单打印机
设置
, 但还是相当复杂的。 使打印机
配合 LPD
后台打印系统在计算机上正常运转是最难的
部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐,
是相当简单的。
硬件设置
这部分讲述了打印机连接到计算机的多种
途径。 主要讨论了多种接口和
连接线, 还有允许 FreeBSD 与打印机通讯所需的
内核配置。
如果您已经连接好了您的打印机而且已经
用它在另外一个操作系统下成功的打印, 您
或许可以跳到这个部分软件设置。
端口和连接电缆
现在所出售的在 PC 上使用的打印机通常至少有
以下三种接口中的一个:
printers
serial
串口, 也叫 RS-232 或者 COM 口,
使用您计算机上的串口来发送数据到打印机。
串口在计算机上已经非常普遍,
而且电缆也非常容易买到且容易制作。
串口有时需要特殊的电缆,
而且可能需要您去配置稍微有点儿复杂的通讯选项。
大多数 PC 的串口的最高传输速度只有 115200 bps,
这使得打印很大的图像需要的时间很长。
printers
parallel
并口
使用计算机上的并口来发送数据到打印机。
并口在计算机上也已经非常普遍,
而且速度高于 RS-232 串口。 电缆非常容易买到,
但很难手工制作。 并口通常没有通讯选项,
这使得配置它相当简单。
centronics
parallel printers
并口按打印机上的接头来命名也叫做
Centronics
接口。
printers
USB
USB 接口, 即通用串行总线,
可以达到比并口和串口高很多的速度。 其电缆既简单又便宜。
USB 用来打印比串口和并口更有优势, 但 &unix;
系统不能很好的支持它。 避免这个问题的方法就是购买一台
像大多数打印机一样的既有 USB 接口又有并口的
打印机。
一般来说并口只提供单向通讯
(计算机到打印机), 而串口和
USB 则可以提供双向通讯。 新的并口 (EPP 和
ECP) 及打印机在使用了
IEEE-1284 标准的电缆之后, 可以在FreeBSD下双向通讯。
PostScript
与打印机通过并口双向通讯通常由这两种方法中的一种来完成。
第一个方法是使用为 FreeBSD
编写的可以通过打印机使用的语言与打印机通讯的驱动程序。
这通常用在喷墨打印机上,
且可以用来报告剩余墨水多少和其他状态信息。
第二种方法使用在支持
&postscript; 的打印机上。
&postscript; 任务事实上由程序发送给打印机;
但它并不进行打印而是直接将结果返回给计算机。
&postscript; 也采取双向通讯来将打印中的问题报告给计算机,
比如 &postscript; 程序中的错误或者打印机卡纸。
这些信息对于用户来说也许是非常有价值的。 此外,
最好的在支持 &postscript;
的打印机上记帐的方法需要双向通讯:
询问打印机打印总页数 (打印机从出厂一共打印过多少页),
然后发送用户的任务, 之后再次查询总打印页数。
将打印前后得到的两个值相减就可以得到该用户要付多少纸钱。
并口
用并口连接打印机需要用 Centronics
电缆把打印机与计算机连接起来。
具体说明指导在打印机, 计算机的说明书上应该有,
或者干脆两个上面都有。
记住您用的计算机上的哪个并口。
第一个并口在 FreeBSD 上叫 /dev/ppc0;
第二个叫 /dev/ppc1, 依此类推。
打印机设备也用同样的方法命名:
/dev/lpt0
是接在第一个并口上的打印机, 依此类推。
串口
用串口连接打印机需要用
合适的串口电缆把打印机与计算机连接起来。 具体
说明指导应该在打印机, 计算机的说明书上有, 或者
同样干脆两个上面都有。
如果您不确定什么样儿的电缆才是 合适的串口
电缆
, 您可以尝试以下几种不同的
电缆:
调制解调器 电缆每一端的
每一根引脚都直接连接到另一端
相应的引脚
上。 这种电缆也叫做
DTE-to-DCE
电缆。
null-modem cable
非调制解调器电缆上每一端的有些引脚
是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到
接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内
短接。 这种电缆也叫做
DTE-to-DTE
电缆。
一些特殊的打印机需要的串口打印机 电缆,
是一种和非调制解调器电缆类似的电缆,
只是一些信号还是送到了另一端, 而
不是直接在连接头儿内短路。
baud rate
parity
flow control protocol
当然, 您还得为打印机设置通讯参数。
一般是通过打印机面板上的按钮或者 DIP
开关进行设置。 在计算机和打印机上都选择它们所支持的最高
波特 (每秒多少比特, 有时也叫
波特率) 的传输速率。
选择7或者8个数据位; 选择不校验,
偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量控制协议:
无, XON/XOFF (也叫做
in-band
或 软件
) 流量控制。
记住您的软件配置中的参数也要设成上面的数值。
软件设置
这部分描述了要使用FreeBSD系统中的
LPD 后台打印系统进行打印所需的软件设置。
包括这几个步骤:
在需要的时候配置内核来允许您连接
打印机的端口; 配置内核 部分会告诉您
需要做什么。
如果您使用并口, 则需要设置一下
并口的通讯模式; 设置
并口通讯模式 部分会告诉您具体的
细节。
测试操作系统是否能够发送数据到打印机。
检测打印机
联机状况 部分会告诉您要怎样
做。
为 LPD 设置与打印机匹配的参数则
通过修改
/etc/printcap 这个文件来完成。 这章后面
的部分将讲解如何来完成设置。
配置内核
操作系统的内核为了使某些特殊设备工作需要重新
编译。 打印机所用的串口、
并口就属于那些特殊设备。 因此, 可能需要
添加对串口或并口的支持,
如果内核并没有配置它们的话。
要想知道您现在使用的内核是否支持串口,
输入:
&prompt.root; grep sioN /var/run/dmesg.boot
其中 N 是串口的
编号, 从0开始。 如果您看到
类似下面的输出:
sio2 at port 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
则说明您现在使用的内核支持串口。
要想知道您现在使用的内核是否支持并口,
输入:
&prompt.root; 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
那么您现在使用的内核支持并口。
您可能必须为了使操作系统支持您打印机需要的串口或
并口而
重新配置内核。
要增加对串口的支持, 参见
内核配置这部分。 要增加对并口的支持, 除了参见
上面提到的那部分之外, 还要 参见下面的
部分。
设置并口的通讯模式
在使用并口时, 您可以选择
让 FreeBSD 用中断方式还是轮询方式来
与打印机通讯。 在 FreeBSD 上,
通用的打印机驱动 (&man.lpt.4;) 使用 &man.ppbus.4; 系统,
它利用 &man.ppc.4; 驱动来控制端口芯片。
中断 方式是 GENERIC 核心的默认方式。
在这种方式下, 操作系统占用一条中断请求线来检测打印机是否已经做好接收数据的准备。
轮询
方式是操作系统反复不断的询问打印机是否做好接收数据的准备。
当它返回就绪时, 核心开始发送下面要发送的数据。
中断方式速度通常会快一些,
但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机
不能正常的工作在中断模式下,
是由于一些定时问题 (还没正确的理解)
造成的。 这些打印机需要使用轮询方式。 您应该使用
任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以
工作, 但在中断模式下会慢的要命。
您可以用以下两种方法设定通讯模式: 通过
配置内核或者使用 &man.lptcontrol.8;
这个程序。
要通过配置内核的方法设置
通讯模式:
修改内核配置文件。 找到
一个叫 ppc0 的记录。 如果您想要设置的是
第二个并口, 那么用 ppc1
代替。 使用第三个并口的时候用 ppc2 代替,
依此类推。
如果您希望使用中断驱动模式,
则应编辑下面的配置:
hint.ppc.0.irq="N"
它在 /boot/device.hints 这个文件中,
其中 N 用正确的中断
编号代替。 同时, 核心配置文件也必须
包括 &man.ppc.4; 的驱动:
device ppc
如果您想要使用轮询方式, 只需要把
/boot/device.hints
这个文件中的下面这行删除掉:
hint.ppc.0.irq="N"
在 FreeBSD 下, 有时上面的方法并不能使并口工作在轮询方式。
大多数情况是由于 &man.acpi.4; 驱动造成的,
它可以自动侦测到设备并将其挂载到系统上, 但也因此,
它控制着打印机端口的访问模式. 您需要检查 &man.acpi.4;
的配置来解决这个问题。
保存文件。 然后配置, 建立, 并安装刚配置的内核,
最后重新启动。 参见 内核配置 这章来获得更多细节。
使用
&man.lptcontrol.8; 设置通讯模式:
输入:
&prompt.root; lptcontrol -i -d /dev/lptN
将
lptN 设置成中断方式。
输入:
&prompt.root; lptcontrol -p -d /dev/lptN
将
lptN 设置成轮询方式。
您可以把这些命令加入到
/etc/rc.local 这个文件中, 这样每次启动系统
时都会设置成您想要的方式。 参见 &man.lptcontrol.8; 来获得
更多信息。
检测打印机的通讯
在设置后台打印系统之前,
您应该确保您的计算机可以把数据
发送到打印机上。 分别独立调试打印机的通讯和后台打印系统会更简单。
我们为了测试打印机,将发送一些文本给它。 一个叫 &man.lptest.1;
的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的
字符: 它在每行打出
可以打印的 96 个 ASCII 字符。
PostScript
当我们使用的是一台 &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; 代码写进一个文件里,
并且像下面部分的例子里那样
使用。
PCL
上面的小程序是针对 &postscript; 而不是惠普的 PCL 写的。
由于 PCL 拥有许多其他打印机没有的强大功能,
比如它支持在打印纯文本的同时夹带特殊的命令, 而
&postscript; 则不能直接打印纯文本,
所以需要对这类打印机语言进行特殊的处理。
检测并口打印机
printers
parallel
这部分内容将指导您怎样检测 FreeBSD
是否可以与一台已经连接在并口上的打印机通讯。
要测试并口上的打印机:
用 &man.su.1; 命令转换到 root 用户。
发送数据到打印机。
如果打印机可以直接打印纯文本, 可以用
&man.lptest.1;。 输入:
&prompt.root; lptest > /dev/lptN
其中 N
是并口的编号, 从0开始。
如果打印机支持 &postscript; 或其他打印机语言,
可以发送一段小程序到打印机。 输入:
&prompt.root; cat > /dev/lptN
然后, 一行一行地 输入
输入这段程序。 因为在按下 换行 或者
回车 之后, 这一行就不能再修改了。
当您输入完这段程序之后, 按
CONTROL+D,
或者其他表示文件结束的键。
另外一种办法,
您可以把这段程序写在一个文件里, 并输入:
&prompt.root; cat file > /dev/lptN
其中 file
是包含这您要发给打印机程序的文件名。
之后, 您应该看到打印出了一些东西。
如果打印出的东西看起来并不正确, 请不要着急;
我们将在后面指导您如何解决这类问题。
检测串口打印机
printers
serial
这部分将告诉您如何检测 FreeBSD
是否可以与连接在串口上的打印机通讯。
要测试连接在串口上的打印机:
通过 &man.su.1; 命令转为 root 用户。
修改 /etc/remote 这个文件。
增加下面这些内容:
printer:dv=/dev/port:br#bps-rate:pa=parity
bits-per-second
serial port
parity
其中 port
是串口的设备节点 (ttyd0、
ttyd1, 等等),
bps-rate
是与打印机通讯时使用的速率, 而
parity
是通讯时打印机要求的校验方法 (应该是 even、
odd、 none, 或
zero 之一)。
这儿有一个串口打印机的例子,
它连接在第三个串口上, 速度为 19200 波特,
不进行校验:
printer:dv=/dev/ttyd2:br#19200:pa=none
用 &man.tip.1; 连接打印机。
输入:
&prompt.root; tip printer
如果没能成功, 则要再次修改
/etc/remote 这个文件, 并且试试用
/dev/cuaaN
代替
/dev/ttydN。
发送数据到打印机。
如果打印机可以直接打印纯文本, 则用
&man.lptest.1;。 输入:
&prompt.user; $lptest
如果打印机支持 &postscript; 或者其他
打印机语言, 则发送一段小程序到
打印机。 一行一行的输入程序, 必须
非常仔细 因为像退格
或者其他编辑键也许对打印机来说有它的
意义。 您同样也需要按一个特殊的
文件结束键, 让打印机知道它已经
接收了整个程序。 对于 &postscript;
打印机, 按 CONTROL+D。
或者, 您同样也可以把程序存储在一个文件里
并输入:
&prompt.user; >file
其中 file 是
包含要发送程序的文件名。 在
&man.tip.1; 发送这个文件之后, 按代表
文件结束的键。
您应该看到打印出了一些东西。
如果它们看起来并不正确也不要着急;
我们将在稍后的章节中介绍如何解决这类问题。
启用后台打印: 文件 /etc/printcap
目前, 您的打印机应该已经连好了线,
系统内核也为与打印机联机而重新配置好 (如果需要的话),
而且您也已经可以发送一些简单的数据到打印机。 现在,
我们要配置 LPD 来使其控制您的打印机。
配置 LPD 要修改
/etc/printcap 这个文件。 由于
LPD 后台打印系统在每次使用后台打印的时候,
都会读取这个文件, 因此对这个文件的修改会立即生效。
printers
capabilities
&man.printcap.5; 这个文件的格式很简单。
您可以用您最喜欢的文本编辑器来修改
/etc/printcap 这个文件。
这种格式和其他的像
/usr/share/misc/termcap 和
/etc/remote 这类文件是一样的。
要得到关于这种格式的详尽信息,
请参阅联机手册 &man.cgetent.3;。
简单的后台打印配置包括下面的几步:
给打印机起一个名字 (记忆和使用的别名), 然后把它们写进文件
/etc/printcap; 参见
如何为打印机命名
这章来得到更多的关于起名的帮助。
header pages
通过增加 sh 项关掉报头页
(它默认是启用的); 参见
如何禁用报头页
部分来得到更多信息。
建立一个后台打印队列的目录, 并且通过
sd 项目指定它的位置; 您可参见 创建后台打印队列目录
一节了解更多信息。
在 /dev 下设置打印机设备节点,
并且在写在 /etc/printcap
文件中 lp 项目里; 参见 识别打印机设备
这部分可以得到更多信息。 此外, 如果打印机连接在串口上,
通讯参数的设置需要写在
ms# 项中。 这些参数在 配置后台打印通讯参数
这在前面已经讨论过。
安装纯文本过滤器; 详情请参见 安装文本过滤器 小节。
用
&man.lpr.1; 命令来测试设置。 想得到更多信息可以参见
测试 和
故障排除
部分。
使用打印机语言的打印机, 如 &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 这几个别名。
建立后台打印队列目录
printer spool
print jobs
下一步设置就是要建立一个
后台打印队列目录,
也就是在打印任务最终完成之前用于存放这些任务的目录,
这个目录中也会存放后台打印系统用到的其他一些文件。
由于后台打印队列目录的变量本质, 通常
把这些目录安排在
/var/spool 下。 您也没有必要去
备份后台打印队列目录里的内容。
重新建立它们只要简单的使用 &man.mkdir.1; 命令。
通常, 我们习惯将目录名起成和
打印机一样的名字, 像下面
这样:
&prompt.root; mkdir /var/spool/printer-name
然而, 如果您有很多网络打印机,
您可能想要把这些后台打印的队列目录目录放在一个单独的专为使用
LPD 打印而准备的目录里。
我们将用我们的两台打印机
rattan 和
bamboo 作为例子:
&prompt.root; mkdir /var/spool/lpd
&prompt.root; mkdir /var/spool/lpd/rattan
&prompt.root; mkdir /var/spool/lpd/bamboo
如果担心用户任务的保密性,
可能会希望保护相应的后台打印队列目录, 使之不能被其他用户访问。
后台打印的队列目录的属主应该是 daemon 用户,
- 而 daemon 用户和 daemon 组拥有读写和搜索的权限,
- 但其他用户没有。 接下来用我们的两台打印机作为例子:
+ 而 daemon 用户和 daemon
+ 组拥有读写和搜索的权限,但其他用户没有。
+ 接下来用我们的两台打印机作为例子:
&prompt.root; chown daemon:daemon /var/spool/lpd/rattan
&prompt.root; chown daemon:daemon /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan
&prompt.root; 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 目录中的哪个节点来让 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 中不存在。
如果您正在安装的打印机是连接在
并口上的, 请跳到 安装文本
过滤器 这章。 如果不是的话, 还是最好按下面介绍的
步骤做。
配置后台打印通讯参数
printers
serial
对于连在串口上的打印机, 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
设置已打开的中端设备的选项
。 &man.stty.1; 将详细
讲述可用的选项。
当 LPD 打开
用 lp 指定的设备时, 它会
将设备的特性设置成在
ms# 标记后指定的那样。 特别是
parenb,
parodd, cs5,
cs6, cs7,
cs8, cstopb,
crtscts, 和 ixon
这些模式, 它们在 &man.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:
安装文本过滤器
printing
filters
我们现在准备告诉 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
使这个文件可以被执行:
&prompt.root; 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:
if-simple 脚本的副本可以在 /usr/share/examples/printing
目录中找到。
开启 LPD
&man.lpd.8; 在 /etc/rc 中被运行,
它是否被运行由 lpd_enable 这个变量控制。 这个
变量默认是 NO。 如果您还没有修改
, 那么增加这行:
lpd_enable="YES"
到 /etc/rc.conf 文件当中, 然后既可以重启您的
机器, 也可以直接运行 &man.lpd.8;。
&prompt.root; lpd
测试
现在已经基本完成了
LPD 的基本设置。
但不幸的是, 还不是庆祝的时候,
因为我们还需要测试设置并且修正所有的
问题。 要测试设置, 尝试打印一些东西。 要
用 LPD 系统打印, 您可以
使用 &man.lpr.1; 命令,
它可以提交一个任务来打印。
您可以联合使用 &man.lpr.1; 和 the &man.lptest.1;
程序, 在 检查打印机
通讯 这节介绍怎样生成一些测试文本。
要测试简单 LPD
设置:
输入:
&prompt.root; lptest 20 5 | lpr -Pprinter-name
其中 printer-name 是
在 /etc/printcap 中指定的打印机的一个名字 ( 或者一个别名)
。 要测试默认
打印机, 输入 &man.lpr.1; 不带任何
选项。 同样, 如果您正在测试一台使用
&postscript; 的打印机, 发送一个 &postscript; 程序到打印机而不是
使用 &man.lptest.1;。 您可以把程序放在一个
文件里, 然后输入: lpr
file。
对于一台 &postscript; 打印机, 您应该得到那段程序的
结果。 而如果您使用的 &man.lptest.1;, 则您得到的
结果应该看起来像下面这样:
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
要更进一步的测试打印机, 尝试下载一些大的
程序 (为基于特定语言的打印机 ) 或者运行
&man.lptest.1; 并使用不同的参数。 比如,
lptest 80 60 将生成 60 行 每行 80
个字符。
如果打印机不能工作, 参考 故障排除
这节。
高级设置
这部分将描述用来打印特别格式文件,
页眉, 通过网络打印, 以及对打印机使用限制和
记帐。
过滤器
printing
filters
尽管 LPD 处理网络协议,
任务排队, 访问控制,
和打印的其他方面, 但大部分 实际
工作还是由 过滤器。 过滤器是
一种与打印机通讯并且处理设备依赖和特殊需要的
程序。 在简单打印机设置这节里,
我们安装了一个纯文本过滤器 — 一个应该可以用在大多数
打印机上的极简单的过滤器 ( 安装
文本过滤器)。
然而, 为了进行格式转换, 打印
记帐, 适应特殊的打印机, 等等,
您需要明白过滤器是怎样工作的。
在根本上过滤器负责处理这些方面。
但坏消息是大多数时候
您 必须自己提供过滤器。 好消息
是很多过滤器通常都已经有了; 当没有的时候, 它们
通常也是很好写的。
FreeBSD 也提供了一个过滤器,
/usr/libexec/lpr/lpf, 可以让大多数可以打印纯文本的
打印机工作。 ( 它处理文件里的退格和
跳格, 并且进行记帐, 但这基本就是它所有能做的了。 )
这里还有几个过滤器和过滤器组件在 FreeBSD
Ports Collection 里。
这是在这节里您将找到的内容:
在 过滤器是如何工作的
小节中将介绍在打印过程中过滤器的作用。
如果希望了解在 LPD 使用过滤器时,
在 幕后
发生的事情, 便应阅读这一小节。
了解这些知识能够帮助您在为打印机安装过滤器时更快地排查可能会遇到的各种问题。
LPD 假定任何打印机在默认状态下均能打印纯文本内容。
对于不能直接打印纯文本的 &postscript; 打印机 (以及其他基于打印语言的打印机)
而言这会带来问题。 在 在 &postscript; 打印机上使用纯文本任务
这节中将会介绍如何解决这个问题的方法。 如果您使用
&postscript; 打印机, 就应阅读这节内容。
&postscript; 对于许多程序来说都是一个非常受欢迎的输出格式。
一些人甚至直接写 &postscript; 代码。 但不幸的是,
&postscript; 打印机非常昂贵。 模拟 &postscript; 在
非 &postscript; 打印机上 这节将告诉您怎样进一步修改
打印机的文本过滤器, 使得一台 非 &postscript; 打印机接受
并打印 &postscript; 数据。 如果
您没有 &postscript; 打印机, 那么您应该阅读这个小节。
转换过滤器
这节讲述了一个自动把指定格式文件, 比如图像或排版数据,
转换成您打印机可以理解的格式的方法。 在阅读了这节之后,
您就应该可以配置打印机, 让用户可以用 lpr -t
来打印 troff 数据、 用
lpr -d 来打印 &tex; DVI 数据, 或用 lpr
-v 来打印光栅图像数据等工作了。 建议您阅读这节。
输出
过滤器 这节讲述了这个不是经常使用的
LPD:
的功能-输出过滤器。 除非您要打印页眉 (见 页眉 这节 ),
您或许可以完全跳过这节。
lpf: 一个文本
过滤器 描述了 lpf, 一个 FreeBSD 自带的相当
完整而又简单的文本过滤器, 可以使用在行式打印机 (和那些担当行式打印机功能的激光
打印机 ) 上。 如果
您需要一个快速的方法来让打印机统计打印纯文本的工作量
, 或者您有一台遇到退格字符就冒烟的打印机
, 您应该考虑
lpf。
您可以在 /usr/share/examples/printing
目录中找到下面将提到的那些脚本的副本。
过滤器是怎样工作的
前面说过, 过滤器是一个被
LPD 启动, 用来处理与打印机通讯过程中设备依赖的部分
的可执行程序。
当 LPD 想要打印
一个任务中的文件, 它启动一个过滤器
程序。 它把要打印的文件设置成过滤器的标准输入,
标准输出设置成打印机, 并且把错误信息定向到
错误日志文件 (在 lf
标识里指定, 默认在 /etc/printcap, 或者
/dev/console 文件里 )。
troff
过滤器被 LPD 启动, 并且
过滤器的参数依赖于
/etc/printcap 文件中所列出的和
用户为任务用
&man.lpr.1; 命令所指定的。 例如, 如果用户输入
lpr -t, LPD 会
启动 troff 过滤器, 即在
目标打印机的 tf 标签里所列出的过滤器。
如果用户想要打印纯文本, 它将会启动
if ***过滤器 ( 这是通常的情况: 参见 输出过滤器 来得到
细节 )。
在
/etc/printcap 文件中, 您可以指定三种过滤器:
The 文本过滤器 , 在 LPD 文档中也叫做
输入过滤器
, 处理
常规的文本打印。 可以把它想象成默认过滤器。
LPD
假定每台打印机默认情况下都可以打印纯文本,
而文本过滤器的任务就是来搞定退格、 跳格,
或者其他在某种打印机上容易错误的特殊字符。
如果您所在的环境对打印机的使用情况进行记帐,
那么文本过滤器必须也对打印的页数进行统计,
通常是根据打印的行数和打印机在每页上能打印的行数进行计算得出。
文本过滤器的启动命令为:
filter-name
-c
-w width
-l length
-i indent
-n login
-h host
acct-file
这里
当任务用 lpr
-l 这个命令提交时出现
width
这里取您在 /etc/printcap 文件中指定的 pw (页
宽) 标签的值, 默认为 132。
length
这里取您的 pl (页
长) 标签的值, 默认为 66
indent
这里是来自 lpr
-i 命令的总缩进量, 默认为 0
login
这里是正在打印文件的用户名
host
这里是提交打印任务的主机名
acct-file
这里是来自
af 变量中指定的用于记帐的文件名。
printing
filters
转换过滤器 的功能是,
将特定格式的文件转换成打印机能够识别并打印的格式。
例如, ditroff 格式的排版数据就是无法直接打印的,
但您可以安装一个转换过滤器来将 ditroff
文件转换成一种打印机可以识别和打印的形式。 请参见 转换过滤器
这一节来了解更多细节。 如果您需要对打印进行记帐,
那么转换过滤器也必须完成记帐工作。 转换过虑器的启动命令为:
filter-name
-x pixel-width
-y pixel-height
-n login
-h host
acct-file
这其中 pixel-width 的值来自
px 标签 (默认为 0), 而
pixel-height 的值来自
py 标签 (默认为 0)。
输出过滤器 仅在没有文本过滤器时,
或者报头页被打开时使用。 就我们的经验而言,
输出过滤器是很少用到的. 在 输出过滤器 这节中会介绍它们。
启动输出过滤器的命令行只有两个参数:
filter-name
-w width
-l length
它们的作用与文本过滤器的 和
参数是一样的。
过滤器也应该在 退出
时给出下面的几种退出状态:
exit 0
过滤器已经成功的打印了文件.
exit 1
过滤器打印失败了, 但希望
LPD 试着再打印一次。
如果过滤器返回了这个状态, LPD
将重新启动过滤器。
exit 2
过滤器打印失败并且不希望
LPD 重试。 这种情况下
LPD 会放弃这个文件。
文本过滤器随 FreeBSD 一起发布,
文件名为 /usr/libexec/lpr/lpf,
它利用页宽和页长参数来决定何时发送送纸指令,
并提供位打印记帐的方法。 它使用登录名、 主机名,
和记帐文件参数来生成记帐记录。
如果您想购买过滤器, 要注意它是否是与 LPD 兼容。
如果兼容的话, 则它们必须支持前面提到的那些参数。
如果您打算编写普通的过滤器程序,
则同样需要使之支持前面那些参数和退出状态码。
在 &postscript; 打印机上打印纯文本任务
print jobs
如果您是您的计算机和 &postscript; (或其他语言的)
打印机的唯一用户, 而且您不打算发送纯文本到打印机,
并因此不打算从应用程序程序直接将纯文本发到打印机的话,
就完全不需要再关心这节的内容了。
但是, 如果打印机同时需要接收 &postscript; 和纯文本的任务,
就需要对打印机进行设置了。 要完成这项工作,
我们需要一个文本过滤器来检测到达的任务是纯文本的还是 &postscript;
格式的。 所有 &postscript; 的任务必须以
%! (其他打印机语言请参见打印机的文档)
开头。 如果任务的头两个字符是这两个,
就代表这是 &postscript; 格式的, 并且可以直接略过任务剩余的部分。
如果任务开头的两个字符不是这两个, 那么过滤器将把文本转换成
&postscript; 并打印结果。
我们怎样去做?
printers
serial
如果你有一台串口打印机, 一个好办法就是安装
lprps。 lprps
是一个可以与打印机进行双向通信 &postscript;
打印机过滤器。 它用打印机传来的详细信息来更新打印机的状态文件,
所以用户和管理员可以准确的看到打印机处在什么样的状态 (比如
缺墨 或者 卡纸)。
但更重要的是, 它包含了一个叫做 psif
的程序, 它可以检测接收到的文件是否是纯文本的, 并且将使用
textps 命令 ( 也是由
lprps 提供的程序) 转换文本到 &postscript;。 然后它会用
lprps 将任务发送到打印机。
lprps 可以在 FreeBSD Ports Collection
(详见 The Ports Collection) 中找到。
你可以根据页面的尺寸选择安装
print/lprps-a4
和 print/lprps-letter。
在安装了 lprps 之后, 只需指定
psif 这个程序的路径, 这也是包含在
lprps 中的一个程序。 如果您已经用 ports 安装好了
lprps, 将下面的内容添加到
/etc/printcap 文件中 &postscript;
打印机的记录部分中:
:if=/usr/local/libexec/psif:
同时还需要指定 rw 标签来告诉
LPD 使用读-写模式打开打印机。
如果您有一台并口的 &postscript; 打印机 (因此不能与打印机进行
lprps 需要的双向通信), 可以使用下面这段 shell
脚本来充当文本过滤器:
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# PostScript job, print it.
#
echo "$first_line" && cat && printf "\004" && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
exit 2
fi
在上面的脚本中, textps
命令是一个独立安装的程序用来将纯文本转换成 &postscript;。
您可以使用任何您喜欢的文本到 &postscript; 转换程序。
FreeBSD Ports Collection (详见 Ports Collection)
中包含了一个功能非常完整的文本到 &postscript; 的转换程序, 它叫做
a2ps。
模拟 &postscript; 在非 &postscript; 打印机上
PostScript
emulating
Ghostscript
&postscript; 是高质量排版和打印 事实上的
标准。 而 &postscript; 也是一个
昂贵 的标准。 幸好, Aladdin
开发了一个和 &postscript; 类似的叫做
Ghostscript 的程序可以用在 FreeBSD 上。
Ghostscript 可以读取大多数 &postscript;
的文件并处理其中的页面交给多种设备,包括许多品牌的非 &postscript;
打印机。 通过安装 Ghostscript
并使用一个特殊的文本过滤器,则可以使一台非 &postscript;
打印机用起来就像真的 &postscript; 打印机一样。
Ghostscript 被收录在
FreeBSD Ports Collection 中,有许多可用的版本,
比较常用的版本是
print/ghostscript-gpl。
要模拟 &postscript;, 文本过滤器要检测是否要打印一个
&postscript; 文件。 如果不是, 那么过滤器将直接将文件发送到打印机;
否则, 它会用 Ghostscript
先将文件转换成打印机可以理解的格式。
这里有一个例子: 下面的脚本是一个针对
Hewlett Packard DeskJet 500 打印机的文本过滤器。 对于其他打印机,
替换 gs (Ghostscript)
命令中的 参数就可以了。 (输入
gs -h 来获得当前安装的
Ghostscript 所支持的设备列表。)
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/ifhp
#
# Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL
# printers):
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it.
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
-sOutputFile=- - && exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form feed
# at the end to eject the last page.
#
echo "$first_line" && cat && printf "\033&l0H" &&
exit 0
fi
exit 2
最后, 需要告知 LPD
所使用的过滤器, 通过 if 标签完成:
:if=/usr/local/libexec/ifhp:
- 您可以输入 lpr plain.text 和
- lpr whatever.ps, 它们都应该可以成功打印。
+ 您可以输入 lpr plain.text
+ 和 lpr whatever.ps,
+ 它们都应该可以成功打印。
转换过滤器
在完成了 打印机简单设置 这节中所描述的内容之后, 头一件事
恐怕就是为你喜爱的格式的文件安装转换过滤器了 (除了纯 ASCII 文本)。
为什么安装转换过滤器?
&tex;
printing DVI files
转换过滤器使打印众多格式的文件变得很容易。
比如, 假设我们大量使用 &tex;
排版系统, 并且有一台 &postscript; 打印机。
每次从 &tex; 生成一个 DVI 文件,
我们都不能直接打印它直到我们将 DVI 文件转换成 &postscript;。
转换的命令应该是下面的样子:
- &prompt.user; dvips seaweed-analysis.dvi
+ &prompt.user; dvips seaweed-analysis.dvi
&prompt.user; lpr seaweed-analysis.ps
通过安装 DVI 文件的转换过滤器, 我们可以跳过每次手动转换这一步, 而让
LPD 来完成这个步骤。
现在, 每次要打印 DVI 文件, 我们只需要一步就可以打印它:
- &prompt.user; lpr -d seaweed-analysis.dvi
+ &prompt.user; lpr -d seaweed-analysis.dvi
我们要 LPD 转换 DVI 文件是通过指定
选项完成的。 格式和转换
选项 这一节列出了所有的转换选项。
对于每种想要打印机支持的转换,
首先要安装 转换过滤器 然后在
/etc/printcap 中指定它的路径。
在简单打印设置中, 转换过滤器类似于文本过滤器
(详见 安装文本过滤器 )
不同的是它不是用来打印纯文本,
而是将一个文件转换成打印机能够理解的格式。
我应该安装哪个转换过滤器?
您应该安装您希望使用的转换过滤器。
如果要打印很多 DVI 数据, 就需要 DVI 转换过滤器;
如果有大量的 troff 数据,
就应该安装 troff 过滤器。
下面的表格总结了可以与
LPD配合
工作的过滤器, 以及它们在
/etc/printcap文件中的变量名, 还有如何在
lpr命令中调用它们:
文件类型
在/etc/printcap文件中的变量名
在lpr命令中调用使用的参数
cifplot
cf
DVI
df
plot
gf
ditroff
nf
FORTRAN text
rf
troff
tf
raster
vf
plain text
if
none, , or
在例子中, lpr -d就是指
打印机需要在/etc/printcap文件中
df变量所指的过滤器。
FORTRAN
不管别人怎么说, 像 FORTRAN 的文本
和 plot 这些格式已经基本不用了。 所以在您的机器上,
就可以安装其他的过滤器来替换这些参数原有的意义。
例如, 假设想要能直接打印
Printerleaf 文件 (由 Interleaf desktop
publishing 程序生成), 而且不打算打印 plot 文件,
就可以安装一个 Printerleaf 转换过滤器并且用
gf 变量指定它。 然后就可以告诉您的用户使用
lpr -g 就可以 打印 Printerleaf
文件。
安装转换过滤器
以为安装的转换过滤器不是 FreeBSD 基本系统的一部分,
所以它们可能是在
/usr/local 目录下。 通常目录
/usr/local/libexec 是保存它们的地方,
因为它们通常是通过
LPD 运行的;
普通用户应该并不需要直接运行它们。
要启用一个转换过滤器, 只需要在
/etc/printcap
文件中为目标打印机中合适的变量赋上过滤器所在的路径。
在接下来的例子当中, 我们将为
一台叫做 bamboo 的打印机添加一个转换过滤器。
下面是这个例子的 /etc/printcap 文件,
其中使用新变量 df 来为打印机
bamboo 设置转换过滤器:
#
# /etc/printcap for host rose - added df filter for bamboo
#
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:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
这里的 DVI 过滤器是一段 shell 脚本, 名字叫做
/usr/local/libexec/psdf。
下面是它的代码:
#!/bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
这段脚本以过滤器模式运行 dvips (参数
) 并从标准输入读取要打印的任务。
然后运行 &postscript; 文本过滤器
lprps (详见 在
&postscript; 打印机上打印纯文本任务 这一节), 并且带着
LPD
传给脚本的全部参数。 lprps
工具将利用这些参数来为打印进行记帐。
更多转换过滤器应用实例
因为安装转换过滤器的步骤并不是固定的,
所以这节介绍了一些可行的例子。
在以后的安装配置过程中可以以这些例子为参考。
甚至如果合适的话, 可以完全照搬过去。
这段例子中的脚本是一个
Hewlett Packard LaserJet III-Si
打印机的光栅格式数据 (实际上也就是 GIF 文件):
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
它的工作原理就是将 GIF 文件转换成 portable anymap,
再转换成 portable graymap, 然后再转换成
portable bitmap, 最后再转换成 LaserJet/PCL- 兼容的数据。
下面是为打印机配置上上述过滤器的 /etc/printcap
文件:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
下面的脚本是一个在名叫
bamboo 的这台 &postscript;
打印机上打印用 groff 排版软件生成的 troff 数据的打印过滤器:
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
上面这段脚本还是用 lprps
来与打印机进行通讯。 如果打印机是接在并口上的,
那么就应该使用下面的这段脚本:
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
这里是我们要启用过滤器需要在
/etc/printcap 里增加的内容:
:tf=/usr/local/libexec/pstf:
下面的例子也许会让许多 FORTRAN 老手羞愧。
它是一个 FORTRAN- 文本 的过滤器, 能在任意一台
可以打印纯文本的打印机上使用。 我们将为打印机
teak 安装这个过滤器:
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\033&l0H" &&
exit 0
exit 2
然后我们要在
/etc/printcap 中为打印机能够
teak 启用这个过滤器添加下面的内容:
:rf=/usr/local/libexec/hprf:
最后, 再给出一个有些复杂的例子。 我们将给以前介绍过的
teak 这台激光打印机添加一个 DVI
过滤器。 首先, 最容易的部分: 更新
/etc/printcap 加入 DVI
过滤器的路径:
:df=/usr/local/libexec/hpdf:
现在, 该困难的部分了: 编写过滤器。 为了实现过滤器, 我们需要一个
DVI-到-LaserJet/PCL 转换程序。 FreeBSD Ports
Collection (详见 Ports Collection 这一节)
中有一个: print/dvi2xx。
安装这个 port 就会得到我们需要的程序,
dvilj2p , 它可以将 DVI 数据转换成 LaserJet IIp,
LaserJet III, 和 LaserJet 2000 兼容的数据。
dvilj2p 工具使得过滤器
hpdf 变得十分复杂, 因为
dvilj2p 不能读取标准输入。
它需要从文件中读取数据。 更糟糕的是, 这个文件的名字必须以
.dvi 结尾。 所以使用
/dev/fd/0 作为标准输入是有问题的。
我们可以通过连接 (符号连接) 来解决这个问题。 连接一个临时的文件名
(一个以 .dvi 结尾的文件名)
到 /dev/fd/0, 从而强制
dvilj2p 从标准输入读取。
现在迎面而来的是另外一个问题, 我们不能使用
/tmp 存放临时连接。 符号连接是被用户和组
bin 拥有的。 而过滤器则是以
daemon 用户运行的。
并且 /tmp 目录设置了 sticky 位。
所以过滤器只能建立符号连接,
但它不能在用完之后清除掉这些连接。
因为它们属于不同的用户。
所以过滤器将在当前工作目录下建立符号连接,
即后台打印队列目录 (用变量
sd 在
/etc/printcap 中指定)。
这是一个非常好的让过滤器完成它工作的地方,
特别还是因为 (有时) 这个目录比起
/tmp 来有更多的可用磁盘空间。
最后, 给出过滤器的代码:
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
自动转换: 一种替代转换过滤器的方法
以上这些转换过滤器基本上建成了您的打印环境,
但也有不足就是必须由用户来指定
(在 &man.lpr.1; 命令行中) 要使用哪一个过滤器。
如果您的用户不是对计算机很在行,
那么选用过滤器将是一件麻烦的事情。
更糟的是, 当过滤器设定的不正确时,
过滤器被用在了不它对应类型的文件上,
打印机也许会喷出上百张纸。
比只安装转换过滤器更好的方法,
就是让文本过滤器 (因为它是默认的过滤器)
来检测要打印文件的类型,
然后自动运行正确的转换过滤器。 像
file 这样的工具可以给我们一定的帮助。 当然,
要区分开
有些 文件的类型还是有困难的 — 但是, 当然,
您可以仅为它们提供转换过滤器。
apsfilter
printing
filters
apsfilter
FreeBSD 的 Ports 套件提供了一个可以自动进行转换的文本过滤器,
名字叫做 apsfilter (print/apsfilter)。
它可以检测纯文本、 &postscript;、 DVI 以及几乎任何格式的文件,
并在执行相应的转换之后完成打印工作。
输出过滤器
LPD 后台打印系统还支持一种我们还没有讨论过的过滤器:
输出过滤器。
输出过滤器只是用来打印纯文本的, 类似于文本过滤器,
但简化了许多地方。 如果您正在使用输出过滤器而不是文本过滤器,
那么:
LPD 为整个任务启动一个输出过滤器,
而不是为任务中的每个文件都启动一次。
LPD 不会提供任务中文件开始和结束的信息给输出过滤器。
LPD 不会提供用户名或者主机名给过滤器,
所以它是无法做打印记帐的。
事实上它只有两个参数:
过滤器-名字
-w宽度
-l长度
宽度 来自于
pw 变量, 而
length 来自于
pl 变量,
这些值都是实际问题中给打印机设置的。
不要让输出过滤器的简化所耽误。
如果想要输出过滤器完成让任务中的每个文件都重新开始一页打印是
不可能 的。 请使用文本过滤器
(也叫输入过滤器); 详见 安装文本过滤器。
此外, 实际上, 输出过滤器 更复杂 ,
它要检查发给它的字节流中是否有特殊的标志字符,
并且给自己发送信号来代替
LPD 的。
可是, 如果打算要报头页或者需要发送控制字符或者其他的初始化字符串来完成打印报头页,
那么输出过滤器则是 必需的。
(但是它也是
无用的 如果打算对打印的用户计费, 因为
LPD 不会给输出过滤器任何用户或者主机的信息。)
在一台单个的打印机上, LPD
同时允许输出过滤器、 文本过滤器和其他的过滤器。
在某些情况下, LPD 将仅会启动输出过滤器来打印报头页 (详见 报头页)。
然后 LPD 会要求输出过滤器 自己停止运行 ,
它发送给过滤器两个字节: ASCII 031跟着一个
ASCII 001。 当输出过滤器看见这两个字节
(031, 001), 它应该通过发送 SIGSTOP
信号来停止自己的运行。 当
LPD
已经运行好了其他的过滤器, 它会通过给输出过滤器发送 SIGCONT 信号来让输出过滤器重新运行。
如果仅有一个输出过滤器而 没有
文本过滤器, 并且 LPD 正在处理一个纯文本任务,
LPD 会使用输出过滤器来完成这个任务。
像以前运行一样,
输出过滤器会按顺序打印任务中的文件,
而不会插入送纸或其他进纸的命令, 但这也许并
不是 您想要的结果。 在大多数情况下,
您还是需要一个文本过滤器。
lpf 这个我们前面介绍过的文本过滤器程序,
也可以用来做输出过滤器。 如果需要使用快速且混乱的输出过滤器,
但又不想写字节检测和信号发送代码,
那么试试 lpf。
lpf 也可以包含在一个 shell 脚本中来处理任何打印机可能需要的初始化代码。
lpf: 一个文本过滤器
/usr/libexec/lpr/lpf 这个程序包含在
FreeBSD 的二进制程序中, 它是一个文本过滤器 (输入过滤器)。
它可以缩排输出 (用 lpr
-i 命令提交的任务), 可以打印控制字符禁止断页
用 lpr -l 提交的任务),
可以调整任务中退格和制表符打印的位置, 还可以对打印进行记帐。
它同样可以像输出过滤器一样工作。
lpf 适用于很多打印环境。
尽管它本身没有向打印机发送初始化代码的功能,
但写一个 shell
脚本来完成所需的初始化并执行
lpf 是很容易的。
page accounting
accounting
printer
为了让 lpf 可以正确的进行打印记帐,
那么需要 /etc/printcap 中的 pw 和 pl 变量都填入正确的值。
它用这些值来测定一页能打印多少文本,
并计算出任务有多少页。
想得到更多关于打印记帐的信息, 请参见 对打印机使用进行记帐。
网络打印
printers
network
network printing
FreeBSD 支持网络打印: 发送任务给远程打印机。
网络打印通常指两种不同的方式:
访问一台连接在远程主机上的打印机。
在一台主机上安装一台常规的串口或并口打印机。
然后, 设置 LPD
来通过网络访问其他主机上的打印机。
具体见 安装在远程主机上的打印机
这节。
访问一台直接连接在网络上的打印机。
打印机另有一个网络接口 (或者替代常规的串口或者并口)。
这样的打印机可能像下面这样工作:
它或许可以理解 LPD
的协议, 并且甚至可以接收远程主机发来的任务排进队列。
这样, 它就像一个普通的主机运行着
LPD 一样。 做在
安装在远程主机上的打印机
里介绍的步骤, 可以设置好这样的打印机。
它或许支持网络数据流。
这样, 把打印机 接
在一台网络上的主机上,
由这台主机负责安排任务并发送任务到打印机。
参见 带网络数据流接口的打印机
这节来得到更多安装这类打印机的建议。
安装在远程主机上的打印机
LPD 后台打印系统内建了对给其他也运行着
LPD (或者是与
LPD 兼容的) 的主机发送任务的功能。
这个功能使您可以在一台主机上安装打印机,
并让它可以在其他主机上访问。 这个功能同样适用在那些有网络接口并且可以理解
LPD 协议的打印机上。
要开启这种远程打印的功能, 首先在一台主机上安装打印机, 就是
打印服务器, 可以使用在
简单打印机设置
这节中简单设置的方法。 高级的设置可以参考 高级打印机设置 这节中你需要的部分。
一定要测试一下打印机, 看看它是不是所有您开启的
LPD 的功能都正常工作。 此外还需要确认
本地主机 允许使用 远程主机 上的
LPD
服务 (参见 限制远程打印机任务)。
printers
network
network printing
如果您正在使用一台带网络接口并与
LPD 兼容的打印机, 那么我们那下面讨论中的
打印服务器
就是打印机本身, 而
打印机名 就是您为打印机配置的名字。
参考随打印机和/或者打印机-网络接口供给的文档。
如果您正使用惠普的 Laserjet,
则打印机名 text 将自动地为您完成 LF 到
CRLF 的转换, 因而也就不需要
hpif 脚本了。
然后, 在另外一台你想要访问打印机的主机上的
/etc/printcap 文件中加入它们的记录,
像下面这样:
可以随意给这个记录起名字。 简单起见,
您可以给打印服务器使用相同的名字或者别名。
保留 lp 变量为空,
(:lp=:)。
建立一个后台打印队列目录, 并用
sd 变量指明其位置。 LPD
将把任务提交给打印服务器之前,
会把这些任务保存在这里。
在
rm 变量中放入打印服务器的名字。
在
rp 中放入打印服务器上打印机的名字。
就是这样。 不需要列出转换过滤器,
页面大小, 或者其他的一些东西在
/etc/printcap 文件中。
这有一个例子。 主机 rose 有两台打印机,
bamboo 和 rattan。
我们要让主机 orchid 的用户可以使用这两台打印机。
下面是 /etc/printcap 文件, 用在主机
orchid (详见 开启报头页)
上的。 文件中已经有了打印机
teak 的记录; 我们在主机
rose 上增加了两台打印机:
#
# /etc/printcap for host orchid - added (remote) printers on rose
#
#
# teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
然后, 我们只需要在主机
orchid 上建立一个后台打印队列目录:
&prompt.root; mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
&prompt.root; chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
现在, 主机 orchid 上的用户可以打印到
rattan 和 bamboo 了。 如果,
比如, 一个用户在主机 orchid 上输入了:
- &prompt.user; lpr -P bamboo -d sushi-review.dvi
+ &prompt.user; lpr -P bamboo -d sushi-review.dvi
LPD 系统在主机 orchid
上会复制这个任务到后台打印队列目录
/var/spool/lpd/bamboo 并且记下这是一个
DVI 任务。 当主机 rose 上的打印机
bamboo 的后台打印队列目录有空间的时, 这两个
LPD 系统将会传输这个文件到主机
rose 上。 文件将排在主机 rose
的队列中知道最终被打印出来。 它将被从 DVI 转换成
&postscript; (因为 bamboo 是一台 &postscript; 打印机) 在主机
rose。
带有网络数据流接口的打印机
通常, 当您为打印机购买了一块网卡,
可以得到两个版本: 一个是模拟后台打印 (贵一些的版本),
或者一个只发送数据给打印机就像在使用串口或者并口一样
(便宜一些的版本)。
这节讲述如何使用这个便宜一些的版本。 要得到贵一些版本的更多信息,
参见前面章节 安装在远程主机上的打印机。
/etc/printcap 文件的格式让您指定使用哪个串口或并口,
并且还要指定 (如果您正在使用串口),
使用多快的波特, 是否使用流量控制,
为制表符延迟, 转换换行, 等等。
但是没有一种方法指定一个连接到一台正在监听 TCP/IP 的或者其他网络接口的打印机。
要发送数据到网络打印机, 就需要开发一个通讯程序,
它可以被文本或者转换过滤器调用。
下面是一些例子: 脚本
netprint 将标准输入的所有数据发送到一个连在网络上的打印机。
我们将打印机的名字作为第一个参数, 端口号跟在后面作为第二个参数, 传给
netprint。
注意它只支持单向通讯 (FreeBSD 到打印机);
很多网络打印机支持双向通讯, 并且这是您可能利用到的
(得到打印机状态, 进行打印记帐, 等等的时候。)。
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require 'sys/socket.ph';
($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
然后我们就可以在多种过滤器里使用这个脚本了。 加入我们有一台
Diablo 750-N 行式打印机联在网络上。 打印机在 5100 端口上接收要打印的数据。
打印机的主机名是 scrivener。
这里是为这个打印机写的文本过滤器:
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
限制打印机的使用
printers
restricting access to
这节将讲述关于限制打印机使用的问题。
LPD 系统让您可以控制谁可以访问打印机,
无论本地或是远程的,
是否他们可以打印机多份副本, 任务可以有多大,
以及打印队列的尺寸等。
限制多份副本
LPD 系统能够简化用户在打印多份副本时的工作。
用户可以用 lpr -#5
(举例) 来提交打印任务, 则会将任务中每个文件都打印五份副本。
这是不是一件很棒的事情呢。
如果您感觉多份副本会对打印机造成不必要的磨损和损耗,
您可以屏蔽掉 &man.lpr.1; 的 选项,
这可以通过在 /etc/printcap
文件中增加 sc 变量来完成。 当用户用
选项提交任务时, 他们将看到:
lpr: multiple copies are not allowed
注意当为一台远程打印机进行设置时 (参见
安装在远程主机上的打印机 这一节)
您还需要同时在远程主机的 /etc/printcap 文件中
增加sc 变量,
否则用户还是可以从其他主机上提交使用多份副本的任务。
下面是一个例子。 这个是
/etc/printcap 文件在主机
rose 上。 打印机 rattan
非常轻闲, 所以我们将允许多份副本, 但是激光打印机
bamboo 则有些忙, 所以我们禁止多份副本,
通过增加 sc
变量:
#
# /etc/printcap for host rose - restrict multiple copies on bamboo
#
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:sc:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
现在, 我们还需要增机 sc 变量在主机
orchid 的
/etc/printcap 文件中 (顺便我们也禁止打印机
teak 多份打印) :
#
# /etc/printcap for host orchid - no multiple copies for local
# printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
通过使用 sc 变量, 我们阻止了
lpr -# 命令的使用, 但仍然没有禁止用户多次运行
&man.lpr.1; ,
或者多次提交任务中同样的文件,
像下面这样:
- &prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
+ &prompt.user; lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
这里有很多种方法可以阻止这种行为 (包括忽略它),
并且是免费的。
限制对打印机的访问
您可以控制谁可以打印到哪台打印机通过 &unix;
的组机制和文件 /etc/printcap 中的
rg 变量。
只要把可以访问打印机的用户放进适当的组中, 然后在
rg 变量中写上组的名字。
非这组的用户 (包括 root)
将会得到这样的提示:
lpr: Not a member of the restricted group
如果他们试图打印到被限制的打印机。
像使用 sc (禁止多份副本)
变量一样, 您需要指定 rg
在远程同样对打印机有访问限制的主机上,
如果您感觉合适的话 (参考 安装在远程主机上的打印机 这一节)。
比如, 我们将让任何人都可以访问打印机
rattan, 但只有在
- artists 组中的人可以使用打印机 bamboo。
+ artists 组中的人可以使用打印机 bamboo。
这里是类似的主机 rose 上的
/etc/printcap 文件:
#
# /etc/printcap for host rose - restricted group for bamboo
#
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:sc:rg=artists:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Let us leave the other example
/etc/printcap file (for the host
orchid) alone. Of course, anyone on
orchid can print to bamboo. It
might be the case that we only allow certain logins on
orchid anyway, and want them to have access to the
printer. Or not.
这里每台仅能有一个限制的组。
控制提交的任务大小
print jobs
如果您有很多用户访问打印机,
可能需要对用户可以提交的文件尺寸设置一个上限。
毕竟, 文件系统中后台打印队列目录的空间是有限的,
您需要保证这里有空间来存放其他用户的任务。
print jobs
controlling
LPD 允许通过使用
mx 变量来限制任务中文件的最大字节数,
方法是指定单位为块的
BUFSIZ 数, 每块表示 1024 字节。
如果在这个变量的值是 0, 则表示不进行限制;
不过, 如果不指定
mx 变量的话,
则会使用默认值 1000 块。
这个限制是对于任务中 文件 的,
而 不是 任务总共的大小。
LPD 不会拒绝比限制大小大的文件。
但它是将限制大小以内的部分排入队列,
并且打印出来的只有这些。 剩下的部分将被丢弃。
这个行为是否正确还需讨论。
让我们来为例子打印机
rattan 和 bamboo 增加限制。
- 由于那些艺术家的 &postscript; 文件可能会很大,
+ 由于那些 artists 的 &postscript; 文件可能会很大,
我们将限制大小为 5 兆字节。 我们将不对纯文本行式打印机做限制:
#
# /etc/printcap for host rose
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:mx#0:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
同样, 限制只对本地用户起作用。
如果设置了允许远程用户使用您的打印机, 远程用户将不会受到这些限制。
您也需要指定 mx
变量在远程主机的 /etc/printcap 文件中。
参见 安装在远程主机上的打印机
这一节来得到更多有关远程打印的信息。
除此之外, 还有另一种限制远程任务大小的方法;
参见 限制远程打印机任务。
限制远程打印机任务
LPD 后台打印系统提供了多种方法来限制从远程主机提交的任务:
主机限制
您可以控制本地
LPD 接收哪台远程主机发来的请求,
通过 /etc/hosts.equiv 文件和
/etc/hosts.lpd 文件。
LPD 查看是否到来的任务请求来自被这两个文件中列出的主机。
如果没有, LPD
会拒绝这个请求。
这些文件的格式非常简单: 每行一个主机名。
注意
/etc/hosts.equiv 文件也被
&man.ruserok.3; 协议使用, 并影响着
&man.rsh.1; and &man.rcp.1; 等程序, 所以要小心。
举个例子, 下面是
/etc/hosts.lpd 文件在主机
rose 上:
orchid
violet
madrigal.fishbaum.de
意思是主机 rose 将接收来自
orchid, violet,
和 madrigal.fishbaum.de 的请求。
如果任何其他的主机试图访问主机 rose 的
LPD, 任务将被拒绝。
大小限制
您可以控制后台打印队列目录需要保留多少空间。
建立一个叫做
minfree 的文件在后台打印队列目录下为本地打印机。
在这个文件中插入一个数字来代表多少磁盘块数 (512 字节)
的剩余空间来接收远程任务。
这让您可以保证远程用户不会填满您的文件系统。
您也可以用它来给本地用户一个优先:
他们可以在磁盘剩余空间低于
minfree
文件中的指定值后仍然可以提交任务。
比如, 让我们增加一个 minfree
文件为打印机 bamboo。 我们检查
/etc/printcap 文件来找到这个打印机的后台打印队列目录;
这里是打印机 bamboo
的记录:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
后台打印队列目录在 sd
变量中给出。 我们设置 3 兆字节 (6144 磁盘块)
为文件系统上必须存在的总共剩余空间, 让
LPD 可以接受远程任务:
&prompt.root; echo 6144 > /var/spool/lpd/bamboo/minfree
用户限制
您可以控制哪些远程用户可以打印到本地打印机, 通过指定
rs 变量在
/etc/printcap 文件中。 当
rs 出现在一个本地打印机的记录中时,
LPD 将接收来自远程主机
并 在本地有同样登录名的用户提交的任务。
否则, LPD 会拒绝这个任务。
这个功能在一个 (比如) 有许多部门共享一个网络的环境中特别有用,
并且有些用户可以越过部门的边界。
通过为他们在您的系统上建立帐号,
他们可以他们自己的部门的系统里使用您的打印机。
如果 只 允许他们您的打印机,
而不是您的计算机资源, 您可以给他们
象征
帐户, 不带主目录并且设置一个没用的
shell , 比如 /usr/bin/false。
对打印机使用记帐
accounting
printer
当然, 你需要对打印付费。 为什么不? 纸张和墨水都需要花钱的。
并且这里还有维护的费用 — 打印机是由很多部件组装成的,
并且零件会坏掉。 您可以检查您的打印机,
使用形式, 和维护费用来得出每页
(或者每尺, 每米, 或者每什么) 的费用。 现在,
您怎样启动打印记帐呢?
好了, 坏消息是 LPD
后台打印系统在这个部分没有提供很多帮助。
记帐是一个对使用的打印机的种类,
打印的格式, 和
您的 在对打印机的使用计费的需求依赖性很高的。
要实现记帐, 您必须更改打印机的文本过滤器
(对纯文本任务记费) 和转换过滤器
(对其他格式的文件计费), 要统计页数或者查询打印了多少页的话。
您不可以通过使用简单的输出过滤器来逃脱计费,
因为它不能进行记帐。 参见 过滤器 这节。
通常, 有两种方法来进行记帐:
定期记帐 是更常用的方法,
可能因为它更简单。 无论合适何人打印一个任务,
过滤器都将记录用户名, 主机名, 和打印的页数到一个记帐文件。
每个月, 学期, 年, 或者任何您想设定的时间段,
收集这些不同打印机上的记帐文件,
按用户对打印的页数进行结算, 并对使用进行付费。
然后删掉所有记录文件, 开始一个新的计费周期。
实时记帐 不太常用,
可能因为它比较难。
这种方法让过滤器对用户的打印进行实时的记帐。
像磁盘配额, 记帐是实时的。
您可以组织用户打印当他们的帐户超额的时候,
并且可能提供一种方法让用户检查并调整他们的
打印配额。
但这个方法需要一些数据库代码来跟踪用户和他们的配额。
LPD 后台打印系统对两种方法都支持且很简单:
所以您需要提供过滤器
(大多数时候), 还要提供记帐代码。
但这好的方面是: 您可以有非常灵活的记帐方法。
比如, 您可以选择使用阶段记帐还是实时记帐。
您可以选择记录哪些信息:
用户名, 主机名, 任务类型, 打印页数,
使用了多少平方尺的纸, 任务打印了多长时间, 等等。
您可以通过修改过滤器来存储这些信息。
快速并且混乱的打印记帐
FreeBSD 包含两个可以让您立刻可以建立起简单的阶段记帐的程序。
它们是文本过滤器
lpf, 在 lpf: 一个文本过滤器 这节中描述, 和
&man.pac.8;, 一个收集并统计打印机记帐文件中记录的程序。
像在前面章节提到的过滤器一样
(过滤器),
LPD
启动文本或者转换过滤器并在过滤器命令行里带上记帐文件的名字。
过滤器可以使用这个参数知道该往哪写记帐记录。
这个文件的名字来自于
af 变量在
/etc/printcap 文件里, 并且如果没有指定绝对路径,
则默认是相对于后台打印队列目录的。
LPD 启动 lpf
带着页宽和页长的参数
(通过 pw 和 pl
变量)。 lpf 使用这些参数来判定将使用多少张纸。
在文件发送到打印机之后,
它就会在记帐文件中写入记录。
记录像下面这个样子:
2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang
您应该让每个打印机都使用一个独立的记帐文件, 像
lpf 就没有内建文件锁逻辑,
这样两个 lpf 可能会发生彼此记录混合的情况,
如果它们同时要在同一个文件写入内容的时候。
一个最简单的保证每个打印机都使用一个独立的记帐文件的方法就是将
af=acct 写在 /etc/printcap 文件中。
然后, 每个打印机的记帐文件都会在这台打印机的后台打印队列目录中,
文件的名字叫做 acct。
当您准备对用户的打印进行收费时, 运行
&man.pac.8; 程序。 只要转换到要收集信息的这台打印机的后台打印队列目录,
- 然后输入 pac。
+ 然后输入 pac。
您将会得到一个美元计费的摘要像下面这样:
Login pages/feet runs price
orchid:kelly 5.00 1 $ 0.10
orchid:mary 31.00 3 $ 0.62
orchid:zhang 9.00 1 $ 0.18
rose:andy 2.00 1 $ 0.04
rose:kelly 177.00 104 $ 3.54
rose:mary 87.00 32 $ 1.74
rose:root 26.00 12 $ 0.52
total 337.00 154 $ 6.74
这些是 &man.pac.8; 需要的参数:
哪台 打印机 要结帐。
这个选项仅在用
af 变量在
/etc/printcap 文件中指定了绝对路径的情况下起作用。
以金额来排序输出来代替以用户名字字母排序。
忽略记帐文件中的主机名。 带上这个选项,
用户 smith 在主机
alpha 上与同样的用户
smith 在主机 gamma 上一样。
不带这个选项的话, 他们则是不同的用户。
使用 price
作为每页或每尺美元的单价来替代
pc 变量指定的单价在
/etc/printcap 文件中, 或者两分 (默认)。
price
可以用一个浮点数来指定。
反向排序。
建立一个记帐摘要文件,
并且截短记帐文件。
名字
…
只打印指定
名字 用户的记帐信息。
在 &man.pac.8; 默认产生的摘要中,
可以看到在不同主机上的每个用户打印了多少页。
如果在您这里, 主机不考虑 (因为用户可以使用任何主机),
运行 pac -m,
来得到下面的摘要:
Login pages/feet runs price
andy 2.00 1 $ 0.04
kelly 182.00 105 $ 3.64
mary 118.00 35 $ 2.36
root 26.00 12 $ 0.52
zhang 9.00 1 $ 0.18
total 337.00 154 $ 6.74
要以美元计算应付钱数,
&man.pac.8; 指定 pc 变量在
/etc/printcap 文件中 (默认是 200, 或者 2 分每页).
这个参数的单位是百分之一分,
在这个变量中指定每页或者每尺的价格。
您可以覆盖这个值当运行 &man.pac.8; 带着参数
的时候。 参数
的单位是美元, 而不是百分之一分。
- 例如,
+ 例如,
&prompt.root; pac -p1.50
- 设定每页的价格是 1 美元 5 美分。
+ 设定每页的价格是 1 美元 5 美分。
您可以通过这个选项来达到目标利润。
最终, 运行 pac -s 将存储这些信息在一个记帐文件里,
文件名和打印机帐户的名字相同,
但是带着 _sum
的后缀。 然后截短记帐文件。
当您再次运行 &man.pac.8; 的时候, 它再次读取记帐文件来得到初始的总计,
然后在记帐文件中增加信息。
怎样对打印的页数进行计数?
为了进行远程的精确记帐,
需要判断一个任务将会消耗多少张纸。
这是打印记帐问题的关键。
对于纯文本任务, 这个问题不是太难解决:
对任务中的行数进行计数然后与打印机支持的每页行数进行比较。
别忘了也对添印的行, 或者很长的逻辑上的一行但在打印机上会折成两行的这类进行记帐。
文本过滤器 lpf (在 lpf:一个文本过滤器 这节中介绍)
会在记帐时考虑这些问题。
如果正在编写一个可以进行记帐的文本过滤器,
您可能需要查看 lpf 的源代码。
怎样处理其他格式的文件?
好, 对于 DVI- 到 -LaserJet 或者 DVI- 到 -&postscript; 转换,
可以让您的过滤器输出诊断信息, 关于
dvilj 或者 dvips 命令,
并且看到多少页被转换了。 您也许可以对于其他类型的文件和转换程序进行类似操作。
但是这些方法的弱点就是事实上打印机并不是打印了所有的页。
比如, 卡纸, 缺墨,
或者炸掉了 — 但用户还是要为没有打印的部分付钱。
您该怎样做?
只有一条 肯定 的方法来进行
精确 的记帐。 购买一台可以告诉您它使用了多少纸的打印机,
并且将它连接到串口或者网络上。
几乎所有 &postscript; 打印机都支持这个小功能。
其他制造厂或其他型号也可以有这个功能 (比如 Imagen
激光网络打印机)。 为这些打印机更改过滤器使它在打印完每个任务之后接收纸张用量,
并 仅 基于这个值进行记帐。
不需要计算行数,
也不需要容易出错的文件检查。
当然, 您也总是可以大方的使打印免费。
使用打印机
printers
usage
这节将讲述如何使用在
FreeBSD 下设置好的打印机。 下面是一个用户级命令的总览:
&man.lpr.1;
打印任务
&man.lpq.1;
检查打印队列
&man.lprm.1;
从打印机的队列中移除任务
还有一个管理命令, &man.lpc.8;, 在 管理打印机 一节中有所介绍,
它可以用于控制打印机及其队列。
&man.lpr.1;, &man.lprm.1;, and &man.lpq.1;
这三个命令都接受 选项来指定对哪个打印机 / 队列进行操作,
在
/etc/printcap 文件中列出的打印机。 这允许您提交,
删除, 并检查任务在多个打印机上。 如果您不使用
选项, 那么这些命令会使用在
环境变量 PRINTER 中指定的打印机。
最终, 如果您也没有 PRINTER 这个环境变量,
这些命令的默认值是叫做 lp 的这台打印机。
从此以后, 术语 默认打印机
就是指 PRINTER 环境变量中指定的这台,
或者叫做 lp 的这一台当没有环境变量
PRINTER 的时候。
打印任务
要打印文件, 输入:
&prompt.user; lpr filename ...
printing
这个命令会打印所有列出的文件到默认打印机。
如果没有列出文件, &man.lpr.1; 会从标准输入读取打印数据。
比如, 这个命令打印一些重要的系统文件:
&prompt.user; lpr /etc/host.conf /etc/hosts.equiv
要选择一个指定的打印机, 输入:
&prompt.user; lpr -P printer-name filename ...
这个例子打印一个当前目录的长长的列表到叫做
rattan 的这台打印机:
&prompt.user; ls -l | lpr -P rattan
因为没有为
&man.lpr.1; 命令列出文件, lpr 从标准输入读入数据,
在这里是 ls
-l 命令的输出。
&man.lpr.1; 命令同样可以接受多种控制格式的选项,
应用文件转换, 生成多份副本, 等等。
要得到更多信息, 参考 打印选项 这节。
检查任务
print jobs
当使用 &man.lpr.1; 进行打印时, 您希望打印的所有数据被放在一起打包成了一个
打印任务
, 它被发送到
LPD 后台打印系统。
每台打印机都有一个任务队列,
并且您的任务在队列中等待其他用户的其他任务打印。
打印机按照先来先印的规则打印这些任务。
要显示默认打印机的队列, 输入 &man.lpq.1;。
要指定打印机, 使用 选项。
例如, 命令
&prompt.user; lpq -P bamboo
会显示打印机 bamboo 的队列。
下面是命令 lpq
输出的一个例子:
bamboo is ready and printing
Rank Owner Job Files Total Size
active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
2nd kelly 10 (standard input) 1635 bytes
3rd mary 11 ... 78519 bytes
这里显示了队列中有三个任务在 bamboo 中。
第一个任务, 用户 kelly 提交的, 标识 任务编号
9。 每个要打印的任务都会获得一个不同的任务编号。
大多时候可以忽略这个任务编号, 但在您需要取消任务时会用到这个号码;
参考 移除任务 这节得到更多信息。
编号为 9 的任务包含了两个文件; 在
&man.lpr.1; 命令行中指定的多个文件被看作是一个单个的任务。
它是当前激活的任务 (注意这个词 激活
在 Rank
这列下面), 意思是打印机当前正在打印那个任务。
第二个任务包含了标准输入传给
&man.lpr.1; 命令的数据。
第三个任务来自用户 mary; ,
它是一个比较大的任务。 她要打印的文件的路径名太长了,
所以 &man.lpq.1; 命令只显示了三个点。
&man.lpq.1; 输出的头一行也很有用:
它告诉我们打印机正在做什么 (或者至少是
LPD 认为打印机应该正在做的)。
&man.lpq.1; 命令同样支持 选项来生成一个详细的长列表。
下面是一个
lpq -l 命令的例子:
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf 73 bytes
/etc/hosts.equiv 15 bytes
kelly: 2nd [job 010rose]
(standard input) 1635 bytes
mary: 3rd [job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
移除任务
如果您对一个打印任务改变了主意,
可以用 &man.lprm.1; 将任务从队列中删除。 通常, 您甚至可以用
&man.lprm.1; 命令来移除一个当前激活的任务, 但是任务的一部分或者所有还是可能打印出来。
要从默认打印机中移除一个任务, 首先使用
&man.lpq.1; 找到任务编号。 然后输入:
&prompt.user; lprm job-number
要从指定打印机中删除任务, 增加
选项。 下面的命令会删除编号为
10 的任务从 bamboo 这台打印机:
&prompt.user; lprm -P bamboo 10
&man.lprm.1; 命令有一些快捷方式:
lprm -
删除所有属于您的任务 (默认打印机的)。
lprm user
删除所有属于用户
user 的任务 (默认打印机的)。
超级用户可以删除用户的任务; 您只可以删除自己的任务。
lprm
命令行中不带任务编号, 任务名, 或者
选项, &man.lprm.1; 会删除默认打印机上当前激活的任务,
如果它属于你。 超级用户可以删除任务激活的任务。
使用参数 和上面的快捷方式来用指定打印机替代默认打印机。
例如, 下面的命令会删除当前用户在打印机
rattan 队列中的所有任务:
&prompt.user; lprm -P rattan -
如果您正工作在一个网络环境中, &man.lprm.1;
将只允许在提交任务的主机上删除任务,
甚至是同一台打印机也可以在其他主机上使用时。
下面的命令证明了这个:
- &prompt.user; lpr -P rattan myfile
+ &prompt.user; lpr -P rattan myfile
&prompt.user; rlogin orchid
&prompt.user; lpq -P rattan
Rank Owner Job Files Total Size
active seeyan 12 ... 49123 bytes
2nd kelly 13 myfile 12 bytes
&prompt.user; lprm -P rattan 13
rose: Permission denied
&prompt.user; logout
&prompt.user; lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
超越纯文本:打印选项
&man.lpr.1; 支持许多控制文本格式的参数,
转换图形和其他格式文件,
生成多份副本, 处理任务, 等等。
这一节将描述这些选项。
格式与转换选项
下面的 &man.lpr.1; 参数控制任务中文件的格式。
使用这些参数, 如果任务不含纯文本,
或者您想让纯文本通过
&man.pr.1; 格式化。
&tex;
例如, 下面的命令打印一个 DVI 文件 (来自
- &tex; 排版系统) 文件名为 fish-report.dvi
+ &tex; 排版系统) 文件名为 fish-report.dvi
到打印 bamboo:
- &prompt.user; lpr -P bamboo -d fish-report.dvi
+ &prompt.user; lpr -P bamboo -d fish-report.dvi
这些选项应用到任务中的每个文件, 所以您不能混合
(说) DVI 和 ditroff 文件在同一个任务中。 替代的方法是,
用独立的任务提交这些文件, 使用不同的转换选项给不同的任务。
所有这些选项除了 和
都需要转换过滤器安装给目标打印机。
例如, 选项需要
DVI 转换过滤器。 参考 转换过滤器
这节得到更多细节。
打印 cifplot 文件。
打印 DVI 文件。
打印 FORTRAN 文本文件。
打印 plot 数据。
缩进 number 列;
如果没有指定 number,
则缩进 8 列。 这个选项仅可以工作在某些过滤器上。
不要在选项 和数字之间加入空格。
打印文字数据,
包括控制字符。
打印 ditroff (无设备依赖 troff) 数据。
-p
打印之前用 &man.pr.1; 格式化纯文本。 参考
&man.pr.1; 得到更多信息。
使用 title 在
&man.pr.1; 上来替代文件名。
这个选项仅在使用
选项时起作用。
打印 troff 数据。
打印 raster 数据。
下面是一个例子: 这个命令打印了一个很好的
&man.ls.1; 联机手册到默认打印机:
&prompt.user; zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t
&man.zcat.1; 命令解压缩
&man.ls.1; 的手册并且将内容传给 &man.troff.1;
命令, 它将格式化这些内容并且生成 GNU troff
输出给 &man.lpr.1; , 它提交任务到
LPD 后台打印。
因为使用了
选项为 &man.lpr.1; , 后台打印将会转换 GNU
troff 输出到默认打印机可以理解的格式当任务被打印时。
任务处理选项
下面的 &man.lpr.1; 选项告诉
LPD 对任务特殊处理:
-# copies
生成 copies 个副本给任务中的每个文件,
替代每个文件一份副本。
管理员可以禁止这个选项来减少打印机的浪费和鼓励复印机的使用。
参考
限制多份副本。
这个例子打印三份副本的文件
- parser.c 跟着三份副本的文件
- parser.h 到默认打印机:
+ parser.c 跟着三份副本的文件
+ parser.h 到默认打印机:
- &prompt.user; lpr -#3 parser.c parser.h
+ &prompt.user; lpr -#3 parser.c parser.h
-m
打印完成后发信。 使用这个选项,
LPD 系统将会发送邮件到您的帐户,
当它完成了处理您的任务后。
在信中, 它将会告诉您任务是否成功完成或者出现了错误,
并且 (通常) 指明是什么错误。
-s
不要复制文件到后台打印队列目录,
要使用符号连接。
如果您正在打印一个很大的任务, 您可能需要这个选项。
它节省后台打印队列目录的空间
(您的任务可能使后台打印队列目录所在的文件系统剩余空间超出)。
它同样也节省了时间, 因为
LPD
将不会副本任务的每个字节到后台打印队列目录。
这也有一个缺点: 因为
LPD 将直接指向源文件,
您不能修改或者删除它们直到它们被打印出来。
如果您打印到一台远程打印机,
LPD
将最终将文件从本地主机副本到远程主机上,
所以选项 只能节省本地后台打印队列目录的空间,
而不是远程的。
虽然如此, 但它还是很有用。
-r
移除任务中的文件在它们被复制到后台打印队列目录之后,
或者在用
选项打印它们之后。
谨慎使用这个选项!
报头页选项
这些 &man.lpr.1; 的选项调整了通常出现在任务报头页上的文本。
如果报头页被跳过了在目标打印机上,
这些选项将不会起作用。 参考
报头页
得到更多关于设置报头页的信息。
-C text
替换报头页上的主机名为
text。
主机名通常都是提交任务的主机名称。
-J text
替换报头页上的任务名为
text。 任务名通常是任务中头一个文件的名字,
或者
stdin 如果您正在打印标准输入。
-h
不打印任何报头页。
在某些地点, 这个选项可能无效,
与报头页的产生方法有关。 参考 报头页
得到详细信息。
管理打印机
作为一个打印机的管理者, 您必须要安装,
设置, 并且测试它们。 使用 &man.lpc.8; 命令,
您可以与打印机以更多的方式交流。 用 &man.lpc.8; ,
您可以
启动或停止打印机
启用或禁止它们的队列
重新安排每个队列中的任务。
首先, 一个关于术语的解释: 如果一个打印机被
停止 了, 它将不会打印它队列中的任何东西。
但用户还是可以提交任务, 它们会在队列中等待直到打印机被
启动 或者队列被清空。
如果一个队列被 禁止, 没有用户 (除了
root) 可以提交任务到打印机。 一个
启用 的队列允许任务被提交。
一个打印机可以被 启动 但它的队列被禁止,
在这种情况下打印机将打印队列中的任务, 直到队列为空。
通常, 您必须有 root 权限来使用
&man.lpc.8; 命令。 普通用户可以使用 &man.lpc.8;
命令来获得打印机状态并且重启一台挂了的打印机。
这里是一个关于 &man.lpc.8; 命令的摘要。 大部分命令带着一个
printer-name 参数来知道要对哪台打印机操作。
您可以用 all
填在 printer-name 的位置来代表所有在
/etc/printcap 文件中列出的打印机。
abort
printer-name
取消当前任务并停止打印机。
用户仍然可以提交任务, 如果队列还是启用的。
clean
printer-name
从打印机的后台打印队列目录移除旧的文件。
有时, 组成任务的文件没有被
LPD 正确的删除,
特别是在打印中出现错误或者管理活动比较多的时候。
这个命令查找不属于后台打印队列目录的文件并删除它们。
disable
printer-name
禁止新任务入队。 如果打印机正在工作,
它将会继续打印队列中剩余的任务。
超级用户 (root) 总是可以提交任务,
甚至提交到一个禁止的队列。
这个命令在测试一台新打印机或者安装过滤器时非常有用:
禁止队列并提交以
root 提交任务。
其他用户将不能提交任务直到您完成了测试并用命令
enable 重新启用了队列的时候。
down printer-name
message
打印机下线。 等于
disable 命令后跟一个 stop 命令。
message 将作为打印机状态,
当用户使用 &man.lpq.1; 或者 lpc status
命令查看打印机队列状态的时候显示出来。
enable
printer-name
为打印机开启队列。
用户可以提交任务到打印机但是在打印机启动之前不会打印出任何东西。
help
command-name
打印关于
command-name 命令的帮助。 不带
command-name,
则打印可用命令的摘要。
restart
printer-name
启动打印机。 普通用户可以使用这个命令,
当一些特别的环境导致
LPD 锁死时, 但他们不能启用一台使用
stop 或者
down 命令停用的打印机。
restart 命令等同于
abort 后跟着一个
start。
start
printer-name
启用打印机。 打印机将开始打印队列中的任务。
stop
printer-name
停止打印机。 打印机将完成当前任务并且将不再打印队列中的任务任务。
尽管打印机被停用,
但用户仍然可以提交任务到一个开启的队列。
topq printer-name
job-or-username
重新以
printer-name 安排队列,
通过将列出的 job 编号或者指定的所属
username 的任务放在队列的最前面。
对于这个命令, 您不可以使用
all 当作
printer-name。
up
printer-name
打印机上线; 相对于
down 命令。 等同于
start 后跟着一个
enable 命令。
&man.lpc.8; 的命令行接受上面的命令。
如果您不输入任何命令, &man.lpc.8; 则进入一个交互模式,
在这里您可以输入命令直到输入 exit,
quit, 或者文件结束符。
替换标准后台打印
如果您已经通读过了这个手册,
那么到现在您应该已经了解了关于 FreeBSD 包含的后台打印系统
LPD
的一切。 您可能发现了它很多的缺点,
它们很自然的让您提出这样的问题:
这里还有什么后台打印系统吗 (并且可以工作在
FreeBSD 上) ?
LPRng
LPRng
LPRng, 它的意思是
LPR: 下一代
,
是一个完全重写的 PLP。 Patrick Powell
和 Justin Mason (PLP 维护的主要负责人) 合作完成了
LPRng。
LPRng 的主站是 。
CUPS
CUPS
CUPS, 通用 UNIX 打印系统,
提供了一个轻便的打印层给 &unix;-基础的操作系统。
它是由 Easy Software
Products 开发的, 并且成为了 &unix;
供应商和用户的标准打印解决方案。
CUPS 使用 Internet 打印协议
(IPP) 作为管理打印任务和队列的基础。
行式打印机守护程序
(LPD) 服务器消息块
(SMB), 和 AppSocket (a.k.a. JetDirect)
协议的部分功能也被支持。 CUPS
增加了基于浏览网络打印机和 PostScript 打印机描述
(PPD) 的打印选项来支持
&unix; 下的真实打印。
CUPS 的主站是 。
疑难问题
在使用 &man.lptest.1; 进行简单的测试之后,
您可能得到了下面的结果,
而不是正确的结果:
过了一会儿, 它工作了; 或者, 它没有退出一整张纸。
打印机进行了打印, 但在这之前它呆了一段而且什么都没做。
事实上, 您可能需要按一下打印机上的
打印剩余 或者 送纸 按钮来让结果出现。
如果这是问题所在, 打印机可能在等待,
看看在打印之前, 您的任务是否还有更多的数据。
要修正这个问题, 您可以让文本过滤器发送一个送纸字符
(或者其他需要的) 到打印机。
这通常足够让打印机立即打印出内部缓存内剩余的文本。
它同样可以用来确保每个任务的结尾都占用一整张纸,
这样下一个任务才不会在前一个任务最后一张纸的中间开始。
接下来的 shell 脚本
/usr/local/libexec/if-simple
的脚本打印了一个送纸符在它发送任务到打印机之后:
#!/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.
# Writes a form feed character (\f) after printing job.
/bin/cat && printf "\f" && exit 0
exit 2
它的输出产生了 楼梯效果
。
您可能在纸上得到下面这些:
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
MS-DOS
OS/2
ASCII
您也成为了 楼梯效果
的受害者, 这是由对新行的标志字符的解释不一致造成的。
&unix; 风格的操作系统使用一个单个字符:
ASCII 码 10,
即换行 (LF)。 &ms-dos;, &os2;, 和其他的系统使用一对儿字符,
ASCII 码 10 和 ASCII 码
13 (回车 CR)。 许多打印机使用 &ms-dos;
的习惯来代表新行。
当您在 FreeBSD 上打印时, 您的文本仅用了换行字符。
打印机, 打印机看到换行字符后,
走一行纸, 但还光标位置还是在这张纸上要打印的下一个字符处。
这就是回车的作用:
将下一个要打印的字符的位置移到纸张的左边缘。
这里是 FreeBSD 想要打印机做的:
打印机收到 CR
打印机打印 CR
打印机收到 LF
打印机打印 CR + LF
下面有几种完成这个的办法:
使用打印机的配置开关或者控制面板来更改它对这些字符的解释。
查看打印机的手册来找到怎样更改。
如果您引导您的系统到其他除了
FreeBSD 之外的操作系统, 您可能不得不
重新配置 打印机使用
这个操作系统对 CR 和 LF 字符的解释。
您可能更喜欢下面这另一种解决方案。
让 FreeBSD 的串口驱动自动转换 LF 到 CR+LF。
当然, 这 仅仅 工作在串口打印机上。
要开启这个功能,
定义 ms# 变量并
设置 onlcr 模式在
/etc/printcap 文件中相应打印机处。
发送一个 转义码 到打印机来让它临时对 LF 字符做不同的处理。
参考您的打印机手册来了解您的打印机支持哪些转义码。
当您找到合适的转义码,
修改文本过滤器让其先发送这个转义码,
然后再发送打印任务。
PCL
这里是一个为懂得
Hewlett-Packard PCL 转义码的打印机编写的文本过滤器。
这个过滤器使得打印机将 LF 作为一个 LF 和一个 CR 来对待;
然后它发送任务; 最后发送一个送纸符弹出任务的最后一张纸。
它应该可以在几乎所有
Hewlett Packard 打印机上工作。
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Ejects the page when done.
printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
exit 2
下面是一个 /etc/printcap 文件的例子在叫做
orchid 的主机上。 它只有一台打印机连接在第一个并口上,
一台 Hewlett Packard
LaserJet 3Si 名字叫做 teak。 它使用上面那段脚本作为文本过滤器:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
行行覆盖。
打印机从来不进纸换行。
所有的文本都打印在头一行文本的上面。
这个问题是 相反
于楼梯效果,
像上面描述的那样, 并且更少见。
一些地方, LF 这个 FreeBSD 用来结束一行的字符被作为
CR 这个将打印位置返回到纸的左边的字符对待。
而没有向下走纸一行。
使用打印机的配置开关或者控制面板来强制对
LF 和 CR 进行下面的转换:
打印机收到
打印机打印
CR
CR
LF
CR + LF
打印丢掉字符。
当打印时, 每行里打印机都丢掉一些字符没有打。
这个问题可能随着打印的进行越发严重,
丢掉越来越多的字符。
这个问题是由打印机跟不上计算机通过串口发送数据的速度造成的
(这个问题应该不会发生在并口打印机上)。
有两种方法能克服这个问题:
如果打印机支持 XON/XOFF 流量控制,
那就让 FreeBSD 使用它, 通过加入 ixon 模式在
ms# 变量里。
如果打印机支持载波流量控制,
指定 crtscts 模式在
ms# 变量里。
并且要确定连接打印机和计算机的线是支持载波流量控制的。
它打印出垃圾。
打印机打印出的东西看起来是一些随机的字符,
而不是想要打印的东西。
这通常意味着另一种串口打印机通讯参数设置不正确的错误。
复查
br 变量中设定的波特, 和
ms# 中的校验设置; 确定打印机也在使用和
/etc/printcap 文件中相同的设置。
没有反应。
如果没有反应, 问题就可能出在
FreeBSD 而不是硬件上了。 增加日志文件
(lf) 变量到
/etc/printcap 文件里出现问题的打印机的记录处。
比如, 下面是打印机 rattan 的记录, 使用了
lf 变量:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
然后, 再次打印。 检查日志文件 (在我们的例子当中, 是
/var/log/rattan.log 这个文件) 来看是否有错误信息出现。
根据出现的信息,
试着来修正问题。
如果您没有指定 lf 变量,
LPD 会使用
/dev/console 作为默认值。