diff --git a/zh_CN.GB2312/books/handbook/disks/chapter.sgml b/zh_CN.GB2312/books/handbook/disks/chapter.sgml
index d77e5b2b45..06e7c9d96f 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
+ 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
+ 表示非 root 和非 swap 分区。在标签编辑器中,可以使用键入 C
创建一个文件系统。当提示这是否是一个 FS(文件系统)或 swap 时,选择
FS,然后给出一个加载点(如: /mnt)。
当在 post-install 模式时添加一个磁盘, sysinstall
不会在 /etc/fstab 中创建记录,所以是否指定加载点并不重要。
现在已经准备把新标签写到磁盘上,然后创建一个文件系统,可以按下
- W。出现任何错误都会不能创建新的分区。可以退出标签编辑
+ 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 应替换成用户的登录名):
+ /mnt/username
+ (此处 username 应替换成用户的登录名):
- &prompt.root; mkdir /mnt/$USER
-&prompt.root; chown $USER:$USER /mnt/$USER
+ &prompt.root; mkdir /mnt/username
+&prompt.root; chown user:user /mnt/user
假设已经插入了一个 USB 读卡设备, 并且系统将其识别为
/dev/da0s1, 由于这些设备通常是 FAT
文件系统, 用户可以这样挂接它们:
- &prompt.user; mount -t msdosfs -m 644 -M 755 /dev/da0s1 /mnt/$USER
+ &prompt.user; mount -t msdosfs -m 644 -M 755 /dev/da0s1 /mnt/username
如果拔出设备 (必须首先将其对应的磁盘卷卸下),
则您会在系统消息缓冲区中看到类似下面的信息:
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; /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/kernelconfig/chapter.sgml b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml
index b32a9135b4..2873a085ac 100644
--- a/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/kernelconfig/chapter.sgml
@@ -1,1316 +1,1318 @@
Jim
Mock
Updated and restructured by
Jake
Hamby
Originally contributed by
配置FreeBSD的内核
概述
内核
建立一个定制的内核
内核是 &os; 操作系统的核心。 它负责管理内存、 执行安全控制、
网络、 磁盘访问等等。 尽管 &os; 可以动态修改的现在已经越来越多,
但有时您还是需要重新配置和编译您的内核。
读完这章,您将了解:
为什么需要建立定制的内核。
如何编写内核配置文件,或修改已存在的配置文件。
如何使用内核配置文件创建和联编新的内核。
如何安装新内核。
如何处理出现的问题。
这一章给出的命令应该以 root 身份执行,
否则可能会不成功。
为什么需要建立定制的内核?
过去, &os; 采用称作 单片式
的内核。
这句话的意思是说内核是一个大的程序, 支持固定的设备,
如果您希望改变内核的行为则必须编译一个新的,
并重新启动计算机来引导它。
今天, &os; 已经迅速地转移到了一个新的模型,
其重要特征是内核功能可以由能够根据需要动态加载和卸载的模块来提供。
这使得内核能够迅速地适应硬件的调整 (例如笔记本电脑的 PCMCIA),
或为内核增加在最初编译它时所不具备的新的功能。
这一模式成为模块化内核。
尽管如此, 一些功能仍然需要静态地连编进内核。
一些情况是因为这些功能于内核的结合十分紧密,
而不可能将它们做成可以动态加载的。
另一种情况是因为没有人有时间来编写实现那个功能的可以动态加载的内核模块。
建造定制的内核是几乎每一个 BSD 用户所必须经历的一关。
尽管这项工作可能比较耗时, 但它能够为使用 &os; 系统带来很多好处。
与必须支持大量各式硬件的 GENERIC
内核不同, 定制的内核可以只包含对于
您的 PC 硬件的支持。
这有很多好处, 例如:
更快地启动。 因为内核只需要检测您系统上的硬件,
启动时所花费的时间将大大缩短。
使用更少的内存。 定制的内核通常会比
GENERIC 内核使用更少的内存,
由于内核必须时刻处于物理内存中, 因此这就显得更加重要。
基于这样的原因, 对于内存较小的系统来说,
定制内核将发挥更大的作用。
支持更多的硬件。 定制的内核允许您增加类似声卡这样的
GENERIC 内核没有提供内建支持的硬件。
Tom
Rhodes
作者
发现系统硬件
在尝试配置内核以前,比较明智的做法是先获得一份机器硬件的清单。
当 &os; 并不是主操作系统时,通过查看当前操作系统的配置可以很容易的
创建一份机器硬件的配置清单。举例来说, µsoft; 的
设备管理器 里通常含有关于已安装硬件的重要信息。
设备管理器 位于控制面板。
某些版本的 µsoft.windows; 有一个 系统
图标会指明 设备管理器 的位置。
如果机器上并不存在其他的操作系统,
系统管理员只能手动寻找这些信息了。其中的一个方法是使用
&man.dmesg.8; 工具以及 &man.man.1; 命令。&os;
上大多数的驱动程序都有一份手册页(manual page)列出了所支持的硬件,
在系统启动的时候,被发现的硬件也会被列出。举例来说,
下面的这几行表示 psm 驱动找到了一个鼠标:
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0
这个驱动需要被包含在客户制定的内核配置文件里,
或着使用 &man.loader.conf.5; 加载。
有时,dmesg 里只会显示来自系统消息的数据,
而不是系统启动时的检测信息。在这样的情况下,你可以查看文件
/var/run/dmesg.boot。
另一个查找硬件信息的方法是使用 &man.pciconf.8; 工具,
它能提供更详细的输出,比如:
ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
vendor = 'Atheros Communications Inc.'
device = 'AR5212 Atheros AR5212 802.11abg wireless'
class = network
subclass = ethernet
这个片断取自于 pciconf
命令的输出,显示 ath
驱动找到了一个无线以太网设备。输入命令
man ath
就能查阅有关 &man.ath.4; 的手册页(manual page)了。
还可以传给 &man.man.1; 命令 选项,
同样能获得有用的信息。例如:
&prompt.root; man -k Atheros
能得到一份包含特定词语的手册页(manual page):
ath(4) - Atheros IEEE 802.11 wireless network driver
ath_hal(4) - Atheros Hardware Access Layer (HAL)
手头备有一份硬件的配置清单,
那么编译制定内核的过程就显得不那么困难了。
建立并安装一个定制的内核
内核
建立/安装
首先对内核构建目录做一个快速的浏览。
这里所提到的所有目录都在
/usr/src/sys 目录中; 也可以通过
/sys 来访问它。
这里的众多子目录包含了内核的不同部分,
但对我们所要完成的任务最重要的目录是
arch/conf,
您将在这里编辑定制的内核配置; 以及
compile, 编译过程中的文件将放置在这里。
arch 表示
i386、 alpha、
amd64、 ia64、
powerpc、 sparc64, 或
pc98 (在日本比较流行的另一种
PC 硬件开发分支)。 在特定硬件架构目录中的文件只和特定的硬件有关;
而其余代码则是与机器无关的, 则所有已经或将要移植并运行 &os;
的平台上都共享这些代码。
文件目录是按照逻辑组织的, 所支持的硬件设备、
文件系统, 以及可选的组件通常都在它们自己的目录中。
这一章提供的例子假定您使用 i386 架构的计算机。
如果您的情况不是这样, 只需对目录名作相应的调整即可。
如果您的系统中 没有
/usr/src/sys 这样一个目录,
则说明没有安装内核源代码。 安装它最简单的方法是通过以 root 身份运行
sysinstall, 选择
Configure, 然后是
Distributions、
src, 选中其中的
base 和
sys。 如果您不喜欢
sysinstall 并且有一张
官方的
&os; CDROM, 也可以使用下列命令,
从命令行来安装源代码:
&prompt.root; mount /cdrom
&prompt.root; mkdir -p /usr/src/sys
&prompt.root; ln -s /usr/src/sys /sys
&prompt.root; cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
&prompt.root; cat /cdrom/src/sbase.[a-d]* | tar -xzvf -
接下来, 进入 arch/conf
目录下面, 复制 GENERIC 配置文件,
并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如:
&prompt.root; cd /usr/src/sys/i386/conf
-&prompt.root; cp GENERIC MYKERNEL
+&prompt.root; cp GENERIC MYKERNEL
通常,这个名称是大写的,如果您正维护着多台不同硬件的&os;机器,
- 以您机器的域名来命名是非常好的主意。我们把它命名为MYKERNEL就是这个原因。
+ 以您机器的域名来命名是非常好的主意。我们把它命名为
+ MYKERNEL就是这个原因。
将您的内核配置文件直接保存在
/usr/src 可能不是一个好主意。
如果您遇到问题, 删掉
/usr/src 并重新开始很可能是一个诱人的选择。
一旦开始做这件事,
您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。
另外, 也不要直接编辑 GENERIC,
因为下次您
更新代码 时它会被覆盖,
而您的修改也就随之丢失了。
您也可以考虑把内核配置文件放到别的地方,
然后再到 i386
目录中创建一个指向它的符号链接。
例如:
&prompt.root; cd /usr/src/sys/i386/conf
&prompt.root; mkdir /root/kernels
&prompt.root; cp GENERIC /root/kernels/MYKERNEL
&prompt.root; ln -s /root/kernels/MYKERNEL
必须以 root 身份执行这些和接下来命令,
否则就会得到 permission denied 的错误提示。
- 现在就可以用您喜欢的文本编辑器来编辑 MYKERNEL 了。
+ 现在就可以用您喜欢的文本编辑器来编辑
+ MYKERNEL 了。
如果您刚刚开始使用 FreeBSD, 唯一可用的编辑器很可能是
vi, 它的使用比较复杂, 限于篇幅,
这里不予介绍, 您可以在 参考书目 一章中找到很多相关书籍。
不过, &os; 也提供了一个更好用的编辑器,
它叫做 ee, 对于新手来说,
这很可能是一个不错的选择。
您可以修改配置文件中的注释以反映您的配置,
或其他与 GENERIC 不同的地方。
SunOS
如果您在&sunos;或者其他BSD系统下定制过内核,那这个文件中的绝大部分将对您非常熟悉。
如果您使用的是诸如DOS这样的系统,那GENERIC配置文件看起来就非常困难,
所以在下面的 配置文件章节将慢慢地、仔细地进行介绍。
如果您和 &os; project 进行了 代码同步,
则一定要在进行任何更新之前查看
/usr/src/UPDATING。
这个文件中描述了更新过的代码中出现的重大问题或需要注意的地方。
/usr/src/UPDATING 总是和您的
&os; 源代码对应, 因此能够提供比手册更具时效性的新内容。
现在应该编译内核的源代码了。
联编内核
进入 /usr/src 目录:
&prompt.root; cd /usr/src
编译内核:
&prompt.root; make buildkernel KERNCONF=MYKERNEL
安装新内核:
&prompt.root; make installkernel KERNCONF=MYKERNEL
使用这种方法联编内核时, 需要安装完整的 &os; 源代码。
默认情况下, 在联编您所定制的内核时,
全部 内核模块也会同时参与构建。
如果您希望更快地升级内核, 或者只希望联编您所需要的模块,
则应在联编之前编辑 /etc/make.conf:
MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs
这个变量的内容是所希望构建的模块列表。
WITHOUT_MODULES = linux acpi sound/sound sound/driver/ds1 ntfs
这个变量的内容是在联编过程中将不被编译的模块列表。
如果希望了解更多与构建内核有关的变量, 请参见 &man.make.conf.5;
联机手册。
/boot/kernel.old
新内核将会被复制到 /boot/kernel 目录中成为
/boot/kernel/kernel 而旧的则被移到
/boot/kernel.old/kernel。
现在关闭系统, 然后用新的内核启动计算机。 如果出现问题,
后面的一些 故障排除方法
将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。
其他与启动过程相关的文件, 如
&man.loader.8; 及其配置, 则放在
/boot。 第三方或定制的模块也可以放在
/boot/kernel,
不过应该注意保持模块和内核的同步时很重要的,
否则会导致不稳定和错误。
Joel
Dahl
Updated for &os; 6.X by
配置文件
内核
NOTES
NOTES
内核
配置文件
配置文件的格式是非常简单的。
每一行都包括一个关键词, 以及一个或多个参数。
实际上, 绝大多数行都只包括一个参数。
在 # 之后的内容会被认为是注释而忽略掉。
接下来几节, 将以 GENERIC 中的顺序介绍所有关键字。
如果需要与平台有关的选项和设备的详细列表,
请参考与 GENERIC 文件在同一个目录中的那个
NOTES,
而平台无关的选项, 则可以在
/usr/src/sys/conf/NOTES
找到。
如果您需要一份包含所有选项的文件,
例如用于测试目的, 则应以 root 身份执行下列命令:
&prompt.root; cd /usr/src/sys/i386/conf && make LINT
内核
配置文件
下面是一个 GENERIC
内核配置文件的例子, 它包括了一些需要解释的注释。
这个例子应该和您复制的
/usr/src/sys/i386/conf/GENERIC
非常接近。
内核选项
机器
machine i386
这是机器的架构, 他只能是
alpha, amd64,
i386, ia64,
pc98, powerpc, 或
sparc64 中的一种。
内核选项
cpu
cpu I486_CPU
cpu I586_CPU
cpu I686_CPU
上面的选项指定了您系统中所使用的 CPU 类型。
您可以使用多个 CPU 类型 (例如,
您不确定是应该指定
I586_CPU 或 I686_CPU)。
然而对于定制的内核, 最好能够只指定您使用的那种 CPU。
如果您对于自己使用的 CPU 类型没有把握, 可以通过查看
/var/run/dmesg.boot 中的启动信息来了解。
内核选项
ident
ident GENERIC
这是内核的名字。 您应该取一个自己的名字,
- 例如取名叫 MYKERNEL,
+ 例如取名叫 MYKERNEL,
如果您一直在按照前面的说明做的话。
您放在
ident 后面的字符串在启动内核时会显示出来,
因此如果希望能够容易区分常用的内核和刚刚定制的内核,
就应该采取不同的名字 (例如, 您想定制一个试验性的内核)。
#To statically compile in device wiring instead of /boot/device.hints
#hints "GENERIC.hints" # Default places to look for devices.
&man.device.hints.5; 可以用来配置设备驱动选项。
在启动的时候 &man.loader.8; 将会检查缺省位置 /boot/devicehints。
使用 hints 选项您就可以把这些 hints 静态编译进内核。
这样就没有必要在
/boot下创建devicehints。
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
一般的 &os; 联编过程, 在所联编的内核指定了 选项时,
由于此选项将传递给 &man.gcc.1; 表示加入调试信息,
因此会将调试符号也包含进来。
options SCHED_4BSD # 4BSD scheduler
这是 &os; 传统上使用的默认系统调度器。 请保留此选项。
options PREEMPTION # Enable kernel thread preemption
允许内核线程根据优先级的抢占调度。 这有助于改善交互性,
并可以让中断线程更早地执行, 而无须等待。
options INET # InterNETworking
网络支持,即使您不打算连网,也请保留它,大部分的程序至少需要回环网络(就是和本机进行网络连接),所以强烈要求保留它。
options INET6 # IPv6 communications protocols
这将打开IPv6连接协议。
options FFS # Berkeley Fast Filesystem
这是最基本的硬盘文件系统,如果打算从本地硬盘启动,请保留它。
options SOFTUPDATES # Enable FFS Soft Updates support
这个选项会启用内核中的 Soft Updates 支持,
它会显著地提高磁盘的写入速度。 尽管这项功能是由内核直接提供的,
但仍然需要在每个磁盘上启用它。 请检查 &man.mount.8; 的输出,
以了解您系统中的磁盘上是否已经启用了 Soft Updates。
如果没有看到 soft-updates 选项,
则需要使用 &man.tunefs.8; (对于暨存系统)
或 &man.newfs.8; (对于新系统) 命令来激活它。
options UFS_ACL # Support for access control lists
这个选项将启用内核中的访问控制表的支持。
这依赖于扩展属性以及 UFS2,
以及在 中所介绍的那些特性。
ACL 默认是启用的,
并且如果已经在文件系统上使用了这一特性,
就不应再关掉它, 因为这会去掉文件的访问控制表,
并以不可预期的方式改变受保护的文件的访问方式。
options UFS_DIRHASH # Improve performance on big directories
通过使用额外的内存,这个选项可以加速在大目录上的磁盘操作。
您应该在大型服务器和频繁使用的工作站上打开这个选项,而在磁盘操作不是很重要的
小型系统上关闭它,比如防火墙。
options MD_ROOT # MD is a potential root device
这个选项将打开以基于内存的虚拟磁盘作为根设备的支持。
内核选项
NFS
内核选项
NFS_ROOT
options NFSCLIENT # Network Filesystem Client
options NFSSERVER # Network Filesystem Server
options NFS_ROOT # NFS usable as /, requires NFSCLIENT
网络文件系统。 如果您不打算通过 TCP/IP 挂接
&unix; 文件服务器的分区, 就可以注释掉它。
内核选项
MSDOSFS
options MSDOSFS # MSDOS Filesystem
&ms-dos; 文件系统。 只要您不打算在启动时挂接由 DOS 格式化的硬盘分区,
就可以把它注释掉。
如前面所介绍的那样, 在您第一次挂接 DOS 分区时,
内核会自动加载需要的模块。 此外,
emulators/mtools
软件提供了一个很方便的功能,
通过它您可以直接访问 DOS 软盘而无需挂接或卸下它们
(而且也完全不需要 MSDOSFS)。
options CD9660 # ISO 9660 Filesystem
用于 CDROM 的 ISO 9660 文件系统。 如果没有 CDROM
驱动器或很少挂接光盘数据 (因为在首次使用数据 CD 时会自动加载),
就可以把它注释掉。 音乐 CD 并不需要这个选项。
options PROCFS # Process filesystem (requires PSEUDOFS)
进程文件系统。 这是一个挂接在 /proc
的一个 假扮的
文件系统, 其作用是允许类似 &man.ps.1;
这样的程序给出正在运行的进程的进一步信息。 多数情况下,
并不需要使用 PROCFS, 因为绝大多数调试和监控工具,
已经进行了一系列修改, 使之不再依赖
PROCFS: 默认安装的系统中并不会挂接这一文件系统。
options PSEUDOFS # Pseudo-filesystem framework
在 6.X 内核中,
如果希望使用 PROCFS,
就必须加入 PSEUDOFS 的支持。
options GEOM_GPT # GUID Partition Tables.
这个选项提供了在磁盘上使用大量的分区的能力。
options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]
使系统兼容4.3BSD。不要去掉这一行,不然有些程序将无法正常运行。
options COMPAT_FREEBSD4 # Compatible with &os;4
为了支持在旧版本的&os;下编译的程序,该选项在&os; 5.X &i386;和Alpha systems下需要打开。
最好在所有的&i386;和Alpha systems下打开这个选项,因为可能要运行老应用程序。
在5.X才开始支持的平台,比如ia64和&sparc64;,就不需要这个选项。
options COMPAT_FREEBSD5 # Compatible with &os;5
对于 &os; 6.X 和更高版本而言, 如果希望在其上运行为 &os; 5.X
版本联编的、 用到 &os; 5.X 系统调用接口的程序, 则需要使用这个选项。
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
这将让内核在探测每个 SCSI 设备之前等待 5 秒。
如果您只有 IDE 硬盘驱动器, 就可以不管它,
反之您可能会希望尝试降低这个数值以加速启动过程。
当然, 如果您这么做之后
&os; 在识别您的 SCSI 设备时遇到问题,
则您还需要再把它改回去。
options KTRACE # ktrace(1) support
这个选项打开内核进程跟踪,在调试时很有用。
options SYSVSHM # SYSV-style shared memory
提供System V共享内存(SHM)的支持,最常用到SHM的应该是X Window的XSHM延伸,
不少绘图相关程序会自动使用SHM来提供额外的速度。如果您要使用X Window,您最好加入这个选项。
options SYSVMSG # SYSV-style message queues
支持 System V 消息。 这只会在内核中增加数百字节的空间占用。
options SYSVSEM # SYSV-style semaphores
支持System V 信号量, 不常用到, 但只在kernel中占用几百个字节的空间。
&man.ipcs.1; 命令的 选项可以显示出任何用到这些
System V 机制的进程。
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
在 1993 年 &posix; 添加的实时扩展。 在 Ports Collection 中某些应用程序会用到这些
(比如&staroffice;)。
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
这个选项是在 /dev下建立键盘设备节点必需的。
options ADAPTIVE_GIANT # Giant mutex is adaptive.
内核全局锁 (Giant) 是一种互斥机制 (休眠互斥体) 的名字,
它用于保护许多内核资源。 现在, 这已经成为了一种无法接受的性能瓶颈,
它已经被越来越多地使用保护单个资源的锁代替。
ADAPTIVE_GIANT 选项将使得内核全局锁作为一种自适应自旋锁。
这意味着, 当有线程希望锁住内核全局锁互斥体, 但互斥体已经被另一个 CPU
上的线程锁住的时候, 它将继续运行, 直到那个线程释放锁为止。
一般情况下, 另一个线程将进入休眠状态并等待下一次调度。
如果您不确定是否应该这样做的话, 一般应该打开它。
请注意在 &os; 8.0-CURRENT 及以后的版本,所有的互斥体默认都是自适应的,
除非在编译时使用 NO_ADAPTIVE_MUTEXES 选项,
明确的指定为非自适应。因此,内核全局锁(Giant)目前默认也是自适应的,
而且 ADAPTIVE_GIANT 选项已经从内核配置文件中移出。
内核选项
SMP
device apic # I/O APIC
apic 设备将启用使用 I/O APIC 作为中断发送设备的能力。
apic 设备可以被 UP 和 SMP 内核使用, 但 SMP 内核必须使用它。
要支持多处理器, 还需要加上 options SMP。
The apic device exists only on the i386 architecture, this
configuration line should not be used on other
architectures.
device eisa
如果您的主机板上有EISA总线,加入这个设置。使用这个选项可以自动扫描并设置所有连接在EISA总线上的设备。
device pci
如果您的主板有PCI总线,就加入这个选项。使用这个选项可以自动扫描PCI卡,并在PCI到ISA之间建立通路。
# Floppy drives
device fdc
这是软驱控制器。
# ATA and ATAPI devices
device ata
这个驱动器支持所有ATA和ATAPI设备。您只要在内核中加入device ata选项,
就可以让内核支持现代计算机上的所有PCI ATA/ATAPI设备。
device atadisk # ATA disk drives
这个是使用 ATAPI 硬盘驱动器时必须加入的选项。
device ataraid # ATA RAID drives
这个选项需要 device ata, 它用于 ATA
RAID 驱动。
device atapicd # ATAPI CDROM drives
这个是ATAPI CDROM驱动器所必须的。
device atapifd # ATAPI floppy drives
这个是ATAPI 软盘驱动器所必须的。
device atapist # ATAPI tape drives
这个是ATAPI 磁带机驱动器所必须的.
options ATA_STATIC_ID # Static device numbering
这指定对控制器使用其静态的编号; 如果没有这个选项,
则会动态地分配设备的编号。
# SCSI Controllers
device ahb # EISA AHA1742 family
device ahc # AHA2940 and onboard AIC7xxx devices
options AHC_REG_PRETTY_PRINT # Print register bitfields in debug
# output. Adds ~128k to driver.
device ahd # AHA39320/29320 and onboard AIC79xx devices
options AHD_REG_PRETTY_PRINT # Print register bitfields in debug
# output. Adds ~215k to driver.
device amd # AMD 53C974 (Teckram DC-390(T))
device isp # Qlogic family
#device ispfw # Firmware for QLogic HBAs- normally a module
device mpt # LSI-Logic MPT-Fusion
#device ncr # NCR/Symbios Logic
device sym # NCR/Symbios Logic (newer chipsets + those of `ncr')
device trm # Tekram DC395U/UW/F DC315U adapters
device adv # Advansys SCSI adapters
device adw # Advansys wide SCSI adapters
device aha # Adaptec 154x SCSI adapters
device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
device bt # Buslogic/Mylex MultiMaster SCSI adapters
device ncv # NCR 53C500
device nsp # Workbit Ninja SCSI-3
device stg # TMC 18C30/18C50
SCSI控制器。可以注释掉您系统中没有的设备。
如果您只有IDE设备,您可以把这些一起删掉。 *_REG_PRETTY_PRINT
这样的配置, 则是对应驱动程序的调试选项。
# SCSI peripherals
device scbus # SCSI bus (required for SCSI)
device ch # SCSI media changers
device da # Direct Access (disks)
device sa # Sequential Access (tape etc)
device cd # CD
device pass # Passthrough device (direct SCSI access)
device ses # SCSI Environmental Services (and SAF-TE)
SSCSI外围设备。也可以像上面一样操作。
目前系统提供的 USB &man.umass.4; 以及少量其它驱动使用了
SCSI 子系统, 尽管它们并不是真的 SCSI 设备。
因此, 如果在内核配置使用了这类驱动程序, 请务必不要删除
SCSI 支持。
# RAID controllers interfaced to the SCSI subsystem
device amr # AMI MegaRAID
device arcmsr # Areca SATA II RAID
device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
device ciss # Compaq Smart RAID 5*
device dpt # DPT Smartcache III, IV - See NOTES for options
device hptmv # Highpoint RocketRAID 182x
device rr232x # Highpoint RocketRAID 232x
device iir # Intel Integrated RAID
device ips # IBM (Adaptec) ServeRAID
device mly # Mylex AcceleRAID/eXtremeRAID
device twa # 3ware 9000 series PATA/SATA RAID
# RAID controllers
device aac # Adaptec FSA RAID
device aacp # SCSI passthrough for aac (requires CAM)
device ida # Compaq Smart RAID
device mfi # LSI MegaRAID SAS
device mlx # Mylex DAC960 family
device pst # Promise Supertrak SX6000
device twe # 3ware ATA RAID
支持RAID控制器。如果您没有这些,可以把它们注释掉或是删掉。
# atkbdc0 controls both the keyboard and the PS/2 mouse
device atkbdc # AT keyboard controller
键盘控制器(atkbdc)提供AT键盘输入以及PS/2指针设备的I/O服务。
键盘驱动程序(atkbd)与PS/2鼠标驱动程序(psm)需要这个控制器,所以不要删除它。
device atkbd # AT keyboard
atkbd驱动程序,与atkbdc控制器一起使用,
提供连接到AT键盘控制器的AT 84键盘与AT加强型键盘的访问服务。
device psm # PS/2 mouse
如果您的鼠标连接到PS/2鼠标端口,就使用这个设备驱动程序。
device kbdmux # keyboard multiplexer
针对键盘多路选择器的基本支持。 如果您不打算使用多个键盘,
则可以放心地删除这一行。
device vga # VGA video card driver
显卡驱动。
device splash # Splash screen and screen saver support
启动时的 splash 画面! 屏幕保护程序也需要这一选项。
# syscons is the default console driver, resembling an SCO console
device sc
sc 是默认的控制台驱动程序, 类似 SCO 控制台。
由于绝大部分全屏幕程序都通过类似
termcap 这样的终端数据库函数库赖访问控制台,
因此无论您使用这个或与 VT220 兼容的
vt 都没有什么关系。
如果您在运行这种控制台时使用全屏幕程序时发生问题, 请在登录之后将
TERM 变量设置为 scoansi。
# Enable this for the pcvt (VT220 compatible) console driver
#device vt
#options XSERVER # support for X server on a vt console
#options FAT_CURSOR # start with block cursor
这是一个兼容 VT220 的控制台驱动, 它同时能够向下兼容
VT100/102。 在同 sc
硬件不兼容的一些笔记本上它能够运行的很好。
当然, 登录系统时请把
TERM 变量设置为 vt100 或
vt220。
此驱动在连接网络上大量不同的机器时也被证明非常有用,
因为此时 termcap 或
terminfo 通常没有可用的
sc 设备 — 而 vt100
则几乎每种平台都支持。
device agp
如果您的机器使用 AGP 卡, 请把上面一行加入配置。
这将启用 AGP, 以及某些卡上的 AGP GART 支持。
APM
# 电源管理支持 (参见 NOTES 了解更多选项)
#device apm
高级电源管理支持。 对笔记本有用,
不过在 &os; 5.X 和更高版本中的
GENERIC 里默认禁用。
# 增加 i8254 的 挂起/恢复 支持。
device pmtimer
用于电源管理事件, 例如 APM 和 ACPI 的时钟设备驱动。
# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
device cbb # cardbus (yenta) bridge
device pccard # PC Card (16-bit) bus
device cardbus # CardBus (32-bit) bus
PCMCIA支持。如果您使用膝上型计算机,您需要这个。
# Serial (COM) ports
device sio # 8250, 16[45]50 based serial ports
这些串口在 &ms-dos;/&windows; 的世界中称为
COM 口。
如果使用内置式的调制解调器, 并占用 COM4
而您另有一个串口在 COM2, 则必须把调制解调器的
IRQ 改为 2 (由于晦涩的技术原因,
IRQ2 = IRQ 9) 才能够在 &os; 中访问它。
如果有多口的串口卡, 请参考 &man.sio.4; 以了解需要在
/boot/device.hints 中进行的设置。
某些显卡 (特别是基于 S3 芯片的卡) 使用形如 0x*2e8
的 IO 地址, 而许多廉价的串口卡不能够正确地对 16-位
IO 地址空间进行解码, 因此它们会产生冲突,
并造成 COM4 实际上无法使用。
每一个串口都需要有一个唯一的 IRQ (除非您使用支持中断分享的串口卡),
因此默认的 COM3
和 COM4 IRQ 是不能使用的。
# Parallel port
device ppc
ISA-bus并行接口。
device ppbus # Parallel port bus (required)
提供并行总线的支持。
device lpt # Printer
提供并口打印机的支持。
要使用并口打印机,就必须同时加入上面三行设置。
device plip # TCP/IP over parallel
这是针对并行网络接口的驱动器。
device ppi # Parallel port interface device
普通用途的I/O (geek port
) + IEEE1284 I/O.
#device vpo # Requires scbus and da
zip drive
这是针对Iomega Zip驱动器的。它要求scbus和da的支持。
最好的执行效果是工作在EPP 1.9模式。
#device puc
如果您有由 &man.puc.4; 支持的 哑
串行或并行 PCI 卡, 则应去掉这一行的注释。
# PCI Ethernet NICs.
device de # DEC/Intel DC21x4x (Tulip
)
device em # Intel PRO/1000 adapter Gigabit Ethernet Card
device ixgb # Intel PRO/10GbE Ethernet Card
device txp # 3Com 3cR990 (Typhoon
)
device vx # 3Com 3c590, 3c595 (Vortex
)
多种PCI网卡驱动器。注释或删除您系统中没有的设备.
# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device miibus # MII bus support
MII总线支持对于一些PCI 10/100 Ethernet NIC来说是必需的。
device bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet
device bfe # Broadcom BCM440x 10/100 Ethernet
device bge # Broadcom BCM570xx Gigabit Ethernet
device dc # DEC/Intel 21143 and various workalikes
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
device lge # Level 1 LXT1001 gigabit ethernet
device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet
device nge # NatSemi DP83820 gigabit ethernet
device nve # nVidia nForce MCP on-board Ethernet Networking
device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
device re # RealTek 8139C+/8169/8169S/8110S
device rl # RealTek 8129/8139
device sf # Adaptec AIC-6915 (Starfire
)
device sis # Silicon Integrated Systems SiS 900/SiS 7016
device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet
device ste # Sundance ST201 (D-Link DFE-550TX)
device stge # Sundance/Tamarack TC9021 gigabit Ethernet
device ti # Alteon Networks Tigon I/II gigabit Ethernet
device tl # Texas Instruments ThunderLAN
device tx # SMC EtherPower II (83c170 EPIC
)
device vge # VIA VT612x gigabit ethernet
device vr # VIA Rhine, Rhine II
device wb # Winbond W89C840F
device xl # 3Com 3c90x (Boomerang
, Cyclone
)
使用MII总线控制器代码的驱动器。
# ISA Ethernet NICs. pccard NICs included.
device cs # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards
device ex # Intel EtherExpress Pro/10 and Pro/10+
device ep # Etherlink III based cards
device fe # Fujitsu MB8696x based cards
device ie # EtherExpress 8/16, 3C507, StarLAN 10 etc.
device lnc # NE2100, NE32-VL Lance Ethernet cards
device sn # SMC's 9000 series of Ethernet chips
device xe # Xircom pccard Ethernet
# ISA devices that use the old ISA shims
#device le
ISA 以太网卡驱动。 参见
/usr/src/sys/i386/conf/NOTES
以了解关于哪个驱动程序能够驱动您的网卡的细节。
# Wireless NIC cards
device wlan # 802.11 support
通用 802.11 支持。 这行配置是无线网络所必需的。
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
针对 802.11 设备的加密支持。 如果希望使用加密和 802.11i 安全协议,
就需要这些配置行。
device an # Aironet 4500/4800 802.11 wireless NICs.
device ath # Atheros pci/cardbus NIC's
device ath_hal # Atheros HAL (Hardware Access Layer)
device ath_rate_sample # SampleRate tx rate control for ath
device awi # BayStack 660 and others
device ral # Ralink Technology RT2500 wireless NICs.
device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device wl # Older non 802.11 Wavelan wireless NIC.
用以支持多种无线网卡。
# Pseudo devices
device loop # Network loopback
这是 TCP/IP 的通用回环设备。 如果您 telnet
或 FTP 到 localhost (也就是 127.0.0.1) 则将通过这个设备回到本机。
这个设备是 必需的。
device random # Entropy device
Cryptographically secure random number generator.
device ether # Ethernet support
ether 只有在使用以太网卡时才需要。
它包含了通用的以太网协议代码。
device sl # Kernel SLIP
sl 用以提供 SLIP 支持。
目前它几乎已经完全被 PPP 取代了, 因为后者更容易配置,
而且更适合调制解调器之间的连接, 并提供了更强大的功能。
device ppp # Kernel PPP
这一选项用以提供内核级的 PPP 支持, 用于拨号连接。
也有以用户模式运行的 PPP 实现, 使用
tun 并提供包括按需拨号在内的更为灵活的功能。
device tun # Packet tunnel.
它会被用户模式的 PPP 软件用到。
参考本书的 PPP 以了解更多的细节。
device pty # Pseudo-ttys (telnet etc)
这是一个 pseudo-terminal
或模拟登入端口。
它用来接收连入的 telnet 以及
rlogin 会话、
xterm, 以及一些其它程序如
Emacs 等。
device md # Memory disks
内存盘伪设备。
device gif # IPv6 and IPv4 tunneling
它实现了在 IPv4 上的 IPv6 隧道、 IPv6 上的 IPv4 隧道、
IPv4 上的 IPv4 隧道、 以及IPv6 上的 IPv6隧道。
gif 设备是
自动克隆
的, 它会根据需要自动创建设备节点。
device faith # IPv6-to-IPv4 relaying (translation)
这个伪设备能捕捉发给它的数据包,并把它们转发给
IPv4/IPv6 翻译服务程序。
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device bpf # Berkeley packet filter
这是 Berkeley 包过滤器。这个伪设备允许网络接口被置于混杂模式,
从而,截获广播网 (例如,以太网) 上的每一个数据包。
截获的数据报可以保存到磁盘上,也可以使用 &man.tcpdump.1; 程序来分析。
&man.bpf.4; 设备也被用于
&man.dhclient.8; 来获取默认路由器(网关)的 IP 地址。如果使用DHCP,就不要注释掉这行。
# USB support
device uhci # UHCI PCI->USB interface
device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device usb # USB Bus (required)
#device udbp # USB Double Bulk Pipe devices
device ugen # Generic
device uhid # Human Interface Devices
device ukbd # Keyboard
device ulpt # Printer
device umass # Disks/Mass storage - Requires scbus and da
device ums # Mouse
device ural # Ralink Technology RT2500USB wireless NICs
device urio # Diamond Rio 500 MP3 player
device uscanner # Scanners
# USB Ethernet, requires mii
device aue # ADMtek USB Ethernet
device axe # ASIX Electronics USB Ethernet
device cdce # Generic USB over Ethernet
device cue # CATC USB Ethernet
device kue # Kawasaki LSI USB Ethernet
device rue # RealTek RTL8150 USB Ethernet
支持各类 USB 设备。
# FireWire support
device firewire # FireWire bus code
device sbp # SCSI over FireWire (Requires scbus and da)
device fwe # Ethernet over FireWire (non-standard!)
支持各类火线设备。
要了解 &os; 所支持的设备的其他情况, 请参考
/usr/src/sys/i386/conf/NOTES。
大内存支持(PAE)
物理地址扩展
(PAE)
大内存
大内存配置的机器需要超过4GB的虚拟地址。
因为4GB的限制,Intel在&pentium;及后续的CPUs上增加了36位物理地址的支持。
物理地址扩展 (PAE) 是
&intel; &pentium; Pro和后续的 CPU 提供的一种允许将内存地址扩展到 64GB
的功能, &os; 的所有最新版本均支持此功能, 并通过
选项来启用这个能力。 因为Intel架构的限制,
高于或低于 4GB 都没有什么区别,
超过 4GB 的内存分配只是简单地添加到可用内存池中。
为了让内核支持PAE,只要增加下面这一行到配置文件:
options PAE
PAE在&os;里面现在只能支持 &intel; IA-32处理器。
同时,还应该注意,&os;的PAE支持没有经过广泛的测试,
和其他稳定的特性相比只能当作是beta版。
PAE在&os;下有如下的一些限制:
进程不能接触大于4GB的VM空间。
KLD 模块不能加载到一个打开了PAE支持的内核里面,
这是因为内核模块和内核的建立框架不一样。
没有使用 &man.bus.dma.9; 接口的设备驱动程序在打开了
PAE 支持的内核中会导致数据损坏。
因为这个原因, PAE 内核配置文件
会把所有在打开了 PAE
的内核上不能工作的驱动程序排除在外。
一些系统打开了探测系统内存资源使用能力的功能,因为打开了
PAE支持,这些功能可能会被覆盖掉。
其中一个例子就是内核参数,它是控制
内核能使用的最大vnodes数目的,建议重新调整它及其他类似参数到合适的值。
为了避免KVA的消耗,很有必要增加系统的内核虚拟地址,
或者减少很耗系统资源的内核选项的总量(看上面)。选项
可以用来增加KVA空间。
为了稳定和高性能,建议查看&man.tuning.7;手册页。&man.pae.4;手册页包含
&os;'sPAE支持的最新信息。
如果出现问题怎么办
在定制一个内核时,可能会出现四种问题。它们是:
config失败:
如果 &man.config.8; 在给出您的内核描述时失败,
则可能在某些地方引入了一处小的错误。
幸运的是, &man.config.8; 会显示出它遇到问题的行号,
这样您就能够迅速地定位错误。 例如, 如果您看到:
config: line 17: syntax error
可以通过与 GENERIC 或其他参考资料对比,
来确定这里的关键词是否拼写正确。
make失败:
如果 make 命令失败,
它通常表示内核描述中发生了 &man.config.8; 无法找出的的错误。
同样地, 仔细检查您的配置, 如果仍然不能解决问题,
发一封邮件到 &a.questions; 并附上您的内核配置,
则问题应该很快就能解决。
内核无法启动:
如果您的内核无法启动, 或不识别您的设备, 千万别慌!
非常幸运的是, &os; 有一个很好的机制帮助您从不兼容的内核恢复。
在 &os; 启动加载器那里简单地选择一下要启动的内核就可以了。
当系统在引导菜单的 10 秒倒计时时进入它, 方法是选择 Escape to a loader
prompt
选项, 其编号为 6。 输入
unload kernel, 然后输入
boot /boot/kernel.old/kernel,
或者其他任何一个可以正确引导的内核即可。
当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。
当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。
比较有用的资源是 /var/log/messages 文件,
它会记录每次成功启动所产生的所有内核消息。
此外, &man.dmesg.8; 命令也会显示这次启动时产生的内核消息。
如果在编译内核时遇到麻烦, 请务必保留一个
GENERIC 或已知可用的其他内核,
并命名为别的名字以免在下次启动时被覆盖。
不要依赖 kernel.old
因为在安装新内核时, kernel.old
会被上次安装的那个可能不正常的内核覆盖掉。
另外, 尽快把可用的内核挪到
/boot/kernel
否则类似 &man.ps.1; 这样的命令可能无法正常工作。
为了完成这一点, 需要修改目录的名字:
- &prompt.root; mv /boot/kernel /boot/kernel.bad
+ &prompt.root; mv /boot/kernel /boot/kernel.bad
&prompt.root; mv /boot/kernel.good /boot/kernel
内核工作,但是&man.ps.1;根本不工作:
如果您安装了一个与系统中内建工具版本不同的内核,
例如在 -STABLE 系统上安装了 -CURRENT 的内核, 许多用于检查系统状态的工具如
&man.ps.1; 和 &man.vmstat.8; 都将无法正常使用。
您应该 重新编译一个和内核版本一致的系统。
这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。
diff --git a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml
index dbcb7bb8da..e3830ceaa6 100644
--- a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml
@@ -1,2792 +1,2914 @@
Jim
Mock
Restructured, reorganized, and updated by
PPP 和 SLIP
概述
PPP
SLIP
FreeBSD 有很多方法可以将计算机与计算机连接起来。
通过使用拨号 modem 来建立网络或 Internet 连接,
或允许其他人通过您的机器来连上网络,
这些都要求使用 PPP 或 SLIP。
这章将详细介绍设置这些基于 modem 的通信服务的方法。
读完这一章, 您将了解:
如何设置用户级 PPP。
如何设置内核级 PPP。
如何设置 PPPoE (PPP over
Ethernet)。
如何设置 PPPoA (PPP over
ATM)。
如何配置和安装 SLIP 客户端和服务器。
PPP
用户级 PPP
PPP
内核级 PPP
PPP
PPPoE
在阅读这章之前, 您应:
熟悉基本的网络术语。
理解拨号连接和 PPP、 SLIP 的基础知识。
您可能想知道用户级 PPP 与内核级 PPP 之间的不同之处。 回答很简单:
用户级 PPP 处理用户级的输入和输出数据, 而不是内核级。
在内核与用户区之间复制数据的花费要大一些,
但它能提供具有更多特性的PPP实现。
用户级PPP使用 tun
设备与外界通信而内核级 PPP 使用
ppp 设备。
除非需要与其它 PPP 软件 (比如 pppd)
相区别, 在这一章中,
用户级 PPP 就简称为 ppp。
另外, 若没有额外的注明, 本章所介绍的所有命令都需要
root 权限。
Tom
Rhodes
Updated and enhanced by
Brian
Somers
Originally contributed by
Nik
Clayton
With input from
Dirk
Frömberg
Peter
Childs
使用用户级 PPP
用户级 PPP
前提条件
本章假定您具备如下条件:
ISP
PPP
您有一个 ISP 提供的用于连接使用 PPP 的帐号。
您需要一个连接到您的系统, 并做了正确配置的 modem
或其它设备, 使您能连接到 ISP。
ISP 的拨号号码。
PAP
CHAP
UNIX
login name
password?/primary>
您的登录名称和密码 (可能是一般的 UNIX 风格的登录名和密码对,
也可能是 PAP 或 CHAP 登录名和密码对。)
nameserver
一个或多个域名服务器 IP 地址。
通常, 您会从ISP处得到两个这样的IP地址。
如果您至少得到了一个, 就可以在文件
ppp.conf 中加入 enable dns
命令使 ppp 设置域名服务。
这个功能取决于 ISP 对支持 DNS 协商的具体实现。
下面的信息由您的 ISP 提供, 但不是必需的:
ISP的网关IP地址。 网关是您准备连接, 并设为
默认路由 的主机。
如果您没有这个信息, 您可以虚构一个,
在连接时 ISP 的 PPP 服务器会自动告诉您正确的值。
这个虚构的 IP 地址在 ppp 中记做
HISADDR。
准备使用的子网掩码。 如果ISP没有提供, 一般使用
255.255.255.255 是没有问题的。
static IP address (静态 IP 地址)
如果 ISP 提供了静态的IP地址和主机名, 可以输入它们。
反之, 则应让对方主机指定它认为合适的 IP 地址。
如果您不知道这些信息, 请与您的 ISP 联系。
在这节中, 所有作为例子展示的配置文件中都有行号。
这些行号只是为了使解释和讨论变得方便, 在真实的文件中并不存在。
此外, 在必要时应使用 Tab 和空格来进行缩进。
PPP自动化配置
- PPPconfiguration
+
+ PPP
+ configuration
+
+
ppp和pppd(PPP的内核级实现)
都使用/etc/ppp目录中的配置文件。 用户级 PPP
的例子可以在 /usr/share/examples/ppp/ 中找到。
配置ppp要求根据您的需要编辑几个文件。
编辑哪几个文件取决于您的
IP 是静态分配还是动态分配的。
PPP和静态IP地址
- PPPwith static IP addresses
+
+ PPP
+ with static IP addresses
+
+
您需要编辑配置文件/etc/ppp/ppp.conf, 如下所示。
以冒号:结尾的行从第一列 (行首)开始,
其它所有的行都要使用空格或制表符 (Tab) 来缩进。
1 default:
2 set log Phase Chat LCP IPCP CCP tun command
3 ident user-ppp VERSION (built COMPILATIONDATE)
-4 set device /dev/cuaa0
+4 set device /dev/cuad0
5 set speed 115200
6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
8 set timeout 180
9 enable dns
10
11 provider:
12 set phone "(123) 456 7890"
13 set authname foo
14 set authkey bar
15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp"
16 set timeout 300
17 set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0
18 add default HISADDR
行1:
指定默认的项。 当PPP运行时这个项中的命令将自动执行。
行2:
启用登录参数。 工作正常后, 为避免产生过多的日志文件, 这行应该简化为:
set log phase tun。
行 3:
告诉 PPP 怎样向对方标识自己。
如果在建立或使用连接时遇到任何麻烦, PPP就会向对方主机自我标识。
对方主机管理员在处理这个问题时, 这些信息会有用。
行 4:
标明modem要连接的端口号。 COM1 对应的设备是
- /dev/cuaa0, 而 COM2
- 对应的则是 /dev/cuaa1。
+ /dev/cuad0(或者 &os; 5.X 下
+ /dev/cuaa0)
+ 而 COM2
+ 对应的则是 /dev/cuad1(或者
+ /dev/cuaa1)。
行 5:
设置连接的速度。 如果 115200
有问题, 试试 38400。
行 6 & 7:
- PPPuser PPP
+
+ PPP
+ user PPP
+
+
拨号字符串。 用户级 PPP 使用一种与 &man.chat.8;程序相似的语法。
请参考联机手册了解这种语言的相关信息。
注意, 为了便于阅读此命令进行了换行。 任何
ppp.conf 里的命令都可以这样做,
前提是行的最后一个字符必须是 \
。
行 8:
设置连接的时间间隔。 默认是 180 秒, 所以这一行是多余的。
行 9:
告诉PPP向对方主机确认本地域名解析设置。
如果您运行了本地的域名服务器, 要注释或删除掉这一行。
行 10:
为了可读性的需要设置一个空行。 空行会被PPP忽略。
行 11:
为 provider
指定一个项。 可以改成
ISP的名字, 这样您以后就可以使用
来开启连接。
行 12:
设置提供商的电话号码。 多个电话号码可以使用冒号 (:)
或管道符号 (|) 隔开。
这两个字符的区别在&man.ppp.8;的联机手册中有介绍。
总的来讲, 如果您要循环使用这些号码, 可以使用冒号。
如果您想使用第一个号码, 当第一个号码失败了再用第二个号码,
就使用管道符号。 如所示的那样, 要给整个电话号码加上引号(")。
如果电话号码里有空格, 必须用引号(")将其括起来。
否则会造成简单却难以察觉的错误。
行 13 & 14:
指定用户名和密码。 当使用 &unix; 风格的命令提示符登录时,
这些值可以用带有 \U \P 参数的 set login
命令进行修改。 当使用PAP或CHAP进行连接时, 这些值在验证使用。
行 15:
PAP
CHAP
如果您使用的是PAP或者CHAP, 在这里就不会有登录。
要注释或删除掉这一行。
请参考 PAP 和 CHAP认证
以了解更多细节。
登录命令是的语法是chat类型的。 在这个例子中是这样的:
J. Random Provider
login: foo
password: bar
protocol: ppp
您需要改变这个脚本以适合您自己的需要。
当您第一次写这个脚本时, 应当确保已经启用
chat
并处于登录状态,
这样您才能确认通信是否正在按计划进行。
行16:
timeout
设置默认的超时时间。 这里, 连接若在 300
秒内无响应将被断开。如果您不想设置成超时,
将这个值设置成0, 或在命令行使用 选项。
行 17:
ISP
设置接口地址。 您需要用 ISP 提供给您的 IP 地址替换字符串
x.x.x.x, 用 ISP 的网关 IP
地址 (即您要连接的主机) 替换字符串
y.y.y.y。
如果ISP没有给您提供网关地址, 可以使用
10.0.0.2/0。
如果您需要使用一个 猜到
的地址,
请确保在 /etc/ppp/ppp.linkup
中为每个 PPP和动态IP地址
指令创建了这一项。 如果没有这一行, ppp
将无法以 模式运行。
第18行:
添加一个到ISP网关的默认路由。
HISADDR这个关键字会被第17行所指定的网关地址替换。
这行必须出现在第17行之后,以免在 HISADDR
初始化之前使用它的值。
如果您不想使用 的 PPP,则这行应挪到
ppp.linkup 文件中。
若您有一个静态IP地址, 且使用
模式运行ppp(因为在连接之前已经正确设置了路由表项), 那就不需要再向ppp.linkup
添加项。 您可能希望在连接以后创建一个项来调用程序。 这在以后的sendmail的例子中会解释。
示例配置文件可以在目录/usr/share/examples/ppp/中找到。
PPP和动态IP地址
- PPPwith dynamic IP addresses
- IPCP
+
+
+ PPP
+ with dynamic IP addresses
+
+
+
+ IPCP
+
+
如果ISP没给您指定静态的IP地址, ppp要被配置成能够与对方协商确定本地和远程地址。
要完成这项工作, 先要猜
一个IP地址, 然后允许
ppp在连接后使用IP配置协议(IPCP)进行正确配置。
ppp.conf的配置是与
PPP和静态IP地址一样的, 除了以下的改变:
17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255
再次强调, 不要包括行号, 它只是一个引用标记。 缩排一个空格是必需的。
行17:
/ 字符后面是 PPP 所要求的地址掩码。
您可以根据需要使用不同 IP 地址, 但以上的例子永远是可行的。
最后的参数(0.0.0.0)告诉
PPP从0.0.0.0 而不是 10.0.0.1 开始协商地址, 对于有些ISP,
这是必需的。 不要将 0.0.0.0
作为 set ifaddr 的第一个参数,
因为这使得 PPP 在 模式时不能设置初始路由。
如果您不运行模式,
就需要在/etc/ppp/ppp.linkup中创建一个项。
连接建立之后, ppp.linkup被启用。 这时候,
ppp将指派接口地址, 接着再添加路由表项:
1 provider:
2 add default HISADDR
行 1:
为了建立连接,
ppp 会按按照如下规则在
ppp.linkup寻找项:首先, 试图寻找相同的标签
(如同在ppp.conf一样)。 如果失败了,
寻找作为网关 IP 地址的项, 此项是四个八位字节的风格。
如果依旧没有找到, 就寻找 MYADDR 项
行 2:
这行告诉 ppp添加指向
HISADDR的默认路由。
HISADDR由通过IPCP协商得到的IP号替换。
参考/usr/share/examples/ppp/ppp.conf.sample
和/usr/share/examples/ppp/ppp.linkup.sample
中的pmdemand项以获取细节化的例子。
接收拨入
- PPPreceiving
- incoming calls
+
+
+ PPP
+ receiving incoming calls
+
+
当要配置 ppp接受来自LAN上的
拨入时, 您需要决定是否将包转给LAN。 如果是的话, 您就必须从 LAN
子网中给对方分配一个IP, 需要在文件 /etc/ppp/ppp.conf
中使用命令 enable proxy。 您还应该确定文件
/etc/rc.conf 中包含以下内容:
gateway_enable="YES"
使用哪个getty?
配置 FreeBSD 的拨号服务
描述了如何用 &man.getty.8; 来启动拨号服务。
除了 getty 之外还有 mgetty,
它是 getty 的智能版本, 是按照拨号线的思想设计的。
使用 mgetty 的好处是它能积极地与 modem 进行
会话,
这就意味着如果在/etc/ttys中的端口被关闭,
您的moderm就不会回应拨入。
较新版本的 mgetty (从
0.99beta 起) 也支持自动检测 PPP 数据流,
这样即便客户端不使用脚本也能访问服务器了。
参考Mgetty 和
AutoPPP的联机手册了解更多信息。
PPP 权限
ppp 命令通常必须以 root
用户的身份运行。 如果希望以普通用户的身份启动 ppp
服务 (就像下面描述的那样), 就必须把此用户加入
- network 组, 使其获得运行 ppp
+ network 组, 使其获得运行 ppp
的权限。
您还需要使用allow命令使用户能访问配置文
件的一个或多个部分:
allow users fred mary
如果这个命令被用在 default
部分中, 您可以让指定的用户访问任何东西。
动态IP用户的PPP Shell
- PPP shells
+
+
+ PPP shells
+
创建一个名为/etc/ppp/ppp-shell文件, 加入以下内容:
#!/bin/sh
IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'`
CALLEDAS="$IDENT"
TTY=`tty`
if [ x$IDENT = xdialup ]; then
IDENT=`basename $TTY`
fi
echo "PPP for $CALLEDAS on $TTY"
echo "Starting PPP for $IDENT"
exec /usr/sbin/ppp -direct $IDENT
这个脚本要有可执行属性。 然后通过如下命令创建一个指向此脚本且名为
ppp-dialup的符号链接:
&prompt.root; ln -s ppp-shell /etc/ppp/ppp-dialup
您应该将这个脚本作为所有拨入用户的
shell。
以下是在文件 /etc/passwd
中关于 PPP 用户
pchilds 的例子 (切记,
不要直接修改这个密码文件, 用 &man.vipw.8; 来修改它)。
pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup
创建一个名为 /home/ppp的目录作为拨入用户的主目录,
包含以下这些空文件:
-r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin
-r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts
这样就可以防止/etc/motd被显示出来。
静态IP用户的Shell
- PPP shells
+
+
+ PPP shells
+
像上面那样创建ppp-shell文件,
为每个静态分配IP用户创建一个到 ppp-shell的
符号链接。
例如, 如果您希望为三个拨号用户,
fred, sam, 和
mary 路由 /24 CIDR 的网络, 则需要键入以下内容:
&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred
&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam
&prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary
每个用户的Shell必须被设成一个符号链接(例如用户
mary的Shell应该是/etc/ppp/ppp-mary)。
为动态IP用户设置ppp.conf
/etc/ppp/ppp.conf文件应该包含下面
这些行:
default:
set debug phase lcp chat
set timeout 0
ttyd0:
set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255
enable proxy
ttyd1:
set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255
enable proxy
缩进得必须的。
default:项在每次会话时都会加载。 每个在
/etc/ttys 中启用的行都必须为其创建一个相似于
ttyd0: 的项。 每一行应该从动态 IP
地址池中取得唯一的IP地址。
为静态 IP 用户配置 ppp.conf
根据上面 /usr/share/examples/ppp/ppp.conf 文件的内容,
您必须为每个静态拨号用户添加一个项。 我们继续以
fred、 sam
以及 mary为例。
fred:
set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255
sam:
set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255
mary:
set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255
如果需要, /etc/ppp/ppp.linkup
也应该包括每个静态IP用户的的路由信息。
下面这一行为客户连接添加了到
203.14.101.0/24 网络的路由。
fred:
add 203.14.101.0 netmask 255.255.255.0 HISADDR
sam:
add 203.14.102.0 netmask 255.255.255.0 HISADDR
mary:
add 203.14.103.0 netmask 255.255.255.0 HISADDR
mgetty和AutoPPP
+
- mgetty
-
- AutoPPP
- LCP
+ mgetty
+
+
+
+ AutoPPP
+
+
+
+ LCP
+
在配置和编译mgetty
时启用 AUTO_PPP选项
使mgetty能够探测PPP连接的的LCP状态
并自动产生PPP Shell。 但如果默认的login/password队列没有出现,
那就必须使用PAP或CHAP来验证用户。
这节假定您已经为用户成功地配置, 编译了带有AUTO_PPP选项的
mgetty。
确认文件 /usr/local/etc/mgetty+sendfax/login.config
包含以下内容:
/AutoPPP/ - - /etc/ppp/ppp-pap-dialup
这行告诉mgetty运行
ppp-pap-dialup脚本来侦听PPP连接。
创建/etc/ppp/ppp-pap-dialup文件写入以下内容 (此文件应该是可执行的):
#!/bin/sh
exec /usr/sbin/ppp -direct pap$IDENT
对应于每个在/etc/ttys的启用行, 都要在/etc/ppp/ppp.conf
中创建相应的项。 这和上面的定义是相同的。
pap:
enable pap
set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
enable proxy
每个以这种方式登录的用户, 都必须在
/etc/ppp/ppp.secret 文件中给出用户名/口令,
或者使用以下选项, 来通过 PAP 方式以 /etc/passwd
文件提供的信息来完成身份验证。
enable passwdauth
如果您想为某些用户分配静态IP,
可以在 /etc/ppp/ppp.secret
中将IP号作为第三个参数指定。 请参见
/usr/share/examples/ppp/ppp.secret.sample
中的例子。
MS Extensions
- DNS
- NetBIOS
- PPPMicrosoft extensions
+
+
+ DNS
+
+
+
+ NetBIOS
+
+
+
+ PPPMicrosoft extensions
+
+
可以配置PPP以提供DNS和NetBIOS域名服务器地址。
要在 PPP 1.x 版本中启用这些扩展, 需要在
/etc/ppp/ppp.conf 的对应项中加入下列配置:
enable msext
set ns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5
PPP版本2及以上:
accept dns
set dns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5
这将告诉客户端首选域名服务器和备用域名服务器。
在版本2及以上版本中, 如果省略了
set dns, PPP会使用
/etc/resolv.conf中的值。
PAP 和 CHAP 验证
PAP
CHAP
一些 ISP 将系统配置为使用 PAP 或 CHAP 机制来完成连接验证。
如果遇到这种情况, 在您连接时 ISP 就不会看到
login: 提示符, 而是立即开始 PPP 对话。
PAP 安全性要比 CHAP 差一些, 但在这里安全性并不是问题,
因为密码 (即使用明文传送) 只是通过串行线传送,
攻击者并没有太多机会去 窃听
它。
参考 PPP
与静态 IP 地址 或 PPP 与动态 IP 地址
小节, 并完成下列改动:
13 set authname MyUserName
14 set authkey MyPassword
15 set login
第 13 行:
这一行指明您的PAP/CHAP用户名。
您需要为MyUserName输入正确的值。
第 14 行:
password
这一行指明您的 PAP/CHAP password密码。
您需要为 MyPassword 输入正确的值。
另外,您可能希望加入一些额外的选项,例如:
16 accept PAP
或
16 accept CHAP
以明确您的意图, 不过, 默认情况下 PAP 和 CHAP 都会被接受。
行 15:
如果您使用的是 PAP 或 CHAP, 一般来说 ISP
就不会要求您登录服务器了。 这时,
就必须禁用 set login
设置。
即时改变您的ppp 配置
与后台运行的ppp程序进行对话是可能的,
前提是设置了一个合适的诊断端口。 做到这一点, 需要把下面的行加入到您的配置中:
set server /var/run/ppp-tun%d DiagnosticPassword 0177
这行告诉 PPP在指定的&unix;域socket中侦听, 当用户连接时需要给出指定的密码。
%d用tun设备号替换。
一旦启用了socket, 就可以在脚本中调用程序&man.pppctl.8;来处理正在运行的
的PPP。
使用PPP网络地址翻译
- PPPNAT
+
+
+ PPP
+ NAT
+
PPP 可以使用内建的 NAT, 而无需内核支持。
您可以在 /etc/ppp/ppp.conf 中加入如下配置来启用它:
- nat enable yes
+ nat enable yes
PPP NAT也可以使用命令行选项
-nat启动。 在
/etc/rc.conf 文件中也有
ppp_nat 项, 并默认启用。
如果您使用了这个特性, 您还会发现在
-/etc/ppp/ppp.conf中以下
- 选项对于启用incoming connections forwarding是有用的:
+ /etc/ppp/ppp.conf中以下
+ 选项对于启用incoming connections forwarding是有用的:
- nat port tcp 10.0.0.2:ftp ftp
+ nat port tcp 10.0.0.2:ftp ftp
nat port tcp 10.0.0.2:http http
或者完全不信任外来的请求
- nat deny_incoming yes
+ nat deny_incoming yes
最后的系统配置
- PPPconfiguration
+
+
+ PPPconfiguration
+
现在您已配置了ppp, 但在真正工作之前还有一些事情要做。
即修改 /etc/rc.conf。
从上依次往下看, 确认已经正确地配置了
hostname=, 例如:
hostname="foo.example.com"
如果您的ISP提供给您一个静态的IP和名字, 将这个名字设为hostname是最合适的。
寻找 network_interfaces 变量。
如果要配置系统通过拨号连入ISP,
一定要将tun0设备加入这个列表, 否则就删除它。
network_interfaces="lo0 tun0"
ifconfig_tun0=
ifconfig_tun0变量应该是空的, 且要创建一个名为
/etc/start_if.tun0的文件。
这个文件应该包含这一行:
ppp -auto mysystem
此脚本在网络配置时被执行, 开启PPP守护进程进入自动模式。
如果这台机子充当一个LAN的网关, 您可能希望使用
。 参考相关联机手册了解更多细节。
务必在
- /etc/rc.conf 中, 把路由程序设置为 NO:
+ /etc/rc.conf 中,
+ 把路由程序设置为 NO:
router_enable="NO"
- routed
-
+ routed
+
+
不启动 routed 服务程序非常重要, 因为
routed 总会删掉由 ppp
所建立的默认路由。
此外, 我们建议您确认一下
sendmail_flags 这一行中没有指定
参数, 否则
sendmail 将会不断地尝试查找网络,
而这样做将会导致机器不断地进行拨号。 可以考虑:
sendmail_flags="-bd"
sendmail
替代的做法是当每次 PPP 连接建立时您必须通过键入以下命令强制
sendmail 重新检查邮件队列:
&prompt.root; /usr/sbin/sendmail -q
您也可以在ppp.linkup使用!bg命令自动完成这些工作:
1 provider:
2 delete ALL
3 add 0 0 HISADDR
4 !bg sendmail -bd -q30m
- SMTP
+
+ SMTP
+
+
如果您不喜欢这样做, 可以设立一个
dfilter
以阻止 SMTP 传输。
参考相关文件了解更多细节。
现在您唯一要做的事是重新启动计算机。
重启之后,可以输入:
&prompt.root; ppp
然后是dial provider以开启 PPP会话。
或者如果您想让ppp自动建立会话,
因为您有一条广域网连接 (且没有创建 start_if.tun0
脚本), 键入:
&prompt.root; ppp -auto provider
总结
当第一次设置PPP时, 下面几步是必须的:
客户端:
确保 tun编译进了进核。
确保tunN
设备文件在 /dev 目录中是可用的。
在
/etc/ppp/ppp.conf中创建一个项。
pmdemand示例应该适合于绝大多数ISP。
如果您使用动态IP地址, 在/etc/ppp/ppp.linkup创建一个项。
更新/etc/rc.conf
文件。
如果您要求按需拨号, 创建一个start_if.tun0脚本。
服务器端:
确保tun设备已编译入内核。
确保tunN设备文件在
/dev目录中是可用的。
在/etc/passwd中创建一个项
(使用&man.vipw.8;程序)。
在用户的home目录创建一个运行
ppp -direct direct-server或相似命令的profile。
在/etc/ppp/ppp.conf中创建一个项。
direct-server示例应该能满足要求。
在
/etc/ppp/ppp.linkup中创建一个项。
更新 /etc/rc.conf
文件。
Gennady B.
Sorokopud
Parts originally contributed by
Robert
Huff
使用内核级PPP
设立内核级PPP
- PPPkernel PPP
+
+
+ PPP
+ kernel PPP
+
在开始设置内核级PPP时, 需要确信pppd已经被定位在/usr/sbin 中
且存在/etc/ppp目录。
pppd能在两种模式下工作:
作为一个 客户
—
您要通过PPP串行线或modem线把您的机器连接到互联网上。
- PPPserver
+
+ PPP
+ server
+
+
作为服务器
—计算机已经位于网络上, 且被用于通过PPP与其它计算机连接。
两种情况您都需要设立一个选项文件,
(/etc/ppp/options 或者是
~/.ppprc 如果您的计算机有多个用户使用PPP)。
您还需要一些modem/serial软件(comms/kermit就很适合),
使您能够拨号并与远程主机建立连接。
Trev
Roydhouse
Based on information provided by
使用pppd作为客户端
- PPPclient
- Cisco
+
+
+ PPP
+ client
+
+
+
+ Cisco
+
+
下面这个 /etc/ppp/options选项文件能够被用来与CISCO终端服务器的
PPP线连接。
crtscts # enable hardware flow control
modem # modem control line
noipdefault # remote PPP server must supply your IP address
# if the remote host does not send your IP during IPCP
# negotiation, remove this option
passive # wait for LCP packets
domain ppp.foo.com # put your domain name here
-:<remote_ip> # put the IP of remote PPP host here
+:remote_ip # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noipdefault option
- # change this line to <local_ip>:<remote_ip>
+ # change this line to local_ip:remote_ip
defaultroute # put this if you want that PPP server will be your
# default router
连接:
Kermit
modem
使用 Kermit (或其他 modem
程序来拨号), 然后输入您的用户名和口令
(或在远程主机上启用 PPP 所需的其他信息)。
退出 Kermit (并不挂断连接)。
键入下面这行:
&prompt.root; /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200
一定要使用正确的速度和设备名。
现在您的计算机已经用PPP连接。 如果连接失败,
您可在文件 /etc/ppp/options 中添加
选项, 并查看控制台信息以跟踪问题。
下面这个/etc/ppp/pppup脚本能自动完成这三个步骤:
#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.dial
pppd /dev/tty01 19200
- Kermit
+
+ Kermit
+
+
/etc/ppp/kermit.dial 是一个 Kermit
脚本, 它会完成拨号, 并在远程主机上完成所有需要的身份验证过程
(这份文档的最后有一个脚本实例)。
使用下面这个脚本/etc/ppp/pppdown断开PPP连线:
#!/bin/sh
pid=`pgrep pppd`
if [ X${pid} != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill -TERM ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
/sbin/ifconfig ppp0 down
/sbin/ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.hup
/etc/ppp/ppptest
- 通过执行/usr/etc/ppp/ppptest, 看看pppd 是否仍在运行:
+ 通过执行/usr/etc/ppp/ppptest,
+ 看看pppd 是否仍在运行:
#!/bin/sh
pid=`pgrep pppd`
if [ X${pid} != "X" ] ; then
echo 'pppd running: PID=' ${pid-NONE}
else
echo 'No pppd running.'
fi
set -x
netstat -n -I ppp0
ifconfig ppp0
执行脚本
/etc/ppp/kermit.hup以挂起moderm, 这个文件包含:
set line /dev/tty01 ; put your modem device here
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
echo \13
exit
也可以用chat
代替kermit:
以下两个文件用以建立pppd连接。
/etc/ppp/options:
- /dev/cuaa1 115200
+ /dev/cuad1 115200
crtscts # enable hardware flow control
modem # modem control line
connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
noipdefault # remote PPP serve must supply your IP address
# if the remote host doesn't send your IP during
# IPCP negotiation, remove this option
passive # wait for LCP packets
-domain <your.domain> # put your domain name here
+domain your.domain # put your domain name here
: # put the IP of remote PPP host here
# it will be used to route packets via PPP link
# if you didn't specified the noipdefault option
- # change this line to <local_ip>:<remote_ip>
+ # change this line to local_ip:remote_ip
defaultroute # put this if you want that PPP server will be
# your default router
/etc/ppp/login.chat.script:
以下的内容应该放在一行内。
- ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number>
- CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id>
- TIMEOUT 5 sword: <password>
+ ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDTphone.number
+ CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: login-id
+ TIMEOUT 5 sword: password
一旦这些被安装且修改正确, 您所要做的就是运行pppd, 就像这样:
&prompt.root; pppd
使用pppd作为服务器
/etc/ppp/options要包括下面这些内容:
crtscts # Hardware flow control
netmask 255.255.255.0 # netmask (not required)
192.114.208.20:192.114.208.165 # IP's of local and remote hosts
# local ip must be different from one
# you assigned to the Ethernet (or other)
# interface on your machine.
# remote IP is IP address that will be
# assigned to the remote machine
domain ppp.foo.com # your domain
passive # wait for LCP
modem # modem line
下面这个脚本/etc/ppp/pppserv
使pppd以服务器方式启动:
#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
# reset ppp interface
ifconfig ppp0 down
ifconfig ppp0 delete
# enable autoanswer mode
kermit -y /etc/ppp/kermit.ans
# run ppp
pppd /dev/tty01 19200
使用脚本/etc/ppp/pppservdown停止服务器:
#!/bin/sh
pgrep -l pppd
pid=`pgrep pppd`
if [ "X${pid}" != "X" ] ; then
echo 'killing pppd, PID=' ${pid}
kill ${pid}
fi
pgrep -l kermit
pid=`pgrep kermit`
if [ "X${pid}" != "X" ] ; then
echo 'killing kermit, PID=' ${pid}
kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.noans
下面的 Kermit 脚本
(/etc/ppp/kermit.ans) 能够启用/禁用您 modem
的自动应答模式。 其内容类似下面这样:
set line /dev/tty01
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
pau 1
out +++
inp 5 OK
out ATH0\13
inp 5 OK
echo \13
out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable
; autoanswer mode
inp 5 OK
echo \13
exit
一个名为/etc/ppp/kermit.dial的脚本用于向远程主机
进行拨号和验证。 您要根据需要定制它。 要加入您的登寻名和密码,
您还要根据 modem 和远程主机的反应修改输入语句。
;
; put the com line attached to the modem here:
;
set line /dev/tty01
;
; put the modem speed here:
;
set speed 19200
set file type binary ; full 8 bit file xfer
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
set modem hayes
set dial hangup off
set carrier auto ; Then SET CARRIER if necessary,
set dial display on ; Then SET DIAL if necessary,
set input echo on
set input timeout proceed
set input case ignore
def \%x 0 ; login prompt counter
goto slhup
:slcmd ; put the modem in command mode
echo Put the modem in command mode.
clear ; Clear unread characters from input buffer
pause 1
output +++ ; hayes escape sequence
input 1 OK\13\10 ; wait for OK
if success goto slhup
output \13
pause 1
output at\13
input 1 OK\13\10
if fail goto slcmd ; if modem doesn't answer OK, try again
:slhup ; hang up the phone
clear ; Clear unread characters from input buffer
pause 1
echo Hanging up the phone.
output ath0\13 ; hayes command for on hook
input 2 OK\13\10
if fail goto slcmd ; if no OK answer, put modem in command mode
:sldial ; dial the number
pause 1
echo Dialing.
output atdt9,550311\13\10 ; put phone number here
assign \%x 0 ; zero the time counter
:look
clear ; Clear unread characters from input buffer
increment \%x ; Count the seconds
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER\13\10}
if success goto sldial
reinput 1 {NO DIALTONE\13\10}
if success goto slnodial
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 60 goto look
else goto slhup
:sllogin ; login
assign \%x 0 ; zero the time counter
pause 1
echo Looking for login prompt.
:slloop
increment \%x ; Count the seconds
clear ; Clear unread characters from input buffer
output \13
;
; put your expected login prompt here:
;
input 1 {Username: }
if success goto sluid
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 10 goto slloop ; try 10 times to get a login prompt
else goto slhup ; hang up and start again if 10 failures
:sluid
;
; put your userid here:
;
output ppp-login\13
input 1 {Password: }
;
; put your password here:
;
output ppp-password\13
input 1 {Entering SLIP mode.}
echo
quit
:slnodial
echo \7No dialtone. Check the telephone line!\7
exit 1
; local variables:
; mode: csh
; comment-start: "; "
; comment-start-skip: "; "
; end:
Tom
Rhodes
Contributed by
PPP 连接故障排除
- PPPtroubleshooting
+
+ PPP
+ troubleshooting
+
本节将讲述通过modem连接使用PPP时可能出现的问题。
例如, 您可能需要确切地知道您拨入的系统会出现一个怎样的命令行提示符。
有些 ISP 会提供 ssword提示符,
而其它的可能会出现 password;
如果没有根据情况的不同相应地编写 ppp
脚本, 登录就会失败。 诊断 ppp
最常用的方法是手动进行连接。 以下的信息会一步一步地带您完成手动连接。
检查设备节点
如果您的内核是经过重新配置的, 那么就需要检查sio设备。
如果没有配置过内核, 就没什么可担心的了。 只要查看
dmesg的输出以找到modem设备:
&prompt.root; dmesg | grep sio
您应该找到与 sio 设备有关的输出。
这些就是我们需要的 COM 端口。 如果您的 modem 按照标准串行端口工作,
您就会在 sio1 或 COM2
上找到它。 如果 modem 设备连接在 sio1
接口 (在 DOS 中称为COM2),
- 那么您的 modem 将会是 /dev/cuaa1。
+ 那么您的 modem 将会是 /dev/cuad1
+ (或者 &os;nbsp;5.X 下的
+ /dev/cuaa1)。
手动连接
通过手动控制ppp来连接Internet
是诊断连接及获知ISP处理PPP客户端方式的一个快速, 简单的方法。
让我们从PPP 命令行开始, 在所有的例子中我们使用
example 表示运行 PPP
服务的主机名。 键入ppp
命令打开 ppp:
&prompt.root; ppp
现在我们已经打开了ppp。
- ppp ON example> set device /dev/cuaa1
+ ppp ON example> set device /dev/cuad1
设置modem设备, 在本例子中是
- cuaa1。
+ cuad1 (或者 &os; 5.X 下的
+ /dev/cuaa1)。
ppp ON example> set speed 115200
设置连接速度, 在本例中我们使用15,200 kbps。
ppp ON example> enable dns
使ppp配置域名服务,
在文件/etc/resolv.conf中添加域名服务器行。
如果 ppp不能确定我们的主机名, 可以在稍后设置。
ppp ON example> term
切换到 终端
样我们就能手动地控制这台 modem 的模式。
- deflink: Entering terminal mode on /dev/cuaa1
+ deflink: Entering terminal mode on /dev/cuad1
type '~h' for help
at
OK
atdt123456789
使用命令at初始化modem,
然后使用atdt和ISP给您的号码进行拨号。
CONNECT
连接配置, 如果我们遇到了与硬件无关的连接问题, 可以在这里尝试解决。
ISP Login:myusername
这里提示您输入用户名, 输入ISP提供的用户名然后按回车。
ISP Pass:mypassword
这时提示我们输入密码, 输入
ISP提供的密码。
如同登录入&os;, 密码不会显示。
Shell or PPP:ppp
由于ISP的不同, 这个提示符可能不会出现。
这里我们需要考虑: 是使用运行于提供商端的 Shell,
还是启动 ppp? 这本例中,
我们选择使用 ppp, 因为我们希望得到 Internet 连接。
Ppp ON example>
注意在这个例子中, 第一个 已经大写。
这表示我们已经成功地连接上了 ISP。
PPp ON example>
我们已经成功通过了
ISP的验证, 正在等待分配IP地址。
PPP ON example>
我们得到了一个 IP
地址, 成功地完成了连接。
PPP ON example>add default HISADDR
这样就完成了添加默认路由所需的配置。 这是与外界通信所必需的。
因为之前我们只是与服务器端建立了连接。 如果由于已存在的路由而导致操作失败,
您可以在 前加 !号。
除此之外, 您也可以在真正连接之前设置这些 (指 add default HISADDR),
ppp 会根据这项设定协商取得新的路由。
如果一切顺利, 现在我们应该能得到一个活动的 Internet 连接,
可以使用 CTRL
z 使其转入后台。 如果您发现
PPP重新变为 ppp,
则表示连接被断开。 大写的 P 表明建立了到 ISP 的连接,
而小写的 p 则表示连接由于某种原因被断开, 这有助于帮助我们了解连接的状态。
ppp 只有这两个状态。
诊断排错
如果您有一根直连线且似乎不能建立连接, 要使用以关闭字节流的CTS/RTS。
这种情况一般发生在连接兼容 PPP 的终端服务器时。
当它向通信连接写入数据时, PPP就会挂起,
一直等待一个CTS,
或者一个不可能出现的 Clear to Send 信号。 如果使用了这个选项, 您还应使用
选项,
某些存在缺陷的硬件在完成端对端发送特定字符, 特别是
XON/XOFF 时可能会遇到困难。 请参见 &man.ppp.8;
联机手册以了解关于可用选项的更多细节, 以及如何使用它们。
如果您的 modem 比较旧, 就需要使用
了。 奇偶校验的默认设置是 none,
但在旧式的 (当流量大量增加时) 调制解调器和某些
ISP 被用来纠错。 您需要使用这个选项才能使用
Compuserve ISP。
PPP 可能并不返回命令模式,
这通常是 ISP 等待您这一端发起协商时发生了错误。
此时, 使用 ~p 命令将强制 ppp 开始发送配置信息。
如果您没有看到登录提示, 则很可能需要使用
PAP 或
CHAP 验证来代替前面例子中的
&unix; 风格验证。 要使用
PAP 或 CHAP
只需在进入终端模式之前把下面的选项加入
PPP:
ppp ON example> set authname myusername
此处 myusername 应改为您的
ISP 分配给您的用户名。
ppp ON example> set authkey mypassword
此处 mypassword 应该为您的
ISP 分配给您的口令。
如果连接正常, 但无法查找域名, 请尝试
&man.ping.8; 某个 IP
地址来看看是否返回了信息。 如果您发现百分之百 (100%) 丢包,
那么您很可能没有分配默认路由。 请仔细检查选项
是否在连接时被设置了。 如果您能连接到远程的
IP 地址则有可能域名解析服务器的地址没有被加入到
/etc/resolv.conf。 这个文件应该是下面的样子:
domain example.com
nameserver x.x.x.x
nameserver y.y.y.y
此处 x.x.x.x 和
y.y.y.y 应该改为您的
ISP 的 DNS 服务器的
IP 地址。
这一信息在您注册时可能会提供给您,
不过通常只需给 ISP 打个电话就能知道了。
您还可以让 &man.syslog.3; 为您的 PPP
连接提供日志。 只需增加:
!ppp
*.* /var/log/ppp.log
到 /etc/syslog.conf 中。 绝大多数情况下,
这个功能默认已经打开了。
Jim
Mock
Contributed (from http://node.to/freebsd/how-tos/how-to-freebsd-pppoe.html) by
使用基于以太网的PPP(PPPoE)
- PPPover Ethernet
+
+
+ PPP
+ over Ethernet
+
+
PPPoE
PPP, over Ethernet (以太网上的 PPP)
本节将介绍如何建立基于以太网的PPP
(PPPoE)。
配置内核
对于PPPOE, 并没有必须的内核配置。 如果必需的 netgraph
支持没有编译入内核, 它可以由 ppp 动态加载。
设置ppp.conf
以下是一个ppp.conf的例子:
default:
set log Phase tun command # you can add more detailed logging if you wish
set ifaddr 10.0.0.1/0 10.0.0.2/0
name_of_service_provider:
set device PPPoE:xl1 # replace xl1 with your Ethernet device
set authname YOURLOGINNAME
set authkey YOURPASSWORD
set dial
set login
add default HISADDR
运行ppp
以 root 身份执行:
&prompt.root; ppp -ddial name_of_service_provider
启动时运行ppp
在 /etc/rc.conf 中加入以下内容:
ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO
ppp_profile="name_of_service_provider"
使用 PPPoE 服务标签
在某些时候, 有必要使用一个服务标签来建立您的连接。
服务标签用于区分同一网络中的不同服务器。
您可以在ISP提供的文档中找到必要的服务标签信息。
若不能找到, 则应向您的 ISP 寻求技术支持。
作为最后的方法, 您可以试试
Roaring Penguin
PPPoE, 它可以在 Ports Collection 中找到。
然而需要注意的是, 它可能会清楚 modem 的固件, 并使其无法正常工作,
因此一定要仔细考虑之后再做这个操作。 简单地安装由服务提供商随 modem
提供的程序。 随后, 选择
System 菜单。 您的配置文件应该会在这里列出。
一般来说它的名字应该是
ISP。
配置文件名 (service tag, 服务标签) 将被用于 PPPoE
在 ppp.conf 中的配置项,
作为服务商 set device 命令的一部分 (参见 &man.ppp.8;
联机手册以了解更多细节)。 它应该类似下面的样子:
set device PPPoE:xl1:ISP
记住将xl1换成实际的以太网设备。
记住将 ISP
换成您刚刚找到的profile名。
获得更多的信息, 请参考:
Cheaper
Broadband with FreeBSD on DSL by Renaud
Waldura.
Nutzung von T-DSL und T-Online mit FreeBSD
by Udo Erdelhoff (in German).
- 带有一个&tm.3com; HomeConnectADSL Modem的PPPOE双重连接
+ 带有一个&tm.3com;
+ HomeConnect
+ ADSL Modem的PPPOE双重连接
这个 modem 不遵循 RFC 2516
+ url="http://www.faqs.org/rfcs/rfc2516.html">RFC 2516
(A Method for transmitting PPP over Ethernet
(PPPoE), 其作者为 L. Mamakos、 K. Lidl、 J. Evarts、
D. Carrel、 D. Simone 以及 R. Wheeler)。
而是使用不同的数据包格式作为以太网的框架。 请向
3Com 抱怨,
如果您认为它应该遵守 PPPoE 的规范。
为了让FreeBSD能够与这个设备通信, 必须设置sysctl。
通过更改/etc/sysctl.conf,
这一步可以在启动时自动完成:
net.graph.nonstandard_pppoe=1
或者, 也可以直接执行下面的命令:
&prompt.root; sysctl net.graph.nonstandard_pppoe=1
很不幸,由于这是系统全局设置, 无法同时与正常的PPP客户端(或服务器)
和&tm.3com;HomeConnect
ADSL Modem通信。
使用 ATM 上的 PPP (PPPoA)
- PPPover ATM
+
+
+ PPP
+ over ATM
+
+
PPPoA
基于ATM的PPP
以下将介绍如何设置基于ATM的PPP(PPPoA)。
PPPoA是欧洲DSL提供商的普遍选择。
使用 Alcatel &speedtouch;USB 的 PPPoA
针对这一设备的 PPPoA 支持, 在
FreeBSD 中是作为 port 提供的, 因为其固件使用了 阿尔卡特许可协议,
因而不能与 FreeBSD 的基本系统一起免费地再发布。
使用 Ports 套件 可以非常方便地安装
net/pppoa port,
之后按照它提供的指示操作就可以了。
和许多 USB 设备类似, 阿尔卡特的 &speedtouch; USB
需要从主机上下载固件才能够正常工作。 在 &os; 中您可以将此操作自动化,
在有设备插到某个 USB 口的时候自动下载固件。 可以在
/etc/usbd.conf
文件中加入下面的信息来让它自动完成固件的传送。 注意, 必须以
root 用户的身份编辑它。
device "Alcatel SpeedTouch USB"
devname "ugen[0-9]+"
vendor 0x06b9
product 0x4061
attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o"
要启动USB守护进程usbd,
在/etc/rc.conf加入以下行:
usbd_enable="YES"
也可以将ppp设置成启动时拨号。 向
/etc/rc.conf加入以下这几行。
同样地您需要以root用户登录。
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="adsl"
为了使其正常工作, 您需要使用net/pppoa
port提供的ppp.conf样例。
使用mpd
可以使用 mpd 来连接多种类型的服务,
特别是 PPTP 服务。 您可以在 Ports Collection 中找到
mpd, 它的位置是
net/mpd。 许多 ADSL modem
需要在 modem 和计算机之间建立一条 PPTP 隧道,
而阿尔卡特 &speedtouch; Home 正是其中的一种。
首先需要从 port 完成安装,
然后才能配置 mpd 来满足您的需要,
并完成服务商的配置。 port 会把一系列包括了详细注解的配置文件实例放到
PREFIX/etc/mpd/。
注意, 这里的 PREFIX 表示 ports
安装的目录, 默认情况下, 应该是
/usr/local/。
关于配置 mpd 的完整说明, 会以
HTML 格式随 port 一起安装。 这些文件将放在
PREFIX/share/doc/mpd/。
下面是通过 mpd 连接 ADSL
服务的一个简单例子。 配置被分别放到了两个文件中, 第一个是
mpd.conf:
default:
load adsl
adsl:
new -i ng0 adsl adsl
set bundle authname username
set bundle password password
set bundle disable multilink
set link no pap acfcomp protocomp
set link disable chap
set link accept chap
set link keep-alive 30 10
set ipcp no vjcomp
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set iface route default
set iface disable on-demand
set iface enable proxy-arp
set iface idle 0
open
username用来向您的ISP进行验证。
password用来向您的ISP进行验证。
mpd.links包含连接的信息:
adsl:
set link type pptp
set pptp mode active
set pptp enable originate outcall
set pptp self 10.0.0.1
set pptp peer 10.0.0.138
运行mpd的主机的IP地址。
ADSL modem的IP地址。 Alcatel
&speedtouch; Home 默认的是 10.0.0.138。
初始化连接:
&prompt.root; mpd -b adsl
您可以通过以下命令查看连接状态:
&prompt.user; ifconfig ng0
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff
使用mpd连接ADSL服务是推荐的方式。
使用pptpclient
也可以使用net/pptpclient连接其它的
PPPoA。
要使用 net/pptpclient 连接
DSL 服务, 需要安装 port 或 package 并编辑
/etc/ppp/ppp.conf。 您需要有
root 权限才能完成这两项操作。
以下是 ppp.conf 中的一个示例项。
参考 ppp 的联机手册 &man.ppp.8;,
以了解更多有关 ppp.conf 选项的信息。
adsl:
set log phase chat lcp ipcp ccp tun command
set timeout 0
enable dns
set authname username
set authkey password
set ifaddr 0 0
add default HISADDR
您在 DSL 服务提供商那里的用户名
您帐户的口令。
由于您必须将帐号密码以明文的方式放入ppp.conf
您应该确保没有任何人能看到此文件的内容。 以下一系列命令将会确保此文件只对
root用户可读。
请参见 &man.chmod.1; 和 &man.chown.8; 的联机手册以了解有关如何操作的进一步信息。
&prompt.root; chown root:wheel /etc/ppp/ppp.conf
&prompt.root; chmod 600 /etc/ppp/ppp.conf
以下将为到 DSL 路由器的会话打开一个 tunnel。
以太网DSL modem有一个设置的局域网IP地址。 以 Alcatel &speedtouch; Home
为例, 这个地址是 10.0.0.138。
路由器的文档应该会告诉您它使用的地址。
执行以下命令以打开 tunnel 并开始会话:
&prompt.root; pptp address adsl
您应该在命令的最后加上(&
)号, 否则 pptp
无法返回到命令行提示符。
要创建一个 tun虚拟设备用于进程pptp
和ppp 之间的交互。 一旦您回到了命令行,
或者 pptp
进程确认了一个连接, 您可以这样检查tunnel设备:
&prompt.user; ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00
Opened by PID 918
如果您无法连接, 一般可以通过telnet或者web浏览器检查路由器(modem)的配置。
如果依旧无法连接, 您应该检查pptp的输出及ppp的日志文件
/var/log/ppp.log 以获得线索。
Satoshi
Asami
Originally contributed by
Guy
Helmer
With input from
Piero
Serini
使用SLIP
SLIP
设置SLIP客户端
SLIPclient
下面是在静态主机网络上配置 FreeBSD 机器使用 SLIP 的方法。
对于动态主机名分配 (您的地址会随每次拨号而不同),
您可能需要稍复杂一些的设置。
首先, 您需要确认调制解调器所连接的串口。
许多人会设置一个符号连接, 例如
/dev/modem, 用以指向实际的设备名,
- /dev/cuaaN (或在 &os; 6.X 下是
- /dev/cuadN)。 这样您就可以对实际的设备名进行抽象,
+ /dev/cuadN (或在 &os; 5.X 下是
+ /dev/cuaaN)。 这样您就可以对实际的设备名进行抽象,
以备调制解调器换到其他串口时方便调整之用。
不然, 在系统中修改一大堆 /etc 下的文件以及
.kermrc 将是非常麻烦的事情!
- /dev/cuaa0 (或 &os; 6.X
- 中的 /dev/cuad0) 对应
- COM1, 而 cuaa1
- (或 /dev/cuad1) 则对应
+ /dev/cuad0 (或 &os; 5.X
+ 下的 /dev/cuaa0) 对应
+ COM1, 而 cuad1
+ (或 /dev/cuaa1) 则对应
COM2, 等等。
确保您的内核文件包含以下内容:
device sl
这包含在GENERIC内核, 所以这应该不会是个问题, 除非您
已经删除了它。
只需做一次的事情
把您本地网络上的机器、 网关以及域名服务器,
都加入到 /etc/hosts 文件中。
我们的是下面这个样子:
127.0.0.1 localhost loghost
136.152.64.181 water.CS.Example.EDU water.CS water
136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway
128.32.136.9 ns1.Example.EDU ns1
128.32.136.12 ns2.Example.EDU ns2
在 FreeBSD 5.0 之前的版本中, 请务必确保
/etc/host.conf 中的 hosts 在
bind 之前出现。
从 FreeBSD 5.0 开始, 系统转而使用
/etc/nsswitch.conf 文件,
请确认在这个文件中 一行里,
files 出现在
dns 之前。 如果没有这些参数,
可能会发生很奇怪的事情。
编辑/etc/rc.conf。
编辑以下这行设置主机名(hostname):
hostname="myname.my.domain"
应该用您主机的Internet全名代替。
default route
改变这一行以指明默认的路由:
defaultrouter="NO"
改为:
defaultrouter="slip-gateway"
创建文件/etc/resolv.conf, 写入以下内容:
domain CS.Example.EDU
nameserver 128.32.136.9
nameserver 128.32.136.12
nameserver
domain name
正如您看到的, 这些行设置了域名服务器。 当然,
实际的域名和IP地址取决于您的环境。
设置root和
toor的密码(其它任何没有密码的帐号)。
重启计算机, 然后确认使用了正确的主机名。
创建一个SLIP连接
- SLIPconnecting with
+
+
+ SLIP
+ connecting with
+
+
在命令提示符之后输入 slip 进行拨号,
输入您的机器名和口令。 具体需要输入什么,
与您的环境密切相关。 如果使用
Kermit,
则可以使用类似下面的脚本:
# kermit setup
set modem hayes
set line /dev/modem
set speed 115200
set parity none
set flow rts/cts
set terminal bytesize 8
set file type binary
# The next macro will dial up and login
define slip dial 643-9600, input 10 =>, if failure stop, -
output slip\x0d, input 10 Username:, if failure stop, -
output silvia\x0d, input 10 Password:, if failure stop, -
output ***\x0d, echo \x0aCONNECTED\x0a
当然, 您还需要修改用户名和口令来满足实际需要。
- 完成这些操作之后, 只需在 Kermit 提示符之后输入
- slip 就可以连接了。
+ 完成这些操作之后, 只需在 Kermit
+ 提示符之后输入 slip 就可以连接了。
将密码以纯文本的形式存放在文件系统无论如何都是个 坏 主意。
请考虑这样做的风险。
在这里退出 Kermit (也可以用
Ctrl
z
将其挂起), 以 root 用户键入:
&prompt.root; slattach -h -c -s 115200 /dev/modem
如果您能ping通路由器另一端的主机, 就是连接好了! 如果不行,
您可以使用选项代替
作为slattach的参数。
关闭连接
按下面的步骤做:
&prompt.root; kill -INT `cat /var/run/slattach.modem.pid`
来杀掉 slattach。 切记上述操作只有以
root 身份才能完成。 接下来回到
kermit (如果之前是将它挂起了,
则使用 fg) 并退出 (q)。
在 &man.slattach.8; 联机手册中提到,
必须使用 ifconfig sl0 down
才能将接口标记为关闭, 但和这样做似乎没有什么区别。
(ifconfig sl0 仍然报告同样的东西。)
有时, 您的 modem 可能会拒绝挂断。
这种情况下, 只需重新启动 kermit
并再次退出它就可以了。 一般来说试二次就可以了。
问题解答
如果还不行, 尽管发邮件到 &a.net.name; 邮件列表来提问。
常见的问题包括:
执行 slattach 时不使用
和选项
(这应该不是关键的, 但有些用户报告这样做解决了问题)。
使用替换
(在一些字体下很难看出不同)。
试试ifconfig sl0来查看您的接口状态。
例如, 您可以这样做:
&prompt.root; ifconfig sl0
sl0: flags=10<POINTOPOINT>
inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00
如果在使用 &man.ping.8; 时得到了
no route to host 这样的提示,
则说明您的路由表可能有问题。 可以用 netstat -r
命令来显示当前的路由:
&prompt.root; netstat -r
Routing tables
Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks:
(root node)
(root node)
Route Tree for Protocol Family inet:
(root node) =>
default inr-3.Example.EDU UG 8 224515 sl0 - -
localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438
inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - -
water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438
(root node)
前述的例子来自于一个非常繁忙的系统。
您系统上的这些数字会因网络活动的不同而改变。
设置SLIP服务器
- SLIPserver
+
+
+ SLIP
+ server
+
本文提供了在 FreeBSD 上设置 SLIP 服务,
也就是如何配置您的系统, 使其能在远程 SLIP
客户端登录时自动地开启连接的建议。
前提条件
TCP/IP networking
这一节技术性很强, 所以要求您有一定的背景知识。
本节假定您熟悉 TCP/IP 网络协议, 特别是网络和节点寻址、
子网掩码、 子网划分、 路由、 路由协议 (如RIP) 等知识。
在拨号服务器上配置 SLIP 需要这些概念性的知识。
如果您不熟悉它们, 请先阅读 Craig Hunt 的 TCP/IP 网络管理
由O'Reilly & Associates, Inc. 出版 (ISBN 0-937175-82-X),
或 Douglas Comer 有关 TCP/IP 协议的书籍。
modem
此外还假定您已经配置好了您的调制解调器以及相应的系统文件,
以允许通过调制解调器进行登录。 如果您还没有为此配置好系统,
请参见 以了解关于如何进行拨号服务的配置。
您可能也会想看一看 &man.sio.4; 的联机手册,
以了解关于串口设备驱动的进一步信息, 以及 &man.ttys.5;、
&man.gettytab.5;、 &man.getty.8; & &man.init.8;
上关于怎样配置系统来接受来自调制解调器的登录请求的具体情况,
还有 &man.stty.1; 以了解关于设置串口参数
(例如 clocal 表示串口直联) 等。
快速浏览
使用FreeBSD作为SLIP服务器, 在典型配置时, 它是这样工作的:
一个SLIP客户拨号并以专用的login ID登录到FreeBSD SLIP服务器系统。
这个用户使用 /usr/sbin/sliplogin
作为 shell。 sliplogin 程序会在文件
/etc/sliphome/slip.hosts 中查找这个用户的项,
如果找到了匹配项, 就将串行线连接到一个可用的 SLIP 接口,
然后运行 shell 脚本 /etc/sliphome/slip.login
以配置 SLIP 接口。
一个SLIP服务器登录的例子
例如, 如果一个SLIP用户的ID是Shelmerg,
在/etc/master.passwd中Shelmerg的项如下的所示:
Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin
Shelmerg登录时,
sliplogin在文件
/etc/sliphome/slip.hosts中搜索与用户ID匹配的行;如下所示:
Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp
sliplogin找到这条区配行,
并将串行线与另一个可用的SLIP接口连起来,
然后执行/etc/sliphome/slip.login脚本:
/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp
如果一切顺利
- /etc/sliphome/slip.login 将在 sliplogin
- 绑定的 SLIP 接口上发出
+ /etc/sliphome/slip.login 将在
+ sliplogin 绑定的 SLIP 接口上发出
ifconfig (前述的例子中是 SLIP 接口
0, 这是 slip.login 的第一个参数),
以设置本地 IP 地址 (dc-slip)、 远程 IP 地址
(sl-helmer)、 这一 SLIP
接口的子网掩码 (0xfffffc00),
以及任何其他标志 (autocomp)。
如果发生错误, sliplogin 通常会通过
syslogd 的 daemon facility
- 记下有用的信息, 前者会把这些信息保存到 /var/log/messages
+ 记下有用的信息, 前者会把这些信息保存到
+ /var/log/messages
(参见 &man.syslogd.8; 和 &man.syslog.conf.5; 以及
/etc/syslog.conf 的联机手册, 以了解
syslogd 在记录什么,
以及这些内容将被记在哪里)。
内核配置
- kernelconfiguration
- SLIP
+
+
+ kernel
+ configuration
+
+
+
+ SLIP
+
&os; 的默认内核 (GENERIC)
提供了 SLIP (&man.sl.4;) 支持; 使用定制的内核时,
您必须把下面的设置加入到配置文件:
device sl
默认情况下, 您的 &os; 计算机不会转发包。
如果您希望将 FreeBSD SLIP 服务器作为路由器使用,
就需要修改 /etc/rc.conf 文件,
并加入一项将 gateway_enable 变量设为
的设制。
接下来需要重新启动以便使新设置生效。
请参见 以了解如何配置 FreeBSD
内核, 并获得在重新配置内核方面的指导。
Sliplogin配置
正如先前所提到的,
/etc/sliphome目录有三个文件构成/usr/sbin/sliplogin的配置
(参考sliplogin的联机手册&man.sliplogin.8;):slip.hosts,
定义SLIP用户及有关IP地址; slip.login, 一般只配置SLIP接口; 文件
slip.logout(可选的), 串行连接终止时, 撤消slip.login所做的修改。
配置 slip.hosts
/etc/sliphome/slip.hosts里的每行包含至少四个元素, 元素之间由空格隔开:
SLIP用户的登录ID
SLIP连接的本地地址(指SLIP服务器)
SLIP连接的远程地址
网络掩网
本地和远程地址可以是主机名
(通过文件/etc/hosts或者域名服务解析为IP地址,
这取决于文件/etc/nsswitch.conf
中的设置), 网络掩网可以是一个
能通过文件/etc/networks解析的名字。
在一个样例系统中,
/etc/sliphome/slip.hosts是这样的:
#
# login local-addr remote-addr mask opt1 opt2
# (normal,compress,noicmp)
#
Shelmerg dc-slip sl-helmerg 0xfffffc00 autocomp
在这行末尾是一或多个选项:
—不压缩报头
— 压缩报头
—如果远程端允许, 压缩报头
—禁用ICMP数据包
(这样就会丢弃所有的ping
数据包, 不占用您的带宽)
SLIP
TCP/IP networking
对SLIP连接的本地及远程地址的选择取决是您是准备在SLIP服务器上使用 TCP/IP
子网还是使用ARP代理
(它并不是真正的
ARP代理, 而是我们在本节用于介绍的术语)。
如果您不能确定选择何种方式或者如何分配地址, 请参考"前提条件"()里列出的TCP/IP书籍
或者向您的IP网络管理员请教。
如果打算为您的 SLIP 客户使用一个独立的子网,
就需要先从分配得到的网络号中取出一个子网号,
然后再在这个子网里给每个 SLIP 客户分配 IP 地址。
接下来, 您还需要通过 SLIP 服务器在最近的 IP
路由器上配置一个指向 SLIP 子网的静态路由。
Ethernet
如果您要使用 代理 ARP
的方式, 您需要从SLIP服务器的以太子网中为每个SLIP客户分配IP地址,
还必须修改/etc/sliphome/slip.login 和
/etc/sliphome/slip.logout脚本以使用
&man.arp.8;来管理proxy-ARP在服务器ARP表中的项。
slip.login Configuration
典型的/etc/sliphome/slip.login
如下所示:
#!/bin/sh -
#
# @(#)slip.login 5.1 (Berkeley) 7/1/90
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
这个slip.login脚本仅仅为带有相应本地及远程地址和掩码的SLIP接口执行
ifconfig。
如果您决定使用ARP代理
方式(而非为您的SLIP客户使用独立的子网), 您的/etc/sliphome/slip.login
应该是这样:
#!/bin/sh -
#
# @(#)slip.login 5.1 (Berkeley) 7/1/90
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
# Answer ARP requests for the SLIP client with our Ethernet addr
/usr/sbin/arp -s $5 00:11:22:33:44:55 pub
slip.login新加的行arp -s
$5 00:11:22:33:44:55 pub 在 SLIP 服务器的 ARP
表中加入了一个表项。 这个ARP项使得每当这个以太网上的其它
IP 节点对 SLIP 客户端 IP 地址进行 ARP 请求时,
SLIP 服务器会以自已的以太网MAC地址作为回应。
- Ethernet (以太网)MAC address (MAC 地址)
+
+ Ethernet (以太网)
+ MAC address (MAC 地址)
+
+
当使用以上的例子时, 一定要将
- 以太网MAC地址(00:11:22:33:44:55)替换成您系统网卡的MAC地址, 否则ARP代理
将
- 完全无法工作!您可以查看netstat -i输出结果以取得以太网MAC地址;
- 输出的第二行应该是这样:
+ 以太网MAC地址 (00:11:22:33:44:55)
+ 替换成您系统网卡的MAC地址, 否则ARP代理
+ 将完全无法工作! 您可以查看 netstat -i
+ 输出结果以取得以太网 MAC 地址; 输出的第二行应该是这样:
ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116
这行表明这个系统的以太网MAC地址是00:02:c1:28:5f:4a
—netstat -i输出的以太网MAC地址必须改成用冒号隔开, 并且要单个十六进数前加上。
这是&man.arp.8;要求的格式; 参考&man.arp.8; 的联机手册以获取完整的使用方法。
在编写
/etc/sliphome/slip.login 和
/etc/sliphome/slip.logout 时, 一定要设置
可执行
(execute) 位 (换言之, chmod 755
/etc/sliphome/slip.login /etc/sliphome/slip.logout),
否则 sliplogin将无法执行它。
slip.logout配置
/etc/sliphome/slip.logout并不是必需的
(除非您使用了ARP代理
), 如果您准备创建它, 这里有一个基本的
slip.logout 脚本的例子:
#!/bin/sh -
#
# slip.logout
#
# logout file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down
如果使用了 代理 ARP
,
则可能希望 /etc/sliphome/slip.logout
在用户注销时自动为 SLIP 客户端删除
ARP 项:
#!/bin/sh -
#
# @(#)slip.logout
#
# logout file for a slip line. sliplogin invokes this with
# the parameters:
# 1 2 3 4 5 6 7-n
# slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down
# Quit answering ARP requests for the SLIP client
/usr/sbin/arp -d $5
arp -d $5 将删除由 代理 ARP
slip.login 在 SLIP 客户程序登录时所生成的
ARP 项。
再次强调: 建立
/etc/sliphome/slip.logout 之后,
一定要设置可执行位 (也就是说, chmod 755
/etc/sliphome/slip.logout)。
路由考虑
SLIP
routing
如果没有使用 代理 ARP
的方法来在您的
SLIP 客户机和网络的其余部分 (也可能是 Internet)
之间路由数据包, 您可能需要增加离您最近的默认路由器的静态路由,
以便通过 SLIP 服务器来在 SLIP 客户机子网上进行路由。
静态路由
static routes
向您最近的默认路由添加一个静态路由可以说是很麻烦
(或者说是不可能, 如果您没有权限这么做)。 如果在您的组织中使用多路由器网络,
有些路由器 (比如 Cisco 和 Proteon 生产的) 不但要配置指向 SLIP
子网的路由, 而且还需要配置将哪些静态路由传给其它的路由器。
所以一些专家意见和问题解答对于使基于静态路由表的路由正常工作很有必要。
运行&gated;
&gated;
&gated;现在是一个私有软件,
因而您无法得到其源代码 (在
&gated; 上提供了进一步的详情)。
这一节内容主要是为了确保与仍在使用旧版软件的用户兼容而保留。
另一种避免静态路由所造成的头疼的方法, 是在您的 FreeBSD
SLIP 服务器上安装 &gated;,
并配置它使用合适的路由协议
(RIP/OSPF/BGP/EGP) 来告诉其他路由器您的 SLIP
子网的存在。 您需要编写一个 /etc/gated.conf
文件来配置 &gated;;
这里是 FreeBSD SLIP 服务器作者编写的一个例子:
#
# gated configuration file for dc.dsu.edu; for gated version 3.5alpha5
# Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface
#
#
# tracing options
#
traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ;
rip yes {
interface sl noripout noripin ;
interface ed ripin ripout version 1 ;
traceoptions route ;
} ;
#
# Turn on a bunch of tracing info for the interface to the kernel:
kernel {
traceoptions remnants request routes info interface ;
} ;
#
# Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP
#
export proto rip interface ed {
proto direct {
xxx.xxx.yy mask 255.255.252.0 metric 1; # SLIP connections
} ;
} ;
#
# Accept routes from RIP via ed Ethernet interfaces
import proto rip interface ed {
all ;
} ;
RIP
上面这个 gated.conf 示例文件,
将把关于 SLIP 子网
xxx.xxx.yy 的信息, 通过 RIP 广播到
Ethernet 上; 如果您使用了的 Ethernet 驱动不是
ed, 则需要把 ed
改为相应的网络接口。 这个例子也配置了将跟踪信息写到
/var/tmp/gated.output
以提供调试 &gated; 活动的信息;
当然, 如果
&gated; 工作正常,
就可以关闭这些跟踪信息了。 您需要把 xxx.xxx.yy
改成您自己的 SLIP 子网 (一定要同时修改 proto direct
小节)。
一旦在系统中安装并配置了
&gated;,
就可以告诉 FreeBSD 启动脚本来运行
&gated; 而不是
routed 了。
最简单的办法,是配置 router 和
router_flags 两个
/etc/rc.conf 变量。
请参见 &gated; 的联机手册,
以了解更多关于命令行参数的信息。
diff --git a/zh_CN.GB2312/books/handbook/printing/chapter.sgml b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
index 7cf277ab70..8c9f71f0c0 100644
--- a/zh_CN.GB2312/books/handbook/printing/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
@@ -1,4648 +1,4646 @@
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
组拥有读写和搜索的权限,但其他用户没有。
接下来用我们的两台打印机作为例子:
&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,
它们都应该可以成功打印。
转换过滤器
在完成了 打印机简单设置 这节中所描述的内容之后, 头一件事
恐怕就是为你喜爱的格式的文件安装转换过滤器了 (除了纯 ASCII 文本)。
为什么安装转换过滤器?
&tex;
printing DVI files
转换过滤器使打印众多格式的文件变得很容易。
比如, 假设我们大量使用 &tex;
排版系统, 并且有一台 &postscript; 打印机。
每次从 &tex; 生成一个 DVI 文件,
我们都不能直接打印它直到我们将 DVI 文件转换成 &postscript;。
转换的命令应该是下面的样子:
&prompt.user; dvips seaweed-analysis.dvi
&prompt.user; lpr seaweed-analysis.ps
通过安装 DVI 文件的转换过滤器, 我们可以跳过每次手动转换这一步, 而让
LPD 来完成这个步骤。
现在, 每次要打印 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
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
这里有很多种方法可以阻止这种行为 (包括忽略它),
并且是免费的。
限制对打印机的访问
您可以控制谁可以打印到哪台打印机通过 &unix;
的组机制和文件 /etc/printcap 中的
rg 变量。
只要把可以访问打印机的用户放进适当的组中, 然后在
rg 变量中写上组的名字。
- 非这组的用户 (包括 root)
- 将会得到这样的提示:
-
- lpr: Not a member of the restricted group
-
- 如果他们试图打印到被限制的打印机。
+ 如果这组以外的用户 (包括 root)
+ 试图打印到被限制的打印机,将会得到这样的提示:
+
+ lpr: Not a member of the restricted group
像使用 sc (禁止多份副本)
变量一样, 您需要指定 rg
在远程同样对打印机有访问限制的主机上,
如果您感觉合适的话 (参考 安装在远程主机上的打印机 这一节)。
比如, 我们将让任何人都可以访问打印机
rattan, 但只有在
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 增加限制。
由于那些 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。
您将会得到一个美元计费的摘要像下面这样:
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 美分。
您可以通过这个选项来达到目标利润。
最终, 运行 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; 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
到打印 bamboo:
&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 到默认打印机:
&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 作为默认值。
diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml
index e592aa73de..46838d7fb8 100644
--- a/zh_CN.GB2312/books/handbook/security/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml
@@ -1,4423 +1,4425 @@
Matthew
Dillon
这一章的许多内容来自 security(7) 联机手册,其作者是
安全
security
概述
这一章将对系统安全的基本概念进行介绍, 除此之外, 还将介绍一些好的习惯, 以及
&os; 下的一些更深入的话题。 这章的许多内容对于一般的系统和 Internet
安全也适用。 如今, Internet
已经不再像以前那样是一个人人都愿意与您作好邻居的 友善
的地方。 让系统更加安全, 将保护您的数据、 智力财产、 时间,
以及其他很多东西不至于被入侵者或心存恶意的人所窃取。
&os; 提供了一系列工具和机制来保证您的系统和网络的完整及安全。
读完这章,您将了解:
基本的 &os; 系统安全概念。
&os; 中众多可用的密码学设施,例如
DES 和 MD5。
如何设置一次性口令验证机制。
如何配置 TCP Wrappers 以便与
inetd 配合使用。
如何在 &os; 5.0 以前的版本上设置
KerberosIV。
如何在 &os; 上设置
Kerberos5。
如何配置 IPsec 并在 &os;/&windows;
机器之间建构 VPN。
如何配置并使用 OpenSSH,以及 &os; 的 SSH
执行方式。
系统 ACL 的概念,以及如何使用它们。
如何使用 Portaudit
工具来审核从 Ports Collection 安装的第三方软件包的安全性。
如何从 &os; 的安全公告中获得有用信息并采取相应措施。
对于进程记帐功能的感性认识,
并了解如何在 &os; 中启用它。
在开始阅读这章之前,您需要:
理解基本的 &os; 和 Internet 概念。
其他安全方面的话题, 则贯穿本书的始终。
例如, 强制性访问控制 (MAC) 在 中进行了介绍, 而 Internet 防火墙则在 中进行了讨论。
介绍
安全是系统管理员自始至终的基本要求。 由于所有的 BSD &unix;
多用户系统都提供了与生俱来的安全性, 因此建立和维护额外的安全机制,
确保用户的 诚实
可能也就是最需要系统管理员考虑的艰巨的工作了。
机器的安全性取决于您设置的安全设施, 而许多安全方面的考虑,
则会与人们使用计算机时的便利性相矛盾。 一般来说, &unix;
系统能够胜任数目众多进程并发地处理各类任务,
这其中的许多进程是以服务身份运行的 — 这意味着,
外部实体能够与它们互联并产生会话交互。 如今的桌面系统,
已经能够达到许多昔日的小型机甚至主机的性能,
而随着这些计算机的联网和在更大范围内完成互联,
安全也成为了一个日益严峻的课题。
系统的安全也应能够应付各种形式的攻击, 这也包括那些使系统崩溃,
或阻止其正常运转, 但并不试图窃取
root 帐号 (破译 root
)
的攻击形式。 安全问题大体可分为以下几类:
拒绝服务攻击。
窃取其他用户的帐户。
通过可访问服务窃取root帐户。
通过用户帐户窃取root帐户。
建立后门。
DoS 攻击
拒绝服务攻击 (DoS)
安全
DoS 攻击
拒绝服务攻击 (DoS)
拒绝服务攻击 (DoS)
拒绝式服务攻击是侵占机器所需资源的一种行为。
通常, DoS 攻击采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈,
以使机器崩溃或无法使用。 某些 DoS 攻击则利用在网络栈中的错误,
仅用一个简单的信息包就可以让机器崩溃, 这类情况通常只能通过给内核打补丁来修复。
在一些不利的条件下, 对服务器的攻击能够被修复,
只要适当地修改一下系统的选项来限制系统对服务器的负荷。
顽强的网络攻击是很难对付的。 例如,一个欺骗性信息包的攻击,
无法阻止入侵者切断您的系统与Internet的连接。
它不会使您的机器死掉,但它会把Internet连接占满。
security
窃取用户帐户
窃取用户帐户要比D.o.S.攻击更加普遍。
许多系统管理员仍然在他们的服务器上运行着基本的
telnetd,rlogind,
rshd 和 ftpd
服务。 这些服务在默认情况下不会以加密连接来操作。
结果是如果您的系统有中等规模大小的用户群,
在通过远程登录的方式登录到您系统的用户中, 一些人的口令会被人窃取。
仔细的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。
通常必须假定,如果一个入侵者已经访问到了一个用户的帐户,
那么它就可能使自己成为 root。 然而,
事实是在一个安全和维护做得很好的系统中,
访问用户的帐户不一定会让入侵者成为 root。
这个差别是很重要的,因为没有成为
root 则入侵者通常是无法隐藏它的轨迹的, 而且,
如果走运的话, 除了让用户的文件乱掉和系统崩溃之外,
它不能做什么别的事情。 窃取用户帐户是很普遍的事情,
因为用户往往不会对系统管理员的警告采取措施。
security
后门
系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的
root 用户受到威胁。入侵者可能知道
root 的口令,而如果在以
root 权限运行的服务器上找到一个缺陷 (bug),
就可以通过网络连接到那台服务器上达到目的;另外,
一旦入侵者已经侵入了一个用户的帐户,
可以在自己的机器上运行一个 suid-root 程序来发现服务器的漏洞,
从而让他侵入到服务器并获取 root。
攻击者找到了入侵一台机器上 root 的途径之后,
他们就不再需要安装后门了。许多 root
漏洞被发现并修正之后, 入侵者会想尽办法去删除日志来消除自己的访问痕迹,
所以他们会安装后门。
后门能给入侵者提供一个简单的方法来重新获取访问系统的 root
权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。
让入侵者无法安装后门事实上对您的系统安全是有害的,
因为这样并不会修复那些侵入系统的入侵者所发现的新漏洞。
安全的管理方法应当使用像 洋葱皮
一样多层次的方法来实现,
这些措施可以按下面的方式进行分类:
确保 root 和维护人员帐户的安全。
确保 root – 以root用户权限运行的服务器和suid/sgid可执行程序的安全。
确保用户帐户的安全。
确保口令文件的安全。
确保内核中核心组件、直接访问设备和文件系统的安全。
快速检测系统中发生的不适当的变化。
做个偏执狂。
这一章的下一节将比较深入地讲述上面提到的每一个条目。
确保 &os; 的安全
security
确保 &os; 的安全
命令与协议
在这份文档中,我们使用
粗体 来表示应用程序,
并使用 单倍距 字体来表示命令。
这样的排版区分能够有效地区分类似 ssh 这样的概念,
因为它既可以表示命令,又可以表示协议。
接下来的几节中, 将介绍在这一章中 前一节 中所介绍的那些加强
&os; 系统安全性的手段。
确保 root 和维护人员帐户的安全
su
首先,如果您没有确保 root 帐户的安全,
就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给
root 帐户。 我们的第一个假定是,口令
总是 不安全的。 这并不意味着您要把口令删掉。
口令通常对访问机器的控制台来说是必须的。 也就是说,
您应该避免允许在控制台以外的地方使用口令,
甚至包括使用 &man.su.1; 命令的情形。
例如,确信您的 pty 终端在 /etc/ttys
文件中被指定为 insecure (不安全),这将使直接通过
telnet 或 rlogin 登录
root 会不被接受。 如果使用如
sshd 这样的其他登录服务,
也要确认直接登录 root 是关闭的。您可以通过编辑
/etc/ssh/sshd_config 文件来做到这一点,确信
PermitRootLogin 被设置成 NO。
考虑到每一种访问方法 — 如FTP这样的服务,
以免因为它们而导致安全性的损失。
直接登录 root 只有通过系统控制台才被允许。
wheel
当然, 作为一个系统管理员, 您应当获得
root身份, 因此, 我们开了一些后门来允许自己进入。
但这些后门只有在经过了额外的口令确认之后才能使用。
一种让 root
可访问的方法是增加适当的用户帐户到
wheel 组 (在
/etc/group 中)。wheel
组中的用户成员可以使用 su
命令来成为 root。
绝对不应该通过在口令项中进行设置来赋予维护人员天然的
wheel 组成员身份。 维护人员应被放置在
staff 组中,然后通过
/etc/group 文件加入到 wheel
组。事实上,只有那些需要以 root 身份进行操作的用户才需要放进
wheel 组中。 当然,也可以通过
某种其它的验证手段,例如 Kerberos,可以通过 root
帐户中的 .k5login 文件来允许执行
&man.ksu.1; 成为 root ,而不必把它们放进
wheel 组。 这可能是一种更好的解决方案,
因为 wheel 机制仍然可能导致入侵者获得
root ,如果他拿到了口令文件,并能够进入职员的帐户。
尽管有 wheel 比什么都没有要强一些,
但它并不是一种绝对安全的办法。
可以使用 &man.pw.8; 命令来完全禁止某一个帐号:
&prompt.root;pw lock staff
这将阻止用户使用任何方法登录,包括 &man.ssh.1;。
另一个阻止某个帐户访问的方法是使用一个
*
字符替换掉加密后的口令。
这将不会与任何加密后的口令匹配,从而阻止了用户的访问。
举例说明:
foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
应被改为:
foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
这会阻止用户 foobar 使用传统的方式登录。
但是对于使用了 Kerberos
或者配置了 &man.ssh.1; 公钥/密钥对的情况下,用户依然可以访问。
这些安全机制同样假定,
从严格受限的机器向限制更宽松的机器上登录。 例如,
如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。
为了让工作站尽可能地安全,应该避免运行任何没有必要的服务,
甚至不运行任何服务。 另外, 也应该考虑使用带口令保护功能的屏幕保护程序。
毋庸置疑, 如果攻击者能够物理地接触您的工作站,
那么他就有能力破坏任何安全设施,这确实是我们需要考虑的一个问题,但同样地,
真正能够物理接触您的工作站或服务器并实施攻击的人在现实生活中并不常见,
绝大多数攻击来自于网络, 而攻击者往往无法物理地接触服务器或工作站。
KerberosIV
使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户,
或修改他们的口令, 并在所有机器上立即生效的方法。 如果员工的帐号被窃取,
能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上,
一次修改 N 台机器上的口令很可能是一件痛苦的事情。
此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外,
它还能够强制用户在某个特定的期限内修改口令(比如说,每月一次).
确保以root用户权限运行的服务器和suid/sgid可执行程序的安全
ntalk
comsat
finger
sandboxes
sshd
telnetd
rshd
rlogind
谨慎的管理员只运行他们需要的服务, 不多, 不少。
要当心第三方的服务程序很可能有更多的问题。 例如, 运行旧版的
imapd 或
popper 无异于将
root 令牌拱手送给全世界的攻击者。
永远不要运行那些您没有仔细检查过的服务程序, 另外也要知道,
许多服务程序并不需要以 root 的身份运行。
例如, ntalk、
comsat, 以及
finger 这些服务,
都能够以一种被称作 沙盒 的特殊用户的身份运行。
除非您已经解决掉了许多麻烦的问题, 否则沙盒就不是完美的,
但洋葱式安全规则仍然成立: 如果有人设法攻破了在沙盒中运行的程序,
那么在做更多坏事之前, 他们还必须想办法攻破沙盒本身的限制。
攻击者需要攻破的层次越多, 他们成功的可能性就越小。
过去, 破解 root 的漏洞几乎在所有以 root
身份运行的服务上都发现过, 包括那些基本的系统服务。
如果您的机器只打算向外界提供
sshd 登录, 而用户不会使用
telnetd 或
rshd 甚至
rlogind 登录,
就应该毫不犹豫地关闭它们!
&os; 现在默认在沙盒中运行
ntalkd,
comsat, 以及
finger。此外, &man.named.8; 也可以这样运行。
/etc/defaults/rc.conf 中包括了如何如此运行
named 的方法,只是这些内容被注释掉了。
如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。
谨慎的系统管理员将根据需要研究并实现沙盒。
sendmail
此外,还有一些服务通常并不在沙盒中运行:
sendmail,
popper,
imapd, ftpd,
以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要做更多额外的工作。
可能必须以 root 身份运行这些程序,
并通过其他机制来检测入侵。
系统中另一个比较大的 root 漏洞
是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序,
例如 rlogin, 被存放于
/bin, /sbin,
/usr/bin, 或 /usr/sbin 中。
尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件通常是相对安全的。
当然,偶尔也会发现一些存在于这些可执行文件中的
root 漏洞。1998年,Xlib
中发现了一处 root 漏洞,这使得
xterm (通常是做了suid的) 变得可以入侵。
做得安全些, 总比出现问题再后悔要强。
因此,谨慎的管理员通常会限制 suid 可执行文件,
并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉
(chmod 000) 任何 suid 可执行文件,
以至于没有人能够执行它们。没有显示设备的服务器通常不会需要
xterm 可执行文件。 sgid 可执行文件通常同样地危险。
一旦入侵者攻克了sgid-kmem,那么他就能够读取
/dev/kmem 并进而读取经过加密的口令文件,
从而窃取任何包含口令的帐号。另外,攻破了 kmem
的入侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方式。
攻破了 tty 组的用户则能够向几乎所有用户的
tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟功能的终端仿真程序,
那么,入侵者能够以那个用户的身份执行任何命令。
确保用户帐户的安全
用户帐号的安全通常是最难保证的。虽然您可以为您的员工设置严苛的登录限制,
并用 星号
替换掉他们的口令, 但您可能无法对普通的用户这么做。
如果有足够的决策权, 那么在保证用户帐号安全的斗争中或许会处于优势,
但如果不是这样, 您能做的只是警惕地监控这些帐号的异动。
让用户使用 ssh 或 Kerberos 可能会有更多的问题,
因为需要更多的管理和技术支持, 尽管如此, 与使用加密的口令文件相比,
这仍不失为一个好办法。
确保口令文件的安全
能够确保起作用的唯一一种方法, 是将口令文件中尽可能多的口令用星号代替,
并通过 ssh 或 Kerberos 来使用这些账号。 即使只有
root 用户能够读取加密过的口令文件 (/etc/spwd.db),
入侵者仍然可能设法读到它的内容,
即使他暂时还无法写入这个文件。
您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 检查文件完整性 一节)。
确保内核中内核设备、直接访问设备和文件系统的安全
如果攻击者已经拿到了 root 那么他就有能力作任何事情,
当然, 有一些事情是他们比较喜欢干的。
例如, 绝大多数现代的内核都包括一个内建的听包设备。
在 &os; 中,这个设备被称作
bpf 。攻击者通常会尝试在攻克的系统上运行它。
如果您不需要 bpf 设备提供的功能,那么,就不要把它编入内核。
sysctl
但即使已经关掉了 bpf
设备,您仍然需要担心
/dev/mem 和 /dev/kmem 。
就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地,
还有一个被称作模块加载器, &man.kldload.8; 的机制,也会包含潜在的危险。
尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的
bpf 设备,或其他听包设备。为了防止这些问题,
需要抬高内核安全级, 至少调整到 1。 可以通过对 kern.securelevel
执行 sysctl 来完成这个任务。 一旦把安全级调整到1,
对于直接访问设备的写入操作将被拒绝, 而特殊的 chflags
标记, 如 schg, 也将强制执行。 一定要在重要的启动执行文件、
目录和脚本文件上设置 schg 标记 —
不要漏过在安全级生效之前将被运行的任何文件。 这可能做得有些过火,
并将导致在较高安全级上运行时升级系统变得困难。 您也可以略微做些妥协,
即以较高的安全级运行, 但并不将系统文件和目录配置为 schg。
另一种可行的方法是把
/ 和 /usr 以只读方式挂接。
请注意, 如果保护措施做的过分的严苛, 则可能导致入侵检测无法进行,
而这种检测是安全中十分重要的一环。
检查文件完整性: 可执行文件,配置文件和其他文件
当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用
chflags 来把 schg 标记
应用到 / 和
/usr 中的绝大多数文件上可能会起到反作用,
因为尽管它能够保护那些文件, 但同时也使入侵检测无法进行。
层次化安全的最后一层可能也是最重要的 — 检测。
如果无法检测出潜在的入侵行为,
那么安全的其他部分可能相对来讲意义可能就不那么大了 (或者,更糟糕的事情是,
那些措施会给您安全的假象)。
层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵,
这样才可能当场抓住入侵者。
检测入侵的一种好办法是查找那些被修改、 删除或添加的文件。
检测文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行比对。
在一台严格限制访问的系统上撰写您的安全脚本通常不能够被入侵者察觉,
因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只读的 NFS,
或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外,
NFS可能是一种很难被察觉的方法 — 它允许您监控每一台客户机上的文件系统,
而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交换机连接的,
那么 NFS 将是一种非常好的方式。 不过,如果那台监控服务器和客户机之间通过集线器
(Hub),或经过许多层的路由来连接,则这种方式就很不安全了,
此时,应考虑使用 ssh ,即使这可以在审计记录中查到。
一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限,
就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 &man.find.1;
和 &man.md5.1; 这样的命令为基础来完成我们所需的工作。
最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些
/etc 和 /usr/local/etc
中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。
好的安全脚本也应该检查在系统分区,如 / 和
/usr 中是否有新增或删除的可执行文件,以及不适宜的 suid 。
如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。
本质上,需要在脚本中使用 scp 在客户端复制文件,
另一方面,用于检查的执行文件 (例如 find) 也需要使用
scp 传到客户端,因为
ssh 客户程序很可能已经被攻陷。
总之,在一条不够安全的链路上 ssh 可能是必须的,
但也必须应付它所带来的难题。
安全脚本还应该检查用户以及职员成员的权限设置文件:
.rhosts、 .shosts、
.ssh/authorized_keys 等等。
这些文件可能并非通过
MD5 来进行检查。
如果您的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。
这种情况下, 采用标志来禁止使用 suid 可执行文件将是一个好主意。
您可能会想看看 nosuid 选项 (参见 &man.mount.8;)。
尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击,
而是检查攻击企图。
进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的,
可以帮助您在被入侵后评估损失的机制。
对于找出入侵者是如何进入系统的这件事情来说,
它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。
最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成
— 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹,
而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。
保持日志文件的永久性记录的一种方法是在串口上运行系统控制台,
并在一台安全的机器上收集这些信息。
偏执
带点偏执不会带来伤害。作为一种惯例,
系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外,
在经过深思熟虑之后,也可以增加一些
确实会 让使用变得不那么方便的安全特性。
更重要的是,有安全意识的管理员应该学会混合不同的安全策略 —
如果您逐字逐句地按照这份文档来配置您的机器,
那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。
拒绝服务攻击
拒绝服务 (DoS)
这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击,
尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源,
但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器:
限制服务进程 fork。
限制 springboard 攻击 (ICMP 响应攻击, ping
广播,等等)。
使内核路由缓存过载。
一种比较常见的 DoS 攻击情形, 是通过攻击复制进程 (fork)
的服务, 使其产生大量子进程, 从而是其运行的机器耗尽内存、 文件描述符等资源,
直到服务器彻底死掉。 inetd
(参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。
需要注意的是, 尽管能够阻止一台机器彻底垮掉,
但通常无法防止服务本身被击垮。
请仔细阅读 inetd 的联机手册,
特别是它的 、 以及
这三个选项。 伪造 IP 攻击能够绕过
inetd 的 选项,
因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。
例如, Sendmail 就提供了自己的
选项, 它通常比 Sendmail 的负载限制选项更为有效,
因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个
MaxDaemonChildren 参数; 把它设的足够高以便承载您所需要的负荷,
当然, 不要高到足以让运行 Sendmail 的机器死掉。
此外, 以队列模式
() 运行 Sendmail 并把服务程序
(sendmail -bd) 和队列执行程序分别执行
(sendmail -q15m) 也是一个好主意。
如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如
, 但同时也需要指定一个合理的子进程数, 也就是通过
MaxDaemonChildren 选项以免
那个 Sendmail 造成重叠的故障。
Syslogd 可以被直接地攻击,因此,
强烈建议只要可行,就在启动它的时候加上 参数,
其他情况下,则至少应该加上 。
对于基于连接的服务,例如
TCP Wrapper 的 reverse-identd, 都应该格外的小心,
因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 TCP Wrapper
所提供的 reverse-ident 这样的功能。
此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要,
这些工作可以通过设置边界路由器来完成。
主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免
root 受到攻击。
尽可能配置排他式的防火墙, 例如,
用防火墙阻止所有的网络流量 除了 端口 A、B、
C、D,以及 M-Z
。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外,
而又不难配置使防火墙放过那些明确需要开放的服务, 例如
named (如果您的机器准备作为域的主要解析服务器),
ntalkd,
sendmail,以及其他可以从 Internet 访问的服务。
如果您尝试以其他方式配置防火墙
— 采用比较宽松的策略, 那么您将很有可能忘记
关掉
一两个服务,
或者在增加了一些服务之后忘记更新防火墙策略。
尽管如此, 仍然可以考虑允许让数据进入编号较高的那一部分端口,
这将保证那些需要这样特性的服务能够正常工作,
而又不影响低端口服务的安全性。
此外, 还应注意到 &os; 允许您来控制动态绑定的端口的范围,
即一系列 net.inet.ip.portrange 变量,通过
sysctl 来完成设置。 (sysctl -a | fgrep
portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。
例如, 您可能希望普通的高段端口的起止范围是
4000 到 5000, 而更高范围则是 49152 到
65535, 随后在防火墙中阻止低于 4000 的所有端口
(当然, 除了那些特地为 Internet 访问而开设的端口)。
另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击
— 它通过使服务器产生其无法处理的响应来达到目的。
最常见的攻击就是 ICMP ping 广播攻击。
攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。
如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的
ping 包之中, 特别是当攻击者同时使用了多个不同的网络时。
广播攻击能够产生超过 120 兆位的瞬时流量。
另一种常见的针对 ICMP 错误报告系统的 springboard 攻击,
通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源,
并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽内存来使得使得被攻击的服务器崩溃,
特别是当这些服务器无法足够快地完成
ICMP 响应的时候。 较新的内核可以通过调整 sysctl
变量 net.inet.icmp.icmplim 来限制这种攻击。
最后一类主要的 springboard 是针对某些
inetd 的内部服务, 例如
udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的
echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。
于是, 两台服务器将不停地将包弹给对方。
攻击者能够将两台服务器的这种服务都耗竭,
并且通过这种方式, 只需要很少的包就可以让 LAN 超载。
类似的问题对
chargen 口也是存在的。
好的系统管理员应该关闭这些 inetd 的测试服务。
伪造的包攻击也可以用来使内核的路由缓存过载。
请参考 net.inet.ip.rtexpire,
rtminexpire, 以及 rtmaxcache
sysctl 参数。 伪造的包可以用随机的源 IP 攻击,
使得内核在路由表中产生一个临时的缓存项, 它可以通过
netstat -rna | fgrep W3 看到。 这些路由通常需要
1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低
rtexpire 但以
rtminexpire 为限。 这引发了两个问题:
在访问量不大的服务器上, 内核对于突然袭击的反应不够快。
rtminexpire 的值没有低到让内核在此类攻击时活下去的程度。
如果您的服务器通过 T3 或更快的线路接入 Internet,
那么通过 &man.sysctl.8; 来手动地降低
rtexpire 和 rtminexpire
就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃)
将这两个参数设置为 2 通常已经足以抵御这类攻击了。
Kerberos 和 SSH 的访问问题
ssh
KerberosIV
如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。
Kerberos 5 是一个很棒的验证协议, 但使用了它的
telnet 和
rlogin 应用程序有一些 bug,
使得它们不适合处理二进制流。
而且, 除非使用了 选项, 否则默认情况下
Kerberos 并不加密会话。
ssh
在默认时加密所有的会话内容。
除了默认转发加密密钥之外, ssh 在所有的其他方面都做得很好。
这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护,
而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。
尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口,
如果攻击者拿到那台不安全的机器上的
root 那么他将能够利用那个端口来使用您的密钥,
从而访问您能够访问的那些机器。
我们建议您在使用 ssh 时配合
Kerberos 来完成工作人员的登录过程。
Ssh 在编译时可以加入 Kerberos 支持。
在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。
Ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用
(这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在
ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加
from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。
Bill
Swingle
部分重写、更新来自
DES、 Blowfish、 MD5, 以及 Crypt
安全
密码
crypt
Blowfish
DES
MD5
&unix; 系统上的每个用户都有一个与其帐户关联的口令。
很显然, 密码只需要被这个用户和操作系统知道。
为了保证口令的私密性, 采用了一种称为 单向散列
的方法来处理口令, 简单地说, 很容易从口令推算出散列值,
反之却很难。 其实, 刚才那句话可能并不十分确切:
因为操作系统本身并不 真的 知道您的口令。
它只知道口令 经过加密的形式。 获取口令对应
明文
的唯一办法是采用暴力在口令可能的区间内穷举。
不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES,
数据加密标准 ( the Data Encryption Standard )。
于是这给那些非美国居民带来了问题,
因为 DES 的源代码在当时不能被出口到美国以外的地方,
&os; 必须找到符合美国法律,但又要与其他那些使用 DES
的 &unix; 版本兼容的办法。
解决方案是把加密函数库分割为两个,
于是美国的用户可以安装并使用 DES 函数库,
而国际用户则使用另外一套库提供的一种可以出口的加密算法。
这就是 &os; 为什么使用 MD5 作为它的默认加密算法的原因。
MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。
识别您采用的加密算法
现在这个库支持 DES、 MD5 和 Blowfish 散列函数。默认情况下, &os;
使用 MD5 来加密口令。
可以很容易地识别 &os; 使用哪种加密方法。
检查 /etc/master.passwd 文件中的加密密码是一种方法。
用 MD5 散列加密的密码通常要比用
DES 散列得到的长一些, 并且以
$1$ 字符开始。 以
$2a$ 开始的口令是通过
Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征,
但他们要比 MD5 短, 并且以不包括 $ 在内的
64 个可显示字符来表示,
因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。
新口令所使用的密码格式是由 /etc/login.conf
中的 passwd_format 来控制的, 可供选择的算法包括
des, md5 和
blf。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。
一次性口令
一次性口令
安全
一次性口令
默认情况下, &os; 提供了
OPIE (One-time Passwords In Everything) 支持,
它默认使用 MD5 散列。
下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos
口令; 我们在后面的章节中将称其为 &unix; 口令
。
第二种是使用 OPIE 的 &man.opiekey.1; 程序生成,
并为 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为
一次性口令
。 最后一类口令是您输入给
opiekey 程序 (有些时候是
opiepasswd 程序)
用以产生一次性口令的秘密口令,我们称其为 秘密口令
或通俗地简称为 口令
。
秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的,
但不推荐这么做。 OPIE 秘密口令并不像旧式的
&unix; 口令那样只能限于8位以内在 &os; 中标准的登录口令最长不能超过
128 个字符。。
您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。
在绝大多数时候, OPIE 系统和 &unix; 口令系统完全相互独立地工作。
除了口令之外, 对于 OPIE 还有两组至关重要的数据。
其一被称作 种子
或 key
, 它包括两个字符和五个数字。
另一个被称作 迭代轮数
, 这是一个 1 到 100 之间的数字。
OPIE 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5
散列运算来得到结果, 并将结果表示为 6 个短的英文单词。
这 6 个英文单词就是您的一次性口令。
验证系统 (主要是 PAM) 会记录上次使用的一次性口令,
如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。
由于使用了单向的散列函数, 因此即使截获了上次使用的口令,
也没有办法恢复出下次将要使用的口令;
每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。
每当迭代轮数减少到 1 时, 都必须重新初始化 OPIE。
接下来将讨论和每个系统有关的三个程序。
opiekey 程序能够接收带迭代计数, 种子和秘密口令,
并生成一个一次性口令, 或一张包含连续的一组一次性口令的表格。
opiepasswd
程序用于初始化 OPIE, 并修改口令、
迭代次数、种子和一次性口令。
和 opieinfo 程序可以用于检查相应的验证数据文件
(/etc/opiekeys) 并显示执行命令的用户当前的迭代轮数和种子。
我们将介绍四种不同的操作。 在安全的连接上通过
opiepasswd 来第一次设置一次性口令,
或修改口令及种子。 第二类操作是在不安全的连接上使用
opiepasswd 辅以在安全连接上执行的
opiekey 来完成同样的工作。
第三类操作是在不安全的连接上使用 opiekey 来登录。
最后一类操作是采用 opiekey 来生成大批的密码,
以便抄下来或打印出来,在没有安全连接的地方使用。
安全连接的初始化
第一次初始化 OPIE 时, 可以使用 opiepasswd 命令:
&prompt.user; opiepasswd -c
[grimreaper] ~ $ opiepasswd -f -c
Adding unfurl:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:
ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED
在 Enter new secret pass phrase: 或
Enter secret password: 提示之后,
应输入一个密码或口令字。 请留意, 这并不是您用于登录的口令,
它用于生成一次性的登录密钥。
ID
这一行给出了所需的参数:
您的登录名,
迭代轮数, 以及种子。 登录系统时,
它能够记住这些参数并呈现给您, 因此无需记忆它们。
最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令;
如果您立即重新登录, 则它将是您需要使用的那个口令。
不安全连接初始化
如果您需要通过一个不安全的连接来初始化,
则应首先在安全连接上执行过一次 opiekey;
您可能希望在可信的机器的 shell 提示符下完成。
此外还需要指定一个迭代轮数 (100 也许是一个较好的选择)
也可以选择一个自己的种子, 或让计算机随机生成一个。
在不安全的连接上 (当然是连到您希望初始化的机器上),使用
opiepasswd 命令:
&prompt.user; opiepasswd
Updating unfurl:
You need the response from an OTP generator.
Old secret pass phrase:
otp-md5 498 to4268 ext
Response: GAME GAG WELT OUT DOWN CHAT
New secret pass phrase:
otp-md5 499 to4269
Response: LINE PAP MILK NELL BUOY TROY
ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY
为了接受默认的种子, 按下 Return (回车)。
在输入访问口令之前, 到一个有安全连接的机器上,
并给它同样的参数:
&prompt.user; opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT
现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。
生成一个一次性密码
一旦初始化过 OPIE, 当您登录时将看到类似这样的提示:
&prompt.user; telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.
FreeBSD/i386 (example.com) (ttypa)
login: <username>
otp-md5 498 gr4269 ext
Password:
另外, OPIE 提示有一个很有用的特性
(这里没有表现出来): 如果您在口令提示处按下 Return (回车)
系统将回显刚键入的口令, 您可以藉此看到自己所键入的内容。
如果试图手工键入一个一次性密码, 这会非常有用。
MS-DOS
Windows
MacOS
此时您需要生成一个一次性密码来回答这一提示。
这项工作必须在一个可信的系统上执行
opiekey 来完成。 (也可以找到 DOS、
&windows; 以及 &macos; 等操作系统上运行的版本)。
这个程序需要将迭代轮数和种子提供给它。
您可以从登录提示那里复制和粘贴它们。
在可信的系统上:
&prompt.user; opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT
现在就可以用刚刚获得的一次性口令登录了。
产生多个一次性口令
有时,会需要到不能访问可信的机器或安全连接的地方。
这种情形下, 可以使用
opiekey 命令来一次生成许多一次性口令。 例如:
&prompt.user; opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI
按顺序请求 5 个口令,
则指定了最后一个迭代轮数应该是多少。
注意这些口令将按与使用顺序相反的顺序来显示。
如果您比较偏执, 可以手工写下这些结果;
一般来说把它粘贴到 lpr 就可以了。
注意,每一行都显示迭代轮数及其对应的一次性的密码;
一些人建议用完一个就划掉一个。
限制使用 &unix; 口令
OPIE 可以对 &unix; 口令的使用进行基于 IP 的登录限制。
对应的文件是 /etc/opieaccess,
这个文件默认情况下就是存在的。
请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况,
以及安全方面需要进行的一些考虑。
下面是一个示范的 opieaccess 文件:
permit 192.168.0.0 255.255.0.0
这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造)
在任何时候使用 &unix; 口令登录。
如果 opieaccess 中没有匹配的规则,
则将默认拒绝任何非 OPIE 登录。
Tom
Rhodes
作者
TCP Wrappers
TCP Wrappers
每一个熟悉 &man.inetd.8; 都应该听说过
TCP Wrappers,
但几乎没有人对它在网络环境中的作用有全面的理解。
几乎每个人都会安装防火墙来处理网络连接,
然而虽然防火墙有非常广泛的用途, 它却不是万能的,
例如它无法处理类似向连接发起者发送一些文本这样的任务。
而 TCP 软件能够完成它以及更多的其他事情。
接下来的几段中将讨论许多
TCP Wrappers 提供的功能,
并且, 还给出了一些配置实例。
TCP Wrappers 软件扩展了
inetd 为受其控制的服务程序实施控制的能力。
通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、
使得服务程序只接受内部连接, 等等。
尽管防火墙也能够完成其中的某些功能,
但这不仅增加了一层额外的保护,
也提供了防火墙无法提供的功能。
然而, 由 TCP Wrappers
提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。
TCP Wrappers 应结合防火墙或其他安全加强设施一并使用,
为系统多提供一层安全防护。
由于这些配置是对于
inetd 的扩展, 因此,
读者应首先阅读 配置 inetd
这节。
尽管由 &man.inetd.8; 运行的程序并不是真正的
服务程序
, 但传统上也把它们称为服务程序。
下面仍将使用这一术语。
初始配置
在 &os; 中使用 TCP
Wrappers 的唯一要求是确保 inetd
在从 rc.conf 中启动时包含了
选项; 这是默认的设置。
当然, 还需要对
/etc/hosts.allow 进行适当的配置, 但
&man.syslogd.8; 在配置不当时会在系统日志中记录相关消息。
与其它的 TCP
Wrappers 实现不同, 使用 hosts.deny
在这里被认为是不推荐和过时的做法。
所有的配置选项应放到
/etc/hosts.allow 中。
在最简单的配置中, 服务程序的连接策略是根据
/etc/hosts.allow 允许或阻止。
&os; 中的默认配置是允许一切发到由 inetd
所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。
基本配置的形式通常是
服务 : 地址 : 动作。
这里 服务 是从
inetd 启动的服务程序的名字。 而
地址 可以是任何有效的主机名、 一个
IP 或由方括号 ([ ])
括起来的 IPv6 地址。 动作字段可以使 allow 或 deny,
分别用于允许和禁止相应的访问。
在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的,
这表示配置文件将按照顺序查找匹配规则, 而一旦找到匹配,
则搜索也就停止了。
另外也有许多其他选项, 这些将在后面介绍。
简单的配置行从上面这些描述之中可以很容易得出。
例如, 允许 POP3 连接通过
mail/qpopper 服务,
应把下面的行添加到
hosts.allow:
# This line is required for POP3 connections:
qpopper : ALL : allow
增加这样之后, 需要重新启动 inetd。
可以通过使用 &man.kill.1; 命令来完成这项工作,
或使用 /etc/rc.d/inetd
的 restart parameter 参数。
高级配置
TCP Wrappers 也有一些高级的配置选项;
它们能够用来对如何处理连接实施更多的控制。
一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。
其他情况下, 记录日志或者发送邮件给管理员可能更为适合。
另外, 一些服务可能只希望为本机提供。
这些需求都可以通过使用 通配符,
扩展字符以及外部命令来实现。
接下来的两节将介绍这些。
外部命令
假设由于发生了某种状况, 而导致连接应该被拒绝掉,
而将其原因发送给发起连接的人。 如何完成这样的任务呢?
这样的动作可以通过使用 选项来实现。
当发起了连接请求时,
将调用一个命令或脚本。 在
hosts.allow 文件中已经给出了一个例子:
# The rest of the daemons are protected.
ALL : ALL \
: severity auth.info \
: twist /bin/echo "You are not welcome to use %d from %h."
这个例子将把消息
You are not allowed to use daemon
from hostname.
返回给访问先前没有配置过允许访问的服务客户。
对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说,
这样的配置非常有用。
请注意所有反馈信息
必须 被引号
" 包围; 这一规则是没有例外的。
如果攻击者向服务程序发送大量的连接请求,
则可能发动一次成功的拒绝服务攻击。
另一种可能是针对这种情况使用 。
类似 ,
也暗含拒绝连接,
并可以用来执行外部命令或服务。
与 不同的是,
不会向连接发起者发送回应。
考虑下面的配置:
# We do not allow connections from example.com:
ALL : .example.com \
: spawn (/bin/echo %a from %h attempted to access %d >> \
/var/log/connections.log) \
: deny
这将拒绝来自
*.example.com 域的所有连接;
同时还将记录主机名, IP
地址, 以及对方所尝试连接的服务名字到
/var/log/connections.log 文件中。
除了前面已经介绍过的转义字符,
例如 %a 之外, 还有一些其它的转义符。 参考
&man.hosts.access.5; 联机手册可以获得完整的列表。
通配符选项
前面的例子都使用了 ALL。
其它选项能够将功能扩展到更远。
例如, ALL 可以被用来匹配每一个服务、
域,或 IP 地址。
另一些可用的通配符包括
PARANOID, 它可以用来匹配任何来自可能被伪造的
IP 地址的主机。
换言之, paranoid 可以被用来定义来自
IP 与其主机名不符的客户。
下面的例子将给您更多的感性认识:
# Block possibly spoofed requests to sendmail:
sendmail : PARANOID : deny
在这个例子中, 所有连接
sendmail 的
IP 地址与其主机名不符的主机都将被拒绝。
如果服务器和客户机有一方的
DNS 配置不正确,
使用 PARANOID 可能会严重地削弱服务。
在设置之前, 管理员应该谨慎地考虑。
要了解关于通配符和他们的功能,
请参考 &man.hosts.access.5; 联机手册。
为了使设置能够生效, 应该首先把
hosts.allow 的第一行配置注释掉。
这节的开始部分已经说明了这一点。
Mark
Murray
撰写者
Mark
Dapoz
初稿
KerberosIV
Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。
象远程登录, 远程复制,
系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。
下面将具体介绍如何配置随 &os; 发行的
Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。
安装 KerberosIV
MIT
KerberosIV
安装
Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是
在使用 sysinstall 安装 &os; 时选择
krb4 或
krb5。 这样将会安装
eBones
(KerberosIV) 或 Heimdal
(Kerberos5)
的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发,
以便允许在这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。
此外, 您可以从
security/krb5 得到 Kerberos 的 MIT 实现。
创建最初的数据库
这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的
Kerberos 数据库存在。 您应该进入到
/etc/kerberosIV 目录中并检查下述文件是否已经存在:
&prompt.root; cd /etc/kerberosIV
&prompt.root; ls
README krb.conf krb.realms
如果您发现了除此之外的其它文件 (例如 principal.*
或 master_key) 已经存在, 请使用
kdb_destroy 命令来销毁旧的数据库,
或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。
现在必须编辑 krb.conf 和
krb.realms 文件来定义您的 Kerberos 领域。
在本例中, 这个领域将是 EXAMPLE.COM 而其服务器是
grunt.example.com。 我们编辑或创建如下的
krb.conf 文件:
&prompt.root; cat krb.conf
EXAMPLE.COM
EXAMPLE.COM grunt.example.com admin server
CS.BERKELEY.EDU okeeffe.berkeley.edu
ATHENA.MIT.EDU kerberos.mit.edu
ATHENA.MIT.EDU kerberos-1.mit.edu
ATHENA.MIT.EDU kerberos-2.mit.edu
ATHENA.MIT.EDU kerberos-3.mit.edu
LCS.MIT.EDU kerberos.lcs.mit.edu
TELECOM.MIT.EDU bitsy.mit.edu
ARC.NASA.GOV trident.arc.nasa.gov
在这个例子中, 除此之外的其它领域并不是必需的。
把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。
简单起见, 在实际的配置中可以省略它们。
第一行命名了这个系统工作的领域。
其它行包含了领域/主机的记录。
每行的第一项是一个领域, 其后是在这个领域中充当
密钥分发中心
的主机名。 其后的 admin
server 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考
Kerberos 联机手册。
现在应该添加 grunt.example.com
到 EXAMPLE.COM 领域, 同时追加一项以便将出现在
EXAMPLE.COM 领域中
.example.com 域的所有主机也加入进来。
krb.realms 这个文件需要按照下面的方法修改:
&prompt.root; cat krb.realms
grunt.example.com EXAMPLE.COM
.example.com EXAMPLE.COM
.berkeley.edu CS.BERKELEY.EDU
.MIT.EDU ATHENA.MIT.EDU
.mit.edu ATHENA.MIT.EDU
再次强调, 其它领域并不是必需的。 在这里只是要展示如何使用多个领域。
可以删掉它们以简化配置。
第一行将 指定的 系统置于所指名字的领域内。
这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。
接下来我们就可以创建数据库了。 只有在
Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过
kdb_init 命令来完成这一步:
&prompt.root; kdb_init
Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter Kerberos master key:
现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。
用 kstash 命令来完成这一步:
&prompt.root; kstash
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
这一操作将把主口令保存到
/etc/kerberosIV/master_key。
让一切运转起来
KerberosIV
初始配置
有两个主要的东西需要被添加到要用 Kerberos 来确保安全的
每一个 系统上。
它们的名字是 kpasswd 和 rcmd。
这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。
服务程序 kpasswd 和
rcmd 使得其他系统能够修改 Kerberos
口令, 以及执行类似 &man.rcp.1;,
&man.rlogin.1; 和 &man.rsh.1; 这样的命令。
我们添加下面这些记录:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: passwd
Instance: grunt
<Not found>, Create [y] ? y
Principal: passwd, Instance: grunt, kdc_key_ver: 1
New Password: <---- enter RANDOM here
Verifying password
New Password: <---- enter RANDOM here
Random password [y] ? y
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: rcmd
Instance: grunt
<Not found>, Create [y] ?
Principal: rcmd, Instance: grunt, kdc_key_ver: 1
New Password: <---- enter RANDOM here
Verifying password
New Password: <---- enter RANDOM here
Random password [y] ?
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- null entry here will cause an exit
创建服务器文件
现在需要分析在每台机器上定义的服务的所有情况。
为了做到这一点, 可以使用
ext_srvtab 命令。 这将创建一个文件,
它需要被 通过安全的途径 复制或移动到每一个
Kerberos 客户端的
/etc 目录中。
在每一台服务器上都必须存在这个文件,
它对 Kerberos 的运行至关重要。
&prompt.root; ext_srvtab grunt
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Generating 'grunt-new-srvtab'....
现在,这个命令只产生一个临时文件,必须被重命名为 srvtab
以便所有的服务可以识别它。 用 &man.mv.1; 命令把它挪到原系统的这个位置:
&prompt.root; mv grunt-new-srvtab srvtab
如果文件是针对客户系统的, 而且网络可能会不安全, 则应把
client-new-srvtab 复制到可移动的介质上,
并通过物理上安全的方式拿走。
将其改名为 srvtab 并放到客户机的
/etc/kerberosIV 目录中, 并赋予
mode 600:
&prompt.root; mv grumble-new-srvtab srvtab
&prompt.root; chmod 600 srvtab
复制数据库
现在添加一些用户记录到数据库。 首先为用户
jane 创建其对应的项。 使用
kdb_edit 命令来完成此项工作:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
Instance:
<Not found>, Create [y] ? y
Principal: jane, Instance: , kdc_key_ver: 1
New Password: <---- enter a secure password here
Verifying password
New Password: <---- re-enter the password here
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- null entry here will cause an exit
测试全部相关信息
首先必须启动 Kerberos 的服务程序。 这里需要指出,
如果您正确地修改了 /etc/rc.conf 则系统在启动时会自动完成这个工作。
只有在
Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从
/etc/kerberosIV 目录中的文件获取所需要的信息。
&prompt.root; kerberos &
Kerberos server starting
Sleep forever on error
Log file is /var/log/kerberos.log
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Current Kerberos master key version is 1
Local realm: EXAMPLE.COM
&prompt.root; kadmind -n &
KADM Server KADM0.0A initializing
Please do not use 'kill -9' to kill this job, use a
regular kill instead
Current Kerberos master key version is 1.
Master key entered. BEWARE!
接下来应使用 kinit 命令来获取与我们刚刚创建的
ID jane 对应的 ticket:
&prompt.user; kinit jane
MIT Project Athena (grunt.example.com)
Kerberos Initialization for "jane"
Password:
尝试使用 klist 列出句柄以了解是否真的拥有它们:
&prompt.user; klist
Ticket file: /tmp/tkt245
Principal: jane@EXAMPLE.COM
Issued Expires Principal
Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM
现在可以试试看用 &man.passwd.1; 来修改口令,
以验证 kpasswd 服务程序是否能够从
Kerberos 数据库中获得需要的授权:
&prompt.user; passwd
realm EXAMPLE.COM
Old password for jane:
New Password for jane:
Verifying password
New Password for jane:
Password changed.
授予 su 特权
Kerberos 使我们能够给予 每一个 需要使用
root 特权的用户使用他们自己
单独的 &man.su.1; 口令。
现在我们追加一个被授予 &man.su.1; 到 root
权限的 ID。 这件事是由与 root 相关联的一个
principal 实例来控制的。使用 kdb_edit
可以在 Kerberos 数据库中建立一个 jane.root 条目:
&prompt.root; kdb_edit
Opening database...
Enter Kerberos master key:
Current Kerberos master key version is 1.
Master key entered. BEWARE!
Previous or default values are in [brackets] ,
enter return to leave the same, or new value.
Principal name: jane
Instance: root
<Not found>, Create [y] ? y
Principal: jane, Instance: root, kdc_key_ver: 1
New Password: <---- enter a SECURE password here
Verifying password
New Password: <---- re-enter the password here
Principal's new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short!
Attributes [ 0 ] ?
Edit O.K.
Principal name: <---- null entry here will cause an exit
现在试试看获得相应的句柄, 以确认它已经正常工作了:
&prompt.root; kinit jane.root
MIT Project Athena (grunt.example.com)
Kerberos Initialization for "jane.root"
Password:
接下来我们需要把用户添加到 root的
.klogin 文件里:
&prompt.root; cat /root/.klogin
jane.root@EXAMPLE.COM
试试看 &man.su.1;:
&prompt.user; su
Password:
然后看看我们拥有哪些句柄:
&prompt.root; klist
Ticket file: /tmp/tkt_root_245
Principal: jane.root@EXAMPLE.COM
Issued Expires Principal
May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM
使用其它命令
在前文给出的例子中, 我们创建了一个称为
jane 的用户, 以及一个 root 实例。
此处的用户名和它的 principal 相同, 这是
Kerberos 默认的; 一个形如 <username>.root
的
<principal>.<instance> 将允许
<username> 使用 &man.su.1; 成为
root, 只要所需的那些条目在 root
home 目录中的
.klogin 中存在的话:
&prompt.root; cat /root/.klogin
jane.root@EXAMPLE.COM
类似地, 如果用户的 home 目录中有这样的设置:
&prompt.user; cat ~/.klogin
jane@EXAMPLE.COM
jack@EXAMPLE.COM
则表明在 EXAMPLE.COM 领域的经过身份验证的
jane 或者
jack (通过 kinit, 详情见前文)
能够使用 jane 的身份或系统 (grunt)
中的文件, 无论通过 &man.rlogin.1;, &man.rsh.1; 或是
&man.rcp.1;。
举例来说, jane 现在通过
Kerberos 登入了其它系统:
&prompt.user; kinit
MIT Project Athena (grunt.example.com)
Password:
&prompt.user; rlogin grunt
Last login: Mon May 1 21:14:47 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
或者, 当 jack 登录到 jane
在同一台机器上的账号
(jane 按照前面所介绍的那样配置了
.klogin 文件, 而负责 Kerberos 的管理员, 则为
jack 的 principal 配置了一个空的 instance):
&prompt.user; kinit
&prompt.user; rlogin grunt -l jane
MIT Project Athena (grunt.example.com)
Password:
Last login: Mon May 1 21:16:55 from grumble
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995
Tillman
Hodgson
撰写者
Mark
Murray
原文来自
Kerberos5
在 &os;-5.1 之后的每一个 &os; 版本都只包含
Kerberos5 支持了, 因而,
Kerberos5 是它们所包含的唯一的
Kerberos 版本, 其配置在绝大多数方面和
KerberosIV 非常类似。
下述信息只适用于 &os;-5.0 之后版本中的
Kerberos5。
希望使用
KerberosIV 的用户可以安装
security/krb4 port。
Kerberos 是一组附加的网络系统/协议,
用以让用户通过一台安全服务器提供的服务来验证身份。
包括远程登录、远程复制、在系统间安全地复制文件,
以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。
Kerberos 可以理解为一种身份验证代理系统。
它也被描述为一种以受信第三方为主导的身份验证系统。
Kerberos 只提供一种功能
— 在网络上安全地完成用户的身份验证。
它并不提供授权功能 (也就是说用户能够做什么操作)
或审计功能 (记录用户作了什么操作)。
一旦客户和服务器都使用了
Kerberos 来证明各自的身份之后,
他们还可以加密全部的通讯以保证业务数据的私密性和完整性。
因此, 强烈建议将
Kerberos 同其它提供授权和审计服务的安全手段联用。
接下来的说明可以用来指导如何安装 &os; 所附带的
Kerberos。
不过, 您仍然需要参考相应的联机手册以获得完整的描述。
为了展示 Kerberos
的安装过程, 我们约定:
DNS 域 (zone
)
为 example.org。
Kerberos 领域是
EXAMPLE.ORG。
在安装
Kerberos 时请使用实际的域名即使您只是想在内部网上用一用。
这可以避免 DNS 问题并保证了同其它
Kerberos 之间的互操作性。
历史
Kerberos5
历史
Kerberos 最早由
MIT 作为解决网络安全问题的一个方案提出。
Kerberos 协议采用了强加密,
因此客户能够在不安全的网络上向服务器
(以及相反地) 验证自己的身份。
Kerberos 是网络验证协议名字,
同时也是用以表达实现了它的程序的形容词。
(例如 Kerberos telnet)。
目前最新的协议版本是 5,在
RFC 1510 中有所描述。
该协议有许多免费的实现, 这些实现涵盖了许多种不同的操作系统。
最初研制 Kerberos 的麻省理工学院
(MIT) 也仍然在继续开发他们的 Kerberos
软件包。 在 US 它被作为一种加密产品使用,
因而历史上曾经受到 US 出口管制。
MIT Kerberos
可以通过 port (security/krb5)
来安装和使用。 Heimdal
Kerberos 是另一种第 5 版实现,
并且明确地在
US 之外的地区开发, 以避免出口管制
(因此在许多非商业的类 &unix; 系统中非常常用。
Heimdal Kerberos 软件包可以通过
port
(security/heimdal) 安装,
最新的 &os; 的最小安装也会包含它。
为使尽可能多的读者从中受益, 这份说明以 &os; 附带的
Heimdal 软件包为准。
配置 Heimdal KDC
Kerberos5
密钥分发中心
密钥分发中心 (KDC) 是
Kerberos 提供的集中式验证服务 — 它是签发
Kerberos tickets 的那台计算机。
KDC 在 Kerberos
领域中的其它机器看来是 受信的
,
因此必须格外注意其安全性。
需要说明 Kerberos 服务器只需要非常少的计算资源,
尽管如此, 基于安全理由仍然推荐使用独占的机器来扮演 KDC
的角色。
要开始配置 KDC, 首先请确认您的
/etc/rc.conf 文件包含了作为一个
KDC 所需的设置 (您可能需要适当地调整路径以适应自己系统的情况):
kerberos5_server_enable="YES"
kadmind5_server_enable="YES"
接下来需要修改 Kerberos
的配置文件, /etc/krb5.conf:
[libdefaults]
default_realm = EXAMPLE.ORG
[realms]
EXAMPLE.ORG = {
kdc = kerberos.example.org
admin_server = kerberos.example.org
}
[domain_realm]
.example.org = EXAMPLE.ORG
请注意这个 /etc/krb5.conf 文件假定您的
KDC 有一个完整的主机名,
即 kerberos.example.org。
如果您的 KDC 主机名与它不同,
则应添加一条 CNAME (别名) 项到 zone 中去。
对于有正确地配置过的
BIND DNS 服务器的大型网络,
上述例子可以精简为:
[libdefaults]
default_realm = EXAMPLE.ORG
将下面的内容加入到
example.org zone 数据文件中:
_kerberos._udp IN SRV 01 00 88 kerberos.example.org.
_kerberos._tcp IN SRV 01 00 88 kerberos.example.org.
_kpasswd._udp IN SRV 01 00 464 kerberos.example.org.
_kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org.
_kerberos IN TXT EXAMPLE.ORG
要让客户机能够找到
Kerberos 服务, 就
必须 首先配置完整或最小配置的
/etc/krb5.conf 并且
正确地配置 DNS 服务器。
接下来需要创建 Kerberos 数据库。
这个数据库包括了使用主密码加密的所有实体的密钥。
您并不需要记住这个密码, 它会保存在一个文件
(/var/heimdal/m-key) 中。
要创建主密钥,
需要执行 kstash 并输入一个口令。
主密钥一旦建立, 您就可以用
kadmin 程序的
-l 参数 (表示 local
) 来初始化数据库了。
这个选项让 kadmin 直接地修改数据库文件而不是通过
kadmind 的网络服务。 这解决了在数据库创建之前连接它的鸡生蛋的问题。
进入 kadmin 提示符之后, 用
init 命令来创建领域的初始数据库。
最后, 仍然在 kadmin 中, 使用
add 命令来创建第一个 principal。
暂时使用全部的默认设置, 随后可以在任何时候使用
modify 命令来修改这些设置。
另外, 也可以用 ? 命令来了解可用的选项。
典型的数据库创建过程如下:
&prompt.root; kstash
Master key: xxxxxxxx
Verifying password - Master key: xxxxxxxx
&prompt.root; kadmin -l
kadmin> init EXAMPLE.ORG
Realm max ticket life [unlimited]:
kadmin> add tillman
Max ticket life [unlimited]:
Max renewable life [unlimited]:
Attributes []:
Password: xxxxxxxx
Verifying password - Password: xxxxxxxx
现在是启动 KDC 服务的时候了。
运行 /etc/rc.d/kerberos start 以及
/etc/rc.d/kadmind start 来启动这些服务。
尽管此时还没有任何正在运行的 Kerberos 服务, 但您仍然可以通过获取并列出您刚刚创建的那个
principal (用户) 的 ticket 来验证
KDC 确实在正常工作, 使用
KDC 本身的功能:
&prompt.user; kinit tillman
tillman@EXAMPLE.ORG's Password:
&prompt.user; klist
Credentials cache: FILE:/tmp/krb5cc_500
Principal: tillman@EXAMPLE.ORG
Issued Expires Principal
Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
完成所需的操作之后, 可以撤消这一 ticket:
&prompt.user; k5destroy
为 Kerberos 启用
Heimdal 服务
Kerberos5
启用服务
首先我们需要一份 Kerberos 配置文件
/etc/krb5.conf 的副本。 只需简单地用安全的方式
(使用类似 &man.scp.1; 的网络工具, 或通过软盘) 复制
KDC 上的版本, 并覆盖掉客户机上的对应文件就可以了。
接下来需要一个 /etc/krb5.keytab 文件。
这是提供
Kerberos 服务的服务器和工作站的一个主要区别
— 服务器必须有
keytab 文件。 这个文件包括了服务器的主机密钥,
这使得
KDC 得以验证它们的身份。
此文件必须以安全的方式传到服务器上,
因为如果密钥被公之于众, 则安全也就毁于一旦。
也就是说, 通过明文的通道, 例如 FTP 是非常糟糕的想法。
一般来说, 您会希望使用 kadmin 程序来把
keytab 传到服务器上。
由于也需要使用 kadmin 来为主机建立 principal
(KDC 一端的
krb5.keytab), 因此这并不复杂。
注意您必须已经获得了一个 ticket 而且这个 ticket 必须许可使用
kadmind.acl 中的 kadmin
接口。 请参考 Heimdal info 中的 Remote administration(远程管理)
一节 (info heimdal) 以了解如何设计访问控制表。
如果不希望启用远程的
kadmin 操作, 则可以简单地采用安全的方式连接
KDC (通过本机控制台,
&man.ssh.1; 或 Kerberos
&man.telnet.1;) 并使用 kadmin -l 在本地执行管理操作。
安装了 /etc/krb5.conf 文件之后,
您就可以使用 Kerberos 上的
kadmin 了。
add --random-key 命令可以用于添加主机 principal,
而 ext 命令则允许导出服务器的主机 principal 到它的
keytab 中。 例如:
&prompt.root; kadmin
kadmin> add --random-key host/myserver.example.org
Max ticket life [unlimited]:
Max renewable life [unlimited]:
Attributes []:
kadmin> ext host/myserver.example.org
kadmin> exit
注意 ext 命令 (这是
extract
的简写) 默认会把导出的密钥放到
/etc/krb5.keytab 中。
如果您由于没有在 KDC 上运行
kadmind (例如基于安全理由) 因而无法远程地使用
kadmin 您可以直接在 KDC
上添加主机 principal
(host/myserver.EXAMPLE.ORG) 随后将其导出到一个临时文件中
(以免覆盖 KDC 上的 /etc/krb5.keytab),
方法是使用下面的命令:
&prompt.root; kadmin
kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org
kadmin> exit
随后需要把 keytab 复制到服务器上
(例如使用 scp 或软盘)。
一定要指定一个不同于默认的 keytab 名字以免覆盖
KDC 上的 keytab。
到现在您的服务器已经可以同
KDC 通讯了 (因为已经配置了 krb5.conf
文件), 而且它还能够证明自己的身份 (由于配置了
krb5.keytab 文件)。 现在可以启用一些
Kerberos 服务。
在这个例子中, 我们将在 /etc/inetd.conf
中添加下面的行来启用 telnet
服务, 随后用 /etc/rc.d/inetd restart 重启
&man.inetd.8; 服务来使设置生效:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user
关键的部分是 -a
(表示验证) 类型设置为用户 (user)。 请参考
&man.telnetd.8; 联机手册以了解细节。
使用 Heimdal 来启用客户端 Kerberos
Kerberos5
客户端配置
设置客户机是非常简单的。 在正确配置了
Kerberos 的网络中,
只需要将位于 /etc/krb5.conf 的配置文件进行一下设置就可以了。
这一步骤可以简单地通过安全的方式将文件从
KDC 复制到客户机上来完成。
尝试在客户机上执行
kinit、 klist, 以及
kdestroy 来测试获取、 显示并删除
刚刚为 principal 建立的 ticket 是否能够正常进行, 如果能,
则用其它的 Kerberos 应用程序来连接启用了
Kerberos 的服务。 如果应用程序不能正常工作而获取
ticket 正常, 则通常是服务本身, 而非客户机或 KDC
有问题。
在测试类似 telnet 的应用程序时,
应考虑使用抓包程序 (例如 &man.tcpdump.1;)
来确认您的口令没有以明文方式传输。
尝试使用 telnet 的 -x
参数, 它将加密整个数据流 (类似
ssh)。
许多非核心的 Kerberos 客户应用程序也是默认安装的。
在 Hemidal 的 最小
安装理念下,
telnet 是唯一一个采用了
Kerberos 的服务。
Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了
Kerberos 版本的
ftp、 rsh、
rcp、 rlogin 以及一些更不常用的程序。
MIT port 也包括了一整套 Kerberos
客户应用程序。
用户配置文件: .k5login 和 .k5users
.k5login
.k5users
在某个领域中的用户往往都有自己的
Kerberos principal (例如
tillman@EXAMPLE.ORG) 并映射到本机用户帐户
(例如本机上名为 tillman 的帐户)。
客户端应用程序, 如
telnet 通常并不需要用户名或 principal。
不过, 有时您可能会需要赋予某些没有匹配 Kerberos principal
的人使用本地用户帐户的权限。 例如
tillman@EXAMPLE.ORG 可能需要访问本地的
webdevelopers 用户帐号。 其它
principal 可能也会需要访问这个本地帐号。
用户 home 目录中的 .k5login 和
.k5users 这两个文件可以配合
.hosts 和 .rhosts
来有效地解决这个问题。 例如, 如果
.k5login 中有如下内容:
tillman@example.org
jdoe@example.org
并放到了本地用户
webdevelopers 的 home 目录中, 则列出的两个 principals
都可以使用那个帐号, 而无须共享口令。
建议您在开始实施之前首先阅读这些命令的联机帮助。
特别地, ksu 的联机手册包括了
.k5users 的相关内容。
Kerberos 提示、技巧和故障排除
Kerberos5
故障排除
当使用 Heimdal 或 MIT
Kerberos ports 时, 需要确认
PATH 环境变量把 Kerberos
客户应用列在系统自带的版本之前。
同一领域内的所有计算机的时间设置是否同步?
如果不是的话, 则身份验证可能会失败。
描述了如何使用
NTP 来同步时钟。
MIT 和 Heimdal 能够很好地互操作。
一个例外是 kadmin, 因为这个协议没有被标准化。
如果您改变了主机名, 您还需要修改您的
host/ principal 并更新 keytab。
这一规律也适用于类似 Apache 的 www/mod_auth_kerb
所使用的 www/ principal 这样的特殊
keytab 项。
您的领域中的每一台主机必须在 DNS
(或至少在 /etc/hosts 中) 可以解析
(同时包括正向和反向)。
CNAME 能够正常使用,
但必须有正确的对应 A 和 PTR 记录。
此时给出的错误信息可能很让人困惑:
Kerberos5 refuses authentication because Read req
failed: Key table entry not found。
某些作为客户使用您的 KDC 的操作系统可能没有将
ksu 设置为 setuid
root 的权限。 这意味着
ksu 将不能够正常工作,
从安全角度说这是一个不错的主意,
但可能令人烦恼。
这类问题并不是
KDC 的错误。
使用 MIT
Kerberos 时, 如果希望允许一个
principal 拥有超过默认的十小时有效期的 ticket 则必须使用
kadmin 中的 modify_principal
来修改 principal 本身以及 krbtgt
的 maxlife(最大有效期)。
此后, principal 可以使用 kinit 的
-l 参数来请求一个有更长有效期的 ticket。
如果在 KDC 上运行了听包程序,
并在工作站上执行 kinit,
您可能会注意到 TGT 是在
kinit 一开始执行的时候就发出了的 —
甚至在您输入口令之前! 关于这个现象的解释是
Kerberos 服务器可以无限制地收发
TGT (Ticket Granting
Ticket) 给任何未经授权的请求; 但是, 每一个
TGT 都是使用用户的口令派生出来的密钥进行加密的。
因此, 当用户输入口令时它并不会发送给 KDC,
而是直接用于解密 kinit 所拿到的 TGT。
如果解密过程得到了一个包含合法的时间戳的有效 ticket,
则说明用户的 Kerberos 凭据有效。
这些凭据包含了一个会话密钥用以在随后建立
Kerberos 服务器的加密通讯,
传递由服务器自己的私钥加密的实际的 ticket-granting ticket。
这个第二层加密对于用户来说是看不到的, 但它使得
Kerberos 服务器能够验证每一个
TGT 的真实性。
如果需要有效期更长的 ticket (例如一周)
而且您使用 OpenSSH
连接保存您的 ticket 的机器,
请确认 sshd_config 中的
Kerberos
被设置为 no
否则在注销时会自动删除所有的 ticket。
切记主机的 principals 的 ticket 有效期一定要比用户的长。
如果您的用户 principal 的有效期是一周,
而所连接的主机的有效期是九个小时,
则缓存的主机 principal 将先行过期,
结果是 ticket 缓存无法正常工作。
当配置 krb5.dict 文件来防止使用特定的简单口令
(kadmind 的联机手册中简要介绍了它),
请切记只有指定了口令策略的 principals 才会使用它们。
krb5.dict 文件的格式很简单:
每个串占一行。 创建一个到 /usr/share/dict/words
的符号连接会很有用。
与 MIT port 的区别
MIT 和
Heimdal 主要的区别在于 kadmin
程序使用不同 (尽管等价) 的命令和协议。 如果您的
KDC 是 MIT 的,
则其影响是不能使用 Heimdal 的 kadmin
程序来远程管理 KDC
(或相反)。
完成同样工作的命令可能会有些许的不同。 推荐按照
MIT
Kerberos 的网站
()
上的说明来操作。 请小心关于路径的问题,
MIT port 会默认安装到
/usr/local/, 您因此可能会执行
普通的
系统应用程序而非
MIT, 如果您的 PATH 环境变量把
把系统目录放在前面的话。
如果使用 &os; 提供的 MIT
security/krb5 port,
一定要仔细阅读 port 所安装的
/usr/local/share/doc/krb5/README.FreeBSD,
如果您想知道为什么通过
telnetd 和 klogind
登录时会出现一些诡异的现象的话。 最重要地,
incorrect permissions on cache file(缓存文件权限不正确)
行为需要使用 login.krb5 来进行验证,
才能够正确地修改转发凭据的属主。
除此之外, 还应修改 rc.conf 并加入下列配置:
kerberos5_server="/usr/local/sbin/krb5kdc"
kadmind5_server="/usr/local/sbin/kadmind"
kerberos5_server_enable="YES"
kadmind5_server_enable="YES"
这样做的原因是,
MIT kerberos 会将可执行文件装到
/usr/local
之下。
缓解 Kerberos 的限制
Kerberos5
限制和不足
Kerberos 是一种 all-or-nothing 方式
在网络上启用的每个服务都必须进行修改以便让其能够配合
Kerberos 工作
(否则就只能使用其它方法来保护它们不受网络攻击的侵害),
如果不是这样, 则用户的凭据就有可能被窃取并再次使用。
一个例子是对所有的远程 shell (例如通过
rsh 和 telnet)
启用了
Kerberos
但没有将使用明文验证的 POP3 邮件服务器 Kerberos化。
Kerberos 是为单用户工作站设计的
在多用户环境中
Kerberos 的安全性会被削弱。
这是因为它把 ticket 保存到
/tmp 目录中, 而这个目录可以被任何用户读取。
如果有用户与其它人同时共享一台计算机 (也就是 multi-user),
则这个用户的 ticket 就可能被其它用户窃取 (复制)。
可以通过使用 -c 文件名 这样的命令行选项,
或者(推荐的)改变 KRB5CCNAME 环境变量来避免这个问题,
但很少有人这么做。原则上, 将 ticket 保存到用户的 home
目录并简单地设置权限就能够缓解这个问题。
KDC 会成为单点崩溃故障点
根据设计, KDC 必须是安全的,
因为主密码数据库保存在它上面。 决不应该在
KDC上面运行其它服务,
而且还应确保它的物理安全。
由于 Kerberos
使用同一个密钥 (传说中的那个
主
密钥) 来加密所有的密码, 而将这个文件保存在
KDC, 因此其安全尤为重要
不过, 主密钥的泄露并没有想象中的那么可怕。
主密钥只用来加密 Kerberos
数据库以及产生随机数发生器的种子。
只要 KDC 是安全的,
即使攻击者拿到了主密钥也做不了什么。
另外, 如果 KDC 不可用
(例如由于拒绝服务攻击或网络故障)
则网络服务将由于验证服务无法进行而不能使用,
从而导致更大范围的拒绝服务攻击。
通过部署多个 KDC (一个主服务器,
配合一个或多个从服务器) 并采用经过仔细设计和实现的备用验证方式可以避免这种问题
(PAM 是一个不错的选择)。
Kerberos 的不足
Kerberos 允许用户、主机和服务之间进行相互认证。
但它并没有提供机制来向用户、主机或服务验证 KDC。
这意味着种过木马的程序,例如
kinit 有可能记录用户所有的用户名和密码。
尽管如此, 可以用类似
security/tripwire
这样的文件系统完整性检查工具来避免此类情况的发生。
相关资源和其它资料
Kerberos5
外部资源
The Kerberos FAQ
Designing
an Authentication System: a Dialog in Four Scenes
RFC 1510,
The Kerberos Network Authentication Service
(V5)
MIT
Kerberos home page
Heimdal
Kerberos home page
Tom
Rhodes
作者
OpenSSL
安全
OpenSSL
许多用户可能并没有注意到 &os; 所附带的
OpenSSL 工具包的功能。
OpenSSL 提供了建立在普通的通讯层基础上的加密传输层;
这些功能为许多网络应用和服务程序所广泛使用。
对 OpenSSL 的一些常见用法包括加密邮件客户的身份验证过程,
基于 Web 的交易如信用卡等等。 许多 ports 如
www/apache13-ssl, 以及
mail/sylpheed-claws
等等都提供了编译进
OpenSSL 支持的方法。
绝大多数情况下 Ports Collection 会试图使用
security/openssl
除非明确地将 WITH_OPENSSL_BASE make
变量设置为 yes
。
&os; 中附带的 OpenSSL 版本能够支持
安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层
v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库使用。
尽管 OpenSSL 支持
IDEA 算法, 但由于美国专利,
它在默认情况下是不编译的。 如果想使用它,
请查阅相应的授权, 如果认为授权可以接受, 则可以在
make.conf 中设置
MAKE_IDEA。
为应用软件提供证书是
OpenSSL 最为常用的功能之一。
证书是一种能够确保公司或个人有效身份不被伪造的凭据。
如果证书没有被众多 权威发证机构
,
或 CA 中的某一个确认,
则会产生一个警告。 权威发证机构通常是一家公司,
例如 VeriSign,
它能够通过签署来证明个人或公司证书的有效性。
这个过程是需要付费的, 当然, 这不是使用证书的必要条件;
然而, 这样做会让那些比较偏执的用户感到轻松。
生成证书
OpenSSL
生成证书
为了生成证书, 需要使用下面的命令:
&prompt.root; openssl req -new -nodes -out req.pem -keyout cert.pem
Generating a 1024 bit RSA private key
................++++++
.......................................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:PA
Locality Name (eg, city) []:Pittsburgh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:Systems Administrator
Common Name (eg, YOUR name) []:localhost.example.org
Email Address []:trhodes@FreeBSD.org
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:SOME PASSWORD
An optional company name []:Another Name
请注意, 在
Common Name
提示后面我们输入的是一个域名。
这个提示要求输入服务器的名字,
这个名字今后将用于完成验证过程;
如果在这里输入域名以外的内容, 那么证书也就失去其意义了。
您还可以指定一些其他的选项, 比如证书的有效期,
以及使用的加密算法等等。 这些选项的完整列表,
可以在 &man.openssl.1; 联机手册中找到。
在您执行前述命令的目录中将生成两个文件。
证书申请, 即 req.pem,
可以发给一家发证机构, 它将验证您输入的凭据的真实性,
并对申请进行签名, 再把证书返还给您。
第二个文件的名字将是 cert.pem,
它包含了证书的私钥, 应被全力保护;
如果它落入别人手中, 则可以被用来伪造您
(或您的服务器)。
如果不需要来自 CA 的签名,
也可以创建自行签名的证书。 首先,
需要生成 RSA 密钥:
&prompt.root; openssl dsaparam -rand -genkey -out myRSA.key 1024
接下来, 生成 CA 密钥:
&prompt.root; openssl gendsa -des3 -out myca.key myRSA.key
然后用这个密钥来创建证书:
&prompt.root; openssl req -new -x509 -days 365 -key myca.key -out new.crt
上述步骤将在当前目录中生成两个新文件:
一个是权威发证机构的签名文件, myca.key;
另一个是证书本身, new.crt。
这些文件应该放到同一个目录中, 一般而言, 推荐放到
/etc,
并且只允许 root 读取。
建议把权限设置为 0700, 这可以通过 chmod
工具来完成。
使用证书的一个例子
那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密
Sendmail MTA
的通讯连接。 这可以解决用户通过本地 MTA
发送邮件时使用明文进行身份验证的问题。
这个用法可能并不完美, 因为某些
MUA 会由于没有在本地安装证书而向用户发出警告。
请参考那些软件的说明了解关于安装证书的信息。
下面的设置应添加到本地的
.mc 文件
dnl SSL Options
define(`confCACERT_PATH',`/etc/certs')dnl
define(`confCACERT',`/etc/certs/new.crt')dnl
define(`confSERVER_CERT',`/etc/certs/new.crt')dnl
define(`confSERVER_KEY',`/etc/certs/myca.key')dnl
define(`confTLS_SRV_OPTIONS', `V')dnl
这里, /etc/certs/
是准备用来在本地保存证书和密钥的位置。 最后,
需要重新生成本地的 .cf 文件。
这一工作可以简单地通过在
- /etc/mail
目录中执行 make
- install 来完成。
+ install 来完成。
接下来, 可以使用 make
- restart 来重新启动
+ restart 来重新启动
Sendmail 服务程序。
如果一切正常的话, 在
/var/log/maillog 中就不会出现错误提示,
Sendmail 也应该出现在进程列表中。
做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器:
&prompt.root; telnet example.com 25
Trying 192.0.34.166...
Connected to example.com.
Escape character is '^]'.
220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT)
ehlo example.com
250-example.com Hello example.com [192.0.34.166], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
quit
221 2.0.0 example.com closing connection
Connection closed by foreign host.
如果输出中出现了 STARTTLS
则说明一切正常。
Nik
Clayton
nik@FreeBSD.org
撰写者
IPsec
IPsec 上的 VPN
使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。
Hiten M.
Pandya
hmp@FreeBSD.org
撰写者
理解 IPsec
这一节将指导您完成架设 IPsec, 并在一个包含了
FreeBSD 和 µsoft.windows; 2000/XP
机器的网络中使用它来进行安全的通讯的全过程。 为了配置
IPsec, 您应当熟悉如何编译一个定制的内核的一些概念
(参见
)。
IPsec 是一种建立在 Internet
协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯
(并因此而得名)。
FreeBSD IPsec 网络协议栈
基于
KAME 的实现,
它支持两种协议族, IPv4 和 IPv6。
FreeBSD 包括了采用 硬件加速的
IPsec 协议栈, 也称作 Fast
IPsec
, 它来自 OpenBSD。
它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能)
优化 IPSec 的性能。
这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec
的全部功能。 此外, 为了启用硬件加速的
IPsec, 必须把下面的选项加入到内核配置中:
内核选项
FAST_IPSEC
options FAST_IPSEC # new IPsec (cannot define w/ IPSEC)
需要注意的是, 目前还不能用
Fast IPsec
子系统完全替代 KAME
的 IPsec 实现。 请参见联机手册 &man.fast.ipsec.4;
以了解进一步的详情。
如果希望防火墙能够正确地跟踪到 &man.gif.4; 信道的状态,
您还需要在内核配置中启用
:
options IPSEC_FILTERGIF #filter ipsec packets from a tunnel
IPsec
ESP
IPsec
AH
IPsec 包括了两个子协议:
Encapsulated Security Payload
(ESP), 保护 IP 包数据不被第三方介入,
通过使用对称加密算法 (例如 Blowfish、
3DES)。
Authentication Header (AH),
保护 IP 包头不被第三方介入和伪造,
通过计算校验和以及对 IP 包头的字段进行安全散列来实现。
随后是一个包含了散列值的附加头,
以便能够验证包。
ESP 和 AH 可以根据环境的不同,
分别或者一同使用。
VPN
虚拟专用网
VPN
IPsec 既可以用来直接加密主机之间的网络通讯
(也就是 传输模式); 也可以用来在两个子网之间建造
虚拟隧道
用于两个网络之间的安全通讯
(也就是 隧道模式)。
后一种更多的被称为是 虚拟专用网 (VPN)。
&man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。
要把 IPsec 支持放进内核,
应该在配置文件中加入下面的选项:
内核选项
IPSEC
内核选项
IPSEC_ESP
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/ IPSEC)
内核选项
IPSEC_DEBUG
如果需要 IPsec 的调试支持, 还应增加:
options IPSEC_DEBUG #debug for IP security
问题
由于对如何建立 VPN 并不存在标准, 因此 VPN
可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。
这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。
情景: 两个网络都接入了 Internet, 希望像一个网络那样工作
VPN
创建
现有条件如下:
至少有两个不同的站点
每个站点都使用内部的 IP
两个站点都通过运行 FreeBSD 的网关接入 Internet。
每个网络上的网关至少有一个公网的 IP 地址。
网络的内部地址可以是公网或私有的 IP 地址,
这并不是问题。 如果需要, 还可以在网关上运行 NAT。
两个网络上的 IP 地址
不冲突。 虽然理论上可以通过
VPN 和 NAT 连用来使这种情况能够正常工作,
但那毫无疑问将是管理的噩梦。
如果您发现您正打算连接两个内网使用同一私有 IP 地址范围的网络
(例如它们都使用 192.168.1.x), 则其中的一个必须修改网络地址。
网络的拓扑结构如下:
网络 #1 [ 内部主机 ] 私有网络,192.168.1.2-254
[ Win9x/NT/2K ]
[ UNIX ]
|
|
.---[fxp1]---. 私有 IP, 192.168.1.1
| FreeBSD |
`---[fxp0]---' 公网 IP, A.B.C.D
|
|
-=-=- Internet -=-=-
|
|
.---[fxp0]---. 公网 IP, W.X.Y.Z
| FreeBSD |
`---[fxp1]---' 私有 IP, 192.168.2.1
|
|
网络 #2 [ Internal Hosts ]
[ Win9x/NT/2K ] 私有网络, 192.168.2.2-254
[ UNIX ]
请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。
在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。
另外, 在内部, 两个网关都是使用的 .1 的 IP地址,
而两个网络使用了不同的私有 IP 地址 (相应地, 192.168.1.x 和 192.168.2.x)。 所有私有网络上的机器都被配置为使用
.1 这台机器作为它们的网关。
我们希望, 从网络的观点看,
每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器
-- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。
这意味着 (举例来说), 主机 192.168.1.20 应该能够运行
ping 192.168.2.34
并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器,
浏览文件共享, 等等, 就像在本地网络上一样。
而且这些事情必须是安全的, 也就是说两个网络之间的通讯必须加密。
在两个网络之间建立 VPN 可以分为几步。
这些步骤包括:
在两个网络之间, 通过 Internet 建立一个
虚拟的
网络连接。
使用类似 &man.ping.8; 这样的工作来验证它是否正常工作。
在两个网络之间应用安全策略以保证它们之间的通讯被透明地加密和解密。
可以使用 &man.tcpdump.1; 或类似的工具来验证这一点。
在 FreeBSD 网关上配置其他软件,
让 &windows; 机器能够通过 VPN 看到另一个网络中的机器。
步骤 1: 建立并测试 虚拟的
网络连接
假设您目前已经登录到了网络 #1 的网关机上
(其公网 IP 地址是 A.B.C.D, 私网 IP 地址是 192.168.1.1), 则您可以执行 ping
192.168.2.1, 这是公网 IP 为 W.X.Y.Z
的私网地址。 需要做什么实现上述功能呢?
作为网关的机器需要知道如何能够到达 192.168.2.1。 换言之,
它需要一条通往 192.168.2.1 的路由。
私网 IP 地址, 例如 192.168.x 这样的地址是不应在 Internet 上面大量出现的。
因此, 发送到 192.168.2.1 的数据包将会封装到另外的包中。
这样的包对外展现的应该是来自 A.B.C.D,
并被发到 W.X.Y.Z 去。 这个过程称为
封装。
一旦包到达了 W.X.Y.Z 就需要对其
拆封
, 并传递给 192.168.2.1。
可以把上述过程理解为在两个网络间建立了一个 隧道
。
两个 隧道口
是 IP 地址 A.B.C.D
和 W.X.Y.Z, 而隧道必须被告知哪些私有地址可以自由地在其中通过。
隧道被用来在公共的 Internet 上传递私有的 IP 数据。
在 FreeBSD 上, 隧道可以通过一般的网络接口, 或
gif 来建立。
您也许已经猜到了, 每一台网关机的 gif
接口需要配置四个 IP 地址; 两个是公网 IP 地址,
另两个则是私网 IP 地址。
对于 gif 设备的支持必须在两台网关机上编译进 &os; 内核。
可以通过添加下面的设置来达到目的:
device gif
到两边的内核配置文件中, 并重新编译、 安装和启动它们。
配置隧道可以分为两步来完成。 首先隧道必须被告知外部的
(或公网的) IP 地址, 可以通过 &man.ifconfig.8; 来完成这步。
私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。
在网络 #1 的网关机上可以通过下面的这些命令来配置隧道。
&prompt.root; ifconfig gif0 create
&prompt.root; ifconfig gif0 tunnel A.B.C.D W.X.Y.Z
&prompt.root; ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
在另一台网关上也需要执行同样的命令, 但 IP 地址的顺序相反。
&prompt.root; ifconfig gif0 create
&prompt.root; ifconfig gif0 tunnel W.X.Y.Z A.B.C.D
&prompt.root; ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
随后执行:
ifconfig gif0
可以查看当前的配置情况。 例如, 在网络 #1
的网关上您应该能够看到:
&prompt.root; ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
tunnel inet A.B.C.D --> W.X.Y.Z
inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff
如您所见, 虽然到已经在物理地址 A.B.C.D 和
W.X.Y.Z 之间建立起来,
而允许通过隧道的地址则是 192.168.1.1 到 192.168.2.1 这个范围。
这同时会在两边机器的路由表中加入一项,
可以通过 netstat -rn 来观察。
来自网络 #1的网关机的输出如下。
&prompt.root; netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
...
192.168.2.1 192.168.1.1 UH 0 0 gif0
...
正如 Flags
的值所显示的那样, 这是一个主机路由,
这意味着每一个网关都知道如何到达另一端的网关,
但它们现在还不知道如何到达对方的网络。
我们接下来立刻解决这个问题。
您很可能在两台机器上都在运行防火墙。
这需要作一些变动, 以便适应 VPN 的需要。
一般来说会希望两个网络相互传递数据包,
或者通过防火墙来隔离两边的危险。
如果您将防火墙配置为允许两边的网络传输通过,
则测试工作会简单不少。 随后您可以随时将限制变得更严格一些。
假如您在网关上使用 &man.ipfw.8; 则下面的命令
ipfw add 1 allow ip from any to any via gif0
将允许两端点的 VPN 数据通过, 而不影响其他防火墙策略。
很显然, 您需要在两个网关上都执行上述命令。
现在已经可以让两台机器相互 ping 了。
在 192.168.1.1 您应该能够正常执行
ping 192.168.2.1
并得到回应。 对于另一台网关来说也是一样。
然而, 到目前为止仍然还无法连上另一网络上的内部主机。
原因是路由 -- 尽管网关机知道如何到达对方那里,
但它们都不知道如何到达对方后面的网络。
要解决这个问题, 就必须在两边都添加一条静态路由。
可以在第一台网关上执行:
route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
这相当于是说 为了到达
192.168.2.0 子网的机器,
需要把包发给 192.168.2.1
。
您需要在另一个网关上也执行类似的命令, 但使用
192.168.1.x 的地址。
来自一个网络上的 IP 访问现在能够抵达对面的网络了。
在两个网络之间建立 VPN 的过程已经完成了三分之二,
它现在已经是 虚拟的
网络
,
然而它还不够专用。 您可以使用
&man.ping.8; 和 &man.tcpdump.1; 来进行测试, 并记录两边收发的数据包
tcpdump dst host 192.168.2.1
接下来登录到本机的另一个会话
ping 192.168.2.1
您将在输出中发现
16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request
16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply
16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request
16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply
16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request
16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply
如您所见, ICMP 消息在收发的过程中都没有加密。
如果使用了 参数来运行
&man.tcpdump.1;, 甚至可以得到包中的更多信息以及其中的数据。
很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全,
这件事是通过对通讯实施加密来完成的。
小结:
在两边的内核中配置 device gif
。
编辑网关 #1 上的 /etc/rc.conf 并将下面的行添加进去
(根据需要改 IP )。
gif_interfaces="gif0"
gifconfig_gif0="A.B.C.D W.X.Y.Z"
ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
static_routes="vpn"
route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
在两台机器上编辑防火墙脚本
(/etc/rc.firewall, 或类似的名字)
在其中加入
ipfw add 1 allow ip from any to any via gif0
在网络 #2 的网关机上也对
/etc/rc.conf 做同样的修改, 注意把 IP 地址倒过来。
步骤 2: 对连接实施安全加固
为了加密连接通讯将用到 IPsec。
IPsec 提供了一种机制, 使得两台主机协商一个加密密钥,
并使用它加密之间的通讯。
在配置时有两个地方需要考虑。
必须有能够让两台主机协商所采用的加密方式的机制。
一旦双方确认了这机制, 则称他们之间建立了
安全关联
。
必须采用某种机制来指定哪些通讯需要加密。
很明显地, 通常并不需要所有的发出数据都被加密
-- 一般只需要加密在 VPN 上传输的那些数据。
这类决定哪些数据被加密的规则被称为
安全策略
。
安全关联和安全策略都是由内核来维护的,
并可以通过用户态的程序来修改。
在能够这样做之前, 首先需要配置内核来让它支持
IPsec 和安全载荷封装
(ESP) 协议。 配置下面的内核选项
内核选项
IPSEC
options IPSEC
options IPSEC_ESP
然后重新编译、 安装最后重新启动新的内核。
在继续进行设置之前, 您需要在两台网关上都进行同样的设置。
IKE
在建立安全关联时有两种选择。
一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等,
另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。
我们推荐后者。 不说别的, 它配置起来要容易得多。
IPsec
security policies
setkey
用 &man.setkey.8; 可以编辑和显示安全策略。
打个比方, setkey 之于内核的安全策略表,
就相当于 &man.route.8; 之于内核中的路由表。
setkey 还可以显示当前的安全关联,
这一点和 netstat -r
类似。
在 FreeBSD 上可供选择的用于管理安全关联的服务程序有很多。
- 这篇文章将介绍其中的一种, racoon —。 它可以从
- &os; 的 Ports collection 中的
+ 这篇文章将介绍其中的一种, racoon —。
+ 它可以从 &os; 的 Ports collection 中的
security/ipsec-tools 安装。
racoon
racoon 软件,
必须在两台网关机上都运行。 需要配置 VPN 另一端的 IP, 以及一个密钥
(这个密钥可以任意选择, 但两个网关上的密钥必须一致)。
两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥)
然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。
它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行)
他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。
- racoon 的配置文件是存放在
+ racoon 的配置文件是存放在
${PREFIX}/etc/racoon 目录中的。
在那里应该能够找到一个配置文件, 不需要修改太多的设置。
- raccon 配置的另一部分, 也就是需要修改的内容,
+ raccon 配置的另一部分,也就是需要修改的内容,
是 预先配置的共享密钥
。
- 默认的 racoon 配置应该可以在
+ 默认的 racoon 配置应该可以在
${PREFIX}/etc/racoon/psk.txt 这个文件中找到。
需要强调的是, 这个密钥 并非 用于加密 VPN 连接的密钥,
他们只是密钥管理服务程序用以信任对方的一种凭据。
psk.txt 包含了需要打交道的每一个远程站点。
在本例中一共有两个站点, 每一个 psk.txt 都只有一行
(因为每个 VPN 接入点都只和一个端点连接)。
在网关机 #1 上应该是:
W.X.Y.Z secret
这包括了远程站点的 公网 IP 地址,
空格, 以及提供秘密的字符串。
很明显不应使用 secret
作为实际的密钥 --
通常的口令选择策略在这里也适用。
在网关 #2 上对应的配置是
A.B.C.D secret
也就是说, 对面端的公网 IP 地址, 以及同样的密钥。
psk.txt 的权限必须是
0600 (也就是说, 只有
- root 能够读写) 否则 racoon 将不能运行。
+ root 能够读写) 否则
+ racoon 将不能运行。
- 两边的机器上都必须执行 racoon。
+ 两边的机器上都必须执行 racoon。
另外, 还需要增加一些防火墙规则来允许 IKE 通讯通过,
它是通过 UDP 在 ISAKMP (Internet 安全关联密钥管理协议)
端口上运行的协议。 再次强调, 这个规则应该在规则集尽可能早的位置出现。
ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
- 一旦 racoon 开始运行, 就可以开始测试让网关进行相互的 ping 了。
+ 一旦 racoon 开始运行,
+ 就可以开始测试让网关进行相互的 ping 了。
此时连接还没有进行加密, 但
racoon 将在两个主机之间建立安全关联 --
- 这可能需要一段时间, 对您来说, 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。
+ 这可能需要一段时间, 对您来说,
+ 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。
一旦安全关联建立之后, 就可以使用 &man.setkey.8; 来查看它了。 在两边的网关上执行
setkey -D
就可以看到安全关联的相关信息了。
现在只完成了一半的工作。 另一半是设置安全策略。
想要完成一个有判断力的安全策略, 首先要看我们已经完成的步骤。
接下来的讨论针对连接的两端。
您所发出的每一个 IP 包都包括一个包头, 其内容是和这个包有关的描述性数据。
包头包括了包的来源和目的的 IP 地址。
正如我们所了解的那样, 私有 IP 地址,
例如 192.168.x.y
这样的地址范围, 不应该出现在 Internet 的公网上。
因此, 他们必须首先封装到别的包中。
包的来源或目的如果是私有 IP 地址,
则必须替换成公网 IP 地址。
因此如果发出的包类似下面这样:
.-------------------.
| Src: 192.168.1.1 |
| Dst: 192.168.2.1 |
| <其他头信息 > |
+-------------------+
| <包数据 > |
`-------------------'
随后它将被封装进另一个包中, 像下面这样:
.--------------------------.
| Src: A.B.C.D |
| Dst: W.X.Y.Z |
| <附加头信息 > |
+--------------------------+
| .----------------------. |
| | Src: 192.168.1.1 | |
| | Dst: 192.168.2.1 | |
| | <附加头信息 > | |
| +----------------------+ |
| | <包数据 > | |
| `----------------------' |
`--------------------------'
封装过程是在
gif 设备上完成的。 如上图所示,
包现在有了外部的实际 IP 地址, 而原始的包则被封装到里面作为数据。
这个包将通过 Internet 传递。
很明显地, 我们希望 VPN 之间的通讯是加密的。
用于言来描述大致是:
如果包从 A.B.C.D 发出且其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。
如果包来自 W.X.Y.Z 且其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。
这已经很接近了, 但还不够正确。 如果这么做的话,
所有来自和发到 W.X.Y.Z 的包,
无论是否属于 VPN 通讯都会被加密。 这可能并不是您所希望的,
因此正确的安全策略应该是
如果包从 A.B.C.D 发出, 且封装了其他的包,
其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。
如果包来自 W.X.Y.Z, 且封装了其他的包,
其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。
一个很小, 但却必要的改动。
安全策略也是通过 &man.setkey.8; 设置的。
&man.setkey.8; 提供了一种用于配置策略的语言。
可以直接在 stdin 上输入策略, 或通过
选项来指定一个包含配置命令的文件。
网关 #1 上的配置 (其
IP 地址是 A.B.C.D) 强制将所有到
W.X.Y.Z 的通讯进行加密的配置是:
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
把这些命令放到一个文件 (例如
/etc/ipsec.conf) 然后执行
&prompt.root; setkey -f /etc/ipsec.conf
会告诉 &man.setkey.8; 我们希望把规则加入到安全策略数据库中。
命令的其它部分指定了什么样的包能够匹配这规则。
A.B.C.D/32 和 W.X.Y.Z/32 是用于指定规则能够匹配的网络或主机的
IP 地址和掩码。 本例中, 希望应用到两个主机之间的通讯上。
则告诉内核这规则只应被用于封装其他包的那些数据包。
表示策略是针对发出的包的, 而
则表示需要对数据包进行加密。
第二行指定了如何加密。
是将要使用的协议,
而 则表示包应该进一步封装进一个
IPsec 包里面。 反复使用
A.B.C.D 和 W.X.Y.Z 用来选择所用的安全关联
而最后的 则强制所有匹配这规则的包都被加密。
上面的规则只匹配了发出的包。 接下来需要配置类似的匹配进入包的规则。
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
请注意本例中 代替了
并且 IP 地址的顺序也相反。
在另一个网关上 (其公网 IP 地址是
W.X.Y.Z) 也需要类似的规则。
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
最后是添加允许 ESP 和
IPENCAP 包进出的防火墙规则。 这些规则需要在两边分别设置。
ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
由于规则的对称性, 因此可以在两台网关上使用同样的规则。
发出的包如下图所示:
.------------------------------. --------------------------.
| Src: A.B.C.D | |
| Dst: W.X.Y.Z | |
| <other header info> | | Encrypted
+------------------------------+ | packet.
| .--------------------------. | -------------. | contents
| | Src: A.B.C.D | | | | are
| | Dst: W.X.Y.Z | | | | completely
| | <other header info> | | | |- secure
| +--------------------------+ | | Encap'd | from third
| | .----------------------. | | -. | packet | party
| | | Src: 192.168.1.1 | | | | Original |- with real | snooping
| | | Dst: 192.168.2.1 | | | | packet, | IP addr |
| | | <other header info> | | | |- private | |
| | +----------------------+ | | | IP addr | |
| | | <packet data> | | | | | |
| | `----------------------' | | -' | |
| `--------------------------' | -------------' |
`------------------------------' --------------------------'
当 VPN 数据被远端接到时, 它将首先被解密
- (使用 racoon 协商得到的安全关联)。
+ (使用 racoon 协商得到的安全关联)。
然后它们将进入
gif 接口, 并在那里展开第二层,
直到只剩下最里层的包, 并将其转发到内网上。
可以通过与之前同样的 &man.ping.8; 命令来测试安全性。
首先登录到
A.B.C.D 网关上并执行:
tcpdump dst host 192.168.2.1
在同一主机上登录另一会话, 执行
ping 192.168.2.1
此时的输出应该是:
XXX tcpdump output
如您看到的, &man.tcpdump.1; 给出的将是 ESP 包。
假如您想查看它们的内容可以使用 option 选项,
您将 (显然地) 看到一些乱码, 因为传输过程实施了加密。
祝贺您。 您已经完成了两个远程站点之间的 VPN 的架设工作。
小结
将两边的内核配置加入:
options IPSEC
options IPSEC_ESP
安装 security/ipsec-tools。 编辑两台网关上的
${PREFIX}/etc/racoon/psk.txt
并添加远程主机的 IP 和共享的密钥。 文件的权限应该是 0600。
将下面的设置加入两台主机的
/etc/rc.conf 中:
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
在两个网关上都建立 /etc/ipsec.conf
并添加必要的 spdadd。 在网关 #1 上是:
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
esp/tunnel/A.B.C.D-W.X.Y.Z/require;
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
esp/tunnel/W.X.Y.Z-A.B.C.D/require;
在网关 #2 上则是:
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
esp/tunnel/W.X.Y.Z-A.B.C.D/require;
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
esp/tunnel/A.B.C.D-W.X.Y.Z/require;
添加防火墙规则以允许 IKE, ESP, 和 IPENCAP
通讯能够到达各自的主机:
ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
前面的两步应该足以让 VPN 运转起来了。
两个网络上的机器都应该能通过 IP 来访问对方,
而所有的通讯都被自动地进行加密。
Chern
Lee
原著
OpenSSH
OpenSSH
安全
OpenSSH
OpenSSH 是一组用于安全地访问远程计算机的连接工具。
它可以作为 rlogin、
rsh rcp 以及
telnet 的直接替代品使用。
更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。
OpenSSH 对所有的传输进行加密,
从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。
OpenSSH 由 OpenBSD project 维护, 它基于
SSH v1.2.12 并包含了最新的错误修复和更新。
它同时兼容 SSH 协议的 1 和 2 两个版本。
使用 OpenSSH 的好处
一般说来, 在使用 &man.telnet.1; 或 &man.rlogin.1; 时,
数据是以未经加密的明文的形式发送的。 这样一来,
在客户机和服务器之间的网络上运行的听包程序,
便可以在会话中窃取到传输的用户名/密码和数据。
OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。
启用 sshd
OpenSSH
启用
sshd 的启用是作为 &os; 安装中
Standard 安装过程中的一步来进行的。 要查看
sshd 是否已被启用, 请检查
rc.conf 文件中的:
sshd_enable="YES"
这表示在下次系统启动时加载 OpenSSH
的服务程序 &man.sshd.8;。 此外, 也可以手动使用 &man.rc.8;
脚本 /etc/rc.d/sshd
来启动 OpenSSH:
/etc/rc.d/sshd start
SSH 客户
OpenSSH
客户
&man.ssh.1; 的工作方式和
&man.rlogin.1; 非常类似。
&prompt.root; ssh user@example.com
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)? yes
Host 'example.com' added to the list of known hosts.
user@example.com's password: *******
登录过程和使用
rlogin 或
telnet 建立的会话非常类似。
在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。
只有在第一次连接时, 用户会被要求输入
yes。 之后的连接将会验证预先保存下来的密钥指纹。
如果保存的指纹与登录时接收到的不符, 则将会给出警告。
指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是
~/.ssh/known_hosts2。
默认情况下, 较新版本的
OpenSSH 只接受 SSH v2
连接。 如果能用版本 2 则客户程序会自动使用,
否则它会返回使用版本 1 的模式。 此外,
也可以通过命令行参数 或
来相应地强制使用版本 1 或 2。
保持客户端的版本 1 能力是为了考虑较早版本的兼容性。
安全复制
OpenSSH
安全复制
scp
&man.scp.1; 命令和
&man.rcp.1;; 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来,
区别是它是安全的。
&prompt.root; scp user@example.com:/COPYRIGHT COPYRIGHT
user@example.com's password: *******
COPYRIGHT 100% |*****************************| 4735
00:00
&prompt.root;
由于先前的例子中已经保存了指纹, 使用 &man.scp.1;
时会自动地加以验证。
&man.scp.1; 使用的参数同
&man.cp.1; 类似。 第一个参数是一个或一组文件,
然后是复制的目标。 由于文件是通过 SSH 在网上传递的,
因此某些文件的名字需要写成
。
配置
OpenSSH
配置
针对 OpenSSH
服务程序和客户端的系统级配置文件在 /etc/ssh
目录中。
ssh_config 用于配置客户端的设定,
而 sshd_config 则用于配置服务器端。
另外
(默认是 /usr/sbin/sshd), 以及
这两个 rc.conf
选项提供了更多的配置选择。
ssh-keygen
用于取代口令的一种方法是使用 &man.ssh-keygen.1; 来生成
DSA 或 RSA 密钥对用于验证用户的身份:
&prompt.user; ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_dsa.
Your public key has been saved in /home/user/.ssh/id_dsa.pub.
The key fingerprint is:
bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com
&man.ssh-keygen.1; 会生成一个包含公私钥对用于验证身份。 私钥将保存到
~/.ssh/id_dsa 或
~/.ssh/id_rsa, 而公钥则被存放到
~/.ssh/id_dsa.pub 或
~/.ssh/id_rsa.pub, 文件名取决于您选择的
DSA 和 RSA
密钥类型。 RSA 或者 DSA
公钥必须被存放到远程机器上的
~/.ssh/authorized_keys 才能够使系统正确运转。
这将允许从远程连接时以基于
SSH 密钥的验证来代替口令验证。
如果在 &man.ssh-keygen.1; 中使用了通行字,
则每次使用私钥时都需要输入它。 &man.ssh-agent.1;
能够缓解多次输入长通行字的压力, 并将在接下来的
予以详述。
选项和配置文件可能随 OpenSSH
的版本不同而不同; 为了避免出现问题,
您应参考 &man.ssh-keygen.1; 联机手册。
这将使到远程机器的连接基于 SSH 密钥而不是口令。
如果在运行 &man.ssh-keygen.1; 时使用了通行字,
每次使用私钥的时候用户都将被要求输入通行字。 &man.ssh-agent.1;
能够减缓重复输入较长通行字的负担, 有关更详细的探究在
下一节 .
随着你系统上的 OpenSSH
版本的不同,各种选项和配置文件也会不同; 为了避免此类问题,
你需要参阅 &man.ssh-keygen.1; 联机手册。
ssh-agent 和 ssh-add
&man.ssh-agent.1; 和 &man.ssh-add.1; 这两个工具,
提供了一种将 SSH 秘钥加载到内存中以便使用,
而不必每次都输入通行字的方法。
&man.ssh-agent.1; 工具能够使用加载到其中的私钥来处理验证过程。
&man.ssh-agent.1; 应被用于启动另一个应用程序。 最基本的用法是,
使用它来启动 shell, 而高级一些的用法则是用它来启动窗口管理器。
要在 shell 中使用 &man.ssh-agent.1;, 首先应把 shell
作为参数来启动它。 随后, 应通过 &man.ssh-add.1; 并输入通行字,
来向它提供身份验证信息。 一旦这些步骤都做完了,
用户就应该能够 &man.ssh.1; 到任何一个安装了对应公钥的机器了。
例如:
&prompt.user; ssh-agent csh
&prompt.user; ssh-add
Enter passphrase for /home/user/.ssh/id_dsa:
Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
&prompt.user;
要在 X11 中使用 &man.ssh-agent.1;, 调用
&man.ssh-agent.1; 的过程应置于
~/.xinitrc 之中。 这将把
&man.ssh-agent.1; 服务提供给所有在 X11 中运行的程序。
下面是一个 ~/.xinitrc 文件的实例:
exec ssh-agent startxfce4
这将启动 &man.ssh-agent.1;, 而后者将在每次 X11
启动时运行 XFCE。
作完这些之后就可以重启 X11 以便使修改生效。
随后您就可以运行 &man.ssh-add.1; 来加载全部 SSH 密钥了。
SSH 隧道
OpenSSH
隧道
OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。
下面的命令告诉 &man.ssh.1; 为 telnet 创建一个隧道:
&prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
&prompt.user;
上述 ssh 命令使用了下面这些选项:
强制 ssh 使用第2版的协议
(如果需要和较老的 SSH 一同工作请不要使用这个选项)。
表示不使用命令行, 或者说只使用隧道。 如果省略,
ssh 将同时初始化会话。
强制 ssh 在后台执行。
表示产生一条
本地端口:远程主机:远程端口
形式的隧道。
远程 SSH 服务器。
SSH 隧道通过监听
localhost 上面指定端口来完成工作。
它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。
本例中, 位于 localhost 的 5023 端口
被用于转发 localhost 的连接到远程主机的
23 端口。
由于 23 是 telnet 使用的,
因此它将通过 SSH 隧道完成 telnet 会话。
这可以用来封装任意不安全的 TCP 协议, 例如
SMTP、 POP3、 FTP等等。
使用 SSH 为 SMTP 创建安全隧道
&prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
user@mailserver.example.com's password: *****
&prompt.user; telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP
这可以与
&man.ssh-keygen.1; 以及额外的用户帐号配合来建立一个更透明的 SSH
隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。
实用的 SSH 通道例子
加强 POP3 服务的安全
工作时, 有一个允许外来连接的 SSH 服务器。
同一个办公网络中有一个邮件服务器提供 POP3 服务。
这个网络, 或从您家到办公室的网络可能不,
或不完全可信。 基于这样的原因,
您需要以安全的方式来查看邮件。
解决方法是创建一个到办公室 SSH 服务器的连接,
并通过这个连接来访问 POP3 服务:
&prompt.user; ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
user@ssh-server.example.com's password: ******
当这个通道连上时, 您可以把 POP3 请求发到
localhost 端口 2110。
这个连接将通过通道安全地转发到
mail.example.com。
绕过严厉的防火墙
一些大脑长包的网络管理员会使用一些极端的防火墙策略,
不仅过滤进入的连接, 而且也过滤连出的连接。
一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行
SSH 和网页浏览。
您可能希望访问一些其它的 (也许与工作无关的) 服务,
例如提供音乐的 Ogg Vorbis 流媒体服务器。
如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐,
则您将无法访问它。
解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH
服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。
&prompt.user; ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
user@unfirewalled-system.example.org's password: *******
现在您可以把客户程序指定到
localhost 的 8888 端口, 它将把请求转发给
music.example.com 的 8000
端口, 从而绕过防火墙。
允许用户登录 AllowUsers 选项
通常限制哪些用户能够登录, 以及从何处登录会是好主意。
采用 AllowUsers 选项能够方便地达到这一目的。
例如, 想要只允许 root 用户从
192.168.1.32 登录, 就可以在
/etc/ssh/sshd_config 文件中加入下述设置:
AllowUsers root@192.168.1.32
要允许用户 admin 从任何地方登录,
则只需列出用户名:
AllowUsers admin
可以在同一行指定多个用户, 例如:
AllowUsers root@192.168.1.32 admin
列出需要登录机器的用户很重要; 否则他们将被锁在外面。
在完成对
/etc/ssh/sshd_config 的修改之后您必须告诉
&man.sshd.8; 重新加载其配置文件, 方法是执行:
&prompt.root; /etc/rc.d/sshd reload
进一步的资料
OpenSSH
&man.ssh.1; &man.scp.1; &man.ssh-keygen.1;
&man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5;
&man.sshd.8; &man.sftp-server.8; &man.sshd.config.5;
Tom
Rhodes
作者
ACL
文件系统访问控制表
与文件系统在其他方面的加强, 如快照等一道, &os; 5.0
及更高版本提供了通过文件系统访问控制表
(ACL) 实现的安全机制。
访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix;
权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。
如果想为 UFS 文件系统启用 ACL
支持, 则需要添加下列选项:
options UFS_ACL
并重新编译内核。 如果没有将这个选项编译进内核,
则在挂接支持 ACL 的文件系统时将会收到警告。
这个选项在 GENERIC 内核中已经包含了。
ACL 依赖于在文件系统上启用扩展属性。
在新一代的 &unix; 文件系统,
UFS2 中内建了这种支持。
在 UFS1 上配置扩展属性需要比 UFS2
更多的管理开销。 而且, 在 UFS2
上的扩展属性的性能也有极大的提高。
因此, 如果想要使用访问控制表, 推荐使用 UFS2
而不是 UFS1。
ACL 可以在挂接时通过选项
来启动, 它可以加入 /etc/fstab。
另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 ACL
标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法,
其原因是:
挂接时的 ACL 标记无法被重挂接
(&man.mount.8; ) 改变, 只有完整地
&man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。
这意味着 ACL 状态在系统启动之后就不可能在 root 文件系统上发生变化了。
另外也没有办法改变正在使用的文件系统的这个状态。
在超级块中的设置将使得文件系统总被以启用
ACL 的方式挂接, 即使在
fstab 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。
这避免了不慎将文件系统以没有启用 ACL 的状态挂接,
从而避免没有强制 ACL 这样的安全问题。
可以修改 ACL 行为, 以允许在没有执行一次全新的
&man.mount.8; 的情况下启用它, 但我们认为, 不鼓励在未启用
ACL 时这么做是有必要的, 因为如果启用了
ACL, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。
一般而言, 一旦启用了文件系统的 ACL 就不应该再关掉它,
因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容,
而重新启用 ACL 将重新把先前的
ACL 附着到文件上, 而由于它们的权限发生了变化,
就很可能造成无法预期的行为。
在查看目录时, 启用了 ACL 的文件将在通常的属性后面显示 +
(加号)。 例如:
drwx------ 2 robert robert 512 Dec 27 11:54 private
drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1
drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2
drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3
drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html
这里我们看到了 directory1、
directory2, 以及 directory3
目录使用了 ACL。 而
public_html 则没有。
使用 ACL
文件系统 ACL 可以使用
&man.getfacl.1; 工具来查看。 例如, 如果想查看 test 的
ACL 设置, 所用的命令是:
&prompt.user; getfacl test
#file:
#owner:1001
#group:1001
user::rw-
group::r--
other::r--
要修改这个文件上的 ACL 设置,
则需要使用 &man.setfacl.1; 工具。 例如:
&prompt.user; setfacl -k test
参数将把所有当前定义的
ACL 从文件或文件系统中删除。
一般来说应该使用 因为它会保持让
ACL 正常工作的那些项不变。
&prompt.user; setfacl -m u:trhodes:rwx,group:web:r--,o::--- test
在前面的命令中, -m
选项被用来修改默认的 ACL 项。由于已经被先前的命令
删除,因此没有预先定义的项,于是默认的选项被恢复,并附加上指定的选项。
请小心地检查,如果您加入了一个不存在的用户或组,那么将会在
stdout 得到一条 Invalid argument
的错误提示。
Tom
Rhodes
Contributed by
Portaudit
监视第三方安全问题
过去几年中, 安全领域在如何处理漏洞的评估方面取得了长足的进步。
几乎每一个操作系统都越来越多地安装和配置了第三方工具,
而系统被入侵的威胁也随之增加。
漏洞的评估是安全的一个关键因素,
尽管 &os; 会发布基本系统的安全公告,
然而为每一个第三方工具都发布安全公告则超出了 &os; Project
的能力。 在这一前提下, 一种减轻第三方漏洞的威胁,
并警告管理员存在已知的安全问题的方法也就应运而生。 名为
Portaudit 的 &os; 附加工具能够帮助您达成这一目的。
ports-mgmt/portaudit port
会下载一个数据库, 这一数据库是由 &os; Security
Team 和 ports 开发人员维护的, 其中包含了已知的安全问题。
要开始使用 Portaudit,
需要首先从 Ports Collection 安装它:
&prompt.root; cd /usr/ports/ports-mgmt/portaudit && make install clean
在安装过程中,
&man.periodic.8; 的配置文件将被修改, 以便让
Portaudit 能够在每天的安全审计过程中运行。
一定要保证发到 root 帐号的每日安全审计邮件确实有人在读。
除此之外不需要进行更多的配置了。
安装完成之后, 管理员可以通过下面的命令来更新数据库,
并查看目前安装的软件包中所存在的已知安全漏洞:
&prompt.root; portaudit -Fda
由于每天执行
&man.periodic.8; 时都会自动更新数据库, 因此,
运行这条命令是可选的。 在这里只是作为例子给出。
在任何时候, 如果希望对通过 Ports Collection
安装的第三方软件工具进行审计, 管理员都可以使用下面的命令:
&prompt.root; portaudit -a
针对存在漏洞的软件包, Portaudit
将生成类似下面的输出:
Affected package: cups-base-1.1.22.0_1
Type of problem: cups-base -- HPGL buffer overflow vulnerability.
Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html>
1 problem(s) in your installed packages found.
You are advised to update or deinstall the affected package(s) immediately.
通过访问上面给出的 URL,
管理员能够了解关于那个漏洞的进一步信息。
这些信息通常包括受到影响的 &os; Port 版本,
以及其他可能包含安全公告的网站。
简而言之, Portaudit
是一个强大的工具, 并能够配合
Portupgrade port
来非常有效地工作。
Tom
Rhodes
作者
FreeBSD 安全公告
&os; 安全公告
像其它具有产品级品质的操作系统一样, &os; 会发布
安全公告
。
通常这类公告会只有在相应的发行版本已经正确地打过补丁之后发到安全邮件列表并在勘误中说明。
本节将介绍什么是安全公告, 如何理解它, 以及为系统打补丁的具体步骤。
安全公告看上去是什么样子?
&os; 安全公告的样式类似下面的范例, 这一例子来自
&a.security-notifications.name; 邮件列表。
=============================================================================
&os;-SA-XX:XX.UTIL Security Advisory
The &os; Project
Topic: denial of service due to some problem
Category: core
Module: sys
Announced: 2003-09-23
Credits: Person@EMAIL-ADDRESS
Affects: All releases of &os;
&os; 4-STABLE prior to the correction date
Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE)
2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6)
2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15)
2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8)
2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18)
2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21)
2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33)
2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43)
2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39)
CVE Name: CVE-XXXX-XXXX
For general information regarding FreeBSD Security Advisories,
including descriptions of the fields above, security branches, and the
following sections, please visit
http://www.FreeBSD.org/security/.
I. Background
II. Problem Description
III. Impact
IV. Workaround
V. Solution
VI. Correction details
VII. References
Topic(标题) 一栏说明了问题到底是什么。
它基本上是对所发现的安全问题及其所涉及的工具的描述。
Category (分类) 是指系统中受到影响的组件,
这一栏可能是 core、 contrib,
或者 ports 之一。 core
分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。
contrib 分类表示弱点存在于某个捐赠给
&os; Project 的软件, 例如
sendmail。
最后是 ports, 它表示该弱点影响了 Ports
Collection 中的某个第三方软件。
Module(模块) 一栏给出了组件的具体位置,
例如 sys。 在这个例子中, 可以看到
sys 模块是存在问题的; 因此,
这个漏洞会影响某个在内核中的组件。
Announced(发布时间) 一栏反映了与安全公告有关的数据是什么时候公之于众的。
这说明安全团队已经证实问题确实存在, 而补丁已经写入了 &os;
的代码库。
Credits(作者) 一栏给出了注意到问题存在并报告它的个人或团体。
The Affects(影响范围) 一栏给出了 &os; 的哪些版本存在这个漏洞。
对于内核来说, 检视受影响的文件上执行的 ident 输出可以帮助确认文件版本。
对于 ports, 版本号在 /var/db/pkg 里面的 port 的名字后面列出。
如果系统没有与 &os; CVS 代码库同步并每日构建,
它很可能是有问题的。
Corrected(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。
在公共漏洞数据库 (Common Vulnerabilities Database) 系统中预留的,
用于查看漏洞的标识信息。
Background(技术背景) 一栏提供了受影响的组件的作用。
多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。
Problem Description(问题描述) 一栏深入阐述安全漏洞的技术细节。
这部分有时会包括有问题的代码相关的详细情况,
甚至是这个部件如何能够被恶意利用并打开漏洞的细节。
Impact(影响) 一栏描述了问题能够造成的影响类型。
例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。
Workaround(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。
这些原因可能包括时间限制, 网络资源的限制, 或其它因素。
不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁,
要么应该实施这种应急方案。
Solution(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。
这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。
=Correction Details(修正细节) 一栏展示了针对
CVS 分支或某个发行版的修正特征。
同时也提供了每个分支上相关文件的版本号。
References(文献) 一栏通常会给出其它信息的来源。
这可能包括 URL, 书籍、 邮件列表以及新闻组。
Tom
Rhodes
Contributed by
进程记帐
进程记帐
进程记帐是一种管理员可以使用的跟踪系统资源使用情况的手段,
包括它们分配给了哪些用户、 提供系统监视手段,
并且可以精细到用户执行的每一个命令。
当然, 这种做法是兼有利弊的。 它的好处是,
查找入侵时可以迅速把范围缩小到攻击者进入的时刻;
而这样做的缺点, 则是记帐会产生大量的日志,
因而需要很多磁盘空间来存储它们。
这一节将带领管理员一步一步地配置基本的进程记帐。
启用并利用进程记帐
在使用进程记帐之前, 必须先启用它。
要完成这项工作, 需要运行下面的命令:
&prompt.root; touch /var/account/acct
&prompt.root; accton /var/account/acct
&prompt.root; echo 'accounting_enable="YES"' >> /etc/rc.conf
一旦启用之后, 记帐就会开始跟踪
CPU 统计数据、 命令, 等等。
所有的记帐日志不是以可读的方式记录的, 要查看它们,
需要使用 &man.sa.8; 这个工具。 如果没有给出其他参数, 则
sa 将按用户, 以分钟为单位显示他们所使用的时间、
总共的 CPU 和用户时间,
以及平均的 I/O 操作数目, 等等。
要显示关于刚刚发出的命令的相关信息,
则应使用 &man.lastcomm.1; 工具。
lastcomm 命令可以用来显示在某一 &man.ttys.5;
上的用户信息, 例如:
&prompt.root; lastcomm ls
trhodes ttyp1
将会显示出所有已知的 trhodes
在 ttyp1 终端上执行 ls 的情况。
更多的可用选项在联机手册
&man.lastcomm.1;、 &man.acct.5; 和 &man.sa.8; 中有所介绍。
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml
index 76167c257f..b946172743 100644
--- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml
@@ -1,2545 +1,2576 @@
串口通讯
概述
串口通讯
+
&unix; 一直都是支持串口通讯的。事实上,
早期的 &unix; 系统就是利用串口线来输入和输出数据的。
那时常见的 终端
包括一个每秒10个字符的串口打印机和键盘,
现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD
进行串口通讯的方法。
读完这章,您将了解到:
+
- 如何通过终端连接到您的FreeBSD系统。
- 如何使用modem拨号到远程主机。
- 如何允许远程用户通过modem登录到您的系统。
- 如何从串口控制台引导您的系统。
+
+ 如何通过终端连接到您的FreeBSD系统。
+
+
+ 如何使用modem拨号到远程主机。
+
+
+ 如何允许远程用户通过modem登录到您的系统。
+
+
+ 如何从串口控制台引导您的系统。
+
阅读这章之前,您应当了解:
+
- 如何配置和安装一个新的内核 ()。
- 理解 &unix; 的权限和进程 ()。
- 准备您打算在 FreeBSD 中使用的串口设备 (modem 或多插口卡)
- 的技术参考手册。
+
+ 如何配置和安装一个新的内核 ()。
+
+
+ 理解 &unix; 的权限和进程 ()。
+
+
+ 准备您打算在 FreeBSD 中使用的串口设备
+ (modem 或多插口卡)的技术参考手册。
+
介绍
术语
bits-per-second
bps
每秒位— 数据的传输速度
DTE
DTE
数据终端设备 — 如您的计算机
DCE
DCE
数据通讯设备 — 如您的modem
RS-232
RS-232C cables
用于硬件串口通讯的EIA标准
当讨论通讯数据速度的时候,这节不会使用术语
baud
。Baud指电气标准传输率,它已经使用了很长时间,
而 bps
(bits per second) 才是正确使用的术语
(至少它不会打扰那些爱争吵的家伙)。
线缆和端口
要将 modem 或终端与您的 FreeBSD 系统相连,
您的计算机需要一个串口, 以及用于连接串口设备所需的线缆。
如果您比较熟悉硬件及所需要的电缆, 则可以跳过这节。
线缆
串口线缆有许多不同的种类。 最常见的两种类型是 null-modem
线缆和标准 (直联
) RS-232 线缆。
您的硬件说明书中会介绍应使用的线缆种类。
Null-modem线缆
null-modem cable
null-modem 电缆会直接传送某些信号, 如 Signal
Ground
(信号地), 但对其他信号进行交换。
例如, Transmitted Data
(数据发送) 引脚是连到另一端
Received Data
(数据接收) 引脚的。
也可以自行制作 null-modem 电缆给终端使用 (例如, 为了品质的要求)。
下面的表格展示了 RS-232C
信号,
以及 DB-25 连接器上的引脚。 注意, 标准也要求一根直通引脚 1 到引脚 1
的 保护地 (Protective Ground)
线, 但这通常都被省掉。 某些终端在只有引脚 2、 3 和 7 的时候,
就已经能够正常使用了, 而其他一些,
则需要下面例子中所展示的不同的配置。
DB-25 to DB-25 Null-Modem Cable
信号
引脚 #
引脚 #
信号
SG
7
连接到
7
SG
TD
2
连接到
3
RD
RD
3
连接到
2
TD
RTS
4
连接到
5
CTS
CTS
5
连接到
4
RTS
DTR
20
连接到
6
DSR
DTR
20
连接到
8
DCD
DSR
6
连接到
20
DTR
DCD
8
连接到
20
DTR
这里还有两种目前比较流行的其他接线方式。
DB-9 到 DB-9 Null-Modem 电缆
信号
引脚 #
引脚 #
信号
RD
2
接到
3
TD
TD
3
接到
2
RD
DTR
4
接到
6
DSR
DTR
4
接到
1
DCD
SG
5
接到
5
SG
DSR
6
接到
4
DTR
DCD
1
接到
4
DTR
RTS
7
接到
8
CTS
CTS
8
接到
7
RTS
DB-9 到 DB-25 Null-Modem 电缆
信号
引脚 #
引脚 #
信号
RD
2
DB-9 到 DB-25 Null-Modem 电缆
2
TD
TD
3
接到
3
RD
DTR
4
接到
6
DSR
DTR
4
接到
8
DCD
SG
5
接到
7
SG
DSR
6
接到
20
DTR
DCD
1
接到
20
DTR
RTS
7
接到
5
CTS
CTS
8
接到
4
RTS
当某一段连接器上的一个引脚需要连接到对端的一对引脚时,
通常是将那一对引脚使用一短线连接,
而使用长线接到另一端的那个引脚。
上面的设计似乎更为流行。 在其他变种中 (在 RS-232 Made
Easy 这本书中进行了详细介绍) 则是 SG 接 SG,
TD 接 RD、 RTS 和
CTS 接 DCD、 DTR 接 DSR, 反之亦然。
标准RS-232C线缆
RS-232C cables
标准的串口电缆会直接传送所有 RS-232C 信号。
也就是说, 一头的 Transmitted Data
引脚,
会直接接到另一头的 Transmitted Data
引脚。
这包括将调制解调器接到您的
FreeBSD 系统上的那种电缆, 同样也适用于某些型号的终端。
端口
串口是FreeBSD主机与终端传输数据的设备。
这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。
端口的种类
有好几种串口。 在采购或制作线缆之前,
您应确认它能够适合您的终端以及 FreeBSD 系统。
绝大多数终端都提供 DB-25 端口。 个人计算机,
也包括运行 FreeBSD 的 PC 机, 通常会有 DB-25 或 DB-9 口。
如果您的 PC 上有多插口串口卡, 则可能有 RJ-12 或
RJ-45 口。
请参见您硬件的文档以了解所用接口的规格。
此外, 您也可以通过观察外观来了解所用的端口。
端口名称Port Names
在FreeBSD中,您可以通过 /dev
目录中的一个记录来访问每个串口。有两种不同的记录:
呼入端口被命名为/dev/ttydN,
这里 N 是端口号,从零开始。
通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测
(DCD) 信号来工作。
呼出端口被命名为 /dev/cuadN。
您通常不使用呼出端口作为终端, 只使用modem。
如果串口线或终端不支持载波检测数据传输,
您可以使用呼出端口。
在 &os; 5.X 和更早版本中, 呼出端口的名字是
/dev/cuaaN。
如果您已经连接一个终端到第一个串口 (在 &ms-dos;
上是COM1),
则可以使用 /dev/ttyd0 来作为终端。
如果它是在第二个串口 (COM2),
那就是 /dev/ttyd1,等等。
内核配置
FreeBSD默认支持4个串口。 在&ms-dos;下,这些是
COM1,
COM2,
COM3,
和
COM4。 FreeBSD 目前支持 dumb
多口串口卡,如 BocaBoard 1008 和 2016, 以及许多 Digiboard
和 Stallion Technologies 制造的智能多接口卡。 不过,
默认的内核只会寻找标准的COM端口。
要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息,
或使用 /sbin/dmesg 命令重新检测内核启动信息。
特别的,寻找以sio字符启动的信息。
如果想只察看包含
sio 一词的消息, 可以使用下面的命令:
&prompt.root; /sbin/dmesg | grep 'sio'
例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息:
sio0 at 0x3f8-0x3ff irq 4 on isa
sio0: type 16550A
sio1 at 0x2f8-0x2ff irq 3 on isa
sio1: type 16550A
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
sio3 at 0x2e8-0x2ef irq 9 on isa
sio3: type 16550A
如果内核未能认出所有的串口, 可能需要通过修改
/boot/device.hints 文件来进行一些配置。
此外, 也可以注释或完全删除掉您没有的设备。
请参见 &man.sio.4; 联机手册来了解关于串口,
以及多插口卡配置的进一步细节。 如果您正使用一个在不同版本的
FreeBSD 上的文件请务必小心, 因为设备参数和语法发生了变化。
这里端口 IO_COM1 代替了
0x3f8,端口 IO_COM2 代替了
0x2f8,端口 IO_COM3 代替了
0x3e8,端口 IO_COM4 代替了
0x2e8,这些都是各自端口相应的端口地址。
中断4,3,5,9都是经常用的中断。也要注意有些正常的串口可能
无法 在一些ISA总线的PC上共享中断
(多插口板卡有板载的电子设备,允许在板上所有 16550A
的设备共享一个或两个中断请求)。
设备特殊文件
在内核中, 大多数设备都是通过 设备特殊文件
来访问的,
这些文件一般位于 /dev 目录中。
sio 是通过
/dev/ttydN (呼入)
和 /dev/cuadN
(呼出) 设备来访问的。 此外, FreeBSD 也提供了初始化设备
(在 &os; 6.X 上是
/dev/ttydN.init 以及
/dev/cuadN.init,
而在 &os; 5.X 上则是
/dev/ttyidN 和
/dev/cuaiaN) 以及锁设备
(在 &os; 6.X 上是
/dev/ttydN.lock 和
/dev/cuadN.lock,
而在 &os; 5.X 上则是
/dev/ttyldN 和
/dev/cualaN)。
初始化设备用于在打开端口时初始化其通讯参数, 例如使用
RTS/CTS 信号进行流控制的调制解调器的
crtscts。 锁设备则用于在端口上提供一个锁标志,
防止用户或程序改变特定的参数; 请参见 &man.termios.4;、
&man.sio.4;, 以及 &man.stty.1; 的联机手册, 以了解关于终端配置、
锁和初始化设备, 以及配置终端参数的详细信息。
串口配置
ttyd
cuad
ttydN (或
cuadN)
设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时,
它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置:
&prompt.root; stty -a -f /dev/ttyd1
当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。
当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整
初始状态
设备的设置。例如,
要为ttyd5 打开
模式,8位通讯和默认的 流控制,
输入:
&prompt.root; stty -f /dev/ttyd5.init clocal cs8 ixon ixoff
rc files
rc.serial
串口设备的系统级初始化,
是由 /etc/rc.d/serial 来控制的。
这个文件会影响串口设备的默认设置。
为了防止应用程序修改某些设置,
应修改 lock state
(锁状态) 设备。 例如, 要把
ttyd5 的速率锁定为 57600 bps, 输入:
&prompt.root; stty -f /dev/ttyd5.lock 57600
现在,一个打开ttyd5
和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地,
您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。
很显然,您应该只让 root
用户可以初始化或锁定设备的状态。
Sean
Kelly
Contributed by
终端
终端
当您在计算机控制台或是在一个连接的网络上时,
终端提供了一个方便和低成本的访问 FreeBSD 系统的方法。
这节描述了如何在 FreeBSD 上使用终端。
终端的用法和类型
早期的 &unix; 系统没有控制台。
人们通过将终端连接到计算机的串口来登录和使用程序。
它很像用 modem 和一些终端软件来拨号进入一个远程的系统,
只能执行文本的工作。
今天的 PC 已经可以使用高质量的图形了,
但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。
通过使用一个终端连接到一个没有使用的串口,
您就能登录和运行任何文本程序或在 X 视窗系统中运行一个
xterm 窗口程序。
对于商业用户,您可以把任何终端连接到 FreeBSD 系统,
然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的
IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD
的高性能机器上。
对于FreeBSD,有三种终端:
哑终端
充当终端的PC
X 终端
下面一小节将描述每一种终端。
哑终端
哑终端需要专门的好几种硬件,让您通过串口线连接到计算机。
它们被叫做 哑
是因为它们只能够用来显示,
发送和接收文本。 您不能在它上面运行任何程序。
有好几百种哑终端,包括Digital Equipment Corporation
的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。
一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。
哑终端被广泛用于那些不需要图形应用的工作中。
充当终端的PC
假如 哑终端 的功能仅限于显示、
发送和接收文本的话, 那么显然任何一台闲置的个人计算机,
都完全能够胜任哑终端的工作。 因此您需要的是合适的线缆,
以及一些在这台计算机上运行的 终端仿真
软件。
这种配置在家庭中应用十分广泛。 例如, 如果您的爱人正忙于在您的
FreeBSD 系统的控制台上工作时,
您就可以将一台功能稍弱的计算机挂在这个 FreeBSD
系统上来同时完成一些文本界面的工作。
在 &os; 的基本系统中至少有两个能用于进行串口连接的工具:
&man.cu.1; 和 &man.tip.1;。
如果要从运行 &os; 的计算机上通过串口连接到另一系统,
可以使用:
&prompt.root; cu -l 串口设备
此处 串口设备
表示您计算机上某个串口对应的设备名。
在 &os; 6.0 之前的版本中, 这些设备的名字是
/dev/cuaaN,
而在 6.0 和更新一些的版本中, 则是
/dev/cuadN。
此处的 N
表示串口的编号。
请注意在 &os; 中设备的编号是从零而非一开始的
(这一点与另一些系统, 如基于 &ms-dos; 的系统不同)。
- 因此, 在基于 &ms-dos; 系统中的 COM1
在 &os;
+ 因此, 在基于 &ms-dos; 系统中的
+ COM1 在 &os;
中通常叫做 /dev/cuad0。
其他一些人可能喜欢使用另一些来自 Ports 套件的程序。
Ports 中提供了几个与 &man.cu.1; 和
&man.tip.1; 类似的工具,
例如 comms/minicom。
X 终端
X终端是最复杂的终端系统。它们通常需要使用以太网来连接。
它们能显示任何X应用程序。
我们介绍X终端只是为了感兴趣。然而,
这章不会涉及X终端的安装,配置或使用。
配置
这节描述了您在一个终端上启用一个登录会话时, 需要在 FreeBSD
系统上进行的配置。 假设已经配置好了内核来支持串口,
就可以直接开始连接了。
在 中曾经提到, init
进程依赖于系统启动时所有的处理控制和初始化。
通过 init 来执行的一些任务将先读取
/etc/ttys文件,
然后在可用的终端上启用一个 getty 进程。
getty 进程可用来阅读一个登录名和启动
login程序。
然而,要为您的FreeBSD系统配置终端,您需要以
root 身份执行下面的步骤:
如果它不在那里, 您需要为串口在
/dev 目录下添加一行记录到
/etc/ttys。
指定 /usr/libexec/getty 在端口上运行,
然后从 /etc/gettytab 文件指定适当的
getty 类型。
指定默认的终端类型。
设置端口为 on
。
确定端口是否为 secure
。
迫使init 重新读取
/etc/ttys文件。
作为可选的步骤,您可以通过在 /etc/gettytab
中建立一个记录,在第2步创建一个定制的
getty 类型来使用。这章不会介绍如何做。
您可以参考 &man.gettytab.5; 和 &man.getty.8;
的联机手册了解更多信息。
添加一个记录到/etc/ttys
/etc/ttys文件列出了您
FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台
- ttyv0 在这个文件中有一个记录。
+ ttyv0 在这个文件中有一个记录。
您可以使用这个记录登录进控制台。
这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。
对于一个硬连线的终端, 只要列出串口的
/dev 记录而不需要
/dev 部分 (例如,
/dev/ttyv0 可以被列为
ttyv0)。
默认的 FreeBSD 安装包括一个支持最初四个串口
- ttyd0 到 ttyd3
+ ttyd0 到 ttyd3
的/etc/ttys 文件。
如果您从那些端口中某一个使用终端,您不需要添加另一个记录。
在
/etc/ttys 中增加终端记录
假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行
Procomm 终端软件模拟一个
VT-100 终端的286IBM PC。 在 /etc/ttys
文件中的相应的记录是这样的:
ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure
ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure
第一部分指定了终端指定文件的名称, 它可以在
/dev中找到。
-
+
第二部分是在这行执行的命令,通常是 &man.getty.8;。
getty 初始化然后打开一行,设置速度,
用户名的命令和执行登录程序。
getty 程序在它的命令行接收一个参数 (可选),
getty 类型。 一个
getty 类型会在终端行描述一个特征,
像波特率和奇偶校验。 getty 程序从
/etc/gettytab 文件读取这些特征。
文件/etc/gettytab
包含了许多老的和新的终端行记录。
在很多例子中,启动文本 std
的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。
这是一个从110到115200 bit/s的 std 记录。
当然,您可以添加您自己的记录到这个文件。
gettytab 的联机手册提供了更多的信息。
当在/etc/ttys中设置
getty 类型的时候,
确信在终端上的通讯设置匹配。
在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s
来连接。286 PC不使用奇偶性,用19200bit/s来连接。
-
-
第三部分是通常连接到那个tty行的终端类型。对于拨号端口,
unknown 或 dialup
通常被用在这个地方。 对于硬连线的终端,终端类型不会改变,
所以您可以从termcap数据库文件中放一个真正的终端类型。
在我们的例子中, Wyse-50 使用真正的终端类型,
而运行 Procomm 的286
PC将被设置成在VT-100上的模拟。
-
如果端口被启用,可以指定第四个部分。在第二部分,
把它放在这儿将执行初始化进程来启动程序
getty。如果您在这部分拖延,
将没有getty,在端口上因此就没有登录。
最后部分被用来指定端口是否安全。
标记一个安全的端口意味着您信任它允许用 root
帐户从那个端口登录。 不安全的端口不允许
root登录。 在一个不安全的端口上,
用户必须用无特权的帐户登录, 然后使用
su 或一个相似的机制来获得超级用户的权限。
重新读取/etc/ttys来强制init
对/etc/ttys文件做一个必要的修改后,您必须发送一个
SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如:
&prompt.root; kill -HUP 1
init 总是系统运行时的第一个进程,因此它总是PID 1。
如果能够正确设置,所有的线缆都是适当的,终端将可以启用了,
然后一个 getty 进程将在每个终端运行,
您将在您的终端上看到登录命令行。
您的连接可能出现的问题
即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。
这有一个有关问题和解决办法的列表:
没有登录命令出现:
确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端,
确信终端模拟软件运行在正确的串口上。
确信线缆被稳固地连接在终端和 FreeBSD 计算机上。
确信用了正确的电缆。
确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。
如果您有一个图像显示终端,确信对比度已经调节好了。
如果它是一个可打印的终端,确信纸张和墨水已经就绪了。
确定一个 getty 进程正在运行和服务终端。
例如, 可以用ps 命令得到运行
getty 程序的列表,键入:
&prompt.root; ps -axww|grep getty
您将看到一个终端的记录。例如,下面的显示表明一个getty
- 正在第二个串口 ttyd1 运行,
+ 正在第二个串口 ttyd1 运行,
正在 /etc/gettytab 中使用 std.38400
的记录:
22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1
如果没有 getty 进程运行,
确信您已经在/etc/ttys中启用了端口。
在修改完/etc/ttys文件后,记得运行
kill -HUP 1。
如果 getty 进程确实在运行,
但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入,
您的终端或电缆可能不支持硬件握手。 请尝试将
/etc/ttys 中的
std.38400 改为
3wire.38400 (注意在改完
/etc/ttys 之后要
kill -HUP 1)。
3wire 记录和
std 类似, 但忽略硬件握手。
您可能需要在使用 3wire
时减少波特率或启用软件流控制以避免缓冲区溢出。
出现一个 垃圾
而不是一个登录命令行
确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。
检查一下 getty 进程确信当前使用正确的
getty 类型。 如果没有,
编辑/etc/ttys然后运行kill
-HUP 1。
当键入密码时,字符两个两个出现
将终端 (或终端模拟软件) 从 半双工
或 本地回显
换成
全双工
。
Guy
Helmer
Contributed by
Sean
Kelly
Additions by
拨入服务
拨入服务
为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用
modem来拨号而不是终端。
外置vs.内置modem
外置modem看起来很容易拨号。 因为,外置 modem
可以通过储存在非易失性的RAM中的参数来配置,
它们通常提供指示器来显示重要的RS-232信号的状态。
不停闪光的信号灯能给用户留下比较深刻的印象,
而且指示器也可以用来查看modem是否正常地工作。
内置modem通常缺乏非易失性的RAM,
所以对它们的配置可能会限制在通过 DIP 开关来设置。
如果您的内置modem有指示灯,您也很难看得到。
Modem和线缆
modem
如果您使用一个外置的 modem,那您将需要适当的电缆线。
一个标准的串口线应当足够长以至普通的信号能够连接上:
信号名称
缩写
全名
RD
收到数据 (Received Data)
TD
传出数据 (Transmitted Data)
DTR
数据终端就绪 (Data Terminal Ready)
DSR
数据集就绪 (Data Set Ready)
DCD
数据载波检测 (Data Carrier Detect) (RS-232 的收到线路信号检测器)
SG
信号地 (Signal Ground)
RTS
要求发送数据 (Request to Send)
CTS
允许对方发送数据 (Clear to Send)
FreeBSD 对速度超过 2400 bps 的情形需要通过 RTS 和
CTS 信号来完成流控制,
通过 CD 信号来检测呼叫响应和挂机, 并通过
DTR 信号来在会话结束时对调制解调器进行复位。
某些电缆在连接时没有提供全部需要的信号, 这会给您带来问题,
例如在挂断时登录会话不消失, 这就有可能是电缆的问题。
与其它类 &unix; 操作系统类似, FreeBSD 使用硬件信号来检测呼叫响应,
以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器,
或监视其状态。 如果您熟悉通过调制解调器来连接基于 PC 的 BBS 系统,
这可能看起来有点难用。
串口的考虑
FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A
的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。
16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。
因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作,
所以基于16550A的接口卡可能更好。 如果系统没有活动的串口,
或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。
快速预览
getty
对于终端, init
会在每个配置串口上为每个拨入连接产生一个 getty
进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0
中,用命令ps ax可以显示下面这些:
4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0
当用户拨上modem, 并使用它进行连接时, CD
线就会被 modem 认出。 内核注意到载波信号已经被检测到,
需要完成 getty 端口的打开。
getty 发送一个登录:在指定的初始线速度上的命令行。
Getty 会检查合法的字符是否被接收, 在典型的配置中,
如果发现 垃圾
, getty
就会设法调节线速度,直到它接收到合理的字符。
/usr/bin/login
用户在键入他/她的登录名称后,
getty执行/usr/bin/login,
这会要求用户输入密码来完成登录, 然后启动用户的shell。
配置文件
如果希望允许拨入您的 FreeBSD 系统, 在
/etc 目录中有三个系统配置文件需要您关注。 其一是
/etc/gettytab,
其中包含用于 /usr/libexec/getty 服务的配置信息。 其二是
/etc/ttys, 它的作用是告诉
/sbin/init 哪些 tty
设备上应该运行 getty。 最后,
关于端口的初始化命令, 应放到
/etc/rc.d/serial 脚本中。
关于在 &unix; 上配置拨入调制解调器有两种主要的流派。
一种是将本地计算机到调制解调器的
RS-232 接口配置为固定速率。 这样做的好处是,
远程用户总能立即见到系统的登录提示符, 而其缺点则是,
- 系统并不知道用户真实的数据速率是多少, 因而, 类似 Emacs
- 这样的程序, 也就无法调整它们绘制屏幕的方式,
+ 系统并不知道用户真实的数据速率是多少, 因而, 类似
+ Emacs 这样的程序,
+ 也就无法调整它们绘制屏幕的方式,
以便为慢速连接改善响应时间。
另一种流派将调制解调器的 RS-232 接口速率配置为随远程用户的连接速率变化。 例如, 对
V.32bis (14.4 Kbps) 连接,
调制解调器会让自己的 RS-232 接口以 19.2 Kbps 的速率运行,
而 2400 bps 连接, 则会使调制解调器的 RS-232 接口以 2400 bps
的速率运行。 由于
getty 并不能识别具体的调制解调器的连接速率反馈信息,
因此, getty 会以初始速度给出一个
login: 提示, 并检查用户的响应字符。
如果用户看到乱码, 则他们应知道此时应按下
- Enter 键, 直到看到可以辨认的提示符为止。
+ Enter 键, 直到看到可以辨认的提示符为止。
如果数据速率不匹配, 则 getty
会将用户输入的任何信息均视为 乱码
,
并尝试以下一种速率来再次给出 login: 提示符。
这一过程可能需要令人作呕地重复下去, 不过一般而言,
用户只要敲一两下键盘就能看到正确的提示符了。 显然,
这种登录过程看起来不如前面所介绍的
锁定速率
方法那样简单明了,
但使用低速连接的用户, 却可以在运行全屏幕程序时得到更好的交互响应。
这一节将尽可能公平地介绍关于配置的信息,
但更着力于介绍调制解调器速率随连接速率变化的配置方法。
/etc/gettytab
/etc/gettytab
/etc/gettytab是一个用来配置
getty 信息的 termcap 风格的文件。 请看看
gettytab 的联机手册了解完整的文件格式和功能列表。
锁定速度的配置
如果您把您的modem的数据通讯率锁定在一个特殊的速度上,
您不需要对 /etc/gettytab 文件作任何变化。
匹配速度的配置
您将需要在 /etc/gettytab
中设置一个记录来告诉 getty 您希望在
modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s,
则可以使用现有的 D2400 的记录。
#
# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
#
D2400|d2400|Fast-Dial-2400:\
:nx=D1200:tc=2400-baud:
3|D1200|Fast-Dial-1200:\
:nx=D300:tc=1200-baud:
5|D300|Fast-Dial-300:\
:nx=D2400:tc=300-baud:
如果您有一个更高速度的 modem, 必须在
/etc/gettytab 中添加一个记录。
下面是一个让您可以以最高 19.2 Kbit/s 的用在
14.4 Kbit/s的modem上的接口记录:
#
# Additions for a V.32bis Modem
#
um|V300|High Speed Modem at 300,8-bit:\
:nx=V19200:tc=std.300:
un|V1200|High Speed Modem at 1200,8-bit:\
:nx=V300:tc=std.1200:
uo|V2400|High Speed Modem at 2400,8-bit:\
:nx=V1200:tc=std.2400:
up|V9600|High Speed Modem at 9600,8-bit:\
:nx=V2400:tc=std.9600:
uq|V19200|High Speed Modem at 19200,8-bit:\
:nx=V9600:tc=std.19200:
这样做的结果是 8-数据位, 没有奇偶校验的连接。
上面使用19.2 Kbit/s的连接速度的例子,也可以使用
9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s,
直到 19.2 Kbit/s。 通讯率的调节使用 nx=
(next table
) 来实现。 每条线使用一个
tc= (table continuation
)
的记录来加速对于一个特殊传输率的标准设置。
如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s
模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的
modem。 这是一个启动 57.6 Kbit/s 的 gettytab
记录的例子:
#
# Additions for a V.32bis or V.34 Modem
# Starting at 57.6 Kbps
#
vm|VH300|Very High Speed Modem at 300,8-bit:\
:nx=VH57600:tc=std.300:
vn|VH1200|Very High Speed Modem at 1200,8-bit:\
:nx=VH300:tc=std.1200:
vo|VH2400|Very High Speed Modem at 2400,8-bit:\
:nx=VH1200:tc=std.2400:
vp|VH9600|Very High Speed Modem at 9600,8-bit:\
:nx=VH2400:tc=std.9600:
vq|VH57600|Very High Speed Modem at 57600,8-bit:\
:nx=VH9600:tc=std.57600:
如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有
16550A 的串口,您可能会在57.6 Kbit/s 上得到
sio silo
错误。
/etc/ttys
/etc/ttys
/etc/ttys文件的配置在
中介绍过。 配置 modem 是相似的,
但我们必须指定一个不同的终端类型。
锁定速度和匹配速度配置的通用格式是:
ttyd0 "/usr/libexec/getty xxx" dialup on
上面的第一条是这个记录的设备特定文件 —
- ttyd0 表示 /dev/ttyd0
+ ttyd0 表示
+ /dev/ttyd0
是这个 getty 将被监视的文件。 第二条
"/usr/libexec/getty
xxx"
是将运行在设备上的进程 init。
第三条,dialup,是默认的终端类型。 第四个参数,
on, 指出了线路是可操作的
init。 也可能会有第五个参数,
secure, 但它将只被用作拥有物理安全的终端
(如系统终端)。
默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型,
以至用户可以定制它们的登录脚本来注意终端什么时候拨号,
和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定
vt102 作为默认的终端类型,
因为用户刚才在它们的远程系统上使用的是VT102模拟器。
您对/etc/ttys作修改之后,您可以发送
init 进程给一个 HUP
信号来重读文件。您可以使用下面的命令来发送信号:
&prompt.root; kill -HUP 1
如果这是您的第一次设置系统, 您可能要在发信号
init 之前等一下, 等到您的 modem
正确地配置并连接好。
锁定速度的配置
对于一个锁定速度的配置,您的 ttys
记录必须有一个为 getty 提供固定速度的记录。
对于一个速度被锁定在 19.2kbit/s 的 modem,
ttys 记录是这样的:
ttyd0 "/usr/libexec/getty std.19200" dialup on
如果您的 modem 被锁定在一个不同的数据速度,
为 std.speed 使用适当的速度来代替 std.19200。
确信您使用了一个在 /etc/gettytab
中列出的正确的类型。
匹配速度的设置
在一个匹配速度的设置中,您的 ttys
录需要参考在 /etc/gettytab 适当的起始
auto-baud
记录。 例如, 如果您为一个以 19.2
Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的
ttys 记录可能是这样的:
ttyd0 "/usr/libexec/getty V19200" dialup on
/etc/rc.d/serial
rc files
rc.serial
高速调制解调器, 如使用 V.32、 V.32bis, 以及 V.34 的那些,
需要使用硬件 (RTS/CTS) 流控制。
您可以在
/etc/rc.d/serial 中增加
stty 命令来在 FreeBSD 内核中,
为调制解调器设置硬件流控制标志。
例如, 在 1 号串口
(COM2) 拨入和拨出设备上配置 termios 标志
crtscts, 可以通过在
/etc/rc.d/serial 增加下面的设置来实现:
# Serial port initial configuration
stty -f /dev/ttyd1.init crtscts
stty -f /dev/cuad1.init crtscts
Modem 设置
如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中,
- 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接
+ 您将必须使用一个终端程序来设置参数 (比如 &ms-dos; 下的
+ Telix 或者 FreeBSD 下的
+ tip)。 使用同样的通讯速度来连接
modem 作为初始速度 getty 将使用和配置
- modem 的非易失性RAM来适应这些要求:
+ modem 的非易失性 RAM 来适应这些要求:
连接时宣告 CD
操作时宣告 DTR; DTR
消失时挂断线路并复位调制解调器
CTS 传输数据流控制
禁用 XON/XOFF 流控制
RTS 接收数据流控制
宁静模式 (无返回码)
无命令回显
请阅读您 modem 的文档找到您需要用什么命令和 DIP 接口设置。
- 例如,要在一个 USRobotics Sportster 14400 的外置 modem
+ 例如,要在一个 &usrobotics; &sportster; 14400 的外置 modem
上设置上面的参数,可以用下面这些命令:
ATZ
AT&C1&D2&H1&I0&R2&W
您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用
V.42bis 和 MNP5 压缩。
外置 modem 也有一些用来设置的 DIP 开关,
也许您可以使用这些设置作为一个例子:
Switch 1: UP — DTR Normal
Switch 2: N/A (Verbal Result Codes/Numeric Result
Codes)
Switch 3: UP — Suppress Result Codes
Switch 4: DOWN — No echo, offline commands
Switch 5: UP — Auto Answer
Switch 6: UP — Carrier Detect Normal
Switch 7: UP — Load NVRAM Defaults
Switch 8: N/A (Smart Mode/Dumb Mode)
在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当
getty 在 modem 处于命令模式并回显输入时错误地给出
login: 提示时可能造成的问题。
这样可能导致 getty 与 modem
之间产生更长的不必要交互。
锁定速度的配置
对于锁定速度的配置, 您需要配置 modem
来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。
- 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定
- modem到计算机 的传输率:
+ 在一个 &usrobotics; &sportster; 14400 外置 modem 上,
+ 这些命令将锁定 modem 到计算机 的传输率:
ATZ
AT&B1&W
匹配速度的配置
对于一个变速的配置, 您需要配置 modem
调节它的串口传输率匹配接收的传输率。
- 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定
- modem 的错误修正传输率适合命令要求的速度,
+ 在一个 &usrobotics; &sportster; 14400 的外置 modem 上,
+ 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度,
但允许串口速度适应没有纠错的连接:
ATZ
AT&B2&W
检查modem的配置
大多数高速的modem提供了用来查看当前操作参数的命令。
在USR Sportster 14400外置modem上, 命令 ATI5
显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数,
可以使用命令 ATZ 然后是
ATI4。
如果您有一个不同牌子的 modem, 检查 modem
的使用手册看看如何双重检查您的 modem 的配置参数。
问题解答
这儿是几个检查拨号modem的步骤。
检查FreeBSD系统
把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的
modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮:
会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD
已经在适当的通讯端口启动了一个 getty 进程,
等待 modem 接收一个呼叫。
如果DTR指示灯不亮, 通过控制台登录到
FreeBSD系统,然后执行一个 ps ax
命令来看 FreeBSD 是否正在正确的端口运行
getty进程。
您将在进程显示中看到像这样的一行:
114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0
115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1
如果您看到是这样的:
114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0
modem 不接收呼叫, 这意味着 getty
已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置,
因为 getty 无法打开通讯端口。
如果您没有看到任何 getty 进程等待打开想要的
ttydN 端口,
在 /etc/ttys 中双击您的记录看看那儿是否有错误。
另外,检查日志文件 /var/log/messages
看看是否有一些来自 init 或
getty 的问题日志。 如果有任何信息,
仔细检查配置文件 /etc/ttys 和
/etc/gettytab,还有相应的设备文件
/dev/ttydN,
是否有错误,丢失记录,或丢失了设备指定文件。
尝试接入Try Dialing In
设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。
如果您不能立刻得到一个命令行, 试试每隔一秒按一下
- Enter。 如果您仍没有看到一个登录: 设法发送一个
+ Enter。 如果您仍没有看到一个登录: 设法发送一个
BREAK。 如果您正使用一个高速的 modem 来拨号,
请在锁定拨号 modem 的接口速度后再试试。
如果您不能得到一个登录:prompt,再检查一下
/etc/gettytab,重复检查:
在/etc/ttys 中指定的初始可用的名称与
/etc/gettytab 的一个可用的相匹配。
每个 nx= 记录与另一个
gettytab 可用名称匹配。
每个 tc= 记录与另一个
gettytab可用名称相匹配。
如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem
能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem
的指示灯来确认 DTR 线连接正确。
如果您做了好几次,它仍然无法工作,打断一会,等会再试试。
如果还不能工作, 也许您应该发一封电子邮件给 &a.questions;
寻求帮助。
拨出设备
dial-out service
下面将让您的主机通过 modem 连接到另一台计算机上。
这只要适当地建立一个终端作为远程主机就可以。
这可以用来登录进一个BBS。
如果您用 PPP 有问题, 那这种连接可以用来从 Internet
上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了,
使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。
我的Stock Hayes Modem不被支持,我该怎么办?
事实上, 联机手册对于这个的描述已经过时了。 一个通用的
Hayes拨号已经内建其中。 只要在您的 /etc/remote
文件中使用 at=hayes。
Hayes 驱动不够 聪明
只能认出一些比较新的 modem
的高级特性 — 如 BUSY、
NO DIALTONE, 或 CONNECT 115200
的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过
ATX0&W)。
另外,拨号的延迟是 60 秒。 您的 modem
可能使用另外的时间或提示认为有其他的通讯问题。
试试 ATS7=45&W。
注意: 实际上 tip 不支持所有的
Hayes modems。 解决方法是编辑
/usr/src/usr.bin/tip/tip
目录中的 tipconf.h 文件。很明显,
您需要它的源代码才能这样做。
把行#define HAYES 0 改为
#define HAYES 1。 然后
make 并
make install就可以了。
我如何输入这些 AT 命令?
/etc/remote
在
/etc/remote 文件中增加一个 direct
项。
举例而言, 如果您的调制解调器挂在第一个串口, 即 /dev/cuad0 上,
则应添加下面这行:
cuad0:dv=/dev/cuad0:br#19200:pa=none
此处应使用您的 modem 所支持的最高 br bps 速率。
接下来, 输入 tip cuad0 就可以连到 modem 上了。
此外, 也可以 root 身份执行 cu
命令:
&prompt.root; cu -lline -sspeed
line 是串口
(例如 /dev/cuad0) 而
speed 则是速率
(如 57600)。 当您输入完 AT
- 之后, 按 ~. 即可退出。
+ 之后, 按 ~. 即可退出。
现在pn @标记不能工作?
在电话号码中的 @ 标记告诉计算机在
/etc/phones 文件中查找一个电话号码。 但
@ 标记也是一个在像 /etc/remote
这样的可用文件中的特殊字符。 用一个反斜线符号退出:
pn=\@
我如何在命令行拨电话号码?
在您的 /etc/remote 文件中通常放着一个叫做
generic
的记录。 例如:
tip115200|Dial any phone number at 115200 bps:\
:dv=/dev/cuad0:br#115200:at=hayes:pa=none:du:
tip57600|Dial any phone number at 57600 bps:\
:dv=/dev/cuad0:br#57600:at=hayes:pa=none:du:
然后, 可以执行:
&prompt.root; tip -115200 5551234
如果您更喜欢cu而不是tip,使用一个通用的cu记录:
cu115200|Use cu to dial any number at 115200bps:\
:dv=/dev/cuad1:br#57600:at=hayes:pa=none:du:
然后键入:
&prompt.root; cu 5551234 -s 115200
这么做时是否每次都需要重新输入 bps 速率?
添加一项 tip1200 或
cu1200, 并将 bps 速率换成更合适的值。
tip 的默认值是1200 bps, 也就是为什么会有
tip1200 这条记录的原因。
虽然您并不需要使用 1200 bps。
我通过一个终端服务器访问了很多主机。
除非每次都要等到您连接到主机然后键入
- CONNECT <host>, 否则使用
- tip 的 cm 功能。
+ CONNECT host,
+ 否则使用 tip 的 cm 功能。
例如, 在 /etc/remote 中的这些记录:
pain|pain.deep13.com|Forrester's machine:\
:cm=CONNECT pain\n:tc=deep13:
muffin|muffin.deep13.com|Frank's machine:\
:cm=CONNECT muffin\n:tc=deep13:
deep13:Gizmonics Institute terminal server:\
:dv=/dev/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234:
将让您键入 tip pain 或 tip
- muffin 连接到主机pain或muffin, 和 tip
- deep13 连接到终端服务器。
+ muffin 连接到主机 pain 或
+ muffin, 和 tip deep13
+ 连接到终端服务器。
tip能为每个站点试用多个线路吗?
经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。
在 /etc/remote 中为您的大学添加一个记录,
然后为 pn 功能使用 @ 标记:
big-university:\
:pn=\@:tc=dialout
dialout:\
:dv=/dev/cuad3:br#9600:at=courier:du:pa=none:
接着, 在 /etc/phones
中列出大学的电话号码:
big-university 5551111
big-university 5551112
big-university 5551113
big-university 5551114
tip 将按顺序试用每一个,然后就停止。
如果想继续测试, 隔一段时间再运行 tip。
为什么我必须键入
Ctrl
P
两次才能发出
Ctrl
P
一次?
- CtrlP是默认的强制
字符,被用来告诉tip下一个字符是文字的数据。您可以用~s给任何其他的字符设置强制字符,这意思是设置一个变量
。
+ CtrlP
+ 是默认的强制
字符,被用来告诉 tip
+ 下一个字符是文字的数据。您可以用 ~s
+ 给任何其他的字符设置强制字符,这意思是 设置一个变量
。
在新的一行键入 ~sforce=single-char。
single-char 是任何简单的字符。 如果您遗漏了
single-char, 那强制字符就是空字符,
这可以键入
Ctrl2
或
CtrlSpace
来完成。 更好的 single-char
是
Shift
Ctrl
6
, 这只用在一些终端服务器上。
通过在您的 $HOME/.tiprc
文件中指定下面这行, 就可以得到您想要的任何强制字符:
- force=<single-char>
+ force=single-char
突然我键入的每一样东西都变成了大写??
您一定是键入了
Ctrl
A
, 即 tip
的 raise character
,
会临时地指定成坏掉的 caps-lock键。 使用上面的
~s 来合理地设置各种
raisechar。 事实上,
如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。
- 这儿有一个很好的示例 .tiprc 文件, 对
+ 这儿有一个很好的示例 .tiprc 文件,对
Emacs用户来说,需要经常按
Ctrl2
和
CtrlA
:
force=^^
raisechar=^^
- The ^^ is
+ ^^ 是
ShiftCtrl6
.
如何用 tip 做文件传输?
如果您正在与另一台 &unix; 系统对话, 您可以用
~p(put) 和 ~t (take)
发送和接收文件。 这些命令可以在远程系统上运行 cat
和 echo 来接收和发送文件。 语法是这样的:
~p
local-file
remote-file
~t
remote-file
local-file
由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。
我如何用tip运行zmodem?
要接收这些文件,可以在远程终端启动发送程序。然后,键入
~C rz 在本地开始接收它们。 要发送文件,
可以在远程终端启动接收程序。 然后, 键入 ~C sz
files
把它们发送到远程系统。
Kazutaka
YOKOTA
Contributed by
Bill
Paul
Based on a document by
设置串口控制台
serial console
介绍
FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。
这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员,
他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。
就象 描述的, FreeBSD
采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动
slice 的启动代码块中。 引导块然后就被加载,
接着运行第三步启动引导器 (/boot/loader)。
为了设置串口控制台, 您必须配置启动代码块, 启动引导器代码和内核。
串口控制台的配置, 简明版
这一节假定您使用默认的配置, 只希望迅速地获得关于配置串口控制台的概览。
- 使用串口电缆连接 COM1 和控制终端。
+ 使用串口电缆连接 COM1
+ 和控制终端。
要在串口控制台上显示所有的引导信息,
需要以超级用户的身份执行下面的命令:
&prompt.root; echo 'console="comconsole"' >> /boot/loader.conf
- 编辑 /etc/ttys 并把 ttyd0 的
+ 编辑 /etc/ttys 并把
+ ttyd0 的
off 改为 on,
dialup 改为 vt100。
否则通过串口控制台上将不会提示输入口令,
从而导致潜在的安全漏洞。
重新启动并观察是否生效。
如果需要不同的配置, 更进一步的配置讨论可以在
找到。
串口控制台的设置
准备一根串口线缆。
null-modem cable
您需要使用一个 null-modem 的线缆或标准的串口线和一个 null-modem
适配器。 请参考
中有关串口线的讨论。
拔掉键盘。
绝大多数的PC在开机检测的时候会检测到键盘,
如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘,
就不会继续引导系统。
如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。
如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS
来避免它。 请参考您的主板的使用说明了解更多细节。
在 BIOS 中将键盘设为 Not installed
(未安装)。
现在您仍然无法使用键盘。 这样做只是告诉 BIOS
在启动时不要探测键盘。 您的 BIOS 不应抱怨键盘不存在。
即使这一标志设置为 Not
installed
时, 只要把键盘插上,
它就仍可使用。
如果系统有 PS/2 鼠标, 如果幸运的话,
您也可以象键盘一样把它拔下来, 这是因为 PS/2
鼠标与键盘的一些硬件是共享的, 您的鼠标插上去,
系统会认为键盘仍在那儿。
插一个哑 (dumb) 终端到COM1:(sio0)。
如果您没有哑终端, 可以使用一个比较老的带有一个 modem
程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有
COM1: (sio0),
去找一个。 这时, 您就不能只能选择
COM1:来启动系统。
如果您已经在另一台设备上使用 COM1,
您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。
确信您的内核配置文件已经为 COM1:
(sio0) 设置了适当的标记:
有关的标记是:
0x10
启用控制台支持。 如果没有设置它,
则其他的控制台标记都会被忽略。 现在,
绝大多数的设置都有控制台的支持。
这个标记的第一个就是首选的。
这个单独选项是不能确保串口适用于控制台的,
设置下面的标记或加上下面描述的 选项,
和这个放在一起。
0x20
无论是否使用了下面将要讨论的
选项, 都强制这个单元作为控制台
(除非使用了更高优先级的控制台)。
标志 0x20 必须与 一起使用。
0x40
预留这个单元 (配合
0x10) 并让它不能用于普通的使用。
您不应在希望作为控制台的串口单元上设置这个标志。
这一标志是为内核远程调试准备的。
参见 开发者手册
以了解关于远程调试更进一步的情况。
例如:
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
看看 &man.sio.4; 的联机手册了解更多信息。
如果标记没有被设置, 您必须运行UserConfig或重新编译内核。
在启动磁盘的 a 分区的根目录创建
boot.config 文件。
这个文件将指导引导块代码如何启动系统。 为了激活串口控制台,
您必须有一个或多个下面的选项——如果您要多个选项,
在同一行必须都包含它们:
切换内部和串口控制台。 您使用这个来交换控制台设备。
例如, 如果您从内部控制台启动, 您可以使用
来直接使用启动引导器和内核来使用串口作为它的控制台设备。
另外, 如果您从串口启动, 您可以使用
来告诉启动引导器和内核使用显示设备作为控制台。
切换单一和双重控制台配置。 在单一配置中,
控制台将是本机的控制台 (显示设备) 或串口。
在双重控制台配置中, 显示设备和串口将同时成为控制台,
无论 的选项的情形。 然而,
双控制台配置只在引导块运行的过程中起作用。
一旦启动引导器获得控制, 由
选项指定的控制台将成为唯一的控制台。
在启动时,探测键盘。如果键盘找不到,
和 选项会自动设置。
由于当前版本引导块的空间限制,
选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。
如果您碰到这个情况, 您必须避免使用
选项。 目前还没有绕过这个问题的办法。
使用 选项来自动选择控制台, 或使用
选项来激活控制台。
您也可以使用boot联机文档中所描述的其他选项。
除了 选项, 所有选项将被传给启动引导器
(/boot/loader)。 启动引导器将通过检查
选项的状态来决定是显示设备成为控制台,
还是串口成为控制台。 这表示如果您指定 选项,
但在 /boot.config 中没有
选项, 您在启动代码块时使用串口作为控制台。
启动引导器将使用内部显示设备作为控制台。
启动机器
当您启动您的FreeBSD时,引导块将把 /boot.config
的内容发给控制台。例如:
/boot.config: -P
Keyboard: no
如果您把 放在 /boot.config
中并指出键盘存在或不存在, 那将只出现第二行。
这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于
/boot.config 中的选项。
选项
送出消息的设备
none
内部控制台
串口控制台
串口控制台和内部控制台
串口控制台和内部控制台
, 有键盘
内部控制台
, 无键盘
串口控制台
- 出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。
- 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。
+ 出现上面信息后,
+ 在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。
+ 在通常情况下,您不需要打断启动进程,
+ 但为了确信设置是否正确,您也可以这样做。
- 在控制台上按 Enter 以外的任意键就能打断启动进程。
+ 在控制台上按 Enter 以外的任意键就能打断启动进程。
引导块将进入命令行模式。 您将看到:
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/boot/loader
boot:
检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时,
完全取决于您在 /boot.config 中的选项。
- 如果信息出现在正确的控制台, 按 Enter
+ 如果信息出现在正确的控制台, 按 Enter
继续启动进程。
如果您要使用串口控制台, 但您没有看到命令行, 那可能设置有问题。
- 这时, 输入 然后按 Enter/Return 来告诉引导块
- (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了,
+ 这时, 输入 然后按 Enter 或
+ Return 来告诉引导块
+ (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了,
就可以回去检查一下是什么出了问题。
启动引导器加载完后, 您将进入启动进程的第三步,
您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串口控制台。
参考 。
摘要
这是几个在这章要讨论的几个设置和选择的控制台的摘要。
例1: 您为 sio0 设置标记 0x10
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
在 /boot.config 中的选项
引导块执行时所用的控制台
引导加载器执行时所用的控制台
内核所用的控制台
无
内部
内部
内部
串口
串口
串口
串口和内部
内部
内部
串口和内部
串口
串口
, 有键盘
内部
内部
内部
, 没有键盘
串口和内部
串口
串口
例2:您为sio0设置标记为0x30
device sio0 at isa? port IO_COM1 flags 0x30 irq 4
在 /boot.config 中的选项
引导块执行时所用的控制台
引导加载器执行时所用的控制台
内核所用的控制台
无
内部
内部
串口
串口
串口
串口
串口和内部
内部
串口
串口和内部
串口
串口
, 有键盘
内部
内部
串口
, 没有键盘
串口和内部
串口
串口
串口控制台的提示
设置更高的串口速度
在默认配置中, 串口的设置是: 速率 9600 波特、 8
数据位、 无奇偶校验位、 1 停止位。 如果您希望修改默认的控制台速率,
可以采用下列几种方法之一:
将 BOOT_COMCONSOLE_SPEED 配置为希望的速率,
并重新编译引导块。 请参见
以了解如何联编和安装新的引导块。
如果串口控制台已配置为使用 以外的其它方式引导,
或者内核使用的速率与引导块不同, 则必需在内核配置文件中加入下述设置,
并重新联编新内核:
options CONSPEED=19200
使用内核引导选项 .
这个命令行选项可以加到 /boot.config
中。 请参见联机手册 &man.boot.8; 以获得如何在 /boot.config
中增加选项, 以及其它的可用选项。
在您的 /boot/loader.conf 文件中启用 comconsole_speed
选项。
使用这个选项时,您还需要在 /boot/loader.conf
中配置 console、
boot_serial, 以及
boot_multicons。 下面是一个利用
comconsole_speed 改变串口控制台速率的例子:
boot_multicons="YES"
boot_serial="YES"
comconsole_speed="115200"
console="comconsole,vidconsole"
&os; 在 6.1-RELEASE 之前的版本并不支持
以及 /boot/loader.conf
的 comconsole_speed 选项,
如果您使用的是较早的 &os; 版本, 就只能重新编译引导块了。
使用 sio0 以外的串口
作为控制台
使用串口而不是 sio0
作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口,
重新编译引导块, 启动引导器和内核。
取得内核源代码 (参考 )。
编辑 /etc/make.conf 文件, 然后设置
BOOT_COMCONSOLE_PORT作为您要使用
(0x3f8、 0x2f8、 0x3E8
或 0x2E8) 端口的地址。 只有 sio0 到
sio3 (COM1 到
COM4) 都可以使用; 但多口串口卡将不会工作。
不需要任何中断设置。
创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。
例如, 如果要将 sio1
(COM2) 作为控制台:
device sio1 at isa? port IO_COM2 flags 0x10 irq 3
或
device sio1 at isa? port port IO_COM2 flags 0x30 irq 3
其他端口的控制台标记也不要设。
重新编译和安装引导块:
&prompt.root; cd /sys/boot
&prompt.root; make clean
&prompt.root; make
&prompt.root; make install
重建和安装内核。
用 &man.bsdlabel.8;
将引导块写到启动盘上,然后从新内核启动。
通过串口线进入DDB调试器
options BREAK_TO_DEBUGGER
options DDB
在串口控制台上得到一个登录命令行
您可能希望通过串口线进入登录提示, 现在您可以看到启动信息,
通过串口控制台键入内核调试信息。可以这样做。
用一个编辑器打开 /etc/ttys 文件,
然后找到下面的行:
ttyd0 "/usr/libexec/getty std.9600" unknown off secure
ttyd1 "/usr/libexec/getty std.9600" unknown off secure
ttyd2 "/usr/libexec/getty std.9600" unknown off secure
ttyd3 "/usr/libexec/getty std.9600" unknown off secure
- ttyd0 到 ttyd3 相当于
+ ttyd0 到
+ ttyd3 相当于
COM1 到 COM4。
可以打开或关闭某个端口。 如果您已经改变了串口的速度,
- 还必须改掉标准的 9600 与当前的例如 19200 相匹配。
+ 还必须改掉标准的 9600
+ 与当前的例如 19200 相匹配。
您也可以改变终端的类型从不知名的到您串口终端的真实类型。
编辑完这个文件, 您必须 kill -HUP 1
来使这个修改生效。
从启动引导器修改控制台
前面一节描述了如何通过调整引导块来设定串口控制台。
这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。
由于启动引导器会被启动进程的第三步所调用, 引导块以后,
在启动引导器中的设置将忽略在引导块中的设置。
配置串口控制台
您可以很容易地指定启动引导器和内核来使用串口控制台, 只需要在
/boot/loader.rc中写入下面这行:
set console="comconsole"
无论前一节中的引导块如何配置, 这个设置都会生效。
您最好把上面一行放在文件的第一行,
以便尽早地在启动时看到串口控制台的启动信息。
同样地,您可以指定内部控制台为:
set console="vidconsole"
如果您不设置启动引导环境变量控制台,
启动引导器和内核将使用在引导块时用
选项指定的控制台。
在 3.2 以及更新的版本中,您可以在 /boot/loader.conf.local
或 /boot/loader.conf 中,
而不是在 /boot/loader.rc 指定控制台。
用这种方法, 您的 /boot/loader.rc
文件将是这样的:
include /boot/loader.4th
start
然后, 创建 /boot/loader.conf.local 并加入下面的行。
console=comconsole
或
console=vidconsole
看看 &man.loader.conf.5; 的联机手册了解更多信息。
目前, 引导块尚不提供与引导加载器的
选项等价的选项,
另外, 它也不能根据是否有键盘存在自动决定选择使用内部控制台还是串口控制台。
使用串口而不是sio0作为控制台
要使用一个串口而不是 sio0 作为串口控制台
需要重新编译启动引导器。下面的步骤跟
描述的相似。
警告
这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。
不幸的是, 绝大多数系统没有键盘可以让您启动,
而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS
中将 graphics adapter
项设为
Not installed
来在启动时不要求显示适配器。
然而, 许多机器并不支持这个选项,
如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器,
也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。